From b1af07bd5a74e2ce5c7d28b7d8c9f8a7bc29e136 Mon Sep 17 00:00:00 2001 From: Julian Noble Date: Fri, 14 Apr 2023 06:25:31 +1000 Subject: [PATCH] initial --- .gitignore | 7 + callbacks/dispatch.tcl | 356 + callbacks/parameters.tcl | 51 + scriptlib/ansi_count_per_second.tcl | 54 + scriptlib/showargs.tcl | 32 + scriptlib/stdout_per_second.tcl | 77 + src/make_punk86.tcl | 118 + .../#tarjar-loadscript-tarjar.tcl | 2317 + src/modules/#tarjar-tarjar-2.3/#z | 2 + src/modules/#tarjar-tarjar-2.3/CHANGES | 19 + .../#tarjar-tarjar-2.3/DESCRIPTION.txt | 3 + .../#tarjar-tarjar-2.3/README.tarjar.txt | 11 + .../codesnippets/basic_loader.txt | 47 + .../codesnippets/full_loader.txt | 78 + .../template/README.tarjar.txt | 11 + src/modules/#tarjar-tarjar-2.3/todo.txt | 3 + src/modules/argp-0.2.tm | 259 + src/modules/flagfilter-0.3.tm | 2693 + src/modules/overtype-1.3.tm | 157 + src/modules/platform-1.0.17.tm | 428 + src/modules/platform/shell-1.1.4.tm | 241 + src/modules/shellfilter-0.1.8.tm | 2453 + src/modules/shellthread-1.6.tm | 595 + src/modules/tarjar-2.3.tm | Bin 0 -> 107008 bytes src/punk86.vfs/lib/app-punk/pkgIndex.tcl | 3 + src/punk86.vfs/lib/app-punk/repl.tcl | 820 + src/punk86.vfs/lib/app-shellspy/pkgIndex.tcl | 3 + src/punk86.vfs/lib/app-shellspy/shellspy.tcl | 717 + src/punk86.vfs/lib/twapi4.7.2/LICENSE | 29 + src/punk86.vfs/lib/twapi4.7.2/account.tcl | 1160 + src/punk86.vfs/lib/twapi4.7.2/adsi.tcl | 28 + src/punk86.vfs/lib/twapi4.7.2/apputil.tcl | 114 + src/punk86.vfs/lib/twapi4.7.2/base.tcl | 1873 + src/punk86.vfs/lib/twapi4.7.2/clipboard.tcl | 254 + src/punk86.vfs/lib/twapi4.7.2/com.tcl | 4238 + src/punk86.vfs/lib/twapi4.7.2/console.tcl | 736 + src/punk86.vfs/lib/twapi4.7.2/crypto.tcl | 3457 + src/punk86.vfs/lib/twapi4.7.2/device.tcl | 624 + src/punk86.vfs/lib/twapi4.7.2/etw.tcl | 1390 + src/punk86.vfs/lib/twapi4.7.2/eventlog.tcl | 391 + src/punk86.vfs/lib/twapi4.7.2/evt.tcl | 718 + src/punk86.vfs/lib/twapi4.7.2/handle.tcl | 236 + src/punk86.vfs/lib/twapi4.7.2/input.tcl | 623 + src/punk86.vfs/lib/twapi4.7.2/metoo.tcl | 605 + src/punk86.vfs/lib/twapi4.7.2/msi.tcl | 403 + src/punk86.vfs/lib/twapi4.7.2/mstask.tcl | 745 + src/punk86.vfs/lib/twapi4.7.2/multimedia.tcl | 75 + src/punk86.vfs/lib/twapi4.7.2/namedpipe.tcl | 103 + src/punk86.vfs/lib/twapi4.7.2/network.tcl | 1124 + src/punk86.vfs/lib/twapi4.7.2/nls.tcl | 467 + src/punk86.vfs/lib/twapi4.7.2/os.tcl | 1213 + src/punk86.vfs/lib/twapi4.7.2/pdh.tcl | 984 + src/punk86.vfs/lib/twapi4.7.2/pkgIndex.tcl | 119 + src/punk86.vfs/lib/twapi4.7.2/power.tcl | 136 + src/punk86.vfs/lib/twapi4.7.2/printer.tcl | 58 + src/punk86.vfs/lib/twapi4.7.2/process.tcl | 2028 + src/punk86.vfs/lib/twapi4.7.2/rds.tcl | 191 + src/punk86.vfs/lib/twapi4.7.2/registry.tcl | 490 + src/punk86.vfs/lib/twapi4.7.2/resource.tcl | 458 + src/punk86.vfs/lib/twapi4.7.2/security.tcl | 2385 + src/punk86.vfs/lib/twapi4.7.2/service.tcl | 1187 + src/punk86.vfs/lib/twapi4.7.2/share.tcl | 966 + src/punk86.vfs/lib/twapi4.7.2/shell.tcl | 627 + src/punk86.vfs/lib/twapi4.7.2/sspi.tcl | 801 + src/punk86.vfs/lib/twapi4.7.2/storage.tcl | 616 + src/punk86.vfs/lib/twapi4.7.2/synch.tcl | 94 + src/punk86.vfs/lib/twapi4.7.2/tls.tcl | 1296 + src/punk86.vfs/lib/twapi4.7.2/twapi.tcl | 858 + src/punk86.vfs/lib/twapi4.7.2/twapi472.dll | Bin 0 -> 610816 bytes src/punk86.vfs/lib/twapi4.7.2/twapi_entry.tcl | 11 + src/punk86.vfs/lib/twapi4.7.2/ui.tcl | 1430 + src/punk86.vfs/lib/twapi4.7.2/win.tcl | 131 + src/punk86.vfs/lib/twapi4.7.2/winlog.tcl | 304 + src/punk86.vfs/lib/twapi4.7.2/winsta.tcl | 113 + src/punk86.vfs/lib/twapi4.7.2/wmi.tcl | 223 + src/punk86.vfs/main.tcl | 9 + src/tclkit86bi.vfs/bin/tk86.dll | Bin 0 -> 1777416 bytes src/tclkit86bi.vfs/boot.tcl | 127 + .../lib/Ffidl0.9.0/Ffidl090.dll | Bin 0 -> 64512 bytes src/tclkit86bi.vfs/lib/Ffidl0.9.0/ffidlrt.tcl | 333 + .../lib/Ffidl0.9.0/pkgIndex.tcl | 12 + .../lib/Memchan2.3/Memchan23.dll | Bin 0 -> 37376 bytes .../lib/Memchan2.3/libMemchanstub23.a | Bin 0 -> 3420 bytes .../lib/Memchan2.3/pkgIndex.tcl | 2 + src/tclkit86bi.vfs/lib/Trf2.1.4/Trf214.dll | Bin 0 -> 143872 bytes .../lib/Trf2.1.4/libTrfstub214.a | Bin 0 -> 1668 bytes src/tclkit86bi.vfs/lib/Trf2.1.4/pkgIndex.tcl | 2 + src/tclkit86bi.vfs/lib/cffi1.2.0/pkgIndex.tcl | 29 + .../lib/cffi1.2.0/win32-x86_64/tclcffi120.dll | Bin 0 -> 113664 bytes .../lib/critcl-app3.2/critcl.tcl | 1856 + .../lib/critcl-app3.2/pkgIndex.tcl | 2 + .../lib/critcl-app3.2/runtime.tcl | 134 + .../lib/critcl-app3.2/tea/Config.in | 188 + .../lib/critcl-app3.2/tea/Makefile.in | 145 + .../lib/critcl-app3.2/tea/aclocal.m4 | 180 + .../lib/critcl-app3.2/tea/configure.in | 151 + .../critcl-app3.2/tea/tclconfig/README.txt | 26 + .../critcl-app3.2/tea/tclconfig/install-sh | 119 + .../lib/critcl-app3.2/tea/tclconfig/tcl.m4 | 4033 + .../lib/critcl-bitmap1.1/bitmap.tcl | 227 + .../lib/critcl-bitmap1.1/pkgIndex.tcl | 2 + .../lib/critcl-class1.2/class.h | 468 + .../lib/critcl-class1.2/class.tcl | 1171 + .../lib/critcl-class1.2/pkgIndex.tcl | 2 + .../lib/critcl-cutil0.3/allocs/critcl_alloc.h | 57 + .../critcl-cutil0.3/asserts/critcl_assert.h | 68 + .../lib/critcl-cutil0.3/cutil.tcl | 69 + .../lib/critcl-cutil0.3/pkgIndex.tcl | 2 + .../lib/critcl-cutil0.3/trace/critcl_trace.h | 149 + .../lib/critcl-cutil0.3/trace/trace.c | 213 + .../lib/critcl-emap1.3/emap.tcl | 696 + .../lib/critcl-emap1.3/pkgIndex.tcl | 2 + .../lib/critcl-enum1.2/enum.tcl | 151 + .../lib/critcl-enum1.2/pkgIndex.tcl | 2 + .../lib/critcl-iassoc1.2/iassoc.tcl | 182 + .../lib/critcl-iassoc1.2/pkgIndex.tcl | 2 + .../lib/critcl-literals1.4/literals.tcl | 330 + .../lib/critcl-literals1.4/pkgIndex.tcl | 2 + .../lib/critcl-platform1.1/pkgIndex.tcl | 2 + .../lib/critcl-platform1.1/platform.tcl | 404 + .../lib/critcl-util1.2/pkgIndex.tcl | 2 + .../lib/critcl-util1.2/util.tcl | 149 + src/tclkit86bi.vfs/lib/critcl3.2/Config | 537 + src/tclkit86bi.vfs/lib/critcl3.2/critcl.tcl | 6547 ++ .../lib/critcl3.2/critcl_c/cdata.c | 5 + .../lib/critcl3.2/critcl_c/header.c | 6 + .../lib/critcl3.2/critcl_c/pkginit.c | 12 + .../lib/critcl3.2/critcl_c/pkginitend.c | 6 + .../lib/critcl3.2/critcl_c/pkginittk.c | 5 + .../lib/critcl3.2/critcl_c/preload.c | 169 + .../lib/critcl3.2/critcl_c/storageclass.c | 26 + .../lib/critcl3.2/critcl_c/stubs.c | 43 + .../lib/critcl3.2/critcl_c/stubs_e.c | 10 + .../lib/critcl3.2/critcl_c/tcl8.4/X11/X.h | 677 + .../lib/critcl3.2/critcl_c/tcl8.4/X11/Xatom.h | 79 + .../critcl_c/tcl8.4/X11/Xfuncproto.h | 60 + .../lib/critcl3.2/critcl_c/tcl8.4/X11/Xlib.h | 1205 + .../lib/critcl3.2/critcl_c/tcl8.4/X11/Xutil.h | 855 + .../critcl_c/tcl8.4/X11/cursorfont.h | 79 + .../critcl3.2/critcl_c/tcl8.4/X11/keysym.h | 35 + .../critcl3.2/critcl_c/tcl8.4/X11/keysymdef.h | 1169 + .../critcl_c/tcl8.4/X11/tkIntXlibDecls.h | 1806 + .../lib/critcl3.2/critcl_c/tcl8.4/tcl.h | 2380 + .../lib/critcl3.2/critcl_c/tcl8.4/tclDecls.h | 4613 + .../critcl3.2/critcl_c/tcl8.4/tclPlatDecls.h | 109 + .../lib/critcl3.2/critcl_c/tcl8.4/tk.h | 1600 + .../lib/critcl3.2/critcl_c/tcl8.4/tkDecls.h | 2303 + .../critcl3.2/critcl_c/tcl8.4/tkPlatDecls.h | 205 + .../lib/critcl3.2/critcl_c/tcl8.5/X11/X.h | 677 + .../lib/critcl3.2/critcl_c/tcl8.5/X11/Xatom.h | 79 + .../critcl_c/tcl8.5/X11/Xfuncproto.h | 60 + .../lib/critcl3.2/critcl_c/tcl8.5/X11/Xlib.h | 1205 + .../lib/critcl3.2/critcl_c/tcl8.5/X11/Xutil.h | 855 + .../critcl_c/tcl8.5/X11/cursorfont.h | 79 + .../critcl3.2/critcl_c/tcl8.5/X11/keysym.h | 35 + .../critcl3.2/critcl_c/tcl8.5/X11/keysymdef.h | 1169 + .../critcl_c/tcl8.5/X11/tkIntXlibDecls.h | 2370 + .../lib/critcl3.2/critcl_c/tcl8.5/tcl.h | 2455 + .../lib/critcl3.2/critcl_c/tcl8.5/tclDecls.h | 6563 ++ .../critcl3.2/critcl_c/tcl8.5/tclPlatDecls.h | 134 + .../lib/critcl3.2/critcl_c/tcl8.5/tk.h | 1610 + .../lib/critcl3.2/critcl_c/tcl8.5/tkDecls.h | 3095 + .../critcl3.2/critcl_c/tcl8.5/tkPlatDecls.h | 253 + .../lib/critcl3.2/critcl_c/tcl8.6/X11/X.h | 677 + .../lib/critcl3.2/critcl_c/tcl8.6/X11/Xatom.h | 79 + .../critcl_c/tcl8.6/X11/Xfuncproto.h | 60 + .../lib/critcl3.2/critcl_c/tcl8.6/X11/Xlib.h | 1205 + .../lib/critcl3.2/critcl_c/tcl8.6/X11/Xutil.h | 855 + .../critcl_c/tcl8.6/X11/cursorfont.h | 79 + .../critcl3.2/critcl_c/tcl8.6/X11/keysym.h | 35 + .../critcl3.2/critcl_c/tcl8.6/X11/keysymdef.h | 1169 + .../critcl_c/tcl8.6/X11/tkIntXlibDecls.h | 1279 + .../lib/critcl3.2/critcl_c/tcl8.6/tcl.h | 2652 + .../lib/critcl3.2/critcl_c/tcl8.6/tclDecls.h | 3917 + .../critcl3.2/critcl_c/tcl8.6/tclPlatDecls.h | 122 + .../lib/critcl3.2/critcl_c/tcl8.6/tk.h | 1619 + .../lib/critcl3.2/critcl_c/tcl8.6/tkDecls.h | 1733 + .../critcl3.2/critcl_c/tcl8.6/tkPlatDecls.h | 176 + .../lib/critcl3.2/critcl_c/tclAppInit.c | 179 + .../lib/critcl3.2/critcl_c/tkstubs.c | 24 + .../lib/critcl3.2/critcl_c/tkstubs_noconst.c | 27 + .../lib/critcl3.2/license.terms | 40 + src/tclkit86bi.vfs/lib/critcl3.2/pkgIndex.tcl | 2 + .../lib/critcl_callback1.1/critcl-rt.tcl | 381 + .../lib/critcl_callback1.1/license.terms | 1 + .../lib/critcl_callback1.1/pkgIndex.tcl | 9 + .../lib/critcl_callback1.1/teapot.txt | 23 + .../win32-x86_64/callback.dll | Bin 0 -> 15360 bytes .../lib/critcl_md5c0.12/critcl-rt.tcl | 381 + .../lib/critcl_md5c0.12/license.terms | 1 + .../lib/critcl_md5c0.12/pkgIndex.tcl | 9 + .../lib/critcl_md5c0.12/teapot.txt | 14 + .../lib/critcl_md5c0.12/win32-x86_64/md5c.dll | Bin 0 -> 19456 bytes src/tclkit86bi.vfs/lib/dde1.4/pkgIndex.tcl | 12 + src/tclkit86bi.vfs/lib/dde1.4/tcldde14.dll | Bin 0 -> 71523 bytes .../lib/iocp1.1.0/amd64/iocp110.dll | Bin 0 -> 65024 bytes src/tclkit86bi.vfs/lib/iocp1.1.0/bt.tcl | 690 + src/tclkit86bi.vfs/lib/iocp1.1.0/btnames.tcl | 383 + src/tclkit86bi.vfs/lib/iocp1.1.0/btsdr.tcl | 962 + src/tclkit86bi.vfs/lib/iocp1.1.0/pkgIndex.tcl | 25 + src/tclkit86bi.vfs/lib/reg1.3/pkgIndex.tcl | 9 + src/tclkit86bi.vfs/lib/reg1.3/tclreg13.dll | Bin 0 -> 64280 bytes .../lib/sqlite3.40.0/pkgIndex.tcl | 12 + .../lib/sqlite3.40.0/sqlite3400.dll | Bin 0 -> 1181696 bytes src/tclkit86bi.vfs/lib/tcl8.6/auto.tcl | 648 + src/tclkit86bi.vfs/lib/tcl8.6/clock.tcl | 4546 + .../lib/tcl8.6/encoding/ascii.enc | 20 + .../lib/tcl8.6/encoding/big5.enc | 1516 + .../lib/tcl8.6/encoding/cns11643.enc | 1584 + .../lib/tcl8.6/encoding/cp1250.enc | 20 + .../lib/tcl8.6/encoding/cp1251.enc | 20 + .../lib/tcl8.6/encoding/cp1252.enc | 20 + .../lib/tcl8.6/encoding/cp1253.enc | 20 + .../lib/tcl8.6/encoding/cp1254.enc | 20 + .../lib/tcl8.6/encoding/cp1255.enc | 20 + .../lib/tcl8.6/encoding/cp1256.enc | 20 + .../lib/tcl8.6/encoding/cp1257.enc | 20 + .../lib/tcl8.6/encoding/cp1258.enc | 20 + .../lib/tcl8.6/encoding/cp437.enc | 20 + .../lib/tcl8.6/encoding/cp737.enc | 20 + .../lib/tcl8.6/encoding/cp775.enc | 20 + .../lib/tcl8.6/encoding/cp850.enc | 20 + .../lib/tcl8.6/encoding/cp852.enc | 20 + .../lib/tcl8.6/encoding/cp855.enc | 20 + .../lib/tcl8.6/encoding/cp857.enc | 20 + .../lib/tcl8.6/encoding/cp860.enc | 20 + .../lib/tcl8.6/encoding/cp861.enc | 20 + .../lib/tcl8.6/encoding/cp862.enc | 20 + .../lib/tcl8.6/encoding/cp863.enc | 20 + .../lib/tcl8.6/encoding/cp864.enc | 20 + .../lib/tcl8.6/encoding/cp865.enc | 20 + .../lib/tcl8.6/encoding/cp866.enc | 20 + .../lib/tcl8.6/encoding/cp869.enc | 20 + .../lib/tcl8.6/encoding/cp874.enc | 20 + .../lib/tcl8.6/encoding/cp932.enc | 801 + .../lib/tcl8.6/encoding/cp936.enc | 2162 + .../lib/tcl8.6/encoding/cp949.enc | 2128 + .../lib/tcl8.6/encoding/cp950.enc | 1499 + .../lib/tcl8.6/encoding/dingbats.enc | 20 + .../lib/tcl8.6/encoding/ebcdic.enc | 19 + .../lib/tcl8.6/encoding/euc-cn.enc | 1397 + .../lib/tcl8.6/encoding/euc-jp.enc | 1353 + .../lib/tcl8.6/encoding/euc-kr.enc | 1533 + .../lib/tcl8.6/encoding/gb12345.enc | 1414 + .../lib/tcl8.6/encoding/gb1988.enc | 20 + .../lib/tcl8.6/encoding/gb2312-raw.enc | 1380 + .../lib/tcl8.6/encoding/gb2312.enc | 1397 + .../lib/tcl8.6/encoding/iso2022-jp.enc | 12 + .../lib/tcl8.6/encoding/iso2022-kr.enc | 7 + .../lib/tcl8.6/encoding/iso2022.enc | 14 + .../lib/tcl8.6/encoding/iso8859-1.enc | 20 + .../lib/tcl8.6/encoding/iso8859-10.enc | 20 + .../lib/tcl8.6/encoding/iso8859-11.enc | 20 + .../lib/tcl8.6/encoding/iso8859-13.enc | 20 + .../lib/tcl8.6/encoding/iso8859-14.enc | 20 + .../lib/tcl8.6/encoding/iso8859-15.enc | 20 + .../lib/tcl8.6/encoding/iso8859-16.enc | 20 + .../lib/tcl8.6/encoding/iso8859-2.enc | 20 + .../lib/tcl8.6/encoding/iso8859-3.enc | 20 + .../lib/tcl8.6/encoding/iso8859-4.enc | 20 + .../lib/tcl8.6/encoding/iso8859-5.enc | 20 + .../lib/tcl8.6/encoding/iso8859-6.enc | 20 + .../lib/tcl8.6/encoding/iso8859-7.enc | 20 + .../lib/tcl8.6/encoding/iso8859-8.enc | 20 + .../lib/tcl8.6/encoding/iso8859-9.enc | 20 + .../lib/tcl8.6/encoding/jis0201.enc | 20 + .../lib/tcl8.6/encoding/jis0208.enc | 1319 + .../lib/tcl8.6/encoding/jis0212.enc | 1159 + .../lib/tcl8.6/encoding/koi8-r.enc | 20 + .../lib/tcl8.6/encoding/koi8-u.enc | 20 + .../lib/tcl8.6/encoding/ksc5601.enc | 1516 + .../lib/tcl8.6/encoding/macCentEuro.enc | 20 + .../lib/tcl8.6/encoding/macCroatian.enc | 20 + .../lib/tcl8.6/encoding/macCyrillic.enc | 20 + .../lib/tcl8.6/encoding/macDingbats.enc | 20 + .../lib/tcl8.6/encoding/macGreek.enc | 20 + .../lib/tcl8.6/encoding/macIceland.enc | 20 + .../lib/tcl8.6/encoding/macJapan.enc | 785 + .../lib/tcl8.6/encoding/macRoman.enc | 20 + .../lib/tcl8.6/encoding/macRomania.enc | 20 + .../lib/tcl8.6/encoding/macThai.enc | 20 + .../lib/tcl8.6/encoding/macTurkish.enc | 20 + .../lib/tcl8.6/encoding/macUkraine.enc | 20 + .../lib/tcl8.6/encoding/shiftjis.enc | 690 + .../lib/tcl8.6/encoding/symbol.enc | 20 + .../lib/tcl8.6/encoding/tis-620.enc | 20 + src/tclkit86bi.vfs/lib/tcl8.6/history.tcl | 335 + .../lib/tcl8.6/http1.0/http.tcl | 377 + .../lib/tcl8.6/http1.0/pkgIndex.tcl | 11 + src/tclkit86bi.vfs/lib/tcl8.6/init.tcl | 827 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/af.msg | 49 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/af_za.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar.msg | 54 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_in.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_jo.msg | 39 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_lb.msg | 39 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_sy.msg | 39 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/be.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/bg.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/bn.msg | 49 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/bn_in.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ca.msg | 50 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/cs.msg | 54 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/da.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/de.msg | 54 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/de_at.msg | 35 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/de_be.msg | 53 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/el.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_au.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_be.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_bw.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ca.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_gb.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_hk.msg | 8 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ie.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_in.msg | 8 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_nz.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ph.msg | 8 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_sg.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_za.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_zw.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/eo.msg | 54 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ar.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_bo.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_cl.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_co.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_cr.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_do.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ec.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_gt.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_hn.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_mx.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ni.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pa.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pe.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pr.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_py.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_sv.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_uy.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ve.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/et.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/eu.msg | 47 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/eu_es.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa.msg | 47 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa_in.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa_ir.msg | 9 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/fi.msg | 50 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/fo.msg | 47 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/fo_fo.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_be.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_ca.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_ch.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ga.msg | 47 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ga_ie.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/gl.msg | 47 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/gl_es.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/gv.msg | 47 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/gv_gb.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/he.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/hi.msg | 39 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/hi_in.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/hr.msg | 50 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/hu.msg | 54 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/id.msg | 47 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/id_id.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/is.msg | 50 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/it.msg | 54 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/it_ch.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ja.msg | 44 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/kl.msg | 47 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/kl_gl.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ko.msg | 55 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ko_kr.msg | 8 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/kok.msg | 39 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/kok_in.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/kw.msg | 47 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/kw_gb.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/lt.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/lv.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/mk.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/mr.msg | 39 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/mr_in.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ms.msg | 47 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ms_my.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/mt.msg | 27 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/nb.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/nl.msg | 50 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/nl_be.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/nn.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/pl.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/pt.msg | 50 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/pt_br.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ro.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ru.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ru_ua.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/sh.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/sk.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/sl.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/sq.msg | 54 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/sr.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/sv.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/sw.msg | 49 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ta.msg | 39 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/ta_in.msg | 6 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/te.msg | 47 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/te_in.msg | 8 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/th.msg | 54 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/tr.msg | 50 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/uk.msg | 52 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/vi.msg | 50 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh.msg | 55 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_cn.msg | 7 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_hk.msg | 28 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_sg.msg | 8 + src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_tw.msg | 8 + .../lib/tcl8.6/opt0.4/optparse.tcl | 1072 + .../lib/tcl8.6/opt0.4/pkgIndex.tcl | 12 + src/tclkit86bi.vfs/lib/tcl8.6/package.tcl | 751 + src/tclkit86bi.vfs/lib/tcl8.6/parray.tcl | 28 + src/tclkit86bi.vfs/lib/tcl8.6/safe.tcl | 1289 + src/tclkit86bi.vfs/lib/tcl8.6/tclIndex | 78 + src/tclkit86bi.vfs/lib/tcl8.6/tm.tcl | 380 + .../lib/tcl8.6/tzdata/Africa/Abidjan | 6 + .../lib/tcl8.6/tzdata/Africa/Algiers | 39 + .../lib/tcl8.6/tzdata/Africa/Bamako | 5 + .../lib/tcl8.6/tzdata/Africa/Bangui | 5 + .../lib/tcl8.6/tzdata/Africa/Banjul | 5 + .../lib/tcl8.6/tzdata/Africa/Bissau | 7 + .../lib/tcl8.6/tzdata/Africa/Blantyre | 5 + .../lib/tcl8.6/tzdata/Africa/Brazzaville | 5 + .../lib/tcl8.6/tzdata/Africa/Cairo | 132 + .../lib/tcl8.6/tzdata/Africa/Conakry | 5 + .../lib/tcl8.6/tzdata/Africa/Dakar | 5 + .../lib/tcl8.6/tzdata/Africa/Dar_es_Salaam | 5 + .../lib/tcl8.6/tzdata/Africa/Djibouti | 5 + .../lib/tcl8.6/tzdata/Africa/El_Aaiun | 191 + .../lib/tcl8.6/tzdata/Africa/Freetown | 5 + .../lib/tcl8.6/tzdata/Africa/Gaborone | 5 + .../lib/tcl8.6/tzdata/Africa/Harare | 5 + .../lib/tcl8.6/tzdata/Africa/Johannesburg | 11 + .../lib/tcl8.6/tzdata/Africa/Khartoum | 40 + .../lib/tcl8.6/tzdata/Africa/Kigali | 5 + .../lib/tcl8.6/tzdata/Africa/Lagos | 9 + .../lib/tcl8.6/tzdata/Africa/Libreville | 5 + .../lib/tcl8.6/tzdata/Africa/Lome | 5 + .../lib/tcl8.6/tzdata/Africa/Lubumbashi | 5 + .../lib/tcl8.6/tzdata/Africa/Malabo | 5 + .../lib/tcl8.6/tzdata/Africa/Maputo | 6 + .../lib/tcl8.6/tzdata/Africa/Maseru | 5 + .../lib/tcl8.6/tzdata/Africa/Mbabane | 5 + .../lib/tcl8.6/tzdata/Africa/Mogadishu | 5 + .../lib/tcl8.6/tzdata/Africa/Nairobi | 10 + .../lib/tcl8.6/tzdata/Africa/Niamey | 5 + .../lib/tcl8.6/tzdata/Africa/Nouakchott | 5 + .../lib/tcl8.6/tzdata/Africa/Ouagadougou | 5 + .../lib/tcl8.6/tzdata/Africa/Porto-Novo | 5 + .../lib/tcl8.6/tzdata/Africa/Sao_Tome | 9 + .../lib/tcl8.6/tzdata/Africa/Timbuktu | 5 + .../lib/tcl8.6/tzdata/Africa/Tripoli | 34 + .../lib/tcl8.6/tzdata/Africa/Tunis | 39 + .../lib/tcl8.6/tzdata/Africa/Windhoek | 58 + .../lib/tcl8.6/tzdata/America/Adak | 276 + .../lib/tcl8.6/tzdata/America/Anchorage | 275 + .../tzdata/America/Argentina/Buenos_Aires | 67 + .../lib/tcl8.6/tzdata/America/Argentina/Jujuy | 67 + .../tzdata/America/Argentina/Rio_Gallegos | 68 + .../tcl8.6/tzdata/America/Argentina/San_Juan | 69 + .../tcl8.6/tzdata/America/Argentina/San_Luis | 68 + .../tcl8.6/tzdata/America/Argentina/Tucuman | 69 + .../lib/tcl8.6/tzdata/America/Asuncion | 259 + .../lib/tcl8.6/tzdata/America/Atikokan | 5 + .../lib/tcl8.6/tzdata/America/Bahia_Banderas | 68 + .../lib/tcl8.6/tzdata/America/Barbados | 22 + .../lib/tcl8.6/tzdata/America/Belem | 35 + .../lib/tcl8.6/tzdata/America/Belize | 103 + .../lib/tcl8.6/tzdata/America/Blanc-Sablon | 5 + .../lib/tcl8.6/tzdata/America/Boise | 281 + .../lib/tcl8.6/tzdata/America/Buenos_Aires | 5 + .../lib/tcl8.6/tzdata/America/Cambridge_Bay | 252 + .../lib/tcl8.6/tzdata/America/Campo_Grande | 96 + .../lib/tcl8.6/tzdata/America/Cancun | 47 + .../lib/tcl8.6/tzdata/America/Caracas | 10 + .../lib/tcl8.6/tzdata/America/Cayenne | 7 + .../lib/tcl8.6/tzdata/America/Cayman | 5 + .../lib/tcl8.6/tzdata/America/Chicago | 369 + .../lib/tcl8.6/tzdata/America/Coral_Harbour | 5 + .../lib/tcl8.6/tzdata/America/Creston | 5 + .../lib/tcl8.6/tzdata/America/Curacao | 5 + .../lib/tcl8.6/tzdata/America/Danmarkshavn | 39 + .../lib/tcl8.6/tzdata/America/Dawson | 98 + .../lib/tcl8.6/tzdata/America/Dawson_Creek | 64 + .../lib/tcl8.6/tzdata/America/Denver | 291 + .../lib/tcl8.6/tzdata/America/Detroit | 275 + .../lib/tcl8.6/tzdata/America/Edmonton | 280 + .../lib/tcl8.6/tzdata/America/Eirunepe | 41 + .../lib/tcl8.6/tzdata/America/El_Salvador | 10 + .../lib/tcl8.6/tzdata/America/Fort_Nelson | 151 + .../lib/tcl8.6/tzdata/America/Fort_Wayne | 5 + .../lib/tcl8.6/tzdata/America/Glace_Bay | 273 + .../lib/tcl8.6/tzdata/America/Godthab | 5 + .../lib/tcl8.6/tzdata/America/Goose_Bay | 338 + .../lib/tcl8.6/tzdata/America/Grand_Turk | 245 + .../lib/tcl8.6/tzdata/America/Guadeloupe | 5 + .../lib/tcl8.6/tzdata/America/Guayaquil | 9 + .../lib/tcl8.6/tzdata/America/Halifax | 361 + .../lib/tcl8.6/tzdata/America/Hermosillo | 21 + .../tzdata/America/Indiana/Indianapolis | 234 + .../lib/tcl8.6/tzdata/America/Indiana/Knox | 285 + .../lib/tcl8.6/tzdata/America/Indiana/Marengo | 236 + .../tcl8.6/tzdata/America/Indiana/Petersburg | 247 + .../tcl8.6/tzdata/America/Indiana/Tell_City | 230 + .../lib/tcl8.6/tzdata/America/Indiana/Vevay | 213 + .../tcl8.6/tzdata/America/Indiana/Vincennes | 234 + .../lib/tcl8.6/tzdata/America/Indiana/Winamac | 240 + .../lib/tcl8.6/tzdata/America/Indianapolis | 5 + .../lib/tcl8.6/tzdata/America/Inuvik | 249 + .../lib/tcl8.6/tzdata/America/Iqaluit | 250 + .../lib/tcl8.6/tzdata/America/Jujuy | 5 + .../lib/tcl8.6/tzdata/America/Juneau | 276 + .../tcl8.6/tzdata/America/Kentucky/Louisville | 311 + .../tcl8.6/tzdata/America/Kentucky/Monticello | 279 + .../lib/tcl8.6/tzdata/America/Knox_IN | 5 + .../lib/tcl8.6/tzdata/America/Kralendijk | 5 + .../lib/tcl8.6/tzdata/America/La_Paz | 8 + .../lib/tcl8.6/tzdata/America/Los_Angeles | 317 + .../lib/tcl8.6/tzdata/America/Louisville | 5 + .../lib/tcl8.6/tzdata/America/Lower_Princes | 5 + .../lib/tcl8.6/tzdata/America/Maceio | 52 + .../lib/tcl8.6/tzdata/America/Manaus | 39 + .../lib/tcl8.6/tzdata/America/Marigot | 5 + .../lib/tcl8.6/tzdata/America/Martinique | 9 + .../lib/tcl8.6/tzdata/America/Matamoros | 219 + .../lib/tcl8.6/tzdata/America/Mazatlan | 68 + .../lib/tcl8.6/tzdata/America/Menominee | 274 + .../lib/tcl8.6/tzdata/America/Mexico_City | 74 + .../lib/tcl8.6/tzdata/America/Miquelon | 234 + .../lib/tcl8.6/tzdata/America/Moncton | 342 + .../lib/tcl8.6/tzdata/America/Monterrey | 64 + .../lib/tcl8.6/tzdata/America/Montevideo | 96 + .../lib/tcl8.6/tzdata/America/Montreal | 5 + .../lib/tcl8.6/tzdata/America/Montserrat | 5 + .../lib/tcl8.6/tzdata/America/Nassau | 5 + .../lib/tcl8.6/tzdata/America/New_York | 369 + .../lib/tcl8.6/tzdata/America/Nipigon | 5 + .../lib/tcl8.6/tzdata/America/Nome | 276 + .../tcl8.6/tzdata/America/North_Dakota/Beulah | 279 + .../tcl8.6/tzdata/America/North_Dakota/Center | 279 + .../tzdata/America/North_Dakota/New_Salem | 279 + .../lib/tcl8.6/tzdata/America/Nuuk | 246 + .../lib/tcl8.6/tzdata/America/Pangnirtung | 252 + .../lib/tcl8.6/tzdata/America/Paramaribo | 9 + .../lib/tcl8.6/tzdata/America/Phoenix | 17 + .../lib/tcl8.6/tzdata/America/Port-au-Prince | 215 + .../lib/tcl8.6/tzdata/America/Port_of_Spain | 5 + .../lib/tcl8.6/tzdata/America/Porto_Acre | 5 + .../lib/tcl8.6/tzdata/America/Porto_Velho | 35 + .../lib/tcl8.6/tzdata/America/Puerto_Rico | 10 + .../lib/tcl8.6/tzdata/America/Punta_Arenas | 123 + .../lib/tcl8.6/tzdata/America/Rainy_River | 5 + .../lib/tcl8.6/tzdata/America/Rankin_Inlet | 248 + .../lib/tcl8.6/tzdata/America/Recife | 48 + .../lib/tcl8.6/tzdata/America/Resolute | 248 + .../lib/tcl8.6/tzdata/America/Rio_Branco | 37 + .../lib/tcl8.6/tzdata/America/Rosario | 5 + .../lib/tcl8.6/tzdata/America/Santa_Isabel | 5 + .../lib/tcl8.6/tzdata/America/Santarem | 36 + .../lib/tcl8.6/tzdata/America/Santiago | 289 + .../lib/tcl8.6/tzdata/America/Santo_Domingo | 21 + .../lib/tcl8.6/tzdata/America/Sao_Paulo | 97 + .../lib/tcl8.6/tzdata/America/Scoresbysund | 246 + .../lib/tcl8.6/tzdata/America/Shiprock | 5 + .../lib/tcl8.6/tzdata/America/St_Barthelemy | 5 + .../lib/tcl8.6/tzdata/America/St_Johns | 372 + .../lib/tcl8.6/tzdata/America/St_Kitts | 5 + .../lib/tcl8.6/tzdata/America/St_Thomas | 5 + .../lib/tcl8.6/tzdata/America/St_Vincent | 5 + .../lib/tcl8.6/tzdata/America/Swift_Current | 29 + .../lib/tcl8.6/tzdata/America/Thule | 224 + .../lib/tcl8.6/tzdata/America/Thunder_Bay | 5 + .../lib/tcl8.6/tzdata/America/Toronto | 365 + .../lib/tcl8.6/tzdata/America/Vancouver | 320 + .../lib/tcl8.6/tzdata/America/Virgin | 5 + .../lib/tcl8.6/tzdata/America/Whitehorse | 98 + .../lib/tcl8.6/tzdata/America/Winnipeg | 316 + .../lib/tcl8.6/tzdata/America/Yakutat | 276 + .../lib/tcl8.6/tzdata/America/Yellowknife | 252 + .../lib/tcl8.6/tzdata/Antarctica/Casey | 17 + .../lib/tcl8.6/tzdata/Antarctica/Davis | 12 + .../tcl8.6/tzdata/Antarctica/DumontDUrville | 5 + .../lib/tcl8.6/tzdata/Antarctica/Macquarie | 276 + .../lib/tcl8.6/tzdata/Antarctica/Mawson | 7 + .../lib/tcl8.6/tzdata/Antarctica/McMurdo | 5 + .../lib/tcl8.6/tzdata/Antarctica/Palmer | 87 + .../lib/tcl8.6/tzdata/Antarctica/South_Pole | 5 + .../lib/tcl8.6/tzdata/Antarctica/Troll | 196 + .../lib/tcl8.6/tzdata/Antarctica/Vostok | 5 + .../lib/tcl8.6/tzdata/Arctic/Longyearbyen | 5 + .../lib/tcl8.6/tzdata/Asia/Aden | 5 + .../lib/tcl8.6/tzdata/Asia/Almaty | 57 + .../lib/tcl8.6/tzdata/Asia/Amman | 92 + .../lib/tcl8.6/tzdata/Asia/Anadyr | 72 + .../lib/tcl8.6/tzdata/Asia/Aqtau | 58 + .../lib/tcl8.6/tzdata/Asia/Aqtobe | 58 + .../lib/tcl8.6/tzdata/Asia/Ashgabat | 31 + .../lib/tcl8.6/tzdata/Asia/Ashkhabad | 5 + .../lib/tcl8.6/tzdata/Asia/Atyrau | 58 + .../lib/tcl8.6/tzdata/Asia/Baghdad | 59 + .../lib/tcl8.6/tzdata/Asia/Bahrain | 5 + .../lib/tcl8.6/tzdata/Asia/Baku | 74 + .../lib/tcl8.6/tzdata/Asia/Bangkok | 7 + .../lib/tcl8.6/tzdata/Asia/Barnaul | 73 + .../lib/tcl8.6/tzdata/Asia/Beirut | 270 + .../lib/tcl8.6/tzdata/Asia/Bishkek | 58 + .../lib/tcl8.6/tzdata/Asia/Brunei | 5 + .../lib/tcl8.6/tzdata/Asia/Choibalsan | 56 + .../lib/tcl8.6/tzdata/Asia/Chongqing | 5 + .../lib/tcl8.6/tzdata/Asia/Chungking | 5 + .../lib/tcl8.6/tzdata/Asia/Colombo | 13 + .../lib/tcl8.6/tzdata/Asia/Damascus | 126 + .../lib/tcl8.6/tzdata/Asia/Dili | 9 + .../lib/tcl8.6/tzdata/Asia/Dubai | 6 + .../lib/tcl8.6/tzdata/Asia/Dushanbe | 29 + .../lib/tcl8.6/tzdata/Asia/Harbin | 5 + .../lib/tcl8.6/tzdata/Asia/Hebron | 283 + .../lib/tcl8.6/tzdata/Asia/Ho_Chi_Minh | 14 + .../lib/tcl8.6/tzdata/Asia/Hong_Kong | 75 + .../lib/tcl8.6/tzdata/Asia/Hovd | 55 + .../lib/tcl8.6/tzdata/Asia/Irkutsk | 72 + .../lib/tcl8.6/tzdata/Asia/Istanbul | 5 + .../lib/tcl8.6/tzdata/Asia/Jerusalem | 278 + .../lib/tcl8.6/tzdata/Asia/Kabul | 7 + .../lib/tcl8.6/tzdata/Asia/Karachi | 16 + .../lib/tcl8.6/tzdata/Asia/Kashgar | 5 + .../lib/tcl8.6/tzdata/Asia/Kathmandu | 7 + .../lib/tcl8.6/tzdata/Asia/Katmandu | 5 + .../lib/tcl8.6/tzdata/Asia/Krasnoyarsk | 71 + .../lib/tcl8.6/tzdata/Asia/Kuala_Lumpur | 5 + .../lib/tcl8.6/tzdata/Asia/Kuching | 23 + .../lib/tcl8.6/tzdata/Asia/Kuwait | 5 + .../lib/tcl8.6/tzdata/Asia/Macao | 5 + .../lib/tcl8.6/tzdata/Asia/Macau | 76 + .../lib/tcl8.6/tzdata/Asia/Magadan | 72 + .../lib/tcl8.6/tzdata/Asia/Makassar | 9 + .../lib/tcl8.6/tzdata/Asia/Muscat | 5 + .../lib/tcl8.6/tzdata/Asia/Novokuznetsk | 71 + .../lib/tcl8.6/tzdata/Asia/Novosibirsk | 73 + .../lib/tcl8.6/tzdata/Asia/Omsk | 71 + .../lib/tcl8.6/tzdata/Asia/Oral | 58 + .../lib/tcl8.6/tzdata/Asia/Phnom_Penh | 5 + .../lib/tcl8.6/tzdata/Asia/Pontianak | 13 + .../lib/tcl8.6/tzdata/Asia/Pyongyang | 10 + .../lib/tcl8.6/tzdata/Asia/Qatar | 7 + .../lib/tcl8.6/tzdata/Asia/Qostanay | 58 + .../lib/tcl8.6/tzdata/Asia/Rangoon | 5 + .../lib/tcl8.6/tzdata/Asia/Riyadh | 6 + .../lib/tcl8.6/tzdata/Asia/Saigon | 5 + .../lib/tcl8.6/tzdata/Asia/Sakhalin | 73 + .../lib/tcl8.6/tzdata/Asia/Samarkand | 31 + .../lib/tcl8.6/tzdata/Asia/Seoul | 34 + .../lib/tcl8.6/tzdata/Asia/Shanghai | 34 + .../lib/tcl8.6/tzdata/Asia/Singapore | 13 + .../lib/tcl8.6/tzdata/Asia/Srednekolymsk | 71 + .../lib/tcl8.6/tzdata/Asia/Taipei | 46 + .../lib/tcl8.6/tzdata/Asia/Tashkent | 31 + .../lib/tcl8.6/tzdata/Asia/Tbilisi | 60 + .../lib/tcl8.6/tzdata/Asia/Tehran | 76 + .../lib/tcl8.6/tzdata/Asia/Tel_Aviv | 5 + .../lib/tcl8.6/tzdata/Asia/Thimbu | 5 + .../lib/tcl8.6/tzdata/Asia/Thimphu | 7 + .../lib/tcl8.6/tzdata/Asia/Tokyo | 14 + .../lib/tcl8.6/tzdata/Asia/Tomsk | 73 + .../lib/tcl8.6/tzdata/Asia/Ujung_Pandang | 5 + .../lib/tcl8.6/tzdata/Asia/Ulaanbaatar | 55 + .../lib/tcl8.6/tzdata/Asia/Ulan_Bator | 5 + .../lib/tcl8.6/tzdata/Asia/Urumqi | 6 + .../lib/tcl8.6/tzdata/Asia/Vientiane | 5 + .../lib/tcl8.6/tzdata/Asia/Vladivostok | 71 + .../lib/tcl8.6/tzdata/Asia/Yakutsk | 71 + .../lib/tcl8.6/tzdata/Asia/Yangon | 9 + .../lib/tcl8.6/tzdata/Asia/Yekaterinburg | 72 + .../lib/tcl8.6/tzdata/Asia/Yerevan | 70 + .../lib/tcl8.6/tzdata/Atlantic/Azores | 347 + .../lib/tcl8.6/tzdata/Atlantic/Canary | 247 + .../lib/tcl8.6/tzdata/Atlantic/Cape_Verde | 9 + .../lib/tcl8.6/tzdata/Atlantic/Faeroe | 5 + .../lib/tcl8.6/tzdata/Atlantic/Faroe | 245 + .../lib/tcl8.6/tzdata/Atlantic/Jan_Mayen | 5 + .../lib/tcl8.6/tzdata/Atlantic/Reykjavik | 5 + .../lib/tcl8.6/tzdata/Atlantic/Stanley | 75 + .../lib/tcl8.6/tzdata/Australia/ACT | 5 + .../lib/tcl8.6/tzdata/Australia/Adelaide | 273 + .../lib/tcl8.6/tzdata/Australia/Brisbane | 23 + .../lib/tcl8.6/tzdata/Australia/Broken_Hill | 275 + .../lib/tcl8.6/tzdata/Australia/Currie | 5 + .../lib/tcl8.6/tzdata/Australia/Darwin | 15 + .../lib/tcl8.6/tzdata/Australia/Hobart | 285 + .../lib/tcl8.6/tzdata/Australia/LHI | 5 + .../lib/tcl8.6/tzdata/Australia/Lindeman | 28 + .../lib/tcl8.6/tzdata/Australia/Lord_Howe | 245 + .../lib/tcl8.6/tzdata/Australia/Melbourne | 272 + .../lib/tcl8.6/tzdata/Australia/NSW | 5 + .../lib/tcl8.6/tzdata/Australia/North | 5 + .../lib/tcl8.6/tzdata/Australia/Perth | 25 + .../lib/tcl8.6/tzdata/Australia/Queensland | 5 + .../lib/tcl8.6/tzdata/Australia/South | 5 + .../lib/tcl8.6/tzdata/Australia/Sydney | 272 + .../lib/tcl8.6/tzdata/Australia/West | 5 + .../lib/tcl8.6/tzdata/Brazil/Acre | 5 + .../lib/tcl8.6/tzdata/Brazil/East | 5 + .../lib/tcl8.6/tzdata/Brazil/West | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/CET | 265 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/CST6CDT | 278 + .../lib/tcl8.6/tzdata/Canada/Atlantic | 5 + .../lib/tcl8.6/tzdata/Canada/Central | 5 + .../lib/tcl8.6/tzdata/Canada/Eastern | 5 + .../lib/tcl8.6/tzdata/Canada/Mountain | 5 + .../lib/tcl8.6/tzdata/Canada/Newfoundland | 5 + .../lib/tcl8.6/tzdata/Canada/Pacific | 5 + .../lib/tcl8.6/tzdata/Canada/Saskatchewan | 5 + .../lib/tcl8.6/tzdata/Canada/Yukon | 5 + .../lib/tcl8.6/tzdata/Chile/Continental | 5 + .../lib/tcl8.6/tzdata/Chile/EasterIsland | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EET | 251 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EST | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EST5EDT | 278 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Egypt | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Eire | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+0 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+1 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+10 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+11 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+12 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+2 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+3 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+4 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+5 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+6 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+7 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+8 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT+9 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-0 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-1 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-10 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-11 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-12 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-13 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-14 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-2 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-3 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-4 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-5 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-6 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-7 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-8 | 5 + .../lib/tcl8.6/tzdata/Etc/GMT-9 | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT0 | 5 + .../lib/tcl8.6/tzdata/Etc/Greenwich | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/UCT | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/UTC | 5 + .../lib/tcl8.6/tzdata/Etc/Universal | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Zulu | 5 + .../lib/tcl8.6/tzdata/Europe/Amsterdam | 5 + .../lib/tcl8.6/tzdata/Europe/Astrakhan | 71 + .../lib/tcl8.6/tzdata/Europe/Athens | 268 + .../lib/tcl8.6/tzdata/Europe/Belfast | 5 + .../lib/tcl8.6/tzdata/Europe/Belgrade | 250 + .../lib/tcl8.6/tzdata/Europe/Berlin | 274 + .../lib/tcl8.6/tzdata/Europe/Brussels | 316 + .../lib/tcl8.6/tzdata/Europe/Bucharest | 268 + .../lib/tcl8.6/tzdata/Europe/Budapest | 283 + .../lib/tcl8.6/tzdata/Europe/Busingen | 5 + .../lib/tcl8.6/tzdata/Europe/Chisinau | 272 + .../lib/tcl8.6/tzdata/Europe/Copenhagen | 5 + .../lib/tcl8.6/tzdata/Europe/Dublin | 358 + .../lib/tcl8.6/tzdata/Europe/Gibraltar | 328 + .../lib/tcl8.6/tzdata/Europe/Guernsey | 5 + .../lib/tcl8.6/tzdata/Europe/Helsinki | 248 + .../lib/tcl8.6/tzdata/Europe/Isle_of_Man | 5 + .../lib/tcl8.6/tzdata/Europe/Istanbul | 125 + .../lib/tcl8.6/tzdata/Europe/Jersey | 5 + .../lib/tcl8.6/tzdata/Europe/Kaliningrad | 86 + .../lib/tcl8.6/tzdata/Europe/Kiev | 5 + .../lib/tcl8.6/tzdata/Europe/Kirov | 70 + .../lib/tcl8.6/tzdata/Europe/Kyiv | 251 + .../lib/tcl8.6/tzdata/Europe/Lisbon | 353 + .../lib/tcl8.6/tzdata/Europe/London | 372 + .../lib/tcl8.6/tzdata/Europe/Luxembourg | 5 + .../lib/tcl8.6/tzdata/Europe/Madrid | 292 + .../lib/tcl8.6/tzdata/Europe/Mariehamn | 5 + .../lib/tcl8.6/tzdata/Europe/Minsk | 75 + .../lib/tcl8.6/tzdata/Europe/Monaco | 5 + .../lib/tcl8.6/tzdata/Europe/Moscow | 83 + .../lib/tcl8.6/tzdata/Europe/Oslo | 5 + .../lib/tcl8.6/tzdata/Europe/Paris | 314 + .../lib/tcl8.6/tzdata/Europe/Prague | 275 + .../lib/tcl8.6/tzdata/Europe/Rome | 302 + .../lib/tcl8.6/tzdata/Europe/San_Marino | 5 + .../lib/tcl8.6/tzdata/Europe/Sarajevo | 5 + .../lib/tcl8.6/tzdata/Europe/Saratov | 71 + .../lib/tcl8.6/tzdata/Europe/Simferopol | 82 + .../lib/tcl8.6/tzdata/Europe/Skopje | 5 + .../lib/tcl8.6/tzdata/Europe/Stockholm | 5 + .../lib/tcl8.6/tzdata/Europe/Tallinn | 254 + .../lib/tcl8.6/tzdata/Europe/Tirane | 263 + .../lib/tcl8.6/tzdata/Europe/Tiraspol | 5 + .../lib/tcl8.6/tzdata/Europe/Ulyanovsk | 73 + .../lib/tcl8.6/tzdata/Europe/Uzhgorod | 5 + .../lib/tcl8.6/tzdata/Europe/Vaduz | 5 + .../lib/tcl8.6/tzdata/Europe/Vatican | 5 + .../lib/tcl8.6/tzdata/Europe/Vilnius | 252 + .../lib/tcl8.6/tzdata/Europe/Volgograd | 73 + .../lib/tcl8.6/tzdata/Europe/Warsaw | 296 + .../lib/tcl8.6/tzdata/Europe/Zagreb | 5 + .../lib/tcl8.6/tzdata/Europe/Zaporozhye | 5 + .../lib/tcl8.6/tzdata/Europe/Zurich | 250 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GB | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GB-Eire | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT+0 | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT-0 | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT0 | 5 + .../lib/tcl8.6/tzdata/Greenwich | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/HST | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Hongkong | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Iceland | 5 + .../lib/tcl8.6/tzdata/Indian/Antananarivo | 5 + .../lib/tcl8.6/tzdata/Indian/Chagos | 7 + .../lib/tcl8.6/tzdata/Indian/Christmas | 5 + .../lib/tcl8.6/tzdata/Indian/Cocos | 5 + .../lib/tcl8.6/tzdata/Indian/Comoro | 5 + .../lib/tcl8.6/tzdata/Indian/Kerguelen | 5 + .../lib/tcl8.6/tzdata/Indian/Mahe | 5 + .../lib/tcl8.6/tzdata/Indian/Maldives | 7 + .../lib/tcl8.6/tzdata/Indian/Mauritius | 10 + .../lib/tcl8.6/tzdata/Indian/Mayotte | 5 + .../lib/tcl8.6/tzdata/Indian/Reunion | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Iran | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Israel | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Japan | 5 + .../lib/tcl8.6/tzdata/Kwajalein | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MET | 265 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MST | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MST7MDT | 278 + .../lib/tcl8.6/tzdata/Mexico/BajaNorte | 5 + .../lib/tcl8.6/tzdata/Mexico/BajaSur | 5 + .../lib/tcl8.6/tzdata/Mexico/General | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/NZ | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/NZ-CHAT | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Navajo | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/PRC | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/PST8PDT | 278 + .../lib/tcl8.6/tzdata/Pacific/Auckland | 285 + .../lib/tcl8.6/tzdata/Pacific/Bougainville | 10 + .../lib/tcl8.6/tzdata/Pacific/Chatham | 258 + .../lib/tcl8.6/tzdata/Pacific/Chuuk | 5 + .../lib/tcl8.6/tzdata/Pacific/Easter | 268 + .../lib/tcl8.6/tzdata/Pacific/Efate | 28 + .../lib/tcl8.6/tzdata/Pacific/Enderbury | 5 + .../lib/tcl8.6/tzdata/Pacific/Fakaofo | 7 + .../lib/tcl8.6/tzdata/Pacific/Fiji | 34 + .../lib/tcl8.6/tzdata/Pacific/Funafuti | 5 + .../lib/tcl8.6/tzdata/Pacific/Galapagos | 9 + .../lib/tcl8.6/tzdata/Pacific/Gambier | 6 + .../lib/tcl8.6/tzdata/Pacific/Guadalcanal | 6 + .../lib/tcl8.6/tzdata/Pacific/Guam | 26 + .../lib/tcl8.6/tzdata/Pacific/Honolulu | 12 + .../lib/tcl8.6/tzdata/Pacific/Johnston | 5 + .../lib/tcl8.6/tzdata/Pacific/Kanton | 8 + .../lib/tcl8.6/tzdata/Pacific/Kiritimati | 8 + .../lib/tcl8.6/tzdata/Pacific/Kosrae | 14 + .../lib/tcl8.6/tzdata/Pacific/Kwajalein | 11 + .../lib/tcl8.6/tzdata/Pacific/Majuro | 5 + .../lib/tcl8.6/tzdata/Pacific/Marquesas | 6 + .../lib/tcl8.6/tzdata/Pacific/Midway | 5 + .../lib/tcl8.6/tzdata/Pacific/Nauru | 9 + .../lib/tcl8.6/tzdata/Pacific/Niue | 7 + .../lib/tcl8.6/tzdata/Pacific/Norfolk | 172 + .../lib/tcl8.6/tzdata/Pacific/Pago_Pago | 7 + .../lib/tcl8.6/tzdata/Pacific/Palau | 7 + .../lib/tcl8.6/tzdata/Pacific/Pitcairn | 7 + .../lib/tcl8.6/tzdata/Pacific/Pohnpei | 5 + .../lib/tcl8.6/tzdata/Pacific/Ponape | 5 + .../lib/tcl8.6/tzdata/Pacific/Port_Moresby | 7 + .../lib/tcl8.6/tzdata/Pacific/Saipan | 5 + .../lib/tcl8.6/tzdata/Pacific/Tahiti | 6 + .../lib/tcl8.6/tzdata/Pacific/Tongatapu | 16 + .../lib/tcl8.6/tzdata/Pacific/Truk | 5 + .../lib/tcl8.6/tzdata/Pacific/Wake | 5 + .../lib/tcl8.6/tzdata/Pacific/Wallis | 5 + .../lib/tcl8.6/tzdata/Pacific/Yap | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Poland | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Portugal | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/ROC | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/ROK | 5 + .../lib/tcl8.6/tzdata/Singapore | 5 + .../lib/tcl8.6/tzdata/SystemV/AST4 | 5 + .../lib/tcl8.6/tzdata/SystemV/AST4ADT | 5 + .../lib/tcl8.6/tzdata/SystemV/CST6 | 5 + .../lib/tcl8.6/tzdata/SystemV/CST6CDT | 5 + .../lib/tcl8.6/tzdata/SystemV/EST5 | 5 + .../lib/tcl8.6/tzdata/SystemV/EST5EDT | 5 + .../lib/tcl8.6/tzdata/SystemV/HST10 | 5 + .../lib/tcl8.6/tzdata/SystemV/MST7 | 5 + .../lib/tcl8.6/tzdata/SystemV/MST7MDT | 5 + .../lib/tcl8.6/tzdata/SystemV/PST8 | 5 + .../lib/tcl8.6/tzdata/SystemV/PST8PDT | 5 + .../lib/tcl8.6/tzdata/SystemV/YST9 | 5 + .../lib/tcl8.6/tzdata/SystemV/YST9YDT | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Turkey | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/UCT | 5 + .../lib/tcl8.6/tzdata/US/Aleutian | 5 + .../lib/tcl8.6/tzdata/US/Central | 5 + .../lib/tcl8.6/tzdata/US/Eastern | 5 + .../lib/tcl8.6/tzdata/US/Hawaii | 5 + .../lib/tcl8.6/tzdata/US/Indiana-Starke | 5 + .../lib/tcl8.6/tzdata/US/Michigan | 5 + .../lib/tcl8.6/tzdata/US/Mountain | 5 + .../lib/tcl8.6/tzdata/US/Pacific | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/UTC | 5 + .../lib/tcl8.6/tzdata/Universal | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/W-SU | 5 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/WET | 251 + src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Zulu | 5 + src/tclkit86bi.vfs/lib/tcl8.6/word.tcl | 154 + .../lib/tcl8/8.4/platform-1.0.19.tm | 450 + .../lib/tcl8/8.4/platform/shell-1.1.4.tm | 241 + .../lib/tcl8/8.5/msgcat-1.6.1.tm | 1210 + .../lib/tcl8/8.5/tcltest-2.5.5.tm | 3533 + src/tclkit86bi.vfs/lib/tcl8/8.6/http-2.9.8.tm | 3604 + .../tcllib1.21/0compatibility/d_config.tcl | 10 + .../lib/tcllib1.21/0compatibility/d_paths.tcl | 10 + .../tcllib1.21/0compatibility/p_config.tcl | 10 + .../lib/tcllib1.21/0compatibility/p_paths.tcl | 9 + .../tcllib1.21/0compatibility/pkgIndex.tcl | 29 + src/tclkit86bi.vfs/lib/tcllib1.21/aes/aes.tcl | 625 + .../lib/tcllib1.21/aes/pkgIndex.tcl | 5 + .../lib/tcllib1.21/amazon-s3/S3.tcl | 1960 + .../lib/tcllib1.21/amazon-s3/pkgIndex.tcl | 9 + .../lib/tcllib1.21/amazon-s3/xsxp.tcl | 254 + src/tclkit86bi.vfs/lib/tcllib1.21/asn/asn.tcl | 1580 + .../lib/tcllib1.21/asn/pkgIndex.tcl | 4 + .../lib/tcllib1.21/base32/base32.tcl | 182 + .../lib/tcllib1.21/base32/base32_c.tcl | 253 + .../lib/tcllib1.21/base32/base32_tcl.tcl | 73 + .../lib/tcllib1.21/base32/base32core.tcl | 134 + .../lib/tcllib1.21/base32/base32hex.tcl | 182 + .../lib/tcllib1.21/base32/base32hex_c.tcl | 253 + .../lib/tcllib1.21/base32/base32hex_tcl.tcl | 79 + .../lib/tcllib1.21/base32/pkgIndex.tcl | 4 + .../lib/tcllib1.21/base64/ascii85.tcl | 271 + .../lib/tcllib1.21/base64/base64.tcl | 410 + .../lib/tcllib1.21/base64/base64c.tcl | 19 + .../lib/tcllib1.21/base64/pkgIndex.tcl | 5 + .../lib/tcllib1.21/base64/uuencode.tcl | 335 + .../lib/tcllib1.21/base64/yencode.tcl | 307 + src/tclkit86bi.vfs/lib/tcllib1.21/bee/bee.tcl | 990 + .../lib/tcllib1.21/bee/pkgIndex.tcl | 4 + .../lib/tcllib1.21/bench/bench.tcl | 553 + .../lib/tcllib1.21/bench/bench_read.tcl | 162 + .../lib/tcllib1.21/bench/bench_wcsv.tcl | 101 + .../lib/tcllib1.21/bench/bench_wtext.tcl | 165 + .../lib/tcllib1.21/bench/libbench.tcl | 561 + .../lib/tcllib1.21/bench/pkgIndex.tcl | 7 + .../lib/tcllib1.21/bibtex/bibtex.tcl | 501 + .../lib/tcllib1.21/bibtex/pkgIndex.tcl | 2 + .../lib/tcllib1.21/blowfish/blowfish.tcl | 755 + .../lib/tcllib1.21/blowfish/pkgIndex.tcl | 5 + .../lib/tcllib1.21/cache/async.tcl | 185 + .../lib/tcllib1.21/cache/pkgIndex.tcl | 3 + .../lib/tcllib1.21/clay/clay.tcl | 2224 + .../lib/tcllib1.21/clay/pkgIndex.tcl | 15 + .../lib/tcllib1.21/clock/iso8601.tcl | 280 + .../lib/tcllib1.21/clock/pkgIndex.tcl | 3 + .../lib/tcllib1.21/clock/rfc2822.tcl | 214 + .../lib/tcllib1.21/cmdline/cmdline.tcl | 933 + .../lib/tcllib1.21/cmdline/pkgIndex.tcl | 2 + .../lib/tcllib1.21/comm/comm.tcl | 1808 + .../lib/tcllib1.21/comm/pkgIndex.tcl | 2 + .../lib/tcllib1.21/control/ascaller.tcl | 72 + .../lib/tcllib1.21/control/assert.tcl | 91 + .../lib/tcllib1.21/control/control.tcl | 24 + .../lib/tcllib1.21/control/do.tcl | 81 + .../lib/tcllib1.21/control/no-op.tcl | 14 + .../lib/tcllib1.21/control/pkgIndex.tcl | 2 + .../lib/tcllib1.21/control/tclIndex | 18 + .../lib/tcllib1.21/coroutine/coro_auto.tcl | 403 + .../lib/tcllib1.21/coroutine/coroutine.tcl | 496 + .../lib/tcllib1.21/coroutine/pkgIndex.tcl | 5 + .../lib/tcllib1.21/counter/counter.tcl | 1265 + .../lib/tcllib1.21/counter/pkgIndex.tcl | 12 + .../lib/tcllib1.21/crc/cksum.tcl | 200 + .../lib/tcllib1.21/crc/crc16.tcl | 308 + .../lib/tcllib1.21/crc/crc32.tcl | 383 + .../lib/tcllib1.21/crc/crcc.tcl | 22 + .../lib/tcllib1.21/crc/pkgIndex.tcl | 5 + src/tclkit86bi.vfs/lib/tcllib1.21/crc/sum.tcl | 285 + .../lib/tcllib1.21/cron/cron.tcl | 619 + .../lib/tcllib1.21/cron/pkgIndex.tcl | 2 + src/tclkit86bi.vfs/lib/tcllib1.21/csv/csv.tcl | 789 + .../lib/tcllib1.21/csv/pkgIndex.tcl | 2 + .../lib/tcllib1.21/debug/caller.tcl | 97 + .../lib/tcllib1.21/debug/debug.tcl | 306 + .../lib/tcllib1.21/debug/heartbeat.tcl | 68 + .../lib/tcllib1.21/debug/pkgIndex.tcl | 5 + .../lib/tcllib1.21/debug/timestamp.tcl | 47 + .../lib/tcllib1.21/defer/defer.tcl | 120 + .../lib/tcllib1.21/defer/pkgIndex.tcl | 5 + src/tclkit86bi.vfs/lib/tcllib1.21/des/des.tcl | 272 + .../lib/tcllib1.21/des/pkgIndex.tcl | 7 + .../lib/tcllib1.21/des/tcldes.tcl | 1089 + .../lib/tcllib1.21/des/tcldesjr.tcl | 1055 + .../lib/tcllib1.21/dicttool/dicttool.tcl | 155 + .../lib/tcllib1.21/dicttool/pkgIndex.tcl | 11 + src/tclkit86bi.vfs/lib/tcllib1.21/dns/dns.tcl | 1521 + src/tclkit86bi.vfs/lib/tcllib1.21/dns/ip.tcl | 556 + .../lib/tcllib1.21/dns/ipMore.tcl | 1293 + .../lib/tcllib1.21/dns/ipMoreC.tcl | 242 + .../lib/tcllib1.21/dns/msgs/en.msg | 8 + .../lib/tcllib1.21/dns/pkgIndex.tcl | 7 + .../lib/tcllib1.21/dns/resolv.tcl | 249 + src/tclkit86bi.vfs/lib/tcllib1.21/dns/spf.tcl | 528 + .../lib/tcllib1.21/docstrip/docstrip.tcl | 163 + .../lib/tcllib1.21/docstrip/docstrip_util.tcl | 649 + .../lib/tcllib1.21/docstrip/pkgIndex.tcl | 23 + .../lib/tcllib1.21/doctools/api.tcl | 31 + .../lib/tcllib1.21/doctools/api_idx.tcl | 26 + .../lib/tcllib1.21/doctools/api_toc.tcl | 26 + .../lib/tcllib1.21/doctools/changelog.tcl | 278 + .../lib/tcllib1.21/doctools/checker.tcl | 734 + .../lib/tcllib1.21/doctools/checker_idx.tcl | 207 + .../lib/tcllib1.21/doctools/checker_toc.tcl | 214 + .../lib/tcllib1.21/doctools/cvs.tcl | 134 + .../lib/tcllib1.21/doctools/docidx.tcl | 960 + .../lib/tcllib1.21/doctools/doctoc.tcl | 966 + .../lib/tcllib1.21/doctools/doctools.tcl | 1361 + .../tcllib1.21/doctools/mpformats/_common.tcl | 316 + .../tcllib1.21/doctools/mpformats/_html.tcl | 199 + .../doctools/mpformats/_idx_common.tcl | 31 + .../doctools/mpformats/_markdown.tcl | 216 + .../tcllib1.21/doctools/mpformats/_nroff.tcl | 182 + .../tcllib1.21/doctools/mpformats/_text.tcl | 184 + .../doctools/mpformats/_text_bullets.tcl | 30 + .../doctools/mpformats/_text_ccore.tcl | 141 + .../doctools/mpformats/_text_cstack.tcl | 31 + .../doctools/mpformats/_text_dlist.tcl | 278 + .../doctools/mpformats/_text_margin.tcl | 21 + .../doctools/mpformats/_text_para.tcl | 65 + .../doctools/mpformats/_text_state.tcl | 22 + .../doctools/mpformats/_text_utils.tcl | 60 + .../doctools/mpformats/_toc_common.tcl | 31 + .../tcllib1.21/doctools/mpformats/_xml.tcl | 233 + .../tcllib1.21/doctools/mpformats/_xref.tcl | 129 + .../lib/tcllib1.21/doctools/mpformats/c.msg | 58 + .../lib/tcllib1.21/doctools/mpformats/de.msg | 54 + .../lib/tcllib1.21/doctools/mpformats/en.msg | 54 + .../tcllib1.21/doctools/mpformats/fmt.desc | 49 + .../tcllib1.21/doctools/mpformats/fmt.html | 642 + .../tcllib1.21/doctools/mpformats/fmt.latex | 431 + .../tcllib1.21/doctools/mpformats/fmt.list | 52 + .../doctools/mpformats/fmt.markdown | 529 + .../tcllib1.21/doctools/mpformats/fmt.nroff | 306 + .../tcllib1.21/doctools/mpformats/fmt.null | 30 + .../tcllib1.21/doctools/mpformats/fmt.text | 565 + .../tcllib1.21/doctools/mpformats/fmt.tmml | 308 + .../tcllib1.21/doctools/mpformats/fmt.wiki | 305 + .../lib/tcllib1.21/doctools/mpformats/fr.msg | 34 + .../tcllib1.21/doctools/mpformats/idx.html | 331 + .../doctools/mpformats/idx.markdown | 219 + .../tcllib1.21/doctools/mpformats/idx.nroff | 101 + .../tcllib1.21/doctools/mpformats/idx.null | 23 + .../tcllib1.21/doctools/mpformats/idx.text | 77 + .../tcllib1.21/doctools/mpformats/idx.wiki | 63 + .../tcllib1.21/doctools/mpformats/man.macros | 267 + .../tcllib1.21/doctools/mpformats/toc.html | 196 + .../doctools/mpformats/toc.markdown | 75 + .../tcllib1.21/doctools/mpformats/toc.nroff | 70 + .../tcllib1.21/doctools/mpformats/toc.null | 23 + .../tcllib1.21/doctools/mpformats/toc.text | 106 + .../tcllib1.21/doctools/mpformats/toc.tmml | 34 + .../tcllib1.21/doctools/mpformats/toc.wiki | 63 + .../lib/tcllib1.21/doctools/pkgIndex.tcl | 6 + .../lib/tcllib1.21/doctools2base/html.tcl | 209 + .../doctools2base/html_cssdefaults.tcl | 158 + .../lib/tcllib1.21/doctools2base/msgcat.tcl | 59 + .../doctools2base/nroff_manmacros.tcl | 261 + .../lib/tcllib1.21/doctools2base/pkgIndex.tcl | 17 + .../tcllib1.21/doctools2base/tcl_parse.tcl | 800 + .../lib/tcllib1.21/doctools2base/text.tcl | 216 + .../lib/tcllib1.21/doctools2idx/container.tcl | 405 + .../lib/tcllib1.21/doctools2idx/export.tcl | 123 + .../tcllib1.21/doctools2idx/export_docidx.tcl | 210 + .../tcllib1.21/doctools2idx/export_html.tcl | 421 + .../tcllib1.21/doctools2idx/export_json.tcl | 214 + .../tcllib1.21/doctools2idx/export_nroff.tcl | 213 + .../tcllib1.21/doctools2idx/export_text.tcl | 136 + .../tcllib1.21/doctools2idx/export_wiki.tcl | 163 + .../lib/tcllib1.21/doctools2idx/import.tcl | 189 + .../tcllib1.21/doctools2idx/import_docidx.tcl | 91 + .../tcllib1.21/doctools2idx/import_json.tcl | 78 + .../lib/tcllib1.21/doctools2idx/msgcat_c.tcl | 26 + .../lib/tcllib1.21/doctools2idx/msgcat_de.tcl | 26 + .../lib/tcllib1.21/doctools2idx/msgcat_en.tcl | 26 + .../lib/tcllib1.21/doctools2idx/msgcat_fr.tcl | 29 + .../lib/tcllib1.21/doctools2idx/parse.tcl | 1043 + .../lib/tcllib1.21/doctools2idx/pkgIndex.tcl | 35 + .../lib/tcllib1.21/doctools2idx/structure.tcl | 288 + .../lib/tcllib1.21/doctools2toc/container.tcl | 545 + .../lib/tcllib1.21/doctools2toc/export.tcl | 123 + .../tcllib1.21/doctools2toc/export_doctoc.tcl | 217 + .../tcllib1.21/doctools2toc/export_html.tcl | 323 + .../tcllib1.21/doctools2toc/export_json.tcl | 223 + .../tcllib1.21/doctools2toc/export_nroff.tcl | 218 + .../tcllib1.21/doctools2toc/export_text.tcl | 142 + .../tcllib1.21/doctools2toc/export_wiki.tcl | 144 + .../lib/tcllib1.21/doctools2toc/import.tcl | 189 + .../tcllib1.21/doctools2toc/import_doctoc.tcl | 91 + .../tcllib1.21/doctools2toc/import_json.tcl | 77 + .../lib/tcllib1.21/doctools2toc/msgcat_c.tcl | 28 + .../lib/tcllib1.21/doctools2toc/msgcat_de.tcl | 28 + .../lib/tcllib1.21/doctools2toc/msgcat_en.tcl | 28 + .../lib/tcllib1.21/doctools2toc/msgcat_fr.tcl | 31 + .../lib/tcllib1.21/doctools2toc/parse.tcl | 1058 + .../lib/tcllib1.21/doctools2toc/pkgIndex.tcl | 35 + .../lib/tcllib1.21/doctools2toc/structure.tcl | 388 + .../lib/tcllib1.21/dtplite/dtplite.tcl | 1785 + .../lib/tcllib1.21/dtplite/pkgIndex.tcl | 5 + .../lib/tcllib1.21/fileutil/decode.tcl | 207 + .../lib/tcllib1.21/fileutil/fileutil.tcl | 2311 + .../lib/tcllib1.21/fileutil/multi.tcl | 28 + .../lib/tcllib1.21/fileutil/multiop.tcl | 645 + .../lib/tcllib1.21/fileutil/paths.tcl | 74 + .../lib/tcllib1.21/fileutil/pkgIndex.tcl | 15 + .../lib/tcllib1.21/fileutil/traverse.tcl | 504 + src/tclkit86bi.vfs/lib/tcllib1.21/ftp/ftp.tcl | 3159 + .../lib/tcllib1.21/ftp/ftp_geturl.tcl | 135 + .../lib/tcllib1.21/ftp/pkgIndex.tcl | 3 + .../lib/tcllib1.21/ftpd/ftpd.tcl | 2064 + .../lib/tcllib1.21/ftpd/pkgIndex.tcl | 2 + .../lib/tcllib1.21/fumagic/cfront.tcl | 932 + .../lib/tcllib1.21/fumagic/cgen.tcl | 705 + .../lib/tcllib1.21/fumagic/filetypes.tcl | 85040 ++++++++++++++++ .../lib/tcllib1.21/fumagic/pkgIndex.tcl | 14 + .../lib/tcllib1.21/fumagic/rtcore.tcl | 1019 + .../lib/tcllib1.21/generator/generator.tcl | 380 + .../lib/tcllib1.21/generator/pkgIndex.tcl | 3 + src/tclkit86bi.vfs/lib/tcllib1.21/gpx/gpx.tcl | 294 + .../lib/tcllib1.21/gpx/pkgIndex.tcl | 2 + .../grammar_aycock/aycock-build.tcl | 735 + .../grammar_aycock/aycock-debug.tcl | 189 + .../grammar_aycock/aycock-runtime.tcl | 425 + .../tcllib1.21/grammar_aycock/pkgIndex.tcl | 8 + .../lib/tcllib1.21/grammar_fa/dacceptor.tcl | 166 + .../lib/tcllib1.21/grammar_fa/dexec.tcl | 188 + .../lib/tcllib1.21/grammar_fa/fa.tcl | 1242 + .../lib/tcllib1.21/grammar_fa/faop.tcl | 1618 + .../lib/tcllib1.21/grammar_fa/pkgIndex.tcl | 6 + .../lib/tcllib1.21/grammar_me/gasm.tcl | 207 + .../lib/tcllib1.21/grammar_me/me_cpu.tcl | 103 + .../lib/tcllib1.21/grammar_me/me_cpucore.tcl | 1156 + .../lib/tcllib1.21/grammar_me/me_tcl.tcl | 521 + .../lib/tcllib1.21/grammar_me/me_util.tcl | 188 + .../lib/tcllib1.21/grammar_me/pkgIndex.tcl | 7 + .../lib/tcllib1.21/grammar_peg/peg.tcl | 541 + .../lib/tcllib1.21/grammar_peg/peg_interp.tcl | 350 + .../lib/tcllib1.21/grammar_peg/pkgIndex.tcl | 2 + .../lib/tcllib1.21/hook/hook.tcl | 358 + .../lib/tcllib1.21/hook/pkgIndex.tcl | 5 + .../lib/tcllib1.21/html/html.tcl | 1581 + .../lib/tcllib1.21/html/pkgIndex.tcl | 2 + .../lib/tcllib1.21/htmlparse/htmlparse.tcl | 1444 + .../lib/tcllib1.21/htmlparse/pkgIndex.tcl | 2 + .../lib/tcllib1.21/http/autoproxy.tcl | 588 + .../lib/tcllib1.21/http/pkgIndex.tcl | 2 + .../lib/tcllib1.21/httpd/httpd.tcl | 2016 + .../lib/tcllib1.21/httpd/pkgIndex.tcl | 4 + .../lib/tcllib1.21/httpwget/pkgIndex.tcl | 11 + .../lib/tcllib1.21/httpwget/wget.tcl | 54 + .../lib/tcllib1.21/ident/ident.tcl | 90 + .../lib/tcllib1.21/ident/pkgIndex.tcl | 13 + .../lib/tcllib1.21/imap4/imap4.tcl | 1382 + .../lib/tcllib1.21/imap4/pkgIndex.tcl | 2 + .../lib/tcllib1.21/inifile/ini.tcl | 422 + .../lib/tcllib1.21/inifile/pkgIndex.tcl | 2 + .../lib/tcllib1.21/interp/deleg_method.tcl | 64 + .../lib/tcllib1.21/interp/deleg_proc.tcl | 68 + .../lib/tcllib1.21/interp/interp.tcl | 87 + .../lib/tcllib1.21/interp/pkgIndex.tcl | 4 + src/tclkit86bi.vfs/lib/tcllib1.21/irc/irc.tcl | 531 + .../lib/tcllib1.21/irc/picoirc.tcl | 450 + .../lib/tcllib1.21/irc/pkgIndex.tcl | 7 + .../lib/tcllib1.21/javascript/javascript.tcl | 453 + .../lib/tcllib1.21/javascript/pkgIndex.tcl | 4 + .../lib/tcllib1.21/jpeg/jpeg.tcl | 1125 + .../lib/tcllib1.21/jpeg/pkgIndex.tcl | 2 + .../lib/tcllib1.21/json/json.tcl | 285 + .../lib/tcllib1.21/json/json_tcl.tcl | 291 + .../lib/tcllib1.21/json/json_write.tcl | 212 + .../lib/tcllib1.21/json/jsonc.tcl | 171 + .../lib/tcllib1.21/json/pkgIndex.tcl | 7 + .../lib/tcllib1.21/lambda/lambda.tcl | 43 + .../lib/tcllib1.21/lambda/pkgIndex.tcl | 8 + .../lib/tcllib1.21/lazyset/lazyset.tcl | 88 + .../lib/tcllib1.21/lazyset/pkgIndex.tcl | 2 + .../lib/tcllib1.21/ldap/ldap.tcl | 2327 + .../lib/tcllib1.21/ldap/ldapx.tcl | 1804 + .../lib/tcllib1.21/ldap/pkgIndex.tcl | 7 + src/tclkit86bi.vfs/lib/tcllib1.21/log/log.tcl | 897 + .../lib/tcllib1.21/log/logger.tcl | 1297 + .../lib/tcllib1.21/log/loggerAppender.tcl | 444 + .../lib/tcllib1.21/log/loggerUtils.tcl | 538 + .../lib/tcllib1.21/log/msgs/en.msg | 7 + .../lib/tcllib1.21/log/pkgIndex.tcl | 9 + .../tcllib1.21/map/map_geocode_nominatim.tcl | 91 + .../lib/tcllib1.21/map/map_slippy.tcl | 221 + .../lib/tcllib1.21/map/map_slippy_cache.tcl | 141 + .../lib/tcllib1.21/map/map_slippy_fetcher.tcl | 183 + .../lib/tcllib1.21/map/pkgIndex.tcl | 6 + .../lib/tcllib1.21/mapproj/mapproj.tcl | 1817 + .../lib/tcllib1.21/mapproj/pkgIndex.tcl | 2 + .../lib/tcllib1.21/markdown/markdown.tcl | 815 + .../lib/tcllib1.21/markdown/pkgIndex.tcl | 2 + .../lib/tcllib1.21/math/bessel.tcl | 194 + .../lib/tcllib1.21/math/bigfloat.tcl | 2316 + .../lib/tcllib1.21/math/bigfloat2.tcl | 2223 + .../lib/tcllib1.21/math/bignum.tcl | 900 + .../lib/tcllib1.21/math/calculus.tcl | 1645 + .../lib/tcllib1.21/math/changepoint.tcl | 311 + .../lib/tcllib1.21/math/classic_polyns.tcl | 200 + .../lib/tcllib1.21/math/combinatorics.tcl | 443 + .../lib/tcllib1.21/math/combinatoricsExt.tcl | 825 + .../lib/tcllib1.21/math/constants.tcl | 205 + .../lib/tcllib1.21/math/decimal.tcl | 1742 + .../lib/tcllib1.21/math/elliptic.tcl | 242 + .../lib/tcllib1.21/math/exact.tcl | 4060 + .../lib/tcllib1.21/math/exponential.tcl | 434 + .../lib/tcllib1.21/math/figurate.tcl | 294 + .../lib/tcllib1.21/math/filtergen.tcl | 250 + .../lib/tcllib1.21/math/fourier.tcl | 376 + .../lib/tcllib1.21/math/fuzzy.tcl | 173 + .../lib/tcllib1.21/math/geometry.tcl | 1572 + .../lib/tcllib1.21/math/geometry_circle.tcl | 382 + .../lib/tcllib1.21/math/geometry_ext.tcl | 1023 + .../lib/tcllib1.21/math/interpolate.tcl | 667 + .../lib/tcllib1.21/math/kruskal.tcl | 154 + .../lib/tcllib1.21/math/linalg.tcl | 2299 + .../lib/tcllib1.21/math/liststat.tcl | 95 + .../lib/tcllib1.21/math/machineparameters.tcl | 378 + .../lib/tcllib1.21/math/math.tcl | 44 + .../lib/tcllib1.21/math/misc.tcl | 385 + .../lib/tcllib1.21/math/mvlinreg.tcl | 265 + .../lib/tcllib1.21/math/numtheory.tcl | 82 + .../lib/tcllib1.21/math/optimize.tcl | 1319 + .../lib/tcllib1.21/math/pca.tcl | 402 + .../lib/tcllib1.21/math/pdf_stat.tcl | 2676 + .../lib/tcllib1.21/math/pkgIndex.tcl | 42 + .../lib/tcllib1.21/math/plotstat.tcl | 312 + .../lib/tcllib1.21/math/polynomials.tcl | 560 + .../lib/tcllib1.21/math/primes.tcl | 569 + .../lib/tcllib1.21/math/probopt.tcl | 19 + .../lib/tcllib1.21/math/probopt_diffev.tcl | 275 + .../lib/tcllib1.21/math/probopt_lipo.tcl | 241 + .../lib/tcllib1.21/math/probopt_pso.tcl | 427 + .../lib/tcllib1.21/math/probopt_sce.tcl | 378 + .../lib/tcllib1.21/math/qcomplex.tcl | 178 + .../lib/tcllib1.21/math/quasirandom.tcl | 517 + .../lib/tcllib1.21/math/rational_funcs.tcl | 364 + .../lib/tcllib1.21/math/romannumerals.tcl | 164 + .../lib/tcllib1.21/math/special.tcl | 463 + .../lib/tcllib1.21/math/stat_kernel.tcl | 217 + .../lib/tcllib1.21/math/stat_logit.tcl | 120 + .../lib/tcllib1.21/math/stat_wasserstein.tcl | 214 + .../lib/tcllib1.21/math/statistics.tcl | 2037 + .../lib/tcllib1.21/math/symdiff.tcl | 1229 + .../lib/tcllib1.21/math/tclIndex | 26 + .../lib/tcllib1.21/math/trig.tcl | 290 + .../lib/tcllib1.21/math/wilcoxon.tcl | 338 + src/tclkit86bi.vfs/lib/tcllib1.21/md4/md4.tcl | 569 + .../lib/tcllib1.21/md4/md4c.tcl | 120 + .../lib/tcllib1.21/md4/pkgIndex.tcl | 3 + src/tclkit86bi.vfs/lib/tcllib1.21/md5/md5.tcl | 457 + .../lib/tcllib1.21/md5/md5c.tcl | 148 + .../lib/tcllib1.21/md5/md5x.tcl | 739 + .../lib/tcllib1.21/md5/pkgIndex.tcl | 3 + .../lib/tcllib1.21/md5crypt/md5crypt.tcl | 152 + .../lib/tcllib1.21/md5crypt/md5cryptc.tcl | 174 + .../lib/tcllib1.21/md5crypt/pkgIndex.tcl | 3 + .../lib/tcllib1.21/mime/mime.tcl | 3942 + .../lib/tcllib1.21/mime/pkgIndex.tcl | 5 + .../lib/tcllib1.21/mime/smtp.tcl | 1508 + .../lib/tcllib1.21/mkdoc/mkdoc.tcl | 701 + .../lib/tcllib1.21/mkdoc/pkgIndex.tcl | 2 + .../tcllib1.21/multiplexer/multiplexer.tcl | 291 + .../lib/tcllib1.21/multiplexer/pkgIndex.tcl | 12 + .../lib/tcllib1.21/namespacex/namespacex.tcl | 335 + .../lib/tcllib1.21/namespacex/pkgIndex.tcl | 5 + .../lib/tcllib1.21/ncgi/ncgi.tcl | 1119 + .../lib/tcllib1.21/ncgi/pkgIndex.tcl | 2 + .../lib/tcllib1.21/nettool/nettool.tcl | 1814 + .../lib/tcllib1.21/nettool/pkgIndex.tcl | 6 + .../lib/tcllib1.21/nmea/nmea.tcl | 197 + .../lib/tcllib1.21/nmea/pkgIndex.tcl | 2 + .../lib/tcllib1.21/nns/common.tcl | 38 + src/tclkit86bi.vfs/lib/tcllib1.21/nns/nns.tcl | 432 + .../lib/tcllib1.21/nns/nns_auto.tcl | 443 + .../lib/tcllib1.21/nns/pkgIndex.tcl | 7 + .../lib/tcllib1.21/nns/server.tcl | 385 + .../lib/tcllib1.21/nntp/nntp.tcl | 979 + .../lib/tcllib1.21/nntp/pkgIndex.tcl | 12 + .../lib/tcllib1.21/ntp/pkgIndex.tcl | 2 + .../lib/tcllib1.21/ntp/time.tcl | 382 + .../lib/tcllib1.21/oauth/oauth.tcl | 304 + .../lib/tcllib1.21/oauth/pkgIndex.tcl | 2 + .../lib/tcllib1.21/oodialect/oodialect.tcl | 265 + .../lib/tcllib1.21/oodialect/pkgIndex.tcl | 1 + .../lib/tcllib1.21/oometa/oometa.tcl | 503 + .../lib/tcllib1.21/oometa/oooption.tcl | 169 + .../lib/tcllib1.21/oometa/pkgIndex.tcl | 8 + .../lib/tcllib1.21/ooutil/ooutil.tcl | 189 + .../lib/tcllib1.21/ooutil/pkgIndex.tcl | 7 + src/tclkit86bi.vfs/lib/tcllib1.21/otp/otp.tcl | 430 + .../lib/tcllib1.21/otp/pkgIndex.tcl | 3 + .../tcllib1.21/page/analysis_peg_emodes.tcl | 458 + .../tcllib1.21/page/analysis_peg_minimize.tcl | 51 + .../page/analysis_peg_reachable.tcl | 150 + .../page/analysis_peg_realizable.tcl | 257 + .../tcllib1.21/page/compiler_peg_mecpu.tcl | 1642 + .../lib/tcllib1.21/page/gen_peg_canon.tcl | 481 + .../lib/tcllib1.21/page/gen_peg_cpkg.tcl | 171 + .../lib/tcllib1.21/page/gen_peg_hb.tcl | 79 + .../lib/tcllib1.21/page/gen_peg_me.tcl | 888 + .../lib/tcllib1.21/page/gen_peg_me.template | 61 + .../lib/tcllib1.21/page/gen_peg_mecpu.tcl | 289 + .../tcllib1.21/page/gen_peg_mecpu.template | 48 + .../lib/tcllib1.21/page/gen_peg_ser.tcl | 63 + .../lib/tcllib1.21/page/gen_tree_text.tcl | 94 + .../lib/tcllib1.21/page/parse_lemon.tcl | 7420 ++ .../lib/tcllib1.21/page/parse_peg.tcl | 4415 + .../lib/tcllib1.21/page/parse_peghb.tcl | 118 + .../lib/tcllib1.21/page/parse_pegser.tcl | 99 + .../lib/tcllib1.21/page/peg_grammar.tcl | 117 + .../lib/tcllib1.21/page/pkgIndex.tcl | 80 + .../lib/tcllib1.21/page/pluginmgr.tcl | 581 + .../tcllib1.21/page/plugins/config_peg.tcl | 14 + .../lib/tcllib1.21/page/plugins/pkgIndex.tcl | 34 + .../lib/tcllib1.21/page/plugins/reader_hb.tcl | 114 + .../tcllib1.21/page/plugins/reader_lemon.tcl | 170 + .../tcllib1.21/page/plugins/reader_peg.tcl | 169 + .../tcllib1.21/page/plugins/reader_ser.tcl | 114 + .../page/plugins/reader_treeser.tcl | 116 + .../page/plugins/transform_mecpu.tcl | 107 + .../page/plugins/transform_reachable.tcl | 107 + .../page/plugins/transform_realizable.tcl | 106 + .../lib/tcllib1.21/page/plugins/writer_hb.tcl | 106 + .../page/plugins/writer_identity.tcl | 98 + .../lib/tcllib1.21/page/plugins/writer_me.tcl | 115 + .../tcllib1.21/page/plugins/writer_mecpu.tcl | 116 + .../tcllib1.21/page/plugins/writer_null.tcl | 97 + .../tcllib1.21/page/plugins/writer_peg.tcl | 106 + .../tcllib1.21/page/plugins/writer_ser.tcl | 104 + .../tcllib1.21/page/plugins/writer_tpc.tcl | 105 + .../tcllib1.21/page/plugins/writer_tree.tcl | 105 + .../lib/tcllib1.21/page/util_flow.tcl | 90 + .../lib/tcllib1.21/page/util_norm_lemon.tcl | 427 + .../lib/tcllib1.21/page/util_norm_peg.tcl | 415 + .../lib/tcllib1.21/page/util_peg.tcl | 209 + .../lib/tcllib1.21/page/util_quote.tcl | 173 + .../lib/tcllib1.21/pkgIndex.tcl | 159 + .../lib/tcllib1.21/pki/pkgIndex.tcl | 3 + src/tclkit86bi.vfs/lib/tcllib1.21/pki/pki.tcl | 3321 + .../lib/tcllib1.21/pluginmgr/pkgIndex.tcl | 2 + .../lib/tcllib1.21/pluginmgr/pluginmgr.tcl | 421 + .../lib/tcllib1.21/png/pkgIndex.tcl | 2 + src/tclkit86bi.vfs/lib/tcllib1.21/png/png.tcl | 311 + .../lib/tcllib1.21/pop3/pkgIndex.tcl | 2 + .../lib/tcllib1.21/pop3/pop3.tcl | 828 + .../lib/tcllib1.21/pop3d/pkgIndex.tcl | 16 + .../lib/tcllib1.21/pop3d/pop3d.tcl | 1147 + .../lib/tcllib1.21/pop3d/pop3d_dbox.tcl | 485 + .../lib/tcllib1.21/pop3d/pop3d_udb.tcl | 300 + .../lib/tcllib1.21/practcl/pkgIndex.tcl | 4 + .../lib/tcllib1.21/practcl/practcl.tcl | 8453 ++ .../lib/tcllib1.21/processman/pkgIndex.tcl | 3 + .../lib/tcllib1.21/processman/processman.tcl | 343 + .../lib/tcllib1.21/profiler/pkgIndex.tcl | 2 + .../lib/tcllib1.21/profiler/profiler.tcl | 672 + src/tclkit86bi.vfs/lib/tcllib1.21/pt/char.tcl | 289 + .../lib/tcllib1.21/pt/pkgIndex.tcl | 71 + .../lib/tcllib1.21/pt/pt_astree.tcl | 234 + .../tcllib1.21/pt/pt_cparam_config_critcl.tcl | 494 + .../tcllib1.21/pt/pt_cparam_config_tea.tcl | 465 + .../lib/tcllib1.21/pt/pt_parse_peg.tcl | 180 + .../lib/tcllib1.21/pt/pt_parse_peg_c.tcl | 4997 + .../lib/tcllib1.21/pt/pt_parse_peg_tcl.tcl | 2431 + .../lib/tcllib1.21/pt/pt_peg_container.tcl | 530 + .../tcllib1.21/pt/pt_peg_container_peg.tcl | 146 + .../lib/tcllib1.21/pt/pt_peg_export.tcl | 117 + .../tcllib1.21/pt/pt_peg_export_container.tcl | 51 + .../lib/tcllib1.21/pt/pt_peg_export_json.tcl | 50 + .../lib/tcllib1.21/pt/pt_peg_export_peg.tcl | 51 + .../lib/tcllib1.21/pt/pt_peg_from_json.tcl | 48 + .../lib/tcllib1.21/pt/pt_peg_from_peg.tcl | 394 + .../lib/tcllib1.21/pt/pt_peg_import.tcl | 188 + .../lib/tcllib1.21/pt/pt_peg_import_json.tcl | 40 + .../lib/tcllib1.21/pt/pt_peg_import_peg.tcl | 41 + .../lib/tcllib1.21/pt/pt_peg_interp.tcl | 385 + .../lib/tcllib1.21/pt/pt_peg_op.tcl | 375 + .../lib/tcllib1.21/pt/pt_peg_to_container.tcl | 345 + .../lib/tcllib1.21/pt/pt_peg_to_cparam.tcl | 1661 + .../lib/tcllib1.21/pt/pt_peg_to_json.tcl | 149 + .../lib/tcllib1.21/pt/pt_peg_to_param.tcl | 1029 + .../lib/tcllib1.21/pt/pt_peg_to_peg.tcl | 413 + .../lib/tcllib1.21/pt/pt_peg_to_tclparam.tcl | 1273 + .../lib/tcllib1.21/pt/pt_pegrammar.tcl | 380 + .../lib/tcllib1.21/pt/pt_pexpr_op.tcl | 331 + .../lib/tcllib1.21/pt/pt_pexpression.tcl | 321 + .../lib/tcllib1.21/pt/pt_pgen.tcl | 234 + .../lib/tcllib1.21/pt/pt_rdengine.tcl | 206 + .../lib/tcllib1.21/pt/pt_rdengine_c.tcl | 168 + .../lib/tcllib1.21/pt/pt_rdengine_nx.tcl | 148 + .../lib/tcllib1.21/pt/pt_rdengine_oo.tcl | 2170 + .../lib/tcllib1.21/pt/pt_rdengine_tcl.tcl | 2283 + .../tcllib1.21/pt/pt_tclparam_config_nx.tcl | 113 + .../tcllib1.21/pt/pt_tclparam_config_snit.tcl | 141 + .../pt/pt_tclparam_config_tcloo.tcl | 121 + .../lib/tcllib1.21/pt/pt_util.tcl | 160 + .../lib/tcllib1.21/pt/rde_critcl/m.c | 2746 + .../lib/tcllib1.21/pt/rde_critcl/m.h | 150 + .../lib/tcllib1.21/pt/rde_critcl/ms.c | 317 + .../lib/tcllib1.21/pt/rde_critcl/ms.h | 20 + .../lib/tcllib1.21/pt/rde_critcl/ot.c | 236 + .../lib/tcllib1.21/pt/rde_critcl/ot.h | 32 + .../lib/tcllib1.21/pt/rde_critcl/p.c | 183 + .../lib/tcllib1.21/pt/rde_critcl/p.h | 24 + .../lib/tcllib1.21/pt/rde_critcl/pInt.h | 50 + .../lib/tcllib1.21/pt/rde_critcl/param.c | 1791 + .../lib/tcllib1.21/pt/rde_critcl/param.h | 183 + .../lib/tcllib1.21/pt/rde_critcl/stack.c | 160 + .../lib/tcllib1.21/pt/rde_critcl/stack.h | 62 + .../lib/tcllib1.21/pt/rde_critcl/tc.c | 186 + .../lib/tcllib1.21/pt/rde_critcl/tc.h | 31 + .../lib/tcllib1.21/pt/rde_critcl/util.c | 145 + .../lib/tcllib1.21/pt/rde_critcl/util.h | 79 + .../lib/tcllib1.21/pt/text_write.tcl | 249 + .../lib/tcllib1.21/rc4/pkgIndex.tcl | 13 + src/tclkit86bi.vfs/lib/tcllib1.21/rc4/rc4.tcl | 422 + .../lib/tcllib1.21/rc4/rc4c.tcl | 168 + .../lib/tcllib1.21/rcs/pkgIndex.tcl | 2 + src/tclkit86bi.vfs/lib/tcllib1.21/rcs/rcs.tcl | 281 + .../lib/tcllib1.21/report/pkgIndex.tcl | 2 + .../lib/tcllib1.21/report/report.tcl | 1386 + .../lib/tcllib1.21/rest/pkgIndex.tcl | 2 + .../lib/tcllib1.21/rest/rest.tcl | 854 + .../lib/tcllib1.21/ripemd/pkgIndex.tcl | 11 + .../lib/tcllib1.21/ripemd/ripemd128.tcl | 731 + .../lib/tcllib1.21/ripemd/ripemd160.tcl | 866 + .../lib/tcllib1.21/sasl/gtoken.tcl | 92 + .../lib/tcllib1.21/sasl/ntlm.tcl | 375 + .../lib/tcllib1.21/sasl/pkgIndex.tcl | 11 + .../lib/tcllib1.21/sasl/sasl.tcl | 682 + .../lib/tcllib1.21/sasl/scram.tcl | 503 + .../lib/tcllib1.21/sha1/pkgIndex.tcl | 15 + src/tclkit86bi.vfs/lib/tcllib1.21/sha1/sha1.c | 267 + src/tclkit86bi.vfs/lib/tcllib1.21/sha1/sha1.h | 26 + .../lib/tcllib1.21/sha1/sha1.tcl | 814 + .../lib/tcllib1.21/sha1/sha1c.tcl | 125 + .../lib/tcllib1.21/sha1/sha1v1.tcl | 710 + .../lib/tcllib1.21/sha1/sha256.c | 524 + .../lib/tcllib1.21/sha1/sha256.h | 88 + .../lib/tcllib1.21/sha1/sha256.tcl | 833 + .../lib/tcllib1.21/sha1/sha256c.tcl | 193 + .../lib/tcllib1.21/simulation/annealing.tcl | 564 + .../lib/tcllib1.21/simulation/montecarlo.tcl | 486 + .../lib/tcllib1.21/simulation/pkgIndex.tcl | 3 + .../lib/tcllib1.21/simulation/random.tcl | 645 + .../lib/tcllib1.21/smtpd/pkgIndex.tcl | 12 + .../lib/tcllib1.21/smtpd/smtpd.tcl | 924 + .../lib/tcllib1.21/snit/main1.tcl | 3987 + .../lib/tcllib1.21/snit/main1_83.tcl | 4011 + .../lib/tcllib1.21/snit/main2.tcl | 3888 + .../lib/tcllib1.21/snit/pkgIndex.tcl | 6 + .../lib/tcllib1.21/snit/snit.tcl | 41 + .../lib/tcllib1.21/snit/snit2.tcl | 32 + .../lib/tcllib1.21/snit/snit_tcl83_utils.tcl | 231 + .../lib/tcllib1.21/snit/validate.tcl | 720 + .../lib/tcllib1.21/soundex/pkgIndex.tcl | 12 + .../lib/tcllib1.21/soundex/soundex.tcl | 96 + .../lib/tcllib1.21/stooop/mkpkgidx.tcl | 112 + .../lib/tcllib1.21/stooop/pkgIndex.tcl | 22 + .../lib/tcllib1.21/stooop/stooop.tcl | 938 + .../lib/tcllib1.21/stooop/switched.tcl | 133 + .../lib/tcllib1.21/stooop/xifo.tcl | 142 + .../lib/tcllib1.21/string/pkgIndex.tcl | 6 + .../lib/tcllib1.21/string/token.tcl | 94 + .../lib/tcllib1.21/string/token_shell.tcl | 172 + .../lib/tcllib1.21/stringprep/pkgIndex.tcl | 5 + .../lib/tcllib1.21/stringprep/stringprep.tcl | 278 + .../tcllib1.21/stringprep/stringprep_data.tcl | 1034 + .../lib/tcllib1.21/stringprep/unicode.tcl | 292 + .../tcllib1.21/stringprep/unicode_data.tcl | 1547 + .../lib/tcllib1.21/struct/disjointset.tcl | 385 + .../lib/tcllib1.21/struct/graph.tcl | 178 + .../lib/tcllib1.21/struct/graph1.tcl | 2154 + .../lib/tcllib1.21/struct/graph_c.tcl | 158 + .../lib/tcllib1.21/struct/graph_tcl.tcl | 3279 + .../lib/tcllib1.21/struct/graphops.tcl | 3787 + .../lib/tcllib1.21/struct/list.tcl | 1834 + .../lib/tcllib1.21/struct/list.test.tcl | 1292 + .../lib/tcllib1.21/struct/map.tcl | 104 + .../lib/tcllib1.21/struct/matrix.tcl | 2790 + .../lib/tcllib1.21/struct/matrix1.tcl | 2285 + .../lib/tcllib1.21/struct/pkgIndex.tcl | 29 + .../lib/tcllib1.21/struct/pool.tcl | 715 + .../lib/tcllib1.21/struct/prioqueue.tcl | 535 + .../lib/tcllib1.21/struct/queue.tcl | 187 + .../lib/tcllib1.21/struct/queue_c.tcl | 151 + .../lib/tcllib1.21/struct/queue_oo.tcl | 228 + .../lib/tcllib1.21/struct/queue_tcl.tcl | 383 + .../lib/tcllib1.21/struct/record.tcl | 830 + .../lib/tcllib1.21/struct/sets.tcl | 189 + .../lib/tcllib1.21/struct/sets_c.tcl | 93 + .../lib/tcllib1.21/struct/sets_tcl.tcl | 452 + .../lib/tcllib1.21/struct/skiplist.tcl | 437 + .../lib/tcllib1.21/struct/stack.tcl | 187 + .../lib/tcllib1.21/struct/stack_c.tcl | 156 + .../lib/tcllib1.21/struct/stack_oo.tcl | 296 + .../lib/tcllib1.21/struct/stack_tcl.tcl | 505 + .../lib/tcllib1.21/struct/struct.tcl | 18 + .../lib/tcllib1.21/struct/struct1.tcl | 17 + .../lib/tcllib1.21/struct/tree.tcl | 183 + .../lib/tcllib1.21/struct/tree1.tcl | 1485 + .../lib/tcllib1.21/struct/tree_c.tcl | 208 + .../lib/tcllib1.21/struct/tree_tcl.tcl | 2442 + .../lib/tcllib1.21/tar/pkgIndex.tcl | 5 + src/tclkit86bi.vfs/lib/tcllib1.21/tar/tar.tcl | 547 + .../lib/tcllib1.21/tepam/pkgIndex.tcl | 3 + .../lib/tcllib1.21/tepam/tepam.tcl | 2781 + .../lib/tcllib1.21/tepam/tepam_doc_gen.tcl | 747 + .../lib/tcllib1.21/term/ansi/code.tcl | 56 + .../lib/tcllib1.21/term/ansi/code/attr.tcl | 108 + .../lib/tcllib1.21/term/ansi/code/ctrl.tcl | 272 + .../lib/tcllib1.21/term/ansi/code/macros.tcl | 93 + .../lib/tcllib1.21/term/ansi/ctrlunix.tcl | 91 + .../lib/tcllib1.21/term/ansi/send.tcl | 92 + .../lib/tcllib1.21/term/bind.tcl | 132 + .../lib/tcllib1.21/term/imenu.tcl | 202 + .../lib/tcllib1.21/term/ipager.tcl | 206 + .../lib/tcllib1.21/term/pkgIndex.tcl | 13 + .../lib/tcllib1.21/term/receive.tcl | 60 + .../lib/tcllib1.21/term/send.tcl | 34 + .../lib/tcllib1.21/term/term.tcl | 19 + .../lib/tcllib1.21/textutil/adjust.tcl | 761 + .../lib/tcllib1.21/textutil/dehypht.tex | 902 + .../lib/tcllib1.21/textutil/eshyph_vo.tex | 1104 + .../lib/tcllib1.21/textutil/expander.tcl | 1122 + .../lib/tcllib1.21/textutil/ithyph.tex | 223 + .../lib/tcllib1.21/textutil/patch.tcl | 180 + .../lib/tcllib1.21/textutil/pkgIndex.tcl | 17 + .../lib/tcllib1.21/textutil/repeat.tcl | 91 + .../lib/tcllib1.21/textutil/split.tcl | 176 + .../lib/tcllib1.21/textutil/string.tcl | 144 + .../lib/tcllib1.21/textutil/tabify.tcl | 289 + .../lib/tcllib1.21/textutil/textutil.tcl | 80 + .../lib/tcllib1.21/textutil/trim.tcl | 112 + .../lib/tcllib1.21/textutil/wcswidth.tcl | 772 + .../lib/tcllib1.21/tie/pkgIndex.tcl | 9 + src/tclkit86bi.vfs/lib/tcllib1.21/tie/tie.tcl | 510 + .../lib/tcllib1.21/tie/tie_array.tcl | 123 + .../lib/tcllib1.21/tie/tie_dsource.tcl | 53 + .../lib/tcllib1.21/tie/tie_file.tcl | 272 + .../lib/tcllib1.21/tie/tie_growfile.tcl | 146 + .../lib/tcllib1.21/tie/tie_log.tcl | 94 + .../lib/tcllib1.21/tie/tie_rarray.tcl | 117 + .../lib/tcllib1.21/tiff/pkgIndex.tcl | 2 + .../lib/tcllib1.21/tiff/tiff.tcl | 787 + .../lib/tcllib1.21/tool/pkgIndex.tcl | 13 + .../lib/tcllib1.21/tool/tool.tcl | 1849 + .../lib/tcllib1.21/transfer/connect.tcl | 97 + .../lib/tcllib1.21/transfer/copyops.tcl | 389 + .../lib/tcllib1.21/transfer/ddest.tcl | 169 + .../lib/tcllib1.21/transfer/dsource.tcl | 183 + .../lib/tcllib1.21/transfer/pkgIndex.tcl | 8 + .../lib/tcllib1.21/transfer/receiver.tcl | 188 + .../lib/tcllib1.21/transfer/tqueue.tcl | 223 + .../lib/tcllib1.21/transfer/transmitter.tcl | 176 + .../lib/tcllib1.21/treeql/pkgIndex.tcl | 5 + .../lib/tcllib1.21/treeql/treeql.tcl | 24 + .../lib/tcllib1.21/treeql/treeql84.tcl | 734 + .../lib/tcllib1.21/treeql/treeql85.tcl | 737 + .../lib/tcllib1.21/try/pkgIndex.tcl | 13 + .../lib/tcllib1.21/try/throw.tcl | 18 + src/tclkit86bi.vfs/lib/tcllib1.21/try/try.tcl | 205 + .../lib/tcllib1.21/udpcluster/pkgIndex.tcl | 4 + .../lib/tcllib1.21/udpcluster/udpcluster.tcl | 661 + .../lib/tcllib1.21/uev/pkgIndex.tcl | 3 + .../lib/tcllib1.21/uev/uevent.tcl | 470 + .../lib/tcllib1.21/uev/uevent_onidle.tcl | 51 + .../lib/tcllib1.21/units/pkgIndex.tcl | 4 + .../lib/tcllib1.21/units/units.tcl | 694 + .../lib/tcllib1.21/uri/pkgIndex.tcl | 6 + src/tclkit86bi.vfs/lib/tcllib1.21/uri/uri.tcl | 1444 + .../lib/tcllib1.21/uri/urn-scheme.tcl | 143 + .../lib/tcllib1.21/uuid/pkgIndex.tcl | 2 + .../lib/tcllib1.21/uuid/uuid.tcl | 245 + .../lib/tcllib1.21/valtype/cc_amex.tcl | 68 + .../lib/tcllib1.21/valtype/cc_discover.tcl | 70 + .../lib/tcllib1.21/valtype/cc_mastercard.tcl | 68 + .../lib/tcllib1.21/valtype/cc_visa.tcl | 69 + .../lib/tcllib1.21/valtype/ean13.tcl | 99 + .../lib/tcllib1.21/valtype/iban.tcl | 91 + .../lib/tcllib1.21/valtype/imei.tcl | 66 + .../lib/tcllib1.21/valtype/isbn.tcl | 176 + .../lib/tcllib1.21/valtype/luhn.tcl | 128 + .../lib/tcllib1.21/valtype/luhn5.tcl | 140 + .../lib/tcllib1.21/valtype/pkgIndex.tcl | 13 + .../lib/tcllib1.21/valtype/usnpi.tcl | 65 + .../lib/tcllib1.21/valtype/valtype.tcl | 77 + .../lib/tcllib1.21/valtype/verhoeff.tcl | 128 + .../lib/tcllib1.21/virtchannel_base/cat.tcl | 135 + .../tcllib1.21/virtchannel_base/facade.tcl | 234 + .../lib/tcllib1.21/virtchannel_base/fifo.tcl | 138 + .../lib/tcllib1.21/virtchannel_base/fifo2.tcl | 113 + .../tcllib1.21/virtchannel_base/halfpipe.tcl | 194 + .../tcllib1.21/virtchannel_base/memchan.tcl | 169 + .../lib/tcllib1.21/virtchannel_base/null.tcl | 54 + .../tcllib1.21/virtchannel_base/nullzero.tcl | 62 + .../tcllib1.21/virtchannel_base/pkgIndex.tcl | 17 + .../tcllib1.21/virtchannel_base/random.tcl | 80 + .../tcllib1.21/virtchannel_base/randseed.tcl | 58 + .../lib/tcllib1.21/virtchannel_base/std.tcl | 97 + .../tcllib1.21/virtchannel_base/string.tcl | 124 + .../virtchannel_base/textwindow.tcl | 74 + .../tcllib1.21/virtchannel_base/variable.tcl | 181 + .../lib/tcllib1.21/virtchannel_base/zero.tcl | 54 + .../lib/tcllib1.21/virtchannel_core/core.tcl | 73 + .../tcllib1.21/virtchannel_core/events.tcl | 154 + .../tcllib1.21/virtchannel_core/pkgIndex.tcl | 8 + .../virtchannel_core/transformcore.tcl | 71 + .../virtchannel_transform/adler32.tcl | 103 + .../virtchannel_transform/base64.tcl | 111 + .../virtchannel_transform/counter.tcl | 94 + .../virtchannel_transform/crc32.tcl | 103 + .../tcllib1.21/virtchannel_transform/hex.tcl | 58 + .../virtchannel_transform/identity.tcl | 59 + .../virtchannel_transform/limitsize.tcl | 88 + .../virtchannel_transform/observe.tcl | 80 + .../tcllib1.21/virtchannel_transform/otp.tcl | 98 + .../virtchannel_transform/pkgIndex.tcl | 14 + .../tcllib1.21/virtchannel_transform/rot.tcl | 95 + .../virtchannel_transform/spacer.tcl | 151 + .../tcllib1.21/virtchannel_transform/zlib.tcl | 100 + .../lib/tcllib1.21/websocket/pkgIndex.tcl | 2 + .../lib/tcllib1.21/websocket/websocket.tcl | 1757 + .../lib/tcllib1.21/wip/pkgIndex.tcl | 5 + src/tclkit86bi.vfs/lib/tcllib1.21/wip/wip.tcl | 463 + .../lib/tcllib1.21/wip/wip2.tcl | 464 + .../lib/tcllib1.21/yaml/huddle.tcl | 646 + .../lib/tcllib1.21/yaml/huddle_types.tcl | 296 + .../lib/tcllib1.21/yaml/json2huddle.tcl | 389 + .../lib/tcllib1.21/yaml/pkgIndex.tcl | 6 + .../lib/tcllib1.21/yaml/yaml.tcl | 1297 + .../lib/tcllib1.21/zip/decode.tcl | 751 + .../lib/tcllib1.21/zip/encode.tcl | 372 + .../lib/tcllib1.21/zip/mkzip.tcl | 282 + .../lib/tcllib1.21/zip/pkgIndex.tcl | 8 + src/tclkit86bi.vfs/lib/tcllibc/critcl-rt.tcl | 381 + src/tclkit86bi.vfs/lib/tcllibc/license.terms | 1 + src/tclkit86bi.vfs/lib/tcllibc/pkgIndex.tcl | 9 + src/tclkit86bi.vfs/lib/tcllibc/teapot.txt | 25 + .../lib/tcllibc/win32-x86_64/tcllibc.dll | Bin 0 -> 292352 bytes .../lib/tcltls1.7.22/pkgIndex.tcl | 16 + .../lib/tcltls1.7.22/tcltls.dll | Bin 0 -> 1584128 bytes src/tclkit86bi.vfs/lib/tcltls1.7.22/tls.tcl | 398 + .../lib/tdbc1.1.5/libtdbcstub115.a | Bin 0 -> 1940 bytes src/tclkit86bi.vfs/lib/tdbc1.1.5/pkgIndex.tcl | 26 + src/tclkit86bi.vfs/lib/tdbc1.1.5/tdbc.tcl | 922 + src/tclkit86bi.vfs/lib/tdbc1.1.5/tdbc115.dll | Bin 0 -> 20992 bytes .../lib/tdbc1.1.5/tdbcConfig.sh | 81 + .../lib/tdbcmysql1.1.5/pkgIndex.tcl | 14 + .../lib/tdbcmysql1.1.5/tdbcmysql.tcl | 193 + .../lib/tdbcmysql1.1.5/tdbcmysql115.dll | Bin 0 -> 44544 bytes .../lib/tdbcodbc1.1.5/pkgIndex.tcl | 14 + .../lib/tdbcodbc1.1.5/tdbcodbc.tcl | 554 + .../lib/tdbcodbc1.1.5/tdbcodbc115.dll | Bin 0 -> 55808 bytes .../lib/tdbcpostgres1.1.5/pkgIndex.tcl | 14 + .../lib/tdbcpostgres1.1.5/tdbcpostgres.tcl | 135 + .../lib/tdbcpostgres1.1.5/tdbcpostgres115.dll | Bin 0 -> 41472 bytes .../lib/tdom0.9.3/libtdomstub093.a | Bin 0 -> 1566 bytes src/tclkit86bi.vfs/lib/tdom0.9.3/pkgIndex.tcl | 6 + src/tclkit86bi.vfs/lib/tdom0.9.3/tdom.tcl | 1014 + src/tclkit86bi.vfs/lib/tdom0.9.3/tdom093.dll | Bin 0 -> 690688 bytes .../lib/thread2.8.8/pkgIndex.tcl | 68 + .../lib/thread2.8.8/thread288.dll | Bin 0 -> 81408 bytes src/tclkit86bi.vfs/lib/thread2.8.8/ttrace.tcl | 942 + src/tclkit86bi.vfs/lib/tk8.6/bgerror.tcl | 272 + src/tclkit86bi.vfs/lib/tk8.6/button.tcl | 782 + src/tclkit86bi.vfs/lib/tk8.6/choosedir.tcl | 308 + src/tclkit86bi.vfs/lib/tk8.6/clrpick.tcl | 695 + src/tclkit86bi.vfs/lib/tk8.6/comdlg.tcl | 322 + src/tclkit86bi.vfs/lib/tk8.6/console.tcl | 1154 + src/tclkit86bi.vfs/lib/tk8.6/demos/README | 44 + .../lib/tk8.6/demos/anilabel.tcl | 160 + .../lib/tk8.6/demos/aniwave.tcl | 104 + src/tclkit86bi.vfs/lib/tk8.6/demos/arrow.tcl | 241 + src/tclkit86bi.vfs/lib/tk8.6/demos/bind.tcl | 78 + src/tclkit86bi.vfs/lib/tk8.6/demos/bitmap.tcl | 52 + src/tclkit86bi.vfs/lib/tk8.6/demos/browse | 66 + src/tclkit86bi.vfs/lib/tk8.6/demos/button.tcl | 47 + src/tclkit86bi.vfs/lib/tk8.6/demos/check.tcl | 71 + .../lib/tk8.6/demos/clrpick.tcl | 54 + src/tclkit86bi.vfs/lib/tk8.6/demos/colors.tcl | 99 + src/tclkit86bi.vfs/lib/tk8.6/demos/combo.tcl | 61 + .../lib/tk8.6/demos/cscroll.tcl | 172 + src/tclkit86bi.vfs/lib/tk8.6/demos/ctext.tcl | 176 + .../lib/tk8.6/demos/dialog1.tcl | 25 + .../lib/tk8.6/demos/dialog2.tcl | 18 + src/tclkit86bi.vfs/lib/tk8.6/demos/en.msg | 97 + src/tclkit86bi.vfs/lib/tk8.6/demos/entry1.tcl | 34 + src/tclkit86bi.vfs/lib/tk8.6/demos/entry2.tcl | 46 + src/tclkit86bi.vfs/lib/tk8.6/demos/entry3.tcl | 185 + .../lib/tk8.6/demos/filebox.tcl | 81 + src/tclkit86bi.vfs/lib/tk8.6/demos/floor.tcl | 1371 + .../lib/tk8.6/demos/fontchoose.tcl | 67 + src/tclkit86bi.vfs/lib/tk8.6/demos/form.tcl | 38 + .../lib/tk8.6/demos/goldberg.tcl | 1835 + src/tclkit86bi.vfs/lib/tk8.6/demos/hello | 22 + src/tclkit86bi.vfs/lib/tk8.6/demos/hscale.tcl | 45 + src/tclkit86bi.vfs/lib/tk8.6/demos/icon.tcl | 51 + src/tclkit86bi.vfs/lib/tk8.6/demos/image1.tcl | 35 + src/tclkit86bi.vfs/lib/tk8.6/demos/image2.tcl | 108 + .../lib/tk8.6/demos/images/earth.gif | Bin 0 -> 51559 bytes .../lib/tk8.6/demos/images/earthmenu.png | Bin 0 -> 8157 bytes .../lib/tk8.6/demos/images/earthris.gif | Bin 0 -> 6343 bytes .../lib/tk8.6/demos/images/flagdown.xbm | 27 + .../lib/tk8.6/demos/images/flagup.xbm | 27 + .../lib/tk8.6/demos/images/gray25.xbm | 6 + .../lib/tk8.6/demos/images/letters.xbm | 27 + .../lib/tk8.6/demos/images/noletter.xbm | 27 + .../lib/tk8.6/demos/images/ouster.png | Bin 0 -> 54257 bytes .../lib/tk8.6/demos/images/pattern.xbm | 6 + .../lib/tk8.6/demos/images/tcllogo.gif | Bin 0 -> 2341 bytes .../lib/tk8.6/demos/images/teapot.ppm | 31 + src/tclkit86bi.vfs/lib/tk8.6/demos/items.tcl | 302 + src/tclkit86bi.vfs/lib/tk8.6/demos/ixset | 328 + .../lib/tk8.6/demos/knightstour.tcl | 268 + src/tclkit86bi.vfs/lib/tk8.6/demos/label.tcl | 40 + .../lib/tk8.6/demos/labelframe.tcl | 76 + .../lib/tk8.6/demos/license.terms | 40 + src/tclkit86bi.vfs/lib/tk8.6/demos/mclist.tcl | 119 + src/tclkit86bi.vfs/lib/tk8.6/demos/menu.tcl | 177 + src/tclkit86bi.vfs/lib/tk8.6/demos/menubu.tcl | 87 + src/tclkit86bi.vfs/lib/tk8.6/demos/msgbox.tcl | 62 + src/tclkit86bi.vfs/lib/tk8.6/demos/nl.msg | 125 + src/tclkit86bi.vfs/lib/tk8.6/demos/paned1.tcl | 32 + src/tclkit86bi.vfs/lib/tk8.6/demos/paned2.tcl | 74 + .../lib/tk8.6/demos/pendulum.tcl | 197 + src/tclkit86bi.vfs/lib/tk8.6/demos/plot.tcl | 97 + src/tclkit86bi.vfs/lib/tk8.6/demos/puzzle.tcl | 82 + src/tclkit86bi.vfs/lib/tk8.6/demos/radio.tcl | 66 + src/tclkit86bi.vfs/lib/tk8.6/demos/rmt | 210 + src/tclkit86bi.vfs/lib/tk8.6/demos/rolodex | 204 + src/tclkit86bi.vfs/lib/tk8.6/demos/ruler.tcl | 175 + .../lib/tk8.6/demos/sayings.tcl | 44 + src/tclkit86bi.vfs/lib/tk8.6/demos/search.tcl | 139 + src/tclkit86bi.vfs/lib/tk8.6/demos/spin.tcl | 53 + src/tclkit86bi.vfs/lib/tk8.6/demos/states.tcl | 54 + src/tclkit86bi.vfs/lib/tk8.6/demos/style.tcl | 155 + src/tclkit86bi.vfs/lib/tk8.6/demos/tclIndex | 67 + src/tclkit86bi.vfs/lib/tk8.6/demos/tcolor | 358 + src/tclkit86bi.vfs/lib/tk8.6/demos/text.tcl | 113 + .../lib/tk8.6/demos/textpeer.tcl | 62 + src/tclkit86bi.vfs/lib/tk8.6/demos/timer | 47 + .../lib/tk8.6/demos/toolbar.tcl | 92 + src/tclkit86bi.vfs/lib/tk8.6/demos/tree.tcl | 89 + src/tclkit86bi.vfs/lib/tk8.6/demos/ttkbut.tcl | 84 + .../lib/tk8.6/demos/ttkmenu.tcl | 53 + .../lib/tk8.6/demos/ttknote.tcl | 57 + .../lib/tk8.6/demos/ttkpane.tcl | 112 + .../lib/tk8.6/demos/ttkprogress.tcl | 46 + .../lib/tk8.6/demos/ttkscale.tcl | 39 + src/tclkit86bi.vfs/lib/tk8.6/demos/twind.tcl | 351 + .../lib/tk8.6/demos/unicodeout.tcl | 145 + src/tclkit86bi.vfs/lib/tk8.6/demos/vscale.tcl | 46 + src/tclkit86bi.vfs/lib/tk8.6/demos/widget | 734 + src/tclkit86bi.vfs/lib/tk8.6/dialog.tcl | 175 + src/tclkit86bi.vfs/lib/tk8.6/entry.tcl | 687 + src/tclkit86bi.vfs/lib/tk8.6/focus.tcl | 178 + src/tclkit86bi.vfs/lib/tk8.6/fontchooser.tcl | 515 + src/tclkit86bi.vfs/lib/tk8.6/iconlist.tcl | 720 + src/tclkit86bi.vfs/lib/tk8.6/icons.tcl | 153 + src/tclkit86bi.vfs/lib/tk8.6/images/README | 7 + src/tclkit86bi.vfs/lib/tk8.6/images/logo.eps | 2091 + .../lib/tk8.6/images/logo100.gif | Bin 0 -> 2341 bytes .../lib/tk8.6/images/logo64.gif | Bin 0 -> 1670 bytes .../lib/tk8.6/images/logoLarge.gif | Bin 0 -> 11000 bytes .../lib/tk8.6/images/logoMed.gif | Bin 0 -> 3889 bytes .../lib/tk8.6/images/pwrdLogo.eps | 1897 + .../lib/tk8.6/images/pwrdLogo100.gif | Bin 0 -> 1615 bytes .../lib/tk8.6/images/pwrdLogo150.gif | Bin 0 -> 2489 bytes .../lib/tk8.6/images/pwrdLogo175.gif | Bin 0 -> 2981 bytes .../lib/tk8.6/images/pwrdLogo200.gif | Bin 0 -> 3491 bytes .../lib/tk8.6/images/pwrdLogo75.gif | Bin 0 -> 1171 bytes .../lib/tk8.6/images/tai-ku.gif | Bin 0 -> 5473 bytes src/tclkit86bi.vfs/lib/tk8.6/listbox.tcl | 560 + src/tclkit86bi.vfs/lib/tk8.6/megawidget.tcl | 297 + src/tclkit86bi.vfs/lib/tk8.6/menu.tcl | 1380 + src/tclkit86bi.vfs/lib/tk8.6/mkpsenc.tcl | 1488 + src/tclkit86bi.vfs/lib/tk8.6/msgbox.tcl | 427 + src/tclkit86bi.vfs/lib/tk8.6/msgs/cs.msg | 77 + src/tclkit86bi.vfs/lib/tk8.6/msgs/da.msg | 78 + src/tclkit86bi.vfs/lib/tk8.6/msgs/de.msg | 91 + src/tclkit86bi.vfs/lib/tk8.6/msgs/el.msg | 86 + src/tclkit86bi.vfs/lib/tk8.6/msgs/en.msg | 91 + src/tclkit86bi.vfs/lib/tk8.6/msgs/en_gb.msg | 3 + src/tclkit86bi.vfs/lib/tk8.6/msgs/eo.msg | 75 + src/tclkit86bi.vfs/lib/tk8.6/msgs/es.msg | 76 + src/tclkit86bi.vfs/lib/tk8.6/msgs/fi.msg | 89 + src/tclkit86bi.vfs/lib/tk8.6/msgs/fr.msg | 72 + src/tclkit86bi.vfs/lib/tk8.6/msgs/hu.msg | 78 + src/tclkit86bi.vfs/lib/tk8.6/msgs/it.msg | 73 + src/tclkit86bi.vfs/lib/tk8.6/msgs/nl.msg | 91 + src/tclkit86bi.vfs/lib/tk8.6/msgs/pl.msg | 91 + src/tclkit86bi.vfs/lib/tk8.6/msgs/pt.msg | 74 + src/tclkit86bi.vfs/lib/tk8.6/msgs/ru.msg | 93 + src/tclkit86bi.vfs/lib/tk8.6/msgs/sv.msg | 76 + src/tclkit86bi.vfs/lib/tk8.6/msgs/zh_cn.msg | 92 + src/tclkit86bi.vfs/lib/tk8.6/obsolete.tcl | 178 + src/tclkit86bi.vfs/lib/tk8.6/optMenu.tcl | 43 + src/tclkit86bi.vfs/lib/tk8.6/palette.tcl | 244 + src/tclkit86bi.vfs/lib/tk8.6/panedwindow.tcl | 194 + src/tclkit86bi.vfs/lib/tk8.6/pkgIndex.tcl | 7 + src/tclkit86bi.vfs/lib/tk8.6/safetk.tcl | 262 + src/tclkit86bi.vfs/lib/tk8.6/scale.tcl | 307 + src/tclkit86bi.vfs/lib/tk8.6/scrlbar.tcl | 456 + src/tclkit86bi.vfs/lib/tk8.6/spinbox.tcl | 594 + src/tclkit86bi.vfs/lib/tk8.6/tclIndex | 253 + src/tclkit86bi.vfs/lib/tk8.6/tearoff.tcl | 184 + src/tclkit86bi.vfs/lib/tk8.6/text.tcl | 1238 + src/tclkit86bi.vfs/lib/tk8.6/tk.tcl | 703 + src/tclkit86bi.vfs/lib/tk8.6/tkAppInit.c | 177 + src/tclkit86bi.vfs/lib/tk8.6/tkfbox.tcl | 1239 + src/tclkit86bi.vfs/lib/tk8.6/ttk/altTheme.tcl | 109 + .../lib/tk8.6/ttk/aquaTheme.tcl | 119 + src/tclkit86bi.vfs/lib/tk8.6/ttk/button.tcl | 83 + .../lib/tk8.6/ttk/clamTheme.tcl | 147 + .../lib/tk8.6/ttk/classicTheme.tcl | 115 + src/tclkit86bi.vfs/lib/tk8.6/ttk/combobox.tcl | 448 + src/tclkit86bi.vfs/lib/tk8.6/ttk/cursors.tcl | 205 + src/tclkit86bi.vfs/lib/tk8.6/ttk/defaults.tcl | 143 + src/tclkit86bi.vfs/lib/tk8.6/ttk/entry.tcl | 633 + src/tclkit86bi.vfs/lib/tk8.6/ttk/fonts.tcl | 157 + .../lib/tk8.6/ttk/menubutton.tcl | 234 + src/tclkit86bi.vfs/lib/tk8.6/ttk/notebook.tcl | 199 + .../lib/tk8.6/ttk/panedwindow.tcl | 91 + src/tclkit86bi.vfs/lib/tk8.6/ttk/progress.tcl | 49 + src/tclkit86bi.vfs/lib/tk8.6/ttk/scale.tcl | 94 + .../lib/tk8.6/ttk/scrollbar.tcl | 126 + src/tclkit86bi.vfs/lib/tk8.6/ttk/sizegrip.tcl | 102 + src/tclkit86bi.vfs/lib/tk8.6/ttk/spinbox.tcl | 192 + src/tclkit86bi.vfs/lib/tk8.6/ttk/treeview.tcl | 383 + src/tclkit86bi.vfs/lib/tk8.6/ttk/ttk.tcl | 176 + src/tclkit86bi.vfs/lib/tk8.6/ttk/utils.tcl | 337 + .../lib/tk8.6/ttk/vistaTheme.tcl | 229 + src/tclkit86bi.vfs/lib/tk8.6/ttk/winTheme.tcl | 84 + src/tclkit86bi.vfs/lib/tk8.6/ttk/xpTheme.tcl | 67 + src/tclkit86bi.vfs/lib/tk8.6/unsupported.tcl | 269 + src/tclkit86bi.vfs/lib/tk8.6/xmfbox.tcl | 989 + src/tclkit86bi.vfs/lib/udp1.0.11/pkgIndex.tcl | 2 + src/tclkit86bi.vfs/lib/udp1.0.11/udp1011.dll | Bin 0 -> 29184 bytes src/tclkit86bi.vfs/lib/vfs1.4.1/ftpvfs.tcl | 341 + src/tclkit86bi.vfs/lib/vfs1.4.1/httpvfs.tcl | 432 + src/tclkit86bi.vfs/lib/vfs1.4.1/mk4vfs.tcl | 624 + src/tclkit86bi.vfs/lib/vfs1.4.1/pkgIndex.tcl | 42 + src/tclkit86bi.vfs/lib/vfs1.4.1/starkit.tcl | 156 + src/tclkit86bi.vfs/lib/vfs1.4.1/tarvfs.tcl | 432 + .../lib/vfs1.4.1/tclprocvfs.tcl | 206 + .../lib/vfs1.4.1/template/chrootvfs.tcl | 127 + .../lib/vfs1.4.1/template/collatevfs.tcl | 371 + .../lib/vfs1.4.1/template/deltavfs.tcl | 288 + .../lib/vfs1.4.1/template/fishvfs.tcl | 535 + .../lib/vfs1.4.1/template/globfind.tcl | 516 + .../lib/vfs1.4.1/template/quotavfs.tcl | 559 + .../lib/vfs1.4.1/template/tclIndex | 15 + .../lib/vfs1.4.1/template/tdelta.tcl | 430 + .../lib/vfs1.4.1/template/templatevfs.tcl | 581 + .../lib/vfs1.4.1/template/versionvfs.tcl | 603 + src/tclkit86bi.vfs/lib/vfs1.4.1/testvfs.tcl | 87 + src/tclkit86bi.vfs/lib/vfs1.4.1/tkvfs.tcl | 214 + src/tclkit86bi.vfs/lib/vfs1.4.1/vfs.tcl | 36 + src/tclkit86bi.vfs/lib/vfs1.4.1/vfsUrl.tcl | 166 + src/tclkit86bi.vfs/lib/vfs1.4.1/vfsUtils.tcl | 442 + src/tclkit86bi.vfs/lib/vfs1.4.1/vfslib.tcl | 284 + src/tclkit86bi.vfs/lib/vfs1.4.1/webdavvfs.tcl | 285 + src/tclkit86bi.vfs/lib/vfs1.4.1/zipvfs.tcl | 925 + src/tclkit86bi.vfs/lib/vfs1.4.2/ftpvfs.tcl | 341 + src/tclkit86bi.vfs/lib/vfs1.4.2/httpvfs.tcl | 432 + src/tclkit86bi.vfs/lib/vfs1.4.2/mk4vfs.tcl | 624 + src/tclkit86bi.vfs/lib/vfs1.4.2/pkgIndex.tcl | 50 + src/tclkit86bi.vfs/lib/vfs1.4.2/starkit.tcl | 156 + src/tclkit86bi.vfs/lib/vfs1.4.2/tarvfs.tcl | 432 + .../lib/vfs1.4.2/tclprocvfs.tcl | 206 + .../lib/vfs1.4.2/template/chrootvfs.tcl | 127 + .../lib/vfs1.4.2/template/collatevfs.tcl | 372 + .../lib/vfs1.4.2/template/deltavfs.tcl | 288 + .../lib/vfs1.4.2/template/fishvfs.tcl | 535 + .../lib/vfs1.4.2/template/globfind.tcl | 516 + .../lib/vfs1.4.2/template/quotavfs.tcl | 559 + .../lib/vfs1.4.2/template/tclIndex | 15 + .../lib/vfs1.4.2/template/tdelta.tcl | 430 + .../lib/vfs1.4.2/template/templatevfs.tcl | 582 + .../lib/vfs1.4.2/template/versionvfs.tcl | 603 + src/tclkit86bi.vfs/lib/vfs1.4.2/testvfs.tcl | 87 + src/tclkit86bi.vfs/lib/vfs1.4.2/tkvfs.tcl | 214 + src/tclkit86bi.vfs/lib/vfs1.4.2/vfs.tcl | 36 + src/tclkit86bi.vfs/lib/vfs1.4.2/vfs142.dll | Bin 0 -> 27136 bytes src/tclkit86bi.vfs/lib/vfs1.4.2/vfsUrl.tcl | 166 + src/tclkit86bi.vfs/lib/vfs1.4.2/vfsUtils.tcl | 441 + src/tclkit86bi.vfs/lib/vfs1.4.2/vfslib.tcl | 284 + src/tclkit86bi.vfs/lib/vfs1.4.2/webdavvfs.tcl | 285 + src/tclkit86bi.vfs/lib/vfs1.4.2/zipvfs.tcl | 937 + src/tclkit86bi.vfs/lib/vqtcl4.1/m2mvfs.tcl | 236 + src/tclkit86bi.vfs/lib/vqtcl4.1/mkclvfs.tcl | 181 + src/tclkit86bi.vfs/lib/vqtcl4.1/mklite.tcl | 271 + src/tclkit86bi.vfs/lib/vqtcl4.1/pkgIndex.tcl | 10 + src/tclkit86bi.vfs/lib/vqtcl4.1/ratcl.tcl | 230 + src/tclkit86bi.vfs/tclkit.ico | Bin 0 -> 105518 bytes 1928 files changed, 663075 insertions(+) create mode 100644 .gitignore create mode 100644 callbacks/dispatch.tcl create mode 100644 callbacks/parameters.tcl create mode 100644 scriptlib/ansi_count_per_second.tcl create mode 100644 scriptlib/showargs.tcl create mode 100644 scriptlib/stdout_per_second.tcl create mode 100644 src/make_punk86.tcl create mode 100644 src/modules/#tarjar-tarjar-2.3/#tarjar-loadscript-tarjar.tcl create mode 100644 src/modules/#tarjar-tarjar-2.3/#z create mode 100644 src/modules/#tarjar-tarjar-2.3/CHANGES create mode 100644 src/modules/#tarjar-tarjar-2.3/DESCRIPTION.txt create mode 100644 src/modules/#tarjar-tarjar-2.3/README.tarjar.txt create mode 100644 src/modules/#tarjar-tarjar-2.3/codesnippets/basic_loader.txt create mode 100644 src/modules/#tarjar-tarjar-2.3/codesnippets/full_loader.txt create mode 100644 src/modules/#tarjar-tarjar-2.3/template/README.tarjar.txt create mode 100644 src/modules/#tarjar-tarjar-2.3/todo.txt create mode 100644 src/modules/argp-0.2.tm create mode 100644 src/modules/flagfilter-0.3.tm create mode 100644 src/modules/overtype-1.3.tm create mode 100644 src/modules/platform-1.0.17.tm create mode 100644 src/modules/platform/shell-1.1.4.tm create mode 100644 src/modules/shellfilter-0.1.8.tm create mode 100644 src/modules/shellthread-1.6.tm create mode 100644 src/modules/tarjar-2.3.tm create mode 100644 src/punk86.vfs/lib/app-punk/pkgIndex.tcl create mode 100644 src/punk86.vfs/lib/app-punk/repl.tcl create mode 100644 src/punk86.vfs/lib/app-shellspy/pkgIndex.tcl create mode 100644 src/punk86.vfs/lib/app-shellspy/shellspy.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/LICENSE create mode 100644 src/punk86.vfs/lib/twapi4.7.2/account.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/adsi.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/apputil.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/base.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/clipboard.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/com.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/console.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/crypto.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/device.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/etw.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/eventlog.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/evt.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/handle.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/input.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/metoo.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/msi.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/mstask.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/multimedia.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/namedpipe.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/network.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/nls.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/os.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/pdh.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/pkgIndex.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/power.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/printer.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/process.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/rds.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/registry.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/resource.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/security.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/service.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/share.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/shell.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/sspi.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/storage.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/synch.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/tls.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/twapi.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/twapi472.dll create mode 100644 src/punk86.vfs/lib/twapi4.7.2/twapi_entry.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/ui.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/win.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/winlog.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/winsta.tcl create mode 100644 src/punk86.vfs/lib/twapi4.7.2/wmi.tcl create mode 100644 src/punk86.vfs/main.tcl create mode 100644 src/tclkit86bi.vfs/bin/tk86.dll create mode 100644 src/tclkit86bi.vfs/boot.tcl create mode 100644 src/tclkit86bi.vfs/lib/Ffidl0.9.0/Ffidl090.dll create mode 100644 src/tclkit86bi.vfs/lib/Ffidl0.9.0/ffidlrt.tcl create mode 100644 src/tclkit86bi.vfs/lib/Ffidl0.9.0/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/Memchan2.3/Memchan23.dll create mode 100644 src/tclkit86bi.vfs/lib/Memchan2.3/libMemchanstub23.a create mode 100644 src/tclkit86bi.vfs/lib/Memchan2.3/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/Trf2.1.4/Trf214.dll create mode 100644 src/tclkit86bi.vfs/lib/Trf2.1.4/libTrfstub214.a create mode 100644 src/tclkit86bi.vfs/lib/Trf2.1.4/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/cffi1.2.0/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/cffi1.2.0/win32-x86_64/tclcffi120.dll create mode 100644 src/tclkit86bi.vfs/lib/critcl-app3.2/critcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-app3.2/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-app3.2/runtime.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-app3.2/tea/Config.in create mode 100644 src/tclkit86bi.vfs/lib/critcl-app3.2/tea/Makefile.in create mode 100644 src/tclkit86bi.vfs/lib/critcl-app3.2/tea/aclocal.m4 create mode 100644 src/tclkit86bi.vfs/lib/critcl-app3.2/tea/configure.in create mode 100644 src/tclkit86bi.vfs/lib/critcl-app3.2/tea/tclconfig/README.txt create mode 100644 src/tclkit86bi.vfs/lib/critcl-app3.2/tea/tclconfig/install-sh create mode 100644 src/tclkit86bi.vfs/lib/critcl-app3.2/tea/tclconfig/tcl.m4 create mode 100644 src/tclkit86bi.vfs/lib/critcl-bitmap1.1/bitmap.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-bitmap1.1/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-class1.2/class.h create mode 100644 src/tclkit86bi.vfs/lib/critcl-class1.2/class.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-class1.2/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-cutil0.3/allocs/critcl_alloc.h create mode 100644 src/tclkit86bi.vfs/lib/critcl-cutil0.3/asserts/critcl_assert.h create mode 100644 src/tclkit86bi.vfs/lib/critcl-cutil0.3/cutil.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-cutil0.3/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-cutil0.3/trace/critcl_trace.h create mode 100644 src/tclkit86bi.vfs/lib/critcl-cutil0.3/trace/trace.c create mode 100644 src/tclkit86bi.vfs/lib/critcl-emap1.3/emap.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-emap1.3/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-enum1.2/enum.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-enum1.2/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-iassoc1.2/iassoc.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-iassoc1.2/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-literals1.4/literals.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-literals1.4/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-platform1.1/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-platform1.1/platform.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-util1.2/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl-util1.2/util.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/Config create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/cdata.c create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/header.c create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/pkginit.c create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/pkginitend.c create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/pkginittk.c create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/preload.c create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/storageclass.c create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/stubs.c create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/stubs_e.c create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/X.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xatom.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xfuncproto.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xlib.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xutil.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/cursorfont.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/keysym.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/keysymdef.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/tkIntXlibDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tcl.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tclDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tclPlatDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tk.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tkDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tkPlatDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/X.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xatom.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xfuncproto.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xlib.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xutil.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/cursorfont.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/keysym.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/keysymdef.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/tkIntXlibDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tcl.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tclDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tclPlatDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tk.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tkDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tkPlatDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/X.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xatom.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xfuncproto.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xlib.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xutil.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/cursorfont.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/keysym.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/keysymdef.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/tkIntXlibDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tcl.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tclDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tclPlatDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tk.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tkDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tkPlatDecls.h create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tclAppInit.c create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tkstubs.c create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tkstubs_noconst.c create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/license.terms create mode 100644 src/tclkit86bi.vfs/lib/critcl3.2/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl_callback1.1/critcl-rt.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl_callback1.1/license.terms create mode 100644 src/tclkit86bi.vfs/lib/critcl_callback1.1/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl_callback1.1/teapot.txt create mode 100644 src/tclkit86bi.vfs/lib/critcl_callback1.1/win32-x86_64/callback.dll create mode 100644 src/tclkit86bi.vfs/lib/critcl_md5c0.12/critcl-rt.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl_md5c0.12/license.terms create mode 100644 src/tclkit86bi.vfs/lib/critcl_md5c0.12/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/critcl_md5c0.12/teapot.txt create mode 100644 src/tclkit86bi.vfs/lib/critcl_md5c0.12/win32-x86_64/md5c.dll create mode 100644 src/tclkit86bi.vfs/lib/dde1.4/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/dde1.4/tcldde14.dll create mode 100644 src/tclkit86bi.vfs/lib/iocp1.1.0/amd64/iocp110.dll create mode 100644 src/tclkit86bi.vfs/lib/iocp1.1.0/bt.tcl create mode 100644 src/tclkit86bi.vfs/lib/iocp1.1.0/btnames.tcl create mode 100644 src/tclkit86bi.vfs/lib/iocp1.1.0/btsdr.tcl create mode 100644 src/tclkit86bi.vfs/lib/iocp1.1.0/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/reg1.3/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/reg1.3/tclreg13.dll create mode 100644 src/tclkit86bi.vfs/lib/sqlite3.40.0/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/sqlite3.40.0/sqlite3400.dll create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/auto.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/clock.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/ascii.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/big5.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cns11643.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1250.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1251.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1252.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1253.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1254.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1255.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1256.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1257.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1258.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp437.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp737.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp775.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp850.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp852.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp855.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp857.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp860.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp861.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp862.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp863.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp864.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp865.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp866.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp869.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp874.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp932.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp936.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp949.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp950.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/dingbats.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/ebcdic.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/euc-cn.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/euc-jp.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/euc-kr.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb12345.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb1988.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb2312-raw.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb2312.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso2022-jp.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso2022-kr.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso2022.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-1.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-10.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-11.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-13.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-14.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-15.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-16.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-2.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-3.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-4.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-5.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-6.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-7.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-8.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-9.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/jis0201.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/jis0208.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/jis0212.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/koi8-r.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/koi8-u.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/ksc5601.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/macCentEuro.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/macCroatian.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/macCyrillic.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/macDingbats.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/macGreek.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/macIceland.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/macJapan.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/macRoman.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/macRomania.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/macThai.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/macTurkish.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/macUkraine.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/shiftjis.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/symbol.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/encoding/tis-620.enc create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/history.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/http1.0/http.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/http1.0/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/init.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/af.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/af_za.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_in.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_jo.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_lb.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_sy.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/be.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/bg.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/bn.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/bn_in.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ca.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/cs.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/da.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/de.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/de_at.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/de_be.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/el.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_au.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_be.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_bw.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ca.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_gb.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_hk.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ie.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_in.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_nz.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ph.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_sg.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_za.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_zw.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/eo.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ar.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_bo.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_cl.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_co.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_cr.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_do.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ec.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_gt.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_hn.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_mx.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ni.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pa.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pe.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pr.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_py.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_sv.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_uy.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ve.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/et.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/eu.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/eu_es.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa_in.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa_ir.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/fi.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/fo.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/fo_fo.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_be.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_ca.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_ch.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ga.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ga_ie.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/gl.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/gl_es.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/gv.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/gv_gb.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/he.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/hi.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/hi_in.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/hr.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/hu.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/id.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/id_id.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/is.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/it.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/it_ch.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ja.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/kl.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/kl_gl.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ko.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ko_kr.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/kok.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/kok_in.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/kw.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/kw_gb.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/lt.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/lv.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/mk.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/mr.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/mr_in.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ms.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ms_my.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/mt.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/nb.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/nl.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/nl_be.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/nn.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/pl.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/pt.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/pt_br.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ro.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ru.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ru_ua.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/sh.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/sk.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/sl.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/sq.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/sr.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/sv.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/sw.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ta.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/ta_in.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/te.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/te_in.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/th.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/tr.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/uk.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/vi.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_cn.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_hk.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_sg.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_tw.msg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/opt0.4/optparse.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/opt0.4/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/package.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/parray.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/safe.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tclIndex create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tm.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Abidjan create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Algiers create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Bamako create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Bangui create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Banjul create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Bissau create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Blantyre create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Brazzaville create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Cairo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Conakry create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Dakar create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Dar_es_Salaam create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Djibouti create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/El_Aaiun create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Freetown create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Gaborone create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Harare create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Johannesburg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Khartoum create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Kigali create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Lagos create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Libreville create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Lome create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Lubumbashi create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Malabo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Maputo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Maseru create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Mbabane create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Mogadishu create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Nairobi create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Niamey create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Nouakchott create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Ouagadougou create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Porto-Novo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Sao_Tome create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Timbuktu create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Tripoli create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Tunis create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Windhoek create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Adak create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Anchorage create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Buenos_Aires create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Jujuy create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Rio_Gallegos create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/San_Juan create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/San_Luis create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Tucuman create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Asuncion create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Atikokan create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Bahia_Banderas create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Barbados create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Belem create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Belize create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Blanc-Sablon create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Boise create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Buenos_Aires create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cambridge_Bay create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Campo_Grande create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cancun create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Caracas create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cayenne create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cayman create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Chicago create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Coral_Harbour create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Creston create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Curacao create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Danmarkshavn create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Dawson create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Dawson_Creek create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Denver create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Detroit create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Edmonton create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Eirunepe create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/El_Salvador create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Fort_Nelson create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Fort_Wayne create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Glace_Bay create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Godthab create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Goose_Bay create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Grand_Turk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Guadeloupe create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Guayaquil create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Halifax create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Hermosillo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Indianapolis create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Knox create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Marengo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Petersburg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Tell_City create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Vevay create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Vincennes create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Winamac create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indianapolis create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Inuvik create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Iqaluit create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Jujuy create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Juneau create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Kentucky/Louisville create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Kentucky/Monticello create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Knox_IN create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Kralendijk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/La_Paz create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Los_Angeles create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Louisville create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Lower_Princes create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Maceio create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Manaus create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Marigot create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Martinique create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Matamoros create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Mazatlan create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Menominee create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Mexico_City create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Miquelon create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Moncton create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Monterrey create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Montevideo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Montreal create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Montserrat create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nassau create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/New_York create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nipigon create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nome create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/North_Dakota/Beulah create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/North_Dakota/Center create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/North_Dakota/New_Salem create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nuuk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Pangnirtung create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Paramaribo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Phoenix create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Port-au-Prince create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Port_of_Spain create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Porto_Acre create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Porto_Velho create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Puerto_Rico create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Punta_Arenas create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rainy_River create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rankin_Inlet create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Recife create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Resolute create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rio_Branco create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rosario create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santa_Isabel create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santarem create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santiago create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santo_Domingo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Sao_Paulo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Scoresbysund create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Shiprock create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Barthelemy create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Johns create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Kitts create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Thomas create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Vincent create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Swift_Current create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Thule create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Thunder_Bay create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Toronto create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Vancouver create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Virgin create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Whitehorse create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Winnipeg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Yakutat create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Yellowknife create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Casey create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Davis create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/DumontDUrville create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Macquarie create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Mawson create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/McMurdo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Palmer create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/South_Pole create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Troll create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Vostok create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Arctic/Longyearbyen create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Aden create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Almaty create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Amman create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Anadyr create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Aqtau create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Aqtobe create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ashgabat create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ashkhabad create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Atyrau create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Baghdad create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Bahrain create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Baku create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Bangkok create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Barnaul create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Beirut create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Bishkek create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Brunei create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Choibalsan create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Chongqing create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Chungking create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Colombo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Damascus create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Dili create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Dubai create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Dushanbe create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Harbin create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Hebron create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ho_Chi_Minh create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Hong_Kong create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Hovd create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Irkutsk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Istanbul create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Jerusalem create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kabul create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Karachi create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kashgar create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kathmandu create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Katmandu create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Krasnoyarsk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kuala_Lumpur create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kuching create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kuwait create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Macao create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Macau create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Magadan create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Makassar create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Muscat create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Novokuznetsk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Novosibirsk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Omsk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Oral create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Phnom_Penh create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Pontianak create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Pyongyang create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Qatar create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Qostanay create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Rangoon create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Riyadh create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Saigon create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Sakhalin create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Samarkand create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Seoul create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Shanghai create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Singapore create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Srednekolymsk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Taipei create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tashkent create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tbilisi create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tehran create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tel_Aviv create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Thimbu create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Thimphu create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tokyo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tomsk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ujung_Pandang create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ulaanbaatar create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ulan_Bator create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Urumqi create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Vientiane create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Vladivostok create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yakutsk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yangon create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yekaterinburg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yerevan create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Azores create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Canary create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Cape_Verde create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Faeroe create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Faroe create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Jan_Mayen create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Reykjavik create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Stanley create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/ACT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Adelaide create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Brisbane create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Broken_Hill create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Currie create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Darwin create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Hobart create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/LHI create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Lindeman create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Lord_Howe create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Melbourne create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/NSW create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/North create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Perth create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Queensland create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/South create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Sydney create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/West create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Brazil/Acre create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Brazil/East create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Brazil/West create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/CET create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/CST6CDT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Atlantic create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Central create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Eastern create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Mountain create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Newfoundland create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Pacific create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Saskatchewan create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Yukon create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Chile/Continental create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Chile/EasterIsland create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EET create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EST create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EST5EDT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Egypt create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Eire create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+0 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+1 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+10 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+11 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+12 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+2 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+3 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+4 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+5 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+6 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+7 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+8 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+9 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-0 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-1 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-10 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-11 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-12 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-13 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-14 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-2 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-3 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-4 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-5 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-6 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-7 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-8 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-9 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT0 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Greenwich create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/UCT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/UTC create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Universal create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Zulu create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Amsterdam create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Astrakhan create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Athens create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Belfast create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Belgrade create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Berlin create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Brussels create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Bucharest create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Budapest create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Busingen create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Chisinau create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Copenhagen create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Dublin create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Gibraltar create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Guernsey create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Helsinki create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Isle_of_Man create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Istanbul create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Jersey create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kaliningrad create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kiev create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kirov create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kyiv create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Lisbon create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/London create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Luxembourg create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Madrid create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Mariehamn create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Minsk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Monaco create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Moscow create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Oslo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Paris create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Prague create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Rome create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/San_Marino create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Sarajevo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Saratov create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Simferopol create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Skopje create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Stockholm create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Tallinn create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Tirane create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Tiraspol create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Ulyanovsk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Uzhgorod create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Vaduz create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Vatican create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Vilnius create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Volgograd create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Warsaw create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Zagreb create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Zaporozhye create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Zurich create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GB create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GB-Eire create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT+0 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT-0 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT0 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Greenwich create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/HST create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Hongkong create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Iceland create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Antananarivo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Chagos create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Christmas create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Cocos create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Comoro create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Kerguelen create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Mahe create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Maldives create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Mauritius create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Mayotte create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Reunion create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Iran create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Israel create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Japan create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Kwajalein create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MET create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MST create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MST7MDT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Mexico/BajaNorte create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Mexico/BajaSur create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Mexico/General create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/NZ create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/NZ-CHAT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Navajo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/PRC create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/PST8PDT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Auckland create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Bougainville create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Chatham create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Chuuk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Easter create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Efate create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Enderbury create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Fakaofo create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Fiji create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Funafuti create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Galapagos create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Gambier create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Guadalcanal create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Guam create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Honolulu create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Johnston create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kanton create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kiritimati create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kosrae create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kwajalein create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Majuro create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Marquesas create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Midway create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Nauru create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Niue create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Norfolk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Pago_Pago create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Palau create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Pitcairn create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Pohnpei create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Ponape create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Port_Moresby create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Saipan create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Tahiti create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Tongatapu create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Truk create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Wake create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Wallis create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Yap create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Poland create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Portugal create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/ROC create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/ROK create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Singapore create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/AST4 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/AST4ADT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/CST6 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/CST6CDT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/EST5 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/EST5EDT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/HST10 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/MST7 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/MST7MDT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/PST8 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/PST8PDT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/YST9 create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/YST9YDT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Turkey create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/UCT create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Aleutian create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Central create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Eastern create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Hawaii create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Indiana-Starke create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Michigan create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Mountain create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Pacific create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/UTC create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Universal create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/W-SU create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/WET create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Zulu create mode 100644 src/tclkit86bi.vfs/lib/tcl8.6/word.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcl8/8.4/platform-1.0.19.tm create mode 100644 src/tclkit86bi.vfs/lib/tcl8/8.4/platform/shell-1.1.4.tm create mode 100644 src/tclkit86bi.vfs/lib/tcl8/8.5/msgcat-1.6.1.tm create mode 100644 src/tclkit86bi.vfs/lib/tcl8/8.5/tcltest-2.5.5.tm create mode 100644 src/tclkit86bi.vfs/lib/tcl8/8.6/http-2.9.8.tm create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/0compatibility/d_config.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/0compatibility/d_paths.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/0compatibility/p_config.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/0compatibility/p_paths.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/0compatibility/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/aes/aes.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/aes/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/amazon-s3/S3.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/amazon-s3/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/amazon-s3/xsxp.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/asn/asn.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/asn/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base32/base32.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base32/base32_c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base32/base32_tcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base32/base32core.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base32/base32hex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base32/base32hex_c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base32/base32hex_tcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base32/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base64/ascii85.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base64/base64.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base64/base64c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base64/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base64/uuencode.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/base64/yencode.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/bee/bee.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/bee/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench_read.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench_wcsv.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench_wtext.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/bench/libbench.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/bench/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/bibtex/bibtex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/bibtex/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/blowfish/blowfish.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/blowfish/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/cache/async.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/cache/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/clay/clay.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/clay/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/clock/iso8601.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/clock/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/clock/rfc2822.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/cmdline/cmdline.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/cmdline/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/comm/comm.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/comm/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/control/ascaller.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/control/assert.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/control/control.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/control/do.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/control/no-op.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/control/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/control/tclIndex create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/coroutine/coro_auto.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/coroutine/coroutine.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/coroutine/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/counter/counter.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/counter/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/crc/cksum.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/crc/crc16.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/crc/crc32.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/crc/crcc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/crc/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/crc/sum.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/cron/cron.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/cron/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/csv/csv.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/csv/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/debug/caller.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/debug/debug.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/debug/heartbeat.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/debug/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/debug/timestamp.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/defer/defer.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/defer/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/des/des.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/des/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/des/tcldes.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/des/tcldesjr.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/dicttool/dicttool.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/dicttool/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/dns/dns.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/dns/ip.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/dns/ipMore.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/dns/ipMoreC.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/dns/msgs/en.msg create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/dns/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/dns/resolv.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/dns/spf.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/docstrip/docstrip.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/docstrip/docstrip_util.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/docstrip/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/api.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/api_idx.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/api_toc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/changelog.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/checker.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/checker_idx.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/checker_toc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/cvs.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/docidx.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/doctoc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/doctools.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_common.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_html.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_idx_common.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_markdown.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_nroff.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_text.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_text_bullets.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_text_ccore.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_text_cstack.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_text_dlist.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_text_margin.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_text_para.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_text_state.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_text_utils.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_toc_common.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_xml.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/_xref.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/c.msg create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/de.msg create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/en.msg create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/fmt.desc create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/fmt.html create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/fmt.latex create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/fmt.list create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/fmt.markdown create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/fmt.nroff create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/fmt.null create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/fmt.text create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/fmt.tmml create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/fmt.wiki create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/fr.msg create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/idx.html create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/idx.markdown create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/idx.nroff create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/idx.null create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/idx.text create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/idx.wiki create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/man.macros create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/toc.html create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/toc.markdown create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/toc.nroff create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/toc.null create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/toc.text create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/toc.tmml create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/mpformats/toc.wiki create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2base/html.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2base/html_cssdefaults.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2base/msgcat.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2base/nroff_manmacros.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2base/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2base/tcl_parse.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2base/text.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/container.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/export.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/export_docidx.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/export_html.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/export_json.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/export_nroff.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/export_text.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/export_wiki.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/import.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/import_docidx.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/import_json.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/msgcat_c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/msgcat_de.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/msgcat_en.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/msgcat_fr.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/parse.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2idx/structure.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/container.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/export.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/export_doctoc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/export_html.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/export_json.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/export_nroff.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/export_text.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/export_wiki.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/import.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/import_doctoc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/import_json.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/msgcat_c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/msgcat_de.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/msgcat_en.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/msgcat_fr.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/parse.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/doctools2toc/structure.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/dtplite/dtplite.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/dtplite/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/fileutil/decode.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/fileutil/fileutil.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/fileutil/multi.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/fileutil/multiop.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/fileutil/paths.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/fileutil/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/fileutil/traverse.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ftp/ftp.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ftp/ftp_geturl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ftp/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ftpd/ftpd.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ftpd/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/fumagic/cfront.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/fumagic/cgen.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/fumagic/filetypes.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/fumagic/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/fumagic/rtcore.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/generator/generator.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/generator/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/gpx/gpx.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/gpx/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_aycock/aycock-build.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_aycock/aycock-debug.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_aycock/aycock-runtime.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_aycock/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_fa/dacceptor.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_fa/dexec.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_fa/fa.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_fa/faop.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_fa/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_me/gasm.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_me/me_cpu.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_me/me_cpucore.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_me/me_tcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_me/me_util.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_me/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_peg/peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_peg/peg_interp.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/grammar_peg/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/hook/hook.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/hook/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/html/html.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/html/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/htmlparse/htmlparse.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/htmlparse/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/http/autoproxy.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/http/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/httpd/httpd.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/httpd/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/httpwget/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/httpwget/wget.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ident/ident.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ident/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/imap4/imap4.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/imap4/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/inifile/ini.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/inifile/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/interp/deleg_method.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/interp/deleg_proc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/interp/interp.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/interp/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/irc/irc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/irc/picoirc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/irc/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/javascript/javascript.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/javascript/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/jpeg/jpeg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/jpeg/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/json/json.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/json/json_tcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/json/json_write.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/json/jsonc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/json/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/lambda/lambda.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/lambda/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/lazyset/lazyset.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/lazyset/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ldap/ldap.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ldap/ldapx.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ldap/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/log/log.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/log/logger.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/log/loggerAppender.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/log/loggerUtils.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/log/msgs/en.msg create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/log/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/map/map_geocode_nominatim.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/map/map_slippy.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/map/map_slippy_cache.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/map/map_slippy_fetcher.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/map/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/mapproj/mapproj.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/mapproj/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/markdown/markdown.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/markdown/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/bessel.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/bigfloat.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/bigfloat2.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/bignum.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/calculus.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/changepoint.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/classic_polyns.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/combinatorics.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/combinatoricsExt.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/constants.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/decimal.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/elliptic.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/exact.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/exponential.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/figurate.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/filtergen.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/fourier.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/fuzzy.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/geometry.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/geometry_circle.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/geometry_ext.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/interpolate.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/kruskal.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/linalg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/liststat.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/machineparameters.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/math.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/misc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/mvlinreg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/numtheory.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/optimize.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/pca.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/pdf_stat.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/plotstat.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/polynomials.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/primes.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/probopt.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/probopt_diffev.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/probopt_lipo.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/probopt_pso.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/probopt_sce.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/qcomplex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/quasirandom.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/rational_funcs.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/romannumerals.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/special.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/stat_kernel.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/stat_logit.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/stat_wasserstein.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/statistics.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/symdiff.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/tclIndex create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/trig.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/math/wilcoxon.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/md4/md4.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/md4/md4c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/md4/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/md5/md5.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/md5/md5c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/md5/md5x.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/md5/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/md5crypt/md5crypt.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/md5crypt/md5cryptc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/md5crypt/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/mime/mime.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/mime/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/mime/smtp.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/mkdoc/mkdoc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/mkdoc/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/multiplexer/multiplexer.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/multiplexer/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/namespacex/namespacex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/namespacex/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ncgi/ncgi.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ncgi/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/nettool/nettool.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/nettool/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/nmea/nmea.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/nmea/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/nns/common.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/nns/nns.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/nns/nns_auto.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/nns/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/nns/server.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/nntp/nntp.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/nntp/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ntp/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ntp/time.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/oauth/oauth.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/oauth/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/oodialect/oodialect.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/oodialect/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/oometa/oometa.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/oometa/oooption.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/oometa/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ooutil/ooutil.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ooutil/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/otp/otp.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/otp/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/analysis_peg_emodes.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/analysis_peg_minimize.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/analysis_peg_reachable.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/analysis_peg_realizable.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/compiler_peg_mecpu.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/gen_peg_canon.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/gen_peg_cpkg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/gen_peg_hb.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/gen_peg_me.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/gen_peg_me.template create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/gen_peg_mecpu.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/gen_peg_mecpu.template create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/gen_peg_ser.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/gen_tree_text.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/parse_lemon.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/parse_peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/parse_peghb.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/parse_pegser.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/peg_grammar.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/pluginmgr.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/config_peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/reader_hb.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/reader_lemon.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/reader_peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/reader_ser.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/reader_treeser.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/transform_mecpu.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/transform_reachable.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/transform_realizable.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/writer_hb.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/writer_identity.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/writer_me.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/writer_mecpu.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/writer_null.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/writer_peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/writer_ser.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/writer_tpc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/plugins/writer_tree.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/util_flow.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/util_norm_lemon.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/util_norm_peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/util_peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/page/util_quote.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pki/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pki/pki.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pluginmgr/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pluginmgr/pluginmgr.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/png/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/png/png.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pop3/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pop3/pop3.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pop3d/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pop3d/pop3d.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pop3d/pop3d_dbox.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pop3d/pop3d_udb.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/practcl/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/practcl/practcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/processman/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/processman/processman.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/profiler/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/profiler/profiler.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/char.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_astree.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_cparam_config_critcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_cparam_config_tea.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_parse_peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_parse_peg_c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_parse_peg_tcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_container.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_container_peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_export.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_export_container.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_export_json.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_export_peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_from_json.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_from_peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_import.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_import_json.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_import_peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_interp.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_op.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_to_container.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_to_cparam.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_to_json.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_to_param.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_to_peg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_peg_to_tclparam.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_pegrammar.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_pexpr_op.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_pexpression.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_pgen.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_rdengine.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_rdengine_c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_rdengine_nx.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_rdengine_oo.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_rdengine_tcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_tclparam_config_nx.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_tclparam_config_snit.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_tclparam_config_tcloo.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/pt_util.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/m.c create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/m.h create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/ms.c create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/ms.h create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/ot.c create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/ot.h create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/p.c create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/p.h create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/pInt.h create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/param.c create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/param.h create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/stack.c create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/stack.h create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/tc.c create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/tc.h create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/util.c create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/rde_critcl/util.h create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/pt/text_write.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/rc4/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/rc4/rc4.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/rc4/rc4c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/rcs/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/rcs/rcs.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/report/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/report/report.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/rest/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/rest/rest.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ripemd/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ripemd/ripemd128.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/ripemd/ripemd160.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sasl/gtoken.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sasl/ntlm.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sasl/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sasl/sasl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sasl/scram.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sha1/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sha1/sha1.c create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sha1/sha1.h create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sha1/sha1.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sha1/sha1c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sha1/sha1v1.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sha1/sha256.c create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sha1/sha256.h create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sha1/sha256.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/sha1/sha256c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/simulation/annealing.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/simulation/montecarlo.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/simulation/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/simulation/random.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/smtpd/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/smtpd/smtpd.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/snit/main1.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/snit/main1_83.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/snit/main2.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/snit/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/snit/snit.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/snit/snit2.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/snit/snit_tcl83_utils.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/snit/validate.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/soundex/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/soundex/soundex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/stooop/mkpkgidx.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/stooop/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/stooop/stooop.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/stooop/switched.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/stooop/xifo.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/string/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/string/token.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/string/token_shell.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/stringprep/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/stringprep/stringprep.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/stringprep/stringprep_data.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/stringprep/unicode.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/stringprep/unicode_data.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/disjointset.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/graph.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/graph1.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/graph_c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/graph_tcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/graphops.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/list.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/list.test.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/map.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/matrix.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/matrix1.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/pool.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/prioqueue.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/queue.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/queue_c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/queue_oo.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/queue_tcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/record.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/sets.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/sets_c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/sets_tcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/skiplist.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/stack.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/stack_c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/stack_oo.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/stack_tcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/struct.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/struct1.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/tree.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/tree1.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/tree_c.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/struct/tree_tcl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tar/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tar/tar.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tepam/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tepam/tepam.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tepam/tepam_doc_gen.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/ansi/code.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/ansi/code/attr.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/ansi/code/ctrl.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/ansi/code/macros.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/ansi/ctrlunix.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/ansi/send.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/bind.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/imenu.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/ipager.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/receive.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/send.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/term/term.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/adjust.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/dehypht.tex create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/eshyph_vo.tex create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/expander.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/ithyph.tex create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/patch.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/repeat.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/split.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/string.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/tabify.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/textutil.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/trim.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/textutil/wcswidth.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tie/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tie/tie.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tie/tie_array.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tie/tie_dsource.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tie/tie_file.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tie/tie_growfile.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tie/tie_log.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tie/tie_rarray.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tiff/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tiff/tiff.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tool/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/tool/tool.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/transfer/connect.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/transfer/copyops.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/transfer/ddest.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/transfer/dsource.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/transfer/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/transfer/receiver.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/transfer/tqueue.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/transfer/transmitter.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/treeql/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/treeql/treeql.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/treeql/treeql84.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/treeql/treeql85.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/try/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/try/throw.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/try/try.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/udpcluster/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/udpcluster/udpcluster.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/uev/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/uev/uevent.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/uev/uevent_onidle.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/units/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/units/units.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/uri/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/uri/uri.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/uri/urn-scheme.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/uuid/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/uuid/uuid.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/cc_amex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/cc_discover.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/cc_mastercard.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/cc_visa.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/ean13.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/iban.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/imei.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/isbn.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/luhn.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/luhn5.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/usnpi.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/valtype.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/valtype/verhoeff.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/cat.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/facade.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/fifo.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/fifo2.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/halfpipe.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/memchan.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/null.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/nullzero.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/random.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/randseed.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/std.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/string.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/textwindow.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/variable.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_base/zero.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_core/core.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_core/events.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_core/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_core/transformcore.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/adler32.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/base64.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/counter.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/crc32.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/hex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/identity.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/limitsize.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/observe.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/otp.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/rot.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/spacer.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/virtchannel_transform/zlib.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/websocket/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/websocket/websocket.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/wip/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/wip/wip.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/wip/wip2.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/yaml/huddle.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/yaml/huddle_types.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/yaml/json2huddle.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/yaml/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/yaml/yaml.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/zip/decode.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/zip/encode.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/zip/mkzip.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllib1.21/zip/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllibc/critcl-rt.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllibc/license.terms create mode 100644 src/tclkit86bi.vfs/lib/tcllibc/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcllibc/teapot.txt create mode 100644 src/tclkit86bi.vfs/lib/tcllibc/win32-x86_64/tcllibc.dll create mode 100644 src/tclkit86bi.vfs/lib/tcltls1.7.22/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tcltls1.7.22/tcltls.dll create mode 100644 src/tclkit86bi.vfs/lib/tcltls1.7.22/tls.tcl create mode 100644 src/tclkit86bi.vfs/lib/tdbc1.1.5/libtdbcstub115.a create mode 100644 src/tclkit86bi.vfs/lib/tdbc1.1.5/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tdbc1.1.5/tdbc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tdbc1.1.5/tdbc115.dll create mode 100644 src/tclkit86bi.vfs/lib/tdbc1.1.5/tdbcConfig.sh create mode 100644 src/tclkit86bi.vfs/lib/tdbcmysql1.1.5/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tdbcmysql1.1.5/tdbcmysql.tcl create mode 100644 src/tclkit86bi.vfs/lib/tdbcmysql1.1.5/tdbcmysql115.dll create mode 100644 src/tclkit86bi.vfs/lib/tdbcodbc1.1.5/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tdbcodbc1.1.5/tdbcodbc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tdbcodbc1.1.5/tdbcodbc115.dll create mode 100644 src/tclkit86bi.vfs/lib/tdbcpostgres1.1.5/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tdbcpostgres1.1.5/tdbcpostgres.tcl create mode 100644 src/tclkit86bi.vfs/lib/tdbcpostgres1.1.5/tdbcpostgres115.dll create mode 100644 src/tclkit86bi.vfs/lib/tdom0.9.3/libtdomstub093.a create mode 100644 src/tclkit86bi.vfs/lib/tdom0.9.3/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tdom0.9.3/tdom.tcl create mode 100644 src/tclkit86bi.vfs/lib/tdom0.9.3/tdom093.dll create mode 100644 src/tclkit86bi.vfs/lib/thread2.8.8/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/thread2.8.8/thread288.dll create mode 100644 src/tclkit86bi.vfs/lib/thread2.8.8/ttrace.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/bgerror.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/button.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/choosedir.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/clrpick.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/comdlg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/console.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/README create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/anilabel.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/aniwave.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/arrow.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/bind.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/bitmap.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/browse create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/button.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/check.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/clrpick.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/colors.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/combo.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/cscroll.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/ctext.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/dialog1.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/dialog2.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/en.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/entry1.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/entry2.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/entry3.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/filebox.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/floor.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/fontchoose.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/form.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/goldberg.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/hello create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/hscale.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/icon.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/image1.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/image2.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/images/earth.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/images/earthmenu.png create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/images/earthris.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/images/flagdown.xbm create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/images/flagup.xbm create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/images/gray25.xbm create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/images/letters.xbm create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/images/noletter.xbm create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/images/ouster.png create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/images/pattern.xbm create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/images/tcllogo.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/images/teapot.ppm create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/items.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/ixset create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/knightstour.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/label.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/labelframe.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/license.terms create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/mclist.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/menu.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/menubu.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/msgbox.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/nl.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/paned1.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/paned2.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/pendulum.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/plot.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/puzzle.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/radio.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/rmt create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/rolodex create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/ruler.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/sayings.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/search.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/spin.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/states.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/style.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/tclIndex create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/tcolor create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/text.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/textpeer.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/timer create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/toolbar.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/tree.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/ttkbut.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/ttkmenu.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/ttknote.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/ttkpane.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/ttkprogress.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/ttkscale.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/twind.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/unicodeout.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/vscale.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/demos/widget create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/dialog.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/entry.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/focus.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/fontchooser.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/iconlist.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/icons.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/README create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/logo.eps create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/logo100.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/logo64.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/logoLarge.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/logoMed.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/pwrdLogo.eps create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/pwrdLogo100.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/pwrdLogo150.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/pwrdLogo175.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/pwrdLogo200.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/pwrdLogo75.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/images/tai-ku.gif create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/listbox.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/megawidget.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/menu.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/mkpsenc.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgbox.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/cs.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/da.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/de.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/el.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/en.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/en_gb.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/eo.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/es.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/fi.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/fr.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/hu.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/it.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/nl.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/pl.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/pt.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/ru.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/sv.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/msgs/zh_cn.msg create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/obsolete.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/optMenu.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/palette.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/panedwindow.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/safetk.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/scale.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/scrlbar.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/spinbox.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/tclIndex create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/tearoff.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/text.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/tk.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/tkAppInit.c create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/tkfbox.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/altTheme.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/aquaTheme.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/button.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/clamTheme.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/classicTheme.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/combobox.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/cursors.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/defaults.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/entry.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/fonts.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/menubutton.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/notebook.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/panedwindow.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/progress.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/scale.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/scrollbar.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/sizegrip.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/spinbox.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/treeview.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/ttk.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/utils.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/vistaTheme.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/winTheme.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/ttk/xpTheme.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/unsupported.tcl create mode 100644 src/tclkit86bi.vfs/lib/tk8.6/xmfbox.tcl create mode 100644 src/tclkit86bi.vfs/lib/udp1.0.11/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/udp1.0.11/udp1011.dll create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/ftpvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/httpvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/mk4vfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/starkit.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/tarvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/tclprocvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/template/chrootvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/template/collatevfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/template/deltavfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/template/fishvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/template/globfind.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/template/quotavfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/template/tclIndex create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/template/tdelta.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/template/templatevfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/template/versionvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/testvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/tkvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/vfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/vfsUrl.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/vfsUtils.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/vfslib.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/webdavvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.1/zipvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/ftpvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/httpvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/mk4vfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/starkit.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/tarvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/tclprocvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/template/chrootvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/template/collatevfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/template/deltavfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/template/fishvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/template/globfind.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/template/quotavfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/template/tclIndex create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/template/tdelta.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/template/templatevfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/template/versionvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/testvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/tkvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/vfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/vfs142.dll create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/vfsUrl.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/vfsUtils.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/vfslib.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/webdavvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vfs1.4.2/zipvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vqtcl4.1/m2mvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vqtcl4.1/mkclvfs.tcl create mode 100644 src/tclkit86bi.vfs/lib/vqtcl4.1/mklite.tcl create mode 100644 src/tclkit86bi.vfs/lib/vqtcl4.1/pkgIndex.tcl create mode 100644 src/tclkit86bi.vfs/lib/vqtcl4.1/ratcl.tcl create mode 100644 src/tclkit86bi.vfs/tclkit.ico diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..f0e12db4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/test* +/logs/ +/modules/ +*.exe +*.swp + + diff --git a/callbacks/dispatch.tcl b/callbacks/dispatch.tcl new file mode 100644 index 00000000..6d8f659d --- /dev/null +++ b/callbacks/dispatch.tcl @@ -0,0 +1,356 @@ +namespace eval shellspy::callbacks { + package require shellfilter + + + #each member of args - ist not itself a list - and cannot be treated as one. + #things like [concat {*}args] will generall break things further down the line + proc cmdshellb {args} { + shellfilter::log::open callback_cmdb {-syslog 127.0.0.1:514} + shellfilter::log::write callback_cmdb "cmdshellb got [llength $args] arguments" + shellfilter::log::write callback_cmdb "cmdshellb got '$args'" + + if {[lindex $args 0] eq "cmdb"} { + set curlyparts [lrange $args 1 end] + shellfilter::log::write callback_cmdb "cmdshellb curlyparts '$curlyparts'" + #we lose grouping info by joining like this.. + #set tail [string trim [join $curlyparts " "]] + set tailinfo [shellfilter::list_element_info $curlyparts] + + shellfilter::log::write callback_cmdb "cmdshellb tailinfo '$tailinfo'" + #e.g + #% set y {{"c:/test/etc"} true {'blah1'} {'blah 2'}} + #% lappend y \\\\\\ + #{"c:/test/etc"} true {'blah1'} {'blah 2'} \\\\\\ + #% foreach i [shellfilter::list_element_info $y] {puts $i} + # 0 + # wouldbrace 1 wouldescape 0 has_braces 0 has_inner_braces 0 apparentwrap doublequotes head_tail_chars {{"} {"}} head_tail_names {dq dq} len 13 difflen 2 + # 1 + # wouldbrace 0 wouldescape 0 has_braces 0 has_inner_braces 0 apparentwrap not-determined head_tail_chars {t e} head_tail_names {t e} len 4 difflen 0 + # 2 + # wouldbrace 0 wouldescape 0 has_braces 0 has_inner_braces 0 apparentwrap singlequotes head_tail_chars {' '} head_tail_names {sqote sqote} len 7 difflen 0 + # 3 + # wouldbrace 1 wouldescape 0 has_braces 0 has_inner_braces 0 apparentwrap singlequotes head_tail_chars {' '} head_tail_names {sqote sqote} len 8 difflen 2 + # 4 + # wouldbrace 0 wouldescape 1 has_braces 0 has_inner_braces 0 apparentwrap not-determined head_tail_chars {\\ \\} head_tail_names {\\ \\} len 3 difflen 3 + + + #sample arglist - 7 items + #((c:\lua\luajit.exe + #C:\Users\sleek\vimfiles\plugged\vim-flog/lua/flog/graph_bin.lua + #__START + #true + #git -C C:/repo/3p/ansi-to-html --literal-pathspecs log --parents --topo-order --no-color --pretty=format:__START\%n\%h\%n\%p\%n\%D\%n\%ad\ \[\%h\]\ \{\%an\}\%d\ \%s --date=iso --no-merges --max-count=2000 -- ) + #> + #C:\Users\sleek\AppData\Local\Temp\VRR6A67.tmp) + + + #complex method.. lists at levels.. + set taillist [list] + set level 0 ;#bracket depth.. incr each opening bracket "(" + set leveldict [dict create] + dict set leveldict 0 [list] + + #simpler method.. string + set output "" + dict for {idx info} $tailinfo { + set item [lindex $curlyparts $idx] + set itemlen [string length $item] + if {[dict get $info apparentwrap] eq "brackets"} { + set chars [split $item ""] + set opening [lsearch -all $chars "("] + set closing [lsearch -all $chars ")"] + if {[llength $opening] == [llength $closing]} { + #dict lappend leveldict 0 $item ;#element individually wrapped in brackets and balanced, pass through + append output "$item " + } else { + #robustness warning: we examine outer brackets only, and are ignoring that things like {((a)(b)} {((a)(b} + # are composed of multiple elements for now .. as there should have been a space between the (a) & (b) elements anyway, + # in which case we would only see things like {((a)} or {(a} + set ltrimmed [string trimleft $item "("] + set countleft [expr {$itemlen - [string length $ltrimmed]}] + + set rtrimmed [string trimright $item ")"] + set countright [expr {$itemlen - [string length $rtrimmed]}] + + #simpler method.. + append output "$item " + + } + } else { + set lcharname [lindex [dict get $info head_tail_names] 0] + set rcharname [lindex [dict get $info head_tail_names] 1] + + if {$lcharname eq "lbracket"} { + set ltrimmed [string trimleft $item "("] + set countleft [expr {$itemlen - [string length $ltrimmed]}] + set braces [string repeat "(" $countleft] + + set testlist [list] + lappend testlist $ltrimmed + set testinfo [shellfilter::list_element_info $testlist] + set testelement [dict get $testinfo 0] + if {[dict get $testelement wouldbrace]} { + #append output "${braces}\"$ltrimmed\" " + append output "${braces} $ltrimmed " + } else { + append output "${braces} $ltrimmed " + } + + } elseif {$rcharname eq "rbracket"} { + set rtrimmed [string trimright $item ")" ] + set countright [expr {$itemlen - [string length $rtrimmed]}] + set braces [string repeat ")" $countright] + set testlist [list] + lappend testlist $rtrimmed + set testinfo [shellfilter::list_element_info $testlist] + set testelement [dict get $testinfo 0] + if {[dict get $testelement wouldbrace]} { + #append output "\"$rtrimmed\"${braces} " + if {[string first " " $rtrimmed] > 0} { + append output "\"$rtrimmed\" ${braces} " + } else { + append output "$rtrimmed ${braces} " + } + } else { + append output "${rtrimmed} ${braces} " + } + + + } else { + set testlist [list] + lappend testlist $item + set testinfo [shellfilter::list_element_info $testlist] + set testelement [dict get $testinfo 0] + if {[dict get $testelement wouldbrace]} { + #append output "\"$item\" " + if {[string first " " $item] > 0} { + append output "\"$item\" " + } else { + append output "$item " + } + } else { + append output "$item " + } + } + + } + + } + shellfilter::log::write callback_cmdb "cmdshellb about to parse_cmd_brackets '$output'" + #$output now has quoted all items that 'wouldbrace' + set curly_list [shellfilter::parse_cmd_brackets $output] + if {[llength $curly_list] == 1} { + #we expect the whole set of arguments was wrapped in a set of brackets + set curly_items [lindex $curly_list 0] + } else { + #unexpected.. root level of string had multiple bracketed sections + #try using the curly_list directly warn? + set curly_items $curly_list + } + #e.g + # ((c:\lua\luajit.exe -v) > C:\Users\sleek\AppData\Local\Temp\V7NCBF.tmp) + #=> + # {{{c:\lua\luajit.exe} -v} > {C:\Users\sleek\AppData\Local\Temp\V7NCBF.tmp}} + + #what is the proper way to flatten? + + set comspec [lindex $curly_items 0] + if {[llength $comspec] >1} { + set commandlist [concat $comspec [lrange $curly_items 1 end]] + } else { + set commandlist $curly_items + } + + set commandlist [floghack_singlearg callback_cmdb {*}$commandlist] + return $commandlist + } else { + shellfilter::log::write callback_cmdb "first arg: [lindex $args 0] vs 'cmdb'" + error "first arg: [lindex $args 0] vs 'cmdb'" + #return $args + } + } + proc cmdshell {args} { + if {[catch { + set args [floghack_singlearg callback_cmdshell {*}$args] + } errMsg]} { + error "FLOGHACK callback_cmdshell error $errMsg" + } + + + #set args [concat [lindex $args 0] [lrange $args 1 end]] + return $args + } + proc cmdshelluc {args} { + if {[catch { + set args [floghack_singlearg callback_cmdshelluc {*}$args] + } errMsg]} { + error "FLOGHACK callback_cmdshelluc error $errMsg" + } + + #set args [concat [lindex $args 0] [lrange $args 1 end]] + return $args + } + + proc powershell {args} { + if {[catch { + set args [floghack "callback_powershell" {*}$args] + } errMsg]} { + error "FLOGHACK callback_powershell error $errMsg" + } + return $args + + } + proc raw {args} { + if {[catch { + set args [floghack_singlearg "callback_raw" {*}$args] + } errMsg]} { + error "FLOGHACK callback_raw error $errMsg" + } + #set args [concat [split [lindex $args 0]] [lrange $args 1 end]] ;#definitely bad! + + + return $args + } + + #hack for c: drive - extend as necessary + #todo - customize! + # various hacks may be necessary for home dirs temp files etc! + proc sh {args} { + if {[catch { + set args [floghack callback_sh {*}$args] + } errMsg]} { + error "FLOGHACK callback_sh error $errMsg" + } + + + + set final [list] + foreach a $args { + if {[string match -nocase {*c:/*} $a]} { + set a [string map [list {c:/} {/c/}] $a] + lappend final $a + } elseif {[string match -nocase {*c:\\*} $a]} { + set a [string map [list \\ / ] $a] + set a [string map [list {c:/} {/c/} {C:/} {/C/}] $a] + lappend final $a + } else { + lappend final $a + } + } + return $final + } + proc wsl {args} { + set args [floghack_singlearg callback_wsl {*}$args] + #wsl bash-style /mnt/c paths to be convertd + set args [convert_mnt_win {*}$args] + + #review - seems bad + #flatten first element which arrives wrapped + #set args [concat [lindex $args 0] [lrange $args 1 end]] + + + return $args + } + proc bash {args} { + set args [floghack callback_bash {*}$args] + return [convert_mnt_win {*}$args] + } + + + + #helper functions + proc convert_mnt_win {args} { + set final [list] + foreach a $args { + if {[string match -nocase {*c:\\*} $a]} { + set a [string map [list \\ / ] $a] + } + #bash seems to be strict about lowercase /mnt/c + if {[string match -nocase {*c:/*} $a]} { + set a [string map [list {c:/} {/mnt/c/} {C:/} {/mnt/c/}] $a] + } + lappend final $a + } + shellfilter::log::write callback_convert_mnt_win "convert_mnt_win commandlist '$final'" + return $final + } + + #when we get the git command and args together as one element in the commandlist + proc floghack_singlearg {logtag args} { + #return $args + shellfilter::log::write $logtag "floghack_singlearg got $logtag '$args'" + set newargs [list] + foreach a $args { + if {[string match "*pretty=format:__START*" $a]} { + set a [string map [list "pretty=format:__" "pretty=format:\"__"] $a] + set a [string map [list " --date=" "\" --date="] $a] + set a [string map [list \\ ""] $a] ;# a bad idea? + lappend newargs $a + } else { + lappend newargs $a + } + } + shellfilter::log::write $logtag "floghack_singlearg hacked commandlist '$newargs'" + return $newargs + } + + + proc floghack {logtag args} { + + #return $args + shellfilter::log::write $logtag "floghack got [llength $args] args: '$args'" + set indent " " + set i 0 + foreach a $args { + shellfilter::log::write $logtag "floghack ${indent}$i $a" + incr i + } + + #Flog/luajit hack + #wrong way + #if {[string first "pretty=format:__START" $args] > 0} { + # set args [string map [list "pretty=format:" "pretty=format:'" " --date=" "' --date=" ] $args] + #} + set newargs [list] + + set pretty "" + set pstart [lsearch $args "--pretty=format:__START*"] + set pafter [lsearch $args "--date=*"] + if {$pstart > 0} { + set newargs [lrange $args 0 $pstart-1] + set parts [lrange $args $pstart $pafter-1] + set i 1 + foreach p $parts { + if {$i == 1} { + set pretty [string map [list "format:__" "format:\"__"] $p] + #set pretty $p + } else { + append pretty " $p" + } + if {$i == [llength $parts]} { + append pretty "\"" + } + incr i + } + set pretty [string map [list \\ ""] $pretty] + lappend newargs $pretty + #lappend newargs "--pretty=format:%h" + set newargs [concat $newargs [lrange $args $pafter end]] ;#concat of 2 lists.. should be ok + } else { + set newargs $args + } + + + shellfilter::log::write $logtag "floghack hacked commandlist '$newargs'" + + + return $newargs + } + + + + + + + +} diff --git a/callbacks/parameters.tcl b/callbacks/parameters.tcl new file mode 100644 index 00000000..4ce6a52c --- /dev/null +++ b/callbacks/parameters.tcl @@ -0,0 +1,51 @@ +namespace eval shellspy::parameters { + proc cmdshellb {paramdict} { + return [commonset params_cmdshellb $paramdict] + } + + + proc cmdshell {paramdict} { + return [commonset params_cmdshell $paramdict] + } + + proc powershell {paramdict} { + return [commonset params_powershell $paramdict] + } + + proc raw {paramdict} { + return [commonset params_raw $paramdict] + } + + proc wsl {paramdict} { + return [commonset params_wsl $paramdict] + } + proc bash {paramdict} { + return [commonset params_bash $paramdict] + } + + proc sh {paramdict} { + return [commonset params_sh $paramdict] + } + + proc commonset {logtag paramdict} { + #timeout for launched process + dict set paramdict -timeout 60000 + #prefix for each stdout line - for debugging if this output being mixed with some other + dict set paramdict -outprefix "" + #prefix for each stderr line - also usually best left blank + dict set paramdict -errprefix "" + #put extra info to the log outputs (by default goes to syslog 127.0.0.1 514) + dict set paramdict -debug 0 + dict set paramdict -outbuffering none + dict set paramdict -inbuffering none + #if at tail end of commandline there is a > or >> redirection to a file that contains 'temp' + # make a '_copy' version e.g for something/temp/blah.tmp + # create something/temp/blah_copy.tmp + # this is for pipelines where some other process deletes the original temp file but you want a copy + # to review/debug. + dict set paramdict -copytempfile 1 + + shellfilter::log::write $logtag "base parameters: $paramdict" + return $paramdict + } +} diff --git a/scriptlib/ansi_count_per_second.tcl b/scriptlib/ansi_count_per_second.tcl new file mode 100644 index 00000000..481976d1 --- /dev/null +++ b/scriptlib/ansi_count_per_second.tcl @@ -0,0 +1,54 @@ + +if {$::argc == 1} { + set persec $::argv +} else { + set persec 1 +} +if {$persec > 1000} { + puts stderr "WARNING: (>1000) sub millisecond scheduling not available - will go full speed" + flush stderr + after 500 +} +#--- confg --- +set newline_every_x_seconds 5 +#--- +chan configure stdout -blocking 1 -buffering none +set counter 0 +set ms [expr {1000 / $persec}] +set nl_every [expr {$persec * $newline_every_x_seconds}] + +proc schedule {} { + after idle [list after 0 ::emit] + tailcall after $::ms ::schedule +} + +proc emit {} { + upvar ::counter c + puts -nonewline "\x1b\[1000D$c" + + #if {($c > 1) && (($c % $::nl_every) == 0)} { + # puts stdout $c + # flush stdout + #} else { + # puts -nonewline "\x1b\[1000D$c" + #} + #flush stdout + incr c +} +chan configure stdin -blocking 0 -buffering none +chan event stdin readable [list apply {{chan} { + set chunk [chan read $chan] + if {[string length $chunk]} { + if {[string match "q*" [string tolower $chunk]]} { + set ::forever 0 + } + } + if {[chan eof $chan]} { + chan event $chan readable {} + } +}} stdin] + +schedule +vwait ::forever + +puts "-done-" diff --git a/scriptlib/showargs.tcl b/scriptlib/showargs.tcl new file mode 100644 index 00000000..01003326 --- /dev/null +++ b/scriptlib/showargs.tcl @@ -0,0 +1,32 @@ +puts -nonewline stdout "info script\r\n" +puts stdout "[info script]" +puts stdout "::argc" +puts stdout $::argc +puts stdout "::argv" +puts stdout "$::argv" +puts stdout "NS" +puts stdout "[namespace current]" + +if {[info exists ::test]} { + puts stdout "::test has existing value" + puts stdout "$::test" +} + +puts stdout "setting ::test to showargs-ran" +set ::test "showargs-ran" +puts stdout "doing basic check of stdin for data" +chan configure stdin -blocking 0 +set indata "" +if {![chan eof stdin]} { + #set indata [read stdin] +} +if {[string length $indata]} { + puts stdout "read from stdin:" + puts stdout $indata +} else { +puts stdout "-no stdin data read-" +} + + + + diff --git a/scriptlib/stdout_per_second.tcl b/scriptlib/stdout_per_second.tcl new file mode 100644 index 00000000..3b7dafbd --- /dev/null +++ b/scriptlib/stdout_per_second.tcl @@ -0,0 +1,77 @@ + +if {$::argc >= 1} { + set persec [lindex $::argv 0] +} else { + set persec 1 +} +if {$::argc == 2} { + set what [lindex $::argv 1] +} else { + set what "." +} + +if {$persec > 1000} { + puts stderr "WARNING: (>1000) sub millisecond scheduling not available - will go full speed" + flush stderr + after 500 +} +#--- confg --- +set newline_every_x_seconds 5 +#--- +chan configure stdout -blocking 1 -buffering none +set counter 0 +set ms [expr {1000 / $persec}] +set nl_every [expr {$persec * $newline_every_x_seconds}] + +proc schedule {} { + if {$::forever_stdout_per_second} { + after idle [list after 0 ::emit] + tailcall after $::ms ::schedule + } else { + after idle [list ::the_end] + } +} + +set ::forever_stdout_per_second 1 + +proc the_end {} { + puts "-done-" + flush stdout + set ::done_stdout_per_second 1 +} + +proc emit {} { + upvar ::counter c + if {($c > 1) && (($c % $::nl_every) == 0)} { + puts -nonewline stdout " " + flush stdout + puts stderr $c + flush stderr + } else { + puts -nonewline stdout $::what + } + #flush stdout + incr c +} +chan configure stdin -blocking 0 -buffering none +chan event stdin readable [list apply {{chan} { + set chunk [chan read $chan] + if {[string length $chunk]} { + if {[string match "*q*" [string tolower $chunk]]} { + set ::forever_stdout_per_second 0 + chan event $chan readable {} + puts stdout "cancelling" + } + } + if {[chan eof $chan]} { + chan event $chan readable {} + } +}} stdin] + +schedule +vwait ::forever_stdout_per_second + +vwait ::done_stdout_per_second + + + diff --git a/src/make_punk86.tcl b/src/make_punk86.tcl new file mode 100644 index 00000000..0a0558ca --- /dev/null +++ b/src/make_punk86.tcl @@ -0,0 +1,118 @@ + + +if {[lsearch $::argv -k] >= 0} { + set forcekill 1 +} else { + set forcekill 0 +} +puts stdout "::argv $::argv" + +set dirname [file normalize [file dirname [info script]]] + +if {![file exists $dirname/punk86.vfs]} { + puts stderr "missing $dirname/punk86.vfs" + exit 1 +} +if {[file exists $dirname/punk86]} { + puts stderr "deleting existing $dirname/punk86" + file delete $dirname/punk86 +} + +puts stdout "building with sdx.." +if {[catch { + exec sdx wrap punk86 -runtime tclkit86bi.exe -verbose + } result]} { + puts stderr "sdx wrap punk86 -runtime tclkit86bi.exe -verbose failed with msg: $result" +} else { + puts stdout "ok - finished sdx" + set separator [string repeat = 40] + puts stdout $separator + puts stdout $result + puts stdout $separator +} + +if {![file exists $dirname/punk86]} { + puts stderr "|err> build didn't seem to produce output at $dirname/punk86" + exit 2 +} + +if {![catch { + exec tasklist | grep punk86 + } still_running]} { + puts stdout "found punk86 instances still running\n" + set count_killed 0 + foreach ln [split $still_running \n] { + puts stdout " $ln" + set pid [lindex $ln 1] + if {$forcekill} { + set killcmd [list taskkill /F /PID $pid] + } else { + set killcmd [list taskkill /PID $pid] + } + + puts stdout " pid: $pid (attempting to kill now using '$killcmd')" + + if {[catch { + exec {*}$killcmd + } errMsg]} { + puts stderr "taskkill /PID $pid returned an error:" + puts stderr $errMsg + puts stderr "(try '[info script] -k' option to force kill)" + exit 4 + } else { + puts stderr "taskkill /PID $pid ran without error" + incr count_killed + } + } + if {$count_killed > 0} { + puts stderr "\nKilled $count_killed processes. Waiting a short time before attempting to delete executable" + after 2000 + } +} else { + puts stderr "Ok.. no running punk processes found" +} + + + +if {[file exists $dirname/punk86.exe]} { + puts stderr "deleting existing $dirname/punk86.exe" + if {[catch { + file delete $dirname/punk86.exe + } msg]} { + puts stderr "Failed to delete $dirname/punk86.exe" + exit 3 + } +} + +#is this test necessary? +if {[file exists $dirname/punk86.exe]} { + puts stderr "deletion of $dirname/punk86.exe failed - locked?" + exit 3 +} + +file rename $dirname/punk86 $dirname/punk86.exe +after 500 +set deployment_folder [file dirname $dirname] + +if {[file exists $deployment_folder/punk86.exe]} { + puts stderr "deleting existing deployed at $deployment_folder/punk86.exe" + if {[catch { + file delete $deployment_folder/punk86.exe + } errMsg]} { + puts stderr "deletion of deployed version at $deployment_folder/punk86.exe failed: $errMsg" + exit 4 + } +} + + + +puts stdout "copying.." +puts stdout "$dirname/punk86.exe" +puts stdout "to:" +puts stdout "$deployment_folder/punk86.exe" +after 500 +file copy $dirname/punk86.exe $deployment_folder/punk86.exe + +puts stdout "done" + + diff --git a/src/modules/#tarjar-tarjar-2.3/#tarjar-loadscript-tarjar.tcl b/src/modules/#tarjar-tarjar-2.3/#tarjar-loadscript-tarjar.tcl new file mode 100644 index 00000000..dfe7dc99 --- /dev/null +++ b/src/modules/#tarjar-tarjar-2.3/#tarjar-loadscript-tarjar.tcl @@ -0,0 +1,2317 @@ + +#tarjar +#Julian Marcel Noble 2005. BSD License. [JMN] on the Tcler's wiki - http://wiki.tcl.tk +# +#------------------------------------------------------------------------------------ +# +# Purpose: Read (load) & write tarjarred module files using pure-tcl. +# This might be useful as a bootstrap for other (faster,smaller,funkier?) module-archivers that use binaries. +# e.g trofs or starkit ?? +# +# A tarjar is a valid tarball with the contents under a specially named folder. +# This foldername is a Tcl commented string: #tarjar-- +# The first file in the archive starts with a linefeed, ends with a comment character (#) and contains the load-script. +# There is also a file named #z that ends with a ctrl-z character to terminate Tcl sourcing. +# +# A tarjar .tm file is sourceable by Tcl and thus directly loadable as a Tcl module. +# The tarjar format offers the advantage that the contents are accessible using +# standard tar archive tools as well as other commandline tools such as grep. +# +# +# This package only does a 'package require tar' (tcllib) if creating a tarjar. +# Packages tar, vfs & any package requiring binaries, must not be required for reading. +# Preferably this package will not require any other packages. +# - It'd be nice to keep things ultra simple for relatively easy deployment by people unfamiliar with Tcl packages & modules. +# +# +# !todo - investigate: Is there an *efficient* way to test for and utilize a binary tar package that may be present? +# (i.e a method that doesn't trigger scans of the auto_path, or other extensive filesystem searches.) +# Will this offer any worthwhile performance benefits, or should other module-archivers be used instead if that is an issue? +#------------------------------------------------------------------------------------ +# +# zipped-tarjars +# With thanks to Pascal Scheffers +# see Using zip files like a .kit file: http://wiki.tcl.tk/13876 +# +#------------------------------------------------------------------------------------ + + +#!todo - don't maintain connection to .tm file after diversion to unwrapped version. +# (so how can we deliberately connect to the .tm file in this case?) + +#fix tarjar::create - works as needed by tarjar::wrap - but doesn't properly pack all supplied files when called directly. +#------------------------------------------------------------------------------------ + + + +#don't do a 'package provide' until we've given a chance to redirect.. + +#Changes: +#version 2.3 (2023-03) +# avoid any module/lib loading for the tarjar::connect side of tarjar operations (startup-time reduction and dependency minimization) +# - inline the very few struct::set functions required (tcllib 1.20) +# - inline the platform module code distributed with tcl, as it's still a separate library reducing the ability to run with reduced lib/module scanning during startup (platform 1.0.17) +# - see #maintenance-note tags for versions to update as necessary +# add -name option to tarjar::wrap so that modulename not necessarily taken from name of .tcl script being wrapped. +#Version 1.5 +# Source all scripts with -encoding utf-8 + + + +namespace eval tarjar { + variable LogLevel + if {![info exists LogLevel]} { + # var may exist if namespace was explicitly created in order to pre-set the loglevel! + set LogLevel warn + } + + if {![info exists ::tarjar::debug]} { + set debug 0 ;#this does not affect LogLevel! + } + + variable connected + if {![info exists connected(to)]} { + set connected(to) [list] + } + + set ::tarjar::tarjarscript [info script] + + if {[string tolower [file extension $::tarjar::tarjarscript]] eq ".tcl"} { + set connected(self) [file dirname $::tarjar::tarjarscript] + } else { + #presumably a .tm + set connected(self) $tarjarscript + } + + #extensions of loadable files + #variable loadables [list .so .dll] + variable loadables [info sharedlibextension] + variable sourceables {.tcl .tk} ;#.tm? + + variable version +} + +#package require struct::set ;#faster than package require struct (we don't need whole package) +#BUT - the dependency on tcllib was causing load-time issues - especially with tcllibc (present or absent - both search and load add to startup time) +#for the trivial purposes of tarjar - the tcl versions are fine, and so the few required functions are borrowed and inlined here under a different namespace +#maintenance-note: tcllib 1.20 +namespace eval tarjar::structset { + #some direct borrows from tcllib struct::set + proc intersect {A B} { + if {[llength $A] == 0} {return {}} + if {[llength $B] == 0} {return {}} + + # This is slower than local vars, but more robust + if {[llength $B] > [llength $A]} { + ::set res $A + ::set A $B + ::set B $res + } + ::set res {} + foreach x $A {::set ($x) {}} + foreach x $B { + if {[info exists ($x)]} { + lappend res $x + } + } + return $res + } + # ::struct::set::S_difference -- + # + # Compute difference of two sets. + # + # Parameters: + # A, B -- Sets to compute the difference for. + # + # Results: + # A - B + # + # Side effects: + # None. + + proc difference {A B} { + if {[llength $A] == 0} {return {}} + if {[llength $B] == 0} {return $A} + + array set tmp {} + foreach x $A {::set tmp($x) .} + foreach x $B {catch {unset tmp($x)}} + return [array names tmp] + } +} + + +set tarjar::hasLogger false + +if 0 { +if {![catch {package require logger} logger_version]} { + set tarjar::hasLogger true + set tarjar::logger_version $logger_version +} +} + + + +namespace eval tarjar::_ { + #namespace for internal procs + variable last_scanned_tmlist + if {![info exists last_scanned_tmlist]} { + set last_scanned_tmlist [list] + } +} + +#As tarjar is likely to be loaded very early in a script's life - +# we must be careful about writing to stdout/stderr. +# use ::tarjar::Puts in this package instead of puts to emit warnings. +# stderr/stdout may have been redirected or not yet be open for writing. +# (e.g script might require other packages before standard channels are in a usable state) +# +# We could just wrap all warnings in a catch... but then warnings are lost. +# + +#tarjar 'cooperates' with the channelguard package since we can't load it from within this package. +# (i.e there is a tighter than 'normal' coupling between this package and channelguard - they should be updated in tandem.. or at least have their common assumptions reviewed.) +namespace eval ::channelguard { + variable buffer ;#note - this will not cause it to 'exist' as far as '[info exists...]' is concerned. + if {![::info exists buffer]} { + array set buffer [list] ;#make sure it exists so we can append to $chan,data elements. + } + +} +proc ::tarjar::Puts {args} { + set nl \n + if {[llength $args] > 1 && ([lindex $args 0] eq "-nonewline")} { + set nl "" + set args [lrange $args 1 end] + } + if {[llength $args] == 1} { + #default to stdout + set args [list stdout [join $args]] + } + + lassign $args channel s + + set cmd ::puts + if {$nl==""} { + lappend cmd -nonewline + } + + if {![info exists ::channelguard::README-tarjar]} { + set ::channelguard::README-tarjar { +The ::channelguard namespace belongs to the 'channelguard' package. +The 'tarjar' package may have written directly to the channelguard::buffer variable. + } + } + + if {[catch {puts -nonewline $channel ""}]} { + #channel not writeable + #so where do we send our data?? + #for now - just accumulate in a variable because loading other packages such as Memchan may also invoke puts. + # (depending on package distribution method etc) + #!todo - review + # append ::tarjar::$channel $s + + append ::channelguard::buffer($channel,data) $s$nl + } else { + #{*}$cmd $channel $s + + + + if {![catch {package present channelguard}]} { + #once we know channelguard is loaded - we can replace tarjar::Puts with the standard puts + rename ::tarjar::Puts {} + interp alias {} ::tarjar::Puts {} ::puts + {*}$cmd $channel $s + return + + #review. guarded or not. Channelguard is loaded.. so shouldn't we just alias our Puts to puts now? + #e.g interp alias {} tarjar::Puts {} ::puts + if {$channel ni [::channelguard::guarded]} { + #channelguard loaded but this channel not guarded.. + #presumably therefore it's now ok to write to it. + {*}$cmd $channel $s + } else { + #!todo - review. should we really be writing direct to channelguard buffer here.. or just let channelguard handle it?? + append ::channelguard::buffer($channel,data) $s$nl + } + } else { + append ::channelguard::buffer($channel,data) $s$nl + } + } +} + + +namespace eval tarjar { + variable logger + variable hasLogger + if {$hasLogger} { + set logger [logger::init tarjar] + ${logger}::setlevel $::tarjar::LogLevel + + proc ::tarjar::LogLevel {args} { + if {![llength $args]} { + return [${tarjar::logger}::currentloglevel] + } else { + ${tarjar::logger}::setlevel $args + set ::tarjar::LogLevel $args ;#keep this in sync too.. + } + } + + proc ${logger}::stdoutcmd {level text} { + set logline "[clock format [clock seconds] -format %Y-%m-%dT%H:%M:%S] tarjar $level $text" + if {$level in {error critical}} { + puts stderr $logline + } else { + puts stdout $logline + } + } + + proc ::tarjar::Log {level text} { + variable logger + ${logger}::${level} $text + } + + } else { + proc ::tarjar::Log {args} {} + } + +} + + +proc ::tarjar::myversion {} { + set script [info script] + if {![string length $script]} { + error "No result from \[info script\] - Function should only be called from within a loading tarjar" + } + + + set fname [file tail [file rootname [file normalize $script]]] + set scriptdir [file dirname $script] + + if {![string match "#tarjar-*" $fname]} { + lassign [lrange [split $fname -] end-1 end] _pkgname version + } else { + lassign [scan [file tail [file rootname $script]] {#tarjar-loadscript-%[a-z]-%s}] _pkgname version + if {![string length $version]} { + #try again on the name of the containing folder + lassign [scan [file tail $scriptdir] {#tarjar-%[a-z]-%s}] _pkgname version + #todo - proper walk up the directory tree + if {![string length $version]} { + #try again on the grandparent folder (this is a standard depth for sourced .tcl files in a tarjar) + lassign [scan [file tail [file dirname $scriptdir]] {#tarjar-%[a-z]-%s}] _pkgname version + } + } + } + + tarjar::Log debug "'myversion' determined version for [info script]: $version" + return $version +} + + +proc ::tarjar::myname {} { + set script [info script] + if {![string length $script]} { + error "No result from \[info script\] - Function should only be called from within a loading tarjar" + } + #return $::tarjar::connected(package,[string tolower $script]) + return $::tarjar::connected(package,$script) +} +proc ::tarjar::myfullname {} { + set script [info script] + set script [::tarjar::normalize $script] + if {![string length $script]} { + error "No result from \[info script\] - Function should only be called from within a loading tarjar" + } + return $::tarjar::connected(fullpackage,$script) +} + + + +proc ::tarjar::normalize {path} { + #Tcl's 'file normalize' seems to do some unfortunate tilde substitution on windows.. (at least for relative paths) + # we take the assumption here that if Tcl's tilde substitution is required - it should be done before the path is provided to this function. + set matilda "<_tarjar_tilde_placeholder_>" ;#token that is *unlikely* to occur in the wild, and is somewhat self describing in case it somehow ..escapes.. + set path [string map [list ~ $matilda] $path] ;#give our tildes to matilda to look after + set path [file normalize $path] + #set path [string tolower $path] ;#must do this after file normalize + return [string map [list $matilda ~] $path] ;#get our tildes back. +} + + +#------------------------------------------------------------ +#see returneval: http://wiki.tcl.tk/4346 + +proc ::tarjar::_::returneval {script} {return -code -1 $script} + +proc ::tarjar::_::eproc {name arglist body} { + set alt ::tarjar::_::[namespace tail $name] + + uplevel 1 [list proc $alt $arglist $body] + interp alias {} $name {} [namespace which -command ::tarjar::_::eproc_call] $alt +} +proc ::tarjar::_::eproc_call {args} { + set code [catch [list uplevel 1 $args] res] + if {$code == -1} { + set code [catch [list uplevel 1 $res] res] + return -code $code $res + } elseif {$code == 1} { + return -code error -errorinfo $::errorInfo -errorcode $::errorCode $res + } else { + return -code $code $res + } +} +#------------------------------------------------------------ + + + +#from tcllib tar +proc ::tarjar::_::pad {size} { + set pad [expr {512 - ($size % 512)}] + if {$pad == 512} {return 0} + return $pad +} + +#straight snaffle from from tar::readHeader in tcllib 1.19! +#tcllib tar API appears only designed to deal with entire tarball files, not streams, otherwise +# we would have simply used that tar package. +# +proc ::tarjar::_::readHeader1 {data} { + binary scan $data a100a8a8a8a12a12a8a1a100a6a2a32a32a8a8a155 \ + name mode uid gid size mtime cksum type \ + linkname magic version uname gname devmajor devminor prefix + + foreach x {name mode type linkname magic uname gname prefix mode uid gid size mtime cksum version devmajor devminor} { + set $x [string trim [set $x] "\x00"] + } + set mode [string trim $mode " \x00"] + foreach x {uid gid size mtime cksum version devmajor devminor} { + set $x [format %d 0[string trim [set $x] " \x00"]] + } + + return [list name $name mode $mode uid $uid gid $gid size $size mtime $mtime \ + cksum $cksum type $type linkname $linkname magic $magic \ + version $version uname $uname gname $gname devmajor $devmajor \ + devminor $devminor prefix $prefix] +} + +proc ::tarjar::_::readHeader {data} { + binary scan $data a100a8a8a8a12a12a8a1a100a6a2a32a32a8a8a155 \ + name mode uid gid size mtime cksum type \ + linkname magic version uname gname devmajor devminor prefix + + foreach x {name type linkname} { + set $x [string trim [set $x] "\x00"] + } + foreach x {uid gid size mtime cksum} { + set $x [format %d 0[string trim [set $x] " \x00"]] + } + set mode [string trim $mode " \x00"] + + if {$magic == "ustar "} { + # gnu tar + # not fully supported + foreach x {uname gname prefix} { + set $x [string trim [set $x] "\x00"] + } + foreach x {devmajor devminor} { + set $x [format %d 0[string trim [set $x] " \x00"]] + } + } elseif {$magic == "ustar\x00"} { + # posix tar + foreach x {uname gname prefix} { + set $x [string trim [set $x] "\x00"] + } + foreach x {devmajor devminor} { + set $x [format %d 0[string trim [set $x] " \x00"]] + } + } else { + # old style tar + foreach x {uname gname devmajor devminor prefix} { set $x {} } + if {$type == ""} { + if {[string match */ $name]} { + set type 5 + } else { + set type 0 + } + } + } + + return [list name $name mode $mode uid $uid gid $gid size $size mtime $mtime \ + cksum $cksum type $type linkname $linkname magic $magic \ + version $version uname $uname gname $gname devmajor $devmajor \ + devminor $devminor prefix $prefix] +} + + + +#return a stream open for reading at the beginning of the tar archive. +tarjar::_::eproc ::tarjar::connect {tarjar {type ""}} { + #puts stderr "------>>> tarjar::connect $tarjar type:$type" + upvar #0 ::tarjar::connected con + + set original_connectpath $tarjar + set tarjar [::tarjar::normalize $tarjar] ;#like [file normalize..] except tilde-preserving. + #set tarjar [string tolower $tarjar] ;#must lowercase after normalize! (why??) + + #Key on lowercased and normalized version of path passed in. + #puts stdout "%%%tarjar%%%% $tarjar" + set con(connectpath,$tarjar) $original_connectpath + + + set is_sourced [expr {[file normalize $tarjar] eq [file normalize [info script]]}] + + tarjar::Log debug "'is_sourced':$is_sourced ([file normalize $tarjar] eq [file normalize [info script]])" + #review - when is it NOT sourced?? + + if {![string length $tarjar]} { + error "ERROR: tarjar path required for connection" + } + + if {$tarjar in $con(to)} { + #todo - count number of connections to particular tarjar and decrement on each disconnect til final? + #error "ERROR: already connected to $tarjar" + ::tarjar::Puts stderr "WARNING: already connected to $tarjar" + return [list ok ALREADY_CONNECTED] + } + + lappend con(to) $tarjar + + #puts "---------->connect $tarjar ---> [info level] [info script]" + + set con(location,$tarjar) [file dirname $tarjar] + set con(startdata,$tarjar) -1 + set con(type,$tarjar) $type + set con(fh,$tarjar) "" + + if {[string range [file tail $tarjar] 0 7] eq "#tarjar-" } { + #connecting to unwrapped loadscript file. + set con(type,$tarjar) "unwrapped" + + #use the containing folder's name to determine package & version + lassign [::split [file tail [file dirname $tarjar]] -] _tarjarMark con(package,$tarjar) con(version,$tarjar) + + set this_pkg_tm_folder [file dirname [file dirname $tarjar]] ;# subtract the #tarjar-pkg-x folder (i.e 2 folders up from #tarjar-loadscript.tcl) + + + } else { + #connecting to .tm, .tj or .tar archive - but may be still be unwrapped version available + + #use the tarjar file's name to determine package & version + lassign [::split [file rootname [file tail $tarjar]] -] con(package,$tarjar) con(version,$tarjar) + + set this_pkg_tm_folder [file dirname $tarjar] + + if {$con(type,$tarjar) ne "unwrapped"} { + #Not directly connecting to unwrapped version - + # but may still be redirected there + + set unwrappedFolder [file join $con(location,$tarjar) #tarjar-$con(package,$tarjar)-$con(version,$tarjar)] + if {[file exists $unwrappedFolder]} { + #folder with exact version-match must exist for redirect to 'unwrapped'. + set con(type,$tarjar) tarjar-redirecting + } + } + } + #puts stdout " +++++ connected(package,$tarjar) = [set con(package,$tarjar)]" + + #================================================================================================================= + # - examine module paths to determine if we are actually a 'namespaced' package e.g somepath::somepackage-1.0 + #assume the corresponding pkg-version.tm is one folder up. + if 0 { + if {![llength $::tarjar::_::last_scanned_tmlist]} { + #puts stderr "---> populating ::tarjar::_::last_scanned_tmlist" + set ::tarjar::_::last_scanned_tmlist [tcl::tm::list] + set ::tarjar::TEMP_auto_path $::auto_path[set ::auto_path {}] + catch {package require tarjar-invalidname} ;#force tcl to search module paths so that 'package names' is populated + set ::auto_path $::tarjar::TEMP_auto_path[unset ::tarjar::TEMP_auto_path] + } else { + set tmlist [tcl::tm::list] + if {$::tarjar::_::last_scanned_tmlist ne $tmlist} { + #puts stderr"(tarjar) last_scanned_tmlist ne tcl::tm::list" + #puts stderr " last_scanned_tmlist ->" + #puts stderr " - $::tarjar::_::last_scanned_tmlist" + #puts stderr " tcl::tm::list ->" + #puts stderr " - $tmlist" + + set ::tarjar::_::last_scanned_tmlist $tmlist + + set ::tarjar::TEMP_auto_path $::auto_path[set ::auto_path {}] + catch {package require tarjar-invalidname} ;#force tcl to search module paths so that 'package names' is populated + set ::auto_path $::tarjar::TEMP_auto_path[unset ::tarjar::TEMP_auto_path] + } + } + } + + set unwrapped_tm_file [file join $this_pkg_tm_folder "[set con(package,$tarjar)]-[set con(version,$tarjar)].tm"] + set con(tmfile,$tarjar) $unwrapped_tm_file + #puts stdout "->>> unwrapped_tm_file: $unwrapped_tm_file tarjar: $tarjar" + set tail_segments [list] + set lcase_tmfile_segments [string tolower [file split $this_pkg_tm_folder]] + set lcase_modulepaths [string tolower [tcl::tm::list]] + foreach lc_mpath $lcase_modulepaths { + set mpath_segments [file split $lc_mpath] + if {[llength [tarjar::structset::intersect $lcase_tmfile_segments $mpath_segments]] == [llength $mpath_segments]} { + #$lcase_tmfile_segments includes all of $mpath_segments i.e our tm file is within this module path + set tail_segments [lrange [file split $this_pkg_tm_folder] [llength $mpath_segments] end] ;#use properly cased tail + + #set tail_segments [tarjar::structset::difference $lcase_tmfile_segments $mpath_segments] + break + } + } + if {[llength $tail_segments]} { + set con(fullpackage,$tarjar) [join [concat $tail_segments [set con(package,$tarjar)]] ::] ;#full name of package as used in package require + } else { + set con(fullpackage,$tarjar) [set con(package,$tarjar)] + } + #puts stdout "\t\t####### Full package name: [set con(fullpackage,$tarjar)]" + #================================================================================================================= + + + + + + + + + + + + switch -- $con(type,$tarjar) { + "tarjar-redirecting" { + #We're about to redirect to the unwrapped version + #Don't want to keep sourcing self + # ...but we should keep a connection to ourself open. + #'returneval' used to abort 'sourcing' of the wrapped version + + + #connect to the tarball - start at 1st header. + set con(startdata,$tarjar) 0 + set fh [open $tarjar r] + set con(fh,$tarjar) $fh + fconfigure $fh -encoding binary -translation binary -eofchar {} + if {![catch {::tarjar::_::readHeader [read $fh 512]}]} { + seek $fh $con(startdata,$tarjar) start + #!todo - efficiency: cache this so first read can use it? + } + + + set loadscript_name [file join $unwrappedFolder #tarjar-loadscript-$con(package,$tarjar)-$con(version,$tarjar).tcl] + if {![file exists $loadscript_name]} { + #no match for exact version - take largest version available. + set versioned_loadscripts [glob -nocomplain -dir $unwrappedFolder -tail #tarjar-loadscript-$con(package,$tarjar)-*.tcl] + + #version numbers cannot contain '-' char! + if {[llength $versioned_loadscripts]} { + set max 0 + foreach fname $versioned_loadscripts { + set v [lindex [split [file rootname $fname] -] end] + if {[package vcompare $v $max] == 1} { + #$v larger + set max $v + } + } + set loadscript_name [file join $unwrappedFolder #tarjar-loadscript-$con(package,$tarjar)-$max.tcl] + } else { + #try versionless + set loadscript_name [file join $unwrappedFolder #tarjar-loadscript-$con(package,$tarjar).tcl] + } + if {![file exists $loadscript_name]} { + set loadscript_name [file join $unwrappedFolder #tarjar-loadscript.tcl] + } + } + + + if {$is_sourced} { + #disconnect from the .tm jar prior to sourcing unwrapped version. + tarjar::disconnect $tarjar + + #::tarjar::Puts stderr "---> about to source unwrapped version $loadscript_name" + set script "uplevel #0 ::source -encoding utf-8 $loadscript_name" + #!todo - http://www.tcl.tk/cgi-bin/tct/tip/90.html instead of 'returneval' + + + set prev_info_script [info script] + + #puts stderr "===> about to source $loadscript_name" + if {[catch "info script [list $loadscript_name];$script" errm]} { + #info script {} + info script $prev_info_script + ::tarjar::_::returneval "error [list [set ::errorInfo]\n]" + } else { + ::tarjar::Puts stderr "===> stopping .tm sourcing action" + #info script {} + info script $prev_info_script + ::tarjar::_::returneval "return [list ok -redirection $loadscript_name]" + } + } else { + #? comments required. When do we get here? + #error "WTF?" + puts stderr "|debug> Connecting to '$tarjar' without sourcing - manual connect? Will redirect to '$loadscript_name'" + tarjar::disconnect $tarjar + return [tarjar::connect $loadscript_name] + } + } + "unwrapped" { + if {[string length [info commands ::thread::id]]} { + set from [pid],[thread::id] + } else { + set from [pid] + } + ::tarjar::Puts stderr "$from-> Package $con(package,$tarjar)-$con(version,$tarjar) is using unwrapped version: $tarjar" + return [list ok ""] + } + default { + # "tarjar" + #connect to the tarball - start at 1st header. + set con(startdata,$tarjar) 0 + + set fh [open $tarjar r] + set con(fh,$tarjar) $fh + fconfigure $fh -encoding binary -translation binary -eofchar {} + } + } + + if {$con(startdata,$tarjar) >= 0} { + #verify we have a valid tar header + + if {![catch {::tarjar::_::readHeader [read $fh 512]}]} { + seek $fh $con(startdata,$tarjar) start + #!todo - efficiency: cache this so first read can use it? + return [list ok $fh] + } else { + # this is just a test - probably shouldn't raise an error here + #error "cannot verify tar header" + } + } + + + set con(to) [lrange $con(to) 0 end-1] + set con(startdata,$tarjar) -1 + unset con(fh,$tarjar) + close $fh + return [list err {Does not appear to be a valid tarjar}] +} +proc ::tarjar::disconnect {{tarjar ""}} { + variable connected + tarjar::Log debug " disconnecting $tarjar" + + + + if {![llength $connected(to)]} { + return 0 + } + if {$tarjar eq ""} { + ::tarjar::Puts stderr "WARNING: tarjar not explicitly specified for tarjar::disconnect. Disconnecting last connected: [lindex $connected(to) end]\n - It is better to explicitly specify the tarjar. e.g 'tarjar::disconnect \[info script\]'" + set tarjar [lindex $connected(to) end] + } + + if {[set posn [lsearch $connected(to) $tarjar]] == -1} { + ::tarjar::Puts stderr "WARNING: disconnect called when not connected: $tarjar" + return 0 + } + + + if {[string length $connected(fh,$tarjar)]} { + close $connected(fh,$tarjar) + } + + if {!$::tarjar::debug} { + array unset connected *,$tarjar + #array unset connected fh,$tarjar + #array unset connected type,$tarjar + #array unset connected startdata,$tarjar + #array unset connected location,$tarjar + #array unset connected package,$tarjar + #array unset connected version,$tarjar + + set connected(to) [lreplace $connected(to) $posn $posn] + } else { + tarjar::Log debug "tarjar::debug is 1 - 'disconnect' leaving data in 'tarjar::connected' array" + } + + return 1 +} + + + +tarjar::connect [info script] ;#give tarjar a chance to connect to the unwrapped version instead + + +#package provide tarjar [namespace eval tarjar { +# set version [lindex [split [file rootname [info script]] -] end] +#}] + +package provide tarjar [namespace eval tarjar { + variable version + set fname [file tail [file rootname [info script]]] + + if {![string match "#tarjar-*" $fname]} { + lassign [lrange [split $fname -] end-1 end] pkgname version + } else { + lassign [scan [file tail [file rootname [info script]]] {#tarjar-loadscript-%[a-z]-%s}] pkgname version + if {![string length $version]} { + #try again using the parent folder name. + lassign [scan [file tail [file dirname [info script]]] {#tarjar-%[a-z]-%s}] pkgname version + } + } + set version +}] + + + + + + + + + + +#The caching mechanism is an ugly hack anyway.. todo - investigate if there is a modern alternative to directly load (vfs?) +proc ::tarjar::check_or_make_cached_sofile {sofile fileinfoarrdata filename frompack} { + array set fileinfo $fileinfoarrdata + + if {![file exists $sofile]} { + set cachedir [file dirname $sofile] + set filedata [lindex [tarjar::get $filename $frompack] 1] + file mkdir $cachedir + + set fh [open $sofile w] + fconfigure $fh -translation binary + puts -nonewline $fh $filedata + close $fh + + #'touch' the file to give it the same mtime as the packaged file. + file mtime $sofile $fileinfo(mtime) + } else { + #!todo - check fstat and copy out IFF mismatching size &/or date? + + #set c [file size $sofile] + file stat $sofile cachefile + set c $cachefile(size) + + #array set fileinfo [lindex [tarjar::getFileInfo $file $frompack] 1] + set p $fileinfo(size) + + #puts stderr "!!!size cached:$c pack:$p" + + if {($p != $c) || ($fileinfo(mtime) != $cachefile(mtime))} { + ::tarjar::Puts stderr "warning - file: $filename. Filesize and/or mtime mismatch, cachedsize:$c packsize:$p; cachedmtime:$cachefile(mtime) packmtime:$fileinfo(mtime). To use this tarjar's version, remove $sofile and retry." + } else { + #puts stderr "OK - file: $file - size $p" + } + } +} +#load +#changed args to be more consistent with standard Tcl 'load' command. +#old api ::tarjar::load {filename {frompack ""}} +proc ::tarjar::load {filename args} { + #puts "%%%%%%%%%%%%% load $filename" + + set arglist [list] + set options [list] + + for {set i 0} {$i < [llength $args]} {incr i} { + set a [lindex $args $i] + if {[string first - $a] == 0} { + incr i ;#skip to value + lappend options $a + lappend options [lindex $args $i] + } else { + #not an option + lappend arglist $a + } + } + + set packagename [lindex $arglist 0] + set interp [lindex $arglist 1] + + + if {([llength $arglist] % 2) == 0} { + array set opts $arglist + + } + if {![info exists opts(-from)]} { + set opts(-from) [info script] + } + + #puts "--->>>1 [info script]" + #puts "--->>>2 [uplevel 1 {info script}]" + #puts "---XXX3 $frompack" + + variable connected + #!todo - copy it out to filesystem (and other binary files?) and load it. + + set frompack [tarjar::_::connect_if_not $opts(-from)] ;#ensure we're connected so we can get $frompack + + + lassign [tarjar::getFileInfo $filename $frompack] stat info + + if {$stat ne "ok"} { + error "unable to find file:'$filename' in tarjar:'$frompack'" + } + + array set fileinfo $info + + if {$connected(type,$frompack) eq "unwrapped"} { + set cachedir $connected(location,$frompack) + set sofile [file join $cachedir $filename] + } else { + #puts stderr "wrapped load of file '$filename'" + set cachedir [file join ~ .TclSoCache [file dirname $filename]] + #puts stderr "cachefolder: $cachedir" + set sofile [file join $cachedir [file tail $filename]] + #puts stderr "sofile: $sofile" + if {[catch {check_or_make_cached_sofile $sofile [array get fileinfo] $filename $frompack} msg]} { + after 100 + #retry once in case we're fighting another thread :/ + puts stderr "|tarjar::load> retrying load of cache sofile $sofile once" + flush stderr + check_or_make_cached_sofile $sofile [array get fileinfo] $filename $frompack + } + + } + + #review + #why cd to loading folder?? + # - danger of leaving working dir in wrong folder at any error point. + # - what was the rationale for cd before 'load' anyway? + #temporarily cd to sofile location for loading. + #set place [pwd] + #cd $cachedir + if {[string length $packagename]} { + if {[string length $interp]} { + #uplevel #0 ::load $sofile $packagename $interp + set loadcmd [list uplevel 1 ::load $sofile $packagename $interp] + } else { + #uplevel #0 ::load $sofile $packagename + set loadcmd [list uplevel 1 ::load $sofile $packagename] + } + } else { + #uplevel #0 ::load $sofile + set loadcmd [list uplevel 1 ::load $sofile] + } + if 0 { + if {[catch { + #thread package may not be loaded + puts stderr "|loading> $sofile in thread [thread::id]" + }]} { + puts stderr "|loading> $sofile" + } + } + flush stderr + if {[catch {{*}$loadcmd} msg]} { + if {[string match "*socket*" $msg]} { + #windows wsastart intermittent errors.. retry once? + puts stderr "|load_error> socket related error loading '$sofile' - $msg - retrying once" + flush stderr + ;#synchronous sleep + after [expr {int(floor(rand() * 150)) + 150}] + {*}$loadcmd + } else { + puts stderr "|load error> failed to load '$sofile' - $msg" + flush stderr + after [expr {int(floor(rand() * 50)) + 100}] + {*}$loadcmd + #return -code error $msg + } + } + #cd $place +} + + +#!todo - use #tarjar-xxx folder as base only if 'relative' path specified +#old api proc ::tarjar::source {filename {frompack ""}} + +proc ::tarjar::source {filename args} { + variable connected + if {([llength $args] % 2) == 0} { + array set opts $args + } + if {![info exists opts(-from)]} { + set opts(-from) [info script] + } + #!todo - what about -rsrc & -rsrcid options to 'source' for Mac platform? + set frompack [tarjar::_::connect_if_not $opts(-from)] ;#ensure we're connected so we can get $frompack + lassign [tarjar::get $filename $frompack] stat dat + #$dat is the raw sourcefile, so we need to convert any \r\n lineendings to \n which Tcl requires to 'eval' + set dat [string map {\r\n \n} $dat] + #puts stdout "---XXXX--- filename: $filename stat: $stat dat: $dat" + set prev_info_script [info script] + if {$stat eq "ok"} { + #uplevel #0 [list if 1 "info script [list $filename];$dat"] + # tailcall useful at all here? + uplevel 1 [list if 1 "info script [list $filename];$dat"] + #info script {} + info script $prev_info_script ;#reset info script to previous value + } else { + error "couldn't source file $filename from tarjar $frompack. reason:$dat" + } +} + +proc ::tarjar::_::connect_if_not {frompack} { + upvar #0 ::tarjar::connected connected + #puts *---*---* + #puts "connect_if_not $frompack" + #parray connected + #puts *---*---* + set frompack [::tarjar::normalize $frompack] ;#like [file normalize..] except tilde-preserving. + set docon 0 + if {![llength $connected(to)]} { + if {![string length $frompack]} { + error "Not connected to a tarjar file, and no tarjar specified" + } else { + set docon 1 + } + } else { + if {![string length $frompack]} { + set frompack [lindex $connected(to) end] + ::tarjar::Puts stderr "WARNING: using last connected tarjar: $frompack for operation\n - tarjar not explicitly specified during operation: [info level -1]" + } else { + if {$frompack ni $connected(to)} { + set docon 1 + } + #if {([lsearch $connected(to) $frompack] == -1) } { + # set docon 1 + #} + } + } + if $docon { + if {[lindex [tarjar::connect $frompack] 0] ne "ok"} { + error "file $frompack does not seem to be a valid tarjar archive" + } else { + #we're now connected. + return $frompack + } + } + #We were already connected + return $frompack +} + +proc ::tarjar::getFileInfo {filename {frompack ""}} { + + #puts "%%%%%%%%%%%%% getFileInfo $filename" + + variable connected + set frompack [::tarjar::_::connect_if_not $frompack] + set fh $connected(fh,$frompack) + + if {$connected(type,$frompack) eq "unwrapped"} { + #for unwrapped connection - $connected(location) already points to the #tarjar-pkg-ver folder + if {[string range $filename 0 0] eq "/"} { + #absolute path + set path [file join $connected(location,$frompack) .. [string trim $filename /]] + } else { + #relative path - use #tarjar-xxx as base + set path [file join $connected(location,$frompack) $filename] + } + + file stat $path info + return [list ok [array get info]] + } else { + set pkg $connected(package,$frompack) + set ver $connected(version,$frompack) + while {![eof $fh]} { + array set header [::tarjar::_::readHeader [read $fh 512]] + if {$header(name) eq ""} break + set name [string trimleft $header(prefix)$header(name) /] + + if {($filename eq $name) || ("#tarjar-${pkg}-${ver}/$filename" eq $name)} { + #!todo - set access position to header of first unread file instead? + #!todo - maintain index of headers read so-far? + #(what about added complexity when we also write to tarjar?) + seek $fh $connected(startdata,$frompack) start + return [list ok [array get header]] + } + seek $fh [expr {$header(size) + [::tarjar::_::pad $header(size)]}] current + } + seek $fh $connected(startdata,$frompack) start + } + + return [list err "file $filename not found in archive"] +} + + +#get the raw file data - ie no lineending translations done during read +proc ::tarjar::get {filename {frompack ""}} { + #puts "tarjar::get '$filename' from:'$frompack'" + variable connected + set frompack [::tarjar::_::connect_if_not $frompack] + set fh $connected(fh,$frompack) + + if {$connected(type,$frompack) eq "unwrapped"} { + #for unwrapped connection - $connected(location) already points to the #tarjar-pkg-ver folder + if {[string range $filename 0 0] eq "/"} { + #absolute path + set path [file join $connected(location,$frompack) .. [string trim $filename /]] + } else { + #relative path - use #tarjar-xxx as base + set path [file join $connected(location,$frompack) $filename] + } + set fd [open $path r] + #fconfigure $fd -encoding utf-8 + fconfigure $fd -encoding binary -translation binary + return [list ok [lindex [list [read $fd [file size $path]] [close $fd] ] 0]] + #set fd [open $path r] + #set filedata [read $fd [file size $path]] + #close $fd + #return [list ok $filedata] + } else { + set pkg $connected(package,$frompack) + set ver $connected(version,$frompack) + ##!test & review. Any issues with 'seek' and utf-8? + #fconfigure $fh -encoding utf-8 + #2018 - the answer is yes - it causes corruption of .dll files! + + fconfigure $fh -encoding binary -translation binary + + while {![eof $fh]} { + array set header [::tarjar::_::readHeader [read $fh 512]] + ::tarjar::_::HandleLongLink $fh header + if {$header(name) eq ""} break + + set hdrname [string trimleft $header(prefix)$header(name) /] + #puts stderr "hdrname: $hdrname vs #tarjar-${pkg}-${ver}/$filename" + if {($filename eq $hdrname) || ("#tarjar-${pkg}-${ver}/$filename" eq $hdrname)} { + set filedata [read $fh $header(size)] + + seek $fh $connected(startdata,$frompack) start + #!todo - set access position to header of first unread file instead? + + return [list ok $filedata] + } + seek $fh [expr {$header(size) + [::tarjar::_::pad $header(size)]}] current + } + seek $fh $connected(startdata,$frompack) start + } + + return [list err "file $filename not found in archive"] +} +proc ::tarjar::_::HandleLongLink {fh hv} { + upvar 1 $hv header thelongname thelongname + + # @LongName Part I. + if {$header(type) == "L"} { + # Size == Length of name. Read it, and pad to full 512 + # size. After that is a regular header for the actual + # file, where we have to insert the name. This is handled + # by the next iteration and the part II below. + set thelongname [string trimright [read $fh $header(size)] \000] + seekorskip $fh [pad $header(size)] current + return -code continue + } + # Not supported yet: type 'K' for LongLink (long symbolic links). + + # @LongName, part II, get data from previous entry, if defined. + if {[info exists thelongname]} { + set header(name) $thelongname + # Prevent leakage to further entries. + unset thelongname + } + + return +} + + + +#!todo - implement/test utf-8 filenames +proc ::tarjar::glob {folder {glob *} {frompack ""}} { + variable connected + #parray connected + #puts "*************" + + set frompack [::tarjar::_::connect_if_not $frompack] + set fh $connected(fh,$frompack) + #puts ">>>>>glob $folder $glob - whilst connected to $frompack . fh: $fh" + + if {$connected(type,$frompack) eq "unwrapped"} { + #for unwrapped connection - $connected(location) already points to the #tarjar-pkg-ver folder + if {[string range $folder 0 0] eq "/"} { + #absolute path + set path [file join $connected(location,$frompack) .. [string trim $folder /]] + } else { + #relative path - use #tarjar-xxx as base + set path [file join $connected(location,$frompack) $folder] + } + #puts "--->globbing -nocomplain -directory $path -tail $glob" + return [list ok [::glob -nocomplain -directory $path -tail $glob]] + + } elseif {$connected(type,$frompack) eq "tarjar-redirectingXXX???"} { + if {[string range $folder 0 0] eq "/"} { + #absolute path + set path [file join $connected(location,$frompack) [string trim $folder /]] + } else { + #relative path - use #tarjar-xxx as base + set path [file join $connected(location,$frompack) #tarjar-$connected(package,$frompack)-$connected(version,$frompack) $folder] + } + + return [list ok [::glob -nocomplain -directory $path -tail $glob]] + } else { + if {[string range $folder 0 0] eq "/"} { + #absolute path - assume full path was given + set path [string trim $folder /] + } else { + #relative path - use #tarjar-xxx as base + set path [file join #tarjar-$connected(package,$frompack)-$connected(version,$frompack) $folder] + } + #puts "--->doglob $folder $glob - path:$path" + + set matchlist [list] + while {![eof $fh]} { + array set header [::tarjar::_::readHeader [read $fh 512]] + if {$header(name) eq ""} break + + set name [string trimleft $header(prefix)$header(name) /] + + set segs [::split $name /] + set psegs [::split $path /] + + set dirsegs [lrange $segs 0 [llength $psegs]-1 ] ;#!? + set testpath [::join $dirsegs /] + + if {$testpath eq "."} {set testpath ""} + + # puts "---name: $name ---" + #puts "***$path vs $testpath ***" + + if {$path eq $testpath} { + #same folder + set sub [lindex $segs [llength $dirsegs]] ;#next level folder or filename + if {[string match $glob $sub]} { + #if {[lsearch $matchlist $sub] == -1} { + if {[string length $sub] && ($sub ni $matchlist)} { + lappend matchlist $sub + } + #} + } + } + seek $fh [expr {$header(size) + [::tarjar::_::pad $header(size)]}] current + } + seek $fh $connected(startdata,$frompack) start + + #puts "---GLOB--- returning $matchlist" + return [list ok $matchlist] + } + + return [list err "file $filename not found in archive"] +} + +#Check if string is a valid version number for Tcl .tm files. +proc ::tarjar::_is_valid_tm_version {v} { + #todo - something proper. Note that version numbers can contain letters e.g 7.4a0 + if {[string is digit -strict [string map {. ""} $v]]} { + return true + } else { + return false + } +} + + + + + + + + +#tarjar::update +proc ::tarjar::update {tarjar files args} { + package require tar + set ok [list] + set alreadyin [tar::contents $tarjar] + if {[string range [lindex $alreadyin 0] 0 17] eq "#tarjar-loadscript"} { + set alreadyin [lrange $alreadyin 1 end] + } + if {[string range [lindex $files 0] 0 17] eq "#tarjar-loadscript"} { + set alreadyin [linsert $alreadyin 0 [lindex $files 0]] + set files [lrange $files 1 end] + } + foreach f $files { + if {[lsearch $alreadyin $f] < 0} { + lappend ok $f + } + } + lappend args -update 1 + ::tarjar::create $tarjar [concat $alreadyin $ok] {*}$args +} + + + + + +#todo - take scriptfilelist - where each element can be a file glob +proc ::tarjar::wrap {scriptfile args} { + set opts(-name) "" ;#package name + set opts(-version) "" + set opts(-provide) 1 + set opts(-zip) 0 + set opts(-force) 0 ;#-force 1 to insist we try to create the tarjar no matter what the inputfile format, or to allow wrapping a script that already has a package provide statement + + set result [dict create status unspecified] + set allowed_opts {-name -version -provide -zip -force} + + dict for {k v } $args { + if {$k ni $allowed_opts} { + error "usage: tarjar::wrap scriptfile ?-version \$v? ?-provide 1|0? ?-zip 0|1? ?-force 0|1?" + } + } + + if {[file isdirectory $scriptfile]} { + #!todo - allow this! + set msg "Sorry - wrapping a folder is not yet implemented" + puts stderr "|tarjar::wrap err>$msg" + error $msg + } + + + array set opts $args + + if {[string is digit -strict [string range [file extension $scriptfile] 1 end]]} { + #file extension numeric.. seems unlikely, so treat filename as extensionless. + #!todo -review + Puts stderr "Warning - weird name provided for scriptfile: '$scriptfile' (extension numeric?)" + set rootname $scriptfile + } else { + set rootname [file rootname $scriptfile] + } + + + set tm_version "" + + set version_from_filename "" + set filename_parts [split [file tail $rootname] -] + set possible_versionpart [lindex $filename_parts end] + ;#rejoin, accounting for possible dash in module name (unsure if really necessary) + if {[_is_valid_tm_version $possible_versionpart]} { + set scriptfile_name [join [lrange $filename_parts 0 end-1] -] + set version_from_filename $possible_versionpart + } else { + set scriptfile_name [join $filename_parts -] + set version_from_filename "" + set possible_versionpart "" ;# + } + if {[string length $opts(-name)]} { + set modulename $opts(-name) + } else { + set modulename $scriptfile_name + } + #puts stdout "modulename: $modulename" + + + #tm_version from supplied filename may be overridden by -version option. + + + set $opts(-version) [string trim $opts(-version) .] ;#silently discard leading/trailing dots! + + if {[string length $opts(-version)]} { + if {![_is_valid_tm_version $opts(-version)]} { + error "Version number '$opts(-version)' is invalid - must be comprised of digits separated by dots only." + } + + #assume user supplied version replaces file version + + if {[string length $version_from_filename]} { + #file has a version number - we are replacing it. + #puts "-->1) [join [lrange $filename_parts 0 end-1] -]" + #puts "-->2) $opts(-version)" + set tm_version $opts(-version) + } else { + #unversioned filename - add it. + set tm_version $opts(-version) + } + } else { + if {![string length $version_from_filename]} { + # no version from filename or from -version option + #! Default 1st version 0.1 ! + set tm_version 0.1 + } else { + set tm_version $version_from_filename + } + } + Puts stdout "modulename: $modulename tm_version: $tm_version" + #return + set tarjar [file dirname $rootname]/${modulename}-${tm_version}.tm + + + set fd [open $scriptfile r] + fconfigure $fd -encoding utf-8 + set checkdata [read $fd 20] + + set isZP 0; set isTM 0 + + + if {[string range $checkdata 0 1] eq "PK"} { + #!todo - proper check for non-SFX zip format + #Assume we want to add SFX header but forgot the -zip flag + set opts(-zip) 1 + } + + if {$opts(-zip)} { + if {[string range $checkdata 0 1] eq "PK"} { + #!todo - proper check for non-SFX zip format + #assume we just want to add the SFX header + ::tarjar::make_zip_tm $scriptfile $tarjar + return + } + + if {[string range $checkdata 0 13] eq "#zipped-tarjar"} { + if {!$opts(-force)} { + error "Input file is already a self-extracting zip file" + } + set isZP 1 + } elseif {[string range $checkdata 0 6] eq "#tarjar"} { + #only set isTM 1 if we're going to zip it! + set isTM 1 + } + } else { + if {[string range $checkdata 0 13] eq "#zipped-tarjar"} { + error "This file is already marked as a zipped-tarjar." + } + if {([string range $checkdata 0 6] eq "#tarjar") && ([string range [file tail $scriptfile] 0 17] ne "#tarjar-loadscript")} { + #seems we're trying to create a standard (unzipped) tarjar out of an existing tarjar - require '-force' to do that. + #review + if {!$opts(-force)} { + error "Input file is already a tarjar." + } + } + } + + + if {!$isZP && !$isTM} { + seek $fd 0 start + set scriptdata [read $fd [file size $scriptfile]] + close $fd + set append_tags 0 + + if {[string range [file tail $scriptfile] 0 17] ne "#tarjar-loadscript"} { + set hdr "[::tarjar::_::scriptComment]\n[::tarjar::_::scriptConnect]\n" + append hdr "[::tarjar::_::scriptCommentEnd]\n\n" + + #if {![regexp [string map [list %m% $modulename] {.*package\s*provide\s*%m%.*}] $scriptdata]} {} + if {![regexp [string map [list %m% $modulename] {.*package\s*provide\s*}] $scriptdata]} { + if {$opts(-provide)} { + append hdr "[::tarjar::_::scriptPackageProvide $modulename]\n" + } else { + puts stderr "|tarjar::wrap> warning - no package provide statement detected, and wrap was called with '-provide 0' " + append hdr "[::tarjar::_::scriptPackageProvideExample $modulename]\n" + set append_tags 1 + } + } else { + #already contains a package provide statement for the module. + if {$opts(-provide)} { + puts stderr "|tarjar::wrap> package provide $modulename statement detected. Remove the package provide statement and let tarjar provide the package and version based on the .tm name, or call wrap with -provide 0 if you want to maintain the name and version within the wrapped script file." + set result [dict create status err reason "package provide detected" modulename $modulename moduleversion $tm_version tarjar $tarjar] + return $result + } + #append the example script + append hdr "[::tarjar::_::scriptPackageProvideExample $modulename]\n" + + #insert the # substitution section (because it's commented out in the scriptPackageProvideExample) + set append_tags 1 + } + if $append_tags { + append hdr "\n" + append hdr "#\n" + append hdr "\n" + append hdr "#\n" + append hdr "\n" + append hdr "#\n" + append hdr "\n" + append hdr "#\n" + append hdr "\n" + append hdr "#\n" + append hdr "\n" + append hdr "#\n" + } + #append hdr "[::tarjar::_::scriptCommentEnd]\n\n\n[::tarjar::_::scriptTidy]" + append hdr "#This tarjar initially generated using tarjar version [package present tarjar]\n" + append hdr "# command : tarjar::wrap [file tail $scriptfile] $args\n" + append hdr "# working folder : [file dirname [file normalize $scriptfile]]\n" + append hdr "#-------------------------tarjar footer follows-------------------------\n\n" + } else { + set tarjar [string range $tarjar 19 end] + #assume loadscript already contains 'package require tarjar' & 'connect' call etc. + set hdr \n + } + #find the # section and substitute in the scriptdata (!note! - must only look for *single* leading # + #set compoundscript [::tarjar::_::template_tag_fill $hdr modulecode $scriptdata] + #set compoundscript [::tarjar::_::template_tag_fill $compoundscript sourcefiles ""] + + #The file(s) being wrapped are placed within the $modulename subfolder so that git version control can work with the raw tcl for the module. + #i.e wrapped files go in "#tarjar-{modulename}-{version}/{modulename}/" + set f $modulename/$scriptfile_name[file extension $scriptfile] + set script_sourcer [string map [list %f% $f] { + tarjar::source %f% + }] + set compoundscript [::tarjar::_::template_tag_fill $hdr modulecode $script_sourcer] + array set create_args $args + foreach k {-name -version -provide -zip -force} { + catch {unset create_args($k)} + } + + #assert: $versionpart now has a value + if {![string length [string trim $tm_version]]} { + error "Missing value for 'tm_version'" + } + + #::tarjar::create $tarjar [list #tarjar-${modulename}-${tm_version}/$scriptfile] -script "$compoundscript" {*}$create_args + #::tarjar::create $tarjar [list #tarjar-${modulename}-${tm_version}/${modulename}/$scriptfile] -script "$compoundscript" {*}$create_args + ::tarjar::create $tarjar [list $scriptfile] -script "$compoundscript" {*}[array get create_args] + set result [dict create status ok modulename $modulename moduleversion $tm_version tarjar $tarjar] + package forget $modulename + set uncompressed $tarjar + } else { + close $fd + set uncompressed $scriptfile + } + + if {$opts(-zip)} { + if {![catch {exec zip -v} errmsg]} { + #::tarjar::Puts stderr "-exec: zip -9 [file rootname $tarjar].zip $uncompressed" + exec zip -9 [file rootname $tarjar].zip $uncompressed + ::tarjar::make_zip_tm [file rootname $tarjar].zip $tarjar + file delete [file rootname $tarjar].zip + } else { + error "zip command appears to be unavailable Try installing info-zip (e.g chocolatey Info-ZIP for windows, archivers/zip pkg for FreeBSD). err: $errmsg" + } + } + return $result +} + +proc ::tarjar::_::template_tag_fill {template tag fill} { + set result "" + set mode writing_hdr + set template [string map [list \r\n \n] $template] + foreach ln [split $template \n] { + set testln [string trimleft $ln] + if {[string match "#<${tag}>*" $testln]} { + set mode in_tag + append result $ln\n + append result $fill\n + continue + } + if {[string match "#*" $testln]} { + set mode writing_tail + append result $ln\n + continue + } + if {$mode in {"writing_hdr" "writing_tail"}} { + append result $ln\n + } else { + #presumably we are 'in_tag' - ie - ignoring anything found within that block because it is being replaced. + } + } + return $result +} + + +proc ::tarjar::_::scriptComment {} { +return { +#START-tarjar-loadscript-header---------------------------------------------------------------------------- +#START-header-comments +#If there is anything other than whitespace above this header, then this is a tarjar in packed form. +# (e.g If there is a line above the "START-.." lines) +# +# * Do not edit the code whilst in 'packed' form * +# +# - untar to edit, and retar it afterward using a standard tar program with the format ustar, gnu or v7 (posix & pax formats will not work) +# - When untarred - there will be a folder named #tarjar-- +# You can then edit the #tarjar-loadscript.tcl and other script files in the folder. +# +#If there is no data above the header, it is an unpacked fragment of a tarjar and may be edited. +#Make sure however that your editor preserves the trailing comment (#) as the final character. +# i.e - no trailing newline or carriage-return. +# +# A tarjar is a valid tar archive in which the first archived file consists of a tcl script +# containing a leading newline and a trailing comment (#) character and line continuation character. +# The comment character and line continuation character hide the tar-header for the next file from Tcl. +# This first file in the tarball must be named with the prefix #tarjar-loadscript +# +# The next file is named #z and contains a final ctrl-z to tell Tcl it has reached the end of scripts +# (and thus to stop interpreting). +# The #z file is separate from the initial script file because some editors may not be able to handle the +# ctrl-z character. +# The tarball should have all its contents within a single directory named #tarjar-- +# - This allows you to safely untar any package 'in place' +# - If a package on your 'tcl module path' is unwrapped (i.e untarred) - then the unwrapped files +# are the ones that will be loaded by the interpreter. +# +# This header (excluding this comment block) and the call to tarjar::disconnect are needed to: +# a) allow 'package require' to redirect to the unwrapped version of the tarjar +# b) enable sourcing & loading of any other files contained in the tarjar +#END-header-comments +} +} + +proc ::tarjar::_::scriptConnect {} { +return { +if {[catch {package present tarjar}]} { + set ::TEMP_auto_path $::auto_path; set ::auto_path [list] + if {![catch {package require tarjar} msg]} { + set ::auto_path $::TEMP_auto_path; unset ::TEMP_auto_path + #Do not wrap 'tarjar::connect' in its own 'catch'! + #for unwrapped execution, tarjar::connect may need to abort the 'source' operation. + ::tarjar::connect [info script] + } else { + puts stderr "|tarjar> error during package require tarjar '$msg'" + set ::auto_path $::TEMP_auto_path; unset ::TEMP_auto_path + } +} else { + tarjar::connect [info script] +} +} +} + + +proc ::tarjar::_::scriptPackageProvideExampleXXXX {modulename} { +return [string map [list %m% $modulename] { + +##example 'package provide' statement. +#package provide %m% [namespace eval %m% { +# variable version +# +# #set version [lindex [split [file rootname [info script]] -] end] +# set version [tarjar::myversion] +#}] + + + + + +}] +} + +proc ::tarjar::_::scriptPackageProvideXXX {modulename} { + if {![string length $modulename]} { + error "missing modulename" + } + + return [string map [list %m% $modulename] { + +package provide %m% [namespace eval %m% { + variable version + set version [lindex [split [file rootname [info script]] -] end] +}] + + }] +} + +proc ::tarjar::_::scriptPackageProvideExample {args} { + set script [scriptPackageProvide $args] + + set egscript "##example 'package provide' block.\n" + append egscript "## - unnamespaced procs placed within # section will produce commands within a namespace matching the module name.\n" + foreach ln [split $script \n] { + append egscript "#$ln\n" + } + return $egscript +} + + +proc ::tarjar::_::scriptPackageProvide {args} { + #note: the commented etc section below is not just a comment. + # - these tags are expected to exist. + + if {[string tolower [file extension $::tarjar::connected(self)]] eq ".tm"} { + package require tar + set snippet [tar::get $::tarjar::connected(self) #tarjar-tarjar-${::tarjar::version}/codesnippets/full_loader.txt] + } else { + set snipfile $::tarjar::connected(self)/codesnippets/full_loader.txt + set fd [open $snipfile r] + #for consistency, load our own source files as utf-8 too + fconfigure $fd -encoding utf-8 + set snippet [read $fd [file size $snipfile]] + close $fd + } + return $snippet +} + + + + + + + + + + + +proc ::tarjar::_::scriptCommentEnd {} { +return { +# +#END-tarjar-loadscript-header------------------------------------------------------------------------------ +} +} + +proc ::tarjar::_::scriptTidy {} { +return { +#START-tarjar-loadscript-tidy------------------------------------------------------------------------------ +# +if {![catch {package require tarjar}]} { + ::tarjar::disconnect [info script] +} +# +#END-tarjar-loadscript-tidy-------------------------------------------------------------------------------- +} +} + + + + + + + +namespace eval ::tarjar::man { + proc repack {tarjar args} { + puts stdout "" + tarjar::create $tarjar {} {*}$args + } + + + proc ls {tarjar args} { + package require tar + tar::contents $tarjar + } + + +} + + + + +#tarjar::create +# tarjar : output file name (the 'standard' extension is .tm but this is not enforced) +# files : list of files & directories to be archived. +# +## optional arguments +#-script : code for load-script. Ignored for tarjar if #tarjar-loadscript specified as 1st file in archive. +#-tarball : if 1 create valid tarball (tarjar) else create a hybrid script & tarball (tarbaby) +proc ::tarjar::create {tarjar files args} { + #Puts stdout "called: 'create $tarjar $files $args'" + package require tar + + variable loadables + variable sourceables + + set allowed_opts {-script -modulecode -update -version -provide -zip -force} + + dict for {k v} $args { + if {$k ni $allowed_opts} { + error "usage: tarjar::create tmfilename filelist -script \$complete_loadscript -modulecode \$procs -update 0|1\n received '$args'" + } + } + + + set defaults {-script "" -update 0} ;#defaults + set opts [dict merge $defaults $args] + + + set script [dict get $opts -script] + set update [dict get $opts -update] + + set name_dash_version [file rootname [file tail $tarjar]] + + set parts [split $name_dash_version -] + set modulename [join [lrange $parts 0 end-1] -] + set moduleversion [lindex $parts end] + + + + + #set magicfile "#tarjar-loadscript-$name_dash_version.tcl" + set magicfile "#tarjar-loadscript.tcl" ;#we no longer require filename and version here - unversioned, unnamed magicfile is now the default. + + set mainfolder "#tarjar-$name_dash_version" + file mkdir $mainfolder + file mkdir $mainfolder/$modulename + file mkdir $mainfolder/$modulename/load + + #Review! why are we assuming the magicfile is the first in the list? + #if {[string range [lindex $files 0] 0 17] eq "#tarjar-loadscript" } {} + + if {"#tarjar-loadscript.tcl" in $files} { + set script_posn [lsearch $files "#tarjar-loadscript.tcl"] + set magicfile [lindex $files $script_posn] + #We'll assume no -script argument supplied as it doesn't make sense to specify both. + set fd [open $magicfile r] + fconfigure $fd -encoding utf-8 + set script [read $fd [file size $magicfile]] + close $fd + set files [lreplace $files $script_posn $script_posn][set files {}] + } else { + if {[string length $script]} { + if {[file exists $magicfile]} { + #script specified.. but magicfile (in tarjar destination folder) exists - move it aside. + file rename -force $magicfile $magicfile.old + Puts stderr "$magicfile moved to $magicfile.old" + } + } else { + #!todo - review this branch + set fn [file join $mainfolder $magicfile] + if {[file exists $fn]} { + set fd [open $fn r] + fconfigure $fd -encoding utf-8 + set script [read $fd [file size $fn]] + close $fd + } else { + #fallback to plain #tarjar-loadscript if it exists + #but still insert it as #tarjar-loadscript- + set fn [file join $mainfolder "#tarjar-loadscript"] + if {[file exists $fn]} { + set fd [open $fn r] + fconfigure $fd -encoding utf-8 + set script [read $fd [file size $fn]] + close $fd + } + } + } + } + + if {![string length $script]} { + #basic script. + #assume we need to source all .tcl files and load anything else in loadables extension list. + set script [::tarjar::_::scriptComment] + append script [::tarjar::_::scriptConnect] + append script [::tarjar::_::scriptCommentEnd] + + #unless we grep all source files for 'package provide $modulename' - + # then we can only really put in a commented-out sample 'package provide' statement. + # Also - loaded binaries may make their own package provide call. + append script [::tarjar::_::scriptPackageProvide $modulename] + + set script_sourcefiles "" + set script_loadfiles "" + append script_sourcefiles { +# - source all .tcl files +} + append script_loadfiles { +# - load files with known loadable extensions +} + + append script_sourcefiles \n + foreach fn $files { + set ext [file extension $fn] + if {$ext in $sourceables} { + #.tcl / .tk files + append script_sourcefiles "::tarjar::source $fn\n" + } else { + if {$ext in $loadables} { + #.dll, .so etc + append script_loadfiles "::tarjar::load $fn\n" + } + } + } + + foreach fn [::glob -nocomplain -dir $mainfolder -type f *] { + set ext [file extension $fn] + if {$ext in $sourceables} { + append script_sourcefiles "::tarjar::source $fn\n" + } else { + if {$ext in $loadables} { + append script_loadfiles "::tarjar::load $fn\n" + } + } + #!todo - also source & load files under platform-specific folders + } + + if {[dict exists $opts -modulecode]} { + set script [::tarjar::_::template_tag_fill $script modulecode [dict get $opts -modulecode]] + } + + set script [::tarjar::_::template_tag_fill $script sourcefiles $script_sourcefiles] + set script [::tarjar::_::template_tag_fill $script loadfiles $script_loadfiles] + + + + } + + set ftemp $files + set files [list] + foreach f $ftemp { + if {![file exists $f]} { + Puts stderr "warning: file/folder not found - unable to add/update: $f (destination: $destination)" + } else { + + set f_name_dash_version [file rootname [file tail $f]] + + set f_parts [split $f_name_dash_version -] + set f_modulename [join [lrange $f_parts 0 end-1] -] + set f_moduleversion [lindex $f_parts end] + + if {($f_modulename eq $modulename) && ($f_moduleversion eq $moduleversion)} { + set f_target $f_modulename ;#drop the version number so file suitable for git version control + } else { + set f_target $f_name_dash_version ;#unknown - leave it alone. + } + + lappend files $f + file copy $f $mainfolder/$modulename/${f_target}[file extension $f] + } + } + + + + if {[string range $script 0 0] ne "\n"} { + set script \n$script + } + + if {[string range $script end-1 end] ne "#\\"} { + if {[string first "#Do not remove the trailing" $script] == -1} { + append script { +#Do not remove the trailing 2 characters from this file. Must be a tcl comment char (hash) followed by a line continuation char (backslash) with no following EOL chars. +} + } + #trailing comment + line-continuation character - hides next tar header from tcl + append script "#\\" + } + + set fd [open [file join $mainfolder $magicfile] w] + fconfigure $fd -encoding binary -translation binary + puts -nonewline $fd $script + close $fd + + #separate ctrl-z file + if {![file exists [file join $mainfolder #z]]} { + set fd [open [file join $mainfolder #z] w] + fconfigure $fd -encoding binary -translation binary + puts -nonewline $fd "#This 2-line file marks the end of the Tcl-sourceable section of a tarjar. Do not remove the trailing ctrl-z character from this file.\n" + puts -nonewline $fd "\u001A" + close $fd + } + + #if {![file exists [file join $mainfolder README.tarjar.txt]]} { + #!todo + #} + + + + if {$update} { + set missing [list] + foreach f [lrange [tar::contents $tarjar] 1 end] { + #strip leading "#tarjar-modulename-version/modulename/" + set target_folder "#tarjar-${modulename}-${moduleversion}/$modulename/" + set tail [string range $f [string length $target_folder] end] + if {![file exists [file join [pwd] $tail]]} { + lappend missing $f + } + } + + if {[llength $missing]} { + #missing at least 1 file + #we don't have an update feature in the plain tar library.. only create & add + # so to 'update' we'd have to untar and retar if not all the tarred files are present where we are. + #for now.. we'll remove missing files from the archive + #!todo - review behaviour - this possibly violates the 'least surprise' principle. + + + puts stdout "Missing [llength $missing] items. They will be *removed* from the archive if you continue. Do you wish to continue? \[Y/N\]" + set answer [gets stdin] + + if {[string tolower $answer] eq "y"} { + set remaining [list] + foreach f $files { + if {[lsearch $missing $f] < 0} { + lappend remaining $f + } + } + + tar::create $tarjar [linsert $remaining 0 $mainfolder] + } + } else { + #everything present.. so we can just recreate the tarjar in place + tar::create $tarjar [linsert $files 0 $mainfolder] + } + } else { + #puts stdout "about to call 'tar::create $tarjar [linsert $files 0 $mainfolder]'" + #tar::create $tarjar [linsert $files 0 $mainfolder] + + #In general we should only pass the main folder (#tarjar-modulename-moduleversion) to tar::create. + # We don't want other files in the root, or the .tm won't source properly. + #Puts stdout "about to call 'tar::create $tarjar [list $mainfolder]'" + tar::create $tarjar [list $mainfolder] + } +} +proc ::tarjar::getTempDir {} { + if {[info exists ::env(TEMP)]} { + return $::env(TEMP) + } elseif {[info exists ::env(TMP)]} { + return $::env(TMP) + } elseif {[info exists ::env(TMPDIR)]} { + return $::env(TMPDIR) + } elseif {[info exists ::env(TRASH_FOLDER)]} { + #for macintosh + return $::env(TRASH_FOLDER) + } else { + if {[file exists /tmp]} { + return /tmp + } else { + return [pwd] + } + } +} +#maintenance-note: platform 1.0.17 +#used by full_loader.txt +namespace eval ::tarjar::platform { + #borrow from tcl's platform 1.0.17 + # -- platform::generic + # + # Assembles an identifier for the generic platform. It leaves out + # details like kernel version, libc version, etc. + proc generic {} { + global tcl_platform + + set plat [string tolower [lindex $tcl_platform(os) 0]] + set cpu $tcl_platform(machine) + + switch -glob -- $cpu { + sun4* { + set cpu sparc + } + intel - + ia32* - + i*86* { + set cpu ix86 + } + x86_64 { + if {$tcl_platform(wordSize) == 4} { + # See Example <1> at the top of this file. + set cpu ix86 + } + } + ppc - + "Power*" { + set cpu powerpc + } + "arm*" { + set cpu arm + } + ia64 { + if {$tcl_platform(wordSize) == 4} { + append cpu _32 + } + } + } + + switch -glob -- $plat { + windows { + if {$tcl_platform(platform) == "unix"} { + set plat cygwin + } else { + set plat win32 + } + if {$cpu eq "amd64"} { + # Do not check wordSize, win32-x64 is an IL32P64 platform. + set cpu x86_64 + } + } + sunos { + set plat solaris + if {[string match "ix86" $cpu]} { + if {$tcl_platform(wordSize) == 8} { + set cpu x86_64 + } + } elseif {![string match "ia64*" $cpu]} { + # sparc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + } + darwin { + set plat macosx + # Correctly identify the cpu when running as a 64bit + # process on a machine with a 32bit kernel + if {$cpu eq "ix86"} { + if {$tcl_platform(wordSize) == 8} { + set cpu x86_64 + } + } + } + aix { + set cpu powerpc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + hp-ux { + set plat hpux + if {![string match "ia64*" $cpu]} { + set cpu parisc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + } + osf1 { + set plat tru64 + } + default { + set plat [lindex [split $plat _-] 0] + } + } + + return "${plat}-${cpu}" + } + + # -- platform::identify + # + # Assembles an identifier for the exact platform, by extending the + # generic identifier. I.e. it adds in details like kernel version, + # libc version, etc., if they are relevant for the loading of + # packages on the platform. + + proc identify {} { + global tcl_platform + + set id [generic] + regexp {^([^-]+)-([^-]+)$} $id -> plat cpu + + switch -- $plat { + solaris { + regsub {^5} $tcl_platform(osVersion) 2 text + append plat $text + return "${plat}-${cpu}" + } + macosx { + set major [lindex [split $tcl_platform(osVersion) .] 0] + if {$major > 19} { + set minor [lindex [split $tcl_platform(osVersion) .] 1] + incr major -9 + append plat $major.[expr {$minor - 1}] + } else { + incr major -4 + append plat 10.$major + return "${plat}-${cpu}" + } + return "${plat}-${cpu}" + } + linux { + # Look for the libc*.so and determine its version + # (libc5/6, libc6 further glibc 2.X) + + set v unknown + + # Determine in which directory to look. /lib, or /lib64. + # For that we use the tcl_platform(wordSize). + # + # We could use the 'cpu' info, per the equivalence below, + # that however would be restricted to intel. And this may + # be a arm, mips, etc. system. The wordsize is more + # fundamental. + # + # ix86 <=> (wordSize == 4) <=> 32 bit ==> /lib + # x86_64 <=> (wordSize == 8) <=> 64 bit ==> /lib64 + # + # Do not look into /lib64 even if present, if the cpu + # doesn't fit. + + # TODO: Determine the prefixes (i386, x86_64, ...) for + # other cpus. The path after the generic one is utterly + # specific to intel right now. Ok, on Ubuntu, possibly + # other Debian systems we may apparently be able to query + # the necessary CPU code. If we can't we simply use the + # hardwired fallback. + + switch -exact -- $tcl_platform(wordSize) { + 4 { + lappend bases /lib + if {[catch { + exec dpkg-architecture -qDEB_HOST_MULTIARCH + } res]} { + lappend bases /lib/i386-linux-gnu + } else { + # dpkg-arch returns the full tripled, not just cpu. + lappend bases /lib/$res + } + } + 8 { + lappend bases /lib64 + if {[catch { + exec dpkg-architecture -qDEB_HOST_MULTIARCH + } res]} { + lappend bases /lib/x86_64-linux-gnu + } else { + # dpkg-arch returns the full tripled, not just cpu. + lappend bases /lib/$res + } + } + default { + return -code error "Bad wordSize $tcl_platform(wordSize), expected 4 or 8" + } + } + + foreach base $bases { + if {[LibcVersion $base -> v]} break + } + + append plat -$v + return "${plat}-${cpu}" + } + } + + return $id + } + +} +#!todo - make obsolete. 'platform' package is now part of Tcl core - use platform::identify instead. +proc ::tarjar::platform {} { + set plat [lindex $::tcl_platform(os) 0] + set mach $::tcl_platform(machine) + switch -glob -- $mach { + intel - + i*86* { set mach x86 } + sun4* { set mach sparc } + Power* { set mach ppc } + 9000* { set mach 9000} + default { set mach [string map {" " - / -} $mach]} + } + return "$plat-$mach" +} + +#------------------------------------------------------------------------------------ +# zipped-tarjar +# Original zipped-module creation code by Pascal Scheffers at 'Using a zip file as a Tcl Module' http://wiki.tcl.tk/13869 +#------------------------------------------------------------------------------------ + # [make_zip_tm /zipfile/ /outfile/] + # Prefixes the specified zipfile with the tclmodule mounter stub and writes out 'outfile' + + # [make_sfx_zip /zipfile/ /outfile/ /sfxstub/] + # Adds an arbitrary 'sfx' to a zip file, and adjusts the central directory + # and file items to compensate for this extra data. + +proc ::tarjar::make_zip_tm { zipfile outfile } { + set sfx_stub {#zipped-tarjar +#Do not edit this script directly whilst it is part of a zipped .tm file! +# (zip headers need to be adjusted if this script modified) + +#foreach {pkg ver} [split [file rootname [file tail [info script]]] -] {break} +lassign [split [file rootname [file tail [info script]]] -] pkg ver + +if {[catch {package require vfs::zip}]} { + error "You need the vfs::zip package to use the $pkg package as is. Alternatively, unzip the module file [info script] and try again." +} + +vfs::zip::Mount [info script] [info script] + +set tarjar [file join [info script] $pkg-$ver.tm] +if {[file exists $tarjar]} { + source $tarjar +} else { + set tarjar_loadscript [file join [info script] #tarjar-$pkg-$ver #tarjar-loadscript-$pkg-$ver] + ::tarjar::Puts stderr "2===> $tarjar not found. Will try to source $tarjar_loadscript" + if {[file exists $tarjar_loadscript]} { + source $tarjar_loadscript + } +} +} + append sfx_stub \x1A + tarjar::_::make_sfx_zip $zipfile $outfile $sfx_stub +} + + +proc tarjar::_::make_sfx_zip { zipfile outfile sfx_stub } { + + set in [open $zipfile r] + fconfigure $in -translation binary -encoding binary + #set in_data [read $in [file size $zipfile]] + + set out [open $outfile w+] + fconfigure $out -translation binary -encoding binary + + puts -nonewline $out $sfx_stub + + set offset [tell $out] + + lappend report "sfx stub size: $offset" + + fcopy $in $out + close $in + + set size [tell $out] + + # Now seek in $out to find the end of directory signature: + # The structure itself is 24 bytes long, followed by a maximum of 64Kbytes text + + if { $size < 65559 } { + set seek 0 + } else { + set seek [expr { $size - 65559 } ] + } + #flush $out + seek $out $seek + #puts "$seek [tell $out]" + + set data [read $out] + set start_of_end [string last "\x50\x4b\x05\x06" $data] + + set start_of_end [expr {$start_of_end + $seek}] + lappend report "SEO: $start_of_end ([expr {$start_of_end-$size}]) [string length $data]" + + seek $out $start_of_end + set end_of_ctrl_dir [read $out] + + binary scan $end_of_ctrl_dir issssiis eocd(signature) eocd(disknbr) eocd(ctrldirdisk) \ + eocd(numondisk) eocd(totalnum) eocd(dirsize) eocd(diroffset) eocd(comment_len) + + lappend report "End of central directory: [array get eocd]" + + seek $out [expr {$start_of_end+16}] + + #adjust offset of start of central directory by the length of our sfx stub + puts -nonewline $out [binary format i [expr {$eocd(diroffset)+$offset}]] + flush $out + + seek $out $start_of_end + set end_of_ctrl_dir [read $out] + binary scan $end_of_ctrl_dir issssiis eocd(signature) eocd(disknbr) eocd(ctrldirdisk) \ + eocd(numondisk) eocd(totalnum) eocd(dirsize) eocd(diroffset) eocd(comment_len) + + lappend report "New dir offset: $eocd(diroffset)" + lappend report "Adjusting $eocd(totalnum) zip file items." + + seek $out $eocd(diroffset) + for {set i 0} {$i <$eocd(totalnum)} {incr i} { + set current_file [tell $out] + set fileheader [read $out 46] + binary scan $fileheader is2sss2ii2s3ssii x(sig) x(version) x(flags) x(method) \ + x(date) x(crc32) x(sizes) x(lengths) x(diskno) x(iattr) x(eattr) x(offset) + + if { $x(sig) != 33639248 } { + error "Bad file header signature at item $i: $x(sig)" + } + + foreach size $x(lengths) var {filename extrafield comment} { + if { $size > 0 } { + set x($var) [read $out $size] + } else { + set x($var) "" + } + } + set next_file [tell $out] + lappend report "file $i: $x(offset) $x(sizes) $x(filename)" + + seek $out [expr {$current_file+42}] + puts -nonewline $out [binary format i [expr {$x(offset)+$offset}]] + + #verify: + flush $out + seek $out $current_file + set fileheader [read $out 46] + lappend report "old $x(offset) + $offset" + binary scan $fileheader is2sss2ii2s3ssii x(sig) x(version) x(flags) x(method) \ + x(date) x(crc32) x(sizes) x(lengths) x(diskno) x(iattr) x(eattr) x(offset) + lappend report "new $x(offset)" + + seek $out $next_file + } + + close $out + #puts [join $report \n] +} + + + +#------------------------------------------------------------------------------------ +tarjar::disconnect [info script] + + +#do not remove trailing hash-backslash. There must be no linefeed/carriagereturn etc following it either. +#\ diff --git a/src/modules/#tarjar-tarjar-2.3/#z b/src/modules/#tarjar-tarjar-2.3/#z new file mode 100644 index 00000000..a7de4d89 --- /dev/null +++ b/src/modules/#tarjar-tarjar-2.3/#z @@ -0,0 +1,2 @@ +#This 2-line file marks the end of the Tcl-sourceable section of a tarjar. Do not remove the trailing ctrl-z character from this file. + \ No newline at end of file diff --git a/src/modules/#tarjar-tarjar-2.3/CHANGES b/src/modules/#tarjar-tarjar-2.3/CHANGES new file mode 100644 index 00000000..13839047 --- /dev/null +++ b/src/modules/#tarjar-tarjar-2.3/CHANGES @@ -0,0 +1,19 @@ +2010-03-05 + - allow #tarjar-loadscript.tcl (no package name or version number) + +2008-03-15 (tarpack) + - version 1.1.3 + - modified for use in environments where ::env(HOME) is not available (certain operations such as 'file normalize ~' etc depend on it) + +2006-08-08 (tarpack) + - bump version to 1.1.2 + - fix tarpack::wrap so that the 'scriptTidy' string doesn't force the wrapped package to be dependent on tarpack. + i.e call to 'tarpack::disconnect' now wrapped in test for 'tarpack'. + This allows a tcl-only script to be wrapped with tarpack, but not require tarpack on deployment. + +2006-08-15 + - tarjar 1.0 created as a fork of tarpack 1.1.2 (which is to be abandoned as it's too close in name to 'starpack'). + +2008-06-06 + - tarjar 1.1 + \ No newline at end of file diff --git a/src/modules/#tarjar-tarjar-2.3/DESCRIPTION.txt b/src/modules/#tarjar-tarjar-2.3/DESCRIPTION.txt new file mode 100644 index 00000000..1639e661 --- /dev/null +++ b/src/modules/#tarjar-tarjar-2.3/DESCRIPTION.txt @@ -0,0 +1,3 @@ +Identifier: tarjar +Version: 2.3 +Rights: BSD diff --git a/src/modules/#tarjar-tarjar-2.3/README.tarjar.txt b/src/modules/#tarjar-tarjar-2.3/README.tarjar.txt new file mode 100644 index 00000000..d5c79595 --- /dev/null +++ b/src/modules/#tarjar-tarjar-2.3/README.tarjar.txt @@ -0,0 +1,11 @@ +A tarjar is a standard tar (ustar or gnu format) archive which is also directly loadable as a Tcl module without requiring the tarball to be unarchived. + +When the tarjar is placed on the Tcl module-path it can be loaded with: +package require +Where the is the segment of the tarjar filename before the dash and version number. + +!NOTE! The tarjar can be unpacked in the same folder as the .tm file, in which case, the unpacked files will take precedence over the wrapped version. +The wrapped (.tm) version however needs to remain in place to 'redirect' to the unwrapped version. + + + diff --git a/src/modules/#tarjar-tarjar-2.3/codesnippets/basic_loader.txt b/src/modules/#tarjar-tarjar-2.3/codesnippets/basic_loader.txt new file mode 100644 index 00000000..aacef6d6 --- /dev/null +++ b/src/modules/#tarjar-tarjar-2.3/codesnippets/basic_loader.txt @@ -0,0 +1,47 @@ +apply {code { + set scriptpath [file normalize [info script]] + if {[string match "#tarjar-loadscript*.tcl" [file tail $scriptpath]]} { + #jump up an extra dir level if we are within a #tarjar-loadscript file. + set mypath [file dirname [file dirname $scriptpath]] + set modver [string range [file tail [file dirname $scriptpath]] 8 end] ;# the containing folder is named #tarjar-- + } else { + set mypath [file dirname $scriptpath] + set modver [file root [file tail [info script]]] + } + set mysegs [file split $mypath] + set overhang [list] + foreach libpath [tcl::tm::list] { + set libsegs [file split $libpath] ;#split and rejoin with '/' because sometimes module paths may have mixed \ & / + if {[file join $mysegs /] eq [file join [lrange $libsegs 0 [llength $mysegs]] /]} { + #mypath is below libpath + set overhang [lrange $mysegs [llength $libsegs]+1 end] + break + } + } + lassign [split $modver -] moduletail version + set ns [join [concat $overhang $moduletail] ::] + if {![catch {package require tarjar}]} { + ::tarjar::disconnect [info script] + } + package provide $ns $version + namespace eval $ns $code +} ::} { + # + # Module procs here, where current namespace is that of the module. + # Package version can, if needed, be accessed as [uplevel 1 {set version}] + # Last element of module name: [uplevel 1 {set moduletail}] + # Full module name: [uplevel 1 {set ns}] + + # + # + # + + # + # + # + + # + # + # + +} diff --git a/src/modules/#tarjar-tarjar-2.3/codesnippets/full_loader.txt b/src/modules/#tarjar-tarjar-2.3/codesnippets/full_loader.txt new file mode 100644 index 00000000..d76a981e --- /dev/null +++ b/src/modules/#tarjar-tarjar-2.3/codesnippets/full_loader.txt @@ -0,0 +1,78 @@ +apply {code { + set scriptpath [file normalize [info script]] + if {[string match "#tarjar-loadscript*.tcl" [file tail $scriptpath]]} { + #jump up an extra dir level if we are within a #tarjar-loadscript file. + set mypath [file dirname [file dirname $scriptpath]] + set modver [string range [file tail [file dirname $scriptpath]] 8 end] ;# the containing folder is named #tarjar-- + } else { + set mypath [file dirname $scriptpath] + set modver [file root [file tail [info script]]] + } + set mysegs [file split $mypath] + set mysegs_rejoined [file join $mysegs /] + set mysegs_count [llength $mysegs] + set overhang [list] + foreach libpath [tcl::tm::list] { + set libsegs [file split $libpath] ;#split and rejoin with '/' because sometimes module paths may have mixed \ & / + if {$mysegs_rejoined eq [file join [lrange $libsegs 0 $mysegs_count] /]} { + #mypath is below libpath + set overhang [lrange $mysegs [llength $libsegs]+1 end] + break + } + } + lassign [split $modver -] moduletail version + set ns [join [concat $overhang $moduletail] ::] + if {![catch {package require tarjar}]} { + lassign [::tarjar::glob ${moduletail}/load/[::tarjar::platform::generic] *] _ok libs ;#assume all files are loadable.. + if {[llength $libs] > 0} { + foreach lname $libs { + tarjar::load ${moduletail}/load/[::tarjar::platform::generic]/$lname -from [info script] + } + } else { + lassign [::tarjar::glob ${moduletail}/load *] _ok binfolders + set some_bin_exists false ;#keep track of whether there is at least one binary in the archive for some architecture. + set architectures_supported [list] + foreach fldr $binfolders { + lassign [::tarjar::glob ${moduletail}/load/$fldr *] _ok binfile + if {[llength $binfile] > 0} { + set some_bin_exists true + lappend architectures_supported $fldr + } + } + if {[llength $architectures_supported] > 0} { + puts stderr "platform [tarjar::platform::generic] not supported by the tarjar load-script. (archive contains binaries for:[join $architectures_supported ,])" + } + } + #load all other .tcl files in the *tarjar base* folder - ie those not explicitly wrapped in the {modulename} folder + #!todo - use a manifest to determine load order? + set basefolder [file dirname $moduletail] + lassign [::tarjar::glob $basefolder *.tcl] _ok sourcefiles + foreach f $sourcefiles { + if {![string match "#*" $f]} { + namespace eval $ns [list tarjar::source $basefolder/$f] + } + } + ::tarjar::disconnect [info script] + } + package provide $ns $version + namespace eval $ns $code +} ::} { + # + # Module procs here, where current namespace is that of the module. + # Package version can, if needed, be accessed as [uplevel 1 {set version}] + # Last element of module name: [uplevel 1 {set moduletail}] + # Full module name: [uplevel 1 {set ns}] + + # + # + # + + # + # + # + + # + # + # + +} diff --git a/src/modules/#tarjar-tarjar-2.3/template/README.tarjar.txt b/src/modules/#tarjar-tarjar-2.3/template/README.tarjar.txt new file mode 100644 index 00000000..93d7eb4e --- /dev/null +++ b/src/modules/#tarjar-tarjar-2.3/template/README.tarjar.txt @@ -0,0 +1,11 @@ +A tarjar is a standard tar (ustar or gnu format) archive which is also directly loadable as a Tcl module without requiring the tarball to be unarchived. + +When the tarjar is placed on the Tcl module-path it can be loaded with: +package require +Where the is the segment of the tarjar filename before the dash and version number. + +!NOTE! The tarjar can be unpacked in the same folder as the .tm file, in which case, the unpacked files will take precedence over the wrapped version. +The wrapped version however needs to remain in place to 'redirect' to the unwrapped version. + + + diff --git a/src/modules/#tarjar-tarjar-2.3/todo.txt b/src/modules/#tarjar-tarjar-2.3/todo.txt new file mode 100644 index 00000000..8ce3c27b --- /dev/null +++ b/src/modules/#tarjar-tarjar-2.3/todo.txt @@ -0,0 +1,3 @@ +split tarjar read functionality into separate file/namespace. +Work out how to make tarjar self-hosting. ie wrap next version of tarjar using current one. +(use a 'rollup' of the read-code in the generated loadscript?) diff --git a/src/modules/argp-0.2.tm b/src/modules/argp-0.2.tm new file mode 100644 index 00000000..5c08094b --- /dev/null +++ b/src/modules/argp-0.2.tm @@ -0,0 +1,259 @@ + +# Tcl parser for optional arguments in function calls and +# commandline arguments +# +# (c) 2001 Bastien Chevreux + +# Index of exported commands +# - argp::registerArgs +# - argp::setArgDefaults +# - argp::setArgsNeeded +# - argp::parseArgs + +# Internal commands +# - argp::CheckValues + +# See end of file for an example on how to use + +package provide argp 0.2 + +namespace eval argp { + variable Optstore + variable Opttypes { + boolean integer double string + } + + namespace export {[a-z]*} +} + + +proc argp::registerArgs { func arglist } { + variable Opttypes + variable Optstore + + set parentns [string range [uplevel 1 [list namespace current]] 2 end] + if { $parentns != "" } { + append caller $parentns :: $func + } else { + set caller $func + } + set cmangled [string map {:: _} $caller] + + #puts $parentns + #puts $caller + #puts $cmangled + + set Optstore(keys,$cmangled) {} + set Optstore(deflist,$cmangled) {} + set Optstore(argneeded,$cmangled) {} + + foreach arg $arglist { + foreach {opt type default allowed} $arg { + set optindex [lsearch -glob $Opttypes $type*] + if { $optindex < 0} { + return -code error "$caller, unknown type $type while registering arguments.\nAllowed types: [string trim $Opttypes]" + } + set type [lindex $Opttypes $optindex] + + lappend Optstore(keys,$cmangled) $opt + set Optstore(type,$opt,$cmangled) $type + set Optstore(default,$opt,$cmangled) $default + set Optstore(allowed,$opt,$cmangled) $allowed + lappend Optstore(deflist,$cmangled) $opt $default + } + } + + if { [catch {CheckValues $caller $cmangled $Optstore(deflist,$cmangled)} res]} { + return -code error "Error in declaration of optional arguments.\n$res" + } +} + +proc argp::setArgDefaults { func arglist } { + variable Optstore + + set parentns [string range [uplevel 1 [list namespace current]] 2 end] + if { $parentns != "" } { + append caller $parentns :: $func + } else { + set caller $func + } + set cmangled [string map {:: _} $caller] + + if {![info exists Optstore(deflist,$cmangled)]} { + return -code error "Arguments for $caller not registered yet." + } + set Optstore(deflist,$cmangled) {} + foreach {opt default} $arglist { + if {![info exists Optstore(default,$opt,$cmangled)]} { + return -code error "$caller, unknown option $opt, must be one of: $Optstore(keys,$cmangled)" + } + set Optstore(default,$opt,$cmangled) $default + } + + # set the new defaultlist + foreach opt $Optstore(keys,$cmangled) { + lappend Optstore(deflist,$cmangled) $opt $Optstore(default,$opt,$cmangled) + } +} + +proc argp::setArgsNeeded { func arglist } { + variable Optstore + + set parentns [string range [uplevel 1 [list namespace current]] 2 end] + if { $parentns != "" } { + append caller $parentns :: $func + } else { + set caller $func + } + set cmangled [string map {:: _} $caller] + + #append caller $parentns :: $func + #set cmangled ${parentns}_$func + + if {![info exists Optstore(deflist,$cmangled)]} { + return -code error "Arguments for $caller not registered yet." + } + + set Optstore(argneeded,$cmangled) {} + foreach opt $arglist { + if {![info exists Optstore(default,$opt,$cmangled)]} { + return -code error "$caller, unknown option $opt, must be one of: $Optstore(keys,$cmangled)" + } + lappend Optstore(argneeded,$cmangled) $opt + } +} + + +proc argp::parseArgs { args } { + variable Optstore + + if {[llength $args] == 0} { + upvar args a opts o + } else { + upvar args a [lindex $args 0] o + } + + if { [ catch { set caller [lindex [info level -1] 0]}]} { + set caller "main program" + set cmangled "" + } else { + set cmangled [string map {:: _} $caller] + } + + if {![info exists Optstore(deflist,$cmangled)]} { + return -code error "Arguments for $caller not registered yet." + } + + # set the defaults + array set o $Optstore(deflist,$cmangled) + + # but unset the needed arguments + foreach key $Optstore(argneeded,$cmangled) { + catch { unset o($key) } + } + + foreach {key val} $a { + if {![info exists Optstore(type,$key,$cmangled)]} { + return -code error "$caller, unknown option $key, must be one of: $Optstore(keys,$cmangled)" + } + switch -exact -- $Optstore(type,$key,$cmangled) { + boolean - + integer { + if { $val == "" } { + return -code error "$caller, $key empty string is not $Optstore(type,$key,$cmangled) value." + } + if { ![string is $Optstore(type,$key,$cmangled) $val]} { + return -code error "$caller, $key $val is not $Optstore(type,$key,$cmangled) value." + } + } + double { + if { $val == "" } { + return -code error "$caller, $key empty string is not double value." + } + if { ![string is double $val]} { + return -code error "$caller, $key $val is not double value." + } + if { [string is integer $val]} { + set val [expr {$val + .0}] + } + } + default { + } + } + set o($key) $val + } + + foreach key $Optstore(argneeded,$cmangled) { + if {![info exists o($key)]} { + return -code error "$caller, needed argument $key was not given." + } + } + + if { [catch { CheckValues $caller $cmangled [array get o]} err]} { + return -code error $err + } + + return +} + + +proc argp::CheckValues { caller cmangled checklist } { + variable Optstore + + #puts "Checking $checklist" + + foreach {key val} $checklist { + if { [llength $Optstore(allowed,$key,$cmangled)] > 0 } { + switch -exact -- $Optstore(type,$key,$cmangled) { + string { + if { [lsearch $Optstore(allowed,$key,$cmangled) $val] < 0} { + return -code error "$caller, $key $val is not in allowed values: $Optstore(allowed,$key,$cmangled)" + } + } + double - + integer { + set found 0 + foreach range $Optstore(allowed,$key,$cmangled) { + if {[llength $range] == 1} { + if { $val == [lindex $range 0] } { + set found 1 + break + } + } elseif {[llength $range] == 2} { + set low [lindex $range 0] + set high [lindex $range 1] + + if { ![string is integer $low] \ + && [string compare "-" $low] != 0} { + return -code error "$caller, $key of type $Optstore(type,$key,$cmangled) has a lower value range that is not integer and not ´-´: $range" + } + if { ![string is integer $high] \ + && [string compare "+" $high] != 0} { + return -code error "$caller, $key of type $Optstore(type,$key,$cmangled) has a upper value range that is not integer and not ´+´: $range" + } + if {[string compare "-" $low] == 0} { + if { [string compare "+" $high] == 0 \ + || $val <= $high } { + set found 1 + break + } + } + if { $val >= $low } { + if {[string compare "+" $high] == 0 \ + || $val <= $high } { + set found 1 + break + } + } + } else { + return -code error "$caller, $key of type $Optstore(type,$key,$cmangled) has an allowed value range containing more than 2 elements: $range" + } + } + if { $found == 0 } { + return -code error "$caller, $key $val is not covered by allowed ranges: $Optstore(allowed,$key,$cmangled)" + } + } + } + } + } +} diff --git a/src/modules/flagfilter-0.3.tm b/src/modules/flagfilter-0.3.tm new file mode 100644 index 00000000..575f43d5 --- /dev/null +++ b/src/modules/flagfilter-0.3.tm @@ -0,0 +1,2693 @@ +#package provide flagfilter [namespace eval flagfilter {list [variable version 0.2.3]$version}] +#package provide [set ::pkg flagfilter-0.2.3] [namespace eval [lindex [split $pkg -] 0] {list [variable version [lindex [split $pkg -] 1][set ::pkg {}]]$version}] +# +#package provide [lindex [set pkg {flagfilter 0.2.3}] 0] [namespace eval [lindex $pkg 0] {list [variable version [lindex $pkg 1][set pkg {}]]$version}] +package provide [lassign {flagfilter 0.3} pkg ver]$pkg [namespace eval $pkg[set pkg {}] {list [variable version $ver[set ver {}]]$version}] + +#Note: this is ugly.. particularly when trying to classify flags that are not fully specified i.e raw passthrough. +# - we can't know if a flag -x --x etc is expecting a parameter or not. +#0.2.2 2023-03 JN - added %match% placeholder support. Can be added to the dispatch command to tell it what command was actually matched. e.g tell xxx.tcl script that it was xxx.tcl when we matched on *.tcl + + +namespace eval flagfilter { + package require oolib ;# make 'oolib::collection new' available + + proc do_errorx {msg {code 1}} { + if {$::tcl_interactive} { + error $msg + } else { + puts stderr "|>err $msg" + exit $code + } + } + + proc do_error {msg {then error}} { + set levels [list debug info notice warn error critical alert emergency] + #note we exit or error out even if debug selected - as every do_error call is meant to interrupt code processing at the site of call + #this is not just a 'logging' call even though it has syslog-like level descriptors + lassign $then type code + if {$code eq ""} { + set code 1 + } + set type [string tolower $type] + if {$type in [concat $levels exit]} { + puts -nonewline stderr "|$type> $msg\n" + } else { + puts -nonewline stderr "|flagfilter> unable to interpret 2nd argument to do_error: '$then' should be one of '$levels' or 'exit '\n" + } + flush stderr + if {$::tcl_interactive} { + #may not always be desirable - but assumed to be more useful not to exit despite request, to aid in debugging + if {[string tolower $type] eq "exit"} { + puts -nonewline stderr " (exit suppressed due to tcl_interactive - raising error instead)\n" + if {![string is digit -strict $code]} { + puts -nonewline stderr "|flagfilter> unable to interpret 2nd argument to do_error: '$then' should be: 'exit '\n" + } + } + flush stderr + return -code error $msg + } else { + if {$type ne "exit"} { + return -code error $msg + } else { + if {[string is digit -strict $code]} { + exit $code + } else { + puts -nonewline stderr "|flagfilter> unable to interpret 2nd argument to do_error: '$then' should be 'error' or 'exit '\n" + flush stderr + return -code error $msg + } + } + } + } + proc scriptdir {} { + set possibly_linked_script [file dirname [file normalize [file join [info script] ...]]] + if {[file isdirectory $possibly_linked_script]} { + return $possibly_linked_script + } else { + return [file dirname $possibly_linked_script] + } + } + +} + +package require overtype + + +namespace eval flagfilter { + namespace export get_one_flag_value + #review. Tcl can handle args like: {-a -val1 -b -val2} as long as they pair up. + #this will ignore flag-like values if they follow a -flag + # positional values that happen to start with - can still cause issues + #get_flagged_only can return an unpaired list if there are solos, or if it finds no value for the last flaglike element + # e.g from input {something -x -y -z} we will get {-x -y -z} + # + # + + #flagfilter::get_flagged_only may not always get things right when looking at a values list with command processors + #Even if all solos from commands are supplied in solodict - a flag might be solo only in the context of a particualar commandset + #The proper way to get flagged values from an arglist is to run the full parser. + #This then should be restricted to use for a specific subset of args where the supplied solodict is known to apply + proc get_flagged_only {arglist solodict} { + #solodict - solo flags with defaults + set solo_accumulator [dict create] ;#if multiple instances of solo flag found - append defaults to the value to form a list as long as the number of occurrences + #puts ">>>get_flagged_only input $arglist solodict:'$solodict'" + set result [list] + set last_was_flag 0 + set result [list] + set a_idx 0 + set end_of_options 0 + foreach a $arglist { + if {$a eq "--"} { + break + } + if {$a in [dict keys $solodict]} { + set last_was_flag 0 + if {[dict exists $solo_accumulator $a]} { + set soloval [concat [dict get $solo_accumulator $a] [dict get $solodict $a]] + } else { + set soloval [dict get $solodict $a] + } + dict set solo_accumulator $a $soloval + #we need to keep order of first appearance + set idx [lsearch $result $a] + if {$idx < 0} { + lappend result $a $soloval + } else { + lset result $idx+1 $soloval + } + } else { + if {!$last_was_flag} { + if {$a eq "--"} { + + } else { + if {[lindex $arglist $a_idx-1] eq "--"} { + #end of options processing - none of the remaining are considered flags/options no matter what they look like + set last_was_flag 0 + break + } else { + if {[string match -* $a]} { + set last_was_flag 1 + lappend result $a ;#flag + } else { + #last wasnt, this isn't - don't output + set last_was_flag 0 + } + } + } + } else { + #we only look for single leading - in the value if last wasn't a flag - but we give -- and soloflags special treatment. + if {$a eq "--"} { + #last was flag + set last_was_flag 0 + } else { + lappend result $a ;#value + set last_was_flag 0 + } + } + } + incr a_idx + } + if {([llength $result] % 2) != 0} { + set last [lindex $result end] + if {[string match -* $last] && ($last ni [dict keys $solodict])} { + lappend result 1 + } + } + #puts ">>>get_flagged_only returning $result" + return $result + } + + + ## get_one_paired_flag_value + #best called with 'catch' unless flag known to be in arglist + #raises an error if no position available after the flag to retrieve value + #raises an error if flag not like -something + #raises an error if flag not found in list + proc get_one_paired_flag_value {arglist flag} { + if {![regexp -- {-{1}[^-]+|-{2}[^-]+} $flag]} { + #regexp excludes plain - and -- + #if {![string match -* $flag]} {} + error "get_one_flag_value flag $flag does not look like a flag. Should be something like -$flag or --$flag" + } + set cindex [lsearch $arglist $flag] + if {$cindex >= 0} { + set valueindex [expr {$cindex + 1}] + if {$valueindex < [llength $arglist]} { + #puts stderr "++++++++++++++++++ get_one_flag_value flag '$flag' returning [lindex $arglist $valueindex]" + return [lindex $arglist $valueindex] + } else { + error "flagfilter::get_one_paired_flag_value no value corresponding to flag $flag (found flag, but reached end of list)" + } + } else { + error "flagfilter::get_one_paired_flag_value $flag not found in arglist: '$arglist'" + } + } +} + +namespace eval flagfilter::obj { + +} + + +namespace eval flagfilter { + variable run_counter 0 ;#Used by get_new_runid to form an id to represent run of main check_flags function. + #used as a basis for some object-instance names etc + proc get_new_runid {} { + variable run_counter + package require Thread + return "ff-[pid]-[thread::id]-[incr run_counter]" + } + + namespace export check_flags + proc do_debug {lvl debugconfig msg} { + if {$lvl <= [dict get $debugconfig -debugargs]} { + foreach ln [split $msg \n] { + puts -nonewline stderr "|[dict get $debugconfig -source]> $ln\n" + flush stderr + } + } + } + + #---------------------------------------------------------------------- + # DO NOT RELY ON tcl::unsupported - it's named that for a reason and is not meant to be parsed + #wiki.tcl-lang.org/page/dict+tips+and+tricks + proc isdict {v} { + if {[string match "value is a list *" [::tcl::unsupported::representation $v]]} { + return [expr {!([llength $v] % 2)}] + } else { + return [string match "value is a dict *" [::tcl::unsupported::representation $v]] + } + } + + proc dict_format {dict} { + dictformat_rec $dict "" " " + } + proc dictformat_rec {dict indent indentstring} { + # unpack this dimension + set is_empty 1 + dict for {key value} $dict { + set is_empty 0 + if {[isdict $value]} { + append result "$indent[list $key]\n$indent\{\n" + append result "[dictformat_rec $value "$indentstring$indent" $indentstring]\n" + append result "$indent\}\n" + } else { + append result "$indent[list $key] [list $value]\n" + } + } + if {$is_empty} { + #experimental.. + append result "$indent\n" + #append result "" + } + return $result + } + #-------------------------------------------------------------------------- + + #solo 'category' includes longopts with value + #solo flags include the general list of -soloflags, and those specific to the current -commandprocessors spec (mashopts and singleopts) + proc is_this_flag_solo {f solos objp} { + if {![string match -* $f]} { + #not even flaglike + return 0 + } + + + if {$f in $solos} { + #review! - global -soloflags shouldn't override the requirements of a commandprocessor! + #but.. each commandprocessor needs to understand global solos occuring before our match so that we classify correctly.. + #todo - this may need to reference v_map and current position in scanlist to do properly + return 1 + } + if {$f eq "-"} { + #unless the caller declared it as a solo - treat this as a non flag element. (likely use is as a command match) + return 0 + } + if {$f eq "--"} { + #this is it's own type endofoptions + return 0 + } + + set p_opts [$objp get_combined_opts] + + set mashopts [dict get $p_opts mashopts] + set singleopts [dict get $p_opts singleopts] + set pairopts [dict get $p_opts pairopts] + set longopts [dict get $p_opts longopts] + + if {$f in $singleopts} { + return 1 + } + + #"any" keywords used by processors to consume anything - where we're not too worried about classifying a flagvalue vs an operand + #examine these last so that an explicit configuration of flags as pairopts,mashopts etc can still be classified correctly + if {"any" in $singleopts} { + return 1 + } + if {[string first "=" $f] >=1} { + if {"any" in $longopts} { + return 1 + } + #todo foreach longopt - split on = and search + } + + #Flag could still be part of a solo if it is in mashopts *and* has a value following it as part of the mash - but if it's a pairopt, but not mashable - we can rule it out now + if {($f in $pairopts) && ($f ni $mashopts)} { + return 0 + } + #todo - suport mashes where one of the mashed flags takes an arg - review: only valid if it's last in the mash? + #(presumably so - unless we there was some other value delimiter such as isnumeric or capitalised flags vs lowercase values - but that seems a step too far - would require some sort of mashspec/mash-strategy config) + #last part of mash may actually be the value too. which complicates things + #linux ls seems to do this for example: + # ls -w 0 + # ls -lw 0 + # ls -lw0 + # also man.. e.g + # man -Tdvi + # man -Hlynx + # man -H + # - note this last one. '-H lynx' doesn't work - so it's a mashable opt that can take a value, but is not in pairopts! (-H with no value uses env value for browser) + # see also comments in is_this_flag_mash + # + + set flagletters [split [string range $f 1 end] ""] + set posn 1 + set is_solo 1 ;#default assumption to disprove + #trailing letters may legitimately not be in mashopts if they are part of a mashed value + #we can return 0 if we hit a non-mash flag first.. but at each mashflag we need to test if we can classify as definitely solo or not, or else keep processing + foreach l $flagletters { + if {"-$l" ni $mashopts} { + #presumably an ordinary flag not-known to us + return 0 + } else { + if {"-$l" in $pairopts} { + if {$posn == [llength $flagletters]} { + #in pairopts and mash - but no value for it in the mash - thefore not a solo + return 0 + } else { + #entire tail is the value - this letter is effectively solo + return 1 + } + } elseif {"-$l" in $singleopts} { + #not allowed to take a value - keep processing letters + } else { + #can take a value! but not if at very end of mash. Either way This is a solo + return 1 + } + } + } + return $is_solo + } + #todo? support global (non-processor specific) mash list? -mashflags ? + proc is_this_flag_mash {f objp} { + if {![regexp -- {-{1}[^-]+|-{2}[^-]+} $f]} { + #not even flaglike + return 0 + } + set optinfo [$objp get_combined_opts];#also applies to tail_processor - *usually* empty values for mashopts etc + + #we look at singleopts because even if the flag is in mashopts - when it is alone we don't classify it as a mash + set singleopts pdict get $optinfo singleopts] + if {$f in $singleopts} { + return 0 + } + + set pairopts [dict get $optinfo pairopts] + if {$f in [dict keys $pairopts]} { + #here, the entire arg (f) we are testing is in pairopts - it could still however appear as part of a mash, with or without a trailing value, and with or without other flags before it in the mash (but if neither prefixed,nor tailed then obviously not a mash) + return 0 + } + set mashopts [dict get $optinfo mashopts] + set flagletters [split [string range $f 1 end] ""] + set is_mash 1 ;#to disprove - all letters must be in mashopts to consider it a mash.. unless trailing one also takes a value + # .. in which case value could be at the tail of the mash.. or be the next arg in the list + # We will take absense from singleopts and pairopts to indicate the mashflag *optionally* takes a value + # (ie such a mashopt is a solo that can take a value only as a mashtail) + # presence in pairopts indicates a mashflag must have a value + # presense in singleopts indicates mashflag takes no value ever. + # mashopt cannot be in both singleopts and pairopts. (NAND) + foreach l $flagletters { + if {-$l in $pairopts} { + if {"$-l" in $mashopts} { + #need to consider any remainder in the mash as this value .. if no remainder - then this is a mash, but not 'solo' because this flag needs to consume the following arg. + # We are only concerned with mashness here so just stop processing mash elements when we hit the first one that is a pairopt + break + } else { + #we require the pairopt to explicitly be listed in mashopts as well as pairopts if it is to be allowed to be part of a mash + set is_mash 0 + } + } elseif {"-$l" in $singleopts} { + #singleopt & mashopt - cannot take a value, mashed or otherwise + if {"-$l" ni $mashopts} { + set is_mash 0 + } + } else { + if {"-$l" ni $mashopts} { + set is_mash 0 + } else { + #present only in mashopts - can take a value, but only immediately following in the mash + break + } + } + } + return $is_mash + } + proc is_this_flag_for_me {f objp cf_args} { + set processorname [$objp name] + set optinfo [$objp get_combined_opts] ;#also applies to tail_processor - *usually* empty values for mashopts etc + + if {$processorname in [list "tail_processor"]} { + return 1 + } + if {$processorname in [list "global"]} { + #todo - mashflags for global? + set defaults [dict get $cf_args -defaults] + set extras [dict get $cf_args -extras] + set soloflags [dict get $cf_args -soloflags] + if {$f in [concat $extras $soloflags [dict keys $defaults]]} { + return 1 + } + } + + set singleopts [dict get $optinfo singleopts] + if {"any" in [string tolower $singleopts]} { + #review semantics of 'all' here. does it mean any -xxx.. will match, or only if also in global -soloflags? + return 1 + } + set pairopts [dict get $optinfo pairopts] + set allopts [concat $singleopts [dict keys $pairopts]] + if {$f in $allopts} { + return 1 + } + + #process mashopts last + set mashopts [dict get $optinfo mashopts] + if {"any" in [string tolower $mashopts]} { + #if 'all' in mashopts - it can eat anything - review - is this even useful? + return 1 + } else { + set flagletters [split [string range $f 1 end] ""] + set is_mash 1 ;#to disprove - all letters must be in mashopts to consider it a mash + foreach l $flagletters { + if {"-$l" ni $mashopts} { + set is_mash 0 + } + } + return $is_mash + } + + return 0 + } + + + + proc add_dispatch_raw {recordvar parentname v} { + upvar $recordvar drecord + if {[dict exists $drecord $parentname]} { + set dispatchinfo [dict get $drecord $parentname raw] + lappend dispatchinfo $v + dict set drecord $parentname raw $dispatchinfo + } + } + proc add_dispatch_argument {recordvar parentname k v} { + upvar $recordvar drecord + if {[dict exists $drecord $parentname]} { + set dispatchinfo [dict get $drecord $parentname arguments] + lappend dispatchinfo $k $v ;#e.g -opt 1 + dict set drecord $parentname arguments $dispatchinfo + } + } + proc lsearch-all-stride-2 {l search} { + set posns [lmap i [lsearch -all $l $search] {expr {($i % 2) == 0 ? $i : [list x]}}] + return [lsearch -all -inline -not $posns x] + } + proc update_dispatch_argument {recordvar parentname k v} { + upvar $recordvar drecord + if {[dict exists $drecord $parentname]} { + set dispatchinfo [dict get $drecord $parentname arguments] + #can't assume there aren't repeat values e.g -v -v + #dict set dispatchinfo $k $v + if {[package vcompare [info tclversion] 8.7a5] >= 0} { + set posns [lsearch -all -stride 2 $dispatchinfo $k] + } else { + set posns [lsearch-all-stride-2 $dispatchinfo $k] + } + set lastitem [lindex $posns end] + if {[string length $lastitem]} { + set val_idx [expr {$lastitem + 1}] + set dispatchinfo [lreplace $dispatchinfo[set dispatchinfo {}] $val_idx $val_idx $v] ;# inlineK + dict set drecord $parentname arguments $dispatchinfo + } else { + error "Unable to update dispatch argument $k with value $v in dispatch record for $parentname" + } + #dict set drecord $parentname $dispatchinfo + } + } + + #Note the difference between this and is_command_match. + #Lack of a 'match' element does not cause a commandspec to skip allocating an operand it encounters + #Note that this isn't a general test to be applied to the entire argument list. + # - an arg may get matched by an earlier processor making it unavailable to be allocated by another processor + # so this test only applies during the ordered examination of args + proc can_this_commandspec_allocate_this_arg {flag cspec cf_args} { + set cmdinfo [lindex $cspec 1] + if {$cmdinfo eq "tail_processor"} { + return 1 + } + if {$cmdinfo eq "global"} { + set defaults [dict get $cf_args -defaults] + set soloflags [dict get $cf_args -soloflags] + set extras [dict get $cf_args -extras] + if {$flag in [concat $soloflags $extras [dict keys $defaults]]} { + return 1 + } + } + if {![dict exists $cmdinfo match]} { + return 1 + } + set matchspeclist [dict get $cmdinfo match] + foreach matchspec $matchspeclist { + if {[regexp -- $matchspec $flag]} { + return 1 + } + } + #only block it if there was a match pattern specified but it didn't match + return 0 + } + #Note - returns false for a cspec that has no match specified. + #A command/subcommand with no match specification is allowed to allocate any value - so be careful with this + # - it should not be used to *stop* an arg being allocated if the processor has no 'match' specified, or if it is another type of processor like 'tail_handler'. + proc is_command_match {flag cspec} { + set pinfo [lindex $cspec 1] + if {[dict exists $pinfo match]} { + set matchspeclist [dict get $pinfo match] + foreach matchspec $matchspeclist { + if {[regexp -- $matchspec $flag]} { + return 1 + } + } + return 0 + } else { + return 0 + } + } + proc is_command_match_any {f commandprocessors} { + foreach comspec $commandprocessors { + lassign $comspec cmdname cmdinfo + if {[dict exists $cmdinfo match]} { + set matchlist [dict get $cmdinfo match] + foreach matchspec $matchlist { + if {[regexp -- $matchspec $f]} { + #actually a command + return true + } + } + } + } + return false + } + + #determine if f is potentially a flag that takes a parameter from the next argument. + #e.g --x=y (longopt) does not consume following arg but --something *might* + proc is_candidate_toplevel_param_flag {f solos commandprocessors} { + if {[is_command_match_any $f $commandprocessors]} { + return false + } + if {$f in $solos} { + return 0 + } + if {$f in [list "-" "--"]} { + return 0 + } + #longopts (--x=blah) and alternative --x blah + #possibly also -x=blah + if {[string match -* $f]} { + if {[string first "=" $f]>1} { + return 0 + } + } + return [expr {[string match -* $f]}] + } + + + + + + + + + + + + + + + + + + + + #todo - show caller info + proc assert_equal {a b} { + if {![expr {$a eq $b}]} { + error "assert_equal $a $b" + } + } + + + + + + #{1 unallocated 2 unallocated 3 unallocated 4 unallocated 5 unallocated 6 unallocated} ;#initial v_map + #1 2 3 4 5 6 ;#original list posns example + # 2 6 ;#map_remaining example (scanlist) + #1 3 4 5 ;#map_allocated example + #{1 {cmd1 operand} 2 unallocated 3 {cmd2 operand} 4 {cmd2 flag} 5 {cmd2 flagvalue} 6 unallocated} ;#v_map updated example + oo::class create class_vmap { + variable o_map + variable o_remaining + variable o_allocated + variable o_values + variable o_codemap + variable o_flagcategory + constructor {values} { + set o_codemap [list \ + operand op \ + flagvalue fv \ + soloflag so \ + flag fl \ + unallocated un \ + endofoptions eo \ + ] + set o_flagcategory [list "flag" "flagvalue" "soloflag"] + set o_values $values + set o_remaining [lsearch -all $values *] ;#create a list of indices e.g 0 1 2 3 4 5 6 + set o_allocated [list] + foreach posn $o_remaining { + lappend o_map $posn unallocated + } + } + method load {values rem alloc map} { + set o_values $values + set o_remaining $rem + set o_allocated $alloc + set o_map $map + } + method copy_to {obj} { + $obj load $o_values $o_remaining $o_allocated $o_map + } + method update_map_from {obj} { + #very basic sanity check first + if {[llength $o_values] ne [llength [$obj get_values]]} { + error "[self class].update_map_from cannot update. length of values mismatch" + } + + set newmap [$obj get_map] + } + + method get_codemap {} { + return $o_codemap + } + method get_values {} { + return $o_values + } + method get_remaining {} { + return $o_remaining + } + method get_allocated {} { + return $o_allocated + } + method get_map {} { + return $o_map + } + method argnum_from_remaining_posn {scanlist_posn} { + set vidx [lindex $o_remaining $scanlist_posn] + if {![string is digit -strict $vidx]} { + return -code error "[self class].argnum_from_remaining_posn cannot determine argnum from scanlist position:$scanlist_posn using unallocated list:'$o_remaining'" + } + return $vidx + } + + method allocate {objp argnum type value} { + set processorname [$objp name] + if {$processorname eq "tail_processor"} { + set owner "unallocated" + } else { + set owner [$objp parentname] + } + if {$argnum > [llength $o_values]-1} { + return -code error "[self class].allocate cannot allocate argnum:$argnum. Only [llength $o_values] items in value list" + } + if {$argnum in $o_allocated} { + return -code error "[self class].allocate already allocated '$processorname' argnum:'$argnum' type:'$type' val:'$value' remaining:$o_remaining allocated:$o_allocated map:$o_map" + } + lappend o_allocated $argnum + set o_allocated [lsort -dictionary $o_allocated] + dict set o_map $argnum [list $owner $type $value] + set scanlist_posn [lsearch $o_remaining $argnum] + set o_remaining [lreplace $o_remaining[set o_remaining {}] $scanlist_posn $scanlist_posn] ;#inlineK + + + + } + + method get_list_unflagged_by_class {classmatch} { + set resultlist [list] + dict for {k vinfo} $o_map { + lassign $vinfo class type val + if {[string match $classmatch $class]} { + if {$type ni [list flag flagvalue soloflag]} { + lappend resultlist $val + } + } + } + return $resultlist + } + + method get_list_flagged_by_class {classmatch} { + set list_flagged [list] + dict for {k vinfo} $o_map { + lassign $vinfo class type val + if {[string match $classmatch $class]} { + if {$type in [list flag flagvalue soloflag]} { + lappend list_flagged $val + } + } + } + return $list_flagged + } + + method get_merged_flagged_by_class {classmatch} { + variable flagcategory + set all_flagged [list] + set seenflag [dict create] ;#key = -flagname val=earliest vindex + dict for {k vinfo} $o_map { + lassign $vinfo class type val + if {[string match $classmatch $class]} { + set a [llength $all_flagged] ;#index into all_flagged list we are building + if {$type eq "soloflag"} { + if {[dict exists $seenflag $val]} { + set seenindex [dict get $seenflag $val] + set seenindexplus [expr {$seenindex+1}] + set existingvals [lindex $all_flagged $seenindexplus] + lappend existingvals 1 ;#1 indicating presence - stored as list rather than a count. todo: consider global or per-solo options to support incrementing instead? + lset all_flagged $seenindexplus $existingvals + } else { + dict set seenflag $val $a + lappend all_flagged $val 1 + } + } elseif {$type eq "flag"} { + if {![dict exists $seenflag $val]} { + dict set seenflag $val $a + lappend all_flagged $val + } + #no need to do anything if already seen - flagvalue must be next, and it will work out where to go. + } elseif {$type eq "flagvalue"} { + set idxflagfor [expr {$k -1}] + set flagforinfo [dict get $o_map $idxflagfor] + lassign $flagforinfo ffclass fftype ffval + #jn "--" following a flag could result in us getting here accidentaly.. review + set seenindex [dict get $seenflag $ffval] + if {$seenindex == [expr {$a-1}]} { + #usual case - this is a flagvalue following the first instance of the flag + lappend all_flagged $val + } else { + #write the value back to the seenindex+1 + set seenindexplus [expr {$seenindex+1}] + set existingvals [lindex $all_flagged $seenindexplus] + lappend existingvals $val ;#we keep multiples as a list + lset all_flagged $seenindexplus $existingvals + } + } + } + } + return $all_flagged + } + method typedrange_class_type_from_arg {argclass argtype} { + if {$argclass eq "unallocated"} { + if {$argtype in $o_flagcategory} { + return [list unallocated flagtype] + } else { + if {![string length $argtype]} { + #should only happen if something wrong with the tail_processor - rather than error out, for now at least make it stand out in the . + set argtype UNKNOWN + } + return [list unallocated ${argtype}type] ;#e.g unallocated_operand, unallocated_endofoptions + } + } else { + return [list $argclass argtype] ;# e.g command something + } + } + + method get_ranges_from_classifications {classifications} { + #puts stderr "get_ranges_from_classifications $classifications" + #examine classifications and create a list of ranges + set ranges [list];# e.g [list {unallocated 0 4} {cmd1 5 7} {unallocated 8 8} {cmd2 9 9} {cmd3 10 10} {unallocated 11 15}] + set seen_commands [list] + dict for {posn arginfo} $classifications { + set is_new_cmd 0 + set is_sub_cmd 0 + set is_continuation 0 + set rangename [lindex $ranges end 0] + set alloc [lindex $arginfo 0] ;#e.g of form 0 {unallocated operand} 1 {lscmd operand} 2 {lscmd soloflag} 3 {lscmd.dir operand} 4 {unallocated flag} + set cmdname "" + if {$alloc ne "unallocated"} { + if {$alloc ni $seen_commands} { + if {![llength $seen_commands]} { + set cmdname $alloc + set is_new_cmd 1 + } else { + set tail [lindex $seen_commands end] + if {$tail eq "unallocated"} { + set cmdname $alloc + set is_new_cmd 1 + } else { + if {[string first . $alloc] >= 0} { + set prefixcheck [lindex [split $alloc .] 0] + if {![string equal -length [string length $prefixcheck] $prefixcheck $tail]} { + #this is not unallocated, not a subcommand of the previous seen ie new command + set cmdname $alloc + set is_new_cmd 1 + } else { + set cmdname $prefixcheck + set is_sub_cmd 1 + set is_continuation 1 + } + } else { + set cmdname $alloc + set is_new_cmd 1 + } + } + } + } else { + set cmdname $alloc + set is_continuation 1 + } + if {$is_continuation} { + lassign [lindex $ranges end] _cmd n a b + set ranges [lrange $ranges 0 end-1] + lappend ranges [list command $n $a [incr b]] + flagfilter::assert_equal $b $posn + } elseif {$is_new_cmd} { + lappend seen_commands $alloc + if {$rangename eq ""} { + lappend ranges [list command $cmdname $posn $posn] + } else { + lassign [lindex $ranges end] _cmd n a b + lappend ranges [list command $cmdname [incr b] $posn] + flagfilter::assert_equal $b $posn + } + } else { + error "coding error during dispatch" + } + } else { + if {$rangename eq ""} { + lappend ranges [list unallocated mixed 0 0] + } else { + lassign [lindex $ranges end] class n a b + if {$class eq "unallocated"} { + #continuation - extend + set ranges [lrange $ranges 0 end-1] + lappend ranges [list unallocated mixed $a [incr b]] + } else { + #change from allocated to unallocated + lappend ranges [list unallocated mixed [incr b] $posn] + flagfilter::assert_equal $b $posn + } + } + } + } + set rangesbytype [list] + foreach oldrange $ranges { + lassign $oldrange oldrangeclass oldrangetype A B ;#A,B for original range bounds, a,b for bounds of sub-ranges we are creating + set last_type "" + set newrangelist [list] + set inner_range [list 0 0] + if {$oldrangeclass ne "unallocated"} { + #pass through - user can split commands further themselves by referencing the classifications map where each arg position is listed + set last_type $oldrangeclass ;#note the deliberate slight misuse - we are using the 'class' here rather than the type as we aren't looking at types within a command range + lappend rangesbytype $oldrange + } else { + #puts stdout "???????????????????????????????????????????????A$A B$B examining old range:'$oldrange'" + for {set i $A} {$i <= $B} {incr i} { + lassign [lindex $rangesbytype end] last_class last_type a b ;#enough just to use the type without the class + set a_info [dict get $classifications $i] + lassign $a_info argclass argtype v + lassign [my typedrange_class_type_from_arg $argclass $argtype] newrangeclass newrangetype + if {$last_type eq ""} { + lappend rangesbytype [list "unallocated" $newrangetype 0 0] + } else { + if {$last_type eq $newrangetype} { + set rangesbytype [lrange $rangesbytype 0 end-1] + lappend rangesbytype [list $last_class $last_type $a $i] + } else { + lappend rangesbytype [list $newrangeclass $newrangetype $i $i] + } + } + } + } + } + + return [list -ranges $ranges -rangesbytype $rangesbytype] + } + + method grid {} { + set posns [dict keys $o_map] + set col1 [string repeat " " 15] + set col [string repeat " " 4] + set pline "[overtype::left $col1 {var indices}] " + foreach p $posns { + append pline [overtype::left $col $p] + } + set remline "[overtype::left $col1 {unallocated}] " + foreach vidx $posns { + if {$vidx ni $o_remaining} { + append remline [overtype::left $col "."] + } else { + set tp [lindex [dict get $o_map $vidx] 1] + set tp [string map $o_codemap $tp] + append remline [overtype::left $col $tp] + } + } + set cmdlist [list] + dict for {vidx info} $o_map { + if {[lindex $info 0] ne "unallocated"} { + set c [lindex [split [lindex $info 0] .] 0] + if {$c ni $cmdlist} { + lappend cmdlist $c + } + } + } + set clinelist [list] + foreach c $cmdlist { + set cline "[overtype::left $col1 $c] " + dict for {vidx info} $o_map { + lassign $info class type v + if {($c eq $class) || [string equal -length [string length "$c."] "$c." $class]} { + set tp [string map $o_codemap $type] + append cline [overtype::left $col $tp] + } else { + append cline [overtype::left $col "."] + } + } + lappend clinelist $cline + } + + + set aline "[overtype::left $col1 {allocated}] " + foreach vidx $posns { + if {$vidx ni $o_allocated} { + append aline [overtype::left $col "."] + } else { + set tp [lindex [dict get $o_map $vidx] 1] + set tp [string map $o_codemap $tp] + append aline [overtype::left $col $tp] + } + } + + return "$pline\n$remline\n[join $clinelist \n]\n$aline\n" + } + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #!todo - check if -commandprocessors members will collide with existing -flags in values before moving them + #!todo - skip optional sub-flag value if the next arg following its parent is a flag i.e proper handling of -commandprocessors {cmd {cmd sub "default}} when only cmd supplied. + #!important to fix. At the moment it could eat a further unflagged item in values later in the list which was intended for a different -commandprocessors member! + #add support for -commandprocessors {-cmd {-cmd -othercmd "default"}} to be a safe way to specify a linked -flag move that does the same. + proc allocate_arguments {PROCESSORS solos values cf_args caller} { + set runid [lindex [split [namespace tail $PROCESSORS] _] 1] ;# objname is of form PROCESSORS_pid-threadid-counter where "PROCESSORS_" is a literal + #puts stderr ">>>>>>> solos: $solos" + dict set debugc -debugargs [dict get $cf_args -debugargs] + dict set debugc -source "allocate_arguments $caller" + + set defaults [dict get $cf_args -defaults] + + set cmdprocessor_records [$PROCESSORS get_commandspecs] + + + set sep "\uFFFE" ;#argument-subargument separator (choose something else if this causes problems.. but we want something unlikely (or preferably impossible?) to be in a commandline, ideally a single character, and which at least shows something on screen during debug) + set sepstr "\\uFFFE" ;#for human readable error msg + #\u001E was tried and doesn't output on some terminals) + + set remaining_unflagged [dict create] + + set extra_flags_from_positionals [list] ;#values moved to -values + set moved_to_flagged [dict create] + + #implied_ are values supplied from defaults when a flag or operand was not found + set implied_flagged [list] + set implied_unflagged [list] + + + set dispatch [dict create] + #sanitize and raise error if sep somehow in values + if {[string first $sep $cmdprocessor_records] >= 0} { + do_error "allocate_arguments flags error separator '$sep' ($sepstr) found in values " + } + #-------------------------------------- + set VMAP [flagfilter::class_vmap create flagfilter::VMAP_$runid $values] + #-------------------------------------- + + set unconsumed_flags_and_values [list] + set unflagged [dict create] + + ###################### + #main -commandprocessors loop which scans the valuelist + set values_index 0 ;#track where we are up to as we allocate values to unflagged elements + set source_values $values ;#start with all including -flagged + + #todo - get rid of most of these flags last_x_was etc - and just do lookups into the v_map + # as this will probably involve *lots* of small functiona calls - keep this boolean version and check for performance issues. + set a_index 0 + set is_args_flag 0 + set last_arg_was_paramflag 0 ;#a flag that expects a parameter to follow + set last_arg_was_solo 0 + set solo_flags [dict keys $solos] ;#solos is a dict of -flag (preprocessed) + set end_of_options 0 + set end_of_options_index -1 ;#as later processors can rescan - we need to make sure they only look at arguments after this point + set last_p_found [dict create by "" index "" item ""] + set sequence 0 + set argerrors [list] ;#despite being a list - we will break out at first entry and return for now. + set parsestatus "ok" + set LAUNCHED [oolib::collection create col_processors_launched_$runid] + set MATCHED [oolib::collection create col_processors_matched_$runid] + oo::objdefine col_processors_matched_$runid { + method test {} { + return 1 + } + } + + #set objp [$PROCESSORS object_from_record $p] ;#temp convenience + + foreach objp [$PROCESSORS items] { + set objparent [$objp parent] + $LAUNCHED add $objp [$objp name] + set p [$objp get_def] ;#individual record e.g {mycmd {match run singleopts {-x}}} or {tail_processor {}} + + lassign $p parentname pinfo + set is_sub [$objp is_sub] ;#is subargument - should look to see if last related spec got a value and abort if not. + set is_p_flag [$objp is_flag] ;#sub can be a flag even if parent isn't + set processorname [$objp name] + if {[$objp is_sub]} { + if {![[$objp parent] found_match]} { + continue + } + set p_sub [dict get $pinfo sub] + } + do_debug 3 $debugc " =========================>> p $p sequence:$sequence a_index $a_index" + + if {$processorname in [list "global" "tail_processor"]} { + dict set last_p_found by $processorname + #dict set last_p_found index $a_index + #dict set last_p_found item $a + } + # -format {x {sub y default "default"}} means y is dependent on x being present and shouldn't eat if the next value isn't flaglike + # -format {-x {sub -y}} does the same for moving positionals to the flagged list. + + + #set remaining_values [lrange $source_values $a_index end] + ##################################### + # full rescans for later processors + set remaining_values $source_values ;#source_values shrinks as commands take arguments + set a_index 0 + ##################################### + + do_debug 3 $debugc "-------->________>p '$processorname' remaining vals $remaining_values" + + #!todo - use v_map as an extra determinant to stop sequence for a command-set. (don't extend beyond where args have already been snipped by another command) + if {[$objp name] eq "tail_processor"} { + set mapcopy [flagfilter::class_vmap new {}] ;#no need to supply values as we are copying data from $VMAP + $VMAP copy_to $mapcopy + $objp set_map_object $mapcopy + } else { + $objp set_map_object $VMAP + } + foreach a $remaining_values { + set argnum [[$objp get_map_object] argnum_from_remaining_posn $a_index] + if {![string is integer -strict $argnum]} { + error "arg '$a' scan_index:$a_index - calculated argnum:'$argnum' is invalid" + + } + set sub_operand 0 + do_debug 3 $debugc "$argnum >eoptions_idx:$end_of_options_index a_index:$a_index __________________________________________________________a $a" + if {$end_of_options_index > -1} { + set end_of_options [expr {$a_index >= $end_of_options_index}] + } + + #review - data with leading - may be unintentionally interpreted as a flag + if {[string trim $a] eq "--"} { + #generally means end of options processing.. + #review - pass -- through?? + set last_arg_was_paramflag 0 ;#we don't treat first arg following end_of_options as belonging to the flag! - it is potentially an operand to the command + set is_solo_flag 0 + set end_of_options 1 + set end_of_options_index $a_index + #if {[lindex $p 0] eq "tail_processor"} { + $objp allocate $argnum "endofoptions" $a + set source_values [lreplace $source_values[set source_values {}] $a_index $a_index] ;#inlineK + incr a_index -1 + #} + } else { + if {($last_arg_was_paramflag) && ([$objp arg_is_defined_solo_to_me $a])} { + #last flag expecting param - but this flag *known* to be solo + #keep it simple and break out at first solo_flag related error ...unless it is trailing flag in the list + lappend argerrors [list flagerror solo_flag_following_non_solo_flag bad_flag $a] + set last_arg_was_solo 1 + break + } + #set is_solo_flag [expr {($a in $solo_flags)}] + #set is_solo_flag [is_this_flag_solo $a $solo_flags $objp] + set is_solo_flag [$objp arg_is_defined_solo_to_me $a] + + if {!$end_of_options} { + if {!$last_arg_was_paramflag} { + if {!$is_solo_flag} { + set is_args_flag [is_candidate_toplevel_param_flag $a $solo_flags $cmdprocessor_records] + #set is_args_flag [string match -* $a] + } + if {$is_args_flag || $is_solo_flag} { + if {[dict get $last_p_found by] eq $processorname} { + if {![is_this_flag_for_me $a $objp $cf_args]} { + if {$processorname ne "globalXXX"} { + do_debug 3 $debugc "----breaking--- $processorname already found a value [dict get $last_p_found item] and has now hit an unrecognized option: $a" + break + } + } + } + } + } else { + #last was flag expecting a param + set is_args_flag 0 + set is_solo_flag 0 + } + } else { + #end_of_options - ignore solo and other flags now. + set is_args_flag 0 + set is_solo_flag 0 + set last_arg_was_paramflag 0 + + } + + #puts stderr "!!!!!!!!!!!!!!!!!!1 here is_args_flag:$is_args_flag" + do_debug 3 $debugc " >________>________>is_p_flag: $is_p_flag last_arg_was_paramflag:$last_arg_was_paramflag is_args_flag:$is_args_flag is_solo: $is_solo_flag (soloflags:$solo_flags) a:$a " + if {!$is_args_flag && !$is_solo_flag } { + + if {!$last_arg_was_paramflag} { + if {[dict get $last_p_found by] eq $processorname} { + if {$processorname ne "tail_processor"} { + #we already found our unflagged value - and now we've hit another - time to break and hand it to a subcommand processor if any + do_debug 3 $debugc "----breaking--- $processorname already found a value [dict get $last_p_found item] and has now hit another value: $a" + break + } + } + set sequence_ok 1 ;#default assumption + set can_allocate [can_this_commandspec_allocate_this_arg $a $p $cf_args] + + if {$can_allocate} { + if {$is_sub} { + #!todo - use v_map as sequence terminator + #check if our find is in sequence + #we are only hunting non-flagged items and the the previous finder removes 1 from the source_values list + #therefore the a_index of our find should be the same if we are processing the very next argument. + #we have already checked that it was a related entity which found the last one. + #todo - review if it matters when parents/siblings don't eat all the way up to the next -flag. + #todo - implement a 'gather' key to keep eating in sequence and accumulate the values as a list + if {$a_index > [dict get $last_p_found index]} { + do_debug 3 $debugc "OUT OF SEQUENCE a_index:$a_index vs last_found index:[dict get $last_p_found index], $processorname disengaging - ignoring value $a and leaving it to the next processor" + set last_arg_was_paramflag 0 + do_debug 3 $debugc "<--- breaking --->" + break + } elseif {$a_index < [dict get $last_p_found index]} { + #too early.... found something before previous match + do_debug 3 $debugc "+++++++++++++++out of sequence $processorname - too early.. keeping scanning" + set sequence_ok 0 + } + if {$sequence_ok} { + set sub_operand 1 + } + } + } + + if {$can_allocate && $sequence_ok} { + #found a non-flagged value in the argumentlist to either reallocate to flagged values or to positional values + if {[dict exists $pinfo dispatch]} { + if {!$is_sub} { + #this must be the arg that caused the match + dict set dispatch $parentname [list command [dict get $pinfo dispatch] matched $a arguments [list] raw [list]] + } else { + #todo + lappend argerrors [list unsupported_dispatch $processorname] + } + } + if {$sub_operand} { + if {[dict exists $dispatch $parentname]} { + #todo - defaults? + add_dispatch_argument "dispatch" $parentname $processorname $a + add_dispatch_raw "dispatch" $parentname $a + } else { + #warning? + #lappend argerrors [list subcommand_unable_to_add_operand $processorname] + do_debug 3 $debugc "subcommand $processorname aborting scanning because parent command wasn't activated" + break + } + } + do_debug 2 $debugc " >+++++++>++++++++>++++++++>setting $processorname [if {$is_p_flag} {list -} {}]value $a" + if {$processorname eq "tail_processor"} { + set argnum [[$objp get_map_object] argnum_from_remaining_posn $a_index] + set argname arg$argnum + lappend remaining_unflagged $argname $a + lappend unconsumed_flags_and_values $a + dict set unflagged $argname $a + } elseif {$is_p_flag} { + $objp set_matched_argument $argnum $a + if {$is_sub} { + dict set extra_flags_from_positionals $p_sub $a + } else { + dict set extra_flags_from_positionals $parentname $a + } + lappend moved_to_flagged $processorname $a + #if has dependent commands ? - check for deep subcommand match? + } else { + $objp set_matched_argument $argnum $a + #lappend positional_values $a + dict set unflagged $processorname $a + } + do_debug 4 $debugc " >________>________>________>source_values :'$source_values'" + do_debug 3 $debugc " >________>________>________>source_values len:[llength $source_values] removing element $a_index val:[lindex $source_values $a_index]" + + #---------------------------- + dict set last_p_found by $processorname + dict set last_p_found index $a_index + dict set last_p_found item $a + #------------------------------ + $objp allocate $argnum "operand" $a + set source_values [lreplace $source_values[set source_values {}] $a_index $a_index] ;#inlineK + incr values_index ;#only increment when we allocate a value to one of the members of -commandprocessors + set last_arg_was_paramflag 0 + if {$processorname ne "tail_processor"} { + #don't break until we hit an unrecognized flag or another unflagged value + incr a_index -1 + #don't increment a_index before break, because we have shortened the list by 1. + #do_debug 3 $debugc "----breaking---" + #break + } else { + #decrement to compensate for shortened list because tail_processor continues to end + incr a_index -1 + } + } + + } else { + #last_arg_was_paramflag + set lastarg [dict get $last_p_found item] + #puts stdout "+++ lastarg: $lastarg source_values: [dict get $last_p_found source_values] a_index: $a_index" + if {$processorname eq "tail_processor"} { + lappend unconsumed_flags_and_values $a + } + if {([dict get $last_p_found by] eq $processorname) && [is_this_flag_for_me $lastarg $objp $cf_args]} { + update_dispatch_argument "dispatch" $parentname $lastarg $a + add_dispatch_raw "dispatch" $parentname $a + dict set last_p_found by $processorname + dict set last_p_found index $a_index + dict set last_p_found item $a + $objp allocate $argnum "flagvalue" $a + set source_values [lreplace $source_values[set source_values {}] $a_index $a_index] ;#inlineK + incr a_index -1 + } + set last_arg_was_paramflag 0 + } + } else { + # is a flag of some sort ({!$is_args_flag && !$is_solo_flag} = false) + if {$processorname eq "tail_processor"} { + lappend unconsumed_flags_and_values $a + } + if {([dict get $last_p_found by] eq $processorname) && [is_this_flag_for_me $a $objp $cf_args]} { + if {$is_solo_flag} { + add_dispatch_argument "dispatch" $parentname $a 1 + add_dispatch_raw "dispatch" $parentname $a + set last_arg_was_solo 1 + set last_arg_was_paramflag 0 + $objp allocate $argnum "soloflag" $a + } else { + add_dispatch_argument "dispatch" $parentname $a "" + add_dispatch_raw "dispatch" $parentname $a + set last_arg_was_solo 0 + set last_arg_was_paramflag 1 + $objp allocate $argnum "flag" $a + } + dict set last_p_found by $processorname + dict set last_p_found index $a_index + dict set last_p_found item $a + do_debug 4 $debugc " >2_______>________>________>source_values :'$source_values'" + do_debug 3 $debugc " >2_______>________>________>source_values len:[llength $source_values] removing element $a_index val:[lindex $source_values $a_index]" + set source_values [lreplace $source_values[set source_values {}] $a_index $a_index] ;#inlineK + incr a_index -1 + } else { + #auto alternate based on last value.. unless end_of_options + if {!$end_of_options} { + if {$a in $solo_flags} { + set last_arg_was_solo 1 + set last_arg_was_paramflag 0 + } else { + set last_arg_was_paramflag 1 + } + } + if {$a_index eq ([llength $source_values]-1)} { + #puts "XXXXXXXXXXXXXXXXXXX $a_index source_values:'$source_values'" + #if at end of list don't retain any last..was info. + set last_arg_was_solo 0 + set last_arg_was_paramflag 0 + } + #skip - don't eat + } + } + } + incr a_index + } + + if {![$objp found_match]} { + + #after break - we have retained vars: $parent, $sub_operand $pinfo $processorname etc + #didn't find an unflagged var - set a default if one was specified. + #do nothing otherwise - check_args will determine if it was -required etc. + #review - should only apply if parent cmd found something? + if {[dict exists $pinfo default]} { + set defaultval [dict get $pinfo default] + if {$is_p_flag} { + if {$is_sub} { + dict set extra_flags_from_positionals $p_sub $defaultval + } else { + dict set extra_flags_from_positionals $processorname $defaultval + } + #lappend moved_to_flagged $processorname $defaultval + lappend implied_flagged $processorname $defaultval + do_debug 3 $debugc "SETTING DEFAULT varname:$processorname $defaultval implied_flagged: $implied_flagged " + } else { + lappend implied_unflagged $processorname $defaultval + dict set unflagged $processorname $defaultval + do_debug 3 $debugc "SETTING DEFAULT varname:$processorname $defaultval moved_to_flagged: $moved_to_flagged " + } + + if {$is_sub && !$sub_operand} { + if {[dict exists $dispatch $parentname]} { + add_dispatch_argument "dispatch" $parentname $processorname $defaultval + } else { + lappend argerrors [list subcommand_unable_to_add_default_operand $processorname $defaultval] + } + } + } + } + + if {[$objp name] eq "tail_processor"} { + $VMAP update_map_from [$objp get_map_object] + } + + if {[llength $argerrors]} { + set parsestatus "error" + #abort processing at first error - we won't be able to make sense of the remaining args anyway + #even the tail_processor won't be able to classify reliably because flag meanings depend on the configured commands + break + } + } + + #assert - should be none? + #set remaining_values [lrange $source_values $a_index end] + #do_debug 3 $debugc "-------->________>end of processing - remaining vals $remaining_values" + + do_debug 2 $debugc "========>=========>originals : $values" + do_debug 2 $debugc "[$VMAP get_map]" + do_debug 2 $debugc "========>=========>unconsumed: $unconsumed_flags_and_values" + + + + + + set all_flagged [$VMAP get_merged_flagged_by_class *] + set all_flagged_plus [concat $all_flagged $extra_flags_from_positionals] + + set all_flagged_list [$VMAP get_list_flagged_by_class *] + set all_flagged_list [concat $all_flagged_list $extra_flags_from_positionals] + + set remaining_flagged [$VMAP get_merged_flagged_by_class "unallocated"] + + set remaining_flagged_list [$VMAP get_list_flagged_by_class "unallocated"] + + + set unflagged_list_in_processing_order [dict values $unflagged] + set unflagged_list [$VMAP get_list_unflagged_by_class *] + + set unflagged_list_remaining [$VMAP get_list_unflagged_by_class "unallocated"] + + return [list \ + listremaining $unconsumed_flags_and_values \ + parseerrors $argerrors \ + parsestatus $parsestatus \ + flagged $all_flagged_plus \ + flaggedlist $all_flagged_list \ + flaggedremaining $remaining_flagged \ + flaggedlistremaining $remaining_flagged_list \ + unflagged $unflagged \ + unflaggedlist $unflagged_list \ + unflaggedremaining $remaining_unflagged \ + unflaggedlistremaining $unflagged_list_remaining \ + flaggednew $extra_flags_from_positionals \ + arglist [concat $unflagged_list_in_processing_order $all_flagged] \ + arglistremaining [concat $unflagged_list_remaining $remaining_flagged] \ + impliedflagged $implied_flagged \ + impliedunflagged $implied_unflagged \ + dispatch $dispatch \ + classifications [$VMAP get_map] \ + gridstring "\n[$VMAP grid]" \ + vmapobject "flagfilter::VMAP_$runid" \ + ] + } + + + + + + + + + + + + #specialisation for collection class to contain commandprocessors + # we expect to use only a single instance of this + oo::class create col_allprocessors { + superclass oolib::collection + variable o_commandspecs + method add_processor {p} { + my add $p [$p name] + if {[$p is_sub]} { + set parentname [$p parentname] + set obj_parent [my item $parentname] + set col_siblings [$obj_parent children] + $col_siblings add $p [$p name] + } + } + method set_commandspecs {cspecs} { + set o_commandspecs $cspecs + } + method get_commandspecs {} { + set o_commandspecs + } + #treating as singleton.. todo tidy + method name_from_record {rec} { + lassign $rec parentname pinfo + if {[dict exists $pinfo sub]} { + set name [join [list $parentname [dict get $pinfo sub]] .] + } else { + set name $parentname + } + return $name + } + method object_from_record {rec} { + set name [my name_from_record $rec] + return [my item $name] + } + #basic check if arg may consume the following one - not based on any specific info from processors + method arg_appears_standalone {f} { + if {(![string match "-*" $f]) && (![string match "/*" $f])} { + #not even flaglike + return 1 + } + if {$f in [list "-" "--"]} { + return 1 + } + } + #does any processor define it as solo + method flag_can_be_solo {f} { + foreach objp [my items] { + if {[$objp arg_is_defined_solo_to_me $f]} { + return 1 + } + } + return 0 + } + } + oo::class create col_parents { + superclass oolib::collection + method add_parent {p} { + if {[$p is_sub]} { + error "cannot add a sub-processor to the main parents collection" + } + my add $p [$p name] + } + } + #each parent processor has a children collection which can only accept processors with sub defined. + oo::class create col_childprocessors { + superclass oolib::collection + variable o_ownername + method set_owner {parentname} { + set o_ownername $parentname + } + #owner of the collection (a parent processor) + method owner {} { + return $o_ownername + } + method add_processor {p} { + if {![$p is_sub]} { + error "processor must have 'sub' element to add to the parent's collection" + } + #check name matches this parent.. + + my add $p [$p name] + } + } + + oo::class create cprocessor { + variable o_runid + variable o_name + variable o_definition + variable o_pinfo + variable o_parentname + variable o_is_sub + variable o_col_children + variable o_mashopts + variable o_singleopts + variable o_pairopts + variable o_longopts + variable o_found_match ;#we directly matched a command trigger or positional argument + variable o_matched_argument + variable o_matched_argnum + variable o_matchspec + variable o_vmap + constructor {definition runid} { + set o_vmap "" + set o_definition $definition + set o_runid $runid + if {([llength $o_definition] < 2) || ([llength [lindex $o_definition 0]] != 1)} { + error "[self class].constructor Unable to interpret definition '$o_definition'" + } + lassign $o_definition o_parentname o_pinfo + if {([llength $o_pinfo] %2) != 0} { + error "[self class].constructor second element of definition '$o_definition' not a dict" + } + set o_is_sub [dict exists $o_pinfo sub] + if {!$o_is_sub} { + set o_name $o_parentname + set o_col_children [::flagfilter::col_childprocessors new] + $o_col_children set_owner $o_name + } else { + set o_name [join [list $o_parentname [dict get $o_pinfo sub]] .] + } + if {[dict exists $o_pinfo match]} { + set o_matchspec [dict get $o_pinfo match] + } else { + set o_matchspec {^[^-^/].*} ;#match anything that isn't flaglike + } + set o_found_match 0 + set o_matched_argument "" ;#need o_found_match to differentiate match of empty string + set o_matched_argnum -1 + #load mashopts etc at construction time as they're static + set o_mashopts [list] + set o_singleopts [list] + set o_pairopts [list] + set o_longopts [list] + if {[dict exists $o_pinfo mashopts]} { + foreach m [dict get $o_pinfo mashopts] { + lappend o_mashopts $m + } + } + if {[dict exists $o_pinfo singleopts]} { + foreach s [dict get $o_pinfo singleopts] { + lappend o_singleopts $s + } + } + if {[dict exists $o_pinfo pairopts]} { + foreach po [dict get $o_pinfo pairopts] { + lappend o_pairopts $po + } + } + if {[dict exists $o_pinfo longopts]} { + foreach l [dict get $o_pinfo longopts] { + lappend o_longopts $l + } + } + } + + method name {} { + return $o_name + } + #open things up during oo transition.. + method get_def {} { + return $o_definition + } + method is_flag {} { + if {[my is_sub]} { + #sub can be a flag even if parent isn't + set subname [dict get $o_pinfo sub] + return [string match -* $subname] + } else { + return [string match -* $o_name] + } + } + method has_same_parent {other} { + return [expr {[other parentname] eq $o_parentname}] + } + method is_sub {} { + return $o_is_sub + } + + method set_map_object {map} { + set o_vmap $map + } + method get_map_object {} { + return $o_vmap + } + method allocate {argnum type val} { + if {$o_vmap eq ""} { + error "[self class].allocate ($o_name) vmap is not set." + } + $o_vmap allocate [self object] $argnum $type $val + } + + method found_match {} { + return $o_found_match + } + method matched_argument {} { + return $o_matched_argument + } + method matched_argnum {} { + return $o_matched_argnum + } + method set_matched_argument {argnum a} { + #could be empty string + if {$o_found_match} { + error "[self object].set_matched_argument processor:$o_name already found match '$o_matched_argument' - cannot set again" + } + if {![my can_match $a]} { + error "error [self class].set_matched_argument processor:$o_name cannot match '$a' (matchspec: $o_matchspec)" + } + set o_found_match 1 + set o_matched_argument $a + set o_matched_argnum $argnum + } + method has_explicit_matchspec {} { + return [dict exists $o_pinfo match] + } + method matchspec {} { + return $o_matchspec + } + method can_match {a} { + if {!$o_found_match} { + foreach m $o_matchspec { + if {[regexp -- $m $a]} { + return 1 + } + } + return 0 + } else { + return 0 + } + } + #?? + method can_allocate_flags {} { + } + + + + + + #if we are a parent - this is own name + method parentname {} { + return $o_parentname + } + method parent {} { + return [::flagfilter::obj::PARENTS_$o_runid item $o_parentname] + } + method is_parent {} { + return [expr {!$o_is_sub}] + } + method children {} { + if {!$o_is_sub} { + return $o_col_children + } else { + #raise error? + return "" + } + } + method mashopts {} { + return $o_mashopts + } + method singleopts {} { + return $o_singleopts + } + method pairopts {} { + return $o_pairopts + } + method longopts {} { + return $o_longopts + } + + #whether flag categorized as solo by this processor + method arg_is_defined_solo_to_me {a} { + if {(![string match "-*" $a]) && (![string match "/*" $a])} { + #not even flaglike + return 0 + } + if {[my can_match $a]} { + return 0 + } + if {$a in [list "-" "--"]} { + #specials not defined as solos + return 0 + } + if {$o_name eq "global"} { + + } + if {$o_name eq "tail_processor"} { + + } + if {$a in $o_singleopts} { + return 1 + } + if {"any" in $o_singleopts} { + return 1 + } + set equalposn [string first "=" $a] + if {$equalposn >=1} { + if {"any" in $o_longopts} { + return 1 + } else { + set namepart [string range $a 0 $equalposn-1] + foreach lo $o_longopts { + if {[string match "${namepart}=*" $lo]} { + return 1 + } + } + } + } + #Flag could still be part of a solo if it is in mashopts *and* has a value following it as part of the mash + #- but if it's a pairopt, but not mashable - we can rule it out now + if {($a in $o_pairopts) && ($a ni $o_mashopts)} { + return 0 + } + set flagletters [split [string range $a 1 end] ""] + set posn 1 + #trailing letters may legitimately not be in mashopts if they are part of a mashed value + #we can return 0 if we hit a non-mash flag first.. but at each mashflag we need to test if we can classify as definitely solo or not, or else keep processing + foreach l $flagletters { + if {"-$l" ni $o_mashopts} { + #presumably an ordinary flag not-known to us + return 0 + } else { + if {"-$l" in $o_pairopts} { + if {$posn == [llength $flagletters]} { + #in pairopts and mash - but no value for it in the mash - thefore not a solo + return 0 + } else { + #entire tail is the value - this letter is effectively solo + return 1 + } + } elseif {"-$l" in $o_singleopts} { + #not allowed to take a value - keep processing letters + } else { + #can take a value! but not if at very end of mash. Either way This is a solo + return 1 + } + } + } + #This object should not treat the flag as a known solo + #- so if it is allowed to consume it, it may fall back on examining the subsequent argument's flaginess(?) + return 0 + } + + + method get_opts {} { + return [list mashopts $o_mashopts singleopts $o_singleopts pairopts $o_pairopts longopts $o_longopts] + } + #include parent opts + #we use the terminology 'option' for "-" prefixed items belonging to a -commandprocessors spec as opposed to more general -flags + #Note - this may also be called on the default "tail_processor", which will return empty sets, or an overridden tail_processor which may have data + method get_combined_opts {} { + set objparent [::flagfilter::obj::PARENTS_$o_runid item $o_parentname] + set parentopts [$objparent get_opts] + set mashopts [dict get $parentopts mashopts] + set singleopts [dict get $parentopts singleopts] + set pairopts [dict get $parentopts pairopts] + set longopts [dict get $parentopts longopts] + if {[my is_sub]} { + #this spec is a sub + set subopts [my get_opts] + foreach m [dict get $subopts mashopts] { + if {$m ni $mashopts} { + lappend mashopts $m + } + } + foreach s [dict get $subopts singleopts] { + if {$s ni $singleopts} { + lappend singleopts $s + } + } + foreach po [dict get $subopts pairopts] { + if {$po ni $pairopts} { + lappend pairopts $po + } + } + foreach lo [dict get $subopts longopts] { + if {$lo ni $longopts} { + lappend longopts $lo + } + } + + } + return [list mashopts $mashopts singleopts $singleopts pairopts $pairopts longopts $longopts] + } + + } + + + + + + + + + + + + proc get_command_info {cmdname cspecs} { + foreach item $cspecs { + lassign $item cmd specinfo + if {$cmd eq $cmdname} { + if {[dict exists $specinfo dispatch]} { + return $specinfo + } + } + } + return [list] + } + #### check_flags + # does not support unvalued flags - unless explicitly specified in -soloflags (global) or in -singleopts for a commandprocessor + #e.g not supported: v1 v2 -arg1 arg1val -debug -anotherflag anotherflagval + # - unless -soloflags is something like -soloflags {-debug} or -soloflags {{-debug 1}} where 1 is the default. In this case - we can no longer support accepting a value for -soloflags - the processor will not assign it an argument from the commandline. + #e.g not supported (unless -debug in -soloflags): v1 v2 -arg1 arg1val -anotherflag anotherflagval -debug + #e.g supported: v2 v2 -arg1 arg1val -debug 1 -anotherflag anotherflagval + # supports positional arguments - but only if specified in -commandprocessors + # todo + # - supports -- for treating following arg as value even if it looks like a flag + # - supports - for reading stdin + # expects at least -values + # other options -caller -defaults -required -extras -commandprocessors + # -soloflags (these are flags that *must* be solo - ie they cannot take an argument ) if no default specified they are boolean defaulting to 1, repeated instances in -values will be appended to a list. + # The only flag that can be a mix of solo or not, is the very last flag in the values list. In this case it must not be in the -soloflags list, but it will default to a boolean 1 to indicate presence. + proc check_flags {args} { + set runid [flagfilter::get_new_runid] + #################################################### + #puts "Entered checkflags, args $args" + set distanceToTop [info level] + set callerlist [list] + set was_dispatched_by_another 0 ;#used to + for {set i 1} {$i < $distanceToTop} {incr i} { + set callerlevel [expr {$distanceToTop - $i}] + set callerinfo [info level $callerlevel] + set firstword [lindex $callerinfo 0] + if {[string match "*check_flags*" $firstword]} { + set was_dispatched_by_another 1 + } + lappend callerlist $firstword + } + #puts stdout "callerlist: $callerlist" + + #first handle args for check_flags itself + if {[catch {lindex [info level -1] 0} caller]} { + set caller "" + } + #puts stderr ">>>>check_flags caller $caller" + get_one_paired_flag_value {-x 1} -x ;# + + #manually check for -caller even if unbalanced args + #we only need to use get_one_paired_flag_value because we haven't yet checked args is a properly formed paired list and if -caller is present we want to use it for clearer error messages. + #use normal dict operations to retrieve other flags. + #if failed to retrieve.. fall through to checks below + if {![catch {get_one_paired_flag_value $args -caller} flag_value_result]} { + set caller $flag_value_result + } + #puts stderr ">>>>check_flags caller $caller" + + + + + set cf_defaults [dict create] + dict set cf_defaults -caller $caller + dict set cf_defaults -return [list arglistremaining] + dict set cf_defaults -match [list] + dict set cf_defaults -commandprocessors [list] + dict set cf_defaults -soloflags [list] + dict set cf_defaults -extras [list] + dict set cf_defaults -defaults [list] + dict set cf_defaults -required [list] + dict set cf_defaults -values \uFFFF + dict set cf_defaults -debugargs 0 + dict set cf_defaults -debugargsonerror 1 ;#error level to use when dispatch error occurs.. will not set lower than -debugargs + + + + if {([llength $args] % 2) != 0} { + do_error "check_flags error when called from '$caller' :check_flags must be called with even number of arguments of form: -flag value Valid flags are: '[dict keys $cf_defaults]' \n got: $args" + } + set cf_invalid_flags [list] + foreach k [dict keys $args] { + if {$k ni [dict keys $cf_defaults]} { + lappend cf_invalid_flags $k + } + } + if {[llength $cf_invalid_flags]} { + do_error "check_flags error when called from ${caller}: Unknown or incompatible option(s)'$cf_invalid_flags': must be one of '[dict keys $cf_defaults]' \nIf calling check_flags directly, put args being checked in -values e.g -values [list {*}$cf_invalid_flags]" + } + + + set cf_args [dict merge $cf_defaults $args] + unset args + #################################################### + #now look at -values etc that check_flags is checking + + set caller [dict get $cf_args -caller] + + set debugargs [dict get $cf_args -debugargs] + dict set debugc -debugargs [dict get $cf_args -debugargs] + dict set debugc -source "check_flags $caller" + do_debug 1 $debugc "DEBUG-START $caller" + + set returnkey [dict get $cf_args -return] + set defaults [dict get $cf_args -defaults] + if {([llength $defaults] % 2) != 0} { + do_error "check_flags error when called from '$caller' :-defaults must be a list containing an even number of arguments of form: -flag value'" + } + set required [dict get $cf_args -required] + + + set acceptextra [dict get $cf_args -extras] + + set supplied [string trim [dict get $cf_args -values]] + set soloflags [dict get $cf_args -soloflags] ;#By their nature - solo flags are unlikely to be automatically 'required' - review + set solos_with_defaults [list] + foreach solo_spec $soloflags { + if {[llength $solo_spec] == 1} { + lappend solos_with_defaults $solo_spec 1 + } else { + lappend solos_with_defaults [lindex $solo_spec 0] [lindex $solo_spec 1] + } + + } + + if {$debugargs >= 3} { + set prefix "| $caller>" + puts -nonewline stderr "$prefix [string repeat - 30]\n" + puts -nonewline stderr "$prefix input\n" + puts -nonewline stderr "$prefix [string repeat - 30]\n" + #puts stderr "$caller $cf_args" + dict for {k v} $cf_args { + if {$k ne "-commandprocessors"} { + puts -nonewline stderr "$prefix \[$k\]\n" + puts -nonewline stderr "$prefix $v\n" + } + } + if {$debugargs >=4} { + puts -nonewline stderr "$prefix \[-commandprocessors\]\n" + foreach record [dict get $cf_args -commandprocessors] { + puts -nonewline stderr "$prefix $record\n" + } + } + puts -nonewline stderr "$prefix [string repeat - 30]\n" + #dict for {key val} $cf_args { + # puts stderr " $key" + # puts stderr " $val" + #} + } + + + ################################################################################################## + # allocate_arguments does the main work of processing non-flagged items in the main supplied argument list into flagged versions depending on the specs in -commandprocessors + # It sets defaults only for those arguments processed by a '-commandprocessors' spec. + # We must supply it with the -soloflags info because the solo flags affect what is considered an operand. + set command_specs [dict get $cf_args -commandprocessors] ;#may be empty list - that's ok - it will still populate the 'flagged' and 'arglist' return-dict members. + + #some of these are keys returned by allocate_arguments + # - some (e.g supplied) are added by check_flags + # This list is the list of -return values that can be used with check_args + set flaginfo_returns [list \ + parseerrors \ + parsestatus \ + flagged \ + flaggedremaining \ + flaggednew \ + unflagged \ + unflaggedremaining \ + unflaggedlistremaining \ + listremaining \ + arglist \ + arglistremaining \ + impliedunflagged \ + impliedflagged \ + classifications \ + gridstring \ + ranges \ + dispatch \ + dispatchstatuslist \ + dispatchresultlist \ + dispatchstatus \ + supplied \ + defaults \ + status \ + vmapobject \ + ] + + set PROCESSORS [col_allprocessors create ::flagfilter::obj::PROCESSORS_$runid] + set PARENTS [col_parents create ::flagfilter::obj::PARENTS_$runid] + + # + #set command_specs [concat [list {global {}}] $command_specs] + lappend command_specs {tail_processor {}} + + foreach cspec $command_specs { + set obj [cprocessor new $cspec $runid] ;#runid gives access to the context-objects PROCESSORS_runid & PARENTS_runid + if {[$obj is_parent]} { + $PARENTS add_parent $obj + } + #do_debug 1 $debugc "CONFIGURING OBJECT for commandprocessor [$obj name]" + $PROCESSORS add_processor $obj + } + do_debug 1 $debugc "ADDED [$PROCESSORS count] processors to main commandprocessor collection" + do_debug 1 $debugc "ADDED [$PARENTS count] processors to the parents collection" + $PROCESSORS set_commandspecs $command_specs + + #allocate_arguments uses the PROCESSORS object + set processed_arguments [allocate_arguments $PROCESSORS $solos_with_defaults $supplied $cf_args $caller] + #set processed_arguments [allocate_arguments {} $supplied] + + set newly_flagged_positionals [dict get $processed_arguments flaggednew] + set unflaggedremaining [dict get $processed_arguments unflaggedremaining] + set unflaggedlistremaining [dict get $processed_arguments unflaggedlistremaining] + set dispatch [dict get $processed_arguments dispatch] + set flaggedremaining [dict get $processed_arguments flaggedremaining] + set RETURNED_VMAP [dict get $processed_arguments vmapobject] + + + + if {$debugargs >= 3} { + set prefix "| $caller>" + puts -nonewline stderr "$prefix [string repeat - 30]\n" + puts -nonewline stderr "$prefix output\n" + puts -nonewline stderr "$prefix [string repeat - 30]\n" + #puts stderr "processed_arguments: $processed_arguments" + dict for {key val} $processed_arguments { + puts -nonewline stderr "$prefix $key\n" + puts -nonewline stderr "$prefix $val\n" + } + puts -nonewline stderr "$prefix [string repeat - 30]\n" + } + + ################################################################################################## + + + + + + if {![llength $newly_flagged_positionals]} { + if {($supplied eq "\uFFFF") || ![llength $supplied]} { + #do_error "check_flags error when called from ${caller}: missing or empty -values" + } + } + + #probably not something to enforce... we might pass on unbalanced lists to other check_args etc. + #if {([llength $supplied] % 2) != 0} { + # do_error "${caller}: Error. $caller must be called with even number of arguments of form: -flag value Valid flags are: '[dict keys $defaults]'\n received values: $supplied" + #} + + + + set new_arg_list [dict get $processed_arguments arglistremaining] + set flagged_list [dict get $processed_arguments flagged] + #set suppliedkeys_with_extrakeys [concat [dict keys $supplied] [dict keys $newly_flagged_positionals]] + #puts stdout "suppliedkeys and new keys: $suppliedkeys_with_extrakeys" + + #todo - add flaggednew to required if all was specified? + #check invalid flags if not indicated in -extras , either explicitly or with 'extra' + set flags_from_required [get_flagged_only $required {}] + set known_flags [lsort -unique -nocase [concat [dict keys $defaults] $flags_from_required $soloflags]] + foreach spec $command_specs { + lassign $spec parentname pinfo + if {[string match -* $parentname]} { + lappend known_flags $parentname + } + if {[dict exists $pinfo sub]} { + if {[string match -* [dict get $pinfo sub]]} { + lappend known_flags [dict get $pinfo sub] + } + } + } + do_debug 2 $debugc "------------------->known_flags: $known_flags soloflags:$soloflags" + set invalid_flags [list] + if {"all" ni [string tolower $acceptextra]} { + if {"none" in [string tolower $acceptextra]} { + set ok_extras [list] + } elseif {[llength $acceptextra]} { + set ok_extras $acceptextra + } + #todo + #puts stderr " check_flags - temporary disable of checking for invalid flags" + set pairflagged $flagged_list + foreach {f v} $pairflagged { + if {$f ni $acceptextra} { + if {$f ni $known_flags} { + lappend invalid_flags $f + } + } + } + } + if {[llength $invalid_flags]} { + do_error "check_flags $caller error when called from ${caller}: unknown flags '$invalid_flags'" + } + + set calc_required [list] + set keywords_in_required [lsearch -inline -all -not $required -*] + set bad_keywords_in_required [lsearch -regexp -nocase -all -inline -not $keywords_in_required "all|none"] + if {[llength $bad_keywords_in_required]} { + do_error "check_flags error when called from ${caller}: bad flags in '-required' it must be a list of flags of the form -flagname or ONLY one of the keywords 'none' or 'all'" + } + #keywords_in_required now known to be only comprised of (possibly case variant) values of all|none + if {[llength $keywords_in_required] > 1} { + do_error "check_flags error when called from ${caller}: specifying both 'none' and 'all' in -required is not valid, and repeated values are not valid." + } + if {"none" eq [string tolower [lindex $keywords_in_required 0]]} { + set calc_required [list] + } + set flags [lsearch -inline -all $required -*] + + if {[llength $required]} { + if {[lsearch -nocase $keywords_in_required "all"] >= 0} { + #'all' can be present with other flags - and indicates we also require all the flags from -defaults + foreach k [dict keys $defaults] { + if {$k ni $calc_required} { + lappend calc_required $k + } + } + } + } + + set classifications [dict get $processed_arguments classifications] ;#assert - ordered by numerically increasing key representing positions in supplied argument list + set rangesets [$RETURNED_VMAP get_ranges_from_classifications $classifications] + set ranges [dict get $rangesets -ranges] + set rangesbytype [dict get $rangesets -rangesbytype] ;#unallocated are split into flag,operand and endofoptions - further splitting is easy enough to do by looking up the classifications list for each position in the supplied arg list. + #tailflags are the same for all dispatch items + set tailflagspaired [tailflagspaired $defaults $supplied $classifications $rangesbytype] + + + set dict_supplied [dict create supplied $supplied] + set dict_defaults [dict create defaults $defaults] + set dict_ranges [dict create ranges $ranges] + set dict_rangesbytype [dict create rangesbytype $rangesbytype] + set raise_dispatch_error_instead_of_return "" + set dict_dispatch_results [list dispatchstatuslist [list] dispatchresultlist [list] dispatchstatus "ok"] + #todo - only dispatch if no unallocated args (must get tail_processor to allocate known flags to 'global') + if {[llength $dispatch]} { + set dispatchstatuslist [list] + set dispatchresultlist [list] + set dispatchstatus "ok" + #each dispatch entry is a commandname and dict + #set dispatchrecord [lrange $dispatch 0 1] + foreach {parentname dispatchrecord} $dispatch { + set commandinfo [get_command_info $parentname $command_specs] + + do_debug 1 $debugc ">>>>>DISPATCHRECORD: $dispatchrecord" + + # e.g lscmd lscmd natsortcommandline_ls lscmd.dir x + + do_debug 2 $debugc "commandinfo for $parentname: $commandinfo" + set command [dict get $dispatchrecord command] + #support for %x% placeholders in dispatchrecord command + set command [string map [list %match% %matched%] $command] ;#alias + set command [string map [list %matched% [dict get $dispatchrecord matched]] $command] + set argvals [dict get $dispatchrecord arguments] + set matched_operands [list] + set matched_opts [list] + set matched_in_order [list] + set prefix "${parentname}." + foreach {k v} $argvals { + #puts "$$$$ $k" + if {[string equal -length [string length $prefix] $prefix $k]} { + #key is prefixed with "commandname." + set k [string replace $k 0 [string length $prefix]-1] + } + #todo - -- ? + if {[string match -* $k]} { + lappend matched_opts $k $v + lappend matched_in_order $k $v + } else { + set kparts [split $k .] + lappend matched_operands $v + lappend matched_in_order $v + } + } + + if {![dict exists $commandinfo dispatchtype]} { + set dispatchtype tcl + } else { + set dispatchtype [dict get $commandinfo dispatchtype] + } + if {![dict exists $commandinfo dispatchglobal]} { + if {$dispatchtype eq "tcl"} { + set dispatchglobal 1 + } else { + set dispatchglobal 0 + } + } else { + set dispatchglobal [dict get $commandinfo dispatchglobal] + } + #generally we only want to dispatch remaining flagged, and only at the tail end.(as opposed to flags occurring between command groups) + # -It doesn't usually make much sense to dispatch remaining unflagged items, and it would be rare to require flags occurring before the command. + #however - there are potential commands such as help, dryrun or maybe an analysis command that may need to see unconsumed operands or even look 'back' at prior items + ##update 2023-03 - we definitely want to look back to prior non-matches when we match on a script e.g tclsh8.6 -someflag etc xxx.tcl scriptarg1 -etc + # if we match and dispatch on *.tcl - then we may need 'tclsh8.6 -someflag etc' as the interpreter (possibly with arguments) to use. + # we may need a 'script' dispatchtype (as well as the option to just pass these prior arguments as additional options for some other dispatchtypes) + # + # todo - add supported dispatchglobal values such as all, pre, post, allpre, allpost, and classifications + # where pre & post are only those occurring directly before and after the command and its args, i.e not extending beyond any prior or subsequent other command. + # classifications would be flagged as -classifications $classifications whereas pre and post would be added directly if specified singly, or flagged with -pre, -post etc if multiple are specified + # Those beginning with 'all' should also be wrapped in flags, because potentially they come from disjointed sections of the argumentlist + # - and we generally shouldn't supply arguments next to each other that weren't contiguous in the original list + # The 1,true,yes,tailflagspaired value is designed for the usecase where a common set of tail flags e.g -debug can apply to any commands matched by the filter. + # tail = all unallocated args after final command, including operands and end-of-options '--' (todo) + # tailflags = all unallocated *contiguous* flags after the final command and final operands. (ie it will deliberately miss flags following last command if there is a later operand) (todo) + # tailflagspaired = same as tailflags, but any solo-flags are defaulted to 1 (flags not merged, so there might be duplicate keys) so that it's a fully paired list + # In other situations - post may make sense to get the very next set of unconsumed arguments. + if {[string tolower $dispatchglobal] in [list 1 true yes tailflagspaired]} { + set command_range_posn [lsearch -index 1 $ranges $parentname] + set extraflags $tailflagspaired + } else { + set extraflags [list] + } + + #jn concat allows $command to itself be a list + ##tcl dispatchtype + dict set dispatchrecord dispatchtype $dispatchtype + if {$dispatchtype eq "tcl"} { + do_debug 1 $debugc "DISPATCHING with tcl arg order: $command $matched_operands $matched_opts $extraflags" + #set commandline [list $command {*}$matched_operands {*}$matched_opts {*}$extraflags] + set commandline [concat $command $matched_operands $matched_opts $extraflags] + } elseif {$dispatchtype eq "raw"} { + do_debug 1 $debugc "DISPATCHING with raw args : $command [dict get $dispatchrecord raw]" + #set commandline [list $command {*}[dict get $dispatchrecord raw] {*}$extraflags] + set commandline [concat $command [dict get $dispatchrecord raw] $extraflags] + } elseif {$dispatchtype eq "shell"} { + do_debug 1 $debugc "DISPATCHING with shell args : $command [dict get $dispatchrecord raw]" + #assume the shell arguments are in one quoted string? + set commandline [concat $command [list [dict get $dispatchrecord raw]] $extraflags] + } else { + #non quoted shell? raw + defaults? + do_debug 1 $debugc "DISPATCHING with given arg order: $command $matched_in_order $extraflags" + #set commandline [list $command {*}$matched_in_order {*}$extraflags] + set commandline [concat $command $matched_in_order $extraflags] + } + + dict set dispatchrecord asdispatched $commandline + set dispatchresult "" + set dispatcherror "" + if {![catch {{*}$commandline} cmdresult]} { + set dispatchresult $cmdresult + lappend dispatchstatuslist [list status ok cmd $parentname outputlength [string length $cmdresult]] + lappend dispatchresultlist $cmdresult + } else { + set dispatchstatus "error" + set dispatcherror $cmdresult + #don't add to dispatchresultlist + lappend dispatchstatuslist [list status err cmd $parentname outputlength 0 error $cmdresult] + if {!$was_dispatched_by_another} { + #this is the first (or a direct) call to check_flags - so make sure error gets raised in this proc rather than just storing the error in the data and returning + set raise_dispatch_error_instead_of_return "dispatchstatuslist:\n[join $dispatchstatuslist \n]" + dict set dispatchrecord result $dispatchresult + dict set dispatchrecord error $dispatcherror + dict set dispatch $parentname $dispatchrecord + + break + #return -code error "check_flags error during command dispatch:\n$cmdresult" + } + #we've been dispatched from another check_flags - so ok to propagate the error up via the dispatchrecord/dispatchstatuslist + } + dict set dispatchrecord result $dispatchresult + dict set dispatchrecord error $dispatcherror + dict set dispatch $parentname $dispatchrecord + } + + set dict_dispatch_results [list dispatchstatuslist $dispatchstatuslist dispatchresultlist $dispatchresultlist dispatchstatus $dispatchstatus] + } + #end llength $dispatch + + + set combined [dict merge $dict_defaults $dict_supplied $processed_arguments $dict_ranges $dict_rangesbytype $dict_dispatch_results] + dict set combined dispatch $dispatch ;#update with asdispatched info + if {([dict get $combined parsestatus] eq "ok") && ([dict get $combined dispatchstatus] eq "ok")} { + dict set combined status "ok" + } else { + dict set combined status "error" + } + do_debug 1 $debugc "COMBINED:$combined" + + + set returnkey [string tolower $returnkey] + if {"all" in $returnkey} { + set returnval $combined + #set returnval [dict merge $combined $dict_dispatch_results] + } else { + if {[llength $returnkey] == 1} { + set invalid 0 + #todo - support multiple merge? + set right "" + if {[regexp -all {\|} $returnkey] == 1} { + lassign [split $returnkey |] left right + set joinparts [split $left ,] + } else { + set joinparts [split $returnkey ,] + } + foreach j [concat $joinparts $right] { + if {$j ni $flaginfo_returns} { + set invalid 1 + } + } + set returnval [list] + if {!$invalid} { + foreach j $joinparts { + lappend returnval {*}[dict get $combined $j] + } + if {[string length $right]} { + set returnval [dict merge $returnval $defaults $returnval] + } + } else { + set returnval [list callerrors [list "-return '$returnkey' not valid"]] + } + } else { + set callerrors [list] + set returnval [dict create] + foreach rk $returnkey { + if {$returnkey in $flaginfo_returns} { + dict set returnval $rk [dict get $combined $returnkey] + } else { + lappend callerrors [list "-return '$returnkey' not valid"] + } + } + if {[llength $callerrors]} { + dict set returnval callerrors $callerrors + } + } + } + + do_debug 1 $debugc "[string repeat = 40]" + do_debug 1 $debugc "dispatch_results: $dict_dispatch_results" + do_debug 1 $debugc "[string repeat - 40]" + + if {[string length $raise_dispatch_error_instead_of_return]} { + set errdebug [dict get $cf_args -debugargsonerror] + if {$errdebug > [dict get $cf_args -debugargs]} { + dict set debugc -debugargs $errdebug + } + } + + set debuglevel_return 2 + set debugdict [concat {*}[lmap k [dict keys $combined] {list $k $debuglevel_return}]] ;#create a dict of keys from combined, all defaulted to $debuglevel_return + if {[llength [dict get $combined parseerrors]]} { + dict set debugdict "parseerrors" 0 + } else { + dict set debugdict "parseerrors" 2 + } + dict set debugdict "defaults" 1 + dict set debugdict "supplied" 1 + dict set debugdict "dispatch" 1 + dict set debugdict "ranges" 1 + dict set debugdict "rangesbytype" 1 + dict set debugdict "dispatchstatus" 1 + if {[dict get $combined "status"] eq "ok"} { + dict set debugdict "status" 1 + } else { + dict set debugdict "status" 0 + } + + do_debug 1 $debugc "returning '$returnkey'" + do_debug 1 $debugc "returnval '$returnval'" + if {([llength $returnval] % 2) == 0} { + do_debug 1 $debugc "returnkeys '[dict keys $returnval]'" + } + do_debug 1 $debugc "[string repeat = 40]" + foreach {k v} $combined { + set dlev [dict get $debugdict $k] + if {$k eq "dispatch"} { + set col1 [string repeat " " 12] + #process as paired list rather than dict (support repeated commands) + set i 0 + foreach {cmdname cmdinfo} $v { + set field1 [string repeat " " [expr {[string length $cmdname]}]] + set col2_dispatch [string repeat " " [expr {[string length $cmdname] + 15}]] + set j 0 + foreach {ckey cval} $cmdinfo { + + if {$i == 0 && $j == 0} { + set c1 [overtype::left $col1 "dispatch"] + } else { + set c1 [overtype::left $col1 { ... }] + } + + if {$j == 0} { + set f1 [overtype::left $field1 $cmdname] + set c2 [overtype::left $col2_dispatch "$f1 $ckey"] + } else { + set f1 [overtype::left $field1 ...] + set c2 [overtype::left $col2_dispatch "$f1 $ckey"] + } + #leave at debug level 1 - because dispatch is generally important + do_debug $dlev $debugc "${c1}${c2} $cval" + + incr j + } + incr i + } + + #do_debug 1 $debugc "[overtype::left $col1 $k] [lindex $v 0] [list [lindex $v 1]]" + #foreach {nm rem} [lrange $v 2 end] { + # do_debug 1 $debugc "[overtype::left $col1 { ... }] $nm [list $rem]" + #} + } elseif {$k eq "dispatchresultlist"} { + set col1 [string repeat " " 25] + set i 0 + foreach dresult $v { + if {$i == 0} { + set c1 [overtype::left $col1 $k] + } else { + set c1 [overtype::left $col1 { ... }] + } + do_debug $dlev $debugc "$c1 $dresult" + incr i + } + } elseif {$k eq "classifications"} { + set col1 [string repeat " " 25] + set len [dict size $v] + if {$len == 0} { + do_debug $dlev $debugc "[overtype::left $col1 $k]" + continue + } + set max [expr {$len -1}] + set numlines [expr $len / 3 + 1] + if {($len % 3) == 0} { + incr numlines -1 + } + set j 0 + for {set ln 0} {$ln < $numlines} {incr ln} { + if {$ln == 0} { + set c1 "[overtype::left $col1 $k]" + } else { + set c1 "[overtype::left $col1 { ... }]" + } + set line "" + for {set col 0} {$col < 3} {incr col} { + if {$j <= $max} { + append line "$j [list [dict get $v $j]] " + } + incr j + } + do_debug $dlev $debugc "$c1 [string trim $line]" + } + } elseif {$k eq "gridstring"} { + set col1 [string repeat " " 25] + set i 0 + foreach ln [split $v \n] { + if {$i == 0} { + set c1 [overtype::left $col1 $k] + } else { + set c1 [overtype::left $col1 { ... }] + } + do_debug $dlev $debugc "$c1 $ln" + incr i + } + + } else { + set col1 [string repeat " " 25] + do_debug $dlev $debugc "[overtype::left $col1 $k] $v" + } + } + do_debug 1 $debugc "[string repeat = 40]" + do_debug 1 $debugc "DEBUG-END $caller" + if {[string length $raise_dispatch_error_instead_of_return]} { + return -code error $raise_dispatch_error_instead_of_return + } + + + return $returnval + } + + proc tailflagspaired {defaults supplied classifications rangesbytype} { + lassign [lindex $rangesbytype end] c tp a b + if {($c eq "unallocated") && ($tp eq "flagtype")} { + set tail_unallocated [lrange $supplied $a $b] + } else { + set tail_unallocated [list] + } + set extraflags [list] + #set extraflags [dict_merge_ordered $defaults $tail_unallocated] + #dict merge based operation can't work if there are solo_flags + if {[llength $tail_unallocated]} { + for {set i $a} {$i <=$b} {incr i} { + set arginfo [dict get $classifications $i] + lassign $arginfo class ftype v + if {$ftype eq "flag"} { + lappend extraflags $v + } + if {$ftype eq "soloflag"} { + lappend extraflags $v + if {[dict exists $defaults $v]} { + lappend extraflags [dict get $defaults $v] + } else { + lappend extraflags 1 + } + } + if {$ftype eq "flagvalue"} { + lappend extraflags $v + } + } + foreach {k v} [dict get $defaults] { + if {$k ni $extraflags} { + lappend extraflags $k $v + } + } + } else { + set extraflags $defaults + } + return $extraflags + } + + proc tailflagspaired1 {defaults supplied classifications rangesbytype} { + lassign [lindex $rangesbytype end] c tp a b + if {($c eq "unallocated") && ($tp eq "flagtype")} { + set tail_unallocated [lrange $supplied $a $b] + } else { + set tail_unallocated [list] + } + #set all_post_unallocated_ranges [lsearch -all -inline -index 0 [lrange $rangesbytype $command_range_posn end] "unallocated"] + + set extraflags [list] + + #set extraflags [dict_merge_ordered $defaults $tail_unallocated] + #dict merge based operation can't work if there are solo_flags with no value set + if {[llength $tail_unallocated]} { + for {set i $a} {$i <=$b} {incr i} { + set arginfo [dict get $classifications $i] + lassign $arginfo class ftype v + if {$ftype eq "flag"} { + lappend extraflags $v + } + if {$ftype eq "soloflag"} { + lappend extraflags $v + if {[dict exists $defaults $v]} { + lappend extraflags [dict get $defaults $v] + } else { + lappend extraflags 1 + } + } + if {$ftype eq "flagvalue"} { + lappend extraflags $v + } + } + foreach {k v} [dict get $defaults] { + if {$k ni $extraflags} { + lappend extraflags $k $v + } + } + } else { + set extraflags $defaults + } + + } + + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +namespace eval flagfilter { + + #The standard dict merge accepts multiple dicts with values from dicts to the right taking precedence. + #When merging with a dict of default values - this means that any default key/vals that weren't in the main dict appear in the output before the main data. + #This function merges maintaining the key order of main followed by defaults. + proc dict_merge_ordered {defaults main} { + set keys [dict keys $main] + dict for {k v} $defaults { + if {$k ni $keys} { + lappend keys $k + } + } + #use normal merge mechanism - but then pick out values using our ordered key list + set combined_values [dict merge $defaults $main] + set merged [list] + foreach k $keys { + lappend merged $k [dict get $combined_values $k] + } + return $merged + } + + + + #retrieve *only* names that are dependant on the provided namekey - not the key itself + # (query is sorted by the trailing numerical index which represents order the arguments were processed) + proc flag_array_get_sorted_subs {arrname sep namekey} { + upvar $arrname arr + set allsubs [array names arr ${namekey}.*${sep}name,*] + set rnames [lmap nm $allsubs {string reverse $nm}] + set sorted_rnames [lsort -dictionary $rnames] + set ordered [lmap nm $sorted_rnames {string reverse $nm}] + return $ordered + } + + proc flag_array_get_sorted_siblings {arrname sep namekey} { + #determine parent by looking at dot - but confirm parent name is in array. + + } + + + + #dictionary based lsort of reversed names which are presumed to have a trailing separator of some sort and a number e.g: name,0 name,1 ... name,10 etc. + #use -dictionary to ensure embedded numbers are sorted as integers + proc array_names_sorted_by_tail {arrname nameglob} { + upvar $arrname arr + set matched_names [array names arr $nameglob] + set rnames [lmap nm $matched_names {string reverse $nm}] + set sorted_rnames [lsort -dictionary $rnames] + return [lmap nm $sorted_rnames {string reverse $nm}] + } + + +} + + + + + diff --git a/src/modules/overtype-1.3.tm b/src/modules/overtype-1.3.tm new file mode 100644 index 00000000..ca3748b5 --- /dev/null +++ b/src/modules/overtype-1.3.tm @@ -0,0 +1,157 @@ + +package provide [lassign {overtype 1.3} pkg ver]$pkg [namespace eval $pkg[set pkg {}] {list [variable version $ver[set ver {}]]$version}] + +#Julian Noble - 2003 +#Released under standard 'BSD license' conditions. +# +#todo - ellipsis truncation indicator for center,right + + +namespace eval overtype { + namespace export * +} +proc overtype::about {} { + return "Simple text formatting. Author JMN. BSD-License" +} + + +proc overtype::left {args} { + # @c overtype starting at left (overstrike) + # @c can/should we use something like this?: 'format "%-*s" $len $overtext + + if {[llength $args] < 2} { + error {usage: ?-overflow [1|0]? ?-ellipsis [1|0]? ?-ellipsistext ...? undertext overtext} + } + foreach {undertext overtext} [lrange $args end-1 end] break + + set opt(-ellipsis) 0 + set opt(-ellipsistext) {...} + set opt(-overflow) 0 + array set opt [lrange $args 0 end-2] + + + set len [string length $undertext] + set overlen [string length $overtext] + set diff [expr {$overlen - $len}] + if {$diff > 0} { + if {$opt(-overflow)} { + return $overtext + } else { + if {$opt(-ellipsis)} { + return [overtype::right [string range $overtext 0 [expr {$len -1}]] $opt(-ellipsistext)] + } else { + return [string range $overtext 0 [expr {$len -1}]] + } + } + } else { + + return "$overtext[string range $undertext $overlen end]" + } +} + +# test - use more tcl8.5 features. +proc overtype::left2 {args} { + # @c overtype starting at left (overstrike) + # @c can/should we use something like this?: 'format "%-*s" $len $overtext + + if {[llength $args] < 2} { + error {usage: ?-overflow [1|0]? ?-ellipsis [1|0]? ?-ellipsistext ...? undertext overtext} + } + foreach {undertext overtext} [lrange $args end-1 end] break + + set opt(-ellipsis) 0 + set opt(-ellipsistext) {...} + set opt(-overflow) 0 + array set opt [lrange $args 0 end-2] + + + set len [string length $undertext] + set overlen [string length $overtext] + set diff [expr {$overlen - $len}] + if {$diff > 0} { + if {$opt(-overflow)} { + return $overtext + } else { + if {$opt(-ellipsis)} { + return [overtype::right [string range $overtext 0 $len-1] $opt(-ellipsistext)] + } else { + return [string range $overtext 0 $len-1 ] + } + } + } else { + #return "$overtext[string range $undertext $overlen end]" + return [string replace $undertext 0 $overlen-1 $overtext] + } +} +proc overtype::centre {args} { + if {[llength $args] < 2} { + error {usage: ?-bias [left|right]? ?-overflow [1|0]? undertext overtext} + } + foreach {undertext overtext} [lrange $args end-1 end] break + + set opt(-bias) left + set opt(-overflow) 0 + array set opt [lrange $args 0 end-2] + + + set olen [string length $overtext] + set ulen [string length $undertext] + set diff [expr {$ulen - $olen}] + if {$diff > 0} { + set half [expr {round(int($diff / 2))}] + if {[string match right $opt(-bias)]} { + if {[expr {2 * $half}] < $diff} { + incr half + } + } + + set rhs [expr {$diff - $half - 1}] + set lhs [expr {$half - 1}] + + set a [string range $undertext 0 $lhs] + set b $overtext + set c [string range $undertext end-$rhs end] + return $a$b$c + } else { + if {$diff < 0} { + if {$opt(-overflow)} { + return $overtext + } else { + return [string range $overtext 0 [expr {$ulen - 1}]] + } + } else { + return $overtext + } + } +} + +proc overtype::right {args} { + # @d !todo - implement overflow, length checks etc + + if {[llength $args] < 2} { + error {usage: ?-overflow [1|0]? undertext overtext} + } + foreach {undertext overtext} [lrange $args end-1 end] break + + set opt(-overflow) 0 + array set opt [lrange $args 0 end-2] + + + set olen [string length $overtext] + set ulen [string length $undertext] + + if {$opt(-overflow)} { + return [string range $undertext 0 end-$olen]$overtext + } else { + if {$olen > $ulen} { + set diff [expr {$olen - $ulen}] + return [string range $undertext 0 end-$olen][string range $overtext 0 end-$diff] + } else { + return [string range $undertext 0 end-$olen]$overtext + } + } +} + +namespace eval overtype { + interp alias {} ::overtype::center {} ::overtype::centre +} diff --git a/src/modules/platform-1.0.17.tm b/src/modules/platform-1.0.17.tm new file mode 100644 index 00000000..e01334ec --- /dev/null +++ b/src/modules/platform-1.0.17.tm @@ -0,0 +1,428 @@ +# -*- tcl -*- +# ### ### ### ######### ######### ######### +## Overview + +# Heuristics to assemble a platform identifier from publicly available +# information. The identifier describes the platform of the currently +# running tcl shell. This is a mixture of the runtime environment and +# of build-time properties of the executable itself. +# +# Examples: +# <1> A tcl shell executing on a x86_64 processor, but having a +# wordsize of 4 was compiled for the x86 environment, i.e. 32 +# bit, and loaded packages have to match that, and not the +# actual cpu. +# +# <2> The hp/solaris 32/64 bit builds of the core cannot be +# distinguished by looking at tcl_platform. As packages have to +# match the 32/64 information we have to look in more places. In +# this case we inspect the executable itself (magic numbers, +# i.e. fileutil::magic::filetype). +# +# The basic information used comes out of the 'os' and 'machine' +# entries of the 'tcl_platform' array. A number of general and +# os/machine specific transformation are applied to get a canonical +# result. +# +# General +# Only the first element of 'os' is used - we don't care whether we +# are on "Windows NT" or "Windows XP" or whatever. +# +# Machine specific +# % amd64 -> x86_64 +# % arm* -> arm +# % sun4* -> sparc +# % ia32* -> ix86 +# % intel -> ix86 +# % i*86* -> ix86 +# % Power* -> powerpc +# % x86_64 + wordSize 4 => x86 code +# +# OS specific +# % AIX are always powerpc machines +# % HP-UX 9000/800 etc means parisc +# % linux has to take glibc version into account +# % sunos -> solaris, and keep version number +# +# NOTE: A platform like linux glibc 2.3, which can use glibc 2.2 stuff +# has to provide all possible allowed platform identifiers when +# searching search. Ditto a solaris 2.8 platform can use solaris 2.6 +# packages. Etc. This is handled by the other procedure, see below. + +# ### ### ### ######### ######### ######### +## Requirements + +namespace eval ::platform {} + +# ### ### ### ######### ######### ######### +## Implementation + +# -- platform::generic +# +# Assembles an identifier for the generic platform. It leaves out +# details like kernel version, libc version, etc. + +proc ::platform::generic {} { + global tcl_platform + + set plat [string tolower [lindex $tcl_platform(os) 0]] + set cpu $tcl_platform(machine) + + switch -glob -- $cpu { + sun4* { + set cpu sparc + } + intel - + ia32* - + i*86* { + set cpu ix86 + } + x86_64 { + if {$tcl_platform(wordSize) == 4} { + # See Example <1> at the top of this file. + set cpu ix86 + } + } + ppc - + "Power*" { + set cpu powerpc + } + "arm*" { + set cpu arm + } + ia64 { + if {$tcl_platform(wordSize) == 4} { + append cpu _32 + } + } + } + + switch -glob -- $plat { + windows { + if {$tcl_platform(platform) == "unix"} { + set plat cygwin + } else { + set plat win32 + } + if {$cpu eq "amd64"} { + # Do not check wordSize, win32-x64 is an IL32P64 platform. + set cpu x86_64 + } + } + sunos { + set plat solaris + if {[string match "ix86" $cpu]} { + if {$tcl_platform(wordSize) == 8} { + set cpu x86_64 + } + } elseif {![string match "ia64*" $cpu]} { + # sparc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + } + darwin { + set plat macosx + # Correctly identify the cpu when running as a 64bit + # process on a machine with a 32bit kernel + if {$cpu eq "ix86"} { + if {$tcl_platform(wordSize) == 8} { + set cpu x86_64 + } + } + } + aix { + set cpu powerpc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + hp-ux { + set plat hpux + if {![string match "ia64*" $cpu]} { + set cpu parisc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + } + osf1 { + set plat tru64 + } + default { + set plat [lindex [split $plat _-] 0] + } + } + + return "${plat}-${cpu}" +} + +# -- platform::identify +# +# Assembles an identifier for the exact platform, by extending the +# generic identifier. I.e. it adds in details like kernel version, +# libc version, etc., if they are relevant for the loading of +# packages on the platform. + +proc ::platform::identify {} { + global tcl_platform + + set id [generic] + regexp {^([^-]+)-([^-]+)$} $id -> plat cpu + + switch -- $plat { + solaris { + regsub {^5} $tcl_platform(osVersion) 2 text + append plat $text + return "${plat}-${cpu}" + } + macosx { + set major [lindex [split $tcl_platform(osVersion) .] 0] + if {$major > 19} { + set minor [lindex [split $tcl_platform(osVersion) .] 1] + incr major -9 + append plat $major.[expr {$minor - 1}] + } else { + incr major -4 + append plat 10.$major + return "${plat}-${cpu}" + } + return "${plat}-${cpu}" + } + linux { + # Look for the libc*.so and determine its version + # (libc5/6, libc6 further glibc 2.X) + + set v unknown + + # Determine in which directory to look. /lib, or /lib64. + # For that we use the tcl_platform(wordSize). + # + # We could use the 'cpu' info, per the equivalence below, + # that however would be restricted to intel. And this may + # be a arm, mips, etc. system. The wordsize is more + # fundamental. + # + # ix86 <=> (wordSize == 4) <=> 32 bit ==> /lib + # x86_64 <=> (wordSize == 8) <=> 64 bit ==> /lib64 + # + # Do not look into /lib64 even if present, if the cpu + # doesn't fit. + + # TODO: Determine the prefixes (i386, x86_64, ...) for + # other cpus. The path after the generic one is utterly + # specific to intel right now. Ok, on Ubuntu, possibly + # other Debian systems we may apparently be able to query + # the necessary CPU code. If we can't we simply use the + # hardwired fallback. + + switch -exact -- $tcl_platform(wordSize) { + 4 { + lappend bases /lib + if {[catch { + exec dpkg-architecture -qDEB_HOST_MULTIARCH + } res]} { + lappend bases /lib/i386-linux-gnu + } else { + # dpkg-arch returns the full tripled, not just cpu. + lappend bases /lib/$res + } + } + 8 { + lappend bases /lib64 + if {[catch { + exec dpkg-architecture -qDEB_HOST_MULTIARCH + } res]} { + lappend bases /lib/x86_64-linux-gnu + } else { + # dpkg-arch returns the full tripled, not just cpu. + lappend bases /lib/$res + } + } + default { + return -code error "Bad wordSize $tcl_platform(wordSize), expected 4 or 8" + } + } + + foreach base $bases { + if {[LibcVersion $base -> v]} break + } + + append plat -$v + return "${plat}-${cpu}" + } + } + + return $id +} + +proc ::platform::LibcVersion {base _->_ vv} { + upvar 1 $vv v + set libclist [lsort [glob -nocomplain -directory $base libc*]] + + if {![llength $libclist]} { return 0 } + + set libc [lindex $libclist 0] + + # Try executing the library first. This should suceed + # for a glibc library, and return the version + # information. + + if {![catch { + set vdata [lindex [split [exec $libc] \n] 0] + }]} { + regexp {version ([0-9]+(\.[0-9]+)*)} $vdata -> v + foreach {major minor} [split $v .] break + set v glibc${major}.${minor} + return 1 + } else { + # We had trouble executing the library. We are now + # inspecting its name to determine the version + # number. This code by Larry McVoy. + + if {[regexp -- {libc-([0-9]+)\.([0-9]+)} $libc -> major minor]} { + set v glibc${major}.${minor} + return 1 + } + } + return 0 +} + +# -- platform::patterns +# +# Given an exact platform identifier, i.e. _not_ the generic +# identifier it assembles a list of exact platform identifier +# describing platform which should be compatible with the +# input. +# +# I.e. packages for all platforms in the result list should be +# loadable on the specified platform. + +# << Should we add the generic identifier to the list as well ? In +# general it is not compatible I believe. So better not. In many +# cases the exact identifier is identical to the generic one +# anyway. +# >> + +proc ::platform::patterns {id} { + set res [list $id] + if {$id eq "tcl"} {return $res} + + switch -glob -- $id { + solaris*-* { + if {[regexp {solaris([^-]*)-(.*)} $id -> v cpu]} { + if {$v eq ""} {return $id} + foreach {major minor} [split $v .] break + incr minor -1 + for {set j $minor} {$j >= 6} {incr j -1} { + lappend res solaris${major}.${j}-${cpu} + } + } + } + linux*-* { + if {[regexp {linux-glibc([^-]*)-(.*)} $id -> v cpu]} { + foreach {major minor} [split $v .] break + incr minor -1 + for {set j $minor} {$j >= 0} {incr j -1} { + lappend res linux-glibc${major}.${j}-${cpu} + } + } + } + macosx-powerpc { + lappend res macosx-universal + } + macosx-x86_64 { + lappend res macosx-i386-x86_64 + } + macosx-ix86 { + lappend res macosx-universal macosx-i386-x86_64 + } + macosx*-* { + # 10.5+,11.0+ + if {[regexp {macosx([^-]*)-(.*)} $id -> v cpu]} { + + switch -exact -- $cpu { + ix86 { + lappend alt i386-x86_64 + lappend alt universal + } + x86_64 { + if {[lindex [split $::tcl_platform(osVersion) .] 0] < 19} { + set alt i386-x86_64 + } else { + set alt {} + } + } + arm { + lappend alt x86_64 + } + default { set alt {} } + } + + if {$v ne ""} { + foreach {major minor} [split $v .] break + + set res {} + if {$major eq 11} { + # Add 11.0 to 11.minor to patterns. + for {set j $minor} {$j >= 0} {incr j -1} { + lappend res macosx${major}.${j}-${cpu} + foreach a $alt { + lappend res macosx${major}.${j}-$a + } + } + set major 10 + set minor 15 + } + # Add 10.5 to 10.minor to patterns. + for {set j $minor} {$j >= 5} {incr j -1} { + if {$cpu ne "arm"} { + lappend res macosx${major}.${j}-${cpu} + } + foreach a $alt { + lappend res macosx${major}.${j}-$a + } + } + + # Add unversioned patterns for 10.3/10.4 builds. + lappend res macosx-${cpu} + foreach a $alt { + lappend res macosx-$a + } + } else { + # No version, just do unversioned patterns. + foreach a $alt { + lappend res macosx-$a + } + } + } else { + # no v, no cpu ... nothing + } + } + } + lappend res tcl ; # Pure tcl packages are always compatible. + return $res +} + + +# ### ### ### ######### ######### ######### +## Ready + +package provide platform 1.0.17 + +# ### ### ### ######### ######### ######### +## Demo application + +if {[info exists argv0] && ($argv0 eq [info script])} { + puts ==================================== + parray tcl_platform + puts ==================================== + puts Generic\ identification:\ [::platform::generic] + puts Exact\ identification:\ \ \ [::platform::identify] + puts ==================================== + puts Search\ patterns: + puts *\ [join [::platform::patterns [::platform::identify]] \n*\ ] + puts ==================================== + exit 0 +} diff --git a/src/modules/platform/shell-1.1.4.tm b/src/modules/platform/shell-1.1.4.tm new file mode 100644 index 00000000..6eb96910 --- /dev/null +++ b/src/modules/platform/shell-1.1.4.tm @@ -0,0 +1,241 @@ + +# -*- tcl -*- +# ### ### ### ######### ######### ######### +## Overview + +# Higher-level commands which invoke the functionality of this package +# for an arbitrary tcl shell (tclsh, wish, ...). This is required by a +# repository as while the tcl shell executing packages uses the same +# platform in general as a repository application there can be +# differences in detail (i.e. 32/64 bit builds). + +# ### ### ### ######### ######### ######### +## Requirements + +package require platform +namespace eval ::platform::shell {} + +# ### ### ### ######### ######### ######### +## Implementation + +# -- platform::shell::generic + +proc ::platform::shell::generic {shell} { + # Argument is the path to a tcl shell. + + CHECK $shell + LOCATE base out + + set code {} + # Forget any pre-existing platform package, it might be in + # conflict with this one. + lappend code {package forget platform} + # Inject our platform package + lappend code [list source $base] + # Query and print the architecture + lappend code {puts [platform::generic]} + # And done + lappend code {exit 0} + + set arch [RUN $shell [join $code \n]] + + if {$out} {file delete -force $base} + return $arch +} + +# -- platform::shell::identify + +proc ::platform::shell::identify {shell} { + # Argument is the path to a tcl shell. + + CHECK $shell + LOCATE base out + + set code {} + # Forget any pre-existing platform package, it might be in + # conflict with this one. + lappend code {package forget platform} + # Inject our platform package + lappend code [list source $base] + # Query and print the architecture + lappend code {puts [platform::identify]} + # And done + lappend code {exit 0} + + set arch [RUN $shell [join $code \n]] + + if {$out} {file delete -force $base} + return $arch +} + +# -- platform::shell::platform + +proc ::platform::shell::platform {shell} { + # Argument is the path to a tcl shell. + + CHECK $shell + + set code {} + lappend code {puts $tcl_platform(platform)} + lappend code {exit 0} + + return [RUN $shell [join $code \n]] +} + +# ### ### ### ######### ######### ######### +## Internal helper commands. + +proc ::platform::shell::CHECK {shell} { + if {![file exists $shell]} { + return -code error "Shell \"$shell\" does not exist" + } + if {![file executable $shell]} { + return -code error "Shell \"$shell\" is not executable (permissions)" + } + return +} + +proc ::platform::shell::LOCATE {bv ov} { + upvar 1 $bv base $ov out + + # Locate the platform package for injection into the specified + # shell. We are using package management to find it, whereever it + # is, instead of using hardwired relative paths. This allows us to + # install the two packages as TMs without breaking the code + # here. If the found package is wrapped we copy the code somewhere + # where the spawned shell will be able to read it. + + # This code is brittle, it needs has to adapt to whatever changes + # are made to the TM code, i.e. the provide statement generated by + # tm.tcl + + set pl [package ifneeded platform [package require platform]] + set base [lindex $pl end] + + set out 0 + if {[lindex [file system $base]] ne "native"} { + set temp [TEMP] + file copy -force $base $temp + set base $temp + set out 1 + } + return +} + +proc ::platform::shell::RUN {shell code} { + set c [TEMP] + set cc [open $c w] + puts $cc $code + close $cc + + set e [TEMP] + + set code [catch { + exec $shell $c 2> $e + } res] + + file delete $c + + if {$code} { + append res \n[read [set chan [open $e r]]][close $chan] + file delete $e + return -code error "Shell \"$shell\" is not executable ($res)" + } + + file delete $e + return $res +} + +proc ::platform::shell::TEMP {} { + set prefix platform + + # This code is copied out of Tcllib's fileutil package. + # (TempFile/tempfile) + + set tmpdir [DIR] + + set chars "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + set nrand_chars 10 + set maxtries 10 + set access [list RDWR CREAT EXCL TRUNC] + set permission 0600 + set channel "" + set checked_dir_writable 0 + set mypid [pid] + for {set i 0} {$i < $maxtries} {incr i} { + set newname $prefix + for {set j 0} {$j < $nrand_chars} {incr j} { + append newname [string index $chars \ + [expr {int(rand()*62)}]] + } + set newname [file join $tmpdir $newname] + if {[file exists $newname]} { + after 1 + } else { + if {[catch {open $newname $access $permission} channel]} { + if {!$checked_dir_writable} { + set dirname [file dirname $newname] + if {![file writable $dirname]} { + return -code error "Directory $dirname is not writable" + } + set checked_dir_writable 1 + } + } else { + # Success + close $channel + return [file normalize $newname] + } + } + } + if {$channel ne ""} { + return -code error "Failed to open a temporary file: $channel" + } else { + return -code error "Failed to find an unused temporary file name" + } +} + +proc ::platform::shell::DIR {} { + # This code is copied out of Tcllib's fileutil package. + # (TempDir/tempdir) + + global tcl_platform env + + set attempdirs [list] + + foreach tmp {TMPDIR TEMP TMP} { + if { [info exists env($tmp)] } { + lappend attempdirs $env($tmp) + } + } + + switch $tcl_platform(platform) { + windows { + lappend attempdirs "C:\\TEMP" "C:\\TMP" "\\TEMP" "\\TMP" + } + macintosh { + set tmpdir $env(TRASH_FOLDER) ;# a better place? + } + default { + lappend attempdirs \ + [file join / tmp] \ + [file join / var tmp] \ + [file join / usr tmp] + } + } + + lappend attempdirs [pwd] + + foreach tmp $attempdirs { + if { [file isdirectory $tmp] && [file writable $tmp] } { + return [file normalize $tmp] + } + } + + # Fail if nothing worked. + return -code error "Unable to determine a proper directory for temporary files" +} + +# ### ### ### ######### ######### ######### +## Ready + +package provide platform::shell 1.1.4 diff --git a/src/modules/shellfilter-0.1.8.tm b/src/modules/shellfilter-0.1.8.tm new file mode 100644 index 00000000..942cc72b --- /dev/null +++ b/src/modules/shellfilter-0.1.8.tm @@ -0,0 +1,2453 @@ +#copyright 2023 Julian Marcel Noble +#license: BSD (revised 3-clause) +# +#Note shellfilter is currently only directly useful for unidirectional channels e.g stdin,stderr,stdout, or for example fifo2 where only one direction is being used. +#To generalize this to bidrectional channels would require shifting around read & write methods on transform objects in a very complicated manner. +#e.g each transform would probably be a generic transform container which holds sub-objects to which read & write are indirected. +#This is left as a future exercise...possibly it's best left as a concept for uni-directional channels anyway +# - as presumably the reads/writes from a bidirectional channel could be diverted off to unidirectional pipelines for processing with less work +# (and maybe even better speed/efficiency if the data volume is asymmetrical and there is significant processing on one direction) +# +package require shellfilter [namespace eval shellfilter { + variable version + set version 0.1.8 +}] + + +namespace eval shellfilter::log { + variable allow_adhoc_tags 0 + variable open_logs [dict create] + + #'tag' is an identifier for the log source. + # each tag will use it's own thread to write to the configured log target + proc open {tag {settingsdict {}}} { + upvar ::shellfilter::sources sourcelist + package require shellthread + if {![dict exists $settingsdict -tag]} { + dict set settingsdict -tag $tag + } else { + if {$tag ne [dict get $settingsdict -tag]} { + error "shellfilter::log::open first argument tag: '$tag' does not match -tag '[dict get $settingsdict -tag]' omit -tag, or supply same value" + } + } + if {$tag ni $sourcelist} { + lappend sourcelist $tag + } + + set worker_tid [shellthread::manager::new_worker $tag $settingsdict] + + return $worker_tid + } + proc write {tag msg} { + shellthread::manager::write_log $tag $msg + } + #write_sync - synchronous processing with logging thread, slower but potentially useful for debugging/testing or forcing delay til log written + proc write_sync {tag msg} { + shellthread::manager::write_log $tag $msg -async 0 + } + proc close {tag} { + shellthread::manager::close_worker $tag + } + + #todo -implement + proc require_open {{is_open_required {}}} { + variable allow_adhoc_tags + if {![string length $is_open_required]} { + return $allow_adhoc_tags + } else { + set truevalues [list y yes true 1] + set falsevalues [list n no false 0] + if {[string tolower $is_open_required] in $truevalues} { + set allow_adhoc_tags 1 + } elseif {[string tolower $is_open_required] in $falsevalues} { + set allow_adhoc_tags 0 + } else { + error "shellfilter::log::require_open unrecognised value '$is_open_required' try one of $truevalues or $falsevalues" + } + } + } +} +namespace eval shellfilter::pipe { + #write channel for program. workethread reads other end of fifo2 and writes data somewhere + proc open_out {tag_pipename {settingsdict {}}} { + package require shellthread + #we are only using the fifo in a single direction to pipe to another thread + # - so whilst wchan and rchan could theoretically each be both read & write we're only using them for one operation each + if {![catch {package require Memchan}]} { + lassign [fifo2] wchan rchan + } else { + package require tcl::chan::fifo2 + lassign [tcl::chan::fifo2] wchan rchan + } + #default -translation for both types of fifo on windows is {auto crlf} + # -encoding is as per '[encoding system]' on the platform - e.g utf-8 (e.g windows when beta-utf8 enabled) + chan configure $wchan -buffering [dict get $settingsdict -buffering] ;# + #application end must not be binary for our filters to operate on it + + + #chan configure $rchan -buffering [dict get $settingsdict -buffering] -translation binary ;#works reasonably.. + chan configure $rchan -buffering [dict get $settingsdict -buffering] -translation lf + + set worker_tid [shellthread::manager::new_worker $tag_pipename $settingsdict] + + #set_read_pipe does the thread::transfer of the rchan end. -buffering setting is maintained during thread transfer + shellthread::manager::set_pipe_read_from_client $tag_pipename $worker_tid $rchan + + set pipeinfo [list localchan $wchan remotechan $rchan workertid $worker_tid direction out] + return $pipeinfo + } + + #read channel for program. workerthread writes to other end of fifo2 from whereever it's reading (stdin, file?) + proc open_in {tag_pipename {settingsdict {} }} { + package require shellthread + package require tcl::chan::fifo2 + lassign [tcl::chan::fifo2] wchan rchan + set program_chan $rchan + set worker_chan $wchan + chan configure $worker_chan -buffering [dict get $settingsdict -buffering] + chan configure $program_chan -buffering [dict get $settingsdict -buffering] + + chan configure $program_chan -blocking 0 + chan configure $worker_chan -blocking 0 + set worker_tid [shellthread::manager::new_worker $tag_pipename $settingsdict] + + shellthread::manager::set_pipe_write_to_client $tag_pipename $worker_tid $worker_chan + + set pipeinfo [list localchan $program_chan remotechan $worker_chan workertid $worker_tid direction in] + puts stderr "|jn>pipe::open_in returning $pipeinfo" + puts stderr "program_chan: [chan conf $program_chan]" + return $pipeinfo + } + +} +namespace eval shellfilter::ansi { + #shellfilter::ansi procs only: adapted from ansicolor page on wiki https://wiki.tcl-lang.org/page/ANSI+color+control except where otherwise marked + variable test "blah\033\[1;33mETC\033\[0;mOK" + namespace export + + variable map { + bold 1 light 2 blink 5 invert 7 + black 30 red 31 green 32 yellow 33 blue 34 purple 35 cyan 36 white 37 + Black 40 Red 41 Green 42 Yellow 43 Blue 44 Purple 45 Cyan 46 White 47 + } + proc + {args} { + variable map + set t 0 + foreach i $args { + set ix [lsearch -exact $map $i] + if {$ix>-1} {lappend t [lindex $map [incr ix]]} + } + # \033 - octal. equivalently \x1b in hex which is more common in documentation + return "\x1b\[[join $t {;}]m" + } + proc get {code} { + variable map + set res [list] + foreach i [split $code ";"] { + set ix [lsearch -exact $map $i] + if {$ix>-1} {lappend res [lindex $map [incr ix -1]]} + } + set res + } + + + #jn 2023 + #package require term::ansi::code + #package require term::ansi::code::attr + #term::ansi::code::attr::import attr + #puts stdout "[::term::ansi::code::attr::fgred] is red" + proc reset {} { + return "\x1bc" ;#reset console + #return "\x1b\[0m" ;#reset color only + } + + #strip ansi codes from text - basic! assumes we don't get data split in the middle of an ansi-code ie best used with line-buffering + proc stripcodes {text} { + if {[set posn [string first "\033\[" $text]] >= 0} { + set mnext [string first m [string range $text $posn end]] + if {$mnext >= 0} { + set mpos [expr {$posn + $mnext}] + set stripped1 [string range $text 0 $posn-1][string range $text $mpos+1 end] + #return [stripcodes $stripped1] ;#recurse to get any others + tailcall ::shellfilter::ansi::stripcodes $stripped1 + } else { + #partial or not actually an ansi code.. pass it all through + return $text + } + } else { + return $text + } + } + +} +namespace eval shellfilter::chan { + oo::class create var { + variable o_datavar + variable o_trecord + variable o_enc + constructor {tf} { + set o_trecord $tf + set o_enc [dict get $tf -encoding] + set settingsdict [dict get $tf -settings] + set varname [dict get $settingsdict -varname] + set o_datavar $varname + } + method initialize {ch mode} { + return [list initialize finalize write] + } + method finalize {ch} { + my destroy + } + method watch {ch events} { + # must be present but we ignore it because we do not + # post any events + } + #method read {ch count} { + # return ? + #} + method write {ch bytes} { + set stringdata [encoding convertfrom $o_enc $bytes] + append $o_datavar $stringdata + return "" + } + method meta_is_redirection {} { + return 1 + } + method meta_buffering_supported {} { + return [list line full none] + } + } + + #todo - something similar for multiple grep specs each with own -pre & -post .. store to dict? + oo::class create tee_grep_to_var { + variable o_datavar + variable o_lastxlines + variable o_trecord + variable o_grepfor + variable o_prelines + variable o_postlines + variable o_postcountdown + variable o_enc + constructor {tf} { + set o_trecord $tf + set o_enc [dict get $tf -encoding] + set o_lastxlines [list] + set o_postcountdown 0 + set defaults [dict create -pre 1 -post 1] + set settingsdict [dict get $tf -settings] + set settings [dict merge $defaults $settingsdict] + set o_datavar [dict get $settings -varname] + set o_grepfor [dict get $settings -grep] + set o_prelines [dict get $settings -pre] + set o_postlines [dict get $settings -post] + } + method initialize {transform_handle mode} { + return [list initialize finalize write] + } + method finalize {transform_handle} { + my destroy + } + method watch {transform_handle events} { + } + #method read {transform_handle count} { + # return ? + #} + method write {transform_handle bytes} { + set logdata [encoding convertfrom $o_enc $bytes] + set lastx $o_lastxlines + lappend o_lastxlines $logdata + + if {$o_postcountdown > 0} { + append $o_datavar $logdata + if {[regexp $o_grepfor $logdata]} { + #another match in postlines + set o_postcountdown $o_postlines + } else { + incr o_postcountdown -1 + } + } else { + if {[regexp $o_grepfor $logdata]} { + append $o_datavar [join $lastx] + append $o_datavar $logdata + set o_postcountdown $o_postlines + } + } + + if {[llength $o_lastxlines] > $o_prelines} { + set o_lastxlines [lrange $o_lastxlines 1 end] + } + return $bytes + } + method meta_is_redirection {} { + return 0 + } + method meta_buffering_supported {} { + return [list line] + } + } + + oo::class create tee_to_var { + variable o_datavar + variable o_trecord + variable o_enc + constructor {tf} { + set o_trecord $tf + set o_enc [dict get $tf -encoding] + set settingsdict [dict get $tf -settings] + set varname [dict get $settingsdict -varname] + set o_datavar $varname + } + method initialize {ch mode} { + return [list initialize finalize write] + } + method finalize {ch} { + my destroy + } + method watch {ch events} { + # must be present but we ignore it because we do not + # post any events + } + #method read {ch count} { + # return ? + #} + method write {ch bytes} { + set stringdata [encoding convertfrom $o_enc $bytes] + append $o_datavar $stringdata + return $bytes + } + method meta_is_redirection {} { + return 0 + } + } + oo::class create tee_to_pipe { + variable o_logsource + variable o_localchan + variable o_enc + variable o_trecord + constructor {tf} { + set o_trecord $tf + set o_enc [dict get $tf -encoding] + set settingsdict [dict get $tf -settings] + if {![dict exists $settingsdict -tag]} { + error "tee_to_pipe constructor settingsdict missing -tag" + } + set o_localchan [dict get $settingsdict -pipechan] + set o_logsource [dict get $settingsdict -tag] + } + method initialize {transform_handle mode} { + return [list initialize read write finalize] + } + method finalize {transform_handle} { + ::shellfilter::log::close $o_logsource + my destroy + } + method watch {transform_handle events} { + # must be present but we ignore it because we do not + # post any events + } + method read {transform_handle bytes} { + set logdata [encoding convertfrom $o_enc $bytes] + #::shellfilter::log::write $o_logsource $logdata + puts -nonewline $o_localchan $logdata + return $bytes + } + method write {transform_handle bytes} { + set logdata [encoding convertfrom $o_enc $bytes] + #::shellfilter::log::write $o_logsource $logdata + puts -nonewline $o_localchan $logdata + return $bytes + } + #a tee is not a redirection - because data still flows along the main path + method meta_is_redirection {} { + return 0 + } + + } + oo::class create tee_to_log { + variable o_tid + variable o_logsource + variable o_trecord + variable o_enc + constructor {tf} { + set o_trecord $tf + set o_enc [dict get $tf -encoding] + set settingsdict [dict get $tf -settings] + if {![dict exists $settingsdict -tag]} { + error "tee_to_log constructor settingsdict missing -tag" + } + set o_logsource [dict get $settingsdict -tag] + set o_tid [::shellfilter::log::open $o_logsource $settingsdict] + } + method initialize {ch mode} { + return [list initialize read write finalize] + } + method finalize {ch} { + ::shellfilter::log::close $o_logsource + my destroy + } + method watch {ch events} { + # must be present but we ignore it because we do not + # post any events + } + method read {ch bytes} { + set logdata [encoding convertfrom $o_enc $bytes] + ::shellfilter::log::write $o_logsource $logdata + return $bytes + } + method write {ch bytes} { + set logdata [encoding convertfrom $o_enc $bytes] + ::shellfilter::log::write $o_logsource $logdata + return $bytes + } + method meta_is_redirection {} { + return 0 + } + } + + + oo::class create logonly { + variable o_tid + variable o_logsource + variable o_trecord + variable o_enc + constructor {tf} { + set o_trecord $tf + set o_enc [dict get $tf -encoding] + set settingsdict [dict get $tf -settings] + if {![dict exists $settingsdict -tag]} { + error "logonly constructor settingsdict missing -tag" + } + set o_logsource [dict get $settingsdict -tag] + set o_tid [::shellfilter::log::open $o_logsource $settingsdict] + } + method initialize {transform_handle mode} { + return [list initialize finalize write] + } + method finalize {transform_handle} { + ::shellfilter::log::close $o_logsource + my destroy + } + method watch {transform_handle events} { + # must be present but we ignore it because we do not + # post any events + } + #method read {transform_handle count} { + # return ? + #} + method write {transform_handle bytes} { + set logdata [encoding convertfrom $o_enc $bytes] + if 0 { + if {"utf-16le" in [encoding names]} { + set logdata [encoding convertfrom utf-16le $bytes] + } else { + set logdata [encoding convertto utf-8 $bytes] + #set logdata [encoding convertfrom unicode $bytes] + #set logdata $bytes + } + } + #set logdata $bytes + #set logdata [string map [list \r -r- \n -n-] $logdata] + #if {[string equal [string range $logdata end-1 end] "\r\n"]} { + # set logdata [string range $logdata 0 end-2] + #} + #::shellfilter::log::write_sync $o_logsource $logdata + ::shellfilter::log::write $o_logsource $logdata + #return $bytes + return + } + method meta_is_redirection {} { + return 1 + } + } + + #assumes line-buffering. a more advanced filter required if ansicodes can arrive split accross separate read or write operations! + oo::class create ansistrip { + variable o_trecord + variable o_enc + constructor {tf} { + set o_trecord $tf + set o_enc [dict get $tf -encoding] + } + method initialize {transform_handle mode} { + return [list initialize read write finalize] + } + method finalize {transform_handle} { + my destroy + } + method watch {transform_handle events} { + } + method read {transform_handle bytes} { + set instring [encoding convertfrom $o_enc $bytes] + set outstring [shellfilter::ansi::stripcodes $instring] + return [encoding convertto $o_enc $outstring] + } + method write {transform_handle bytes} { + set instring [encoding convertfrom $o_enc $bytes] + set outstring [shellfilter::ansi::stripcodes $instring] + return [encoding convertto $o_enc $outstring] + #return [encoding convertto unicode $outstring] + } + } + oo::define ansistrip { + method meta_is_redirection {} { + return 0 + } + } + + #a test + oo::class create reconvert { + variable o_trecord + variable o_enc + constructor {tf} { + set o_trecord $tf + set o_enc [dict get $tf -encoding] + } + method initialize {transform_handle mode} { + return [list initialize read write finalize] + } + method finalize {transform_handle} { + my destroy + } + method watch {transform_handle events} { + } + method read {transform_handle bytes} { + set instring [encoding convertfrom $o_enc $bytes] + + set outstring $instring + + return [encoding convertto $o_enc $outstring] + } + method write {transform_handle bytes} { + set instring [encoding convertfrom $o_enc $bytes] + + set outstring $instring + + return [encoding convertto $o_enc $outstring] + } + } + oo::define reconvert { + method meta_is_redirection {} { + return 0 + } + } + + #todo - something + oo::class create rebuffer { + variable o_trecord + variable o_enc + constructor {tf} { + set o_trecord $tf + set o_enc [dict get $tf -encoding] + } + method initialize {transform_handle mode} { + return [list initialize read write finalize] + } + method finalize {transform_handle} { + my destroy + } + method watch {transform_handle events} { + } + method read {transform_handle bytes} { + set instring [encoding convertfrom $o_enc $bytes] + + set outstring $instring + + return [encoding convertto $o_enc $outstring] + } + method write {transform_handle bytes} { + set instring [encoding convertfrom $o_enc $bytes] + + #set outstring [string map [list \n ] $instring] + set outstring $instring + + return [encoding convertto $o_enc $outstring] + #return [encoding convertto utf-16le $outstring] + } + } + oo::define rebuffer { + method meta_is_redirection {} { + return 0 + } + } + + #has slight buffering/withholding of lone training cr - we can't be sure that a cr at end of chunk is part of \r\n sequence + oo::class create tounix { + variable o_trecord + variable o_enc + variable o_last_char_was_cr + variable o_is_junction + constructor {tf} { + set o_trecord $tf + set o_enc [dict get $tf -encoding] + set settingsdict [dict get $tf -settings] + if {[dict exists $settingsdict -junction]} { + set o_is_junction [dict get $settingsdict -junction] + } else { + set o_is_junction 0 + } + set o_last_char_was_cr 0 + } + method initialize {transform_handle mode} { + return [list initialize write finalize] + } + method finalize {transform_handle} { + my destroy + } + method watch {transform_handle events} { + } + #don't use read + method read {transform_handle bytes} { + set instring [encoding convertfrom $o_enc $bytes] + + set outstring $instring + + return [encoding convertto $o_enc $outstring] + } + method write {transform_handle bytes} { + set instring [encoding convertfrom $o_enc $bytes] + #set outstring [string map [list \n ] $instring] + + if {$o_last_char_was_cr} { + set instring "\r$instring" + } + + set outstring [string map [list \r\n \n] $instring] + set lastchar [string range $outstring end end] + if {$lastchar eq "\r"} { + set o_last_char_was_cr 1 + set outstring [string range $outstring 0 end-1] + } else { + set o_last_char_was_cr 0 + } + #review! can we detect eof here on the transform_handle? + #if eof, we don't want to strip a trailing \r + + return [encoding convertto $o_enc $outstring] + #return [encoding convertto utf-16le $outstring] + } + } + oo::define tounix { + method meta_is_redirection {} { + return $o_is_junction + } + } + #write to handle case where line-endings already \r\n too + oo::class create towindows { + variable o_trecord + variable o_enc + variable o_last_char_was_cr + variable o_is_junction + constructor {tf} { + set o_trecord $tf + set o_enc [dict get $tf -encoding] + set settingsdict [dict get $tf -settings] + if {[dict exists $settingsdict -junction]} { + set o_is_junction [dict get $settingsdict -junction] + } else { + set o_is_junction 0 + } + set o_last_char_was_cr 0 + } + method initialize {transform_handle mode} { + return [list initialize write finalize] + } + method finalize {transform_handle} { + my destroy + } + method watch {transform_handle events} { + } + #don't use read + method read {transform_handle bytes} { + set instring [encoding convertfrom $o_enc $bytes] + + set outstring $instring + + return [encoding convertto $o_enc $outstring] + } + method write {transform_handle bytes} { + set instring [encoding convertfrom $o_enc $bytes] + #set outstring [string map [list \n ] $instring] + + if {$o_last_char_was_cr} { + set instring "\r$instring" + } + + set outstring [string map [list \r\n \uFFFF] $instring] + set outstring [string map [list \n \r\n] $outstring] + set outstring [string map [list \uFFFF \r\n] $outstring] + + set lastchar [string range $outstring end end] + if {$lastchar eq "\r"} { + set o_last_char_was_cr 1 + set outstring [string range $outstring 0 end-1] + } else { + set o_last_char_was_cr 0 + } + #review! can we detect eof here on the transform_handle? + #if eof, we don't want to strip a trailing \r + + return [encoding convertto $o_enc $outstring] + #return [encoding convertto utf-16le $outstring] + } + } + oo::define towindows { + method meta_is_redirection {} { + return $o_is_junction + } + } + +} + +# ---------------------------------------------------------------------------- +#review float/sink metaphor. +#perhaps something with the concept of upstream and downstream? +#need concepts for push towards data, sit in middle where placed, and lag at tail of data stream. +## upstream for stdin is at the bottom of the stack and for stdout is the top of the stack. +#upstream,neutral-upstream,downstream,downstream-aside,downstream-replace (default neutral-upstream - require action 'stack' to use standard channel stacking concept and ignore other actions) +#This is is a bit different from the float/sink metaphor which refers to the channel stacking order as opposed to the data-flow direction. +#The idea would be that whether input or output +# upstream additions go to the side closest to the datasource +# downstream additions go furthest from the datasource +# - all new additions go ahead of any diversions as the most upstream diversion is the current end of the stream in a way. +# - this needs review regarding subsequent removal of the diversion and whether filters re-order in response.. +# or if downstream & neutral additions are reclassified upon insertion if they land among existing upstreams(?) +# neutral-upstream goes to the datasource side of the neutral-upstream list. +# No 'neutral' option provided so that we avoid the need to think forwards or backwards when adding stdin vs stdout shellfilter does the necessary pop/push reordering. +# No 'neutral-downstream' to reduce complexity. +# downstream-replace & downstream-aside head downstream to the first diversion they encounter. ie these actions are no longer referring to the stack direction but only the dataflow direction. +# +# ---------------------------------------------------------------------------- +# +# 'filters' are transforms that don't redirect +# - limited range of actions to reduce complexity. +# - any requirement not fulfilled by float,sink,sink-replace,sink-sideline should be done by multiple pops and pushes +# +#actions can float to top of filters or sink to bottom of filters +#when action is of type sink, it can optionally replace or sideline the first non-filter it encounters (highest redirection on the stack.. any lower are starved of the stream anyway) +# - sideline means to temporarily replace the item and keep a record, restoring if/when we are removed from the transform stack +# +##when action is of type float it can't replace or sideline anything. A float is added above any existing floats and they stay in the same order relative to each other, +#but non-floats added later will sit below all floats. +#(review - float/sink initially designed around output channels. For stdin the dataflow is reversed. implement float-aside etc?) +# +# +#action: float sink sink-replace,sink-sideline +# +# +## note - whether stack is for input or output we maintain it in the same direction - which is in sync with the tcl chan pop chan push concept. +## +namespace eval shellfilter::stack { + variable pipelines [list] + + #used for output channels - we usually want to sink redirections below the floaters and down to topmost existing redir + proc _get_stack_floaters {stack} { + set floaters [list] + foreach t [lreverse $stack] { + if {[dict get $t -action] eq "float"} { + lappend floaters $t + } else { + break + } + } + return [lreverse $floaters] + } + + + + #for output-channel sinking + proc _get_stack_top_redirection {stack} { + set r 0 ;#reverse index + foreach t [lreverse $stack] { + set obj [dict get $t -obj] + if {[$obj meta_is_redirection]} { + set idx [expr {[llength $stack] - ($r + 1) }] ;#forward index + return [list index $idx record $t] + } + incr r + } + #not found + return [list index -1 record {}] + } + #exclude float-locked, locked, sink-locked + proc _get_stack_top_redirection_replaceable {stack} { + set r 0 ;#reverse index + foreach t [lreverse $stack] { + set action [dict get $t -action] + if {![string match "*locked*" $action]} { + set obj [dict get $t -obj] + if {[$obj meta_is_redirection]} { + set idx [expr {[llength $stack] - ($r + 1) }] ;#forward index + return [list index $idx record $t] + } + } + incr r + } + #not found + return [list index -1 record {}] + } + + + #for input-channels ? + proc _get_stack_bottom_redirection {stack} { + set i 0 + foreach t $stack { + set obj [dict get $t -obj] + if {[$obj meta_is_redirection]} { + return [linst index $i record $t] + } + incr i + } + #not found + return [list index -1 record {}] + } + + + proc get_next_counter {pipename} { + variable pipelines + set counter [dict get $pipelines $pipename counter] + incr counter + dict set pipelines $pipename counter $counter + return $counter + } + + proc unwind {pipename} { + variable pipelines + set stack [dict get $pipelines $pipename stack] + set localchan [dict get $pipelines $pipename device localchan] + foreach tf [lreverse $stack] { + chan pop $localchan + } + dict set pipelines $pipename [list] + } + #todo + proc delete {pipename} { + set pipeinfo [dict get $pipename] + set deviceinfo [dict get $pipeinfo device] + set localchan [dict get $deviceinfo localchan] + unwind $pipename + + + chan close $localchan + } + proc remove {pipename remove_id} { + variable pipelines + set stack [dict get $pipelines $pipename stack] + set localchan [dict get $pipelines $pipename device localchan] + set posn 0 + set idposn -1 + set asideposn -1 + foreach t $stack { + set id [dict get $t -id] + if {$id eq $remove_id} { + set idposn $posn + break + } + #look into asides (only can be one for now) + if {[llength [dict get $t -aside]]} { + set a [dict get $t -aside] + if {[dict get $a -id] eq $remove_id} { + set asideposn $posn + break + } + } + incr posn + } + + if {$asideposn > 0} { + #id wasn't found directly in stack, but in an -aside. we don't need to pop anything - just clear this aside record + set container [lindex $stack $asideposn] + dict set container -aside {} + lset stack $asideposn $container + dict set pipelines $pipename stack $stack + } else { + if {$idposn < 0} { + ::shellfilter::log::write shellfilter "ERROR shellfilter::stack::remove $pipename id '$remove_id' not found" + puts stderr "|WARNING>shellfilter::stack::remove $pipename id '$remove_id' not found" + return 0 + } + set removed_item [lindex $stack $idposn] + + #include idposn in poplist + set poplist [lrange $stack $idposn end] + set stack [lreplace $stack $idposn end] + #pop all chans before adding anything back in! + foreach p $poplist { + chan pop $localchan + } + + if {[llength [dict get $removed_item -aside]]} { + set restore [dict get $removed_item -aside] + set t [dict get $restore -transform] + set tsettings [dict get $restore -settings] + set obj [$t new $restore] + set h [chan push $localchan $obj] + dict set restore -handle $h + dict set restore -obj $obj + lappend stack $restore + } + + #put popped back except for the first one, which we want to remove + foreach p [lrange $poplist 1 end] { + set t [dict get $p -transform] + set tsettings [dict get $p -settings] + set obj [$t new $p] + set h [chan push $localchan $obj] + dict set p -handle $h + dict set p -obj $obj + lappend stack $p + } + dict set pipelines $pipename stack $stack + } + show_pipeline $pipename -note "after_remove $remove_id" + + return 1 + } + + #pop a number of items of the top of the stack, add our transform record, and add back all (or the tail of poplist if pushstartindex > 0) + proc insert_transform {pipename stack transformrecord poplist {pushstartindex 0}} { + variable pipelines + set bottom_pop_posn [expr {[llength $stack] - [llength $poplist]}] + set poplist [lrange $stack $bottom_pop_posn end] + set stack [lreplace $stack $bottom_pop_posn end] + + set localchan [dict get $pipelines $pipename device localchan] + foreach p [lreverse $poplist] { + chan pop $localchan + } + set transformname [dict get $transformrecord -transform] + set transformsettings [dict get $transformrecord -settings] + set obj [$transformname new $transformrecord] + set h [chan push $localchan $obj] + dict set transformrecord -handle $h + dict set transformrecord -obj $obj + dict set transformrecord -note "insert_transform" + lappend stack $transformrecord + foreach p [lrange $poplist $pushstartindex end] { + set t [dict get $p -transform] + set tsettings [dict get $p -settings] + set obj [$t new $p] + set h [chan push $localchan $obj] + #retain previous -id - code that added it may have kept reference and not expecting it to change + dict set p -handle $h + dict set p -obj $obj + dict set p -note "re-added" + + lappend stack $p + } + return $stack + } + + #fifo2 + proc new {pipename args} { + variable pipelines + if {($pipename in [dict keys $pipelines]) || ($pipename in [chan names])} { + error "shellfilter::stack::new error: pipename '$pipename' already exists" + } + + set opts [dict merge {-settings {}} $args] + set defaultsettings [dict create -raw 1 -buffering line -direction out] + set targetsettings [dict merge $defaultsettings [dict get $opts -settings]] + + set direction [dict get $targetsettings -direction] + + #pipename is the source/facility-name ? + if {$direction eq "out"} { + set pipeinfo [shellfilter::pipe::open_out $pipename $targetsettings] + } else { + puts stderr "|jn> pipe::open_in $pipename $targetsettings" + set pipeinfo [shellfilter::pipe::open_in $pipename $targetsettings] + } + #open_out/open_in will configure buffering based on targetsettings + + set program_chan [dict get $pipeinfo localchan] + set worker_chan [dict get $pipeinfo remotechan] + set workertid [dict get $pipeinfo workertid] + + + set deviceinfo [dict create pipename $pipename localchan $program_chan remotechan $worker_chan workertid $workertid direction $direction] + dict set pipelines $pipename [list counter 0 device $deviceinfo stack [list]] + + return $deviceinfo + } + #we 'add' rather than 'push' because transforms can float,sink and replace/sideline so they don't necessarily go to the top of the transform stack + proc add {pipename transformname args} { + variable pipelines + if {($pipename ni [chan names]) && ($pipename ni [dict keys $pipelines])} { + error "shellfilter::stack::add no existing chan or pipename matching '$pipename' use stdin/stderr/stdout or shellfilter::stack::new " + } + set args [dict merge {-action "" -settings {}} $args] + set action [dict get $args -action] + set transformsettings [dict get $args -settings] + if {[string first "::" $transformname] < 0} { + set transformname ::shellfilter::chan::$transformname + } + if {![llength [info commands $transformname]]} { + error "shellfilter::stack::push unknown transform '$transformname'" + } + + + if {![dict exists $pipelines $pipename]} { + #pipename must be in chan names - existing device/chan + #record a -read and -write end even if the device is only being used as one or the other + set deviceinfo [dict create pipename $pipename localchan $pipename remotechan {}] + dict set pipelines $pipename [list counter 0 device $deviceinfo stack [list]] + } else { + set deviceinfo [dict get $pipelines $pipename device] + } + + set id [get_next_counter $pipename] + set stack [dict get $pipelines $pipename stack] + set localchan [dict get $deviceinfo localchan] + + #we redundantly store chan in each transform - makes debugging clearer + # -encoding similarly could be stored only at the pipeline level (or even queried directly each filter-read/write), + # but here it may help detect unexpected changes during lifetime of the stack and avoids the chance of callers incorrectly using the transform handle?) + # jn + set transform_record [list -id $id -chan $pipename -encoding [chan configure $localchan -encoding] -transform $transformname -aside {} {*}$args] + + if {$action in [list "float" "float-locked"]} { + set obj [$transformname new $transform_record] + set h [chan push $localchan $obj] + dict set transform_record -handle $h + dict set transform_record -obj $obj + lappend stack $transform_record + } elseif {$action in [list "locked" ""]} { + set floaters [_get_stack_floaters $stack] + if {![llength $floaters]} { + set obj [$transformname new $transform_record] + set h [chan push $localchan $obj] + dict set transform_record -handle $h + dict set transform_record -obj $obj + lappend stack $transform_record + } else { + set poplist $floaters + set stack [insert_transform $pipename $stack $transform_record $poplist] + } + } elseif {[string match sink* $action]} { + set redirinfo [_get_stack_top_redirection $stack] + set idx_existing_redir [dict get $redirinfo index] + if {$idx_existing_redir == -1} { + #no existing redirection transform on the stack + #pop everything.. add this record as the first redirection on the stack + set poplist $stack + set stack [insert_transform $pipename $stack $transform_record $poplist] + } else { + if {$action eq "sink-replace"} { + #include that index in the poplist + set poplist [lrange $stack $idx_existing_redir end] + #pop all from idx_existing_redir to end, but put back 'lrange $poplist 1 end' + set stack [insert_transform $pipename $stack $transform_record $poplist 1] + } elseif {[string match "sink-aside*" $action]} { + set existing_redir_record [lindex $stack $idx_existing_redir] + if {[string match "*locked*" [dict get $existing_redir_record -action]]} { + set put_aside 0 + #we can't aside this one - sit above it instead. + set poplist [lrange $stack $idx_existing_redir+1 end] + set stack [lrange $stack 0 $idx_existing_redir] + } else { + set put_aside 1 + dict set transform_record -aside [lindex $stack $idx_existing_redir] + set poplist [lrange $stack $idx_existing_redir end] + set stack [lrange $stack 0 $idx_existing_redir-1] + } + foreach p $poplist { + chan pop $localchan + } + set transformname [dict get $transform_record -transform] + set transform_settings [dict get $transform_record -settings] + set obj [$transformname new $transform_record] + set h [chan push $localchan $obj] + dict set transform_record -handle $h + dict set transform_record -obj $obj + dict set transform_record -note "insert_transform-with-aside" + lappend stack $transform_record + #add back poplist *except* the one we transferred into -aside (if we were able) + foreach p [lrange $poplist $put_aside end] { + set t [dict get $p -transform] + set tsettings [dict get $p -settings] + set obj [$t new $p] + set h [chan push $localchan $obj] + #retain previous -id - code that added it may have kept reference and not expecting it to change + dict set p -handle $h + dict set p -obj $obj + dict set p -note "re-added-after-sink-aside" + lappend stack $p + } + } else { + #plain "sink" + #we only sink to the topmost redirecting filter - which makes sense for an output channel + #For stdin.. this is more problematic as we're more likely to want to intercept the bottom most redirection. + #todo - review. Consider making default insert position for input channels to be at the source... and float/sink from there. + # - we don't currently know from the stack api if adding input vs output channel - so this needs work to make intuitive. + # consider splitting stack::add to stack::addinput stack::addoutput to split the different behaviour + set poplist [lrange $stack $idx_existing_redir+1 end] + set stack [insert_transform $pipename $stack $transform_record $poplist] + } + } + } else { + error "shellfilter::stack::add unimplemented action '$action'" + } + + dict set pipelines $pipename stack $stack + #puts stdout "==" + #puts stdout "==>stack: $stack" + #puts stdout "==" + show_pipeline $pipename -note "after_add $transformname $args" + return $id + } + proc show_pipeline {pipename args} { + variable pipelines + set stack [dict get $pipelines $pipename stack] + set tag "SHELLFILTER::STACK" + ::shellfilter::log::open $tag {-syslog 127.0.0.1:514} + ::shellfilter::log::write $tag "transform stack for $pipename $args" + foreach tf $stack { + ::shellfilter::log::write $tag " $tf" + } + + } +} + + +namespace eval shellfilter { + variable sources [list] + variable stacks [dict create] + + proc ::shellfilter::redir_channel_to_log {chan args} { + variable sources + set default_logsettings [dict create \ + -tag redirected_$chan -syslog 127.0.0.1:514 -file ""\ + ] + if {[dict exists $args -action]} { + set action [dict get $args -action] + } else { + # action "sink" is a somewhat reasonable default for an output redirection transform + # but it can make it harder to configure a plain ordered stack if the user is not expecting it, so we'll default to stack + # also.. for stdin transform sink makes less sense.. + #todo - default "stack" instead of empty string + set action "" + } + if {[dict exists $args -settings]} { + set logsettings [dict get $args -settings] + } else { + set logsettings {} + } + + set logsettings [dict merge $default_logsettings $logsettings] + set tag [dict get $logsettings -tag] + if {$tag ni $sources} { + lappend sources $tag + } + + set id [shellfilter::stack::add $chan logonly -action $action -settings $logsettings] + return $id + } + + proc ::shellfilter::redir_output_to_log {tagprefix args} { + variable sources + + set default_settings [list -tag ${tagprefix} -syslog 172.16.6.42:51500 -file ""] + + set opts [dict create -action "" -settings {}] + set opts [dict merge $opts $args] + set optsettings [dict get $opts -settings] + set settings [dict merge $default_settings $optsettings] + + set tag [dict get $settings -tag] + if {$tag ne $tagprefix} { + error "shellfilter::redir_output_to_log -tag value must match supplied tagprefix:'$tagprefix'. Omit -tag, or make it the same. It will automatically be suffixed with stderr and stdout. Use redir_channel_to_log if you want to separately configure each channel" + } + lappend sources ${tagprefix}stdout ${tagprefix}stderr + + set stdoutsettings $settings + dict set stdoutsettings -tag ${tagprefix}stdout + set stderrsettings $settings + dict set stderrsettings -tag ${tagprefix}stderr + + set idout [redir_channel_to_log stdout -action [dict get $opts -action] -settings $stdoutsettings] + set iderr [redir_channel_to_log stderr -action [dict get $opts -action] -settings $stderrsettings] + + return [list $idout $iderr] + } + + #return a dict keyed on numerical list index showing info about each element + # - particularly + # 'wouldbrace' to indicate that the item would get braced by Tcl when added to another list + # 'head_tail_chars' to show current first and last character (in case it's wrapped e.g in double or single quotes or an existing set of braces) + proc list_element_info {inputlist} { + set i 0 + set info [dict create] + set testlist [list] + foreach item $inputlist { + set iteminfo [dict create] + set itemlen [string length $item] + lappend testlist $item + set tcl_len [string length $testlist] + set diff [expr {$tcl_len - $itemlen}] + if {$diff == 0} { + dict set iteminfo wouldbrace 0 + dict set iteminfo wouldescape 0 + } else { + #test for escaping vs bracing! + set testlistchars [split $testlist ""] + if {([lindex $testlistchars 0] eq "\{") && ([lindex $testlistchars end] eq "\}")} { + dict set iteminfo wouldbrace 1 + dict set iteminfo wouldescape 0 + } else { + dict set iteminfo wouldbrace 0 + dict set iteminfo wouldescape 1 + } + } + set testlist [list] + set charlist [split $item ""] + set char_a [lindex $charlist 0] + set char_b [lindex $charlist 1] + set char_ab ${char_a}${char_b} + set char_y [lindex $charlist end-1] + set char_z [lindex $charlist end] + set char_yz ${char_y}${char_z} + + if { ("{" in $charlist) || ("}" in $charlist) } { + dict set iteminfo has_braces 1 + set innerchars [lrange $charlist 1 end-1] + if {("{" in $innerchars) || ("}" in $innerchars)} { + dict set iteminfo has_inner_braces 1 + } else { + dict set iteminfo has_inner_braces 0 + } + } else { + dict set iteminfo has_braces 0 + dict set iteminfo has_inner_braces 0 + } + + #todo - brace/char counting to determine if actually 'wrapped' + #e.g we could have list element {((abc)} - which appears wrapped if only looking at first and last chars. + #also {(x) (y)} as a list member.. how to treat? + if {$itemlen <= 1} { + dict set iteminfo apparentwrap "not" + } else { + if {($char_a eq {"}) && ($char_z eq {"})} { + dict set iteminfo apparentwrap "doublequotes" + } elseif {($char_a eq "'") && ($char_z eq "'")} { + dict set iteminfo apparentwrap "singlequotes" + } elseif {($char_a eq "(") && ($char_z eq ")")} { + dict set iteminfo apparentwrap "brackets" + } elseif {($char_a eq "\{") && ($char_z eq "\}")} { + dict set iteminfo apparentwrap "braces" + } elseif {($char_a eq "^") && ($char_z eq "^")} { + dict set iteminfo apparentwrap "carets" + } elseif {($char_a eq "\[") && ($char_z eq "\]")} { + dict set iteminfo apparentwrap "squarebrackets" + } elseif {($char_a eq "`") && ($char_z eq "`")} { + dict set iteminfo apparentwrap "backquotes" + } elseif {($char_a eq "\n") && ($char_z eq "\n")} { + dict set iteminfo apparentwrap "lf-newline" + } elseif {($char_ab eq "\r\n") && ($char_yz eq "\r\n")} { + dict set iteminfo apparentwrap "crlf-newline" + } else { + dict set iteminfo apparentwrap "not-determined" + } + + } + dict set iteminfo wrapbalance "unknown" ;#a hint to caller that apparentwrap is only a guide. todo - possibly make wrapbalance indicate 0 for unbalanced.. and positive numbers for outer-count of wrappings. + #e.g {((x)} == 0 {((x))} == 1 {(x) (y (z))} == 2 + dict set iteminfo head_tail_chars [list $char_a $char_z] + set namemap [list \ + \r cr\ + \n lf\ + {"} doublequote\ + {'} singlequote\ + "`" backquote\ + "^" caret\ + \t tab\ + " " sp\ + "\[" lsquare\ + "\]" rsquare\ + "(" lbracket\ + ")" rbracket\ + "\{" lbrace\ + "\}" rbrace\ + \\ backslash\ + / forwardslash\ + ] + if {[string length $char_a]} { + set char_a_name [string map $namemap $char_a] + } else { + set char_a_name "emptystring" + } + if {[string length $char_z]} { + set char_z_name [string map $namemap $char_z] + } else { + set char_z_name "emptystring" + } + + dict set iteminfo head_tail_names [list $char_a_name $char_z_name] + dict set iteminfo len $itemlen + dict set iteminfo difflen $diff ;#2 for braces, 1 for quoting?, or 0. + dict set info $i $iteminfo + incr i + } + return $info + } + + + #parse bracketed expression (e.g produced by vim "shellxquote=(" ) into a tcl (nested) list + #e.g {(^c:/my spacey/path^ >^somewhere^)} + #e.g {(blah (etc))}" + #Result is always a list - even if only one toplevel set of brackets - so it may need [lindex $result 0] if input is the usual case of {( ...)} + # - because it also supports the perhaps less likely case of: {( ...) unbraced (...)} etc + # Note that + #maintenance warning - duplication in branches for bracketed vs unbracketed! + proc parse_cmd_brackets {str} { + #wordwrappers currently best suited to non-bracket entities - no bracket matching within - anything goes until end-token reached. + # - but.. they only take effect where a word can begin. so a[x y] may be split at the space unless it's within some other wraper e.g " a[x y]" will not break at the space + # todo - consider extending the in-word handling of word_bdepth which is currently only applied to () i.e aaa(x y) is supported but aaa[x y] is not as the space breaks the word up. + set wordwrappers [list \ + "\"" [list "\"" "\"" "\""]\ + {^} [list "\"" "\"" "^"]\ + "'" [list "'" "'" "'"]\ + "\{" [list "\{" "\}" "\}"]\ + {[} [list {[} {]} {]}]\ + ] ;#dict mapping start_character to {replacehead replacetail expectedtail} + set shell_specials [list "|" "|&" "<" "<@" "<<" ">" "2>" ">&" ">>" "2>>" ">>&" ">@" "2>@" "2>@1" ">&@" "&" "&&" ] ;#words/chars that may precede an opening bracket but don't merge with the bracket to form a word. + #puts "pb:$str" + set in_bracket 0 + set in_word 0 + set word "" + set result {} + set word_bdepth 0 + set word_bstack [list] + set wordwrap "" ;#only one active at a time + set bracketed_elements [dict create] + foreach char [split $str ""] { + #puts "c:$char bracketed:$bracketed_elements" + if {$in_bracket > 0} { + if {$in_word} { + if {[string length $wordwrap]} { + #anything goes until end-char + #todo - lookahead and only treat as closing if before a space or ")" ? + lassign [dict get $wordwrappers $wordwrap] _open closing endmark + if {$char eq $endmark} { + set wordwrap "" + append word $closing + dict lappend bracketed_elements $in_bracket $word + set word "" + set in_word 0 + } else { + append word $char + } + } else { + if {$word_bdepth == 0} { + #can potentially close off a word - or start a new one if word-so-far is a shell-special + if {$word in $shell_specials} { + if {$char eq ")"} { + dict lappend bracketed_elements $in_bracket $word + set subresult [dict get $bracketed_elements $in_bracket] + dict set bracketed_elements $in_bracket [list] + incr in_bracket -1 + if {$in_bracket == 0} { + lappend result $subresult + } else { + dict lappend bracketed_elements $in_bracket $subresult + } + set word "" + set in_word 0 + } elseif {[regexp {[\s]} $char]} { + dict lappend bracketed_elements $in_bracket $word + set word "" + set in_word 0 + } elseif {$char eq "("} { + dict lappend bracketed_elements $in_bracket $word + set word "" + set in_word 0 + incr in_bracket + } else { + #at end of shell-specials is another point to look for word started by a wordwrapper char + #- expect common case of things like >^/my/path^ + if {$char in [dict keys $wordwrappers]} { + dict lappend bracketed_elements $in_bracket $word + set word "" + set in_word 1 ;#just for explicitness.. we're straight into the next word. + set wordwrap $char + set word [lindex [dict get $wordwrappers $char] 0] ;#replace trigger char with the start value it maps to. + } else { + #something unusual.. keep going with word! + append word $char + } + } + } else { + + if {$char eq ")"} { + dict lappend bracketed_elements $in_bracket $word + set subresult [dict get $bracketed_elements $in_bracket] + dict set bracketed_elements $in_bracket [list] + incr in_bracket -1 + if {$in_bracket == 0} { + lappend result $subresult + } else { + dict lappend bracketed_elements $in_bracket $subresult + } + set word "" + set in_word 0 + } elseif {[regexp {[\s]} $char]} { + dict lappend bracketed_elements $in_bracket $word + set word "" + set in_word 0 + } elseif {$char eq "("} { + #ordinary word up-against and opening bracket - brackets are part of word. + incr word_bdepth + append word "(" + } else { + append word $char + } + } + } else { + #currently only () are used for word_bdepth - todo add all or some wordwrappers chars so that the word_bstack can have multiple active. + if {$char eq "("} { + incr word_bdepth + lappend word_bstack $char + append word $char + } elseif {$char eq ")"} { + incr word_bdepth -1 + set word_bstack [lrange $word_bstack 0 end-1] + append word $char + } else { + #spaces and chars added to word as it's still in a bracketed section + append word $char + } + } + } + } else { + + if {$char eq "("} { + incr in_bracket + + } elseif {$char eq ")"} { + set subresult [dict get $bracketed_elements $in_bracket] + dict set bracketed_elements $in_bracket [list] + incr in_bracket -1 + if {$in_bracket == 0} { + lappend result $subresult + } else { + dict lappend bracketed_elements $in_bracket $subresult + } + } elseif {[regexp {[\s]} $char]} { + # + } else { + #first char of word - look for word-wrappers + if {$char in [dict keys $wordwrappers]} { + set wordwrap $char + set word [lindex [dict get $wordwrappers $char] 0] ;#replace trigger char with the start value it maps to. + } else { + set word $char + } + set in_word 1 + } + } + } else { + if {$in_word} { + if {[string length $wordwrap]} { + lassign [dict get $wordwrappers $wordwrap] _open closing endmark + if {$char eq $endmark} { + set wordwrap "" + append word $closing + lappend result $word + set word "" + set in_word 0 + } else { + append word $char + } + } else { + + if {$word_bdepth == 0} { + if {$word in $shell_specials} { + if {[regexp {[\s]} $char]} { + lappend result $word + set word "" + set in_word 0 + } elseif {$char eq "("} { + lappend result $word + set word "" + set in_word 0 + incr in_bracket + } else { + #at end of shell-specials is another point to look for word started by a wordwrapper char + #- expect common case of things like >^/my/path^ + if {$char in [dict keys $wordwrappers]} { + lappend result $word + set word "" + set in_word 1 ;#just for explicitness.. we're straight into the next word. + set wordwrap $char + set word [lindex [dict get $wordwrappers $char] 0] ;#replace trigger char with the start value it maps to. + } else { + #something unusual.. keep going with word! + append word $char + } + } + + } else { + if {[regexp {[\s)]} $char]} { + lappend result $word + set word "" + set in_word 0 + } elseif {$char eq "("} { + incr word_bdepth + append word $char + } else { + append word $char + } + } + } else { + if {$char eq "("} { + incr word_bdepth + append word $char + } elseif {$char eq ")"} { + incr word_bdepth -1 + append word $char + } else { + append word $char + } + } + } + } else { + if {[regexp {[\s]} $char]} { + #insig whitespace(?) + } elseif {$char eq "("} { + incr in_bracket + dict set bracketed_elements $in_bracket [list] + } elseif {$char eq ")"} { + error "unbalanced bracket - unable to proceed result so far: $result bracketed_elements:$bracketed_elements" + } else { + #first char of word - look for word-wrappers + if {$char in [dict keys $wordwrappers]} { + set wordwrap $char + set word [lindex [dict get $wordwrappers $char] 0] ;#replace trigger char with the start value it maps to. + } else { + set word $char + } + set in_word 1 + } + } + } + #puts "----$bracketed_elements" + } + if {$in_bracket > 0} { + error "shellfilter::parse_cmd_brackets missing close bracket. input was '$str'" + } + if {[dict exists $bracketed_elements 0]} { + #lappend result [lindex [dict get $bracketed_elements 0] 0] + lappend result [dict get $bracketed_elements 0] + } + if {$in_word} { + lappend result $word + } + return $result + } + + #only double quote if argument not quoted with single or double quotes + proc dquote_if_not_quoted {a} { + if {([string range $a 0 0] eq {"}) && ([string range $a end end] eq {"})} { + return $a + } elseif {([string range $a 0 0] eq {'}) && ([string range $a end end] eq {'})} { + return $a + } else { + set newinner [string map [list {"} "\\\""] $a] + return "\"$newinner\"" + } + } + + #proc dquote_if_not_bracketed/braced? + + #wrap in double quotes if not double-quoted + proc dquote_if_not_dquoted {a} { + if {([string range $a 0 0] eq {"}) && ([string range $a end end] eq {"})} { + return $a + } else { + #escape any inner quotes.. + set newinner [string map [list {"} "\\\""] $a] + return "\"$newinner\"" + } + } + proc dquote {a} { + #escape any inner quotes.. + set newinner [string map [list {"} "\\\""] $a] + return "\"$newinner\"" + } + proc get_scriptrun_from_cmdlist_dquote_if_not {cmdlist} { + set scr [auto_execok "script"] + if {[string length $scr]} { + #set scriptrun "( $c1 [lrange $cmdlist 1 end] )" + set arg1 [lindex $cmdlist 0] + if {[string first " " $arg1]>0} { + set c1 [dquote_if_not_quoted $arg1] + #set c1 "\"$arg1\"" + } else { + set c1 $arg1 + } + + + set scriptrun "( $c1 " + foreach a [lrange $cmdlist 1 end] { + #set a [string map [list "/" "//"] $a] + #set a [string map [list "\"" "\\\""] $a] + if {[string first " " $a] > 0} { + append scriptrun [dquote_if_not_quoted $a] + } else { + append scriptrun $a + } + append scriptrun " " + } + append scriptrun " )" + return [list $scr -q -e -c $scriptrun /dev/null] + } else { + return $cmdlist + } + } + + # run a command (or tcl script) with tees applied to stdout/stderr/stdin (or whatever channels are being used) + # By the point run is called - any transforms should already be in place on the channels if they're needed. + # The tees will be inline with none,some or all of those transforms depending on how the stack was configured + # (upstream,downstream configured via -float,-sink etc) + proc ::shellfilter::run {commandlist args} { + #must be a list. If it was a shell commandline string. convert it elsewhere first. + + variable sources + set runtag "shellfilter-run" + set tid [::shellfilter::log::open $runtag [list -syslog 127.0.0.1:514]] + ::shellfilter::log::write $runtag " commandlist:'$commandlist' len:[llength $commandlist]" + + #flush stdout + #flush stderr + + #adding filters with sink-aside will temporarily disable the existing redirection + #All stderr/stdout from the shellcommand will now tee to the underlying stderr/stdout as well as the configured syslog + + set defaults [dict create \ + -teehandle command \ + -outchan stdout \ + -errchan stderr \ + -inchan stdin \ + -tclscript 0 \ + ] + set opts [dict merge $defaults $args] + set outchan [dict get $opts -outchan] + set errchan [dict get $opts -errchan] + set inchan [dict get $opts -inchan] + set teehandle [dict get $opts -teehandle] + set is_script [dict get $opts -tclscript] + dict unset opts -tclscript ;#don't pass it any further + set teehandle_out ${teehandle}out ;#default commandout + set teehandle_err ${teehandle}err + set teehandle_in ${teehandle}in + + + #puts stdout "shellfilter initialising tee_to_pipe transforms for in/out/err" + + # sources should be added when stack::new called instead(?) + foreach source [list $teehandle_out $teehandle_err] { + if {$source ni $sources} { + lappend sources $source + } + } + set outdeviceinfo [dict get $::shellfilter::stack::pipelines $teehandle_out device] + set outpipechan [dict get $outdeviceinfo localchan] + set errdeviceinfo [dict get $::shellfilter::stack::pipelines $teehandle_err device] + set errpipechan [dict get $errdeviceinfo localchan] + + #set indeviceinfo [dict get $::shellfilter::stack::pipelines $teehandle_in device] + #set inpipechan [dict get $indeviceinfo localchan] + + #NOTE:These transforms are not necessarily at the top of each stack! + #The float/sink mechanism, along with whether existing transforms are diversionary decides where they sit. + set id_out [shellfilter::stack::add $outchan tee_to_pipe -action sink-aside -settings [list -tag $teehandle_out -pipechan $outpipechan]] + set id_err [shellfilter::stack::add $errchan tee_to_pipe -action sink-aside -settings [list -tag $teehandle_err -pipechan $errpipechan]] + + # need to use os level channel handle for stdin - try named pipes (or even sockets) instead of fifo2 for this + # If non os-level channel - the command can't be run with the redirection + # stderr/stdout can be run with non-os handles in the call - + # but then it does introduce issues with terminal-detection and behaviour for stdout at least + # + # input is also a tee - we never want to change the source at this point - just log/process a side-channel of it. + # + #set id_in [shellfilter::stack::add $inchan tee_to_pipe -action sink-aside -settings [list -tag commandin -pipechan $inpipechan]] + + + #set id_out [shellfilter::stack::add stdout tee_to_log -action sink-aside -settings [list -tag shellstdout -syslog 127.0.0.1:514 -file ""]] + #set id_err [shellfilter::stack::add stderr tee_to_log -action sink-aside -settings [list -tag shellstderr -syslog 127.0.0.1:514 -file "stderr.txt"]] + + #we need to catch errors - and ensure stack::remove calls occur. + #An error can be raised if the command couldn't even launch, as opposed to a non-zero exitcode and stderr output from the command itself. + # + if {!$is_script} { + if {[catch { + #run process with stdout/stderr/stdin or with configured channels + #set exitinfo [shellcommand_stdout_stderr $commandlist $outchan $errchan $inpipechan {*}$opts] + set exitinfo [shellcommand_stdout_stderr $commandlist $outchan $errchan stdin {*}$opts] + #subprocess result should usually have an "exitcode" key + #but for background execution we will get a "pids" key of process ids. + } errMsg]} { + set exitinfo [list error "$errMsg" source shellcommand_stdout_stderr] + } + } else { + if {[catch { + #script result + set exitinfo [list result [uplevel #0 [list eval $commandlist]]] + } errMsg]} { + set exitinfo [list error "$errMsg"] + } + } + + + #the previous redirections on the underlying inchan/outchan/errchan items will be restored from the -aside setting during removal + #Remove execution-time Tees from stack + shellfilter::stack::remove stdout $id_out + shellfilter::stack::remove stderr $id_err + #shellfilter::stack::remove stderr $id_in + + + #chan configure stderr -buffering line + #flush stdout + + + ::shellfilter::log::write $runtag " return '$exitinfo'" + ::shellfilter::log::close $runtag + return $exitinfo + } + proc ::shellfilter::logtidyup { {tags {}} } { + variable sources + set worker_errorlist [list] + set tidied_sources [list] + set tidytag "logtidy" + set tid [::shellfilter::log::open $tidytag {-syslog 127.0.0.1:514}] + ::shellfilter::log::write $tidytag " logtidyuptags '$tags'" + foreach s $sources { + if {$s eq $tidytag} { + continue + } + #puts "logtidyup source $s" + set close 1 + if {[llength $tags]} { + if {$s ni $tags} { + set close 0 + } + } + if {$close} { + lappend tidied_sources $s + shellfilter::log::close $s + lappend worker_errorlist {*}[shellthread::manager::get_and_clear_errors $s] + } + } + set remaining_sources [list] + foreach s $sources { + if {$s ni $tidied_sources} { + lappend remaining_sources $s + } + } + set sources [concat $remaining_sources $tidytag] + #shellfilter::stack::unwind stdout + #shellfilter::stack::unwind stderr + return [list tidied $tidied_sources errors $worker_errorlist] + } + + #package require tcl::chan::null + # e.g set errchan [tcl::chan::null] + # e.g chan push stdout [shellfilter::chan::var new ::some_var] + proc ::shellfilter::shellcommand_stdout_stderr {commandlist outchan errchan inchan args} { + set valid_flags [list \ + -timeout \ + -outprefix \ + -errprefix \ + -debug \ + -copytempfile \ + -outbuffering \ + -errbuffering \ + -inbuffering \ + -readprocesstranslation \ + -outtranslation \ + -stdinhandler \ + -outchan \ + -errchan \ + -inchan \ + -teehandle\ + ] + + set runtag shellfilter-run2 + set tid [::shellfilter::log::open $runtag [list -syslog "127.0.0.1:514"]] + + if {([llength $args] % 2) != 0} { + error "Trailing arguments after any positional arguments must be in pairs of the form -argname argvalue. Valid flags are:'$valid_flags'" + } + set invalid_flags [list] + foreach k [dict keys $args] { + if {$k ni $valid_flags} { + lappend invalid_flags $k + } + } + if {[llength $invalid_flags]} { + error "Unknown option(s)'$invalid_flags': must be one of '$valid_flags'" + } + #line buffering generally best for output channels.. keeps relative output order of stdout/stdin closer to source order + #there may be data where line buffering is inappropriate, so it's configurable per std channel + #reading inputs with line buffering can result in extraneous newlines as we can't detect trailing data with no newline before eof. + set defaults [dict create \ + -outchan stdout \ + -errchan stderr \ + -inchan stdin \ + -outbuffering none \ + -errbuffering none \ + -readprocesstranslation auto \ + -outtranslation lf \ + -inbuffering none \ + -timeout 900000\ + -outprefix ""\ + -errprefix ""\ + -debug 0\ + -copytempfile 0\ + -stdinhandler ""\ + ] + + + + set args [dict merge $defaults $args] + set outbuffering [dict get $args -outbuffering] + set errbuffering [dict get $args -errbuffering] + set inbuffering [dict get $args -inbuffering] + set readprocesstranslation [dict get $args -readprocesstranslation] + set outtranslation [dict get $args -outtranslation] + set timeout [dict get $args -timeout] + set outprefix [dict get $args -outprefix] + set errprefix [dict get $args -errprefix] + set debug [dict get $args -debug] + set copytempfile [dict get $args -copytempfile] + set stdinhandler [dict get $args -stdinhandler] + + set debugname "shellfilter-debug" + + if {$debug} { + set tid [::shellfilter::log::open $debugname [list -syslog "127.0.0.1:514"]] + ::shellfilter::log::write $debugname " commandlist '$commandlist'" + } + #'clock micros' good enough id for shellcommand calls unless one day they can somehow be called concurrently or sequentially within a microsecond and within the same interp. + # a simple counter would probably work too + #consider other options if an alternative to the single vwait in this function is used. + set call_id [clock micros] ; + set ::shellfilter::shellcommandvars($call_id,exitcode) "" + set waitvar ::shellfilter::shellcommandvars($call_id,waitvar) + if {$debug} { + ::shellfilter::log::write $debugname " waitvar '$waitvar'" + } + lassign [chan pipe] rderr wrerr + chan configure $wrerr -blocking 0 + + set lastitem [lindex $commandlist end] + + if {[string trim [lindex $commandlist end]] eq "&"} { + set name [lindex $commandlist 0] + #background execution - stdout and stderr from child still comes here - but process is backgrounded + #FIX! - this is broken for paths with backslashes for example + #set pidlist [exec {*}[concat $name [lrange $commandlist 1 end]]] + set pidlist [exec {*}$commandlist] + return [list pids $pidlist] + } + + set custom_stderr "" + if {[string trim $lastitem] in [list {2>&1} {2>@1}]} { + set custom_stderr {2>@1} ;#use the tcl style + set commandlist [lrange $commandlist 0 end-1] + } + set lastitem [lindex $commandlist end] + + set teefile "" ;#empty string, write, append + #an ugly hack.. because redirections seem to arrive wrapped - review! + #There be dragons here.. + #Be very careful with list manipulation of the commandlist string.. backslashes cause havoc. commandlist must always be a well-formed list. generally avoid string manipulations on entire list or accidentally breaking a list element into parts if it shouldn't be.. + #The problem here - is that we can't always know what was intended on the commandline regarding quoting + + ::shellfilter::log::write $runtag "checking for redirections in $commandlist" + #sometimes we see a redirection without a following space e.g >C:/somewhere + #normalize + if {[regexp {^>[/[:alpha:]]+} $lastitem]} { + set lastitem "> [string range $lastitem 1 end]" + } + if {[regexp {^>>[/[:alpha:]]+} $lastitem]} { + set lastitem ">> [string range $lastitem 2 end]" + } + + #for a redirection, we assume either a 2-element list at tail of form {> {some path maybe with spaces}} + #or that the tail redirection is not wrapped.. x y z > {some path maybe with spaces} + #we can't use list methods such as llenth on a member of commandlist + set wordlike_parts [regexp -inline -all {\S+} $lastitem] + + if {([llength $wordlike_parts] >= 2) && ([lindex $wordlike_parts 0] in [list ">>" ">"])} { + #wrapped redirection - but maybe not 'well' wrapped (unquoted filename) + set lastitem [string trim $lastitem] ;#we often see { > something} + + #don't use lassign or lrange on the element itself without checking first + #we can treat the commandlist as a whole as a well formed list but not neccessarily each element within. + #lassign $lastitem redir redirtarget + #set commandlist [lrange $commandlist 0 end-1] + # + set itemchars [split $lastitem ""] + set firstchar [lindex $itemchars 0] + set lastchar [lindex $itemchars end] + + #NAIVE test for double quoted only! + #consider for example {"a" x="b"} + #testing first and last is not decisive + #We need to decide what level of drilling down is even appropriate here.. + #if something was double wrapped - it was perhaps deliberate so we don't interpret it as something(?) + set head_tail_chars [list $firstchar $lastchar] + set doublequoted [expr {[llength [lsearch -all $head_tail_chars "\""]] == 2}] + if {[string equal "\{" $firstchar] && [string equal "\}" $lastchar]} { + set curlyquoted 1 + } else { + set curlyquoted 0 + } + + if {$curlyquoted} { + #these are not the tcl protection brackets but ones supplied in the argument + #it's still not valid to use list operations on a member of the commandlist + set inner [string range $lastitem 1 end-1] + #todo - fix! we still must assume there could be list-breaking data! + set innerwords [regexp -inline -all {\S+} $inner] ;#better than [split $inner] because we don't get extra empty elements for each whitespace char + set redir [lindex $innerwords 0] ;#a *potential* redir - to be tested below + set redirtarget [lrange $innerwords 1 end] ;#all the rest + } elseif {$doublequoted} { + ::shellfilter::log::write $debugname "doublequoting at tail of command '$commandlist'" + set inner [string range $lastitem 1 end-1] + set innerwords [regexp -inline -all {\S+} $inner] + set redir [lindex $innerwords 0] + set redirtarget [lrange $innerwords 1 end] + } else { + set itemwords [regexp -inline -all {\S+} $lastitem] + # e.g > c:\test becomes > {c:\test} + # but > c/mnt/c/test/temp.txt stays as > /mnt/c/test/temp.txt + set redir [lindex $itemwords 0] + set redirtarget [lrange $itemwords 1 end] + } + set commandlist [lrange $commandlist 0 end-1] + + } elseif {[lindex $commandlist end-1] in [list ">>" ">"]} { + #unwrapped redirection + #we should be able to use list operations like lindex and lrange here as the command itself is hopefully still a well formed list + set redir [lindex $commandlist end-1] + set redirtarget [lindex $commandlist end] + set commandlist [lrange $commandlist 0 end-2] + } else { + #no redirection + set redir "" + set redirtarget "" + #no change to command list + } + + + + if {$redir in [list ">>" ">"]} { + set redirtarget [string trim $redirtarget "\""] + ::shellfilter::log::write $runtag " have redirection '$redir' to '$redirtarget'" + + + set winfile $redirtarget ;#default assumption + if {[string match "/c/*" $redirtarget]} { + set winfile "c:/[string range $redirtarget 3 end]" + } + if {[string match "/mnt/c/*" $redirtarget]} { + set winfile "c:/[string range $redirtarget 7 end]" + } + + if {[file exists [file dirname $winfile]]} { + #containing folder for target exists + if {$redir eq ">"} { + set teefile "write" + } else { + set teefile "append" + } + ::shellfilter::log::write $runtag "Directory exists '[file dirname $winfile]' operation:$teefile" + + } else { + #we should be writing to a file.. but can't + ::shellfilter::log::write $runtag "cannot verify directory exists '[file dirname $winfile]'" + + } + } else { + ::shellfilter::log::write $runtag "No redir found!!" + } + #often first element of command list is wrapped and cannot be run directly + #e.g {{ls -l} {> {temp.tmp}}} + #we will assume that if there is a single element which is a pathname containing a space - it is doubly wrapped. + # this may not be true - and the command may fail if it's just {c:\program files\etc} but it is the less common case and we currently have no way to detect. + #unwrap first element.. will not affect if not wrapped anyway (subject to comment above re spaces) + set commandlist [concat [lindex $commandlist 0] [lrange $commandlist 1 end]] + + #todo? + #child process environment. + # - to pass a different environment to the child - we would need to save the env array, modify as required, and then restore the env array. + + #to restore buffering states after run + set remember_in_out_err_buffering [list \ + [chan configure $inchan -buffering] \ + [chan configure $outchan -buffering] \ + [chan configure $errchan -buffering] \ + ] + + set remember_in_out_err_translation [list \ + [chan configure $inchan -translation] \ + [chan configure $outchan -translation] \ + [chan configure $errchan -translation] \ + ] + + + + + + chan configure $inchan -buffering $inbuffering -blocking 0 ;#we are setting up a readable handler for this - so non-blocking ok + chan configure $errchan -buffering $errbuffering + #chan configure $outchan -blocking 0 + chan configure $outchan -buffering $outbuffering ;#don't configure non-blocking. weird duplicate of *second* line occurs if you do. + # + + #-------------------------------------------- + #Tested on windows. Works to stop in output when buffering is none, reading from channel with -translation auto + #cmd, pwsh, tcl + #chan configure $outchan -translation lf + #chan configure $errchan -translation lf + #-------------------------------------------- + chan configure $outchan -translation $outtranslation + chan configure $errchan -translation $outtranslation + + if {$debug} { + ::shellfilter::log::write $debugname "COMMAND [list $commandlist] strlen:[string length $commandlist] llen:[llength $commandlist]" + } + #todo - handle custom redirection of stderr to a file? + if {[string length $custom_stderr]} { + ::shellfilter::log::write "LAUNCH open |[concat $commandlist $custom_stderr] a+" + set rdout [open |[concat $commandlist $custom_stderr] a+] + } else { + ::shellfilter::log::write $runtag "LAUNCH open |[concat $commandlist [list 2>@$wrerr <@$inchan]] [list RDONLY]" + #set rdout [open |[concat $commandlist [list 2>@$wrerr]] a+] + #set rdout [open |[concat $commandlist [list 2>@$wrerr]] [list RDWR]] + set rdout [open |[concat $commandlist [list 2>@$wrerr <@$inchan]] [list RDONLY]] + } + set command_pids [pid $rdout] + #puts stderr "command_pids: $command_pids" + #tcl::process ensemble only available in 8.7+ - and it didn't prove useful here anyway + # the child process generally won't shut down until channels are closed. + # premature EOF on grandchild process launch seems to be due to lack of terminal emulation when redirecting stdin/stdout. + # worked around in punk/repl using 'script' command as a fake tty. + #set subprocesses [tcl::process::list] + #puts stderr "subprocesses: $subprocesses" + #if {[lindex $command_pids 0] ni $subprocesses} { + # puts stderr "pid [lindex $command_pids 0] not running $errMsg" + #} else { + # puts stderr "pid [lindex $command_pids 0] is running" + #} + + + if {$debug} { + ::shellfilter::log::write $debugname "pipeline pids: $command_pids" + } + + #jjj + + chan configure $rderr -buffering $errbuffering -blocking 0 + chan configure $rdout -buffering $outbuffering -blocking 0 + chan configure $rderr -translation $readprocesstranslation + chan configure $rdout -translation $readprocesstranslation + + if {![string length $custom_stderr]} { + chan event $rderr readable [list apply {{chan other wrerr outchan errchan waitfor errprefix errbuffering debug debugname pids} { + if {$errbuffering eq "line"} { + set countchunk [chan gets $chan chunk] ;#only get one line so that order between stderr and stdout is more likely to be preserved + #errprefix only applicable to line buffered output + if {$countchunk >= 0} { + if {[chan eof $chan]} { + puts -nonewline $errchan ${errprefix}$chunk + } else { + puts $errchan "${errprefix}$chunk" + } + } + } else { + set chunk [chan read $chan] + if {[string length $chunk]} { + puts -nonewline $errchan $chunk + } + } + if {[chan eof $chan]} { + flush $errchan ;#jmn + #set subprocesses [tcl::process::list] + #puts stderr "subprocesses: $subprocesses" + #if {[lindex $pids 0] ni $subprocesses} { + # puts stderr "stderr reader: pid [lindex $pids 0] no longer running" + #} else { + # puts stderr "stderr reader: pid [lindex $pids 0] still running" + #} + chan close $chan + #catch {chan close $wrerr} + if {$other ni [chan names]} { + set $waitfor stderr + } + } + }} $rderr $rdout $wrerr $outchan $errchan $waitvar $errprefix $errbuffering $debug $debugname $command_pids] + } + + #todo - handle case where large amount of stdin coming in faster than rdout can handle + #as is - arbitrary amount of memory could be used because we aren't using a filevent for rdout being writable + # - we're just pumping it in to the non-blocking rdout buffers + # ie there is no backpressure and stdin will suck in as fast as possible. + # for most commandlines this probably isn't too big a deal.. but it could be a problem for multi-GB disk images etc + # + # + + ## Note - detecting trailing missing nl before eof is basically the same here as when reading rdout from executable + # - but there is a slight difference in that with rdout we get an extra blocked state just prior to the final read. + # Not known if that is significant + ## with inchan configured -buffering line + #c:\repo\jn\shellspy\test>printf "test\netc\n" | tclsh shellspy.vfs/main.tcl -r cat + #warning reading input with -buffering line. Cannot detect missing trailing-newline at eof + #instate b:0 eof:0 pend:-1 count:4 + #test + #instate b:0 eof:0 pend:-1 count:3 + #etc + #instate b:0 eof:1 pend:-1 count:-1 + + #c:\repo\jn\shellspy\test>printf "test\netc" | tclsh shellspy.vfs/main.tcl -r cat + #warning reading input with -buffering line. Cannot detect missing trailing-newline at eof + #instate b:0 eof:0 pend:-1 count:4 + #test + #instate b:0 eof:1 pend:-1 count:3 + #etc + + if 0 { + chan event $inchan readable [list apply {{chan wrchan inbuffering waitfor} { + #chan copy stdin $chan ;#doesn't work in a chan event + if {$inbuffering eq "line"} { + set countchunk [chan gets $chan chunk] + #puts $wrchan "stdinstate b:[chan blocked $chan] eof:[chan eof $chan] pend:[chan pending output $chan] count:$countchunk" + if {$countchunk >= 0} { + if {[chan eof $chan]} { + puts -nonewline $wrchan $chunk + } else { + puts $wrchan $chunk + } + } + } else { + set chunk [chan read $chan] + if {[string length $chunk]} { + puts -nonewline $wrchan $chunk + } + } + if {[chan eof $chan]} { + puts stderr "|stdin_reader>eof [chan configure stdin]" + chan event $chan readable {} + #chan close $chan + chan close $wrchan write ;#half close + #set $waitfor "stdin" + } + }} $inchan $rdout $inbuffering $waitvar] + + if {[string length $stdinhandler]} { + chan configure stdin -buffering line -blocking 0 + chan event stdin readable $stdinhandler + } + } + + set actual_proc_out_buffering [chan configure $rdout -buffering] + set actual_outchan_buffering [chan configure $outchan -buffering] + #despite whatever is configured - we match our reading to how we need to output + set read_proc_out_buffering $actual_outchan_buffering + + + + if {[string length $teefile]} { + set logname "redir_[string map [list : _ ] $winfile]_[clock micros]" + set tid [::shellfilter::log::open $logname {-syslog 127.0.0.1:514}] + if {$teefile eq "write"} { + ::shellfilter::log::write $logname "opening '$winfile' for write" + set fd [open $winfile w] + } else { + ::shellfilter::log::write $logname "opening '$winfile' for appending" + set fd [open $winfile a] + } + #chan configure $fd -translation lf + chan configure $fd -translation $outtranslation + chan configure $fd -encoding utf-8 + + set tempvar_bytetotal [namespace current]::totalbytes[clock micros] + set $tempvar_bytetotal 0 + chan event $rdout readable [list apply {{chan other wrerr outchan errchan read_proc_out_buffering waitfor outprefix call_id debug debugname writefile writefilefd copytempfile bytevar logtag} { + #review - if we write outprefix to normal stdout.. why not to redirected file? + #usefulness of outprefix is dubious + upvar $bytevar totalbytes + if {$read_proc_out_buffering eq "line"} { + #set outchunk [chan read $chan] + set countchunk [chan gets $chan outchunk] ;#only get one line so that order between stderr and stdout is more likely to be preserved + if {$countchunk >= 0} { + if {![chan eof $chan]} { + set numbytes [expr {[string length $outchunk] + 1}] ;#we are assuming \n not \r\n - but count won't/can't be completely accurate(?) - review + puts $writefilefd $outchunk + } else { + set numbytes [string length $outchunk] + puts -nonewline $writefilefd $outchunk + } + incr totalbytes $numbytes + ::shellfilter::log::write $logtag "${outprefix} wrote $numbytes bytes to $writefile" + #puts $outchan "${outprefix} wrote $numbytes bytes to $writefile" + } + } else { + set outchunk [chan read $chan] + if {[string length $outchunk]} { + puts -nonewline $writefilefd $outchunk + set numbytes [string length $outchunk] + incr totalbytes $numbytes + ::shellfilter::log::write $logtag "${outprefix} wrote $numbytes bytes to $writefile" + } + } + if {[chan eof $chan]} { + flush $writefilefd ;#jmn + #set blocking so we can get exit code + chan configure $chan -blocking 1 + catch {::shellfilter::log::write $logtag "${outprefix} total bytes $totalbytes written to $writefile"} + #puts $outchan "${outprefix} total bytes $totalbytes written to $writefile" + catch {close $writefilefd} + if {$copytempfile} { + catch {file copy $writefile "[file rootname $writefile]_copy[file extension $writefile]"} + } + try { + chan close $chan + set ::shellfilter::shellcommandvars($call_id,exitcode) 0 + if {$debug} { + ::shellfilter::log::write $debugname "(teefile) -- child process returned no error. (exit code 0) --" + } + } trap CHILDSTATUS {result options} { + set code [lindex [dict get $options -errorcode] 2] + if {$debug} { + ::shellfilter::log::write $debugname "(teefile) CHILD PROCESS EXITED with code: $code" + } + set ::shellfilter::shellcommandvars($call_id,exitcode) $code + } + catch {chan close $wrerr} + if {$other ni [chan names]} { + set $waitfor stdout + } + } + }} $rdout $rderr $wrerr $outchan $errchan $read_proc_out_buffering $waitvar $outprefix $call_id $debug $debugname $winfile $fd $copytempfile $tempvar_bytetotal $logname] + + } else { + + # This occurs when we have outbuffering set to 'line' - as the 'input' from rdout which comes from the executable is also configured to 'line' + # where b:0|1 is whether chan blocked $chan returns 0 or 1 + # pend is the result of chan pending $chan + # eof is the resot of chan eof $chan + + + ##------------------------- + ##If we still read with gets,to retrieve line by line for output to line-buffered output - but the input channel is configured with -buffering none + ## then we can detect the difference + # there is an extra blocking read - but we can stil use eof with data to detect the absent newline and avoid passing an extra one on. + #c:\repo\jn\shellspy\test>printf "test\netc\n" | tclsh shellspy.vfs/main.tcl /c cat + #instate b:0 eof:0 pend:-1 count:4 + #test + #instate b:0 eof:0 pend:-1 count:3 + #etc + #instate b:0 eof:1 pend:-1 count:-1 + + #c:\repo\jn\shellspy\test>printf "test\netc" | tclsh shellspy.vfs/main.tcl /u/c cat + #instate b:0 eof:0 pend:-1 count:4 + #test + #instate b:1 eof:0 pend:-1 count:-1 + #instate b:0 eof:1 pend:-1 count:3 + #etc + ##------------------------ + + + #this should only occur if upstream is coming from stdin reader that has line buffering and hasn't handled the difference properly.. + ###reading with gets from line buffered input with trailing newline + #c:\repo\jn\shellspy\test>printf "test\netc\n" | tclsh shellspy.vfs/main.tcl /c cat + #instate b:0 eof:0 pend:-1 count:4 + #test + #instate b:0 eof:0 pend:-1 count:3 + #etc + #instate b:0 eof:1 pend:-1 count:-1 + + ###reading with gets from line buffered input with trailing newline + ##No detectable difference! + #c:\repo\jn\shellspy\test>printf "test\netc" | tclsh shellspy.vfs/main.tcl /c cat + #instate b:0 eof:0 pend:-1 count:4 + #test + #instate b:0 eof:0 pend:-1 count:3 + #etc + #instate b:0 eof:1 pend:-1 count:-1 + ##------------------------- + + #Note that reading from -buffering none and writing straight out gives no problem because we pass the newlines through as is + + + #set ::shellfilter::chan::lastreadblocked_nodata_noeof($rdout) 0 ;#a very specific case of readblocked prior to eof.. possibly not important + #this detection is disabled for now - but left for debugging in case it means something.. or changes + chan event $rdout readable [list apply {{chan other wrerr outchan errchan read_proc_out_buffering waitfor outprefix call_id debug debugname pids} { + #set outchunk [chan read $chan] + + if {$read_proc_out_buffering eq "line"} { + set countchunk [chan gets $chan outchunk] ;#only get one line so that order between stderr and stdout is more likely to be preserved + #countchunk can be -1 before eof e.g when blocked + #debugging output inline with data - don't leave enabled + #puts $outchan "instate b:[chan blocked $chan] eof:[chan eof $chan] pend:[chan pending output $chan] count:$countchunk" + if {$countchunk >= 0} { + if {![chan eof $chan]} { + puts $outchan ${outprefix}$outchunk + } else { + puts -nonewline $outchan ${outprefix}$outchunk + #if {$::shellfilter::chan::lastreadblocked_nodata_noeof($chan)} { + # seems to be the usual case + #} else { + # #false alarm, or ? we've reached eof with data but didn't get an empty blocking read just prior + # #Not known if this occurs + # #debugging output inline with data - don't leave enabled + # puts $outchan "!!!prev read didn't block: instate b:[chan blocked $chan] eof:[chan eof $chan] pend:[chan pending output $chan] count:$countchunk" + #} + } + #set ::shellfilter::chan::lastreadblocked_nodata_noeof($chan) 0 + } else { + #set ::shellfilter::chan::lastreadblocked_nodata_noeof($chan) [expr {[chan blocked $chan] && ![chan eof $chan]}] + } + } else { + #puts $outchan "read CHANNEL $chan [chan configure $chan]" + #puts $outchan "write CHANNEL $outchan b:[chan configure $outchan -buffering] t:[chan configure $outchan -translation] e:[chan configure $outchan -encoding]" + set outchunk [chan read $chan] + #puts $outchan "instate b:[chan blocked $chan] eof:[chan eof $chan] pend:[chan pending output $chan] count:[string length $outchunk]" + if {[string length $outchunk]} { + #set stringrep [encoding convertfrom utf-8 $outchunk] + #set newbytes [encoding convertto utf-16 $stringrep] + #puts -nonewline $outchan $newbytes + puts -nonewline $outchan $outchunk + } + } + + if {[chan eof $chan]} { + flush $outchan ;#jmn + #for now just look for first element in the pid list.. + #set subprocesses [tcl::process::list] + #puts stderr "subprocesses: $subprocesses" + #if {[lindex $pids 0] ni $subprocesses} { + # puts stderr "stdout reader pid: [lindex $pids 0] no longer running" + #} else { + # puts stderr "stdout reader pid: [lindex $pids 0] still running" + #} + + #puts $outchan "instate b:[chan blocked $chan] eof:[chan eof $chan] pend:[chan pending output $chan]" + chan configure $chan -blocking 1 ;#so we can get exit code + try { + chan close $chan + set ::shellfilter::shellcommandvars($call_id,exitcode) 0 + if {$debug} { + ::shellfilter::log::write $debugname " -- child process returned no error. (exit code 0) --" + } + } trap CHILDSTATUS {result options} { + set code [lindex [dict get $options -errorcode] 2] + if {$debug} { + ::shellfilter::log::write $debugname " CHILD PROCESS EXITED with code: $code" + } + set ::shellfilter::shellcommandvars($call_id,exitcode) $code + } trap CHILDKILLED {result options} { + #set code [lindex [dict get $options -errorcode] 2] + #set ::shellfilter::shellcommandvars(%id%,exitcode) $code + set ::shellfilter::shellcommandvars($call_id,exitcode) "childkilled" + ::shellfilter::log::write $debugname " CHILD PROCESS EXITED with result:'$result' options:'$options'" + + } finally { + #puts stdout "HERE" + #flush stdout + + } + catch {chan close $wrerr} + if {$other ni [chan names]} { + set $waitfor stdout + } + + } + }} $rdout $rderr $wrerr $outchan $errchan $read_proc_out_buffering $waitvar $outprefix $call_id $debug $debugname $command_pids] + } + + #todo - add ability to detect activity/data-flow and change timeout to only apply for period with zero data + #e.g x hrs with no data(?) + #reset timeout when data detected. + after $timeout [string map [list %w $waitvar %id% $call_id %wrerr% $wrerr %rdout% $rdout %rderr% $rderr %debug% $debug %debugname% $debugname] { + if {[info exists ::shellfilter::shellcommandvars(%id%,exitcode)]} { + if {[set ::shellfilter::shellcommandvars(%id%,exitcode)] ne ""} { + catch { chan close %wrerr% } + catch { chan close %rdout%} + catch { chan close %rderr%} + } else { + chan configure %rdout% -blocking 1 + try { + chan close %rdout% + set ::shellfilter::shellcommandvars(%id%,exitcode) 0 + if {%debug%} { + ::shellfilter::log::write %debugname% "(timeout) -- child process returned no error. (exit code 0) --" + } + } trap CHILDSTATUS {result options} { + set code [lindex [dict get $options -errorcode] 2] + if {%debug%} { + ::shellfilter::log::write %debugname% "(timeout) CHILD PROCESS EXITED with code: $code" + } + set ::shellfilter::shellcommandvars(%id%,exitcode) $code + } trap CHILDKILLED {result options} { + set code [lindex [dict get $options -errorcode] 2] + #set code [dict get $options -code] + #set ::shellfilter::shellcommandvars(%id%,exitcode) $code + set ::shellfilter::shellcommandvars($call_id,exitcode) "childkilled-timeout" + if {%debug%} { + ::shellfilter::log::write %debugname% "(timeout) CHILDKILLED with code: $code" + ::shellfilter::log::write %debugname% "(timeout) result:$result options:$options" + } + + } + catch { chan close %wrerr% } + catch { chan close %rderr%} + + } + set %w "timeout" + } + }] + + + vwait $waitvar + + set exitcode [set ::shellfilter::shellcommandvars($call_id,exitcode)] + if {![string is digit -strict $exitcode]} { + puts stderr "Process exited with non-numeric code: $exitcode" + flush stderr + } + if {[string length $teefile]} { + #cannot be called from within an event handler above.. vwait reentrancy etc + catch {::shellfilter::log::close $logname} + } + + if {$debug} { + ::shellfilter::log::write $debugname " closed by: [set $waitvar] with exitcode: $exitcode" + catch {::shellfilter::log::close $debugname} + } + array unset ::shellfilter::shellcommandvars $call_id,* + + + #restore buffering to pre shellfilter::run state + lassign $remember_in_out_err_buffering bin bout berr + chan configure $inchan -buffering $bin + chan configure $outchan -buffering $bout + chan configure $errchan -buffering $berr + + lassign $remember_in_out_err_translation tin tout terr + chan configure $inchan -translation $tin + chan configure $outchan -translation $tout + chan configure $errchan -translation $terr + + + #in channel probably closed..(? review - should it be?) + catch { + chan configure $inchan -buffering $bin + } + + + return [list exitcode $exitcode] + } + +} diff --git a/src/modules/shellthread-1.6.tm b/src/modules/shellthread-1.6.tm new file mode 100644 index 00000000..6c44242f --- /dev/null +++ b/src/modules/shellthread-1.6.tm @@ -0,0 +1,595 @@ +#package require logger + +package provide shellthread [namespace eval shellthread { + variable version + set version 1.6 +}] + + +package require Thread + +namespace eval shellthread { + + proc iso8601 {{tsmicros ""}} { + if {$tsmicros eq ""} { + set tsmicros [clock micros] + } else { + set microsnow [clock micros] + if {[string length $tsmicros] != [string length $microsnow]} { + error "iso8601 requires 'clock micros' or empty string to create timestamp" + } + } + set seconds [expr {$tsmicros / 1000000}] + return [clock format $seconds -format "%Y-%m-%d_%H-%M-%S"] + } +} + +namespace eval shellthread::worker { + variable settings + variable sysloghost_port + variable sock + variable logfile "" + variable fd + variable client_ids [list] + variable ts_start_micros + variable errorlist [list] + variable inpipe "" + + proc bgerror {args} { + variable errorlist + lappend errorlist $args + } + proc send_errors_now {tidcli} { + variable errorlist + thread::send -async $tidcli [list shellthread::manager::report_worker_errors [list worker_tid [thread::id] errors $errorlist]] + } + proc add_client_tid {tidcli} { + variable client_ids + if {$tidcli ni $client_ids} { + lappend client_ids $tidcli + } + } + proc init {tidclient start_m settingsdict} { + variable sysloghost_port + variable logfile + variable settings + interp bgerror {} shellthread::worker::bgerror + package require overtype + variable client_ids + variable ts_start_micros + lappend client_ids $tidclient + set ts_start_micros $start_m + + set defaults [list -raw 0 -file "" -syslog "" -direction out] + set settings [dict merge $defaults $settingsdict] + + set syslog [dict get $settings -syslog] + if {[string length $syslog]} { + lassign [split $syslog :] s_host s_port + set sysloghost_port [list $s_host $s_port] + } else { + set sysloghost_port "" + } + if {[catch {package require udp} errm]} { + #disable rather than bomb and interfere with any -file being written + set sysloghost_port "" + } + + set logfile [dict get $settings -file] + } + + proc start_pipe_read {source readchan args} { + #assume 1 inpipe for now + variable inpipe + variable sysloghost_port + variable logfile + set defaults [dict create -buffering \uFFFF ] + set opts [dict merge $defaults $args] + if {[dict exists $opts -readbuffering]} { + set readbuffering [dict get $opts -readbuffering] + } else { + if {[dict get $opts -buffering] eq "\uFFFF"} { + #get buffering setting from the channel as it was set prior to thread::transfer + set readbuffering [chan configure $readchan -buffering] + } else { + set readbuffering [dict get $opts -buffering] + chan configure $readchan -buffering $readbuffering + } + } + if {[dict exists $opts -writebuffering]} { + set writebuffering [dict get $opts -writebuffering] + } else { + if {[dict get $opts -buffering] eq "\uFFFF"} { + set writebuffering line + #set writebuffering [chan configure $writechan -buffering] + } else { + set writebuffering [dict get $opts -buffering] + #can configure $writechan -buffering $writebuffering + } + } + + chan configure $readchan -translation lf + + if {$readchan ni [chan names]} { + error "shellthread::worker::start_pipe_read - inpipe not configured. Use shellthread::manager::set_pipe_read_from_client to thread::transfer the pipe end" + } + set inpipe $readchan + #::shellthread::worker::log $inpipe 0 - $source - info "START PIPE READ HELLO\n" line + chan configure $readchan -blocking 0 + #::shellthread::worker::log $inpipe 0 - $source - info "START PIPE READ HELLO2 readbuffering: $readbuffering syslog $sysloghost_port filename $logfile" line + + set waitvar ::shellthread::worker::wait($inpipe,[clock micros]) + chan event $readchan readable [list apply {{chan source waitfor readbuffering writebuffering} { + if {$readbuffering eq "line"} { + set chunksize [chan gets $chan chunk] + if {$chunksize >= 0} { + if {![chan eof $chan]} { + ::shellthread::worker::log pipe 0 - $source - info $chunk\n $writebuffering + } else { + ::shellthread::worker::log pipe 0 - $source - info $chunk $writebuffering + } + } + } else { + set chunk [chan read $chan] + ::shellthread::worker::log pipe 0 - $source - info $chunk $writebuffering + } + if {[chan eof $chan]} { + chan event $chan readable {} + set $waitfor "pipe" + chan close $chan + } + }} $readchan $source $waitvar $readbuffering $writebuffering] + #::shellthread::worker::log $inpipe 0 - $source - info "START PIPE READ HELLO3 vwaiting on $waitvar\n" line + vwait $waitvar + } + + proc start_pipe_write {source writechan args} { + variable outpipe + set defaults [dict create -buffering \uFFFF ] + set opts [dict merge $defaults $args] + + #todo! + set readchan stdin + + if {[dict exists $opts -readbuffering]} { + set readbuffering [dict get $opts -readbuffering] + } else { + if {[dict get $opts -buffering] eq "\uFFFF"} { + set readbuffering [chan configure $readchan -buffering] + } else { + set readbuffering [dict get $opts -buffering] + chan configure $readchan -buffering $readbuffering + } + } + if {[dict exists $opts -writebuffering]} { + set writebuffering [dict get $opts -writebuffering] + } else { + if {[dict get $opts -buffering] eq "\uFFFF"} { + #nothing explicitly set - take from transferred channel + set writebuffering [chan configure $writechan -buffering] + } else { + set writebuffering [dict get $opts -buffering] + can configure $writechan -buffering $writebuffering + } + } + + if {$writechan ni [chan names]} { + error "shellthread::worker::start_pipe_write - outpipe not configured. Use shellthread::manager::set_pipe_write_to_client to thread::transfer the pipe end" + } + set outpipe $writechan + chan configure $readchan -blocking 0 + chan configure $writechan -blocking 0 + set waitvar ::shellthread::worker::wait($outpipe,[clock micros]) + + chan event $readchan readable [list apply {{chan writechan source waitfor readbuffering} { + if {$readbuffering eq "line"} { + set chunksize [chan gets $chan chunk] + if {$chunksize >= 0} { + if {![chan eof $chan]} { + puts $writechan $chunk + } else { + puts -nonewline $writechan $chunk + } + } + } else { + set chunk [chan read $chan] + puts -nonewline $writechan $chunk + } + if {[chan eof $chan]} { + chan event $chan readable {} + set $waitfor "pipe" + chan close $writechan + if {$chan ne "stdin"} { + chan close $chan + } + } + }} $readchan $writechan $source $waitvar $readbuffering] + + vwait $waitvar + } + + + proc _initsock {} { + variable sysloghost_port + variable sock + if {[string length $sysloghost_port]} { + if {[catch {fconfigure $sock} state]} { + set sock [udp_open] + fconfigure $sock -buffering none -translation binary + fconfigure $sock -remote $sysloghost_port + } + } + } + proc _reconnect {} { + variable sock + catch {close $sock} + _initsock + return [fconfigure $sock] + } + + proc send_info {client_tid ts_sent source msg} { + set ts_received [clock micros] + set lag_micros [expr {$ts_received - $ts_sent}] + set lag [expr {$lag_micros / 1000000.0}] ;#lag as x.xxxxxx seconds + + log $client_tid $ts_sent $lag $source - info $msg line 1 + } + proc log {client_tid ts_sent lag source service level msg writebuffering {islog 0}} { + variable sock + variable fd + variable sysloghost_port + variable logfile + variable settings + + set logchunk $msg + + if {![dict get $settings -raw]} { + set tail_crlf 0 + set tail_lf 0 + set tail_cr 0 + #for cooked - always remove the trailing newline before splitting.. + # + #note that if we got our data from reading a non-line-buffered binary channel - then this naive line splitting will not split neatly for mixed line-endings. + # + #Possibly not critical as cooked is for logging and we are still preserving all \r and \n chars - but review and consider implementing a better split + #but add it back exactly as it was afterwards + #we can always split on \n - and any adjacent \r will be preserved in the rejoin + set lastchar [string range $logchunk end end] + if {[string range $logchunk end-1 end] eq "\r\n"} { + set tail_crlf 1 + set logchunk [string range $logchunk 0 end-2] + } else { + if {$lastchar eq "\n"} { + set tail_lf 1 + set logchunk [string range $logchunk 0 end-1] + } elseif {$lastchar eq "\r"} { + #\r line-endings are obsolete..and unlikely... and ugly as they can hide characters on the console. but we'll pass through anyway. + set tail_cr 1 + set logchunk [string range $logchunk 0 end-1] + } else { + #possibly a single line with no linefeed.. or has linefeeds only in the middle + } + } + + if {$ts_sent != 0} { + set micros [lindex [split [expr {$ts_sent / 1000000.0}] .] end] + set time_info [::shellthread::iso8601 $ts_sent].$micros + #set time_info "${time_info}+$lag" + set lagfp "+[format %f $lag]" + } else { + #from pipe - no ts_sent/lag info available + set time_info "" + set lagfp "" + } + + set idtail [string range $client_tid end-8 end] ;#enough for display purposes id - mostly zeros anyway + set col0 [string repeat " " 9] + set col1 [string repeat " " 27] + set col2 [string repeat " " 11] + set col3 [string repeat " " 20] + #do not columnize the final data column or append to tail - or we could muck up the crlf integrity + + lassign [list [overtype::left $col0 $idtail] [overtype::left $col1 $time_info] [overtype::left $col2 $lagfp] [overtype::left $col3 $source]] c0 c1 c2 c3 + + #split on \n no matter the actual line-ending in use + #shouldn't matter as long as we don't add anything at the end of the line other than the raw data + #ie - don't quote or add spaces + set lines [split $logchunk \n] + + set i 1 + set outlines [list] + foreach ln $lines { + if {$i == 1} { + lappend outlines "$c0 $c1 $c2 $c3 $ln" + } else { + lappend outlines "$c0 $c1 $col2 $c3 $ln" + } + incr i + } + if {$tail_lf} { + set logchunk "[join $outlines \n]\n" + } elseif {$tail_crlf} { + set logchunk "[join $outlines \r\n]\r\n" + } elseif {$tail_cr} { + set logchunk "[join $outlines \r]\r" + } else { + #no trailing linefeed + set logchunk [join $outlines \n] + + } + + #set logchunk "[overtype::left $col0 $idtail] [overtype::left $col1 $time_info] [overtype::left $col2 "+$lagfp"] [overtype::left $col3 $source] $msg" + } + + if {[string length $sysloghost_port]} { + _initsock + catch {puts -nonewline $sock $logchunk} + } + #todo - sockets etc? + if {[string length $logfile]} { + #todo - setting to maintain open filehandle and reduce io. + # possible settings for buffersize - and maybe logrotation, although this could be left to client + #for now - default to safe option of open/close each write despite the overhead. + set fd [open $logfile a] + chan configure $fd -translation auto -buffering $writebuffering + #whether line buffered or not - by now our logchunk includes newlines + puts -nonewline $fd $logchunk + close $fd + } + } + + # - withdraw just this client + proc finish {tidclient} { + variable client_ids + if {($tidclient in $clientids) && ([llength $clientids] == 1)} { + terminate $tidclient + } else { + set posn [lsearch $client_ids $tidclient] + set client_ids [lreplace $clientids $posn $posn] + } + } + + #allow any client to terminate + proc terminate {tidclient} { + variable sock + variable client_ids + if {$tidclient in $client_ids} { + catch {close $sock} + set client_ids [list] + return 1 + } else { + return 0 + } + } + + +} + + +namespace eval shellthread::manager { + variable workers [dict create] + variable worker_errors [list] + + variable log_threads + + #new datastructure regarding workers and sourcetags required. + #one worker can service multiple sourcetags - but each sourcetag may be used by multiple threads too. + #generally each thread will use a specific sourcetag - but we may have pools doing similar things which log to same destination. + # + #As a convention we may use a sourcetag for the thread which started the worker that isn't actually used for logging - but as a common target for joins + #If the thread which started the thread calls leave_worker with that 'primary' sourcetag it means others won't be able to use that target - which seems reasonable. + #If another thread want's to maintain joinability beyond the span provided by the starting client, + #it can join with both the primary tag and a tag it will actually use for logging. + #A thread can join the logger with any existingtag - not just the 'primary' + #(which is arbitrary anyway. It will usually be the first in the list - but may be unsubscribed by clients and disappear) + proc join_worker {client_tid existingtag sourcetaglist} { + #todo - allow a source to piggyback on existing worker by referencing one of the sourcetags already using the worker + } + proc leave_worker {client_tid sourcetaglist} { + #todo + #unsub this client_tid from the sourcetags in the sourcetaglist. if no more client_tids exist for sourcetag, remove sourcetag, + #if no more sourcetags - close worker + } + #it is up to caller to use a unique sourcetag (e.g by prefixing with own thread::id etc) + # This allows multiple threads to more easily write to the same named sourcetag if necessary + # todo - change sourcetag for a list of tags which will be handled by the same thread. e.g for multiple threads logging to same file + # + # todo - some protection mechanism for case where target is a file to stop creation of multiple worker threads writing to same file. + # Even if we use open fd,close fd wrapped around writes.. it is probably undesirable to have multiple threads with same target + # On the other hand socket targets such as UDP can happily be written to by multiple threads. + # For now the mechanism is that a call to new_worker (rename to open_worker?) will join the same thread if a sourcetag matches.. + # but, as sourcetags can get removed(unsubbed via leave_worker) this doesn't guarantee two threads with same -file settings won't fight. + # Also.. the settingsdict is ignored when joining with a tag that exists.. this is problematic.. e.g logrotation where previous file still being written by existing worker + # todo - rename 'sourcetag' concept to 'targettag' ?? the concept is a mixture of both.. it is somewhat analagous to a syslog 'facility' + # probably new_worker should disallow auto-joining and we allow different workers to handle same tags simultaneously to support overlap during logrotation etc. + proc new_worker {sourcetaglist {settingsdict {}}} { + variable workers + set ts_start [clock micros] + set tidclient [thread::id] + set sourcetag [lindex $sourcetaglist 0] ;#todo - use all + + if {[dict exists $workers $sourcetag]} { + set winfo [dict get $workers $sourcetag] + if {[thread::exists [dict get $winfo tid]]} { + #add our client-info to existing worker thread + dict lappend winfo list_client_tids $tidclient + dict set workers $sourcetag $winfo ;#writeback + return [dict get $winfo tid] + } + } + #set ts_start [::shellthread::iso8601] + set tidworker [thread::create -preserved] + set init_script [string map [list %ts_start% $ts_start %mp% [tcl::tm::list] %ap% $::auto_path %tidcli% $tidclient %sd% $settingsdict] { + #set tclbase [file dirname [file dirname [info nameofexecutable]]] + #set tcllib $tclbase/lib + #if {$tcllib ni $::auto_path} { + # lappend ::auto_path $tcllib + #} + + set ::settingsinfo [dict create %sd%] + #if the executable running things is something like a tclkit, + # then it's likely we will need to use the caller's auto_path and tcl::tm::list to find things + #The caller can tune the thread's package search by providing a settingsdict + if {![dict exists $::settingsinfo tcl_tm_list]} { + tcl::tm::add %mp% + } else { + tcl::tm::remove {*}[tcl::tm::list] + tcl::tm::add {*}[dict get $::settingsinfo tcl_tm_list] + } + if {![dict exists $::settingsinfo auto_path]} { + set ::auto_path [list %ap%] + } else { + set ::auto_path [dict get $::settingsinfo auto_path] + } + + package require Thread + package require shellthread + if {![catch {::shellthread::worker::init %tidcli% %ts_start% $::settingsinfo} errmsg]} { + unset ::settingsinfo + set ::shellthread_init "ok" + } else { + unset ::settingsinfo + set ::shellthread_init "err $errmsg" + } + }] + + thread::send -async $tidworker $init_script + #thread::send $tidworker $init_script + set winfo [dict create tid $tidworker list_client_tids [list $tidclient] ts_start $ts_start ts_end_list [list]] + dict set workers $sourcetag $winfo + return $tidworker + } + + proc set_pipe_read_from_client {tag_pipename worker_tid rchan args} { + variable workers + if {![dict exists $workers $tag_pipename]} { + error "workerthread::manager::set_pipe_read_from_client source/pipename $tag_pipename not found" + } + set match_worker_tid [dict get $workers $tag_pipename tid] + if {$worker_tid ne $match_worker_tid} { + error "workerthread::manager::set_pipe_read_from_client source/pipename $tag_pipename workert_tid mismatch '$worker_tid' vs existing:'$match_worker_tid'" + } + #buffering set during channel creation will be preserved on thread::transfer + thread::transfer $worker_tid $rchan + #start_pipe_read will vwait - so we have to send async + thread::send -async $worker_tid [list ::shellthread::worker::start_pipe_read $tag_pipename $rchan] + #client may start writing immediately - but presumably it will buffer in fifo2 + } + + proc set_pipe_write_to_client {tag_pipename worker_tid wchan args} { + variable workers + if {![dict exists $workers $tag_pipename]} { + error "workerthread::manager::set_pipe_write_to_client pipename $tag_pipename not found" + } + set match_worker_tid [dict get $workers $tag_pipename tid] + if {$worker_tid ne $match_worker_tid} { + error "workerthread::manager::set_pipe_write_to_client pipename $tag_pipename workert_tid mismatch '$worker_tid' vs existing:'$match_worker_tid'" + } + #buffering set during channel creation will be preserved on thread::transfer + thread::transfer $worker_tid $wchan + thread::send -async $worker_tid [list ::shellthread::worker::start_pipe_write $tag_pipename $wchan] + } + + proc write_log {source msg args} { + variable workers + set ts_micros_sent [clock micros] + set defaults [list -async 1 -level info] + set opts [dict merge $defaults $args] + + if {[dict exists $workers $source]} { + set tidworker [dict get $workers $source tid] + if {![thread::exists $tidworker]} { + set tidworker [new_worker $source] + } + } else { + #auto create with no requirement to call new_worker.. warn? + set tidworker [new_worker $source] + } + set client_tid [thread::id] + if {[dict get $opts -async]} { + thread::send -async $tidworker [list ::shellthread::worker::send_info $client_tid $ts_micros_sent $source $msg] + } else { + thread::send $tidworker [list ::shellthread::worker::send_info $client_tid $ts_micros_sent $source $msg] + } + } + proc report_worker_errors {errdict} { + variable workers + set reporting_tid [dict get $errdict worker_tid] + dict for {src srcinfo} $workers { + if {[dict get $srcinfo tid] eq $reporting_tid} { + dict set srcinfo errors [dict get $errdict errors] + dict set workers $src $srcinfo ;#writeback updated + break + } + } + } + proc close_worker {source {timeout 2500}} { + variable workers + variable worker_errors + set ts_now [clock micros] + #puts stderr "close_worker $source" + if {[dict exists $workers $source]} { + set tidworker [dict get $workers $source tid] + set ts_end_list [dict get $workers $source ts_end_list] + if {[llength $ts_end_list]} { + set last_end_ts [lindex $ts_end_list end] + if {[expr {(($tsnow - $last_end_ts) / 1000) >= $timeout}]} { + lappend ts_end_list $ts_now + dict set workers $source ts_end_list $ts_end_list + } else { + #existing close in progress.. assume it will work + return + } + } + + if {[thread::exists $tidworker]} { + #puts stderr "shellthread::manager::close_worker: thread $tidworker for source $source still running.. terminating" + set timeoutarr($source) 0 + after $timeout [list set timeoutarr($source) 2] + + thread::send -async $tidworker [list shellthread::worker::send_errors_now [thread::id]] + thread::send -async $tidworker [list shellthread::worker::terminate [thread::id]] timeoutarr($source) + + #thread::send -async $tidworker [string map [list %tidclient% [thread::id]] { + # shellthread::worker::terminate %tidclient% + #}] timeoutarr($source) + + vwait timeoutarr($source) + #puts stderr "shellthread::manager::close_worker: thread $tidworker for source $source DONE1" + + thread::release $tidworker + #puts stderr "shellthread::manager::close_worker: thread $tidworker for source $source DONE2" + if {[dict exists $workers $source errors]} { + set errlist [dict get $workers $source errors] + if {[llength $errlist]} { + lappend worker_errors [list $source [dict get $workers $source]] + } + } + dict unset workers $source + } + } + #puts stdout "close_worker $source - end" + } + + #worker errors only available for a source after close_worker called on that source + #It is possible for there to be multiple entries for a source because new_worker can be called multiple times with same sourcetag, + # e.g if a thread + proc get_and_clear_errors {source} { + variable worker_errors + set source_errors [lsearch -all -inline -index 0 $worker_errors $source] + set worker_errors [lsearch -all -inline -index 0 -not $worker_errors $source] + return $source_errors + } + + +} + + + + + + + + + + diff --git a/src/modules/tarjar-2.3.tm b/src/modules/tarjar-2.3.tm new file mode 100644 index 0000000000000000000000000000000000000000..5f30831af771d73849e43f550315a85fd5d810f1 GIT binary patch literal 107008 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 literal 0 HcmV?d00001 diff --git a/src/punk86.vfs/lib/app-punk/pkgIndex.tcl b/src/punk86.vfs/lib/app-punk/pkgIndex.tcl new file mode 100644 index 00000000..6ace9792 --- /dev/null +++ b/src/punk86.vfs/lib/app-punk/pkgIndex.tcl @@ -0,0 +1,3 @@ + + package ifneeded app-punk 1.0 [list source [file join $dir repl.tcl]] + diff --git a/src/punk86.vfs/lib/app-punk/repl.tcl b/src/punk86.vfs/lib/app-punk/repl.tcl new file mode 100644 index 00000000..1cc25d5d --- /dev/null +++ b/src/punk86.vfs/lib/app-punk/repl.tcl @@ -0,0 +1,820 @@ +#temp +package provide app-punk 1.0 + +set stdin_info [chan configure stdin] +if {[dict exists $stdin_info -inputmode]} { + #this is the only way I currently know to detect console on windows.. doesn't work on Alma linux. + # tcl_interactive used by repl to determine if stderr output prompt to be printed. + # (that way, piping commands into stdin should not produce prompts for each command) + set tcl_interactive 1 +} +#however, the -mode option only seems to appear on linux when a terminal exists.. +if {[dict exists $stdin_info -mode]} { + set tcl_interactive 1 +} + +#give up for now +set tcl_interactive 1 + +proc todo {} { + puts "tcl History" + + +} +tcl::tm::add [pwd]/modules + +package require shellfilter +package require Thread +set outdevice [shellfilter::stack::new punkout -settings {-tag "punkout" -buffering none -raw 1 -syslog 127.0.0.1:514 -file "c:/repo/jn/shellspy/logs/repl-exec-stdout.txt"}] +set out [dict get $outdevice localchan] +set errdevice [shellfilter::stack::new punkerr -settings {-tag "punkerr" -buffering none -raw 1 -syslog 127.0.0.1:514 -file "c:/repo/jn/shellspy/logs/repl-exec-stderr.txt"}] +set err [dict get $errdevice localchan] +# +#set indevice [shellfilter::stack::new commandin -settings {-tag "commandin" -readbuffering line -writebuffering none -raw 1 -direction in}] +#set program_read_stdin_pipe [dict get $indevice localchan] + + + +# unknown -- +# This procedure is called when a Tcl command is invoked that doesn't +# exist in the interpreter. It takes the following steps to make the +# command available: +# +# 1. See if the autoload facility can locate the command in a +# Tcl script file. If so, load it and execute it. +# 2. If the command was invoked interactively at top-level: +# (a) see if the command exists as an executable UNIX program. +# If so, "exec" the command. +# (b) see if the command requests csh-like history substitution +# in one of the common forms !!, !, or ^old^new. If +# so, emulate csh's history substitution. +# (c) see if the command is a unique abbreviation for another +# command. If so, invoke the command. +# +# Arguments: +# args - A list whose elements are the words of the original +# command, including the command name. + +proc unknown args { + variable ::tcl::UnknownPending + global auto_noexec auto_noload env tcl_interactive errorInfo errorCode + + if {[info exists errorInfo]} { + set savedErrorInfo $errorInfo + } + if {[info exists errorCode]} { + set savedErrorCode $errorCode + } + + set name [lindex $args 0] + if {![info exists auto_noload]} { + # + # Make sure we're not trying to load the same proc twice. + # + if {[info exists UnknownPending($name)]} { + return -code error "self-referential recursion\ + in \"unknown\" for command \"$name\"" + } + set UnknownPending($name) pending + set ret [catch { + auto_load $name [uplevel 1 {::namespace current}] + } msg opts] + unset UnknownPending($name) + if {$ret != 0} { + dict append opts -errorinfo "\n (autoloading \"$name\")" + return -options $opts $msg + } + if {![array size UnknownPending]} { + unset UnknownPending + } + if {$msg} { + if {[info exists savedErrorCode]} { + set ::errorCode $savedErrorCode + } else { + unset -nocomplain ::errorCode + } + if {[info exists savedErrorInfo]} { + set errorInfo $savedErrorInfo + } else { + unset -nocomplain errorInfo + } + set code [catch {uplevel 1 $args} msg opts] + if {$code == 1} { + # + # Compute stack trace contribution from the [uplevel]. + # Note the dependence on how Tcl_AddErrorInfo, etc. + # construct the stack trace. + # + set errInfo [dict get $opts -errorinfo] + set errCode [dict get $opts -errorcode] + set cinfo $args + if {[string length [encoding convertto utf-8 $cinfo]] > 150} { + set cinfo [string range $cinfo 0 150] + while {[string length [encoding convertto utf-8 $cinfo]] > 150} { + set cinfo [string range $cinfo 0 end-1] + } + append cinfo ... + } + set tail "\n (\"uplevel\" body line 1)\n invoked\ + from within\n\"uplevel 1 \$args\"" + set expect "$msg\n while executing\n\"$cinfo\"$tail" + if {$errInfo eq $expect} { + # + # The stack has only the eval from the expanded command + # Do not generate any stack trace here. + # + dict unset opts -errorinfo + dict incr opts -level + return -options $opts $msg + } + # + # Stack trace is nested, trim off just the contribution + # from the extra "eval" of $args due to the "catch" above. + # + set last [string last $tail $errInfo] + if {$last + [string length $tail] != [string length $errInfo]} { + # Very likely cannot happen + return -options $opts $msg + } + set errInfo [string range $errInfo 0 $last-1] + set tail "\"$cinfo\"" + set last [string last $tail $errInfo] + if {$last < 0 || $last + [string length $tail] != [string length $errInfo]} { + return -code error -errorcode $errCode \ + -errorinfo $errInfo $msg + } + set errInfo [string range $errInfo 0 $last-1] + set tail "\n invoked from within\n" + set last [string last $tail $errInfo] + if {$last + [string length $tail] == [string length $errInfo]} { + return -code error -errorcode $errCode \ + -errorinfo [string range $errInfo 0 $last-1] $msg + } + set tail "\n while executing\n" + set last [string last $tail $errInfo] + if {$last + [string length $tail] == [string length $errInfo]} { + return -code error -errorcode $errCode \ + -errorinfo [string range $errInfo 0 $last-1] $msg + } + return -options $opts $msg + } else { + dict incr opts -level + return -options $opts $msg + } + } + } + #set isrepl [expr {[file tail [file rootname [info script]]] eq "repl"}] + set isrepl $::repl::running ;#may not be reading though + if {$isrepl} { + #set ::tcl_interactive 1 + } + if {$isrepl || (([info level] == 1) && (([info script] eq "" ) ) + && ([info exists tcl_interactive] && $tcl_interactive))} { + if {![info exists auto_noexec]} { + set new [auto_execok $name] + if {$new ne ""} { + set redir "" + if {[namespace which -command console] eq ""} { + set redir ">&@stdout <@stdin" + } + + + #experiment todo - use twapi and named pipes + #twapi::namedpipe_server {\\.\pipe\something} + #Then override tcl 'exec' and replace all stdout/stderr/stdin with our fake ones + #These can be stacked with shellfilter and operate as OS handles - which we can't do with fifo2 etc + # + + + # 'script' command to fake a tty + # note that we lose the exit code from the underlying command by using 'script' if we call shellfilter::run without -e option to script + set scr [auto_execok script] + if {$scr ne ""} { + if {[string first " " $new] > 0} { + set c1 $name + } else { + set c1 $new + } + #set scriptrun "( $c1 [lrange $args 1 end] )" + + set scriptrun_commandlist [shellfilter::get_scriptrun_from_cmdlist_dquote_if_not $args] + + if 0 { + set scriptrun "( $c1 " + foreach a [lrange $args 1 end] { + if {[string first " " $a] > 0} { + #append scriptrun "\"$a\"" + append scriptrun $a + } else { + append scriptrun $a + } + append scriptrun " " + } + append scriptrun " )" + } + #------------------------------------- + if 0 { + package require string::token::shell + set shellparts [string token shell -indices $args] + + set scriptrun "( $c1 " + foreach info [lrange $shellparts 1 end] { + set type [lindex $info 0] + if {$type eq "D:QUOTED"} { + append scriptrun "\"" + append scriptrun [lindex $info 3] + append scriptrun "\"" + } elseif {$type eq "S:QUOTED"} { + append scriptrun "'" + append scriptrun [lindex $info 3] + append scriptrun "'" + } elseif {$type eq "PLAIN"} { + append scriptrun [lindex $info 3] + } else { + error "Can't interpret '$args' with sh-like syntax" + } + append scriptrun " " + } + append scriptrun " )" + } + + #------------------------------------- + #puts stderr ">>>scriptrun_commandlist: $scriptrun_commandlist" + + #uplevel 1 [list ::catch \ + [list ::shellfilter::run [list $scr -q -e -c $scriptrun /dev/null] -teehandle punk -inbuffering line -outbuffering none ] \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + + uplevel 1 [list ::catch \ + [list ::shellfilter::run $scriptrun_commandlist -teehandle punk -inbuffering line -outbuffering none ] \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + + + + #puts stderr "script result $::tcl::UnknownOptions $::tcl::UnknownResult" + } else { + uplevel 1 [list ::catch \ + [list ::shellfilter::run [concat $new [lrange $args 1 end]] -teehandle punk -inbuffering line -outbuffering none ] \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + } + if {[string trim $::tcl::UnknownResult] ne "exitcode 0"} { + dict set ::tcl::UnknownOptions -code error + set ::tcl::UnknownResult "Non-zero exit code from command '$c1 [lrange $args 1 end]' $::tcl::UnknownResult" + } else { + #no point returning "exitcode 0" if that's the only non-error return. + #It is misleading. Better to return empty string. + set ::tcl::UnknownResult "" + } + + + #uplevel 1 [list ::catch \ + # [concat exec $redir $new [lrange $args 1 end]] \ + # ::tcl::UnknownResult ::tcl::UnknownOptions] + + #puts "===exec with redir:$redir $::tcl::UnknownResult ==" + dict incr ::tcl::UnknownOptions -level + return -options $::tcl::UnknownOptions $::tcl::UnknownResult + } + } + if {$name eq "!!"} { + set newcmd [history event] + } elseif {[regexp {^!(.+)$} $name -> event]} { + set newcmd [history event $event] + } elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $name -> old new]} { + set newcmd [history event -1] + catch {regsub -all -- $old $newcmd $new newcmd} + } + if {[info exists newcmd]} { + tclLog $newcmd + history change $newcmd 0 + uplevel 1 [list ::catch $newcmd \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + dict incr ::tcl::UnknownOptions -level + return -options $::tcl::UnknownOptions $::tcl::UnknownResult + } + + set ret [catch {set candidates [info commands $name*]} msg] + if {$name eq "::"} { + set name "" + } + if {$ret != 0} { + dict append opts -errorinfo \ + "\n (expanding command prefix \"$name\" in unknown)" + return -options $opts $msg + } + # Filter out bogus matches when $name contained + # a glob-special char [Bug 946952] + if {$name eq ""} { + # Handle empty $name separately due to strangeness + # in [string first] (See RFE 1243354) + set cmds $candidates + } else { + set cmds [list] + foreach x $candidates { + if {[string first $name $x] == 0} { + lappend cmds $x + } + } + } + if {[llength $cmds] == 1} { + uplevel 1 [list ::catch [lreplace $args 0 0 [lindex $cmds 0]] \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + dict incr ::tcl::UnknownOptions -level + return -options $::tcl::UnknownOptions $::tcl::UnknownResult + } + if {[llength $cmds]} { + return -code error "ambiguous command name \"$name\": [lsort $cmds]" + } + } + return -code error -errorcode [list TCL LOOKUP COMMAND $name] \ + "invalid command name \"$name\"" +} + + +proc know {cond body} { + proc unknown {args} [string map [list @c@ $cond @b@ $body] { + if {![catch {expr {@c@}} res] && $res} { + return [eval {@b@}] + #tailcall @b@ + } + }][info body unknown] +} +proc know? {} { + puts [string range [info body unknown] 0 511] +} +if 1 { +know {[expr $args] || 1} {expr $args} +know {[regexp {^([0-9]+)\.\.([0-9]+)$} [lindex $args 0] -> from to]} { + set res {} + while {$from<=$to} {lappend res $from; incr from} + set res +} + + +#run as raw string instead of tcl-list - no variable subst etc +proc do_runraw {commandline} { + #return [shellfilter::run [lrange $args 1 end] -teehandle punk -inbuffering none -outbuffering none -stdinhandler ::repl::repl_handler] + puts stdout ">>runraw got: $commandline" + + #run always echoes anyway.. as we aren't diverting stdout/stderr off for capturing + #for consistency with other runxxx commands - we'll just consume it. (review) + #set wordparts [regexp -inline -all {\S+} $commandline] + package require string::token::shell + set parts [string token shell -indices $commandline] + puts stdout ">>shellparts: $parts" + + set runwords [list] + foreach p $parts { + set ptype [lindex $p 0] + set pval [lindex $p 3] + if {$ptype eq "PLAIN"} { + lappend runwords [lindex $p 3] + } elseif {$ptype eq "D:QUOTED"} { + set v {"} + append v $pval + append v {"} + lappend runwords $v + } elseif {$ptype eq "S:QUOTED"} { + set v {'} + append v $pval + append v {'} + lappend runwords $v + } + } + puts stdout ">>runraw runwords: $runwords" + set runwords [lrange $runwords 1 end] + + puts stdout ">>runraw runwords: $runwords" + #set args [lrange $args 1 end] + #set runwords [lrange $wordparts 1 end] + + set known_runopts [list "-echo" "-e" "-terminal" "-t"] + set aliases [list "-e" "-echo" "-echo" "-echo" "-t" "-terminal" "-terminal" "-terminal"] ;#include map to self + set runopts [list] + set cmdwords [list] + set idx_first_cmdarg [lsearch -not $runwords "-*"] + set runopts [lrange $runwords 0 $idx_first_cmdarg-1] + set cmdwords [lrange $runwords $idx_first_cmdarg end] + + foreach o $runopts { + if {$o ni $known_runopts} { + error "runout: Unknown runoption $o" + } + } + set runopts [lmap o $runopts {dict get $aliases $o}] + + set cmd_as_string [join $cmdwords " "] + puts stdout ">>cmd_as_string: $cmd_as_string" + + if {"-terminal" in $runopts} { + set tcmd [shellfilter::get_scriptrun_from_cmdlist_dquote_if_not $cmdwords] + puts stdout ">>tcmd: $tcmd" + #set exitinfo [shellfilter::run $tcmd -teehandle punk -inbuffering line -outbuffering none ] + set exitinfo "not-implemented" + } else { + set exitinfo [shellfilter::run $cmdwords -teehandle punk -inbuffering line -outbuffering none ] + } + + if {[dict exists $exitinfo error]} { + #todo - check errorInfo makes sense.. return -code? tailcall? + error [dict get $exitinfo error] + } + return $exitinfo +} + +#NOTE: the run,runout,runerr,runx commands only produce an error if the command didn't run. +# - If it did run, but there was a non-zero exitcode it is up to the application to check that. +#This is deliberate, but means 'catch' doesn't catch errors within the command itself - the exitcode has to be checked. +#The user can always use exec for different process error semantics (they don't get exitcode with exec) +know {[lindex $args 0] eq "runraw"} { + return [do_run $args] +} +know {[lindex $args 0] eq "run"} { + set args [lrange $args 1 end] + set known_runopts [list "-echo" "-e"] + set aliases [list "-e" "-echo" "-echo" "-echo"] ;#include map to self + set runopts [list] + set cmdargs [list] + set idx_first_cmdarg [lsearch -not $args "-*"] + set runopts [lrange $args 0 $idx_first_cmdarg-1] + set cmdargs [lrange $args $idx_first_cmdarg end] + foreach o $runopts { + if {$o ni $known_runopts} { + error "run: Unknown runoption $o" + } + } + set runopts [lmap o $runopts {dict get $aliases $o}] + + set exitinfo [shellfilter::run $cmdargs -teehandle punk -inbuffering none -outbuffering none ] +} + +know {[lindex $args 0] eq "runout"} { + set ::runout "" + + set args [lrange $args 1 end] + set known_runopts [list "-echo" "-e"] + set aliases [list "-e" "-echo" "-echo" "-echo"] ;#include map to self + set runopts [list] + set cmdargs [list] + set idx_first_cmdarg [lsearch -not $args "-*"] + set runopts [lrange $args 0 $idx_first_cmdarg-1] + set cmdargs [lrange $args $idx_first_cmdarg end] + foreach o $runopts { + if {$o ni $known_runopts} { + error "runout: Unknown runoption $o" + } + } + set runopts [lmap o $runopts {dict get $aliases $o}] + + #puts stdout "RUNOUT cmdargs: $cmdargs" + + #set outvar_stackid [shellfilter::stack::add commandout tee_to_var -action float -settings {-varname ::runout}] + if {"-echo" in $runopts} { + set stdout_stackid [shellfilter::stack::add stdout tee_to_var -action sink-locked -settings {-varname ::runout}] + } else { + set stdout_stackid [shellfilter::stack::add stdout var -action sink-locked -settings {-varname ::runout}] + } + + #shellfilter::run [lrange $args 1 end] -teehandle punk -outchan stdout -inbuffering none -outbuffering none -stdinhandler ::repl::repl_handler + set exitinfo [shellfilter::run $cmdargs -teehandle punk -inbuffering none -outbuffering none ] + + shellfilter::stack::remove stdout $stdout_stackid + #shellfilter::stack::remove commandout $outvar_stackid + if {[dict exists $exitinfo error]} { + #we must raise an error. + #todo - check errorInfo makes sense.. return -code? tailcall? + error [dict get $exitinfo error] + } + puts stderr $exitinfo + return $::runout +} +know {[lindex $args 0] eq "runerr"} { + set ::runerr "" + + set args [lrange $args 1 end] + set known_runopts [list "-echo" "-e"] + set aliases [list "-e" "-echo" "-echo" "-echo"] ;#include map to self + set runopts [list] + set cmdargs [list] + set idx_first_cmdarg [lsearch -not $args "-*"] + set runopts [lrange $args 0 $idx_first_cmdarg-1] + set cmdargs [lrange $args $idx_first_cmdarg end] + foreach o $runopts { + if {$o ni $known_runopts} { + error "runout: Unknown runoption $o" + } + } + set runopts [lmap o $runopts {dict get $aliases $o}] + + if {"-echo" in $runopts} { + set stderr_stackid [shellfilter::stack::add stderr tee_to_var -action sink-locked -settings {-varname ::runerr}] + } else { + set stderr_stackid [shellfilter::stack::add stderr var -action sink-locked -settings {-varname ::runerr}] + } + set exitinfo [shellfilter::run $cmdargs -teehandle punk -inbuffering none -outbuffering none -stdinhandler ::repl::repl_handler] + shellfilter::stack::remove stderr $stderr_stackid + + + #we raise an error because an error during calling is different to collecting stderr from a command, and the caller should be able to wrap in a catch + # to determine something other than just a nonzero exit code or output on stderr. + if {[dict exists $exitinfo error]} { + #todo - check errorInfo makes sense.. return -code? tailcall? + error [dict get $exitinfo error] + } + + + puts stderr \n$exitinfo + return $::runerr +} +know {[lindex $args 0] eq "runx"} { + set ::runerr "" + set ::runout "" + + set args [lrange $args 1 end] + set known_runopts [list "-echo" "-e"] + set aliases [list "-e" "-echo" "-echo" "-echo"] ;#include map to self + set runopts [list] + set cmdargs [list] + set idx_first_cmdarg [lsearch -not $args "-*"] + set runopts [lrange $args 0 $idx_first_cmdarg-1] + set cmdargs [lrange $args $idx_first_cmdarg end] + foreach o $runopts { + if {$o ni $known_runopts} { + error "runout: Unknown runoption $o" + } + } + set runopts [lmap o $runopts {dict get $aliases $o}] + + + + #shellfilter::stack::remove stdout $::repl::id_outstack + + if {"-echo" in $runopts} { + set stderr_stackid [shellfilter::stack::add stderr tee_to_var -action sink-locked -settings {-varname ::runerr}] + set stdout_stackid [shellfilter::stack::add stdout tee_to_var -action sink-locked -settings {-varname ::runout}] + } else { + set stderr_stackid [shellfilter::stack::add stderr var -action sink-locked -settings {-varname ::runerr}] + set stdout_stackid [shellfilter::stack::add stdout var -action sink-locked -settings {-varname ::runout}] + } + + set exitinfo [shellfilter::run $cmdargs -teehandle punk -inbuffering none -outbuffering none -stdinhandler ::repl::repl_handler] + + shellfilter::stack::remove stdout $stdout_stackid + shellfilter::stack::remove stderr $stderr_stackid + + set ::repl::output "" + + + #set x [shellfilter::stack::add stdout var -action sink-locked -settings {-varname ::repl::runxoutput}] + set pretty "" + append pretty "stdout\n" + if {[string length $::runout]} { + append pretty "$::runout\n" + } + append pretty "stderr\n" + if {[string length $::runerr]} { + append pretty "$::runerr\n" + } + append pretty "$exitinfo" + #set ::repl::result_print 0 + #return [lindex [list [list stdout $::runout stderr $::runerr {*}$exitinfo] [shellfilter::stack::remove stdout $x][puts -nonewline stdout $pretty][set ::repl::output ""]] 0] + + set ::repl::result_pretty $pretty + + if {[dict exists $exitinfo error]} { + #todo - check errorInfo makes sense.. return -code? tailcall? + error [dict get $exitinfo error] + } + + + return [list stdout $::runout stderr $::runerr {*}$exitinfo] + + + #return [string map [list %o% [list $::runout] %e% [list $::runerr] %x% $exitinfo] {stdout\ + # %o%\ + # stderr\ + # %e%\ + # %x%\ + #}] +} +} +namespace eval repl { + variable output "" + #important not to initialize - as it can be preset by cooperating package before app-punk has been package required + variable post_script +} + + +proc repl::doprompt {prompt} { + #prompt to stderr. + #We can pipe commands into repl's stdin without the prompt interfering with the output. + #Although all command output for each line goes to stdout - not just what is emmited with puts + if {$::tcl_interactive} { + puts -nonewline stderr $prompt + flush stderr + } +} + +proc repl::start {inchan} { + variable command + variable running + variable reading + variable done + set running 1 + set command "" + doprompt "P% " + fileevent $inchan readable [list [namespace current]::repl_handler $inchan] + set reading 1 + vwait [namespace current]::done + #todo - override exit? + after 0 ::repl::post_operations + vwait repl::post_operations_done + return 0 +} +proc repl::post_operations {} { + if {[info exists ::repl::post_script] && [string length $::repl::post_script]} { + #put aside post_script so the script has the option to add another post_script and restart the repl + set ::repl::running_script $::repl::post_script + set ::repl::post_script "" + uplevel #0 {eval $::repl::running_script} + } + + #todo - tidyup so repl could be restarted + + + set repl::post_operations_done 0 +} + + +proc repl::reopen_stdin {} { + if {$::tcl_platform(platform) eq "windows"} { + puts stderr "|repl> Attempting reconnection of console to stdin by opening 'CON'" + } else { + puts stderr "|repl> Attempting reconnection of console to stdin by opening '/dev/tty'" + } + #puts stderr "channels:[chan names]" + #flush stderr + chan close stdin + if {$::tcl_platform(platform) eq "windows"} { + set s [open "CON" r] + } else { + #/dev/tty - reference to the controlling terminal for a process + #review/test + set s [open "/dev/tty" r] + } + + repl::start stdin +} +proc quit {} { + set ::repl::done "quit" +} +#just a failed experiment.. tried various things +proc repl::reopen_stdinX {} { + #windows - todo unix + package require twapi + + if 0 { + if {[catch {package require Memchan} errM]} { + #package require tcl::chan::fifo2 + #lassign [tcl::chan::fifo2] a b + package require tcl::chan::fifo + set x [tcl::chan::fifo] + } else { + #lassign [fifo2] a b + set x [fifo] + } + #first channel opened after stdin closed becomes stdin + #use a fifo or fifo2 because [chan pipe] assigns the wrong end first! + #a will be stdin + } + #these can't replace proper stdin (filehandle 0) because they're not 'file backed' or 'os level' + #try opening a named pipe server to become stdin + set pipename {\\.\pipe\stdin_%id%} + set pipename [string map [list %id% [pid]] $pipename] + + + + package require tcl::chan::fifo + + chan close stdin + lassign [tcl::chan::fifo] a + + + puts stderr "newchan: $a" + puts stderr "|test> $a [chan conf $a]" + + #set server [twapi::namedpipe_server $pipename] + #set client [twapi::namedpipe_client $pipename] ;#open a client and connect to the server we just made + + puts stderr "chan names: [chan names]" + + #by now $server not valid? + #set server stdin + + #chan configure $server -buffering line -encoding unicode + #chan configure $client -buffering line -encoding unicode + + #puts stderr "|test>ns-server $server [chan conf $server]" + #puts stderr "|test>ns-client $client [chan conf $client]" + + set conin [twapi::get_console_handle stdin] + twapi::set_standard_handle stdin $conin + + set h_in [twapi::get_standard_handle stdin] + + puts stderr "|test> $a [chan conf $a]" + + #chan configure $client -blocking 0 + after 10 repl::start $a + +} +proc repl::repl_handler {chan} { + variable command + variable running + variable reading + variable post_script + variable id_outstack + variable result_print + variable result_pretty + set chunksize [gets $chan line] + if {$chunksize < 0} { + if {[chan eof $chan]} { + fileevent $chan readable {} + set reading 0 + set running 0 + if {$::tcl_interactive} { + puts stderr "\n|repl> EOF on $chan." + } + set [namespace current]::done 1 + #test + repl::reopen_stdin + return + } + } + append command $line + if {[info complete $command]} { + set ::repl::output "" + set id_outstack [shellfilter::stack::add stdout tee_to_var -settings {-varname ::repl::output}] + #chan configure stdout -buffering none + fileevent $chan readable {} + set reading 0 + set result_print 1 + set result_pretty "" + #don't let unknown use 'args' to convert command to list + + if {[string equal -length [string length "runraw "] "runraw " $command]} { + set status [catch {uplevel #0 [list do_runraw $command]} result] + } else { + set status [catch {uplevel #0 $command} result] + } + set lastoutchar [string range $::repl::output end-1 end] + #puts stderr "'$::repl::output' lastoutchar:'$lastoutchar' result:'$result'" + shellfilter::stack::remove stdout $id_outstack + if {!$result_print} { + set result "" + set lastoutchar "" + } + #$command is an unevaluated script at this point + # so may not be a well formed list e.g 'set x [list a "b"]' + #- lindex will fail + #if {[lindex $command 0] eq "runx"} {} + + set test [string trim $command] + if {[string equal -length [string length "runx "] "runx " $command]} { + if {[string length $result_pretty]} { + set result $result_pretty + } + } + fileevent $chan readable [list [namespace current]::repl_handler $chan] + set reading 1 + if {$result ne ""} { + if {$status == 0} { + if {[string length $lastoutchar]} { + puts \n$result + } else { + puts $result + } + doprompt "P% " + } else { + puts stderr $result + doprompt "p% " + } + } else { + if {[string length $lastoutchar]} { + doprompt "\nP% " + } else { + doprompt "P% " + } + } + set command "" + } else { + append command \n + doprompt "> " + } +} +repl::start stdin + +exit 0 + +#repl::start $program_read_stdin_pipe + diff --git a/src/punk86.vfs/lib/app-shellspy/pkgIndex.tcl b/src/punk86.vfs/lib/app-shellspy/pkgIndex.tcl new file mode 100644 index 00000000..4e20e141 --- /dev/null +++ b/src/punk86.vfs/lib/app-shellspy/pkgIndex.tcl @@ -0,0 +1,3 @@ + + package ifneeded app-shellspy 1.0 [list source [file join $dir shellspy.tcl]] + diff --git a/src/punk86.vfs/lib/app-shellspy/shellspy.tcl b/src/punk86.vfs/lib/app-shellspy/shellspy.tcl new file mode 100644 index 00000000..1d271c88 --- /dev/null +++ b/src/punk86.vfs/lib/app-shellspy/shellspy.tcl @@ -0,0 +1,717 @@ +#! /usr/bin/env tclsh +# +#copyright 2023 Julian Marcel Noble +#license: BSD (revised 3-clause) +# +#see notes at beginning of shellspy namespace re stdout/stderr +# +#SHELLSPY - provides commandline flag information and stdout/stderr logging/mirroring without output/pipeline interference, +# or modified output if modifying filters explicitly configured. +# +#shellspy uses the shellfilter and flagfilter libraries to run a commandline with tee-diversions of stdout/stderr to configured syslog/file logs +#Because it is a tee, the command's stdout/stderr are still available as direct output from this script. +#Various filters/modifiers/redirections can be placed on the channel stacks for stdin/stderr using the shellfilter::stack api +# and other shellfilter:: helpers such as shellfilter::redir_output_to_log +# Redirecting stderr/stdout in this way prior to the actual command run will not interfere with the command/pipeline output due to the way +# shellfilter temporarily inserts it's own tee into the stack at the point of the highest existing redirection it encounters. +# +#A note on input/output convention regarding channels/pipes +# we write to an output, read from an input. +# e.g when creating a pipe with 'lassign [chan pipe] in out' we write to out and read from in. +# This is potentially confusing from an OO-like perspective thinking of a pipe object as a sort of object. +# Don't think of it from the perspective of the pipe - but from the program using it. +# This is not a convention invented here for shellspy - but it seems to match documentation and common use e.g for 'chan pending input|output chanid' +# This matches the way we write to stdout read from stdin. +# Possibly using read/write related naming for pipe ends is clearer. eg 'lassign [chan pipe] rd_pipe1 wr_pipe1' +# +package provide app-shellspy 1.0 + + +#a test for windows +#fconfigure stdin -encoding utf-16le +#fconfigure stdout -encoding utf-16le + +#tcl::tm::remove {*}[tcl::tm::list] + +#add dir outside of tclkit/exe so we can override with higher versions if necessary without rebuilding +set m_dir [file normalize [file join [file dirname [info nameofexecutable]] modules]] +tcl::tm::add $m_dir +set m_dir [file normalize [file join [file dirname [info script]] ../../../modules]] +tcl::tm::add $m_dir + + +#experiment - todo make a flag for it if it's useful +#Middle cap for direct dispatch without flagcheck arg processing or redirections or REPL. +set arg1 [lindex $::argv 0] +if {[file extension $arg1] in [list .tCl]} { + set ::argv [lrange $::argv 1 end] + set ::argc [llength $::argv] + set scriptfile [file normalize $arg1] + if {![file exists $scriptfile]} { + #try the lowercase version (extension lowercased only) so that file doesn't have to be renamed to use alternate dispatch + set scriptfile [file rootname $scriptfile][string tolower [file extension $scriptfile]] + } + source [file normalize $arg1] + + #package require app-punk + +} else { + + + +#set m_dir [file join $starkit::topdir modules] + +#lappend auto_path c:/tcl/lib/tcllib1.20 +package require flagfilter +package require shellfilter +package require Thread + +#package require packageTrace + +set ::testconfig 5 + +namespace eval shellspy { + variable shellspy_status_log "shellspy-[clock micros]" + #shellfilter::log::open $shellspy_status_log [list -tag $shellspy_status_log -syslog 172.16.6.42:51500 -file ""] + shellfilter::log::open $shellspy_status_log [list -tag $shellspy_status_log -syslog 127.0.0.1:514 -file ""] + shellfilter::log::write $shellspy_status_log "shellspy launch with args '$::argv'" + shellfilter::log::write $shellspy_status_log "stdout/stderr encoding: [chan configure stdout -encoding]/[chan configure stderr -encoding]" + + #------------------------------------------------------------------------- + ##don't write to stdout/stderr before you've redirected them to a log using shellfilter functions + ## puts to stdout/stderr will comingle with command's output if performed before the channel stacks are configured. + + chan configure stdin -buffering line + chan configure stdout -buffering none + chan configure stderr -buffering none + + #set id_ansistrip [shellfilter::stack::add stderr ansistrip -settings {}] + #set id_ansistrip [shellfilter::stack::add stdout ansistrip -settings {}] + + lassign [shellfilter::redir_output_to_log "SPY"] id_stdout_redir id_stderr_redir + + + ### + #we can now safely write to stderr/stdout and it will not interfere with stderr/stdout from the dispatched command. + #This is because when shellfilter::run is called it temporarily adds it's own filter in place of the redirection we just added. + # shellfilter::run installs tee_to_pipe on stdout & stderr with -action sink-aside. + # sink-aside means to sink down the filter stack to the topmost filter that is diversionary, and replace it. + # when the command finishes running, the redirecting filter that it displaced is reinstalled in the stack. + ### + + ### + #Note that futher filters installed here will sit 'above' any of the redirecting filters + # so apply to both the shellfilter::run commandline, + # as well as writes to stderr/stdout from here or other libraries operating in this process. + # To bypass the the filter-stack and still emit to syslog etc - + # you can use shellfilter::log::open and shellfilter::log::write e.g + # shellfilter::log::open "mystatuslog" [list -tag "mystatuslog" -syslog 172.16.6.42:51500 -file ""] + # shellfilter::log::write "mystatuslog" "shellspy launch" + # + #### + #set id_ansistrip [shellfilter::stack::add stderr ansistrip -action float -settings {}] + #set id_ansistrip [shellfilter::stack::add stdout ansistrip -action float -settings {}] + + + ##stdin stack operates in reverse compared to stdout/stderr in that first added to stack is first to see the data + ##for stdin: first added to stack is 'upstream' as it will always encounter the data before later ones added to the stack. + ##for stdout: first added to stack is 'downstream' as it will alays encounter the data after others on the stack + #shellfilter::stack::add stdin ansistrip -action {} -settings {} + #shellfilter::stack::add stdin tee_to_log -settings {-tag "input" -raw 1 -syslog 172.16.6.42:51500 -file ""} + + #------------------------------------------------------------------------- + ##note - to use shellfilter::stack::new - the fifo2 end at the local side requires the event loop to be running + ## for interactive testing a relatively simple repl.tcl can be used. + + #todo - default to no logging.. add special flag in checkflags to indicate end of options for matched command only e.g --- ? + # then prioritize these results from checkflags to configure pre-dispatch behaviour by running a predispatch script(?) + # + # we can log flag-processing info coming from checkflags.. but we don't want to do two opt scans and emit it twice. + # configuration of the logging for flag/opt parsing should come from a config file and default to none. + set stdout_log [file normalize ~]/shellspy-stdout.txt + set stderr_log [file normalize ~]/shellspy-stderr.txt + + set outdeviceinfo [shellfilter::stack::new shellspyout -settings [list -tag "shellspyout" -buffering none -raw 1 -syslog 127.0.0.1:514 -file $stdout_log]] + set commandlog [dict get $outdeviceinfo localchan] + #puts $commandlog "HELLO $commandlog" + #flush $commandlog + set errdeviceinfo [shellfilter::stack::new shellspyerr -settings [list -tag "shellspyerr" -buffering none -raw 1 -syslog 127.0.0.1:514 -file $stderr_log]] + + #note that this filter is inline with the data teed off to the shellspyout log. + #To filter the main stdout an addition to the stdout stack can be made. specify -action float to have it affect both stdout and the tee'd off data. + set id_ansistrip [shellfilter::stack::add shellspyout ansistrip -settings {}] + + + #set id_out [shellfilter::stack::add stdout rebuffer -settings {}] + + #an example filter to capture some output to a var for later use - this one is for ansible-playbook + #set ::recap "" + #set id_tee_grep [shellfilter::stack::add shellspyout tee_grep_to_var -settings {-grep ".*PLAY RECAP.*|.*fatal:.*|.*changed:.*" -varname ::recap -pre 1 -post 3}] + + namespace import ::flagfilter::check_flags + + namespace eval shellspy::callbacks {} + namespace eval shellspy::parameters {} + + + proc do_callback {func args} { + variable shellspy_status_log + set exedir [file dirname [info nameofexecutable]] + set dispatchtcl [file join $exedir callbacks dispatch.tcl] + if {[file exists $dispatchtcl]} { + source $dispatchtcl + if {[llength [info commands shellspy::callbacks::$func]]} { + shellfilter::log::write $shellspy_status_log "found shellspy::callbacks::$func - calling" + if {[catch { + set args [shellspy::callbacks::$func {*}$args] + } errmsg]} { + shellfilter::log::write $shellspy_status_log "ERROR in shellspy::callbacks::$func\n errormsg:$errmsg" + error $errmsg + } + } + } + return $args + } + proc do_callback_parameters {func args} { + variable shellspy_status_log + set exedir [file dirname [info nameofexecutable]] + set paramtcl [file join $exedir callbacks parameters.tcl] + set params $args + if {[file exists $paramtcl]} { + source $paramtcl + if {[llength [info commands shellspy::parameters::$func]]} { + shellfilter::log::write $shellspy_status_log "found shellspy::parameters::$func - calling" + if {[catch { + set params [shellspy::parameters::$func $params] + } errmsg]} { + shellfilter::log::write $shellspy_status_log "ERROR in shellspy::parameters::$func\n errormsg:$errmsg" + } + } + } + return $params + } + + #some tested configs + proc get_channel_config {config} { + #note tcl script being called from wrong place.. configs don't affect: todo - move it. + set params [dict create] + if {$config == 0} { + #bad for: everything. extra cr + dict set params -inbuffering line + dict set params -outbuffering line + dict set params -readprocesstranslation auto ;#default + dict set params -outtranslation auto + } + + if {$config == 1} { + #ok for: cmd, cmd/u/c,raw,pwsh, sh,raw, tcl script process + #not ok for: bash,wsl, tcl script + dict set params -inbuffering line + dict set params -outbuffering line + dict set params -readprocesstranslation auto ;#default + dict set params -outtranslation lf + } + if {$config == 2} { + #ok for: cmd, cmd/uc,pwsh,sh , tcl script process + #not ok for: tcl script, bash, wsl + dict set params -inbuffering none ;#default + dict set params -outbuffering none ;#default + dict set params -readprocesstranslation auto ;#default + dict set params -outtranslation lf ;#default + } + if {$config == 3} { + #ok for: cmd + dict set params -inbuffering line + dict set params -outbuffering line + dict set params -readprocesstranslation lf + dict set params -outtranslation lf + } + if {$config == 4} { + #ok for: cmd,cmd/uc,raw,sh + #not ok for pwsh,bash,wsl, tcl script, tcl script process + dict set params -inbuffering none + dict set params -outbuffering none + dict set params -readprocesstranslation lf + dict set params -outtranslation lf + } + + if {$config == 5} { + #ok for: pwsh,cmd,cmd/u/c,raw,sh, tcl script process + #not ok for bash,wsl + #ok for vim cmd/u/c but only with to_unix filter on stdout (works in gvim and console) + dict set params -inbuffering none + dict set params -outbuffering none + dict set params -readprocesstranslation crlf + dict set params -outtranslation lf + } + if {$config == 6} { + #ok for: cmd,cmd/u/c,pwsh,raw,sh,bash + #not ok for: vim with cmd /u/c (?) + dict set params -inbuffering line + dict set params -outbuffering line + dict set params -readprocesstranslation crlf + dict set params -outtranslation lf + } + if {$config == 7} { + #ok for: sh,bash + #not ok for: wsl (display ok but extra cr), cmd,cmd/u/c,pwsh, tcl script, tcl script process, raw + dict set params -inbuffering none + dict set params -outbuffering none + dict set params -readprocesstranslation crlf + dict set params -outtranslation crlf + } + if {$config == 8} { + #not ok for anything..all have extra cr + dict set params -inbuffering none + dict set params -outbuffering none + dict set params -readprocesstranslation lf + dict set params -outtranslation crlf + } + return $params + } + + + + + proc do_in_powershell {args} { + variable shellspy_status_log + shellfilter::log::write $shellspy_status_log "do_in_powershell got '$args'" + set args [do_callback powershell {*}$args] + set params [do_callback_parameters powershell] + dict set params -teehandle shellspy + + + #readprocesstranslation lf - doesn't work for buffering line or none + #readprocesstranslation crlf works for buffering line and none with outchantranslation lf + + set params [dict merge $params [get_channel_config $::testconfig]] ;#working: 5 unbuffered, 6 linebuffered + + + + #set exitinfo [shellfilter::run [list pwsh -nologo -noprofile -c {*}$args] -debug 1] + + + set exitinfo [shellfilter::run [list pwsh -nologo -noprofile -c {*}$args] {*}$params] + #Passing args in as a single element will tend to make powershell treat the args as a 'script block' + # (powershell sees items in curly brackets {} as a scriptblock - when called from non-powershell, this tends to just echo back the contents) + #set exitinfo [shellfilter::run [list pwsh -nologo -noprofile -c $args] {*}$params] + if {[lindex $exitinfo 0] eq "exitcode"} { + shellfilter::log::write $shellspy_status_log "do_in_powershell returning $exitinfo" + #exit [lindex $exitinfo 1] + } + } + proc do_in_powershell_terminal {args} { + variable shellspy_status_log + shellfilter::log::write $shellspy_status_log "do_in_powershell_terminal got '$args'" + dict set params -teehandle shellspy + set params [dict merge $params [get_channel_config $::testconfig]] ;#working: 5 unbuffered, 6 linebuffered + + set cmdlist [list pwsh -nologo -noprofile -c {*}$args] + set cmdlist [shellfilter::get_scriptrun $cmdlist] + shellfilter::log::write $shellspy_status_log "do_in_powershell_terminal as script: '$cmdlist'" + + set exitinfo [shellfilter::run $cmdlist {*}$params] + if {[lindex $exitinfo 0] eq "exitcode"} { + shellfilter::log::write $shellspy_status_log "do_in_powershell_terminal returning $exitinfo" + } + } + + + proc do_in_cmdshell {args} { + variable shellspy_status_log + shellfilter::log::write $shellspy_status_log "do_in_cmdshell got '$args'" + set args [do_callback cmdshell {*}$args] + set params [do_callback_parameters cmdshell] + + + dict set params -teehandle shellspy + dict set params -copytempfile 1 + + set params [dict merge $params [get_channel_config $::testconfig]] + + #set id_out [shellfilter::stack::add stdout tounix -action sink-locked -settings {}] + + #set exitinfo [shellfilter::run "cmd /c $args" -debug 1] + set exitinfo [shellfilter::run [list cmd /c {*}$args] {*}$params] + #set exitinfo [shellfilter::run [list cmd /c {*}$args] -debug 1] + + #shellfilter::stack::remove stdout $id_out + + + + if {[lindex $exitinfo 0] eq "exitcode"} { + #exit [lindex $exitinfo 1] + shellfilter::log::write $shellspy_status_log "do_in_cmdshell returning $exitinfo" + #puts stderr "do_in_cmdshell returning $exitinfo" + } + } + proc do_in_cmdshellb {args} { + + variable shellspy_status_log + shellfilter::log::write $shellspy_status_log "do_in_cmdshellb got '$args'" + + set args [do_callback cmdshellb {*}$args] + + + shellfilter::log::write $shellspy_status_log "do_in_cmdshellb post_callback args '$args'" + + set params [do_callback_parameters cmdshellb] + dict set params -teehandle shellspy + dict set params -copytempfile 1 + dict set params -debug 0 + + #----------------------------- + #channel config 6 and towindows sink-aside-locked {-junction 1} works with vim-flog + #----------------------------- + set params [dict merge $params [get_channel_config 6]] + #set id_out [shellfilter::stack::add stdout tounix -action sink-aside-locked -settings {-junction 1}] + + + set exitinfo [shellfilter::run [list cmd /u/c {*}$args] {*}$params] + + #shellfilter::stack::remove stdout $id_out + + if {[lindex $exitinfo 0] eq "exitcode"} { + shellfilter::log::write $shellspy_status_log "do_in_cmdshellb returning with exitcode $exitinfo" + } else { + shellfilter::log::write $shellspy_status_log "do_in_cmdshellb returning WITHOUT exitcode $exitinfo" + } + } + proc do_in_cmdshelluc {args} { + variable shellspy_status_log + shellfilter::log::write $shellspy_status_log "do_in_cmdshelluc got '$args'" + set args [do_callback cmdshelluc {*}$args] + set params [do_callback_parameters cmdshell] + #set exitinfo [shellfilter::run "cmd /c $args" -debug 1] + dict set params -teehandle shellspy + dict set params -copytempfile 1 + dict set params -debug 0 + + #set params [dict merge $params [get_channel_config $::testconfig]] + + set params [dict merge $params [get_channel_config 1]] + #set id_out [shellfilter::stack::add stdout tounix -action sink-locked -settings {}] + + set id_out [shellfilter::stack::add stdout tounix -action sink-locked -settings {}] + + set exitinfo [shellfilter::run [list cmd /u/c {*}$args] {*}$params] + shellfilter::stack::remove stdout $id_out + #chan configure stdout -translation crlf + + if {[lindex $exitinfo 0] eq "exitcode"} { + #exit [lindex $exitinfo 1] + shellfilter::log::write $shellspy_status_log "do_in_cmdshelluc returning $exitinfo" + #puts stderr "do_in_cmdshell returning $exitinfo" + } + } + proc do_raw {args} { + variable shellspy_status_log + shellfilter::log::write $shellspy_status_log "do_raw got '$args'" + set args [do_callback raw {*}$args] + set params [do_callback_parameters raw] + #set params {} + dict set params -debug 0 + #dict set params -outprefix "_test_" + dict set params -teehandle shellspy + + + set params [dict merge $params [get_channel_config $::testconfig]] + + + if {[llength $params]} { + set exitinfo [shellfilter::run $args {*}$params] + } else { + set exitinfo [shellfilter::run $args -debug 1 -outprefix "j"] + } + if {[lindex $exitinfo 0] eq "exitcode"} { + shellfilter::log::write $shellspy_status_log "do_raw returning $exitinfo" + } + } + + proc do_script_process {scriptname args} { + variable shellspy_status_log + shellfilter::log::write $shellspy_status_log "do_script_process got scriptname:'$scriptname' args:'$args'" + set args [do_callback script_process {*}$args] + set params [do_callback_parameters script_process] + dict set params -teehandle shellspy + + set params [dict merge $params [get_channel_config $::testconfig]] + + #todo - use glob to check capitalisation of file tail (.TCL vs .tcl .Tcl etc) + set exitinfo [shellfilter::run [concat [auto_execok tclsh] $scriptname $args] {*}$params] + if {[lindex $exitinfo 0] eq "exitcode"} { + shellfilter::log::write $shellspy_status_log "do_script_process returning $exitinfo" + } + } + proc do_script {scriptname replwhen args} { + #ideally we don't want to launch an external process to run the script + variable shellspy_status_log + shellfilter::log::write $shellspy_status_log "do_script got scriptname:'$scriptname' replwhen:$replwhen args:'$args'" + + set script [string map [list %a% $args %s% $scriptname] { +set scriptname %s% +set ::argv [list %a%] +set ::argc [llength $::argv] +source [file normalize $scriptname] + + }] + + set repl_line "package require app-punk\n" + + if {$replwhen eq "repl_first"} { + #we need to cooperate with the repl to get the script to run on exit + namespace eval ::repl {} + set ::repl::post_script $script + set script "$repl_line" + } elseif {$replwhen eq "repl_last"} { + append script $repl_line + } else { + #just the script + } + + + set args [do_callback script {*}$args] + set params [do_callback_parameters script] + dict set params -tclscript 1 ;#don't give callback a chance to omit/break this + dict set params -teehandle shellspy + + set params [dict merge $params [get_channel_config $::testconfig]] + + + set exitinfo [shellfilter::run $script {*}$params] + if {[lindex $exitinfo 0] eq "exitcode"} { + shellfilter::log::write $shellspy_status_log "do_script returning $exitinfo" + } + } + + proc shellescape {arglist} { + set out [list] + foreach a $arglist { + set a [string map [list \\ \\\\ ] $a] + lappend out $a + } + return $out + } + proc do_shell {shell args} { + variable shellspy_status_log + shellfilter::log::write $shellspy_status_log "do_shell $shell got '$args' [llength $args]" + set args [do_callback $shell {*}$args] + shellfilter::log::write $shellspy_status_log "do_shell $shell xgot '$args'" + set params [do_callback_parameters $shell] + dict set params -teehandle shellspy + + + set params [dict merge $params [get_channel_config $::testconfig]] + + set id_out [shellfilter::stack::add stdout towindows -action sink-aside-locked -settings {-junction 1}] + + #shells that take -c and need all args passed together as a string + + set exitinfo [shellfilter::run [concat $shell -c [shellescape $args]] {*}$params] + + shellfilter::stack::remove stdout $id_out + + + if {[lindex $exitinfo 0] eq "exitcode"} { + shellfilter::log::write $shellspy_status_log "do_shell $shell returning $exitinfo" + } + } + proc do_wsl {dist args} { + variable shellspy_status_log + shellfilter::log::write $shellspy_status_log "do_wsl $dist got '$args' [llength $args]" + set args [do_callback wsl {*}$args] ;#use dist? + shellfilter::log::write $shellspy_status_log "do_wsl $dist xgot '$args'" + set params [do_callback_parameters wsl] + + dict set params -debug 0 + + + set params [dict merge $params [get_channel_config $::testconfig]] + + + set id_out [shellfilter::stack::add stdout towindows -action sink-aside-locked -settings {-junction 1}] + + + dict set params -teehandle shellspy ;#shellspyout shellspyerr must exist + set exitinfo [shellfilter::run [concat wsl -d $dist -e [shellescape $args]] {*}$params] + + + shellfilter::stack::remove stdout $id_out + + + if {[lindex $exitinfo 0] eq "exitcode"} { + shellfilter::log::write $shellspy_status_log "do_wsl $dist returning $exitinfo" + } + } + + #todo - load these from a callback + set commands [list] + + #shout extension to force use of tclsh as a separate process + #todo - detect various extensions - and use all script-preceding unmatched args as interpreter+options + #e.g perl,php,python etc. + #For tcl will make it easy to test different interpreter output from tclkitsh, tclsh8.6, tclsh8.7 etc + #for now we have a hardcoded default interpreter for tcl as 'tclsh' - todo: get default interps from config + #(or just attempt launch in case there is shebang line in script) + #we may get ambiguity with existing shell match-specs such as -c /c -r. todo - only match those in first slot? + lappend commands [list tclscriptprocess [list match [list .*\.TCL$ .*\.TM$ .*\.TK$] dispatch [list shellspy::do_script_process %matched%] dispatchtype tcl dispatchglobal 1 singleopts {any}]] + for {set i 0} {$i < 25} {incr i} { + lappend commands [list tclscriptprocess [list sub word$i singleopts {any}]] + } + + #camelcase convention .Tcl script before repl + lappend commands [list tclscriptbeforerepl [list match [list .*\.Tcl$ .*\.Tm$ .*\.Tk$ ] dispatch [list shellspy::do_script %matched% "repl_last"] dispatchtype tcl dispatchglobal 1 singleopts {any}]] + for {set i 0} {$i < 25} {incr i} { + lappend commands [list tclscriptbeforerepl [list sub word$i singleopts {any}]] + } + + + #Backwards Camelcase convention .tcL - means repl first, script last + lappend commands [list tclscriptafterrepl [list match [list .*\.tcL$ .*\.tM$ .*\.tK$ ] dispatch [list shellspy::do_script %matched% "repl_first"] dispatchtype tcl dispatchglobal 1 singleopts {any}]] + for {set i 0} {$i < 25} {incr i} { + lappend commands [list tclscriptafterrepl [list sub word$i singleopts {any}]] + } + + + #we've already handled .Tcl .tcL, .tCl, .TCL - handle any other capitalisations as a script in this process + lappend commands [list tclscript [list match [list .*\.tcl$ .*\.tCL$ .*\.TCl$ .*\.tm$ .*\.tk$ ] dispatch [list shellspy::do_script %matched% "no_repl"] dispatchtype tcl dispatchglobal 1 singleopts {any}]] + for {set i 0} {$i < 25} {incr i} { + lappend commands [list tclscript [list sub word$i singleopts {any}]] + } + + + + lappend commands [list bashraw [list match ^bash$ dispatch [list shellspy::do_shell bash] dispatchtype raw dispatchglobal 1 singleopts {any}]] + for {set i 0} {$i < 25} {incr i} { + lappend commands [list bashraw [list sub word$i singleopts {any}]] + } + lappend commands {shraw {match ^sh$ dispatch {shellspy::do_shell sh} dispatchtype raw dispatchglobal 1 singleopts {any}}} + for {set i 0} {$i < 25} {incr i} { + lappend commands [list shraw [list sub word$i singleopts {any}]] + } + + lappend commands [list runbash [list match ^b$ dispatch [list shellspy::do_shell bash] dispatchtype shell dispatchglobal 1 singleopts {any}]] + for {set i 0} {$i < 25} {incr i} { + lappend commands [list runbash [list sub word$i singleopts {any}]] + } + lappend commands {runsh {match ^s$ dispatch {shellspy::do_shell sh} dispatchtype shell dispatchglobal 1 singleopts {any}}} + for {set i 0} {$i < 25} {incr i} { + lappend commands [list runsh [list sub word$i singleopts {any}]] + } + + lappend commands {runraw {match ^-r$ dispatch shellspy::do_raw dispatchtype raw dispatchglobal 1 singleopts {any}}} + for {set i 0} {$i < 25} {incr i} { + lappend commands [list runraw [list sub word$i singleopts {any}]] + } + lappend commands {runpwsh {match ^-c$ dispatch shellspy::do_in_powershell dispatchtype raw dispatchglobal 1 singleopts {any}}} + for {set i 0} {$i < 25} {incr i} { + lappend commands [list runpwsh [list sub word$i singleopts {any}]] + } + lappend commands {runpwsht {match ^pwsh$ dispatch shellspy::do_in_powershell_terminal dispatchtype raw dispatchglobal 1 singleopts {any}}} + for {set i 0} {$i < 25} {incr i} { + lappend commands [list runpwsht [list sub word$i singleopts {any}]] + } + + + lappend commands {runcmd {match ^/c$ dispatch shellspy::do_in_cmdshell dispatchtype raw dispatchglobal 1 singleopts {any} longopts {any}}} + for {set i 0} {$i < 25} {incr i} { + lappend commands [list runcmd [list sub word$i singleopts {any}]] + } + lappend commands {runcmduc {match ^/u/c$ dispatch shellspy::do_in_cmdshelluc dispatchtype raw dispatchglobal 1 singleopts {any} longopts {any}}} + for {set i 0} {$i < 25} {incr i} { + lappend commands [list runcmduc [list sub word$i singleopts {any}]] + } + #cmd with bracked args () e.g with vim shellxquote set to "(" + lappend commands [list runcmdb [list match ^cmdb$ dispatch [list shellspy::do_in_cmdshellb %matched%] dispatchtype raw dispatchglobal 1 singleopts {any} longopts {any} pairopts {any}]] + for {set i 0} {$i < 25} {incr i} { + lappend commands [list runcmdb [list sub word$i singleopts {any} longopts {any} pairopts {any}]] + } + + lappend commands [list wslraw [list match ^wsl$ dispatch [list shellspy::do_wsl AlmaLinux9] dispatchtype raw dispatchglobal 1 singleopts {any} longopts {any}]] + for {set i 0} {$i < 25} {incr i} { + lappend commands [list wslraw [list sub word$i singleopts {any}]] + } + + + ############################################################################################ + + #echo raw args to diverted stderr before running the argument analysis + puts -nonewline stderr "rawargs: $::argv\n" + set i 1 + foreach a $::argv { + puts -nonewline stderr "arg$i: '$a'\n" + incr i + } + + + puts stderr $::shellfilter::ansi::test + flush stderr + + set argdefinitions [list \ + -caller shellspy_dispatcher \ + -debugargs 0 \ + -debugargsonerror 2 \ + -return all \ + -soloflags {} \ + -defaults [list] \ + -required {none} \ + -extras {all} \ + -commandprocessors $commands \ + -values $::argv ] + + + + if {[catch { + set arglist [check_flags {*}$argdefinitions] + } errMsg]} { + puts -nonewline stderr "|shellspy-stderr> ERROR during command dispatch\n" + puts -nonewline stderr "|shellspy-stderr> $errMsg\n" + puts -nonewline stderr "|shellspy-stderr> [set ::errorInfo]\n" + + } else { + puts stdout "shellspy final-arglist $arglist" + } + + shellfilter::log::write $shellspy_status_log "check_flags dispatch -done-" + + #puts stdout "sp2. $::argv" + + if {[catch { + set tidyinfo [shellfilter::logtidyup] + } errMsg]} { + + shellfilter::log::open shellspy-error {-tag shellspy-error -syslog 127.0.0.1:514} + shellfilter::log::write shellspy-error "logtidyup error $errMsg\n [set ::errorInfo]" + after 500 + } + #don't open more logs.. + #puts stdout ">$tidyinfo" + + + #shellfilter::log::write $shellspy_status_log "logtidyup -done- $tidyinfo" + + + + set errorlist [dict get $tidyinfo errors] + if {[llength $errorlist]} { + foreach err $errorlist { + puts -nonewline stderr "|shellspy-final> worker-error-set $err\n" + } + } + puts stdout "shellspy -done-" + #shellfilter::log::write $shellspy_status_log "shellspy -done-" + flush stdout + + if {[catch { + shellfilter::logtidyup $shellspy_status_log + } errMsg]} { + shellfilter::log::open shellspy-final {-tag shellspy-final -syslog 127.0.0.1:514} + shellfilter::log::write shellspy-final "FINAL logtidyup error $errMsg\n [set ::errorInfo]" + after 500 + + } + + exit 0 +} + +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/LICENSE b/src/punk86.vfs/lib/twapi4.7.2/LICENSE new file mode 100644 index 00000000..fcfc79f8 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/LICENSE @@ -0,0 +1,29 @@ +Copyright (c) 2003-2012, Ashok P. Nadkarni +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- The name of the copyright holder and any other contributors may not +be used to endorse or promote products derived from this software +without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/punk86.vfs/lib/twapi4.7.2/account.tcl b/src/punk86.vfs/lib/twapi4.7.2/account.tcl new file mode 100644 index 00000000..2b87b35d --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/account.tcl @@ -0,0 +1,1160 @@ +# +# Copyright (c) 2009-2015, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +package require twapi_security + +namespace eval twapi { + record USER_INFO_0 {-name} + record USER_INFO_1 [concat [USER_INFO_0] { + -password -password_age -priv -home_dir -comment -flags -script_path + }] + record USER_INFO_2 [concat [USER_INFO_1] { + -auth_flags -full_name -usr_comment -parms + -workstations -last_logon -last_logoff -acct_expires -max_storage + -units_per_week -logon_hours -bad_pw_count -num_logons + -logon_server -country_code -code_page + }] + record USER_INFO_3 [concat [USER_INFO_2] { + -user_id -primary_group_id -profile -home_dir_drive -password_expired + }] + record USER_INFO_4 [concat [USER_INFO_2] { + -sid -primary_group_id -profile -home_dir_drive -password_expired + }] + + record GROUP_INFO_0 {-name} + record GROUP_INFO_1 {-name -comment} + record GROUP_INFO_2 {-name -comment -group_id -attributes} + record GROUP_INFO_3 {-name -comment -sid -attributes} + + record NetEnumResult {moredata hresume totalentries entries} + +} + +# Add a new user account +proc twapi::new_user {username args} { + array set opts [parseargs args [list \ + system.arg \ + password.arg \ + comment.arg \ + [list priv.arg "user" [array names twapi::priv_level_map]] \ + home_dir.arg \ + script_path.arg \ + ] \ + -nulldefault] + + if {$opts(priv) ne "user"} { + error "Option -priv is deprecated and values other than 'user' are not allowed" + } + + # 1 -> priv level 'user'. NetUserAdd mandates this as only allowed value + NetUserAdd $opts(system) $username $opts(password) 1 \ + $opts(home_dir) $opts(comment) 0 $opts(script_path) + + + # Backward compatibility - add to 'Users' local group + # but only if -system is local + if {$opts(system) eq "" || + ([info exists ::env(COMPUTERNAME)] && + [string equal -nocase $opts(system) $::env(COMPUTERNAME)])} { + trap { + _set_user_priv_level $username $opts(priv) -system $opts(system) + } onerror {} { + # Remove the previously created user account + catch {delete_user $username -system $opts(system)} + rethrow + } + } +} + + +# Delete a user account +proc twapi::delete_user {username args} { + array set opts [parseargs args {system.arg} -nulldefault] + + # Remove the user from the LSA rights database. + _delete_rights $username $opts(system) + + NetUserDel $opts(system) $username +} + + +# Define various functions to set various user account fields +foreach twapi::_field_ { + {name 0} + {password 1003} + {home_dir 1006} + {comment 1007} + {script_path 1009} + {full_name 1011} + {country_code 1024} + {profile 1052} + {home_dir_drive 1053} +} { + proc twapi::set_user_[lindex $::twapi::_field_ 0] {username fieldval args} " + array set opts \[parseargs args { + system.arg + } -nulldefault \] + Twapi_NetUserSetInfo [lindex $::twapi::_field_ 1] \$opts(system) \$username \$fieldval" +} +unset twapi::_field_ + +# Set account expiry time +proc twapi::set_user_expiration {username time args} { + array set opts [parseargs args {system.arg} -nulldefault] + + if {![string is integer -strict $time]} { + if {[string equal $time "never"]} { + set time -1 + } else { + set time [clock scan $time] + } + } + Twapi_NetUserSetInfo 1017 $opts(system) $username $time +} + +# Unlock a user account +proc twapi::unlock_user {username args} { + # UF_LOCKOUT -> 0x10 + _change_user_info_flags $username 0x10 0 {*}$args +} + +# Enable a user account +proc twapi::enable_user {username args} { + # UF_ACCOUNTDISABLE -> 0x2 + _change_user_info_flags $username 0x2 0 {*}$args +} + +# Disable a user account +proc twapi::disable_user {username args} { + # UF_ACCOUNTDISABLE -> 0x2 + _change_user_info_flags $username 0x2 0x2 {*}$args +} + + +# Return the specified fields for a user account +proc twapi::get_user_account_info {account args} { + # Define each option, the corresponding field, and the + # information level at which it is returned + array set fields { + comment 1 + password_expired 4 + full_name 2 + parms 2 + units_per_week 2 + primary_group_id 4 + flags 1 + logon_server 2 + country_code 2 + home_dir 1 + password_age 1 + home_dir_drive 4 + num_logons 2 + acct_expires 2 + last_logon 2 + usr_comment 2 + bad_pw_count 2 + code_page 2 + logon_hours 2 + workstations 2 + last_logoff 2 + name 0 + script_path 1 + profile 4 + max_storage 2 + } + # Left out - auth_flags 2 + # Left out (always returned as NULL) - password {usri3_password 1} + # Note sid is available at level 4 as well but don't want to set + # level 4 just for that since we can get it by other means. Hence + # not listed above + + array set opts [parseargs args \ + [concat [array names fields] sid \ + internet_identity \ + status type password_attrs \ + [list local_groups global_groups system.arg all]] \ + -nulldefault] + + if {$opts(all)} { + set level 4 + set opts(local_groups) 1 + set opts(global_groups) 1 + } else { + # Based on specified fields, figure out what level info to ask for + set level -1 + foreach {opt optval} [array get opts] { + if {[info exists fields($opt)] && + $optval && + $fields($opt) > $level + } { + set level $fields($opt) + } + } + if {$opts(status) || $opts(type) || $opts(password_attrs)} { + # These fields are based on the flags field + if {$level < 1} { + set level 1 + } + } + } + + array set result [list ] + + if {$level > -1} { + set rawdata [NetUserGetInfo $opts(system) $account $level] + array set data [USER_INFO_$level $rawdata] + + # Extract the requested data + foreach opt [array names fields] { + if {$opts(all) || $opts($opt)} { + set result(-$opt) $data(-$opt) + } + } + if {$level == 4 && ($opts(all) || $opts(sid))} { + set result(-sid) $data(-sid) + } + + # Map internal values to more friendly formats + if {$opts(all) || $opts(status) || $opts(type) || $opts(password_attrs)} { + array set result [_map_userinfo_flags $data(-flags)] + if {! $opts(all)} { + if {! $opts(status)} {unset result(-status)} + if {! $opts(type)} {unset result(-type)} + if {! $opts(password_attrs)} {unset result(-password_attrs)} + } + } + + if {[info exists result(-logon_hours)]} { + binary scan $result(-logon_hours) b* result(-logon_hours) + } + + foreach time_field {-acct_expires -last_logon -last_logoff} { + if {[info exists result($time_field)]} { + if {$result($time_field) == -1 || $result($time_field) == 4294967295} { + set result($time_field) "never" + } elseif {$result($time_field) == 0} { + set result($time_field) "unknown" + } + } + } + } + + if {$opts(all) || $opts(internet_identity)} { + set result(-internet_identity) {} + if {[min_os_version 6 2]} { + set inet_ident [NetUserGetInfo $opts(system) $account 24] + if {[llength $inet_ident]} { + set result(-internet_identity) [twine { + internet_provider_name internet_principal_name sid + } [lrange $inet_ident 1 end]] + } + } + } + + # The Net* calls always return structures as lists even when the struct + # contains only one field so we need to lpick to extract the field + + if {$opts(local_groups)} { + set result(-local_groups) [lpick [NetEnumResult entries [NetUserGetLocalGroups $opts(system) $account 0 0]] 0] + } + + if {$opts(global_groups)} { + set result(-global_groups) [lpick [NetEnumResult entries [NetUserGetGroups $opts(system) $account 0]] 0] + } + + if {$opts(sid) && ! [info exists result(-sid)]} { + set result(-sid) [lookup_account_name $account -system $opts(system)] + } + + return [array get result] +} + +proc twapi::get_user_global_groups {account args} { + parseargs args { + system.arg + denyonly + all + } -nulldefault -maxleftover 0 -setvars + + set groups {} + foreach elem [NetEnumResult entries [NetUserGetGroups $system [map_account_to_name $account -system $system] 1]] { + # 0x10 -> SE_GROUP_USE_FOR_DENY_ONLY + set marked_denyonly [expr {[lindex $elem 1] & 0x10}] + if {$all || ($denyonly && $marked_denyonly) || !($denyonly || $marked_denyonly)} { + lappend groups [lindex $elem 0] + } + } + return $groups +} + +proc twapi::get_user_local_groups {account args} { + parseargs args { + system.arg + {recurse.bool 0} + } -nulldefault -maxleftover 0 -setvars + + # The Net* calls always return structures as lists even when the struct + # contains only one field so we need to lpick to extract the field + return [lpick [NetEnumResult entries [NetUserGetLocalGroups $system [map_account_to_name $account -system $system] 0 $recurse]] 0] +} + +proc twapi::get_user_local_groups_recursive {account args} { + return [get_user_local_groups $account {*}$args -recurse 1] +} + + +# Set the specified fields for a user account +proc twapi::set_user_account_info {account args} { + + # Define each option, the corresponding field, and the + # information level at which it is returned + array set opts [parseargs args { + {system.arg ""} + comment.arg + full_name.arg + country_code.arg + home_dir.arg + home_dir.arg + acct_expires.arg + name.arg + script_path.arg + profile.arg + }] + + # TBD - rewrite this to be atomic + + if {[info exists opts(comment)]} { + set_user_comment $account $opts(comment) -system $opts(system) + } + + if {[info exists opts(full_name)]} { + set_user_full_name $account $opts(full_name) -system $opts(system) + } + + if {[info exists opts(country_code)]} { + set_user_country_code $account $opts(country_code) -system $opts(system) + } + + if {[info exists opts(home_dir)]} { + set_user_home_dir $account $opts(home_dir) -system $opts(system) + } + + if {[info exists opts(home_dir_drive)]} { + set_user_home_dir_drive $account $opts(home_dir_drive) -system $opts(system) + } + + if {[info exists opts(acct_expires)]} { + set_user_expiration $account $opts(acct_expires) -system $opts(system) + } + + if {[info exists opts(name)]} { + set_user_name $account $opts(name) -system $opts(system) + } + + if {[info exists opts(script_path)]} { + set_user_script_path $account $opts(script_path) -system $opts(system) + } + + if {[info exists opts(profile)]} { + set_user_profile $account $opts(profile) -system $opts(system) + } +} + + +proc twapi::get_global_group_info {grpname args} { + array set opts [parseargs args { + {system.arg ""} + comment + name + members + sid + attributes + all + } -maxleftover 0] + + set result {} + if {[expr {$opts(comment) || $opts(name) || $opts(sid) || $opts(attributes) || $opts(all)}]} { + # 3 -> GROUP_INFO level 3 + lassign [NetGroupGetInfo $opts(system) $grpname 3] name comment sid attributes + if {$opts(all) || $opts(sid)} { + lappend result -sid $sid + } + if {$opts(all) || $opts(name)} { + lappend result -name $name + } + if {$opts(all) || $opts(comment)} { + lappend result -comment $comment + } + if {$opts(all) || $opts(attributes)} { + lappend result -attributes [map_token_group_attr $attributes] + } + } + + if {$opts(all) || $opts(members)} { + lappend result -members [get_global_group_members $grpname -system $opts(system)] + } + + return $result +} + +# Get info about a local or global group +proc twapi::get_local_group_info {name args} { + array set opts [parseargs args { + {system.arg ""} + comment + name + members + sid + all + } -maxleftover 0] + + set result [list ] + if {$opts(all) || $opts(sid)} { + lappend result -sid [lookup_account_name $name -system $opts(system)] + } + if {$opts(all) || $opts(comment) || $opts(name)} { + lassign [NetLocalGroupGetInfo $opts(system) $name 1] name comment + if {$opts(all) || $opts(name)} { + lappend result -name $name + } + if {$opts(all) || $opts(comment)} { + lappend result -comment $comment + } + } + if {$opts(all) || $opts(members)} { + lappend result -members [get_local_group_members $name -system $opts(system)] + } + return $result +} + +# Get list of users on a system +proc twapi::get_users {args} { + parseargs args { + level.int + } -setvars -ignoreunknown + + # TBD -allow user to specify filter + lappend args -filter 0 + if {[info exists level]} { + lappend args -level $level -fields [USER_INFO_$level] + } + return [_net_enum_helper NetUserEnum $args] +} + +proc twapi::get_global_groups {args} { + parseargs args { + level.int + } -setvars -ignoreunknown + + # TBD - level 3 returns an ERROR_INVALID_LEVEL even though + # MSDN says its valid for NetGroupEnum + + if {[info exists level]} { + lappend args -level $level -fields [GROUP_INFO_$level] + } + return [_net_enum_helper NetGroupEnum $args] +} + +proc twapi::get_local_groups {args} { + parseargs args { + level.int + } -setvars -ignoreunknown + + if {[info exists level]} { + lappend args -level $level -fields [dict get {0 {-name} 1 {-name -comment}} $level] + } + return [_net_enum_helper NetLocalGroupEnum $args] +} + +# Create a new global group +proc twapi::new_global_group {grpname args} { + array set opts [parseargs args { + system.arg + comment.arg + } -nulldefault] + + NetGroupAdd $opts(system) $grpname $opts(comment) +} + +# Create a new local group +proc twapi::new_local_group {grpname args} { + array set opts [parseargs args { + system.arg + comment.arg + } -nulldefault] + + NetLocalGroupAdd $opts(system) $grpname $opts(comment) +} + + +# Delete a global group +proc twapi::delete_global_group {grpname args} { + array set opts [parseargs args {system.arg} -nulldefault] + + # Remove the group from the LSA rights database. + _delete_rights $grpname $opts(system) + + NetGroupDel $opts(system) $grpname +} + +# Delete a local group +proc twapi::delete_local_group {grpname args} { + array set opts [parseargs args {system.arg} -nulldefault] + + # Remove the group from the LSA rights database. + _delete_rights $grpname $opts(system) + + NetLocalGroupDel $opts(system) $grpname +} + + +# Enumerate members of a global group +proc twapi::get_global_group_members {grpname args} { + parseargs args { + level.int + } -setvars -ignoreunknown + + if {[info exists level]} { + lappend args -level $level -fields [dict! {0 {-name} 1 {-name -attributes}} $level] + } + + lappend args -preargs [list $grpname] -namelevel 1 + return [_net_enum_helper NetGroupGetUsers $args] +} + +# Enumerate members of a local group +proc twapi::get_local_group_members {grpname args} { + parseargs args { + level.int + } -setvars -ignoreunknown + + if {[info exists level]} { + lappend args -level $level -fields [dict! {0 {-sid} 1 {-sid -sidusage -name} 2 {-sid -sidusage -domainandname} 3 {-domainandname}} $level] + } + + lappend args -preargs [list $grpname] -namelevel 1 -namefield 2 + return [_net_enum_helper NetLocalGroupGetMembers $args] +} + +# Add a user to a global group +proc twapi::add_user_to_global_group {grpname username args} { + array set opts [parseargs args {system.arg} -nulldefault] + + # No error if already member of the group + trap { + NetGroupAddUser $opts(system) $grpname $username + } onerror {TWAPI_WIN32 1320} { + # Ignore + } +} + + +# Remove a user from a global group +proc twapi::remove_user_from_global_group {grpname username args} { + array set opts [parseargs args {system.arg} -nulldefault] + + trap { + NetGroupDelUser $opts(system) $grpname $username + } onerror {TWAPI_WIN32 1321} { + # Was not in group - ignore + } +} + + +# Add a user to a local group +proc twapi::add_member_to_local_group {grpname username args} { + array set opts [parseargs args { + system.arg + {type.arg name} + } -nulldefault] + + # No error if already member of the group + trap { + Twapi_NetLocalGroupMembers 0 $opts(system) $grpname [expr {$opts(type) eq "sid" ? 0 : 3}] [list $username] + } onerror {TWAPI_WIN32 1378} { + # Ignore + } +} + +proc twapi::add_members_to_local_group {grpname accts args} { + array set opts [parseargs args { + system.arg + {type.arg name} + } -nulldefault] + + Twapi_NetLocalGroupMembers 0 $opts(system) $grpname [expr {$opts(type) eq "sid" ? 0 : 3}] $accts +} + + +# Remove a user from a local group +proc twapi::remove_member_from_local_group {grpname username args} { + array set opts [parseargs args { + system.arg + {type.arg name} + } -nulldefault] + + trap { + Twapi_NetLocalGroupMembers 1 $opts(system) $grpname [expr {$opts(type) eq "sid" ? 0 : 3}] [list $username] + } onerror {TWAPI_WIN32 1377} { + # Was not in group - ignore + } +} + +proc twapi::remove_members_from_local_group {grpname accts args} { + array set opts [parseargs args { + system.arg + {type.arg name} + } -nulldefault] + + Twapi_NetLocalGroupMembers 1 $opts(system) $grpname [expr {$opts(type) eq "sid" ? 0 : 3}] $accts +} + + +# Get rights for an account +proc twapi::get_account_rights {account args} { + array set opts [parseargs args { + {system.arg ""} + } -maxleftover 0] + + set sid [map_account_to_sid $account -system $opts(system)] + + trap { + set lsah [get_lsa_policy_handle -system $opts(system) -access policy_lookup_names] + return [Twapi_LsaEnumerateAccountRights $lsah $sid] + } onerror {TWAPI_WIN32 2} { + # No specific rights for this account + return [list ] + } finally { + if {[info exists lsah]} { + close_lsa_policy_handle $lsah + } + } +} + +# Get accounts having a specific right +proc twapi::find_accounts_with_right {right args} { + array set opts [parseargs args { + {system.arg ""} + name + } -maxleftover 0] + + trap { + set lsah [get_lsa_policy_handle \ + -system $opts(system) \ + -access { + policy_lookup_names + policy_view_local_information + }] + set accounts [list ] + foreach sid [Twapi_LsaEnumerateAccountsWithUserRight $lsah $right] { + if {$opts(name)} { + if {[catch {lappend accounts [lookup_account_sid $sid -system $opts(system)]}]} { + # No mapping for SID - can happen if account has been + # deleted but LSA policy not updated accordingly + lappend accounts $sid + } + } else { + lappend accounts $sid + } + } + return $accounts + } onerror {TWAPI_WIN32 259} { + # No accounts have this right + return [list ] + } finally { + if {[info exists lsah]} { + close_lsa_policy_handle $lsah + } + } + +} + +# Add/remove rights to an account +proc twapi::_modify_account_rights {operation account rights args} { + set switches { + system.arg + handle.arg + } + + switch -exact -- $operation { + add { + # Nothing to do + } + remove { + lappend switches all + } + default { + error "Invalid operation '$operation' specified" + } + } + + array set opts [parseargs args $switches -maxleftover 0] + + if {[info exists opts(system)] && [info exists opts(handle)]} { + error "Options -system and -handle may not be specified together" + } + + if {[info exists opts(handle)]} { + set lsah $opts(handle) + set sid $account + } else { + if {![info exists opts(system)]} { + set opts(system) "" + } + + set sid [map_account_to_sid $account -system $opts(system)] + # We need to open a policy handle ourselves. First try to open + # with max privileges in case the account needs to be created + # and then retry with lower privileges if that fails + catch { + set lsah [get_lsa_policy_handle \ + -system $opts(system) \ + -access { + policy_lookup_names + policy_create_account + }] + } + if {![info exists lsah]} { + set lsah [get_lsa_policy_handle \ + -system $opts(system) \ + -access policy_lookup_names] + } + } + + trap { + if {$operation == "add"} { + LsaAddAccountRights $lsah $sid $rights + } else { + LsaRemoveAccountRights $lsah $sid $opts(all) $rights + } + } finally { + # Close the handle if we opened it + if {! [info exists opts(handle)]} { + close_lsa_policy_handle $lsah + } + } +} + +interp alias {} twapi::add_account_rights {} twapi::_modify_account_rights add +interp alias {} twapi::remove_account_rights {} twapi::_modify_account_rights remove + +# Return list of logon sesionss +proc twapi::find_logon_sessions {args} { + array set opts [parseargs args { + user.arg + type.arg + tssession.arg + } -maxleftover 0] + + set luids [LsaEnumerateLogonSessions] + if {! ([info exists opts(user)] || [info exists opts(type)] || + [info exists opts(tssession)])} { + return $luids + } + + + # Need to get the data for each session to see if it matches + set result [list ] + if {[info exists opts(user)]} { + set sid [map_account_to_sid $opts(user)] + } + if {[info exists opts(type)]} { + set logontypes [list ] + foreach logontype $opts(type) { + lappend logontypes [_logon_session_type_code $logontype] + } + } + + foreach luid $luids { + trap { + unset -nocomplain session + array set session [LsaGetLogonSessionData $luid] + + # For the local system account, no data is returned on some + # platforms + if {[array size session] == 0} { + set session(Sid) S-1-5-18; # SYSTEM + set session(Session) 0 + set session(LogonType) 0 + } + if {[info exists opts(user)] && $session(Sid) ne $sid} { + continue; # User id does not match + } + + if {[info exists opts(type)] && [lsearch -exact $logontypes $session(LogonType)] < 0} { + continue; # Type does not match + } + + if {[info exists opts(tssession)] && $session(Session) != $opts(tssession)} { + continue; # Term server session does not match + } + + lappend result $luid + + } onerror {TWAPI_WIN32 1312} { + # Session no longer exists. Just skip + continue + } + } + + return $result +} + + +# Return data for a logon session +proc twapi::get_logon_session_info {luid args} { + array set opts [parseargs args { + all + authpackage + dnsdomain + logondomain + logonid + logonserver + logontime + type + usersid + user + tssession + userprincipal + } -maxleftover 0] + + array set session [LsaGetLogonSessionData $luid] + + # Some fields may be missing on Win2K + foreach fld {LogonServer DnsDomainName Upn} { + if {![info exists session($fld)]} { + set session($fld) "" + } + } + + array set result [list ] + foreach {opt index} { + authpackage AuthenticationPackage + dnsdomain DnsDomainName + logondomain LogonDomain + logonid LogonId + logonserver LogonServer + logontime LogonTime + type LogonType + usersid Sid + user UserName + tssession Session + userprincipal Upn + } { + if {$opts(all) || $opts($opt)} { + set result(-$opt) $session($index) + } + } + + if {[info exists result(-type)]} { + set result(-type) [_logon_session_type_symbol $result(-type)] + } + + return [array get result] +} + + + + +# Set/reset the given bits in the usri3_flags field for a user account +# mask indicates the mask of bits to set. values indicates the values +# of those bits +proc twapi::_change_user_info_flags {username mask values args} { + array set opts [parseargs args { + system.arg + } -nulldefault -maxleftover 0] + + # Get current flags + set flags [USER_INFO_1 -flags [NetUserGetInfo $opts(system) $username 1]] + + # Turn off mask bits and write flags back + set flags [expr {$flags & (~ $mask)}] + # Set the specified bits + set flags [expr {$flags | ($values & $mask)}] + + # Write new flags back + Twapi_NetUserSetInfo 1008 $opts(system) $username $flags +} + +# Returns the logon session type value for a symbol +twapi::proc* twapi::_logon_session_type_code {type} { + variable _logon_session_type_map + # Variable that maps logon session type codes to integer values + # Position of each symbol gives its corresponding type value + # See ntsecapi.h for definitions + set _logon_session_type_map { + 0 + 1 + interactive + network + batch + service + proxy + unlockworkstation + networkclear + newcredentials + remoteinteractive + cachedinteractive + cachedremoteinteractive + cachedunlockworkstation + } +} { + variable _logon_session_type_map + + # Type may be an integer or a token + set code [lsearch -exact $_logon_session_type_map $type] + if {$code >= 0} { + return $code + } + + if {![string is integer -strict $type]} { + badargs! "Invalid logon session type '$type' specified" 3 + } + return $type +} + +# Returns the logon session type symbol for an integer value +proc twapi::_logon_session_type_symbol {code} { + variable _logon_session_type_map + _logon_session_type_code interactive; # Just to init _logon_session_type_map + set symbol [lindex $_logon_session_type_map $code] + if {$symbol eq ""} { + return $code + } else { + return $symbol + } +} + +proc twapi::_set_user_priv_level {username priv_level args} { + + array set opts [parseargs args {system.arg} -nulldefault] + + if {0} { + # FOr some reason NetUserSetInfo cannot change priv level + # Tried it separately with a simple C program. So this code + # is commented out and we use group membership to achieve + # the desired result + # Note: - latest MSDN confirms above + if {![info exists twapi::priv_level_map($priv_level)]} { + error "Invalid privilege level value '$priv_level' specified. Must be one of [join [array names twapi::priv_level_map] ,]" + } + set priv $twapi::priv_level_map($priv_level) + + Twapi_NetUserSetInfo_priv $opts(system) $username $priv + } else { + # Don't hardcode group names - reverse map SID's instead for + # non-English systems. Also note that since + # we might be lowering privilege level, we have to also + # remove from higher privileged groups + + switch -exact -- $priv_level { + guest { + # administrators users + set outgroups {S-1-5-32-544 S-1-5-32-545} + # guests + set ingroup S-1-5-32-546 + } + user { + # administrators + set outgroups {S-1-5-32-544} + # users + set ingroup S-1-5-32-545 + } + admin { + set outgroups {} + set ingroup S-1-5-32-544 + } + default {error "Invalid privilege level '$priv_level'. Must be one of 'guest', 'user' or 'admin'"} + } + # Remove from higher priv groups + foreach outgroup $outgroups { + # Get the potentially localized name of the group + set group [lookup_account_sid $outgroup -system $opts(system)] + # Catch since may not be member of that group + catch {remove_member_from_local_group $group $username -system $opts(system)} + } + + # Get the potentially localized name of the group to be added + set group [lookup_account_sid $ingroup -system $opts(system)] + add_member_to_local_group $group $username -system $opts(system) + } +} + +proc twapi::_map_userinfo_flags {flags} { + # UF_LOCKOUT -> 0x10, UF_ACCOUNTDISABLE -> 0x2 + if {$flags & 0x2} { + set status disabled + } elseif {$flags & 0x10} { + set status locked + } else { + set status enabled + } + + #define UF_TEMP_DUPLICATE_ACCOUNT 0x0100 + #define UF_NORMAL_ACCOUNT 0x0200 + #define UF_INTERDOMAIN_TRUST_ACCOUNT 0x0800 + #define UF_WORKSTATION_TRUST_ACCOUNT 0x1000 + #define UF_SERVER_TRUST_ACCOUNT 0x2000 + if {$flags & 0x0200} { + set type normal + } elseif {$flags & 0x0100} { + set type duplicate + } elseif {$flags & 0x0800} { + set type interdomain_trust + } elseif {$flags & 0x1000} { + set type workstation_trust + } elseif {$flags & 0x2000} { + set type server_trust + } else { + set type unknown + } + + set pw {} + #define UF_PASSWD_NOTREQD 0x0020 + if {$flags & 0x0020} { + lappend pw not_required + } + #define UF_PASSWD_CANT_CHANGE 0x0040 + if {$flags & 0x0040} { + lappend pw cannot_change + } + #define UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED 0x0080 + if {$flags & 0x0080} { + lappend pw encrypted_text_allowed + } + #define UF_DONT_EXPIRE_PASSWD 0x10000 + if {$flags & 0x10000} { + lappend pw no_expiry + } + #define UF_SMARTCARD_REQUIRED 0x40000 + if {$flags & 0x40000} { + lappend pw smartcard_required + } + #define UF_PASSWORD_EXPIRED 0x800000 + if {$flags & 0x800000} { + lappend pw expired + } + + return [list -status $status -type $type -password_attrs $pw] +} + +twapi::proc* twapi::_define_user_modals {} { + struct _USER_MODALS_INFO_0 { + DWORD min_passwd_len; + DWORD max_passwd_age; + DWORD min_passwd_age; + DWORD force_logoff; + DWORD password_hist_len; + } + struct _USER_MODALS_INFO_1 { + DWORD role; + LPWSTR primary; + } + struct _USER_MODALS_INFO_2 { + LPWSTR domain_name; + PSID domain_id; + } + struct _USER_MODALS_INFO_3 { + DWORD lockout_duration; + DWORD lockout_observation_window; + DWORD lockout_threshold; + } + struct _USER_MODALS_INFO_1001 { + DWORD min_passwd_len; + } + struct _USER_MODALS_INFO_1002 { + DWORD max_passwd_age; + } + struct _USER_MODALS_INFO_1003 { + DWORD min_passwd_age; + } + struct _USER_MODALS_INFO_1004 { + DWORD force_logoff; + } + struct _USER_MODALS_INFO_1005 { + DWORD password_hist_len; + } + struct _USER_MODALS_INFO_1006 { + DWORD role; + } + struct _USER_MODALS_INFO_1007 { + LPWSTR primary; + } +} { +} + +twapi::proc* twapi::get_password_policy {{server_name ""}} { + _define_user_modals +} { + set result [NetUserModalsGet $server_name 0 [_USER_MODALS_INFO_0]] + dict with result { + if {$force_logoff == 4294967295 || $force_logoff == -1} { + set force_logoff never + } + if {$max_passwd_age == 4294967295 || $max_passwd_age == -1} { + set max_passwd_age none + } + } + return $result +} + +# TBD - doc & test +twapi::proc* twapi::get_system_role {{server_name ""}} { + _define_user_modals +} { + set result [NetUserModalsGet $server_name 1 [_USER_MODALS_INFO_1]] + dict set result role [dict* { + 0 standalone 1 member 2 backup 3 primary + } [dict get $result role]] + return $result +} + +# TBD - doc & test +twapi::proc* twapi::get_system_domain {{server_name ""}} { + _define_user_modals +} { + return [NetUserModalsGet $server_name 2 [_USER_MODALS_INFO_2]] +} + +twapi::proc* twapi::get_lockout_policy {{server_name ""}} { + _define_user_modals +} { + return [NetUserModalsGet $server_name 3 [_USER_MODALS_INFO_3]] +} + +twapi::proc* twapi::set_password_policy {name val {server_name ""}} { + _define_user_modals +} { + switch -exact $name { + min_passwd_len { + NetUserModalsSet $server_name 1001 [_USER_MODALS_INFO_1001 $val] + } + max_passwd_age { + if {$val eq "none"} { + set val 4294967295 + } + NetUserModalsSet $server_name 1002 [_USER_MODALS_INFO_1002 $val] + } + min_passwd_age { + NetUserModalsSet $server_name 1003 [_USER_MODALS_INFO_1003 $val] + } + force_logoff { + if {$val eq "never"} { + set val 4294967295 + } + NetUserModalsSet $server_name 1004 [_USER_MODALS_INFO_1004 $val] + } + password_hist_len { + NetUserModalsSet $server_name 1005 [_USER_MODALS_INFO_1005 $val] + } + } +} + +twapi::proc* twapi::set_lockout_policy {duration observe_window threshold {server_name ""}} { + _define_user_modals +} { + NetUserModalsSet $server_name 3 [_USER_MODALS_INFO_3 $duration $observe_window $threshold] +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/adsi.tcl b/src/punk86.vfs/lib/twapi4.7.2/adsi.tcl new file mode 100644 index 00000000..77dd5122 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/adsi.tcl @@ -0,0 +1,28 @@ +# +# Copyright (c) 2010-2012, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# ADSI routines + +# TBD - document +proc twapi::adsi_translate_name {name to {from 0}} { + set map { + unknown 0 fqdn 1 samcompatible 2 display 3 uniqueid 6 + canonical 7 userprincipal 8 canonicalex 9 serviceprincipal 10 + dnsdomain 12 + } + if {! [string is integer -strict $to]} { + set to [dict get $map $to] + if {$to == 0} { + error "'unknown' is not a valid target format." + } + } + + if {! [string is integer -strict $from]} { + set from [dict get $map $from] + } + + return [TranslateName $name $from $to] +} \ No newline at end of file diff --git a/src/punk86.vfs/lib/twapi4.7.2/apputil.tcl b/src/punk86.vfs/lib/twapi4.7.2/apputil.tcl new file mode 100644 index 00000000..db008b66 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/apputil.tcl @@ -0,0 +1,114 @@ +# +# Copyright (c) 2003-2012, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi {} + +# Get the command line +proc twapi::get_command_line {} { + return [GetCommandLineW] +} + +# Parse the command line +proc twapi::get_command_line_args {cmdline} { + # Special check for empty line. CommandLinetoArgv returns process + # exe name in this case. + if {[string length $cmdline] == 0} { + return [list ] + } + return [CommandLineToArgv $cmdline] +} + +# Read an ini file int +proc twapi::read_inifile_key {section key args} { + array set opts [parseargs args { + {default.arg ""} + inifile.arg + } -maxleftover 0] + + if {[info exists opts(inifile)]} { + set values [read_inifile_section $section -inifile $opts(inifile)] + } else { + set values [read_inifile_section $section] + } + + # Cannot use kl_get or arrays here because we want case insensitive compare + foreach {k val} $values { + if {[string equal -nocase $key $k]} { + return $val + } + } + return $opts(default) +} + +# Write an ini file string +proc twapi::write_inifile_key {section key value args} { + array set opts [parseargs args { + inifile.arg + } -maxleftover 0] + + if {[info exists opts(inifile)]} { + WritePrivateProfileString $section $key $value $opts(inifile) + } else { + WriteProfileString $section $key $value + } +} + +# Delete an ini file string +proc twapi::delete_inifile_key {section key args} { + array set opts [parseargs args { + inifile.arg + } -maxleftover 0] + + if {[info exists opts(inifile)]} { + WritePrivateProfileString $section $key $twapi::nullptr $opts(inifile) + } else { + WriteProfileString $section $key $twapi::nullptr + } +} + +# Get names of the sections in an inifile +proc twapi::read_inifile_section_names {args} { + array set opts [parseargs args { + inifile.arg + } -nulldefault -maxleftover 0] + + return [GetPrivateProfileSectionNames $opts(inifile)] +} + +# Get keys and values in a section in an inifile +proc twapi::read_inifile_section {section args} { + array set opts [parseargs args { + inifile.arg + } -nulldefault -maxleftover 0] + + set result [list ] + foreach line [GetPrivateProfileSection $section $opts(inifile)] { + set pos [string first "=" $line] + if {$pos >= 0} { + lappend result [string range $line 0 [expr {$pos-1}]] [string range $line [incr pos] end] + } + } + return $result +} + + +# Delete an ini file section +proc twapi::delete_inifile_section {section args} { + variable nullptr + + array set opts [parseargs args { + inifile.arg + }] + + if {[info exists opts(inifile)]} { + WritePrivateProfileString $section $nullptr $nullptr $opts(inifile) + } else { + WriteProfileString $section $nullptr $nullptr + } +} + + + diff --git a/src/punk86.vfs/lib/twapi4.7.2/base.tcl b/src/punk86.vfs/lib/twapi4.7.2/base.tcl new file mode 100644 index 00000000..b227d2c0 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/base.tcl @@ -0,0 +1,1873 @@ +# +# Copyright (c) 2012-2014, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# Commands in twapi_base module + +namespace eval twapi { + # Map of Sid integer type to Sid type name + array set sid_type_names { + 1 user + 2 group + 3 domain + 4 alias + 5 wellknowngroup + 6 deletedaccount + 7 invalid + 8 unknown + 9 computer + 10 label + 11 logonsession + } + + # Cache mapping account names to SIDs. Dict keyed by system and name + variable _name_to_sid_cache {} + + # Cache mapping SIDs to account names. Dict keyed by system and SID + variable _sid_to_name_cache {} + + # Dictionary of FFI libraries to handles and back + variable _ffi_paths {} + variable _ffi_handles {} +} + + + +# Return major minor servicepack as a quad list +proc twapi::get_os_version {} { + array set verinfo [GetVersionEx] + return [list $verinfo(dwMajorVersion) $verinfo(dwMinorVersion) \ + $verinfo(wServicePackMajor) $verinfo(wServicePackMinor)] +} + +# Returns true if the OS version is at least $major.$minor.$sp +proc twapi::min_os_version {major {minor 0} {spmajor 0} {spminor 0}} { + lassign [twapi::get_os_version] osmajor osminor osspmajor osspminor + + if {$osmajor > $major} {return 1} + if {$osmajor < $major} {return 0} + if {$osminor > $minor} {return 1} + if {$osminor < $minor} {return 0} + if {$osspmajor > $spmajor} {return 1} + if {$osspmajor < $spmajor} {return 0} + if {$osspminor > $spminor} {return 1} + if {$osspminor < $spminor} {return 0} + + # Same version, ok + return 1 +} + +# Convert a LARGE_INTEGER time value (100ns since 1601) to a formatted date +# time +interp alias {} twapi::large_system_time_to_secs {} twapi::large_system_time_to_secs_since_1970 +proc twapi::large_system_time_to_secs_since_1970 {ns100 {fraction false}} { + # No. 100ns units between 1601 to 1970 = 116444736000000000 + set ns100_since_1970 [expr {$ns100-116444736000000000}] + + set secs_since_1970 [expr {$ns100_since_1970/10000000}] + if {$fraction} { + append secs_since_1970 .[string range $ns100 end-6 end] + } + return $secs_since_1970 +} + +proc twapi::secs_since_1970_to_large_system_time {secs} { + # No. 100ns units between 1601 to 1970 = 116444736000000000 + return [expr {($secs * 10000000) + 116444736000000000}] +} + +# Map a Windows error code to a string +proc twapi::map_windows_error {code} { + # Trim trailing CR/LF + return [string trimright [twapi::Twapi_MapWindowsErrorToString $code] "\r\n"] +} + +# Load given library +proc twapi::load_library {path args} { + array set opts [parseargs args { + dontresolverefs + datafile + alteredpath + }] + + set flags 0 + if {$opts(dontresolverefs)} { + setbits flags 1; # DONT_RESOLVE_DLL_REFERENCES + } + if {$opts(datafile)} { + setbits flags 2; # LOAD_LIBRARY_AS_DATAFILE + } + if {$opts(alteredpath)} { + setbits flags 8; # LOAD_WITH_ALTERED_SEARCH_PATH + } + + # LoadLibrary always wants backslashes + set path [file nativename $path] + return [LoadLibraryEx $path $flags] +} + +# Free library opened with load_library +proc twapi::free_library {libh} { + FreeLibrary $libh +} + +# Format message string - will raise exception if insufficient number +# of arguments +proc twapi::_unsafe_format_message {args} { + array set opts [parseargs args { + module.arg + fmtstring.arg + messageid.arg + langid.arg + params.arg + includesystem + ignoreinserts + width.int + } -nulldefault -maxleftover 0] + + set flags 0 + + if {$opts(module) == ""} { + if {$opts(fmtstring) == ""} { + # If neither -module nor -fmtstring specified, message is formatted + # from the system + set opts(module) NULL + setbits flags 0x1000; # FORMAT_MESSAGE_FROM_SYSTEM + } else { + setbits flags 0x400; # FORMAT_MESSAGE_FROM_STRING + if {$opts(includesystem) || $opts(messageid) != "" || $opts(langid) != ""} { + error "Options -includesystem, -messageid and -langid cannot be used with -fmtstring" + } + } + } else { + if {$opts(fmtstring) != ""} { + error "Options -fmtstring and -module cannot be used together" + } + setbits flags 0x800; # FORMAT_MESSAGE_FROM_HMODULE + if {$opts(includesystem)} { + # Also include system in search + setbits flags 0x1000; # FORMAT_MESSAGE_FROM_SYSTEM + } + } + + if {$opts(ignoreinserts)} { + setbits flags 0x200; # FORMAT_MESSAGE_IGNORE_INSERTS + } + + if {$opts(width) > 254} { + error "Invalid value for option -width. Must be -1, 0, or a positive integer less than 255" + } + if {$opts(width) < 0} { + # Negative width means no width restrictions + set opts(width) 255; # 255 -> no restrictions + } + incr flags $opts(width); # Width goes in low byte of flags + + if {$opts(fmtstring) != ""} { + return [FormatMessageFromString $flags $opts(fmtstring) $opts(params)] + } else { + if {![string is integer -strict $opts(messageid)]} { + error "Unspecified or invalid value for -messageid option. Must be an integer value" + } + if {$opts(langid) == ""} { set opts(langid) 0 } + if {![string is integer -strict $opts(langid)]} { + error "Unspecfied or invalid value for -langid option. Must be an integer value" + } + + # Check if $opts(module) is a file or module handle (pointer) + if {[pointer? $opts(module)]} { + return [FormatMessageFromModule $flags $opts(module) \ + $opts(messageid) $opts(langid) $opts(params)] + } else { + set hmod [load_library $opts(module) -datafile] + trap { + set message [FormatMessageFromModule $flags $hmod \ + $opts(messageid) $opts(langid) $opts(params)] + } finally { + free_library $hmod + } + return $message + } + } +} + +# Format message string +proc twapi::format_message {args} { + array set opts [parseargs args { + params.arg + fmtstring.arg + width.int + ignoreinserts + } -ignoreunknown] + + # TBD - document - if no params specified, different from params = {} + + # If a format string is specified, other options do not matter + # except for -width. In that case, we do not call FormatMessage + # at all + if {[info exists opts(fmtstring)]} { + # If -width specifed, call FormatMessage + if {[info exists opts(width)] && $opts(width)} { + set msg [_unsafe_format_message -ignoreinserts -fmtstring $opts(fmtstring) -width $opts(width) {*}$args] + } else { + set msg $opts(fmtstring) + } + } else { + # Not -fmtstring, retrieve from message file + if {[info exists opts(width)]} { + set msg [_unsafe_format_message -ignoreinserts -width $opts(width) {*}$args] + } else { + set msg [_unsafe_format_message -ignoreinserts {*}$args] + } + } + + # If we are told to ignore inserts, all done. Else replace them except + # that if no param list, do not replace placeholder. This is NOT + # the same as empty param list + if {$opts(ignoreinserts) || ![info exists opts(params)]} { + return $msg + } + + # TBD - cache fmtstring -> indices for performance + set placeholder_indices [regexp -indices -all -inline {%(?:.|(?:[1-9][0-9]?(?:![^!]+!)?))} $msg] + + if {[llength $placeholder_indices] == 0} { + # No placeholders. + return $msg + } + + # Use of * in format specifiers will change where the actual parameters + # are positioned + set num_asterisks 0 + set msg2 "" + set prev_end 0 + foreach placeholder $placeholder_indices { + lassign $placeholder start end + # Append the stuff between previous placeholder and this one + append msg2 [string range $msg $prev_end [expr {$start-1}]] + set spec [string range $msg $start+1 $end] + switch -exact -- [string index $spec 0] { + % { append msg2 % } + r { append msg2 \r } + n { append msg2 \n } + t { append msg2 \t } + 0 { + # No-op - %0 means to not add trailing newline + } + default { + if {! [string is integer -strict [string index $spec 0]]} { + # Not a insert parameter. Just append the character + append msg2 $spec + } else { + # Insert parameter + set fmt "" + scan $spec %d%s param_index fmt + # Note params are numbered starting with 1 + incr param_index -1 + # Format spec, if present, is enclosed in !. Get rid of them + set fmt [string trim $fmt "!"] + if {$fmt eq ""} { + # No fmt spec + } else { + # Since everything is a string in Tcl, we happily + # do not have to worry about type. However, the + # format spec could have * specifiers which will + # change the parameter indexing for subsequent + # arguments + incr num_asterisks [expr {[llength [split $fmt *]]-1}] + incr param_index $num_asterisks + } + # TBD - we ignore the actual format type + append msg2 [lindex $opts(params) $param_index] + } + } + } + set prev_end [incr end] + } + append msg2 [string range $msg $prev_end end] + return $msg2 +} + +# Revert to process token. In base package because used across many modules +proc twapi::revert_to_self {{opt ""}} { + RevertToSelf +} + +# For backward compatibility +interp alias {} twapi::expand_environment_strings {} twapi::expand_environment_vars + +proc twapi::_init_security_defs {} { + variable security_defs + + # NOTE : the access definitions for those types that are included here + # have been updated as of Windows 8. + array set security_defs { + + TOKEN_ASSIGN_PRIMARY 0x00000001 + TOKEN_DUPLICATE 0x00000002 + TOKEN_IMPERSONATE 0x00000004 + TOKEN_QUERY 0x00000008 + TOKEN_QUERY_SOURCE 0x00000010 + TOKEN_ADJUST_PRIVILEGES 0x00000020 + TOKEN_ADJUST_GROUPS 0x00000040 + TOKEN_ADJUST_DEFAULT 0x00000080 + TOKEN_ADJUST_SESSIONID 0x00000100 + + TOKEN_ALL_ACCESS_WINNT 0x000F00FF + TOKEN_ALL_ACCESS_WIN2K 0x000F01FF + TOKEN_ALL_ACCESS 0x000F01FF + TOKEN_READ 0x00020008 + TOKEN_WRITE 0x000200E0 + TOKEN_EXECUTE 0x00020000 + + SYSTEM_MANDATORY_LABEL_NO_WRITE_UP 0x1 + SYSTEM_MANDATORY_LABEL_NO_READ_UP 0x2 + SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP 0x4 + + ACL_REVISION 2 + ACL_REVISION_DS 4 + + ACCESS_MAX_MS_V2_ACE_TYPE 0x3 + ACCESS_MAX_MS_V3_ACE_TYPE 0x4 + ACCESS_MAX_MS_V4_ACE_TYPE 0x8 + ACCESS_MAX_MS_V5_ACE_TYPE 0x11 + + STANDARD_RIGHTS_REQUIRED 0x000F0000 + STANDARD_RIGHTS_READ 0x00020000 + STANDARD_RIGHTS_WRITE 0x00020000 + STANDARD_RIGHTS_EXECUTE 0x00020000 + STANDARD_RIGHTS_ALL 0x001F0000 + SPECIFIC_RIGHTS_ALL 0x0000FFFF + + GENERIC_READ 0x80000000 + GENERIC_WRITE 0x40000000 + GENERIC_EXECUTE 0x20000000 + GENERIC_ALL 0x10000000 + + SERVICE_QUERY_CONFIG 0x00000001 + SERVICE_CHANGE_CONFIG 0x00000002 + SERVICE_QUERY_STATUS 0x00000004 + SERVICE_ENUMERATE_DEPENDENTS 0x00000008 + SERVICE_START 0x00000010 + SERVICE_STOP 0x00000020 + SERVICE_PAUSE_CONTINUE 0x00000040 + SERVICE_INTERROGATE 0x00000080 + SERVICE_USER_DEFINED_CONTROL 0x00000100 + SERVICE_ALL_ACCESS 0x000F01FF + + SC_MANAGER_CONNECT 0x00000001 + SC_MANAGER_CREATE_SERVICE 0x00000002 + SC_MANAGER_ENUMERATE_SERVICE 0x00000004 + SC_MANAGER_LOCK 0x00000008 + SC_MANAGER_QUERY_LOCK_STATUS 0x00000010 + SC_MANAGER_MODIFY_BOOT_CONFIG 0x00000020 + SC_MANAGER_ALL_ACCESS 0x000F003F + + KEY_QUERY_VALUE 0x00000001 + KEY_SET_VALUE 0x00000002 + KEY_CREATE_SUB_KEY 0x00000004 + KEY_ENUMERATE_SUB_KEYS 0x00000008 + KEY_NOTIFY 0x00000010 + KEY_CREATE_LINK 0x00000020 + KEY_WOW64_32KEY 0x00000200 + KEY_WOW64_64KEY 0x00000100 + KEY_WOW64_RES 0x00000300 + KEY_READ 0x00020019 + KEY_WRITE 0x00020006 + KEY_EXECUTE 0x00020019 + KEY_ALL_ACCESS 0x000F003F + + POLICY_VIEW_LOCAL_INFORMATION 0x00000001 + POLICY_VIEW_AUDIT_INFORMATION 0x00000002 + POLICY_GET_PRIVATE_INFORMATION 0x00000004 + POLICY_TRUST_ADMIN 0x00000008 + POLICY_CREATE_ACCOUNT 0x00000010 + POLICY_CREATE_SECRET 0x00000020 + POLICY_CREATE_PRIVILEGE 0x00000040 + POLICY_SET_DEFAULT_QUOTA_LIMITS 0x00000080 + POLICY_SET_AUDIT_REQUIREMENTS 0x00000100 + POLICY_AUDIT_LOG_ADMIN 0x00000200 + POLICY_SERVER_ADMIN 0x00000400 + POLICY_LOOKUP_NAMES 0x00000800 + POLICY_NOTIFICATION 0x00001000 + POLICY_READ 0X00020006 + POLICY_WRITE 0X000207F8 + POLICY_EXECUTE 0X00020801 + POLICY_ALL_ACCESS 0X000F0FFF + + DESKTOP_READOBJECTS 0x0001 + DESKTOP_CREATEWINDOW 0x0002 + DESKTOP_CREATEMENU 0x0004 + DESKTOP_HOOKCONTROL 0x0008 + DESKTOP_JOURNALRECORD 0x0010 + DESKTOP_JOURNALPLAYBACK 0x0020 + DESKTOP_ENUMERATE 0x0040 + DESKTOP_WRITEOBJECTS 0x0080 + DESKTOP_SWITCHDESKTOP 0x0100 + + WINSTA_ENUMDESKTOPS 0x0001 + WINSTA_READATTRIBUTES 0x0002 + WINSTA_ACCESSCLIPBOARD 0x0004 + WINSTA_CREATEDESKTOP 0x0008 + WINSTA_WRITEATTRIBUTES 0x0010 + WINSTA_ACCESSGLOBALATOMS 0x0020 + WINSTA_EXITWINDOWS 0x0040 + WINSTA_ENUMERATE 0x0100 + WINSTA_READSCREEN 0x0200 + WINSTA_ALL_ACCESS 0x37f + + PROCESS_TERMINATE 0x0001 + PROCESS_CREATE_THREAD 0x0002 + PROCESS_SET_SESSIONID 0x0004 + PROCESS_VM_OPERATION 0x0008 + PROCESS_VM_READ 0x0010 + PROCESS_VM_WRITE 0x0020 + PROCESS_DUP_HANDLE 0x0040 + PROCESS_CREATE_PROCESS 0x0080 + PROCESS_SET_QUOTA 0x0100 + PROCESS_SET_INFORMATION 0x0200 + PROCESS_QUERY_INFORMATION 0x0400 + PROCESS_SUSPEND_RESUME 0x0800 + + THREAD_TERMINATE 0x00000001 + THREAD_SUSPEND_RESUME 0x00000002 + THREAD_GET_CONTEXT 0x00000008 + THREAD_SET_CONTEXT 0x00000010 + THREAD_SET_INFORMATION 0x00000020 + THREAD_QUERY_INFORMATION 0x00000040 + THREAD_SET_THREAD_TOKEN 0x00000080 + THREAD_IMPERSONATE 0x00000100 + THREAD_DIRECT_IMPERSONATION 0x00000200 + THREAD_SET_LIMITED_INFORMATION 0x00000400 + THREAD_QUERY_LIMITED_INFORMATION 0x00000800 + + EVENT_MODIFY_STATE 0x00000002 + EVENT_ALL_ACCESS 0x001F0003 + + SEMAPHORE_MODIFY_STATE 0x00000002 + SEMAPHORE_ALL_ACCESS 0x001F0003 + + MUTANT_QUERY_STATE 0x00000001 + MUTANT_ALL_ACCESS 0x001F0001 + + MUTEX_MODIFY_STATE 0x00000001 + MUTEX_ALL_ACCESS 0x001F0001 + + TIMER_QUERY_STATE 0x00000001 + TIMER_MODIFY_STATE 0x00000002 + TIMER_ALL_ACCESS 0x001F0003 + + FILE_READ_DATA 0x00000001 + FILE_LIST_DIRECTORY 0x00000001 + FILE_WRITE_DATA 0x00000002 + FILE_ADD_FILE 0x00000002 + FILE_APPEND_DATA 0x00000004 + FILE_ADD_SUBDIRECTORY 0x00000004 + FILE_CREATE_PIPE_INSTANCE 0x00000004 + FILE_READ_EA 0x00000008 + FILE_WRITE_EA 0x00000010 + FILE_EXECUTE 0x00000020 + FILE_TRAVERSE 0x00000020 + FILE_DELETE_CHILD 0x00000040 + FILE_READ_ATTRIBUTES 0x00000080 + FILE_WRITE_ATTRIBUTES 0x00000100 + + FILE_ALL_ACCESS 0x001F01FF + FILE_GENERIC_READ 0x00120089 + FILE_GENERIC_WRITE 0x00120116 + FILE_GENERIC_EXECUTE 0x001200A0 + + DELETE 0x00010000 + READ_CONTROL 0x00020000 + WRITE_DAC 0x00040000 + WRITE_OWNER 0x00080000 + SYNCHRONIZE 0x00100000 + + MAXIMUM_ALLOWED 0x02000000 + + COM_RIGHTS_EXECUTE 1 + COM_RIGHTS_EXECUTE_LOCAL 2 + COM_RIGHTS_EXECUTE_REMOTE 4 + COM_RIGHTS_ACTIVATE_LOCAL 8 + COM_RIGHTS_ACTIVATE_REMOTE 16 + } + + if {[min_os_version 6]} { + array set security_defs { + PROCESS_QUERY_LIMITED_INFORMATION 0x00001000 + PROCESS_ALL_ACCESS 0x001fffff + THREAD_ALL_ACCESS 0x001fffff + } + } else { + array set security_defs { + PROCESS_ALL_ACCESS 0x001f0fff + THREAD_ALL_ACCESS 0x001f03ff + } + } + + # Make next call a no-op + proc _init_security_defs {} {} +} + +# Map a set of access right symbols to a flag. Concatenates +# all the arguments, and then OR's the individual elements. Each +# element may either be a integer or one of the access rights +proc twapi::_access_rights_to_mask {args} { + _init_security_defs + + proc _access_rights_to_mask args { + variable security_defs + set rights 0 + foreach right [concat {*}$args] { + # The mandatory label access rights are not in security_defs + # because we do not want them to mess up the int->name mapping + # for DACL's + set right [dict* { + no_write_up 1 + system_mandatory_label_no_write_up 1 + no_read_up 2 + system_mandatory_label_no_read_up 2 + no_execute_up 4 + system_mandatory_label_no_execute_up 4 + } $right] + if {![string is integer $right]} { + if {[catch {set right $security_defs([string toupper $right])}]} { + error "Invalid access right symbol '$right'" + } + } + set rights [expr {$rights | $right}] + } + return $rights + } + return [_access_rights_to_mask {*}$args] +} + + +# Map an access mask to a set of rights +proc twapi::_access_mask_to_rights {access_mask {type ""}} { + _init_security_defs + + proc _access_mask_to_rights {access_mask {type ""}} { + variable security_defs + + set rights [list ] + + if {$type eq "mandatory_label"} { + if {$access_mask & 1} { + lappend rights system_mandatory_label_no_write_up + } + if {$access_mask & 2} { + lappend rights system_mandatory_label_no_read_up + } + if {$access_mask & 4} { + lappend rights system_mandatory_label_no_execute_up + } + return $rights + } + + # The returned list will include rights that map to multiple bits + # as well as the individual bits. We first add the multiple bits + # and then the individual bits (since we clear individual bits + # after adding) + + # + # Check standard multiple bit masks + # + foreach x {STANDARD_RIGHTS_REQUIRED STANDARD_RIGHTS_READ STANDARD_RIGHTS_WRITE STANDARD_RIGHTS_EXECUTE STANDARD_RIGHTS_ALL SPECIFIC_RIGHTS_ALL} { + if {($security_defs($x) & $access_mask) == $security_defs($x)} { + lappend rights [string tolower $x] + } + } + + # + # Check type specific multiple bit masks. + # + + set type_mask_map { + file {FILE_ALL_ACCESS FILE_GENERIC_READ FILE_GENERIC_WRITE FILE_GENERIC_EXECUTE} + process {PROCESS_ALL_ACCESS} + pipe {FILE_ALL_ACCESS} + policy {POLICY_READ POLICY_WRITE POLICY_EXECUTE POLICY_ALL_ACCESS} + registry {KEY_READ KEY_WRITE KEY_EXECUTE KEY_ALL_ACCESS} + service {SERVICE_ALL_ACCESS} + thread {THREAD_ALL_ACCESS} + token {TOKEN_READ TOKEN_WRITE TOKEN_EXECUTE TOKEN_ALL_ACCESS} + desktop {} + winsta {WINSTA_ALL_ACCESS} + } + if {[dict exists $type_mask_map $type]} { + foreach x [dict get $type_mask_map $type] { + if {($security_defs($x) & $access_mask) == $security_defs($x)} { + lappend rights [string tolower $x] + } + } + } + + # + # OK, now map individual bits + + # First map the common bits + foreach x {DELETE READ_CONTROL WRITE_DAC WRITE_OWNER SYNCHRONIZE} { + if {$security_defs($x) & $access_mask} { + lappend rights [string tolower $x] + resetbits access_mask $security_defs($x) + } + } + + # Then the generic bits + foreach x {GENERIC_READ GENERIC_WRITE GENERIC_EXECUTE GENERIC_ALL} { + if {$security_defs($x) & $access_mask} { + lappend rights [string tolower $x] + resetbits access_mask $security_defs($x) + } + } + + # Then the type specific + set type_mask_map { + file { FILE_READ_DATA FILE_WRITE_DATA FILE_APPEND_DATA + FILE_READ_EA FILE_WRITE_EA FILE_EXECUTE + FILE_DELETE_CHILD FILE_READ_ATTRIBUTES + FILE_WRITE_ATTRIBUTES } + pipe { FILE_READ_DATA FILE_WRITE_DATA FILE_CREATE_PIPE_INSTANCE + FILE_READ_ATTRIBUTES FILE_WRITE_ATTRIBUTES } + service { SERVICE_QUERY_CONFIG SERVICE_CHANGE_CONFIG + SERVICE_QUERY_STATUS SERVICE_ENUMERATE_DEPENDENTS + SERVICE_START SERVICE_STOP SERVICE_PAUSE_CONTINUE + SERVICE_INTERROGATE SERVICE_USER_DEFINED_CONTROL } + registry { KEY_QUERY_VALUE KEY_SET_VALUE KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS KEY_NOTIFY KEY_CREATE_LINK + KEY_WOW64_32KEY KEY_WOW64_64KEY KEY_WOW64_RES } + policy { POLICY_VIEW_LOCAL_INFORMATION POLICY_VIEW_AUDIT_INFORMATION + POLICY_GET_PRIVATE_INFORMATION POLICY_TRUST_ADMIN + POLICY_CREATE_ACCOUNT POLICY_CREATE_SECRET + POLICY_CREATE_PRIVILEGE POLICY_SET_DEFAULT_QUOTA_LIMITS + POLICY_SET_AUDIT_REQUIREMENTS POLICY_AUDIT_LOG_ADMIN + POLICY_SERVER_ADMIN POLICY_LOOKUP_NAMES } + process { PROCESS_TERMINATE PROCESS_CREATE_THREAD + PROCESS_SET_SESSIONID PROCESS_VM_OPERATION + PROCESS_VM_READ PROCESS_VM_WRITE PROCESS_DUP_HANDLE + PROCESS_CREATE_PROCESS PROCESS_SET_QUOTA + PROCESS_SET_INFORMATION PROCESS_QUERY_INFORMATION + PROCESS_SUSPEND_RESUME} + thread { THREAD_TERMINATE THREAD_SUSPEND_RESUME + THREAD_GET_CONTEXT THREAD_SET_CONTEXT + THREAD_SET_INFORMATION THREAD_QUERY_INFORMATION + THREAD_SET_THREAD_TOKEN THREAD_IMPERSONATE + THREAD_DIRECT_IMPERSONATION + THREAD_SET_LIMITED_INFORMATION + THREAD_QUERY_LIMITED_INFORMATION } + token { TOKEN_ASSIGN_PRIMARY TOKEN_DUPLICATE TOKEN_IMPERSONATE + TOKEN_QUERY TOKEN_QUERY_SOURCE TOKEN_ADJUST_PRIVILEGES + TOKEN_ADJUST_GROUPS TOKEN_ADJUST_DEFAULT TOKEN_ADJUST_SESSIONID } + desktop { DESKTOP_READOBJECTS DESKTOP_CREATEWINDOW + DESKTOP_CREATEMENU DESKTOP_HOOKCONTROL + DESKTOP_JOURNALRECORD DESKTOP_JOURNALPLAYBACK + DESKTOP_ENUMERATE DESKTOP_WRITEOBJECTS DESKTOP_SWITCHDESKTOP } + windowstation { WINSTA_ENUMDESKTOPS WINSTA_READATTRIBUTES + WINSTA_ACCESSCLIPBOARD WINSTA_CREATEDESKTOP + WINSTA_WRITEATTRIBUTES WINSTA_ACCESSGLOBALATOMS + WINSTA_EXITWINDOWS WINSTA_ENUMERATE WINSTA_READSCREEN } + winsta { WINSTA_ENUMDESKTOPS WINSTA_READATTRIBUTES + WINSTA_ACCESSCLIPBOARD WINSTA_CREATEDESKTOP + WINSTA_WRITEATTRIBUTES WINSTA_ACCESSGLOBALATOMS + WINSTA_EXITWINDOWS WINSTA_ENUMERATE WINSTA_READSCREEN } + com { COM_RIGHTS_EXECUTE COM_RIGHTS_EXECUTE_LOCAL + COM_RIGHTS_EXECUTE_REMOTE COM_RIGHTS_ACTIVATE_LOCAL + COM_RIGHTS_ACTIVATE_REMOTE + } + } + + if {[min_os_version 6]} { + dict lappend type_mask_map process PROCESS_QUERY_LIMITED_INFORMATION + } + + if {[dict exists $type_mask_map $type]} { + foreach x [dict get $type_mask_map $type] { + if {$security_defs($x) & $access_mask} { + lappend rights [string tolower $x] + # Reset the bit so is it not included in unknown bits below + resetbits access_mask $security_defs($x) + } + } + } + + # Finally add left over bits if any + for {set i 0} {$i < 32} {incr i} { + set x [expr {1 << $i}] + if {$access_mask & $x} { + lappend rights [hex32 $x] + } + } + + return $rights + } + + return [_access_mask_to_rights $access_mask $type] +} + +# Map the symbolic CreateDisposition parameter of CreateFile to integer values +proc twapi::_create_disposition_to_code {sym} { + if {[string is integer -strict $sym]} { + return $sym + } + # CREATE_NEW 1 + # CREATE_ALWAYS 2 + # OPEN_EXISTING 3 + # OPEN_ALWAYS 4 + # TRUNCATE_EXISTING 5 + return [dict get { + create_new 1 + create_always 2 + open_existing 3 + open_always 4 + truncate_existing 5} $sym] +} + +# Wrapper around CreateFile +proc twapi::create_file {path args} { + array set opts [parseargs args { + {access.arg {generic_read}} + {share.arg {read write delete}} + {inherit.bool 0} + {secd.arg ""} + {createdisposition.arg open_always} + {flags.int 0} + {templatefile.arg NULL} + } -maxleftover 0] + + set access_mode [_access_rights_to_mask $opts(access)] + set share_mode [_share_mode_to_mask $opts(share)] + set create_disposition [_create_disposition_to_code $opts(createdisposition)] + return [CreateFile $path \ + $access_mode \ + $share_mode \ + [_make_secattr $opts(secd) $opts(inherit)] \ + $create_disposition \ + $opts(flags) \ + $opts(templatefile)] +} + +# Map a set of share mode symbols to a flag. Concatenates +# all the arguments, and then OR's the individual elements. Each +# element may either be a integer or one of the share modes +proc twapi::_share_mode_to_mask {modelist} { + # Values correspond to FILE_SHARE_* defines + return [_parse_symbolic_bitmask $modelist {read 1 write 2 delete 4}] +} + +# Construct a security attributes structure out of a security descriptor +# and inheritance. The command is here because we do not want to +# have to load the twapi_security package for the common case of +# null security attributes. +proc twapi::_make_secattr {secd inherit} { + if {$inherit} { + set sec_attr [list $secd 1] + } else { + if {[llength $secd] == 0} { + # If a security descriptor not specified, keep + # all security attributes as an empty list (ie. NULL) + set sec_attr [list ] + } else { + set sec_attr [list $secd 0] + } + } + return $sec_attr +} + +# Returns the sid, domain and type for an account +proc twapi::lookup_account_name {name args} { + variable _name_to_sid_cache + + # Fast path - no options specified and cached + if {[llength $args] == 0 && [dict exists $_name_to_sid_cache "" $name]} { + return [lindex [dict get $_name_to_sid_cache "" $name] 0] + } + + array set opts [parseargs args \ + [list all \ + sid \ + domain \ + type \ + [list system.arg ""]\ + ]] + + if {! [dict exists $_name_to_sid_cache $opts(system) $name]} { + dict set _name_to_sid_cache $opts(system) $name [LookupAccountName $opts(system) $name] + } + lassign [dict get $_name_to_sid_cache $opts(system) $name] sid domain type + + set result [list ] + if {$opts(all) || $opts(domain)} { + lappend result -domain $domain + } + if {$opts(all) || $opts(type)} { + if {[info exists twapi::sid_type_names($type)]} { + lappend result -type $twapi::sid_type_names($type) + } else { + # Could be the "logonid" dummy type we added above + lappend result -type $type + } + } + + if {$opts(all) || $opts(sid)} { + lappend result -sid $sid + } + + # If no options specified, only return the sid/name + if {[llength $result] == 0} { + return $sid + } + + return $result +} + + +# Returns the name, domain and type for an account +proc twapi::lookup_account_sid {sid args} { + variable _sid_to_name_cache + + # Fast path - no options specified and cached + if {[llength $args] == 0 && [dict exists $_sid_to_name_cache "" $sid]} { + return [lindex [dict get $_sid_to_name_cache "" $sid] 0] + } + + array set opts [parseargs args \ + [list all \ + name \ + domain \ + type \ + [list system.arg ""]\ + ]] + + if {[dict exists $_sid_to_name_cache $opts(system) $sid]} { + lassign [dict get $_sid_to_name_cache $opts(system) $sid] name domain type + } else { + # Not in cache. Need to look up + + trap { + set data [LookupAccountSid $opts(system) $sid] + lassign $data name domain type + } onerror {TWAPI_WIN32 1332} { + # Win10 resolves this, Win7 does not. Emulate Win10 + if {![string match -nocase "S-1-5-5-*" $sid]} { + rethrow + } + # Name is formed similar to how Win10 does it + set name "LogonSessionId_[string map {- _} [string range $sid 8 end]]" + set domain "NT AUTHORITY" + set type 11 + set data [list $name $domain $type] + } + dict set _sid_to_name_cache $opts(system) $sid $data + } + + + set result [list ] + if {$opts(all) || $opts(domain)} { + lappend result -domain $domain + } + if {$opts(all) || $opts(type)} { + if {[info exists twapi::sid_type_names($type)]} { + lappend result -type $twapi::sid_type_names($type) + } else { + lappend result -type $type + } + } + + if {$opts(all) || $opts(name)} { + lappend result -name $name + } + + # If no options specified, only return the sid/name + if {[llength $result] == 0} { + return $name + } + + return $result +} + +# Returns the sid for a account - may be given as a SID or name +proc twapi::map_account_to_sid {account args} { + array set opts [parseargs args {system.arg} -nulldefault] + + # Treat empty account as null SID (self) + if {[string length $account] == ""} { + return "" + } + + if {[is_valid_sid_syntax $account]} { + return $account + } else { + return [lookup_account_name $account -system $opts(system)] + } +} + + +# Returns the name for a account - may be given as a SID or name +proc twapi::map_account_to_name {account args} { + array set opts [parseargs args {system.arg} -nulldefault] + + if {[is_valid_sid_syntax $account]} { + return [lookup_account_sid $account -system $opts(system)] + } else { + # Verify whether a valid account by mapping to an sid + if {[catch {map_account_to_sid $account -system $opts(system)}]} { + # As a special case, change LocalSystem to SYSTEM. Some Windows + # API's (such as services) return LocalSystem which cannot be + # resolved by the security functions. This name is really the + # same a the built-in SYSTEM + if {$account == "LocalSystem"} { + return "SYSTEM" + } + error "Unknown account '$account'" + } + return $account + } +} + +# Return the user account for the current process +proc twapi::get_current_user {{format -samcompatible}} { + + set return_sid false + switch -exact -- $format { + -fullyqualifieddn {set format 1} + -samcompatible {set format 2} + -display {set format 3} + -uniqueid {set format 6} + -canonical {set format 7} + -userprincipal {set format 8} + -canonicalex {set format 9} + -serviceprincipal {set format 10} + -dnsdomain {set format 12} + -sid {set format 2 ; set return_sid true} + default { + error "Unknown user name format '$format'" + } + } + + set user [GetUserNameEx $format] + + if {$return_sid} { + return [map_account_to_sid $user] + } else { + return $user + } +} + +# Get a new uuid +proc twapi::new_uuid {{opt ""}} { + if {[string length $opt]} { + if {[string equal $opt "-localok"]} { + set local_ok 1 + } else { + error "Invalid or unknown argument '$opt'" + } + } else { + set local_ok 0 + } + return [UuidCreate $local_ok] +} +proc twapi::nil_uuid {} { + return [UuidCreateNil] +} + +proc twapi::new_guid {} { + return [canonicalize_guid [new_uuid]] +} + +# Get a handle to a LSA policy. TBD - document +proc twapi::get_lsa_policy_handle {args} { + array set opts [parseargs args { + {system.arg ""} + {access.arg policy_read} + } -maxleftover 0] + + set access [_access_rights_to_mask $opts(access)] + return [Twapi_LsaOpenPolicy $opts(system) $access] +} + +# Close a LSA policy handle. TBD - document +proc twapi::close_lsa_policy_handle {h} { + LsaClose $h + return +} + +# Eventlog stuff in the base package + +namespace eval twapi { + # Keep track of event log handles - values are "r" or "w" + variable eventlog_handles + array set eventlog_handles {} +} + +# Open an eventlog for reading or writing +proc twapi::eventlog_open {args} { + variable eventlog_handles + + array set opts [parseargs args { + system.arg + source.arg + file.arg + write + } -nulldefault -maxleftover 0] + if {$opts(source) == ""} { + # Source not specified + if {$opts(file) == ""} { + # No source or file specified, default to current event log + # using executable name as source + set opts(source) [file rootname [file tail [info nameofexecutable]]] + } else { + if {$opts(write)} { + error "Option -file may not be used with -write" + } + } + } else { + # Source explicitly specified + if {$opts(file) != ""} { + error "Option -file may not be used with -source" + } + } + + if {$opts(write)} { + set handle [RegisterEventSource $opts(system) $opts(source)] + set mode write + } else { + if {$opts(source) != ""} { + set handle [OpenEventLog $opts(system) $opts(source)] + } else { + set handle [OpenBackupEventLog $opts(system) $opts(file)] + } + set mode read + } + + set eventlog_handles($handle) $mode + return $handle +} + +# Close an event log opened for writing +proc twapi::eventlog_close {hevl} { + variable eventlog_handles + + if {[_eventlog_valid_handle $hevl read]} { + CloseEventLog $hevl + } else { + DeregisterEventSource $hevl + } + + unset eventlog_handles($hevl) +} + + +# Log an event +proc twapi::eventlog_write {hevl id args} { + _eventlog_valid_handle $hevl write raise + + array set opts [parseargs args { + {type.arg information {success error warning information auditsuccess auditfailure}} + {category.int 1} + loguser + params.arg + data.arg + } -nulldefault] + + + switch -exact -- $opts(type) { + success {set opts(type) 0} + error {set opts(type) 1} + warning {set opts(type) 2} + information {set opts(type) 4} + auditsuccess {set opts(type) 8} + auditfailure {set opts(type) 16} + default {error "Invalid value '$opts(type)' for option -type"} + } + + if {$opts(loguser)} { + set user [get_current_user -sid] + } else { + set user "" + } + + ReportEvent $hevl $opts(type) $opts(category) $id \ + $user $opts(params) $opts(data) +} + + +# Log a message +proc twapi::eventlog_log {message args} { + array set opts [parseargs args { + system.arg + source.arg + {type.arg information} + {category.int 0} + } -nulldefault] + + set hevl [eventlog_open -write -source $opts(source) -system $opts(system)] + + trap { + eventlog_write $hevl 1 -params [list $message] -type $opts(type) -category $opts(category) + } finally { + eventlog_close $hevl + } + return +} + +proc twapi::make_logon_identity {username password domain} { + if {[concealed? $password]} { + return [list $username $domain $password] + } else { + return [list $username $domain [conceal $password]] + } +} + +proc twapi::read_credentials {args} { + # DEPRECATED + array set opts [parseargs args { + target.arg + winerror.int + username.arg + password.arg + persist.bool + {type.sym generic {domain 0 generic 0x40000 runas 0x80000}} + {forceui.bool 0 0x80} + {showsaveoption.bool true} + {expectconfirmation.bool 0 0x20000} + } -maxleftover 0 -nulldefault] + + if {$opts(persist) && ! $opts(expectconfirmation)} { + badargs! "Option -expectconfirmation must be specified as true if -persist is true" + } + + # 0x8 -> CREDUI_FLAGS_EXCLUDE_CERTIFICATES (needed for console) + set flags [expr {0x8 | $opts(forceui) | $opts(expectconfirmation)}] + + if {$opts(persist)} { + if {! $opts(showsaveoption)} { + incr flags 0x1000; # CREDUI_FLAGS_PERSIST + } + } else { + incr flags 0x2; # CREDUI_FLAGS_DO_NOT_PERSIST + if {$opts(showsaveoption)} { + incr flags 0x40; # CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX + } + } + + incr flags $opts(type) + + return [CredUICmdLinePromptForCredentials $opts(target) NULL $opts(winerror) $opts(username) $opts(password) $opts(persist) $flags] +} + +proc twapi::credentials_dialog {args} { + # DEPRECATED + array set opts [parseargs args { + target.arg + winerror.int + username.arg + password.arg + persist.bool + {type.sym generic {domain 0 generic 0x40000 runas 0x80000}} + {forceui.bool 0 0x80} + {showsaveoption.bool true} + {expectconfirmation.bool 0 0x20000} + {fillusername.bool 0 0x800} + {filllocaladmins.bool 0 0x4} + {notifyfail.bool 0 0x1} + {passwordonly.bool 0 0x200} + {requirecertificate.bool 0 0x10} + {requiresmartcard.bool 0 0x100} + {validateusername.bool 0 0x400} + {parent.arg NULL} + message.arg + caption.arg + {bitmap.arg NULL} + } -maxleftover 0 -nulldefault] + + if {$opts(persist) && ! $opts(expectconfirmation)} { + badargs! "Option -willconfirm must be specified as true if -persist is true" + } + + set flags [expr { 0x8 | $opts(forceui) | $opts(notifyfail) | $opts(expectconfirmation) | $opts(fillusername) | $opts(filllocaladmins)}] + + if {$opts(persist)} { + if {! $opts(showsaveoption)} { + incr flags 0x1000; # CREDUI_FLAGS_PERSIST + } + } else { + incr flags 0x2; # CREDUI_FLAGS_DO_NOT_PERSIST + if {$opts(showsaveoption)} { + incr flags 0x40; # CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX + } + } + + incr flags $opts(type) + + return [CredUIPromptForCredentials [list $opts(parent) $opts(message) $opts(caption) $opts(bitmap)] $opts(target) NULL $opts(winerror) $opts(username) $opts(password) $opts(persist) $flags] +} + +proc twapi::confirm_credentials {target valid} { + # DEPRECATED + return [CredUIConfirmCredentials $target $valid] +} + + +proc twapi::_make_cred_persist_flags {persist showsave} { + # Use cases - + # (1) credentials to be persisted WITHOUT showing save option to user + # (2) credentials to be persisted AFTER showing save option to user + # (3) credentials NOT to be persisted, user not shown save option + # (4) credentials NOT to be persisted, but user shown save option + # In case (4), caller has to decide what to do with the credentials if + # user selects to save (e.g. save elsewhere) + # If credentials are to be persisted, caller MUST call cred_confirm later + + if {$persist} { + # Note CREDUI_FLAGS_EXPECT_CONFIRMATION (0x20000) must be specified + # whenever CREDUI_FLAGS_DO_NOT_PERSIST is not specified + if {$showsave} { + # (2) CREDUI_FLAGS_EXPECT_CONFIRMATION + return 0x20000 + } else { + # (1) CREDUI_FLAGS_PERSIST | CREDUI_FLAGS_EXPECT_CONFIRMATION + return 0x21000 + } + } else { + if {$showsave} { + # (4) CREDUI_FLAGS_DO_NOT_PERSIST | CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX + return 0x42 + } else { + # (3) CREDUI_FLAGS_DO_NOT_PERSIST + return 0x02 + } + } +} + +proc twapi::cred_prompt_console {target args} { + # Not documented because Windows seems to ignore on Win10 at least - + # -password, -winerror + array set opts [parseargs args { + {forceui.bool 0 0x80} + password.arg + persist.bool + {showsaveoption.bool 0} + {type.sym generic {domain 0 generic 0x40000 runas 0x80000}} + username.arg + winerror.int + } -maxleftover 0 -nulldefault] + + if {$target eq ""} { + error "Target must not be an empty string." + } + + if {$opts(forceui) && $opts(type) != 0x40000} { + error "The -forceui option can only be set if -type is \"generic\"." + } + + if {$opts(type) == 0x80000 && $opts(username) eq ""} { + # CredUIPromptForCredentials crashes + error "The -username option must not be an empty string if -type is \"runas\"." + } + + set flags [_make_cred_persist_flags $opts(persist) $opts(showsaveoption)] + + # 0x8 -> CREDUI_FLAGS_EXCLUDE_CERTIFICATES (needed for console) + set flags [expr {0x8 | $flags | $opts(type) | $opts(forceui)}] + + return [CredUICmdLinePromptForCredentials $target NULL $opts(winerror) $opts(username) $opts(password) $opts(persist) $flags] +} + +proc twapi::cred_prompt_gui {target args} { + # Not documented because Windows seems to ignore on Win10 at least - + # -passwordonly, -notifyfail, -winerror + array set opts [parseargs args { + {bitmap.arg NULL} + caption.arg + {excludecertificates.bool 0 0x8} + {filllocaladmins.bool 0 0x4} + {completeusername.bool 0 0x800} + {forceui.bool 0 0x80} + {keepusername.bool 0 0x100000} + message.arg + {notifyfail.bool 0 0x1} + {parent.arg NULL} + password.arg + {passwordonly.bool 0 0x200} + persist.bool + {requirecertificate.bool 0 0x10} + {requiresmartcard.bool 0 0x100} + {showsaveoption.bool 0} + {type.sym generic {domain 0 generic 0x40000 runas 0x80000}} + username.arg + {validateusername.bool 0 0x400} + winerror.int + } -maxleftover 0 -nulldefault] + + if {$target eq ""} { + error "Target must not be an empty string." + } + + if {$opts(forceui) && $opts(type) != 0x40000} { + error "The -forceui option can only be set if -type is \"generic\"." + } + + if {$opts(type) == 0x80000 && $opts(username) eq ""} { + # CredUIPromptForCredentials crashes + error "The -username option must not be an empty string if -type is \"runas\"." + } + + set flags [_make_cred_persist_flags $opts(persist) $opts(showsaveoption)] + set flags [expr { + $flags | + $opts(excludecertificates) | + $opts(filllocaladmins) | + $opts(completeusername) | + $opts(forceui) | + $opts(keepusername) | + $opts(notifyfail) | + $opts(passwordonly) | + $opts(requirecertificate) | + $opts(requiresmartcard) | + $opts(type) | + $opts(validateusername) + }] + + return [CredUIPromptForCredentials [list $opts(parent) $opts(message) $opts(caption) $opts(bitmap)] $target NULL $opts(winerror) $opts(username) $opts(password) $opts(persist) $flags] +} + +proc twapi::cred_confirm {target valid} { + return [CredUIConfirmCredentials $target $valid] +} + +# Validate a handle for a mode. Always raises error if handle is invalid +# If handle valid but not for that mode, will raise error iff $raise_error +# is non-empty. Returns 1 if valid, 0 otherwise +proc twapi::_eventlog_valid_handle {hevl mode {raise_error ""}} { + variable eventlog_handles + if {![info exists eventlog_handles($hevl)]} { + error "Invalid event log handle '$hevl'" + } + + if {[string compare $eventlog_handles($hevl) $mode]} { + if {$raise_error != ""} { + error "Eventlog handle '$hevl' not valid for $mode" + } + return 0 + } else { + return 1 + } +} + +### Common disk related + +# Map bit mask to list of drive letters +proc twapi::_drivemask_to_drivelist {drivebits} { + set drives [list ] + set i 0 + foreach drive {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z} { + if {$drivebits == 0} break + set drivemask [expr {1 << $i}] + if {[expr {$drivebits & $drivemask}]} { + lappend drives $drive: + set drivebits [expr {$drivebits & ~ $drivemask}] + } + incr i + } + return $drives +} + +### Type casts +proc twapi::tclcast {type val} { + # Only permit these because wideInt, for example, cannot be reliably + # converted -> it can return an int instead. + set types {"" empty null bstr int boolean double string list dict} + if {$type ni $types} { + badargs! "Bad cast to \"$type\". Must be one of: $types" + } + return [Twapi_InternalCast $type $val] +} + +if {[info commands ::lmap] eq "::lmap"} { + proc twapi::safearray {type l} { + set type [dict! { + variant "" + boolean boolean + bool boolean + int int + i4 int + double double + r8 double + string string + bstr string + } $type] + return [lmap val $l {tclcast $type $val}] + } +} else { + proc twapi::safearray {type l} { + set type [dict! { + variant "" + boolean boolean + bool boolean + int int + i4 int + double double + r8 double + string string + bstr string + } $type] + set l2 {} + foreach val $l { + lappend l2 [tclcast $type $val] + } + return $l2 + } +} + +namespace eval twapi::recordarray {} + +proc twapi::recordarray::size {ra} { + return [llength [lindex $ra 1]] +} + +proc twapi::recordarray::fields {ra} { + return [lindex $ra 0] +} + +proc twapi::recordarray::index {ra row args} { + set r [lindex $ra 1 $row] + if {[llength $r] == 0} { + return $r + } + ::twapi::parseargs args { + {format.arg list {list dict}} + slice.arg + } -setvars -maxleftover 0 + + set fields [lindex $ra 0] + if {[info exists slice]} { + set new_fields {} + set new_r {} + foreach field $slice { + set i [twapi::enum $fields $field] + lappend new_r [lindex $r $i] + lappend new_fields [lindex $fields $i] + } + set r $new_r + set fields $new_fields + } + + if {$format eq "list"} { + return $r + } else { + return [::twapi::twine $fields $r] + } +} + +proc twapi::recordarray::range {ra low high} { + return [list [lindex $ra 0] [lrange [lindex $ra 1] $low $high]] +} + +proc twapi::recordarray::column {ra field args} { + # TBD - time to see if a script loop would be faster + ::twapi::parseargs args { + filter.arg + } -nulldefault -maxleftover 0 -setvars + _recordarray -slice [list $field] -filter $filter -format flat $ra +} + +proc twapi::recordarray::cell {ra row field} { + return [lindex [lindex $ra 1 $row] [twapi::enum [lindex $ra 0] $field]] +} + +proc twapi::recordarray::get {ra args} { + ::twapi::parseargs args { + {format.arg list {list dict flat}} + key.arg + } -ignoreunknown -setvars + + # format & key are options just to stop them flowing down to _recordarray + # We do not pass it in + + return [_recordarray {*}$args $ra] +} + +proc twapi::recordarray::getlist {ra args} { + # key is an option just to stop in flowing down to _recordarray + # We do not pass it in + + if {[llength $args] == 0} { + return [lindex $ra 1] + } + + ::twapi::parseargs args { + {format.arg list {list dict flat}} + key.arg + } -ignoreunknown -setvars + + + return [_recordarray {*}$args -format $format $ra] +} + +proc twapi::recordarray::getdict {ra args} { + ::twapi::parseargs args { + {format.arg list {list dict}} + key.arg + } -ignoreunknown -setvars + + if {![info exists key]} { + set key [lindex $ra 0 0] + } + + # Note _recordarray has different (putting it politely) semantics + # of how -format and -key option are handled so the below might + # look a bit strange in that we pass -format as list and get + # back a dict + return [_recordarray {*}$args -format $format -key $key $ra] +} + +proc twapi::recordarray::iterate {arrayvarname ra args} { + + if {[llength $args] == 0} { + badargs! "No script supplied" + } + + set body [lindex $args end] + set args [lrange $args 0 end-1] + + upvar 1 $arrayvarname var + + # TBD - Can this be optimized by prepending a ::foreach to body + # and executing that in uplevel 1 ? + + foreach rec [getlist $ra {*}$args -format dict] { + array set var $rec + set code [catch {uplevel 1 $body} result] + switch -exact -- $code { + 0 {} + 1 { + return -errorinfo $::errorInfo -errorcode $::errorCode -code error $result + } + 3 { + return; # break + } + 4 { + # continue + } + default { + return -code $code $result + } + } + } + return +} + +proc twapi::recordarray::rename {ra renames} { + set new_fields {} + foreach field [lindex $ra 0] { + if {[dict exists $renames $field]} { + lappend new_fields [dict get $renames $field] + } else { + lappend new_fields $field + } + } + return [list $new_fields [lindex $ra 1]] +} + +proc twapi::recordarray::concat {args} { + if {[llength $args] == 0} { + return {} + } + set args [lassign $args ra] + set fields [lindex $ra 0] + set values [list [lindex $ra 1]] + set width [llength $fields] + foreach ra $args { + foreach fld1 $fields fld2 [lindex $ra 0] { + if {$fld1 ne $fld2} { + twapi::badargs! "Attempt to concat record arrays with different fields ([join $fields ,] versus [join [lindex $ra 0] ,])" + } + } + lappend values [lindex $ra 1] + } + + return [list $fields [::twapi::lconcat {*}$values]] +} + +namespace eval twapi::recordarray { + namespace export cell column concat fields get getdict getlist index iterate range rename size + namespace ensemble create +} + +proc twapi::_parse_ctype {def parse_mode} { + variable _struct_defs + + # parse_mode is "struct", "param" or "function" + + if {![regexp -expanded { + ^ + \s* + (.+[^[:alnum:]_]) # type + ([[:alnum:]_]+) # name + \s* + (\[.+\])? # array size + \s*$ + } $def -> type name array]} { + error "Invalid C type definition $def" + } + + set child {} + switch -regexp -matchvar matchvar -- [string trim $type] { + {^void$} { + if {$parse_mode ne "function"} { + error "Type void cannot be used for structs and parameters." + } + set type void + } + {^char$} {set type i1} + {^BYTE$} - + {^unsigned char$} {set type ui1} + {^short$} {set type i2} + {^WORD$} - + {^unsigned\s+short$} {set type ui2} + {^BOOLEAN$} {set type bool} + {^LONG$} - + {^int$} {set type i4} + {^UINT$} - + {^ULONG$} - + {^DWORD$} - + {^unsigned\s+int$} {set type ui4} + {^__int64$} {set type i8} + {^unsigned\s+__int64$} {set type ui8} + {^double$} {set type r8} + {^float$} {set type r4} + {^LPCSTR$} - + {^LPSTR$} - + {^char\s*\*$} {set type lpstr} + {^LPCWSTR$} - + {^LPWSTR$} - + {^WCHAR\s*\*$} {set type lpwstr} + {^HANDLE$} {set type handle} + {^PSID$} {set type psid} + {^struct\s+([[:alnum:]_]+)$} { + if {$parse_mode ne "struct"} { + error "Structure types not allowed for parameters and return values." + } + # Embedded struct. It should be defined already. Calling + # it with no args returns its definition but doing that + # to retrieve the definition could be a security hole + # (could be passed any Tcl command!) if unwary apps + # pass in input from unknown sources. So we explicitly + # remember definitions instead. + set child_name [lindex $matchvar 1] + if {![info exists _struct_defs($child_name)]} { + error "Unknown struct $child_name" + } + set child $_struct_defs($child_name) + set type struct + } + default {error "Unknown type $type"} + } + set count 0 + if {$array ne ""} { + set count [string trim [string range $array 1 end-1]] + if {![string is integer -strict $count]} { + error "Non-integer array size" + } + if {$parse_mode ne "struct"} { + error "Arrays not allowed for parameters and return values." + } + } + + if {[string equal -nocase $name "cbSize"] && + $type in {i4 ui4} && $count == 0} { + set type cbsize + } + + return [list $name $type $count $child] +} + +proc twapi::_parse_cproto {s} { + variable _struct_defs + + # Get rid of comments + regsub -all {(/\*.* \*/){1,1}?} $s {} s + regsub -line -all {//.*$} $s { } s + + if {![regexp -expanded { + ^ + \s* + (?:(_cdecl|_stdcall)\s+)? + ([[:alnum:]_][[:space:][:alnum:]_]*) # Function type and name + \s* + \( # Beginning of parameters + ([^\)]*) # Parameter definition string + \) # End of parameters + \s*$ # End of prototype + } $s -> callconv fntypeandname paramstr]} { + error "Invalid C prototype \"$s\"" + } + + regsub -all {\s+} $fntypeandname " " + set fntype [_parse_ctype $fntypeandname function] + set params {} + foreach def [split $paramstr ","] { + lappend params [_parse_ctype $def param] + } + + return [list $callconv $fntype [lindex $fntype 0] $params] +} + +# Return a suitable cstruct definition based on a C definition +proc twapi::struct {struct_name s} { + variable _struct_defs + + if {0} { + TBD - Commented out because nested structs do not currently + handle namespaces. However this means structs are effectively + global even if the corresponding command is not. + set struct_name [callerns $struct_name] + } + + regsub -all {(/\*.* \*/){1,1}?} $s {} s + regsub -line -all {//.*$} $s { } s + set l {} + foreach def [split $s ";"] { + set def [string trim $def] + if {$def eq ""} continue + lappend l [_parse_ctype $def struct] + } + + set proc_body [format { + set def %s + if {[llength $args] == 0} { + return $def + } else { + return [list $def $args] + } + } [list $l]] + uplevel 1 [list proc $struct_name args $proc_body] + set _struct_defs($struct_name) $l + return +} + + +proc twapi::ffi_load {path} { + variable _ffi_paths + variable _ffi_handles + + # Note we do NOT normalize path as we leave it to the OS to do so. + # We also do not canonicalize it (e.g. all lower case). + # This means there may be multiple handles for a single shared lib + # but that's ok. + + if {[dict exists $_ffi_paths $path]} { + set h [dict get $_ffi_paths $path] + if {![dict exists $_ffi_handles $h]} { + error "Internal error: Handle $h not found in FFI table." + } + dict with _ffi_handles $h { + if {$Path ne $path} { + error "Internal error: Handle $h not assigned to $path" + } + incr NRefs + } + } else { + set h [load_library $path] + dict set _ffi_paths $path $h + dict set _ffi_handles $h Path $path + dict set _ffi_handles $h NRefs 1 + } + return $h +} + +proc twapi::ffi_unload {h} { + variable _ffi_handles + variable _ffi_paths + + if {![dict exists $_ffi_handles $h]} { + error "FFI handle $h does not exist." + } + + dict with _ffi_handles $h { + if {[incr NRefs -1] <= 0} { + dict unset _ffi_paths $Path + dict unset _ffi_handles $h + } + } + + return +} + +proc twapi::ffi_cfuncs {dllh cprotos {ns ::}} { + variable _ffi_handles + + if {![dict exists $_ffi_handles $dllh]} { + # error "Unknown FFI handle \"$dllh\"." + } + + set l {} + foreach cproto [split $cprotos ";"] { + set cproto [string trim $cproto] + if {$cproto eq ""} continue + lappend l [_parse_cproto $cproto] + } + set cprotos $l + + set def { + proc %NAME% {%PARAMNAMES%} { + if {![dict exists $%TWAPINS%::_ffi_handles %DLLH%]} { + error "Attempt to call function in unloaded library." + } + %TWAPINS%::%CALL% %FNADDR% %FNTYPE% %PARAMS% [list %PARAMREFS%] + } + } + + if {$::tcl_platform(pointerSize) == 8} { + # Win64 has single calling convention + set callmap {"" ffi_call _cdecl ffi_call _stdcall ffi_call} + } else { + set callmap {"" ffi_call _cdecl ffi_call _stdcall ffi_stdcall} + } + + foreach cproto $cprotos { + lassign $cproto callconv fntype fnname params + set call [dict get $callmap $callconv] + + set fnaddr [GetProcAddress $dllh $fnname] + if {[pointer_null? $fnaddr]} { + error "Entry point $fnname not found in shared library." + } + set paramnames {} + set paramrefs {} + foreach arg $params { + set name [lindex $arg 0] + lappend paramnames $name + lappend paramrefs \$$name + } + + # Note that fntype is doubly listified because the C ffi expects + # it in same format as params, ie. a list of type definitions + # _parse_cproto however returns it as a single type definition + append defs [string map [list \ + %CALL% $call \ + %DLLH% [list $dllh] \ + %NAME% ${ns}::$fnname \ + %PARAMNAMES% [join $paramnames { }] \ + %PARAMREFS% [join $paramrefs { }] \ + %TWAPINS% [namespace current] \ + %FNADDR% [list $fnaddr] \ + %FNTYPE% [list [list $fntype]] \ + %PARAMS% [list $params]] \ + $def] \n + } + + uplevel 1 $defs +} + + +if {[twapi::min_os_version 6]} { + twapi::ffi_cfuncs [twapi::ffi_load kernel32.dll] { + UINT GetErrorMode(); + UINT SetErrorMode(UINT mode); + } ::twapi +} + diff --git a/src/punk86.vfs/lib/twapi4.7.2/clipboard.tcl b/src/punk86.vfs/lib/twapi4.7.2/clipboard.tcl new file mode 100644 index 00000000..9fee98f8 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/clipboard.tcl @@ -0,0 +1,254 @@ +# +# Copyright (c) 2004, 2008 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# Clipboard related commands + +namespace eval twapi {} + +# Open the clipboard +# TBD - why no mechanism to pass window handle to OpenClipboard? +proc twapi::open_clipboard {} { + OpenClipboard 0 +} + +# Close the clipboard +proc twapi::close_clipboard {} { + catch {CloseClipboard} + return +} + +# Empty the clipboard +proc twapi::empty_clipboard {} { + EmptyClipboard +} + +proc twapi::_read_clipboard {fmt} { + # Always catch errors and close clipboard before passing exception on + # Also ensure memory unlocked + trap { + set h [GetClipboardData $fmt] + set p [GlobalLock $h] + set data [Twapi_ReadMemory 1 $p 0 [GlobalSize $h]] + } onerror {} { + catch {close_clipboard} + rethrow + } finally { + # If p exists, then we must have locked the handle + if {[info exists p]} { + GlobalUnlock $h + } + } + return $data +} + +proc twapi::read_clipboard {fmt} { + trap { + set data [_read_clipboard $fmt] + } onerror {TWAPI_WIN32 1418} { + # Caller did not have clipboard open. Do it on its behalf + open_clipboard + trap { + set data [_read_clipboard $fmt] + } finally { + catch {close_clipboard} + } + } + return $data +} + +# Read text data from the clipboard +proc twapi::read_clipboard_text {args} { + array set opts [parseargs args { + {raw.bool 0} + }] + + set bin [read_clipboard 13]; # 13 -> Unicode + # Decode Unicode and discard trailing nulls + set data [string trimright [encoding convertfrom unicode $bin] \0] + if {! $opts(raw)} { + set data [string map {"\r\n" "\n"} $data] + } + + return $data +} + +proc twapi::_write_clipboard {fmt data} { + # Always catch errors and close + # clipboard before passing exception on + trap { + # For byte arrays, string length does return correct size + # (DO NOT USE string bytelength - see Tcl docs!) + set len [string length $data] + + # Allocate global memory + set mem_h [GlobalAlloc 2 $len] + set mem_p [GlobalLock $mem_h] + + Twapi_WriteMemory 1 $mem_p 0 $len $data + + # The rest of this code just to ensure we do not free + # memory beyond this point irrespective of error/success + set h $mem_h + unset mem_p mem_h + GlobalUnlock $h + SetClipboardData $fmt $h + } onerror {} { + catch close_clipboard + rethrow + } finally { + if {[info exists mem_p]} { + GlobalUnlock $mem_h + } + if {[info exists mem_h]} { + GlobalFree $mem_h + } + } + return +} + +proc twapi::write_clipboard {fmt data} { + trap { + _write_clipboard $fmt $data + } onerror {TWAPI_WIN32 1418} { + # Caller did not have clipboard open. Do it on its behalf + open_clipboard + empty_clipboard + trap { + _write_clipboard $fmt $data + } finally { + catch close_clipboard + } + } + return +} + +# Write text to the clipboard +proc twapi::write_clipboard_text {data args} { + array set opts [parseargs args { + {raw.bool 0} + }] + + # Convert \n to \r\n leaving existing \r\n alone + if {! $opts(raw)} { + set data [regsub -all {(^|[^\r])\n} $data[set data ""] \\1\r\n] + } + append data \0 + write_clipboard 13 [encoding convertto unicode $data]; # 13 -> Unicode + return +} + +# Get current clipboard formats +proc twapi::get_clipboard_formats {} { + return [Twapi_EnumClipboardFormats] +} + +# Get registered clipboard format name. Clipboard does not have to be open +proc twapi::get_registered_clipboard_format_name {fmt} { + return [GetClipboardFormatName $fmt] +} + +# Register a clipboard format +proc twapi::register_clipboard_format {fmt_name} { + RegisterClipboardFormat $fmt_name +} + +# Returns 1/0 depending on whether a format is on the clipboard. Clipboard +# does not have to be open +proc twapi::clipboard_format_available {fmt} { + return [IsClipboardFormatAvailable $fmt] +} + +proc twapi::read_clipboard_paths {} { + set bin [read_clipboard 15] + # Extract the DROPFILES header + if {[binary scan $bin iiiii offset - - - unicode] != 5} { + error "Invalid or unsupported clipboard CF_DROP data." + } + # Sanity check + if {$offset >= [string length $bin]} { + error "Truncated clipboard data." + } + if {$unicode} { + set paths [encoding convertfrom unicode [string range $bin $offset end]] + } else { + set paths [encoding convertfrom ascii [string range $bin $offset end]] + } + set ret {} + foreach path [split $paths \0] { + if {[string length $path] == 0} break; # Empty string -> end of list + lappend ret [file join $path] + } + return $ret +} + +proc twapi::write_clipboard_paths {paths} { + # The header for a DROPFILES path list in hex + set fheader "1400000000000000000000000000000001000000" + set bin [binary format H* $fheader] + foreach path $paths { + # Note explicit \0 so the encoded binary includes the null terminator + append bin [encoding convertto unicode "[file nativename [file normalize $path]]\0"] + } + # A Unicode null char to terminate the list of paths + append bin [encoding convertto unicode \0] + write_clipboard 15 $bin +} + +# Start monitoring of the clipboard +proc twapi::_clipboard_handler {} { + variable _clipboard_monitors + + if {![info exists _clipboard_monitors] || + [llength $_clipboard_monitors] == 0} { + return; # Not an error, could have deleted while already queued + } + + foreach {id script} $_clipboard_monitors { + set code [catch {uplevel #0 $script} msg] + if {$code == 1} { + # Error - put in background but we do not abort + after 0 [list error $msg $::errorInfo $::errorCode] + } + } + return +} + +proc twapi::start_clipboard_monitor {script} { + variable _clipboard_monitors + + set id "clip#[TwapiId]" + if {![info exists _clipboard_monitors] || + [llength $_clipboard_monitors] == 0} { + # No clipboard monitoring in progress. Start it + Twapi_ClipboardMonitorStart + } + + lappend _clipboard_monitors $id $script + return $id +} + + + +# Stop monitoring of the clipboard +proc twapi::stop_clipboard_monitor {clipid} { + variable _clipboard_monitors + + if {![info exists _clipboard_monitors]} { + return; # Should we raise an error instead? + } + + set new_monitors {} + foreach {id script} $_clipboard_monitors { + if {$id ne $clipid} { + lappend new_monitors $id $script + } + } + + set _clipboard_monitors $new_monitors + if {[llength $_clipboard_monitors] == 0} { + Twapi_ClipboardMonitorStop + } +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/com.tcl b/src/punk86.vfs/lib/twapi4.7.2/com.tcl new file mode 100644 index 00000000..128a3458 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/com.tcl @@ -0,0 +1,4238 @@ +# +# Copyright (c) 2006-2018 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# TBD - tests comobj? works with derived classes of Automation + +# TBD - object identity comparison +# - see http://blogs.msdn.com/ericlippert/archive/2005/04/26/412199.aspx +# TBD - we seem to resolve UDT's every time a COM method is actually invoked. +# Optimize by doing it when prototype is stored or only the first time it +# is called. +# TBD - optimize by caching UDT's within a type library when the library +# is read. + +# TBD - optimize comobj unknown by caching previously resolved names +# + + +namespace eval twapi { + # Maps TYPEKIND data values to symbols + variable _typekind_map + array set _typekind_map { + 0 enum + 1 record + 2 module + 3 interface + 4 dispatch + 5 coclass + 6 alias + 7 union + } + + # Cache of Interface names - IID mappings + variable _name_to_iid_cache + array set _name_to_iid_cache { + iunknown {{00000000-0000-0000-C000-000000000046}} + idispatch {{00020400-0000-0000-C000-000000000046}} + idispatchex {{A6EF9860-C720-11D0-9337-00A0C90DCAA9}} + itypeinfo {{00020401-0000-0000-C000-000000000046}} + itypecomp {{00020403-0000-0000-C000-000000000046}} + ienumvariant {{00020404-0000-0000-C000-000000000046}} + iprovideclassinfo {{B196B283-BAB4-101A-B69C-00AA00341D07}} + + ipersist {{0000010c-0000-0000-C000-000000000046}} + ipersistfile {{0000010b-0000-0000-C000-000000000046}} + + iprovidetaskpage {{4086658a-cbbb-11cf-b604-00c04fd8d565}} + itasktrigger {{148BD52B-A2AB-11CE-B11F-00AA00530503}} + ischeduleworkitem {{a6b952f0-a4b1-11d0-997d-00aa006887ec}} + itask {{148BD524-A2AB-11CE-B11F-00AA00530503}} + ienumworkitems {{148BD528-A2AB-11CE-B11F-00AA00530503}} + itaskscheduler {{148BD527-A2AB-11CE-B11F-00AA00530503}} + imofcompiler {{6daf974e-2e37-11d2-aec9-00c04fb68820}} + } +} + +proc twapi::IUnknown_QueryInterface {ifc iid} { + set iidname void + catch {set iidname [registry get HKEY_CLASSES_ROOT\\Interface\\$iid ""]} + return [Twapi_IUnknown_QueryInterface $ifc $iid $iidname] +} + +proc twapi::CoGetObject {name bindopts iid} { + set iidname void + catch {set iidname [registry get HKEY_CLASSES_ROOT\\Interface\\$iid ""]} + return [Twapi_CoGetObject $name $bindopts $iid $iidname] +} + +proc twapi::progid_to_clsid {progid} { return [CLSIDFromProgID $progid] } +proc twapi::clsid_to_progid {progid} { return [ProgIDFromCLSID $progid] } + +proc twapi::com_security_blanket {args} { + # mutualauth.bool - docs for EOLE_AUTHENTICATION_CAPABILITIES. Learning + # DCOM says it is only for CoInitializeSecurity. Either way, + # that option is not applicable here + parseargs args { + {authenticationservice.arg default} + serverprincipal.arg + {authenticationlevel.arg default} + {impersonationlevel.arg default} + credentials.arg + cloaking.arg + } -maxleftover 0 -setvars + + set authenticationservice [_com_name_to_authsvc $authenticationservice] + set authenticationlevel [_com_name_to_authlevel $authenticationlevel] + set impersonationlevel [_com_name_to_impersonation $impersonationlevel] + + if {![info exists cloaking]} { + set eoac 0x800; # EOAC_DEFAULT + } else { + set eoac [dict! {none 0 static 0x20 dynamic 0x40} $cloaking] + } + + if {[info exists credentials]} { + # Credentials specified. Empty list -> NULL, ie use thread token + set creds_tag 1 + } else { + # Credentials not to be changed + set creds_tag 0 + set credentials {}; # Ignored + } + + if {[info exists serverprincipal]} { + if {$serverprincipal eq ""} { + set serverprincipaltag 0; # Default based on com_initialize_security + } else { + set serverprincipaltag 2 + } + } else { + set serverprincipaltag 1; # Unchanged server principal + set serverprincipal "" + } + + return [list $authenticationservice 0 $serverprincipaltag $serverprincipal $authenticationlevel $impersonationlevel $creds_tag $credentials $eoac] +} + +proc twapi::com_query_client_blanket {} { + lassign [CoQueryClientBlanket] authn authz server authlevel implevel client capabilities + if {$capabilities & 0x20} { + # EOAC_STATIC_CLOAKING + set cloaking static + } elseif {$capabilities & 0x40} { + set cloaking dynamic + } else { + set cloaking none + } + + # Note there is no implevel set as CoQueryClientBlanket does + # not return that information and implevel is a dummy value + return [list \ + -authenticationservice [_com_authsvc_to_name $authn] \ + -authorizationservice [dict* {0 none 1 name 2 dce} $authz] \ + -serverprincipal $server \ + -authenticationlevel [_com_authlevel_to_name $authlevel] \ + -clientprincipal $client \ + -cloaking $cloaking \ + ] +} + +# TBD - document +proc twapi::com_query_proxy_blanket {ifc} { + lassign [CoQueryProxyBlanket [lindex $args 0]] authn authz server authlevel implevel client capabilities + if {$capabilities & 0x20} { + # EOAC_STATIC_CLOAKING + set cloaking static + } elseif {$capabilities & 0x40} { + set cloaking dynamic + } else { + set cloaking none + } + + return [list \ + -authenticationservice [_com_authsvc_to_name $authn] \ + -authorizationservice [dict* {0 none 1 name 2 dce} $authz] \ + -serverprincipal $server \ + -authenticationlevel [_com_authlevel_to_name $authlevel] \ + -impersonationlevel [_com_impersonation_to_name $implevel] \ + -clientprincipal $client \ + -cloaking $cloaking \ + ] + +} + +proc twapi::com_initialize_security {args} { + # TBD - mutualauth? + # TBD - securerefs? + parseargs args { + {authenticationlevel.arg default} + {impersonationlevel.arg impersonate} + {cloaking.sym none {none 0 static 0x20 dynamic 0x40}} + secd.arg + appid.arg + authenticationservices.arg + } -maxleftover 0 -setvars + + if {[info exists secd] && [info exists appid]} { + badargs! "Only one of -secd and -appid can be specified." + } + + set impersonationlevel [_com_name_to_impersonation $impersonationlevel] + set authenticationlevel [_com_name_to_authlevel $authenticationlevel] + + set eoac $cloaking + if {[info exists appid]} { + incr eoac 8; # 8 -> EOAC_APPID + set secarg $appid + } else { + if {[info exists secd]} { + set secarg $secd + } else { + set secarg {} + } + } + + set authlist {} + if {[info exists authenticationservices]} { + foreach authsvc $authenticationservices { + lappend authlist [list [_com_name_to_authsvc [lindex $authsvc 0]] 0 [lindex $authsvc 1]] + } + } + + CoInitializeSecurity $secarg "" "" $authenticationlevel $impersonationlevel $authlist $eoac "" +} + +interp alias {} twapi::com_make_credentials {} twapi::make_logon_identity + +# TBD - document +proc twapi::com_create_instance {clsid args} { + array set opts [parseargs args { + {model.arg any} + download.bool + {disablelog.bool false} + enableaaa.bool + {nocustommarshal.bool false 0x1000} + {interface.arg IUnknown} + {authenticationservice.arg none} + {impersonationlevel.arg impersonate} + {credentials.arg {}} + {serverprincipal.arg {}} + {authenticationlevel.arg default} + {mutualauth.bool 0 0x1} + securityblanket.arg + system.arg + raw + } -maxleftover 0] + + set opts(authenticationservice) [_com_name_to_authsvc $opts(authenticationservice)] + set opts(authenticationlevel) [_com_name_to_authlevel $opts(authenticationlevel)] + set opts(impersonationlevel) [_com_name_to_impersonation $opts(impersonationlevel)] + + # CLSCTX_NO_CUSTOM_MARSHAL ? + set flags $opts(nocustommarshal) + + set model 0 + if {[info exists opts(model)]} { + foreach m $opts(model) { + switch -exact -- $m { + any {setbits model 23} + inprocserver {setbits model 1} + inprochandler {setbits model 2} + localserver {setbits model 4} + remoteserver {setbits model 16} + } + } + } + + setbits flags $model + + if {[info exists opts(download)]} { + if {$opts(download)} { + setbits flags 0x2000; # CLSCTX_ENABLE_CODE_DOWNLOAD + } else { + setbits flags 0x400; # CLSCTX_NO_CODE_DOWNLOAD + } + } + + if {$opts(disablelog)} { + setbits flags 0x4000; # CLSCTX_NO_FAILURE_LOG + } + + if {[info exists opts(enableaaa)]} { + if {$opts(enableaaa)} { + setbits flags 0x10000; # CLSCTX_ENABLE_AAA + } else { + setbits flags 0x8000; # CLSCTX_DISABLE_AAA + } + } + + if {[info exists opts(system)]} { + set coserverinfo [list 0 $opts(system) \ + [list $opts(authenticationservice) \ + 0 \ + $opts(serverprincipal) \ + $opts(authenticationlevel) \ + $opts(impersonationlevel) \ + $opts(credentials) \ + $opts(mutualauth) \ + ] \ + 0] + set activation_blanket \ + [com_security_blanket \ + -authenticationservice $opts(authenticationservice) \ + -serverprincipal $opts(serverprincipal) \ + -authenticationlevel $opts(authenticationlevel) \ + -impersonationlevel $opts(impersonationlevel) \ + -credentials $opts(credentials)] + } else { + set coserverinfo {} + } + + # If remote, set the specified security blanket on the proxy. Note + # that the blanket settings passed to CoCreateInstanceEx are used + # only for activation and do NOT get passed down to method calls + # If a remote component is activated with specific identity, we + # assume method calls require the same security settings. + + if {([info exists activation_blanket] || [llength $opts(credentials)]) && + ![info exists opts(securityblanket)]} { + if {[info exists activation_blanket]} { + set opts(securityblanket) $activation_blanket + } else { + set opts(securityblanket) [com_security_blanket -credentials $opts(credentials)] + } + } + + lassign [_resolve_iid $opts(interface)] iid iid_name + + # TBD - is all this OleRun still necessary or is there a check we can make + # before going down that path ? + # Microsoft Office (and maybe others) have some, uhhm, quirks. + # If they are loaded as inproc, all calls to retrieve an interface other + # than IUnknown fails. We have to get the IUnknown interface, + # call OleRun and then retrieve the desired interface. + # This does not happen if the localserver model was requested. + # We could check for a specific error code but no guarantee that + # the error is same in all versions so we catch and retry on all errors. + # 3rd element of each sublist is status. Non-0 -> Failure code + if {[catch {set ifcs [CoCreateInstanceEx $clsid NULL $flags $coserverinfo [list $iid]]}] || [lindex $ifcs 0 2] != 0} { + # Try through IUnknown + set ifcs [CoCreateInstanceEx $clsid NULL $flags $coserverinfo [list [_iid_iunknown]]] + + if {[lindex $ifcs 0 2] != 0} { + win32_error [lindex $ifcs 0 2] + } + set iunk [lindex $ifcs 0 1] + + # Need to set security blanket if specified before invoking any method + # else will get access denied + if {[info exists opts(securityblanket)]} { + trap { + CoSetProxyBlanket $iunk {*}$opts(securityblanket) + } onerror {} { + IUnknown_Release $iunk + rethrow + } + } + + trap { + # Wait for it to run, then get desired interface from it + twapi::OleRun $iunk + set ifc [Twapi_IUnknown_QueryInterface $iunk $iid $iid_name] + } finally { + IUnknown_Release $iunk + } + } else { + set ifc [lindex $ifcs 0 1] + } + + # All interfaces are returned typed as IUnknown by the C level + # even though they are actually the requested type. + set ifc [cast_handle $ifc $iid_name] + + if {[info exists activation_blanket]} { + # In order for servers to release objects properly, the IUnknown + # interface must have the same security settings as were used in + # the object creation + _com_set_iunknown_proxy $ifc $activation_blanket + } + + if {$opts(raw)} { + if {[info exists opts(securityblanket)]} { + trap { + CoSetProxyBlanket $ifc {*}$opts(securityblanket) + } onerror {} { + IUnknown_Release $ifc + rethrow + } + } + return $ifc + } else { + set proxy [make_interface_proxy $ifc] + if {[info exists opts(securityblanket)]} { + trap { + $proxy @SetSecurityBlanket $opts(securityblanket) + } onerror {} { + catch {$proxy Release} + rethrow + } + } + return $proxy + } +} + + +proc twapi::comobj_idispatch {ifc {addref 0} {objclsid ""} {lcid 0}} { + if {[pointer_null? $ifc]} { + return ::twapi::comobj_null + } + + if {[pointer? $ifc IDispatch]} { + if {$addref} { IUnknown_AddRef $ifc } + set proxyobj [IDispatchProxy new $ifc $objclsid] + } elseif {[pointer? $ifc IDispatchEx]} { + if {$addref} { IUnknown_AddRef $ifc } + set proxyobj [IDispatchExProxy new $ifc $objclsid] + } else { + error "'$ifc' does not reference an IDispatch interface" + } + + return [Automation new $proxyobj $lcid] +} + +# +# Create an object command for a COM object from a name +proc twapi::comobj_object {path args} { + array set opts [parseargs args { + progid.arg + {interface.arg IDispatch {IDispatch IDispatchEx}} + {lcid.int 0} + } -maxleftover 0] + + set clsid "" + if {[info exists opts(progid)]} { + # TBD - document once we have a test case for this + # Specify which app to use to open the file. + # See "Mapping Visual Basic to Automation" in SDK help + set clsid [_convert_to_clsid $opts(progid)] + set ipersistfile [com_create_instance $clsid -interface IPersistFile] + trap { + IPersistFile_Load $ipersistfile $path 0 + set idisp [Twapi_IUnknown_QueryInterface $ipersistfile [_iid_idispatch] IDispatch] + } finally { + IUnknown_Release $ipersistfile + } + } else { + # TBD - can we get the CLSID for this case + set idisp [::twapi::Twapi_CoGetObject $path {} [name_to_iid $opts(interface)] $opts(interface)] + } + + return [comobj_idispatch $idisp 0 $clsid $opts(lcid)] +} + +# +# Create a object command for a COM object IDispatch interface +# comid is either a CLSID or a PROGID +proc twapi::comobj {comid args} { + array set opts [parseargs args { + {interface.arg IDispatch {IDispatch IDispatchEx}} + active + {lcid.int 0} + } -ignoreunknown] + set clsid [_convert_to_clsid $comid] + if {$opts(active)} { + set iunk [GetActiveObject $clsid] + twapi::trap { + # TBD - do we need to deal with security blanket here? How do + # know what blanket is to be used on an already active object? + # Get the IDispatch interface + set idisp [IUnknown_QueryInterface $iunk {{00020400-0000-0000-C000-000000000046}}] + return [comobj_idispatch $idisp 0 $clsid $opts(lcid)] + } finally { + IUnknown_Release $iunk + } + } else { + set proxy [com_create_instance $clsid -interface $opts(interface) {*}$args] + $proxy @SetCLSID $clsid + return [Automation new $proxy $opts(lcid)] + } +} + +proc twapi::comobj_destroy args { + foreach arg $args { + catch {$arg -destroy} + } +} + +# Return an interface to a typelib +proc twapi::ITypeLibProxy_from_path {path args} { + array set opts [parseargs args { + {registration.arg none {none register default}} + } -maxleftover 0] + + return [make_interface_proxy [LoadTypeLibEx $path [kl_get {default 0 register 1 none 2} $opts(registration) $opts(registration)]]] +} + +# +# Return an interface to a typelib from the registry +proc twapi::ITypeLibProxy_from_guid {uuid major minor args} { + array set opts [parseargs args { + lcid.int + } -maxleftover 0 -nulldefault] + + return [make_interface_proxy [LoadRegTypeLib $uuid $major $minor $opts(lcid)]] +} + +# +# Unregister a typelib +proc twapi::unregister_typelib {uuid major minor args} { + array set opts [parseargs args { + lcid.int + } -maxleftover 0 -nulldefault] + + UnRegisterTypeLib $uuid $major $minor $opts(lcid) 1 +} + +# +# Returns the path to the typelib based on a guid +proc twapi::get_typelib_path_from_guid {guid major minor args} { + array set opts [parseargs args { + lcid.int + } -maxleftover 0 -nulldefault] + + + set path [variant_value [QueryPathOfRegTypeLib $guid $major $minor $opts(lcid)] 0 0 $opts(lcid)] + # At least some versions have a bug in that there is an extra \0 + # at the end. + if {[string equal [string index $path end] \0]} { + set path [string range $path 0 end-1] + } + return $path +} + +# +# Map interface name to IID +proc twapi::name_to_iid {iname} { + set iname [string tolower $iname] + + if {[info exists ::twapi::_name_to_iid_cache($iname)]} { + return $::twapi::_name_to_iid_cache($iname) + } + + # Look up the registry + set iids {} + foreach iid [registry keys HKEY_CLASSES_ROOT\\Interface] { + if {![catch { + set val [registry get HKEY_CLASSES_ROOT\\Interface\\$iid ""] + }]} { + if {[string equal -nocase $iname $val]} { + lappend iids $iid + } + } + } + + if {[llength $iids] == 1} { + return [set ::twapi::_name_to_iid_cache($iname) [lindex $iids 0]] + } elseif {[llength $iids]} { + error "Multiple interfaces found matching name $iname: [join $iids ,]" + } else { + return [set ::twapi::_name_to_iid_cache($iname) ""] + } +} + + +# +# Map interface IID to name +proc twapi::iid_to_name {iid} { + set iname "" + catch {set iname [registry get HKEY_CLASSES_ROOT\\Interface\\$iid ""]} + return $iname +} + +# +# Convert a variant time to a time list +proc twapi::variant_time_to_timelist {double} { + return [VariantTimeToSystemTime $double] +} + +# +# Convert a time list time to a variant time +proc twapi::timelist_to_variant_time {timelist} { + return [SystemTimeToVariantTime $timelist] +} + + +proc twapi::typelib_print {path args} { + array set opts [parseargs args { + type.arg + name.arg + output.arg + } -maxleftover 0 -nulldefault] + + + if {$opts(output) ne ""} { + if {[file exists $opts(output)]} { + error "File $opts(output) already exists." + } + set outfd [open $opts(output) a] + } else { + set outfd stdout + } + + trap { + set tl [ITypeLibProxy_from_path $path -registration none] + puts $outfd [$tl @Text -type $opts(type) -name $opts(name)] + } finally { + if {[info exists tl]} { + $tl Release + } + if {$outfd ne "stdout"} { + close $outfd + } + } + + return +} + +proc twapi::generate_code_from_typelib {path args} { + array set opts [parseargs args { + output.arg + } -ignoreunknown] + + if {[info exists opts(output)]} { + if {$opts(output) ne "stdout"} { + if {[file exists $opts(output)]} { + error "File $opts(output) already exists." + } + set outfd [open $opts(output) a] + } else { + set outfd stdout + } + } + + trap { + set tl [ITypeLibProxy_from_path $path -registration none] + set code [$tl @GenerateCode {*}$args] + if {[info exists outfd]} { + set libattr [$tl @GetLibAttr -all] + puts $outfd "# Automatically generated type library interface" + puts $outfd "# File: [file tail $path]" + puts $outfd "# Name: [$tl @GetName]" + puts $outfd "# GUID: [dict get $libattr -guid]" + puts $outfd "# Version: [dict get $libattr -majorversion].[dict get $libattr -minorversion]" + puts $outfd "# LCID: [dict get $libattr -lcid]" + + puts $outfd "\npackage require twapi_com" + puts $outfd $code + return + } else { + return $code + } + } finally { + if {[info exists tl]} { + $tl Release + } + if {[info exists outfd] && $outfd ne "stdout"} { + close $outfd + } + } +} + + + + +proc twapi::_interface_text {ti} { + # ti must be TypeInfo for an interface or module (or enum?) - TBD + set desc "" + array set attrs [$ti @GetTypeAttr -all] + set desc "Functions:\n" + for {set j 0} {$j < $attrs(-fncount)} {incr j} { + array set funcdata [$ti @GetFuncDesc $j -all] + if {$funcdata(-funckind) eq "dispatch"} { + set funckind "(dispid $funcdata(-memid))" + } else { + set funckind "(vtable $funcdata(-vtbloffset))" + } + append desc "\t$funckind [::twapi::_resolve_com_type_text $ti $funcdata(-datatype)] $funcdata(-name) $funcdata(-invkind) [::twapi::_resolve_com_params_text $ti $funcdata(-params) $funcdata(-paramnames)]\n" + } + append desc "Variables:\n" + for {set j 0} {$j < $attrs(-varcount)} {incr j} { + array set vardata [$ti @GetVarDesc $j -all] + set vardesc "($vardata(-memid)) $vardata(-varkind) [::twapi::_flatten_com_type [::twapi::_resolve_com_type_text $ti $vardata(-datatype)]] $vardata(-name)" + if {$attrs(-typekind) eq "enum" || $vardata(-varkind) eq "const"} { + append vardesc " = $vardata(-value)" + } else { + append vardesc " (offset $vardata(-value))" + } + append desc "\t$vardesc\n" + } + return $desc +} + +# +# Print methods in an interface, including inherited names +proc twapi::dispatch_print {di args} { + array set opts [parseargs args { + output.arg + } -maxleftover 0 -nulldefault] + + if {$opts(output) ne ""} { + if {[file exists $opts(output)]} { + error "File $opts(output) already exists." + } + set outfd [open $opts(output) a] + } else { + set outfd stdout + } + + trap { + set ti [$di @GetTypeInfo] + twapi::_dispatch_print_helper $ti $outfd + } finally { + if {[info exists ti]} { + $ti Release + } + if {$outfd ne "stdout"} { + close $outfd + } + } + + return +} + +proc twapi::_dispatch_print_helper {ti outfd {names_already_done ""}} { + set name [$ti @GetName] + if {$name in $names_already_done} { + # Already printed this + return $names_already_done + } + lappend names_already_done $name + + # Check for dual interfaces - we want to print both vtable and disp versions + set tilist [list $ti] + if {![catch {set ti2 [$ti @GetRefTypeInfoFromIndex $ti -1]}]} { + lappend tilist $ti2 + } + + trap { + foreach tifc $tilist { + puts $outfd $name + puts $outfd [_interface_text $tifc] + } + } finally { + if {[info exists ti2]} { + $ti2 Release + } + } + + # Now get any referenced typeinfos and print them + array set tiattrs [$ti GetTypeAttr] + for {set j 0} {$j < $tiattrs(cImplTypes)} {incr j} { + set ti2 [$ti @GetRefTypeInfoFromIndex $j] + trap { + set names_already_done [_dispatch_print_helper $ti2 $outfd $names_already_done] + } finally { + $ti2 Release + } + } + + return $names_already_done +} + + + +# +# Resolves references to parameter definition +proc twapi::_resolve_com_params_text {ti params paramnames} { + set result [list ] + foreach param $params paramname $paramnames { + set paramdesc [_flatten_com_type [_resolve_com_type_text $ti [lindex $param 0]]] + if {[llength $param] > 1 && [llength [lindex $param 1]] > 0} { + set paramdesc "\[[lindex $param 1]\] $paramdesc" + } + if {[llength $param] > 2} { + append paramdesc " [lrange $param 2 end]" + } + append paramdesc " $paramname" + lappend result $paramdesc + } + return "([join $result {, }])" +} + +# Flattens the output of _resolve_com_type_text +proc twapi::_flatten_com_type {com_type_desc} { + if {[llength $com_type_desc] < 2} { + return $com_type_desc + } + + if {[lindex $com_type_desc 0] eq "ptr"} { + return "[_flatten_com_type [lindex $com_type_desc 1]]*" + } else { + return "([lindex $com_type_desc 0] [_flatten_com_type [lindex $com_type_desc 1]])" + } +} + +# +# Resolves typedefs +proc twapi::_resolve_com_type_text {ti typedesc} { + + switch -exact -- [lindex $typedesc 0] { + 26 - + ptr { + # Recurse to resolve any inner types + set typedesc [list ptr [_resolve_com_type_text $ti [lindex $typedesc 1]]] + } + 29 - + userdefined { + set hreftype [lindex $typedesc 1] + set ti2 [$ti @GetRefTypeInfo $hreftype] + set typedesc "[$ti2 @GetName]" + $ti2 Release + } + default { + set typedesc [_vttype_to_string $typedesc] + } + } + + return $typedesc +} + + +# +# Given a COM type descriptor, resolved all user defined types (UDT) in it +# The descriptor must be in raw form as returned by the C code +proc twapi::_resolve_comtype {ti typedesc} { + + if {[lindex $typedesc 0] == 26} { + # VT_PTR - {26 INNER_TYPEDESC} + # If pointing to a UDT, convert to appropriate base type if possible + set inner [_resolve_comtype $ti [lindex $typedesc 1]] + set inner_type [lindex $inner 0] + if {$inner_type == 29} { + # When the referenced type is a UDT (29) which is actually + # a dispatch or other interface, replace the + # "pointer to UDT" with VT_DISPATCH/VT_INTERFACE + switch -exact -- [lindex $inner 1] { + dispatch {set typedesc [list 9]} + interface {set typedesc [list 13]} + coclass { + # Replace pointers to a user defined type that is + # a coclass having a default dispatch interface with + # the type for a dispatch interface + set idispatch_guid [coclass_idispatch_guid [lindex $inner 2]] + if {$idispatch_guid eq ""} { + # Coclass has no default dispatch interface + set typedesc [list 26 $inner] + } else { + # TBD - can we store idispatch_guid in param def so + # for return values we automatically convert to correct + # comobj type? + set typedesc [list 9]; # VT_DISPATCH + } + } + default { + # TBD - need to decode all the other types (record etc.) + set typedesc [list 26 $inner] + } + } + } else { + set typedesc [list 26 $inner] + } + } elseif {[lindex $typedesc 0] == 29} { + # VT_USERDEFINED - {29 HREFTYPE} + set ti2 [$ti @GetRefTypeInfo [lindex $typedesc 1]] + array set tattr [$ti2 @GetTypeAttr -guid -typekind] + switch -exact -- $tattr(-typekind) { + enum { + set typedesc [list 3]; # 3 -> i4 + } + alias { + set typedesc [_resolve_comtype $ti2 [kl_get [$ti2 GetTypeAttr] tdescAlias]] + } + default { + set typedesc [list 29 $tattr(-typekind) $tattr(-guid)] + } + } + $ti2 Release + } + + return $typedesc +} + +proc twapi::_resolve_params_for_prototype {ti paramdescs} { + set params {} + foreach paramdesc $paramdescs { + lappend params \ + [lreplace $paramdesc 0 0 [::twapi::_resolve_comtype $ti [lindex $paramdesc 0]]] + } + return $params +} + +proc twapi::_variant_values_from_safearray {sa ndims {raw false} {addref false} {lcid 0}} { + set result {} + if {[incr ndims -1] > 0} { + foreach elem $sa { + lappend result [_variant_values_from_safearray $elem $ndims $raw $addref $lcid] + } + } else { + foreach elem $sa { + lappend result [twapi::variant_value $elem $raw $addref $lcid] + } + } + return $result +} + +proc twapi::outvar {varname} { return [Twapi_InternalCast outvar $varname] } + +proc twapi::variant_value {variant raw addref {lcid 0}} { + # TBD - format appropriately depending on variant type for dates and + # currency + if {[llength $variant] == 0} { + return "" + } + set vt [lindex $variant 0] + + if {$vt & 0x2000} { + # VT_ARRAY - second element is {dimensions value} + if {[llength $variant] < 2} { + return [list ] + } + lassign [lindex $variant 1] dimensions values + set vt [expr {$vt & ~ 0x2000}] + if {$vt == 12} { + # Array of variants. Recursively convert values + return [_variant_values_from_safearray \ + $values \ + [expr {[llength $dimensions] / 2}] \ + $raw $addref $lcid] + } else { + return $values + } + } else { + if {$vt == 9} { + set idisp [lindex $variant 1]; # May be NULL! + if {$addref && ! [pointer_null? $idisp]} { + IUnknown_AddRef $idisp + } + if {$raw} { + return $idisp + } else { + # Note comobj_idispatch takes care of NULL + return [comobj_idispatch $idisp 0 "" $lcid] + } + } elseif {$vt == 13} { + set iunk [lindex $variant 1]; # May be NULL! + if {$addref && ! [pointer_null? $iunk]} { + IUnknown_AddRef $iunk + } + if {$raw} { + return $iunk + } else { + return [make_interface_proxy $iunk] + } + } + } + return [lindex $variant 1] +} + +proc twapi::variant_type {variant} { + return [lindex $variant 0] +} + +proc twapi::vt_null {} { + return [tclcast null ""] +} + +proc twapi::vt_empty {} { + return [tclcast empty ""] +} + +# +# General dispatcher for callbacks from event sinks. Invokes the actual +# registered script after mapping dispid's +proc twapi::_eventsink_callback {comobj script callee args} { + # Check if the comobj is still active + if {[llength [info commands $comobj]] == 0} { + if {$::twapi::log_config(twapi_com)} { + debuglog "COM event received for inactive object" + } + return; # Object has gone away, ignore + } + + set retcode [catch { + # We are invoked with cooked values so no need to call variant_value + uplevel #0 $script [list $callee] $args + } result] + + if {$::twapi::log_config(twapi_com) && $retcode} { + debuglog "Event sink callback error ($retcode): $result\n$::errorInfo" + } + + # $retcode is returned as HRESULT by the Invoke + return -code $retcode $result +} + +# +# Return clsid from a string. If $clsid is a valid CLSID - returns as is +# else tries to convert it from progid. An error is generated if neither +# works +proc twapi::_convert_to_clsid {comid} { + if {! [Twapi_IsValidGUID $comid]} { + return [progid_to_clsid $comid] + } + return $comid +} + +# +# Format a prototype definition for human consumption +# Proto is in the form {DISPID LCID INVOKEFLAGS RETTYPE PARAMTYPES PARAMNAMES} +proc twapi::_format_prototype {name proto} { + set dispid_lcid [lindex $proto 0]/[lindex $proto 1] + set ret_type [_vttype_to_string [lindex $proto 3]] + set invkind [_invkind_to_string [lindex $proto 2]] + # Distinguish between no parameters and parameters not known + set paramstr "" + if {[llength $proto] > 4} { + set params {} + foreach param [lindex $proto 4] paramname [lindex $proto 5] { + if {[string length $paramname]} { + set paramname " $paramname" + } + lassign $param type paramdesc + set type [_vttype_to_string $type] + set parammods [_paramflags_to_tokens [lindex $paramdesc 0]] + if {[llength [lindex $paramdesc 1]]} { + # Default specified + lappend parammods "default:[lindex [lindex $paramdesc 1] 1]" + } + lappend params "\[$parammods\] $type$paramname" + } + set paramstr " ([join $params {, }])" + } + return "$dispid_lcid $invkind $ret_type ${name}${paramstr}" +} + +# Convert parameter modifiers to string tokens. +# modifiers is list of integer flags or tokens. +proc twapi::_paramflags_to_tokens {modifiers} { + array set tokens {} + foreach mod $modifiers { + if {! [string is integer -strict $mod]} { + # mod is a token itself + set tokens($mod) "" + } else { + foreach tok [_make_symbolic_bitmask $mod { + in 1 + out 2 + lcid 4 + retval 8 + optional 16 + hasdefault 32 + hascustom 64 + }] { + set tokens($tok) "" + } + } + } + + # For cosmetic reasons, in/out should be first and remaining sorted + # Also (in,out) -> inout + if {[info exists tokens(in)]} { + if {[info exists tokens(out)]} { + set inout [list inout] + unset tokens(in) + unset tokens(out) + } else { + set inout [list in] + unset tokens(in) + } + } else { + if {[info exists tokens(out)]} { + set inout [list out] + unset tokens(out) + } + } + + if {[info exists inout]} { + return [linsert [lsort [array names tokens]] 0 $inout] + } else { + return [lsort [array names tokens]] + } +} + +# +# Map method invocation code to string +# Return code itself if no match +proc twapi::_invkind_to_string {code} { + return [kl_get { + 1 func + 2 propget + 4 propput + 8 propputref + } $code $code] +} + +# +# Map string method invocation symbol to code +# Error if no match and not an integer +proc twapi::_string_to_invkind {s} { + if {[string is integer $s]} { return $s } + return [kl_get { + func 1 + propget 2 + propput 4 + propputref 8 + } $s] +} + + +# +# Convert a VT typedef to a string +# vttype may be nested +proc twapi::_vttype_to_string {vttype} { + set vts [_vtcode_to_string [lindex $vttype 0]] + if {[llength $vttype] < 2} { + return $vts + } + + return [list $vts [_vttype_to_string [lindex $vttype 1]]] +} + +# +# Convert VT codes to strings +proc twapi::_vtcode_to_string {vt} { + return [kl_get { + 2 i2 + 3 i4 + 4 r4 + 5 r8 + 6 cy + 7 date + 8 bstr + 9 idispatch + 10 error + 11 bool + 12 variant + 13 iunknown + 14 decimal + 16 i1 + 17 ui1 + 18 ui2 + 19 ui4 + 20 i8 + 21 ui8 + 22 int + 23 uint + 24 void + 25 hresult + 26 ptr + 27 safearray + 28 carray + 29 userdefined + 30 lpstr + 31 lpwstr + 36 record + } $vt $vt] +} + +proc twapi::_string_to_base_vt {tok} { + # Only maps base VT tokens to numeric value + # TBD - record and userdefined? + return [dict get { + i2 2 + i4 3 + r4 4 + r8 5 + cy 6 + date 7 + bstr 8 + idispatch 9 + error 10 + bool 11 + iunknown 13 + decimal 14 + i1 16 + ui1 17 + ui2 18 + ui4 19 + i8 20 + ui8 21 + int 22 + uint 23 + hresult 25 + userdefined 29 + record 36 + } [string tolower $tok]] + +} + +# +# Get ADSI provider service +proc twapi::_adsi {{prov WinNT} {path {//.}}} { + return [comobj_object "${prov}:$path"] +} + +# Get cached IDispatch and IUNknown IID's +proc twapi::_iid_iunknown {} { + return $::twapi::_name_to_iid_cache(iunknown) +} +proc twapi::_iid_idispatch {} { + return $::twapi::_name_to_iid_cache(idispatch) +} + +# +# Return IID and name given a IID or name +proc twapi::_resolve_iid {name_or_iid} { + + # IID -> name mapping is more efficient so first assume it is + # an IID else we will unnecessarily trundle through the whole + # registry area looking for an IID when we already have it + # Assume it is a name + set other [iid_to_name $name_or_iid] + if {$other ne ""} { + # It was indeed the IID. Return the pair + return [list $name_or_iid $other] + } + + # Else resolve as a name + set other [name_to_iid $name_or_iid] + if {$other ne ""} { + # Yep + return [list $other $name_or_iid] + } + + win32_error 0x80004002 "Could not find IID $name_or_iid" +} + + +namespace eval twapi { + # Enable use of TclOO for new Tcl versions. To override setting + # applications should define and set before sourcing this file. + variable use_tcloo_for_com + if {![info exists use_tcloo_for_com]} { + set use_tcloo_for_com [package vsatisfies [package require Tcl] 8.6b2] + } + if {$use_tcloo_for_com} { + interp alias {} ::twapi::class {} ::oo::class + proc ::oo::define::twapi_exportall {} { + uplevel 1 export [info class methods [lindex [info level -1] 1] -private] + } + proc comobj? {cobj} { + # We do not want change the internal type so + # do not check for some types that + # could not be a comobj. In particular, + # if a list type, we do not even check + # because it cannot be a comobj and even checking + # will result in nested list types being + # destroyed which affects safearray type detection + # TBD - would it be faster to keep explicit track through + # a dictionary ? + if {[twapi::tcltype $cobj] in {bstr empty null bytecode TwapiOpaque list int double bytearray dict wideInt booleanString}} { + return 0 + } + set cobj [uplevel 1 [list namespace which -command $cobj]] + if {[info object isa object $cobj] && + [info object isa typeof $cobj ::twapi::Automation]} { + return 1 + } else { + return 0 + } + } + proc comobj_instances {} { + set comobj_classes [list ::twapi::Automation] + set objs {} + while {[llength $comobj_classes]} { + set comobj_classes [lassign $comobj_classes class] + lappend objs {*}[info class instances $class] + lappend comobj_classes {*}[info class subclasses $class] + } + # Get rid of dups which may occur if subclasses use + # multiple (diamond type) inheritance + return [lsort -unique $objs] + } + } else { + package require metoo + interp alias {} ::twapi::class {} ::metoo::class + namespace eval ::metoo::define { + proc twapi_exportall {args} { + # args is dummy to match metoo's class definition signature + # Nothing to do, all methods are metoo are public + } + } + proc comobj? {cobj} { + set cobj [uplevel 1 [list namespace which -command $cobj]] + return [metoo::introspect object isa $cobj ::twapi::Automation] + } + proc comobj_instances {} { + return [metoo::introspect object list ::twapi::Automation] + } + } + + # The prototype cache is indexed a composite key consisting of + # - the GUID of the interface, + # - the name of the function + # - the LCID + # - the invocation kind (as an integer) + # Each value contains the full prototype in a form + # that can be passed to IDispatch_Invoke. This is a list with the + # elements {DISPID LCID INVOKEFLAGS RETTYPE PARAMTYPES PARAMNAMES} + # Here PARAMTYPES is a list each element of which describes a + # parameter in the following format: + # {TYPE {FLAGS DEFAULT} NAMEDARGVALUE} where DEFAULT is optional + # and NAMEDARGVALUE only appears (optionally) when the prototype is + # passed to Invoke, not in the cached prototype itself. + # PARAMNAMES is list of parameter names in order and is + # only present if PARAMTYPES is also present. + + variable _dispatch_prototype_cache + array set _dispatch_prototype_cache {} +} + + +interp alias {} twapi::_dispatch_prototype_get {} twapi::dispatch_prototype_get +proc twapi::dispatch_prototype_get {guid name lcid invkind vproto} { + variable _dispatch_prototype_cache + set invkind [::twapi::_string_to_invkind $invkind] + if {[info exists _dispatch_prototype_cache($guid,$name,$lcid,$invkind)]} { + # Note this may be null if that name does not exist in the interface + upvar 1 $vproto proto + set proto $_dispatch_prototype_cache($guid,$name,$lcid,$invkind) + return 1 + } + return 0 +} + +# Update a prototype in cache. Note lcid and invkind cannot be +# picked up from prototype since it might be empty. +interp alias {} twapi::_dispatch_prototype_set {} twapi::dispatch_prototype_set +proc twapi::dispatch_prototype_set {guid name lcid invkind proto} { + # If the prototype does not contain the 5th element (params) + # it is a constructed prototype and we do NOT cache it as the + # disp id can change. Note empty prototypes are cached so + # we don't keep looking up something that does not exist + # Bug 130 + + if {[llength $proto] == 4} { + return + } + + variable _dispatch_prototype_cache + set invkind [_string_to_invkind $invkind] + set _dispatch_prototype_cache($guid,$name,$lcid,$invkind) $proto + return +} + +# Explicitly set prototypes for a guid +# protolist is a list of alternating name and prototype pairs. +# Each prototype must contain the LCID and invkind fields +proc twapi::_dispatch_prototype_load {guid protolist} { + foreach {name proto} $protolist { + dispatch_prototype_set $guid $name [lindex $proto 1] [lindex $proto 2] $proto + } +} + +proc twapi::coclass_idispatch_guid {coclass_guid} { + variable _coclass_idispatch_guids + if {[info exists _coclass_idispatch_guids($coclass_guid)]} { + return $_coclass_idispatch_guids($coclass_guid) + } + return "" +} + +proc twapi::_parse_dispatch_paramdef {paramdef} { + set errormsg "Invalid parameter or return type declaration '$paramdef'" + + set paramregex {^(\[[^\]]*\])?\s*(\w+)\s*(\[\s*\])?\s*([*]?)\s*(\w+)?$} + if {![regexp $paramregex [string trim $paramdef] def attrs paramtype safearray ptr paramname]} { + error $errormsg + } + + if {[string length $paramname]} { + lappend paramnames $paramname + } + # attrs can be in, out, opt separated by spaces + set paramflags 0 + foreach attr [string range $attrs 1 end-1] { + switch -exact -- $attr { + in {set paramflags [expr {$paramflags | 1}]} + out {set paramflags [expr {$paramflags | 2}]} + inout {set paramflags [expr {$paramflags | 3}]} + opt - + optional {set paramflags [expr {$paramflags | 16}]} + default {error "Unknown parameter attribute $attr"} + } + } + if {($paramflags & 3) == 0} { + set paramflags [expr {$paramflags | 1}]; # in param if unspecified + } + # Resolve parameter type. It can be + # - a safearray of base types or "variant"s (not pointers) + # - a pointer to a base type + # - a pointer to a safearray + # - a base type or "variant" + switch -exact -- $paramtype { + variant { set paramtype 12 } + void { set paramtype 24 } + default { set paramtype [_string_to_base_vt $paramtype] } + } + if {[string length $safearray]} { + if {$paramtype == 24} { + # Safearray of type void is an invalid type decl + error $errormsg + } + set paramtype [list 27 $paramtype] + } + if {[string length $ptr]} { + if {$paramtype == 24} { + # Pointer to type void is an invalid type + error $errormsg + } + set paramtype [list 26 $paramtype] + } + + return [list $paramflags $paramtype $paramname] +} + +proc twapi::define_dispatch_prototypes {guid protos args} { + array set opts [parseargs args { + {lcid.int 0} + } -maxleftover 0] + + set guid [canonicalize_guid $guid] + + set defregx {^\s*(\w+)\s+(\d+)\s+(\w[^\(]*)\(([^\)]*)\)(.*)$} + set parsed_protos {} + # Loop picking out one prototype in each interation + while {[regexp $defregx $protos -> membertype memid rettype paramstring protos]} { + set params {} + set paramnames {} + foreach paramdef [split $paramstring ,] { + lassign [_parse_dispatch_paramdef $paramdef] paramflags paramtype paramname + if {[string length $paramname]} { + lappend paramnames $paramname + } + lappend params [list $paramtype [list $paramflags]] + } + if {[llength $paramnames] && + [llength $params] != [llength $paramnames]} { + error "Missing parameter name in '$paramstring'. All parameter names must be specified or none at all." + } + + lassign [_parse_dispatch_paramdef $rettype] _ rettype name + set invkind [_string_to_invkind $membertype] + set proto [list $memid $opts(lcid) $invkind $rettype $params $paramnames] + lappend parsed_protos $name $proto + } + + set protos [string trim $protos] + if {[string length $protos]} { + error "Invalid dispatch prototype: '$protos'" + } + + _dispatch_prototype_load $guid $parsed_protos +} + +# Used to track when interface proxies are renamed/deleted +proc twapi::_interface_proxy_tracer {ifc oldname newname op} { + variable _interface_proxies + if {$op eq "rename"} { + if {$oldname eq $newname} return + set _interface_proxies($ifc) $newname + } else { + unset _interface_proxies($ifc) + } +} + + +# Return a COM interface proxy object for the specified interface. +# If such an object already exists, it is returned. Otherwise a new one +# is created. $ifc must be a valid COM Interface pointer for which +# the caller is holding a reference. Caller relinquishes ownership +# of the interface and must solely invoke operations through the +# returned proxy object. When done with the object, call the Release +# method on it, NOT destroy. +# TBD - how does this interact with security blankets ? +proc twapi::make_interface_proxy {ifc} { + variable _interface_proxies + + if {[info exists _interface_proxies($ifc)]} { + set proxy $_interface_proxies($ifc) + $proxy AddRef + if {! [pointer_null? $ifc]} { + # Release the caller's ref to the interface since we are holding + # one in the proxy object + ::twapi::IUnknown_Release $ifc + } + } else { + if {[pointer_null? $ifc]} { + set proxy [INullProxy new $ifc] + } else { + set ifcname [pointer_type $ifc] + set proxy [${ifcname}Proxy new $ifc] + } + set _interface_proxies($ifc) $proxy + trace add command $proxy {rename delete} [list ::twapi::_interface_proxy_tracer $ifc] + } + return $proxy +} + +# "Null" object - clones IUnknownProxy but will raise error on method calls +# We could have inherited but IUnknownProxy assumes non-null ifc so it +# and its inherited classes do not have to check for null in every method. +twapi::class create ::twapi::INullProxy { + constructor {ifc} { + my variable _ifc + # We keep the interface pointer because it encodes type information + if {! [::twapi::pointer_null? $ifc]} { + error "Attempt to create a INullProxy with non-NULL interface" + } + + set _ifc $ifc + + my variable _nrefs; # Internal ref count (held by app) + set _nrefs 1 + } + + method @Null? {} { return 1 } + method @Type {} { + my variable _ifc + return [::twapi::pointer_type $_ifc] + } + method @Type? {type} { + my variable _ifc + return [::twapi::pointer? $_ifc $type] + } + method AddRef {} { + my variable _nrefs + # We maintain our own ref counts. _ifc is null so do not + # call the COM AddRef ! + incr _nrefs + } + + method Release {} { + my variable _nrefs + if {[incr _nrefs -1] == 0} { + my destroy + } + } + + method DebugRefCounts {} { + my variable _nrefs + + # Return out internal ref as well as the COM ones + # Note latter is always 0 since _ifc is always NULL. + return [list $_nrefs 0] + } + + method QueryInterface {name_or_iid} { + error "Attempt to call QueryInterface called on NULL pointer" + } + + method @QueryInterface {name_or_iid} { + error "Attempt to call QueryInterface called on NULL pointer" + } + + # Parameter is for compatibility with IUnknownProxy + method @Interface {{addref 1}} { + my variable _ifc + return $_ifc + } + + twapi_exportall +} + +twapi::class create ::twapi::IUnknownProxy { + # Note caller must hold ref on the ifc. This ref is passed to + # the proxy object and caller must not make use of that ref + # unless it does an AddRef on it. + constructor {ifc {objclsid ""}} { + if {[::twapi::pointer_null? $ifc]} { + error "Attempt to register a NULL interface" + } + + my variable _ifc + set _ifc $ifc + + my variable _clsid + set _clsid $objclsid + + my variable _blanket; # Security blanket + set _blanket [list ] + + # We keep an internal reference count instead of explicitly + # calling out to the object's AddRef/Release every time. + # When the internal ref count goes to 0, we will invoke the + # object's "native" Release. + # + # Note the primary purpose of maintaining our internal reference counts + # is not efficiency by shortcutting the "native" AddRefs. It is to + # prevent crashes by bad application code; we can just generate an + # error instead by having the command go away. + my variable _nrefs; # Internal ref count (held by app) + + set _nrefs 1 + } + + destructor { + my variable _ifc + ::twapi::IUnknown_Release $_ifc + } + + method AddRef {} { + my variable _nrefs + # We maintain our own ref counts. Not pass it on to the actual object + incr _nrefs + } + + method Release {} { + my variable _nrefs + if {[incr _nrefs -1] == 0} { + my destroy + } + } + + method DebugRefCounts {} { + my variable _nrefs + my variable _ifc + + # Return out internal ref as well as the COM ones + # Note latter are unstable and only to be used for + # debugging + twapi::IUnknown_AddRef $_ifc + return [list $_nrefs [twapi::IUnknown_Release $_ifc]] + } + + method QueryInterface {name_or_iid} { + my variable _ifc + lassign [::twapi::_resolve_iid $name_or_iid] iid name + return [::twapi::Twapi_IUnknown_QueryInterface $_ifc $iid $name] + } + + # Same as QueryInterface except return "" instead of exception + # if interface not found and returns proxy object instead of interface + method @QueryInterface {name_or_iid {set_blanket 0}} { + my variable _blanket + ::twapi::trap { + set proxy [::twapi::make_interface_proxy [my QueryInterface $name_or_iid]] + if {$set_blanket && [llength $_blanket]} { + $proxy @SetSecurityBlanket $_blanket + } + return $proxy + } onerror {TWAPI_WIN32 0x80004002} { + # No such interface, return "", don't generate error + return "" + } onerror {} { + if {[info exists proxy]} { + catch {$proxy Release} + } + rethrow + } + } + + method @Type {} { + my variable _ifc + return [::twapi::pointer_type $_ifc] + } + + method @Type? {type} { + my variable _ifc + return [::twapi::pointer? $_ifc $type] + } + + method @Null? {} { + my variable _ifc + return [::twapi::pointer_null? $_ifc] + } + + # Returns raw interface. Caller must call IUnknown_Release on it + # iff addref is passed as true (default) + method @Interface {{addref 1}} { + my variable _ifc + if {$addref} { + ::twapi::IUnknown_AddRef $_ifc + } + return $_ifc + } + + # Returns out class id - old deprecated - use GetCLSID + method @Clsid {} { + my variable _clsid + return $_clsid + } + + method @GetCLSID {} { + my variable _clsid + return $_clsid + } + + method @SetCLSID {clsid} { + my variable _clsid + set _clsid $clsid + return + } + + method @SetSecurityBlanket blanket { + my variable _ifc _blanket + # In-proc components will not support IClientSecurity interface + # and will raise an error. That's the for the caller to be careful + # about. + twapi::CoSetProxyBlanket $_ifc {*}$blanket + set _blanket $blanket + return + } + + method @GetSecurityBlanket {} { + my variable _blanket + return $_blanket + } + + + twapi_exportall +} + +twapi::class create ::twapi::IDispatchProxy { + superclass ::twapi::IUnknownProxy + + destructor { + my variable _typecomp + if {[info exists _typecomp] && $_typecomp ne ""} { + $_typecomp Release + } + next + } + + method GetTypeInfoCount {} { + my variable _ifc + return [::twapi::IDispatch_GetTypeInfoCount $_ifc] + } + + # names is list - method name followed by parameter names + # Returns list of name dispid pairs + method GetIDsOfNames {names {lcid 0}} { + my variable _ifc + return [::twapi::IDispatch_GetIDsOfNames $_ifc $names $lcid] + } + + # Get dispid of a method (without parameter names) + method @GetIDOfOneName {name {lcid 0}} { + return [lindex [my GetIDsOfNames [list $name] $lcid] 1] + } + + method GetTypeInfo {{infotype 0} {lcid 0}} { + my variable _ifc + if {$infotype != 0} {error "Parameter infotype must be 0"} + return [::twapi::IDispatch_GetTypeInfo $_ifc $infotype $lcid] + } + + method @GetTypeInfo {{lcid 0}} { + return [::twapi::make_interface_proxy [my GetTypeInfo 0 $lcid]] + } + + method Invoke {prototype args} { + my variable _ifc + if {[llength $prototype] == 0 && [llength $args] == 0} { + # Treat as a property get DISPID_VALUE (default value) + # {dispid=0, lcid=0 cmd=propget(2) ret type=bstr(8) {} (no params)} + set prototype {0 0 2 8 {}} + } else { + # TBD - optimize by precomputing if a prototype needs this processing + # If any arguments are comobjs, may need to replace with the + # IDispatch interface. + # Moreover, we have to manage the reference counts for both + # IUnknown and IDispatch - + # - If the parameter is an IN parameter, ref counts do not need + # to change. + # - If the parameter is an OUT parameter, we are not passing + # an interface in, so nothing to do + # - If the parameter is an INOUT, we need to AddRef it since + # the COM method will Release it when storing a replacement + # HERE WE ONLY DO THE CHECK FOR COMOBJ. The AddRef checks are + # DONE IN THE C CODE (if necessary) + + set iarg -1 + set args2 {} + foreach arg $args { + incr iarg + # TBD - optimize this loop + set argtype [lindex $prototype 4 $iarg 0] + set argflags 0 + if {[llength [lindex $prototype 4 $iarg 1]]} { + set argflags [lindex $prototype 4 $iarg 1 0] + } + if {$argflags & 1} { + # IN param + if {$argflags & 2} { + # IN/OUT + # We currently do NOT handle a In/Out - skip for now TBD + # In the future we will have to check contents of + # the passed arg as a variable in the CALLER's context + } else { + # Pure IN param. Check if it is VT_DISPATCH or + # VT_VARIANT. Else nothing + # to do + if {[lindex $argtype 0] == 26} { + # Pointer, get base type + set argtype [lindex $argtype 1] + } + if {[lindex $argtype 0] == 9 || [lindex $argtype 0] == 12} { + # If a comobj was passed, need to extract the + # dispatch pointer. + if {[twapi::comobj? $arg]} { + # Note we do not addref when getting the interface + # (last param 0) because not necessary for IN + # params, AND it is the C code's responsibility + # anyways + set arg [$arg -interface 0] + } + } + } + + } else { + # Not an IN param. Nothing to be done + } + + lappend args2 $arg + } + set args $args2 + } + + # The uplevel is so that if some parameters are output, the varnames + # are resolved in caller + uplevel 1 [list ::twapi::IDispatch_Invoke $_ifc $prototype] $args + } + + # Methods are tried in the order specified by invkinds. + method @Invoke {name invkinds lcid params {namedargs {}}} { + if {$name eq ""} { + # Default method + return [uplevel 1 [list [self] Invoke {}] $params] + } + set nparams [llength $params] + + # We will try for each invkind to match. matches can be of + # different degrees, in descending priority - + # 1. prototype has parameter info and num params match exactly + # 2. prototype has parameter info and num params is greater + # than supplied arguments (assumes others have defaults) + # 3. prototype has no parameter information + # Within these classes, the order of invkinds determines + # priority + + if {$name eq "_NewEnum"} { + # Special case property to retrieve iterator. Some objects + # call it _NewEnum, others NewEnum. The disp id must always + # be -4 so we hard code that instead + # DISPID=-4 LCID=0 INVOKE=2(propget) RETTYPE=13(IUnknown) no parameters + set class1 [list {-4 0 2 13 {} {}}] + } else { + foreach invkind $invkinds { + set proto [my @Prototype $name $invkind $lcid] + if {[llength $proto]} { + if {[llength $proto] < 5} { + # No parameter information + lappend class3 $proto + } else { + if {[llength [lindex $proto 4]] == $nparams} { + lappend class1 $proto + break; # Class 1 match, no need to try others + } elseif {[llength [lindex $proto 4]] > $nparams} { + lappend class2 $proto + } else { + # Ignore - proto has fewer than supplied params + # Could not be a match + } + } + } + } + } + # For exact match (class1), we do not need the named + # arguments as positional arguments take priority. When + # number of passed parameters is fewer than those in + # prototype, check named arguments and use those + # values. If no parameter information, we can't use named + # arguments anyways. + + if {[info exists class1]} { + set matched_proto [lindex $class1 0] + } elseif {[info exists class2]} { + set matched_proto [lindex $class2 0] + # If we are passed named arguments AND the prototype also + # has parameter name information, replace the default values + # in the parameter definitions with the named arg value if + # it exists. + if {[llength $namedargs] && + [llength [set paramnames [lindex $matched_proto 5]]]} { + foreach {paramname paramval} $namedargs { + set paramindex [lsearch -nocase $paramnames $paramname] + if {$paramindex < 0} { + twapi::win32_error 0x80020004 "No parameter with name '$paramname' found for method '$name'" + } + + # Set the default value field of the + # appropriate parameter to the named arg value + set paramtype [lindex $matched_proto 4 $paramindex 0] + + # If parameter is VT_DISPATCH or VT_VARIANT, + # convert from comobj if necessary. + if {$paramtype == 9 || $paramtype == 12} { + if {[::twapi::comobj? $paramval]} { + # Note no AddRef when getting the interface + # (last param 0) because it is the C code's + # responsibility based on in/out direction + set paramval [$paramval -interface 0] + } + } + + # Replace the default value field for that param def + lset matched_proto 4 $paramindex [linsert [lrange [lindex $matched_proto 4 $paramindex] 0 1] 2 $paramval] + } + } + } elseif {[info exists class3]} { + set matched_proto [lindex $class3 0] + } + + if {[info exists matched_proto]} { + # Need uplevel so by-ref param vars are resolved correctly + return [uplevel 1 [list [self] Invoke $matched_proto] $params] + } + + # No prototype via typecomp / typeinfo available. + # No lcid worked. + # We have to use the last resort of GetIDsOfNames + set dispid [my @GetIDOfOneName [list $name] 0] + # TBD - should we cache result ? Probably not. + if {$dispid eq ""} { + twapi::win32_error 0x80020003 "No property or method found with name '$name'." + } + + # Try all invocation types except last in turn. If error is "Member not + # found" try the next prototype. + foreach invkind [lrange $invkinds 0 end-1] { + # Note params field (last) is missing signifying we do not + # know prototypes + set matched_proto [list $dispid 0 $invkind 8] + if {![catch { + uplevel 1 [list [self] Invoke $matched_proto] $params + } result ropts]} { + return $result + } + # If member not found error, keep going. Other errors, throw + lassign [dict get $ropts -errorcode] fac winerror + if {$fac ne "TWAPI_WIN32" && $winerror != -2147352573} { + # Some other error. + return -options $ropts $result + } + } + # Try the last one and hope for the best + set matched_proto [list $dispid 0 [lindex $invkinds end] 8] + return [uplevel 1 [list [self] Invoke $matched_proto] $params] + } + + # Get prototype that match the specified name + method @Prototype {name invkind lcid} { + my variable _ifc _guid _typecomp + + # Always need the GUID so get it we have not done so already + if {![info exists _guid]} { + my @InitTypeCompAndGuid + } + # Note above call may still have failed to init _guid + + # If we have been through here before and have our guid, + # check if a prototype exists and return it. + if {[info exists _guid] && $_guid ne "" && + [::twapi::_dispatch_prototype_get $_guid $name $lcid $invkind proto]} { + return $proto + } + + # Not in cache, have to look for it + # Use the ITypeComp for this interface if we do not + # already have it. We trap any errors because we will retry with + # different LCID's below. + set proto {} + if {![info exists _typecomp]} { + my @InitTypeCompAndGuid + } + if {$_typecomp ne ""} { + ::twapi::trap { + + set invkind [::twapi::_string_to_invkind $invkind] + set lhash [::twapi::LHashValOfName $lcid $name] + + if {![catch {$_typecomp Bind $name $lhash $invkind} binddata] && + [llength $binddata]} { + lassign $binddata type data ifc + if {$type eq "funcdesc" || + ($type eq "vardesc" && [::twapi::kl_get $data varkind] == 3)} { + set params {} + set bindti [::twapi::make_interface_proxy $ifc] + ::twapi::trap { + set params [::twapi::_resolve_params_for_prototype $bindti [::twapi::kl_get $data lprgelemdescParam]] + # Param names are needed for named arguments. Index 0 is method name so skip it + if {[catch {lrange [$bindti GetNames [twapi::kl_get $data memid]] 1 end} paramnames]} { + set paramnames {} + } + } finally { + $bindti Release + } + set proto [list [::twapi::kl_get $data memid] \ + $lcid \ + $invkind \ + [::twapi::kl_get $data elemdescFunc.tdesc] \ + $params $paramnames] + } else { + ::twapi::IUnknown_Release $ifc; # Don't need ifc but must release + twapi::debuglog "IDispatchProxy::@Prototype: Unexpected Bind type: $type, data: $data" + } + } + } onerror {} { + # Ignore and retry with other LCID's below + } + } + + + # If we do not have a guid return because even if we do not + # have a proto yet, falling through to try another lcid will not + # help and in fact will cause infinite recursion. + + if {$_guid eq ""} { + return $proto + } + + # We do have a guid, store the proto in cache (even if negative) + ::twapi::dispatch_prototype_set $_guid $name $lcid $invkind $proto + + # If we have the proto return it + if {[llength $proto]} { + return $proto + } + + # Could not find a matching prototype from the typeinfo/typecomp. + # We are not done yet. We will try and fall back to other lcid's + # Note we do this AFTER setting the prototype in the cache. That + # way we prevent (infinite) mutual recursion between lcid fallbacks. + # The fallback sequence is $lcid -> 0 -> 1033 + # (1033 is US English). Note lcid could itself be 1033 + # default and land up being checked twice times but that's + # ok since that's a one-time thing, and not very expensive either + # since the second go-around will hit the cache (negative). + # Note the time this is really useful is when the cache has + # been populated explicitly from a type library since in that + # case many interfaces land up with a US ENglish lcid (MSI being + # just one example) + + if {$lcid == 0} { + # Note this call may further recurse and return either a + # proto or empty (fail) + set proto [my @Prototype $name $invkind 1033] + } else { + set proto [my @Prototype $name $invkind 0] + } + + # Store it as *original* lcid. + ::twapi::dispatch_prototype_set $_guid $name $lcid $invkind $proto + + return $proto + } + + + # Initialize _typecomp and _guid. Not in constructor because may + # not always be required. Raises error if not available + method @InitTypeCompAndGuid {} { + my variable _guid _typecomp + + if {[info exists _typecomp]} { + # Based on code below, if _typecomp exists + # _guid also exists so no need to check for that + return + } + + ::twapi::trap { + set ti [my @GetTypeInfo 0] + } onerror {} { + # We do not raise an error because + # even without the _typecomp we can try invoking + # methods via IDispatch::GetIDsOfNames + twapi::debuglog "Could not ITypeInfo: [twapi::trapresult]" + if {![info exists _guid]} { + # Do not overwrite if already set thru @SetGuid or constructor + # Set to empty otherwise so we know we tried and failed + set _guid "" + } + set _typecomp "" + return + } + + ::twapi::trap { + # In case of dual interfaces, we need the typeinfo for the + # dispatch. Again, errors handled in try handlers + set attr [$ti GetTypeAttr] + switch -exact -- [::twapi::kl_get $attr typekind] { + 4 { + # Dispatch type, fine, just what we want + } + 3 { + # Interface type, Get the dispatch interface. If that fails, + # don't raise an error for the same reason as above + # if the interface itself is marked dispatchable + if {[catch { + $ti @GetRefTypeInfo [$ti GetRefTypeOfImplType -1] + } ti2 eropts]} { + # 4096 -> TYPEFLAG_FDISPATCHABLE + if {[::twapi::kl_get $attr wTypeFlags] & 4096} { + if {![info exists _guid]} { + # Do not overwrite if already set thru @SetGuid or constructor + # Set to empty otherwise so we know we tried and failed + # TBD - should we set _guid to [kl_get $attr guid] ? + set _guid "" + } + set _typecomp "" + return; # Note the finally clause will release $ti + } else { + # TBD - should we ignore errors even if dispatchable flag is not set? + return -options $eropts $ti2 + } + } + $ti Release + set ti $ti2 + } + default { + error "Interface is not a dispatch interface" + } + } + if {![info exists _guid]} { + # _guid might have already been valid, do not overwrite + set _guid [::twapi::kl_get [$ti GetTypeAttr] guid] + } + set _typecomp [$ti @GetTypeComp]; # ITypeComp + } finally { + $ti Release + } + } + + # Some COM objects like MSI do not have TypeInfo interfaces from + # where the GUID and TypeComp can be extracted. So we allow caller + # to explicitly set the GUID so we can look up methods in the + # dispatch prototype cache if it was populated directly by the + # application. If guid is not a valid GUID, an attempt is made + # to look it up as an IID name. + method @SetGuid {guid} { + my variable _guid + if {$guid eq ""} { + if {![info exists _guid]} { + my @InitTypeCompAndGuid + } + } else { + if {![::twapi::Twapi_IsValidGUID $guid]} { + set resolved_guid [::twapi::name_to_iid $guid] + if {$resolved_guid eq ""} { + error "Could not resolve $guid to a Interface GUID." + } + set guid $resolved_guid + } + + if {[info exists _guid] && $_guid ne ""} { + if {[string compare -nocase $guid $_guid]} { + error "Attempt to set the GUID to $guid when the dispatch proxy has already been initialized to $_guid" + } + } else { + set _guid $guid + } + } + + return $_guid + } + + method @GetCoClassTypeInfo {} { + my variable _ifc + + # We can get the typeinfo for the coclass in one of two ways: + # If the object supports IProvideClassInfo, we use it. Else + # we try the following: + # - from the idispatch, we get its typeinfo + # - from the typeinfo, we get the containing typelib + # - then we search the typelib for the coclass clsid + + ::twapi::trap { + set pci_ifc [my QueryInterface IProvideClassInfo] + set ti_ifc [::twapi::IProvideClassInfo_GetClassInfo $pci_ifc] + return [::twapi::make_interface_proxy $ti_ifc] + } onerror {} { + # Ignore - try the longer route if we were given the coclass clsid + } finally { + if {[info exists pci_ifc]} { + ::twapi::IUnknown_Release $pci_ifc + } + # Note - do not do anything with ti_ifc here, EVEN on error + } + + set co_clsid [my @Clsid] + if {$co_clsid eq ""} { + # E_FAIL + twapi::win32_error 0x80004005 "Could not get ITypeInfo for coclass: object does not support IProvideClassInfo and clsid not specified." + } + + set ti [my @GetTypeInfo] + ::twapi::trap { + set tl [lindex [$ti @GetContainingTypeLib] 0] + if {0} { + $tl @Foreach -guid $co_clsid -type coclass coti { + break + } + if {[info exists coti]} { + return $coti + } + } else { + return [$tl @GetTypeInfoOfGuid $co_clsid] + } + twapi::win32_error 0x80004005 "Could not find coclass."; # E_FAIL + } finally { + if {[info exists ti]} { + $ti Release + } + if {[info exists tl]} { + $tl Release + } + } + } + + twapi_exportall +} + + +twapi::class create ::twapi::IDispatchExProxy { + superclass ::twapi::IDispatchProxy + + method DeleteMemberByDispID {dispid} { + my variable _ifc + return [::twapi::IDispatchEx_DeleteMemberByDispID $_ifc $dispid] + } + + method DeleteMemberByName {name {lcid 0}} { + my variable _ifc + return [::twapi::IDispatchEx_DeleteMemberByName $_ifc $name $lcid] + } + + method GetDispID {name flags} { + my variable _ifc + return [::twapi::IDispatchEx_GetDispID $_ifc $name $flags] + } + + method GetMemberName {dispid} { + my variable _ifc + return [::twapi::IDispatchEx_GetMemberName $_ifc $dispid] + } + + method GetMemberProperties {dispid flags} { + my variable _ifc + return [::twapi::IDispatchEx_GetMemberProperties $_ifc $dispid $flags] + } + + # For some reason, order of args is different for this call! + method GetNextDispID {flags dispid} { + my variable _ifc + return [::twapi::IDispatchEx_GetNextDispID $_ifc $flags $dispid] + } + + method GetNameSpaceParent {} { + my variable _ifc + return [::twapi::IDispatchEx_GetNameSpaceParent $_ifc] + } + + method @GetNameSpaceParent {} { + return [::twapi::make_interface_proxy [my GetNameSpaceParent]] + } + + method @Prototype {name invkind {lcid 0}} { + set invkind [::twapi::_string_to_invkind $invkind] + + # First try IDispatch + ::twapi::trap { + set proto [next $name $invkind $lcid] + if {[llength $proto]} { + return $proto + } + # Note negative results ignored, as new members may be added/deleted + # to an IDispatchEx at any time. We will try below another way. + + } onerror {} { + # Ignore the error - we will try below using another method + } + + # Not a simple dispatch interface method. Could be expando + # type which is dynamically created. NOTE: The member is NOT + # created until the GetDispID call is made. + + # 10 -> case insensitive, create if required + set dispid [my GetDispID $name 10] + + # IMPORTANT : prototype retrieval results MUST NOT be cached since + # underlying object may add/delete members at any time. + + # No type information is available for dynamic members. + # TBD - is that really true? + + # Invoke kind - 1 (method), 2 (propget), 4 (propput) + if {$invkind == 1} { + # method + set flags 0x100 + } elseif {$invkind == 2} { + # propget + set flags 0x1 + } elseif {$invkind == 4} { + # propput + set flags 0x4 + } elseif {$invkind == 8 } { + # propputref + set flags 0x10 + } else { + error "Internal error: Invalid invkind value $invkind" + } + + # Try at least getting the invocation type but even that is not + # supported by all objects in which case we assume it can be invoked. + # TBD - in that case, why even bother doing GetMemberProperties? + if {! [catch { + set flags [expr {[my GetMemberProperties 0x115] & $flags}] + }]} { + if {! $flags} { + return {}; # EMpty proto -> no valid name for this invkind + } + } + + # Valid invkind or object does not support GetMemberProperties + # Return type is 8 (BSTR) but does not really matter as + # actual type will be set based on what is returned. + return [list $dispid $lcid $invkind 8] + } + + twapi_exportall +} + + +# ITypeInfo +#----------- + +twapi::class create ::twapi::ITypeInfoProxy { + superclass ::twapi::IUnknownProxy + + method GetRefTypeOfImplType {index} { + my variable _ifc + return [::twapi::ITypeInfo_GetRefTypeOfImplType $_ifc $index] + } + + method GetDocumentation {memid} { + my variable _ifc + return [::twapi::ITypeInfo_GetDocumentation $_ifc $memid] + } + + method GetImplTypeFlags {index} { + my variable _ifc + return [::twapi::ITypeInfo_GetImplTypeFlags $_ifc $index] + } + + method GetNames {index} { + my variable _ifc + return [::twapi::ITypeInfo_GetNames $_ifc $index] + } + + method GetTypeAttr {} { + my variable _ifc + return [::twapi::ITypeInfo_GetTypeAttr $_ifc] + } + + method GetFuncDesc {index} { + my variable _ifc + return [::twapi::ITypeInfo_GetFuncDesc $_ifc $index] + } + + method GetVarDesc {index} { + my variable _ifc + return [::twapi::ITypeInfo_GetVarDesc $_ifc $index] + } + + method GetIDsOfNames {names} { + my variable _ifc + return [::twapi::ITypeInfo_GetIDsOfNames $_ifc $names] + } + + method GetRefTypeInfo {hreftype} { + my variable _ifc + return [::twapi::ITypeInfo_GetRefTypeInfo $_ifc $hreftype] + } + + method @GetRefTypeInfo {hreftype} { + return [::twapi::make_interface_proxy [my GetRefTypeInfo $hreftype]] + } + + method GetTypeComp {} { + my variable _ifc + return [::twapi::ITypeInfo_GetTypeComp $_ifc] + } + + method @GetTypeComp {} { + return [::twapi::make_interface_proxy [my GetTypeComp]] + } + + method GetContainingTypeLib {} { + my variable _ifc + return [::twapi::ITypeInfo_GetContainingTypeLib $_ifc] + } + + method @GetContainingTypeLib {} { + lassign [my GetContainingTypeLib] itypelib index + return [list [::twapi::make_interface_proxy $itypelib] $index] + } + + method @GetRefTypeInfoFromIndex {index} { + return [my @GetRefTypeInfo [my GetRefTypeOfImplType $index]] + } + + # Friendlier version of GetTypeAttr + method @GetTypeAttr {args} { + + array set opts [::twapi::parseargs args { + all + guid + lcid + constructorid + destructorid + schema + instancesize + typekind + fncount + varcount + interfacecount + vtblsize + alignment + majorversion + minorversion + aliasdesc + flags + idldesc + memidmap + } -maxleftover 0] + + array set data [my GetTypeAttr] + set result [list ] + foreach {opt key} { + guid guid + lcid lcid + constructorid memidConstructor + destructorid memidDestructor + schema lpstrSchema + instancesize cbSizeInstance + fncount cFuncs + varcount cVars + interfacecount cImplTypes + vtblsize cbSizeVft + alignment cbAlignment + majorversion wMajorVerNum + minorversion wMinorVerNum + aliasdesc tdescAlias + } { + if {$opts(all) || $opts($opt)} { + lappend result -$opt $data($key) + } + } + + if {$opts(all) || $opts(typekind)} { + set typekind $data(typekind) + if {[info exists ::twapi::_typekind_map($typekind)]} { + set typekind $::twapi::_typekind_map($typekind) + } + lappend result -typekind $typekind + } + + if {$opts(all) || $opts(flags)} { + lappend result -flags [::twapi::_make_symbolic_bitmask $data(wTypeFlags) { + appobject 1 + cancreate 2 + licensed 4 + predeclid 8 + hidden 16 + control 32 + dual 64 + nonextensible 128 + oleautomation 256 + restricted 512 + aggregatable 1024 + replaceable 2048 + dispatchable 4096 + reversebind 8192 + proxy 16384 + }] + } + + if {$opts(all) || $opts(idldesc)} { + lappend result -idldesc [::twapi::_make_symbolic_bitmask $data(idldescType) { + in 1 + out 2 + lcid 4 + retval 8 + }] + } + + if {$opts(all) || $opts(memidmap)} { + set memidmap [list ] + for {set i 0} {$i < $data(cFuncs)} {incr i} { + array set fninfo [my @GetFuncDesc $i -memid -name] + lappend memidmap $fninfo(-memid) $fninfo(-name) + } + lappend result -memidmap $memidmap + } + + return $result + } + + # + # Get a variable description associated with a type + method @GetVarDesc {index args} { + # TBD - add support for retrieving elemdescVar.paramdesc fields + + array set opts [::twapi::parseargs args { + all + name + memid + schema + datatype + value + valuetype + varkind + flags + } -maxleftover 0] + + array set data [my GetVarDesc $index] + + set result [list ] + foreach {opt key} { + memid memid + schema lpstrSchema + datatype elemdescVar.tdesc + } { + if {$opts(all) || $opts($opt)} { + lappend result -$opt $data($key) + } + } + + + if {$opts(all) || $opts(value)} { + if {[info exists data(lpvarValue)]} { + # Const value + lappend result -value [lindex $data(lpvarValue) 1] + } else { + lappend result -value $data(oInst) + } + } + + if {$opts(all) || $opts(valuetype)} { + if {[info exists data(lpvarValue)]} { + lappend result -valuetype [lindex $data(lpvarValue) 0] + } else { + lappend result -valuetype int + } + } + + if {$opts(all) || $opts(varkind)} { + lappend result -varkind [::twapi::kl_get { + 0 perinstance + 1 static + 2 const + 3 dispatch + } $data(varkind) $data(varkind)] + } + + if {$opts(all) || $opts(flags)} { + lappend result -flags [::twapi::_make_symbolic_bitmask $data(wVarFlags) { + readonly 1 + source 2 + bindable 4 + requestedit 8 + displaybind 16 + defaultbind 32 + hidden 64 + restricted 128 + defaultcollelem 256 + uidefault 512 + nonbrowsable 1024 + replaceable 2048 + immediatebind 4096 + }] + } + + if {$opts(all) || $opts(name)} { + set result [concat $result [my @GetDocumentation $data(memid) -name]] + } + + return $result + } + + method @GetFuncDesc {index args} { + array set opts [::twapi::parseargs args { + all + name + memid + funckind + invkind + callconv + params + paramnames + flags + datatype + resultcodes + vtbloffset + } -maxleftover 0] + + array set data [my GetFuncDesc $index] + set result [list ] + + if {$opts(all) || $opts(paramnames)} { + lappend result -paramnames [lrange [my GetNames $data(memid)] 1 end] + } + foreach {opt key} { + memid memid + vtbloffset oVft + datatype elemdescFunc.tdesc + resultcodes lprgscode + } { + if {$opts(all) || $opts($opt)} { + lappend result -$opt $data($key) + } + } + + if {$opts(all) || $opts(funckind)} { + lappend result -funckind [::twapi::kl_get { + 0 virtual + 1 purevirtual + 2 nonvirtual + 3 static + 4 dispatch + } $data(funckind) $data(funckind)] + } + + if {$opts(all) || $opts(invkind)} { + lappend result -invkind [::twapi::_string_to_invkind $data(invkind)] + } + + if {$opts(all) || $opts(callconv)} { + lappend result -callconv [::twapi::kl_get { + 0 fastcall + 1 cdecl + 2 pascal + 3 macpascal + 4 stdcall + 5 fpfastcall + 6 syscall + 7 mpwcdecl + 8 mpwpascal + } $data(callconv) $data(callconv)] + } + + if {$opts(all) || $opts(flags)} { + lappend result -flags [::twapi::_make_symbolic_bitmask $data(wFuncFlags) { + restricted 1 + source 2 + bindable 4 + requestedit 8 + displaybind 16 + defaultbind 32 + hidden 64 + usesgetlasterror 128 + defaultcollelem 256 + uidefault 512 + nonbrowsable 1024 + replaceable 2048 + immediatebind 4096 + }] + } + + if {$opts(all) || $opts(params)} { + set params [list ] + foreach param $data(lprgelemdescParam) { + lassign $param paramtype paramdesc + set paramflags [::twapi::_paramflags_to_tokens [lindex $paramdesc 0]] + if {[llength $paramdesc] > 1} { + # There is a default value associated with the parameter + lappend params [list $paramtype $paramflags [lindex $paramdesc 1]] + } else { + lappend params [list $paramtype $paramflags] + } + } + lappend result -params $params + } + + if {$opts(all) || $opts(name)} { + set result [concat $result [my @GetDocumentation $data(memid) -name]] + } + + return $result + } + + # + # Get documentation for a element of a type + method @GetDocumentation {memid args} { + array set opts [::twapi::parseargs args { + all + name + docstring + helpctx + helpfile + } -maxleftover 0] + + lassign [my GetDocumentation $memid] name docstring helpctx helpfile + + set result [list ] + foreach opt {name docstring helpctx helpfile} { + if {$opts(all) || $opts($opt)} { + lappend result -$opt [set $opt] + } + } + return $result + } + + method @GetName {{memid -1}} { + return [lindex [my @GetDocumentation $memid -name] 1] + } + + method @GetImplTypeFlags {index} { + return [::twapi::_make_symbolic_bitmask \ + [my GetImplTypeFlags $index] \ + { + default 1 + source 2 + restricted 4 + defaultvtable 8 + }] + } + + # + # Get the typeinfo for the default source interface of a coclass + # This object must be the typeinfo of the coclass + method @GetDefaultSourceTypeInfo {} { + set count [lindex [my @GetTypeAttr -interfacecount] 1] + for {set i 0} {$i < $count} {incr i} { + set flags [my GetImplTypeFlags $i] + # default 0x1, source 0x2 + if {($flags & 3) == 3} { + # Our source interface implementation can only handle IDispatch + # so check if the source interface is that else keep looking. + # We even ignore dual interfaces because we cannot then + # assume caller will use the dispatch version + set ti [my @GetRefTypeInfoFromIndex $i] + array set typeinfo [$ti GetTypeAttr] + # typekind == 4 -> IDispatch, + # flags - 0x1000 -> dispatchable, 0x40 -> dual + if {$typeinfo(typekind) == 4 && + ($typeinfo(wTypeFlags) & 0x1000) && + !($typeinfo(wTypeFlags) & 0x40)} { + return $ti + } + $ti destroy + } + } + return "" + } + + twapi_exportall +} + + +# ITypeLib +#---------- + +twapi::class create ::twapi::ITypeLibProxy { + superclass ::twapi::IUnknownProxy + + method GetDocumentation {index} { + my variable _ifc + return [::twapi::ITypeLib_GetDocumentation $_ifc $index] + } + method GetTypeInfoCount {} { + my variable _ifc + return [::twapi::ITypeLib_GetTypeInfoCount $_ifc] + } + method GetTypeInfoType {index} { + my variable _ifc + return [::twapi::ITypeLib_GetTypeInfoType $_ifc $index] + } + method GetLibAttr {} { + my variable _ifc + return [::twapi::ITypeLib_GetLibAttr $_ifc] + } + method GetTypeInfo {index} { + my variable _ifc + return [::twapi::ITypeLib_GetTypeInfo $_ifc $index] + } + method @GetTypeInfo {index} { + return [::twapi::make_interface_proxy [my GetTypeInfo $index]] + } + method GetTypeInfoOfGuid {guid} { + my variable _ifc + return [::twapi::ITypeLib_GetTypeInfoOfGuid $_ifc $guid] + } + method @GetTypeInfoOfGuid {guid} { + return [::twapi::make_interface_proxy [my GetTypeInfoOfGuid $guid]] + } + method @GetTypeInfoType {index} { + set typekind [my GetTypeInfoType $index] + if {[info exists ::twapi::_typekind_map($typekind)]} { + set typekind $::twapi::_typekind_map($typekind) + } + return $typekind + } + + method @GetDocumentation {id args} { + array set opts [::twapi::parseargs args { + all + name + docstring + helpctx + helpfile + } -maxleftover 0] + + lassign [my GetDocumentation $id] name docstring helpctx helpfile + set result [list ] + foreach opt {name docstring helpctx helpfile} { + if {$opts(all) || $opts($opt)} { + lappend result -$opt [set $opt] + } + } + return $result + } + + method @GetName {} { + return [lindex [my GetDocumentation -1] 0] + } + + method @GetLibAttr {args} { + array set opts [::twapi::parseargs args { + all + guid + lcid + syskind + majorversion + minorversion + flags + } -maxleftover 0] + + array set data [my GetLibAttr] + set result [list ] + foreach {opt key} { + guid guid + lcid lcid + majorversion wMajorVerNum + minorversion wMinorVerNum + } { + if {$opts(all) || $opts($opt)} { + lappend result -$opt $data($key) + } + } + + if {$opts(all) || $opts(flags)} { + lappend result -flags [::twapi::_make_symbolic_bitmask $data(wLibFlags) { + restricted 1 + control 2 + hidden 4 + hasdiskimage 8 + }] + } + + if {$opts(all) || $opts(syskind)} { + lappend result -syskind [::twapi::kl_get { + 0 win16 + 1 win32 + 2 mac + } $data(syskind) $data(syskind)] + } + + return $result + } + + # + # Iterate through a typelib. Caller is responsible for releasing + # each ITypeInfo passed to it + # + method @Foreach {args} { + + array set opts [::twapi::parseargs args { + type.arg + name.arg + guid.arg + } -maxleftover 2 -nulldefault] + + if {[llength $args] != 2} { + error "Syntax error: Should be '[self] @Foreach ?options? VARNAME SCRIPT'" + } + + lassign $args varname script + upvar $varname varti + + set count [my GetTypeInfoCount] + for {set i 0} {$i < $count} {incr i} { + if {$opts(type) ne "" && $opts(type) ne [my @GetTypeInfoType $i]} { + continue; # Type does not match + } + if {$opts(name) ne "" && + [string compare -nocase $opts(name) [lindex [my @GetDocumentation $i -name] 1]]} { + continue; # Name does not match + } + set ti [my @GetTypeInfo $i] + if {$opts(guid) ne ""} { + if {[string compare -nocase [lindex [$ti @GetTypeAttr -guid] 1] $opts(guid)]} { + $ti Release + continue + } + } + set varti $ti + set ret [catch {uplevel 1 $script} result] + switch -exact -- $ret { + 1 { + error $result $::errorInfo $::errorCode + } + 2 { + return -code return $result; # TCL_RETURN + } + 3 { + set i $count; # TCL_BREAK + } + } + } + return + } + + method @Register {path {helppath ""}} { + my variable _ifc + ::twapi::RegisterTypeLib $_ifc $path $helppath + } + + method @LoadDispatchPrototypes {} { + set data [my @Read -type dispatch] + if {![dict exists $data dispatch]} { + return + } + + dict for {guid guiddata} [dict get $data dispatch] { + foreach type {methods properties} { + if {[dict exists $guiddata -$type]} { + dict for {name namedata} [dict get $guiddata -$type] { + dict for {lcid lciddata} $namedata { + dict for {invkind proto} $lciddata { + ::twapi::dispatch_prototype_set \ + $guid $name $lcid $invkind $proto + } + } + } + } + } + } + } + + method @Text {args} { + array set opts [::twapi::parseargs args { + type.arg + name.arg + } -maxleftover 0 -nulldefault] + + set text {} + my @Foreach -type $opts(type) -name $opts(name) ti { + ::twapi::trap { + array set attrs [$ti @GetTypeAttr -all] + set docs [$ti @GetDocumentation -1 -name -docstring] + set desc "[string totitle $attrs(-typekind)] [::twapi::kl_get $docs -name] $attrs(-guid) - [::twapi::kl_get $docs -docstring]\n" + switch -exact -- $attrs(-typekind) { + record - + union - + enum { + for {set j 0} {$j < $attrs(-varcount)} {incr j} { + array set vardata [$ti @GetVarDesc $j -all] + set vardesc "$vardata(-varkind) [::twapi::_resolve_com_type_text $ti $vardata(-datatype)] $vardata(-name)" + if {$attrs(-typekind) eq "enum"} { + append vardesc " = $vardata(-value) ([::twapi::_resolve_com_type_text $ti $vardata(-valuetype)])" + } else { + append vardesc " (offset $vardata(-value))" + } + append desc "\t$vardesc\n" + } + } + alias { + append desc "\ttypedef $attrs(-aliasdesc)\n" + } + module - + dispatch - + interface { + append desc [::twapi::_interface_text $ti] + } + coclass { + for {set j 0} {$j < $attrs(-interfacecount)} {incr j} { + set ti2 [$ti @GetRefTypeInfoFromIndex $j] + set idesc [$ti2 @GetName] + set iflags [$ti @GetImplTypeFlags $j] + if {[llength $iflags]} { + append idesc " ([join $iflags ,])" + } + append desc \t$idesc + $ti2 Release + unset ti2 + } + } + default { + append desc "Unknown typekind: $attrs(-typekind)\n" + } + } + append text \n$desc + } finally { + $ti Release + if {[info exists ti2]} { + $ti2 Release + } + } + } + return $text + } + + method @GenerateCode {args} { + array set opts [twapi::parseargs args { + namespace.arg + } -ignoreunknown] + + if {![info exists opts(namespace)]} { + set opts(namespace) [string tolower [my @GetName]] + } + + set data [my @Read {*}$args] + + set code {} + + # If namespace specfied as empty string (as opposed to unspecified) + # do not output a namespace + if {$opts(namespace) ne "" && + ([dict exists $data enum] || + [dict exists $data module] || + [dict exists $data coclass]) + } { + append code "\nnamespace eval $opts(namespace) \{\n" + append code "\n # Array mapping coclass names to their guids\n" + append code " variable _coclass_guids\n" + append code "\n # Array mapping dispatch interface names to their guids\n" + append code " variable _dispatch_guids\n" + append code { + # Returns the GUID for a coclass or empty string if not found + proc coclass_guid {coclass_name} { + variable _coclass_guids + if {[info exists _coclass_guids($coclass_name)]} { + return $_coclass_guids($coclass_name) + } + return "" + } + # Returns the GUID for a dispatch name or empty string if not found + proc dispatch_guid {dispatch_name} { + variable _dispatch_guids + if {[info exists _dispatch_guids($dispatch_name)]} { + return $_dispatch_guids($dispatch_name) + } + return "" + } + # Marks the specified object to be of a specific dispatch/coclass type + proc declare {typename comobj} { + # First check if it is the name of a dispatch interface + set guid [dispatch_guid $typename] + if {$guid ne ""} { + $comobj -interfaceguid $guid + return + } + + # If not, check if it is the name of a coclass with a dispatch interface + set guid [coclass_guid $typename] + if {$guid ne ""} { + if {[info exists ::twapi::_coclass_idispatch_guids($guid)]} { + $comobj -interfaceguid $::twapi::_coclass_idispatch_guids($guid) + return + } + } + + error "Could not resolve interface for $typename." + } + } + }; # append code... + + if {[dict exists $data module]} { + dict for {guid guiddata} [dict get $data module] { + # Some modules may not have constants (-values). + # We currently only output constants from modules, not functions + if {[dict exists $guiddata -values]} { + set module_name [dict get $guiddata -name] + append code "\n # Module $module_name ($guid)\n" + append code " [list array set $module_name [dict get $guiddata -values]]" + append code \n + } + } + } + + if {[dict exists $data enum]} { + dict for {name def} [dict get $data enum] { + append code "\n # Enum $name\n" + append code " [list array set $name [dict get $def -values]]" + append code \n + } + } + + if {[dict exists $data coclass]} { + dict for {guid def} [dict get $data coclass] { + append code "\n # Coclass [dict get $def -name]" + # Look for the default interface so we can remember its GUID. + # This is necessary for the cases where the Dispatch interface + # GUID is not available via a TypeInfo interface (e.g. + # a 64-bit COM component not registered with the 32-bit + # COM registry) + if {[dict exists $def -defaultdispatch]} { + set default_dispatch_guid [dict get $def -defaultdispatch] + append code "\n set ::twapi::_coclass_idispatch_guids($guid) \"$default_dispatch_guid\"\n" + } else { + set default_dispatch_guid "" + } + + # We assume here that coclass has a default interface + # which is dispatchable. Else an error will be generated + # at runtime. + append code [format { + set _coclass_guids(%1$s) "%2$s" + twapi::class create %1$s { + superclass ::twapi::Automation + constructor {args} { + set ifc [twapi::com_create_instance "%2$s" -interface IDispatch -raw {*}$args] + next [twapi::IDispatchProxy new $ifc "%2$s"] + if {[string length "%3$s"]} { + my -interfaceguid "%3$s" + } + } + }} [dict get $def -name] $guid $default_dispatch_guid] + append code \n + } + } + + if {$opts(namespace) ne "" && + ([dict exists $data enum] || + [dict exists $data module] || + [dict exists $data coclass]) + } { + append code "\}" + append code \n + } + + if {[dict exists $data dispatch]} { + dict for {guid guiddata} [dict get $data dispatch] { + set dispatch_name [dict get $guiddata -name] + append code "\n# Dispatch Interface $dispatch_name\n" + append code "set [set opts(namespace)]::_dispatch_guids($dispatch_name) \"$guid\"\n" + foreach type {methods properties} { + if {[dict exists $guiddata -$type]} { + append code "# $dispatch_name [string totitle $type]\n" + dict for {name namedata} [dict get $guiddata -$type] { + dict for {lcid lciddata} $namedata { + dict for {invkind proto} $lciddata { + append code [list ::twapi::dispatch_prototype_set \ + $guid $name $lcid $invkind $proto] + append code \n + } + } + } + } + } + } + } + + return $code + } + + method @Read {args} { + array set opts [::twapi::parseargs args { + type.arg + name.arg + } -maxleftover 0 -nulldefault] + + # Dictionary to contain result + set data [dict create] + + # Entries for coclasses and dispatch interfaces have a mutual + # dependency. Generation of dispatch interface method + # prototypes need to (potentially) resolve coclass names + # that map to dispatch interfaces. + # Conversely, that resolution requires a list of dispatch + # interface guids so gather that first. + + # List of dispatch guids + array set dispatch_guids {} + if {$opts(type) in {{} coclass dispatch}} { + # Collect dispatch guids. Note we do not collect other + # dispatch details since prototypes will need the coclass + # information which we do not have yet + my @Foreach -type dispatch ti { + ::twapi::trap { + set dispatch_guids([dict get [$ti GetTypeAttr] guid]) "" + } finally { + $ti Release + } + } + # Now that we have dispatch guids, collect coclass information + my @Foreach -type coclass ti { + ::twapi::trap { + array set attrs [$ti @GetTypeAttr -guid -lcid -varcount -fncount -interfacecount -typekind] + set name [lindex [$ti @GetDocumentation -1 -name] 1] + dict set data "coclass" $attrs(-guid) -name $name + for {set j 0} {$j < $attrs(-interfacecount)} {incr j} { + set ti2 [$ti @GetRefTypeInfoFromIndex $j] + set iflags [$ti GetImplTypeFlags $j] + set iguid [twapi::kl_get [$ti2 GetTypeAttr] guid] + set iname [$ti2 @GetName] + $ti2 Release + unset ti2; # So finally clause does not release again on error + + dict set data "coclass" $attrs(-guid) -interfaces $iguid -name $iname + dict set data "coclass" $attrs(-guid) -interfaces $iguid -flags $iflags + + # If this is a dispatch interface and the default interface + # for the coclass, add it to coclass default dispatch database. + # This will be used to resolve dispatch prototypes + if {$iflags == 1 && [info exists dispatch_guids($iguid)]} { + # This is used by the parameter resolution code in + # _resolve_comtype while building prototypes + set ::twapi::_coclass_idispatch_guids($attrs(-guid)) $iguid + dict set data "coclass" $attrs(-guid) -defaultdispatch $iguid + } + } + } finally { + if {[info exists ti2]} { + $i2 Release + } + $ti Release + } + } + } + + # If we were only looking for coclass information, we already have it + if {$opts(type) eq "coclass"} { + return $data + } + + my @Foreach -type $opts(type) -name $opts(name) ti { + ::twapi::trap { + array set attrs [$ti @GetTypeAttr -guid -lcid -varcount -fncount -interfacecount -typekind] + set name [lindex [$ti @GetDocumentation -1 -name] 1] + # dict set data $attrs(-typekind) $name {} + switch -exact -- $attrs(-typekind) { + record - + union - + enum { + # For consistency with the coclass and dispatch dict structure + # we have a separate key for 'name' even though it is the same + # as the dict key + dict set data $attrs(-typekind) $name -name $name + for {set j 0} {$j < $attrs(-varcount)} {incr j} { + array set vardata [$ti @GetVarDesc $j -name -value] + dict set data $attrs(-typekind) $name -values $vardata(-name) $vardata(-value) + } + } + alias { + # TBD - anything worth importing ? + } + dispatch { + # Load up the functions + dict set data $attrs(-typekind) $attrs(-guid) -name $name + for {set j 0} {$j < $attrs(-fncount)} {incr j} { + array set funcdata [$ti GetFuncDesc $j] + if {$funcdata(funckind) != 4} { + # Not a dispatch function (4), ignore + # TBD - what else could it be if already filtering + # typeinfo on dispatch + # Vtable set funckind "(vtable $funcdata(-oVft))" + ::twapi::debuglog "Unexpected funckind value '$funcdata(funckind)' ignored. funcdata: [array get funcdata]" + continue; + } + + set proto [list $funcdata(memid) \ + $attrs(-lcid) \ + $funcdata(invkind) \ + $funcdata(elemdescFunc.tdesc) \ + [::twapi::_resolve_params_for_prototype $ti $funcdata(lprgelemdescParam)]] + # Param names are needed for named arguments. Index 0 is method name so skip it + if {[catch {lappend proto [lrange [$ti GetNames $funcdata(memid)] 1 end]}]} { + # Could not get param names + lappend proto {} + } + + dict set data "$attrs(-typekind)" \ + $attrs(-guid) \ + -methods \ + [$ti @GetName $funcdata(memid)] \ + $attrs(-lcid) \ + $funcdata(invkind) \ + $proto + } + # Load up the properties + for {set j 0} {$j < $attrs(-varcount)} {incr j} { + array set vardata [$ti GetVarDesc $j] + # We will add both propput and propget. + # propget: + dict set data "$attrs(-typekind)" \ + $attrs(-guid) \ + -properties \ + [$ti @GetName $vardata(memid)] \ + $attrs(-lcid) \ + 2 \ + [list $vardata(memid) $attrs(-lcid) 2 $vardata(elemdescVar.tdesc) {} {}] + + # TBD - mock up the parameters for the property set + # Single parameter corresponding to return type of + # property. Param list is of the form + # {PARAM1 PARAM2} where PARAM is {TYPE {FLAGS ?DEFAULT}} + # So param list with one param is + # {{TYPE {FLAGS ?DEFAULT?}}} + # propput: + if {! ($vardata(wVarFlags) & 1)} { + # Not read-only + dict set data "$attrs(-typekind)" \ + $attrs(-guid) \ + -properties \ + [$ti @GetName $vardata(memid)] \ + $attrs(-lcid) \ + 4 \ + [list $vardata(memid) $attrs(-lcid) 4 24 [list [list $vardata(elemdescVar.tdesc) [list 1]]] {}] + } + } + } + + module { + dict set data $attrs(-typekind) $attrs(-guid) -name $name + # TBD - Load up the functions + + # Now load up the variables + for {set j 0} {$j < $attrs(-varcount)} {incr j} { + array set vardata [$ti @GetVarDesc $j -name -value] + dict set data $attrs(-typekind) $attrs(-guid) -values $vardata(-name) $vardata(-value) + } + } + + interface { + # TBD + } + + coclass { + # We have already collected this information before this loop + continue + } + default { + # TBD + } + } + } finally { + $ti Release + if {[info exists ti2]} { + $ti2 Release + } + } + } + + # Unless we are collecting coclass info, remove any related info + # that we might have gathered for dispatch prototypes + if {$opts(type) ni {{} coclass}} { + dict unset data "coclass" + } + return $data + } + + twapi_exportall +} + +# ITypeComp +#---------- +twapi::class create ::twapi::ITypeCompProxy { + superclass ::twapi::IUnknownProxy + + method Bind {name lhash flags} { + my variable _ifc + return [::twapi::ITypeComp_Bind $_ifc $name $lhash $flags] + } + + # Returns empty list if bind not found + method @Bind {name flags {lcid 0}} { + ::twapi::trap { + set binding [my Bind $name [::twapi::LHashValOfName $lcid $name] $flags] + } onerror {TWAPI_WIN32 0x80028ca0} { + # Found but type mismatch (flags not correct) + return {} + } + + lassign $binding type data tifc + return [list $type $data [::twapi::make_interface_proxy $tifc]] + } + + twapi_exportall +} + +# IEnumVARIANT +#------------- + +twapi::class create ::twapi::IEnumVARIANTProxy { + superclass ::twapi::IUnknownProxy + + method Next {count {value_only 0}} { + my variable _ifc + return [::twapi::IEnumVARIANT_Next $_ifc $count $value_only] + } + method Clone {} { + my variable _ifc + return [::twapi::IEnumVARIANT_Clone $_ifc] + } + method @Clone {} { + return [::twapi::make_interface_proxy [my Clone]] + } + method Reset {} { + my variable _ifc + return [::twapi::IEnumVARIANT_Reset $_ifc] + } + method Skip {count} { + my variable _ifc + return [::twapi::IEnumVARIANT_Skip $_ifc $count] + } + + twapi_exportall +} + +# Automation +#----------- +twapi::class create ::twapi::Automation { + + # Caller gives up ownership of proxy in all cases, even errors. + # $proxy will eventually be Release'ed. If caller wants to keep + # a reference to it, it must do an *additional* AddRef on it to + # keep it from going away when the Automation object releases it. + constructor {proxy {lcid 0}} { + my variable _proxy _lcid _sinks _connection_pts + + set type [$proxy @Type] + if {$type ne "IDispatch" && $type ne "IDispatchEx"} { + $proxy Release; # Even on error, responsible for releasing + error "Automation objects do not support interfaces of type '$type'" + } + if {$type eq "IDispatchEx"} { + my variable _have_dispex + # If _have_dispex variable + # - does not exist, have not tried to get IDispatchEx yet + # - is 0, have tried but failed + # - is 1, already have IDispatchEx + set _have_dispex 1 + } + + set _proxy $proxy + set _lcid $lcid + array set _sinks {} + array set _connection_pts {} + } + + destructor { + my variable _proxy _sinks + + # Release sinks, connection points + foreach sinkid [array names _sinks] { + my -unbind $sinkid + } + + if {[info exists _proxy]} { + $_proxy Release + } + return + } + + # Intended to be called only from another method. Not directly. + # Does an uplevel 2 to get to application context. + # On failures, retries with IDispatchEx interface + # TBD - get rid of this uplevel business by having internal + # callers to equivalent of "uplevel 1 my _invoke ... + method _invoke {name invkinds params args} { + my variable _proxy _lcid + + if {[$_proxy @Null?]} { + error "Attempt to invoke method $name on NULL COM object" + } + + array set opts [twapi::parseargs args { + raw.bool + namedargs.arg + } -nulldefault -maxleftover 0] + + ::twapi::trap { + set vtval [uplevel 2 [list $_proxy @Invoke $name $invkinds $_lcid $params $opts(namedargs)]] + if {$opts(raw)} { + return $vtval + } else { + return [::twapi::variant_value $vtval 0 0 $_lcid] + } + } onerror {} { + # TBD - should we only drop down below to check for IDispatchEx + # for specific error codes. Right now we do it for all. + set erinfo $::errorInfo + set ercode $::errorCode + set ermsg [::twapi::trapresult] + } + + # We plan on trying to get a IDispatchEx interface in case + # the method/property is the "expando" type + my variable _have_dispex + if {[info exists _have_dispex]} { + # We have already tried for IDispatchEx, either successfully + # or not. Either way, no need to try again + error $ermsg $erinfo $ercode + } + + # Try getting a IDispatchEx interface + if {[catch {$_proxy @QueryInterface IDispatchEx 1} proxy_ex] || + $proxy_ex eq ""} { + set _have_dispex 0 + error $ermsg $erinfo $ercode + } + + set _have_dispex 1 + $_proxy Release + set _proxy $proxy_ex + + # Retry with the IDispatchEx interface + set vtval [uplevel 2 [list $_proxy @Invoke $name $invkinds $_lcid $params $opts(namedargs)]] + if {$opts(raw)} { + return $vtval + } else { + return [::twapi::variant_value $vtval 0 0 $_lcid] + } + } + + method -get {name args} { + return [my _invoke $name [list 2] $args] + } + + method -put {name args} { + return [my _invoke $name [list 4] $args] + } + forward -set my -put + + method -putref {name args} { + return [my _invoke $name [list 8] $args] + } + + method -call {name args} { + return [my _invoke $name [list 1] $args] + } + + method -callnamedargs {name args} { + return [my _invoke $name [list 1] {} -namedargs $args] + } + + # Need a wrapper around _invoke in order for latter's uplevel 2 + # to work correctly + # TBD - document, test + method -invoke {name invkinds params args} { + return [my _invoke $name $invkinds $params {*}$args] + } + + method -destroy {} { + my destroy + } + + method -isnull {} { + my variable _proxy + return [$_proxy @Null?] + } + + method -default {} { + my variable _proxy _lcid + return [::twapi::variant_value [$_proxy Invoke ""] 0 0 $_lcid] + } + + # Caller must call release on the proxy + method -proxy {} { + my variable _proxy + $_proxy AddRef + return $_proxy + } + + # Only for debugging + method -proxyrefcounts {} { + my variable _proxy + return [$_proxy DebugRefCounts] + } + + # Returns the raw interface. Caller must call IUnknownRelease on it + # iff addref is passed as true (default) + method -interface {{addref 1}} { + my variable _proxy + return [$_proxy @Interface $addref] + } + + # Validates internal structures + method -validate {} { + twapi::ValidateIUnknown [my -interface 0] + } + + # Set/return the GUID for the interface + method -interfaceguid {{guid ""}} { + my variable _proxy + return [$_proxy @SetGuid $guid] + } + + # Sets the idispatch or coclass of the object + method -instanceof {coclass} { + # The coclass may be a GUID or the Tcl name + if {[::twapi::Twapi_IsValidGUID $coclass]} { + if {[info exists ::twapi::_coclass_idispatch_guids($coclass)]} { + $comobj -interfaceguid $::twapi::_coclass_idispatch_guids($coclass) + } + error "Could not resolve interface for coclass GUID $coclass." + } + # Check for corresponding Tcl class name generated from a type + # library + set ns [namespace qualifiers $coclass] + if {$ns eq ""} { + error "Coclass name must be qualified with name of containing namespace." + } + uplevel 1 [list ${ns}::declare [namespace tail $coclass] [self]] + } + + # Return the disp id for a method/property + method -dispid {name} { + my variable _proxy + return [$_proxy @GetIDOfOneName $name] + } + + # Prints methods in an interface + method -print {} { + my variable _proxy + ::twapi::dispatch_print $_proxy + } + + method -with {subobjlist args} { + # $obj -with SUBOBJECTPATHLIST arguments + # where SUBOBJECTPATHLIST is list each element of which is + # either a property or a method of the previous element in + # the list. The element may itself be a list in which case + # the first element is the property/method and remaining + # are passed to it + # + # Note that 'arguments' may themselves be comobj subcommands! + set next [self] + set releaselist [list ] + ::twapi::trap { + while {[llength $subobjlist]} { + set nextargs [lindex $subobjlist 0] + set subobjlist [lrange $subobjlist 1 end] + set next [uplevel 1 [list $next] $nextargs] + lappend releaselist $next + } + # We use uplevel here because again we want to run in caller + # context + return [uplevel 1 [list $next] $args] + } finally { + foreach next $releaselist { + $next -destroy + } + } + } + + method -iterate {args} { + my variable _lcid + + array set opts [::twapi::parseargs args { + cleanup + }] + + if {[llength $args] < 2} { + error "Syntax: COMOBJ -iterate ?options? VARNAME SCRIPT" + } + upvar 1 [lindex $args 0] var + set script [lindex $args 1] + + # First get IEnumVariant iterator using the _NewEnum method + # TBD - As per MS OLE Automation spec, it appears _NewEnum + # MUST have dispid -4. Can we use this information when + # this object does not have an associated interface guid or + # when no prototype is available ? + set enumerator [my -get _NewEnum] + # This gives us an IUnknown. + ::twapi::trap { + # Convert the IUnknown to IEnumVARIANT + set iter [$enumerator @QueryInterface IEnumVARIANT] + if {! [$iter @Null?]} { + set more 1 + while {$more} { + # Get the next item from iterator + set next [$iter Next 1] + lassign $next more values + if {[llength $values]} { + set var [::twapi::variant_value [lindex $values 0] 0 0 $_lcid] + set ret [catch {uplevel 1 $script} msg options] + switch -exact -- $ret { + 0 - + 4 { + # Body executed successfully, or invoked continue + if {$opts(cleanup)} { + $var destroy + } + } + 3 { + if {$opts(cleanup)} { + $var destroy + } + set more 0; # TCL_BREAK + } + 1 - + 2 - + default { + if {$opts(cleanup)} { + $var destroy + } + dict incr options -level + return -options $options $msg + } + + } + } + } + } + } finally { + $enumerator Release + if {[info exists iter] && ![$iter @Null?]} { + $iter Release + } + } + return + } + + method -bind {script} { + my variable _proxy _sinks _connection_pts + + # Get the coclass typeinfo and locate the source interface + # within it and retrieve disp id mappings + ::twapi::trap { + set coti [$_proxy @GetCoClassTypeInfo] + + # $coti is the coclass information. Get dispids for the default + # source interface for events and its guid + set srcti [$coti @GetDefaultSourceTypeInfo] + array set srcinfo [$srcti @GetTypeAttr -memidmap -guid] + + # TBD - implement IConnectionPointContainerProxy + # Now we need to get the actual connection point itself + set container [$_proxy QueryInterface IConnectionPointContainer] + set connpt_ifc [::twapi::IConnectionPointContainer_FindConnectionPoint $container $srcinfo(-guid)] + + # Finally, create our sink object + # TBD - need to make sure Automation object is not deleted or + # should the callback itself check? + # TBD - what guid should we be passing? CLSID or IID ? + set sink_ifc [::twapi::Twapi_ComServer $srcinfo(-guid) $srcinfo(-memidmap) [list ::twapi::_eventsink_callback [self] $script]] + + # OK, we finally have everything we need. Tell the event source + set sinkid [::twapi::IConnectionPoint_Advise $connpt_ifc $sink_ifc] + + set _sinks($sinkid) $sink_ifc + set _connection_pts($sinkid) $connpt_ifc + return $sinkid + } onerror {} { + # These are released only on error as otherwise they have + # to be kept until unbind time + foreach ifc {connpt_ifc sink_ifc} { + if {[info exists $ifc] && [set $ifc] ne ""} { + ::twapi::IUnknown_Release [set $ifc] + } + } + twapi::rethrow + } finally { + # In all cases, release any interfaces we created + # Note connpt_ifc and sink_ifc are released at unbind time except + # on error + foreach obj {coti srcti} { + if {[info exists $obj]} { + [set $obj] Release + } + } + if {[info exists container]} { + ::twapi::IUnknown_Release $container + } + } + } + + method -unbind {sinkid} { + my variable _proxy _sinks _connection_pts + + if {[info exists _connection_pts($sinkid)]} { + ::twapi::IConnectionPoint_Unadvise $_connection_pts($sinkid) $sinkid + unset _connection_pts($sinkid) + } + + if {[info exists _sinks($sinkid)]} { + ::twapi::IUnknown_Release $_sinks($sinkid) + unset _sinks($sinkid) + } + return + } + + method -securityblanket {args} { + my variable _proxy + if {[llength $args]} { + $_proxy @SetSecurityBlanket [lindex $args 0] + return + } else { + return [$_proxy @GetSecurityBlanket] + } + } + + method -lcid {{lcid ""}} { + my variable _lcid + if {$lcid ne ""} { + if {![string is integer -strict $lcid]} { + error "Invalid LCID $lcid" + } + set _lcid $lcid + } + return $_lcid + } + + method unknown {name args} { + # We have to figure out if it is a property get, property put + # or a method. We make a guess based on number of parameters. + # We specify an order to try based on this. The invoke will try + # all invocations in that order. + set nargs [llength $args] + if {$nargs == 0} { + # No arguments, cannot be propput*. Try propget and method + set invkinds [list 2 1] + } elseif {$nargs == 1} { + # One argument, likely propput, method, propget, propputref + # propputref is last as least likely + set invkinds [list 4 1 2 8] + } else { + # Multiple arguments, likely method, propput, propget, propputref + # propputref is last as least likely + set invkinds [list 1 4 2 8] + } + + return [my _invoke $name $invkinds $args] + } + + twapi_exportall +} + +# +# Singleton NULL comobj object. We want to override default destroy methods +# to prevent object from being destroyed. This is a backward compatibility +# hack and not fool proof since the command could just be renamed away. +twapi::class create twapi::NullAutomation { + superclass twapi::Automation + constructor {} { + next [twapi::make_interface_proxy {0 IDispatch}] + } + method -destroy {} { + # Silently ignore + } + method destroy {} { + # Silently ignore + } + twapi_exportall +} + +twapi::NullAutomation create twapi::comobj_null +# twapi::Automation create twapi::comobj_null [twapi::make_interface_proxy {0 IDispatch}] + +proc twapi::_comobj_cleanup {} { + foreach obj [comobj_instances] { + $obj destroy + } +} + +# In order for servers to release objects properly, the IUnknown interface +# must have the same security settings as were used in the object creation +# call. This is a helper for that. +proc twapi::_com_set_iunknown_proxy {ifc blanket} { + set iunk [Twapi_IUnknown_QueryInterface $ifc [_iid_iunknown] IUnknown] + trap { + CoSetProxyBlanket $iunk {*}$blanket + } finally { + IUnknown_Release $iunk + } +} + + +twapi::proc* twapi::_init_authnames {} { + variable _com_authsvc_to_name + variable _com_name_to_authsvc + variable _com_impersonation_to_name + variable _com_name_to_impersonation + variable _com_authlevel_to_name + variable _com_name_to_authlevel + + set _com_authsvc_to_name {0 none 9 negotiate 10 ntlm 14 schannel 16 kerberos 0xffffffff default} + set _com_name_to_authsvc [swapl $_com_authsvc_to_name] + set _com_name_to_impersonation {default 0 anonymous 1 identify 2 impersonate 3 delegate 4} + set _com_impersonation_to_name [swapl $_com_name_to_impersonation] + set _com_name_to_authlevel {default 0 none 1 connect 2 call 3 packet 4 packetintegrity 5 privacy 6} + set _com_authlevel_to_name [swapl $_com_name_to_authlevel] +} { +} + +twapi::proc* twapi::_com_authsvc_to_name {authsvc} { + _init_authnames +} { + variable _com_authsvc_to_name + return [dict* $_com_authsvc_to_name $authsvc] +} + +twapi::proc* twapi::_com_name_to_authsvc {name} { + _init_authnames +} { + variable _com_name_to_authsvc + if {[string is integer -strict $name]} { + return $name + } + return [dict! $_com_name_to_authsvc $name] +} + +twapi::proc* twapi::_com_authlevel_to_name {authlevel} { + _init_authnames +} { + variable _com_authlevel_to_name + return [dict* $_com_authlevel_to_name $authlevel] +} + +twapi::proc* twapi::_com_name_to_authlevel {name} { + _init_authnames +} { + variable _com_name_to_authlevel + if {[string is integer -strict $name]} { + return $name + } + return [dict! $_com_name_to_authlevel $name] +} + + +twapi::proc* twapi::_com_impersonation_to_name {imp} { + _init_authnames +} { + variable _com_impersonation_to_name + return [dict* $_com_impersonation_to_name $imp] +} + +twapi::proc* twapi::_com_name_to_impersonation {name} { + _init_authnames +} { + variable _com_name_to_impersonation + if {[string is integer -strict $name]} { + return $name + } + return [dict! $_com_name_to_impersonation $name] +} + +################################################################# +# COM server implementation +# WARNING: do not use any fancy TclOO features because it has to +# run under 8.5/metoo as well +# TBD - test scripts? + +twapi::class create twapi::ComFactory { + constructor {clsid member_map create_command_prefix} { + my variable _clsid _create_command_prefix _member_map _ifc + + set _clsid $clsid + set _member_map $member_map + set _create_command_prefix $create_command_prefix + + set _ifc [twapi::Twapi_ClassFactory $_clsid [list [self] _create_instance]] + } + + destructor { + # TBD - what happens if factory is destroyed while objects still + # exist ? + # App MUST explicitly destroy objects before exiting + my variable _class_registration_id + if {[info exists _class_registration_id]} { + twapi::CoRevokeClassObject $_class_registration_id + } + } + + # Called from Twapi_ClassFactory_CreateInstance to create a new object + # Should not be called from elsewhere + method _create_instance {iid} { + my variable _create_command_prefix _member_map + # Note [list {*}$foo] != $foo - consider when foo contains a ";" + set obj_prefix [uplevel #0 [list {*}$_create_command_prefix]] + twapi::trap { + # Since we are not holding on to this interface ourselves, + # we can pass it on without AddRef'ing it + return [twapi::Twapi_ComServer $iid $_member_map $obj_prefix] + } onerror {} { + $obj_prefix destroy + twapi::rethrow + } + } + + method register {args} { + my variable _clsid _create_command_prefix _member_map _ifc _class_registration_id + twapi::parseargs args { + {model.arg any} + } -setvars -maxleftover 0 + set model_flags 0 + foreach m $model { + switch -exact -- $m { + any {twapi::setbits model_flags 20} + localserver {twapi::setbits model_flags 4} + remoteserver {twapi::setbits model_flags 16} + default {twapi::badargs! "Invalid COM class model '$m'"} + } + } + + # 0x6 -> REGCLS_MULTI_SEPARATE | REGCLS_SUSPENDED + set _class_registration_id [twapi::CoRegisterClassObject $_clsid $_ifc $model_flags 0x6] + return + } + + export _create_instance +} + +proc twapi::comserver_factory {clsid member_map command_prefix {name {}}} { + if {$name ne ""} { + uplevel 1 [list [namespace current]::ComFactory create $name $clsid $member_map $command_prefix] + } else { + uplevel 1 [list [namespace current]::ComFactory new $clsid $member_map $command_prefix] + } +} + +proc twapi::start_factories {{cmd {}}} { + # TBD - what if no class objects ? + CoResumeClassObjects + + if {[llength $cmd]} { + # TBD - normalize $cmd so to run in right namespace etc. + trace add variable [namspace current]::com_shutdown_signal write $cmd + return + } + + # This is set from the C code when we are not serving up any + # COM objects (either event callbacks or com servers) + vwait [namespace current]::com_shutdown_signal +} + +proc twapi::suspend_factories {} { + CoSuspendClassObjects +} + +proc twapi::resume_factories {} { + CoResumeClassObjects +} + +proc twapi::install_coclass_script {progid clsid version script_path args} { + # Need to extract params so we can prefix script name + set saved_args $args + array set opts [parseargs args { + params.arg + } -ignoreunknown] + + set script_path [file normalize $script_path] + + # Try to locate the wish executable to run the component + if {[info commands wm] eq ""} { + set dir [file dirname [info nameofexecutable]] + set wishes [glob -nocomplain -directory $dir wish*.exe] + if {[llength $wishes] == 0} { + error "Could not locate wish program." + } + set wish [lindex $wishes 0] + } else { + # We are running wish already + set wish [info nameofexecutable] + } + + set exe_path [file nativename [file attributes $wish -shortname]] + + set params "\"$script_path\"" + if {[info exists opts(params)]} { + append params " $params" + } + return [install_coclass $progid $clsid $version $exe_path {*}$args -outproc -params $params] +} + +proc twapi::install_coclass {progid clsid version path args} { + array set opts [twapi::parseargs args { + {scope.arg user {user system}} + appid.arg + appname.arg + inproc + outproc + service + params.arg + name.arg + } -maxleftover 0] + + switch [tcl::mathop::+ $opts(inproc) $opts(outproc) $opts(service)] { + 0 { + # Need to figure out the type + switch [file extension $path] { + .exe { set opts(outproc) 1 } + .ocx - + .dll { set opts(inproc) 1 } + default { set opts(service) 1 } + } + } + 1 {} + default { + badargs! "Only one of -inproc, -outproc or -service may be specified" + } + } + + if {(! [string is integer -strict $version]) || $version <= 0} { + twapi::badargs! "Invalid version '$version'. Must be a positive integer" + } + if {![regexp {^[[:alpha:]][[:alnum:]]*\.[[:alpha:]][[:alnum:]]*$} $progid]} { + badargs! "Invalid PROGID syntax '$progid'" + } + set clsid [canonicalize_guid $clsid] + if {![info exists opts(appid)]} { + # This is what dcomcnfg and oleview do - default to the CLSID + set opts(appid) $clsid + } else { + set opts(appid) [canonicalize_guid $opts(appid)] + } + + if {$opts(scope) eq "user"} { + if {$opts(service)} { + twapi::badargs! "Option -service cannot be specified if -scope is \"user\"" + } + set regtop HKEY_CURRENT_USER + } else { + set regtop HKEY_LOCAL_MACHINE + } + + set progid_path "$regtop\\Software\\Classes\\$progid" + set clsid_path "$regtop\\Software\\Classes\\CLSID\\$clsid" + set appid_path "$regtop\\Software\\Classes\\AppID\\$opts(appid)" + + if {$opts(service)} { + # TBD + badargs! "Option -service is not implemented" + } elseif {$opts(outproc)} { + if {[info exists opts(params)]} { + registry set "$clsid_path\\LocalServer32" "" "\"[file nativename [file normalize $path]]\" $opts(params)" + } else { + registry set "$clsid_path\\LocalServer32" "" "\"[file nativename [file normalize $path]]\"" + } + # TBD - We do not quote path for ServerExecutable, should we ? + registry set "$clsid_path\\LocalServer32" "ServerExecutable" [file nativename [file normalize $path]] + } else { + # TBD - We do not quote path here either, should we ? + registry set "$clsid_path\\InprocServer32" "" [file nativename [file normalize $path]] + } + + registry set "$clsid_path\\ProgID" "" "$progid.$version" + registry set "$clsid_path\\VersionIndependentProgID" "" $progid + + # Set the registry under the progid and progid.version + registry set "$progid_path\\CLSID" "" $clsid + registry set "$progid_path\\CurVer" "" "$progid.$version" + if {[info exists opts(name)]} { + registry set $progid_path "" $opts(name) + } + + append progid_path ".$version" + registry set "$progid_path\\CLSID" "" $clsid + if {[info exists opts(name)]} { + registry set $progid_path "" $opts(name) + } + + registry set $clsid_path "AppID" $opts(appid) + registry set $appid_path; # Always create the key even if nothing below + if {[info exists opts(appname)]} { + registry set $appid_path "" $opts(appname) + } + + if {$opts(service)} { + registry set $appid_path "LocalService" $path + if {[info exists opts(params)]} { + registry set $appid_path "ServiceParameters" $opts(params) + } + } + + return +} + +proc twapi::uninstall_coclass {progid args} { + # Note "CLSID" itself is a valid ProgID (it has a CLSID key below it) + # Also we want to protect against horrible errors that blow away + # entire branches if progid is empty, wrong value, etc. + # So only work with keys of the form X.X + if {![regexp {^[[:alpha:]][[:alnum:]]*\.[[:alpha:]][[:alnum:]]*$} $progid]} { + badargs! "Invalid PROGID syntax '$progid'" + } + + # Do NOT want to delete the CLSID key by mistake. Note below checks + # will not protect against this since they will return a valid value + # if progid is "CLSID" since that has a CLSID key below it as well. + if {[string equal -nocase $progid CLSID]} { + badargs! "Attempt to delete protected key 'CLSID'" + } + + array set opts [twapi::parseargs args { + {scope.arg user {user system}} + keepappid + } -maxleftover 0] + + switch -exact -- $opts(scope) { + user { set regtop HKEY_CURRENT_USER } + system { set regtop HKEY_LOCAL_MACHINE } + default { + badargs! "Invalid class registration scope '$opts(scope)'. Must be 'user' or 'system'" + } + } + + if {0} { + # Do NOT use this. If running under elevated, it will ignore + # HKEY_CURRENT_USER. + set clsid [progid_to_clsid $progid]; # Also protects against bogus progids + } else { + set clsid [registry get "$regtop\\Software\\Classes\\$progid\\CLSID" ""] + } + + # Should not be empty at this point but do not want to delete the + # whole Classes tree in case progid or clsid are empty strings + # because of some bug! That would be an epic disaster so try and + # protect. + if {$clsid eq ""} { + badargs! "CLSID corresponding to PROGID '$progid' is empty" + } + + # See if we need to delete the linked current version + if {! [catch { + registry get "$regtop\\Software\\Classes\\$progid\\CurVer" "" + } curver]} { + if {[string match -nocase ${progid}.* $curver]} { + registry delete "$regtop\\Software\\Classes\\$curver" + } + } + + # See if we need to delete the APPID + if {! $opts(keepappid)} { + if {! [catch { + registry get "$regtop\\Software\\Classes\\CLSID\\$clsid" "AppID" + } appid]} { + # Validate it is a real GUID + if {![catch {canonicalize_guid $appid}]} { + registry delete "$regtop\\Software\\Classes\\AppID\\$appid" + } + } + } + + # Finally delete the keys and hope we have not trashed the system + registry delete "$regtop\\Software\\Classes\\CLSID\\$clsid" + registry delete "$regtop\\Software\\Classes\\$progid" + + return +} + + diff --git a/src/punk86.vfs/lib/twapi4.7.2/console.tcl b/src/punk86.vfs/lib/twapi4.7.2/console.tcl new file mode 100644 index 00000000..3f503040 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/console.tcl @@ -0,0 +1,736 @@ +# +# Copyright (c) 2004-2014, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi { +} + +# Allocate a new console +proc twapi::allocate_console {} { + AllocConsole +} + +# Free a console +proc twapi::free_console {} { + FreeConsole +} + +# Get a console handle +proc twapi::get_console_handle {type} { + switch -exact -- $type { + 0 - + stdin { set fn "CONIN\$" } + 1 - + stdout - + 2 - + stderr { set fn "CONOUT\$" } + default { + error "Unknown console handle type '$type'" + } + } + + # 0xC0000000 -> GENERIC_READ | GENERIC_WRITE + # 3 -> FILE_SHARE_READ | FILE_SHARE_WRITE + # 3 -> OPEN_EXISTING + return [CreateFile $fn \ + 0xC0000000 \ + 3 \ + {{} 1} \ + 3 \ + 0 \ + NULL] +} + +proc twapi::_standard_handle_type {type} { + if {[string is integer -strict $type]} { + set type [format %d $type] ; # Convert hex etc. + } + switch -exact -- $type { + 0 - + -10 - + stdin { set type -10 } + 1 - + -11 - + stdout { set type -11 } + 2 - + -12 - + stderr { set type -12 } + default { + error "Unknown console handle type '$type'" + } + } + return $type +} + +# Get a console handle +proc twapi::get_standard_handle {type} { + return [GetStdHandle [_standard_handle_type $type]] +} + +# Set a console handle +proc twapi::set_standard_handle {type handle} { + return [SetStdHandle [_standard_handle_type $type] $handle] +} + +proc twapi::_console_output_attr_to_flags {attrs} { + set flags 0 + foreach {attr bool} $attrs { + if {$bool} { + set flags [expr {$flags | [_console_output_attr $attr]}] + } + } + return $flags +} + +proc twapi::_flags_to_console_output_attr {flags} { + # Check for multiple bit attributes first, in order + set attrs {} + foreach attr { + -fgwhite -bgwhite -fggray -bggray + -fgturquoise -bgturquoise -fgpurple -bgpurple -fgyellow -bgyellow + -fgred -bgred -fggreen -bggreen -fgblue -bgblue + -fgbright -bgbright + } { + if {($flags & [_console_output_attr $attr]) == [_console_output_attr $attr]} { + lappend attrs $attr 1 + set flags [expr {$flags & ~ [_console_output_attr $attr]}] + if {$flags == 0} { + break + } + } + } + + return $attrs +} + + +# Get the current mode settings for the console +proc twapi::_get_console_input_mode {conh} { + set mode [GetConsoleMode $conh] + return [_bitmask_to_switches $mode [_console_input_mode_syms]] +} +interp alias {} twapi::get_console_input_mode {} twapi::_do_console_proc twapi::_get_console_input_mode stdin + +# Get the current mode settings for the console +proc twapi::_get_console_output_mode {conh} { + set mode [GetConsoleMode $conh] + return [_bitmask_to_switches $mode [_console_output_mode_syms]] +} +interp alias {} twapi::get_console_output_mode {} twapi::_do_console_proc twapi::_get_console_output_mode stdout + +# Set console input mode +proc twapi::_set_console_input_mode {conh args} { + set mode [_switches_to_bitmask $args [_console_input_mode_syms]] + # If insertmode or quickedit mode are set, make sure to set extended bit + if {$mode & 0x60} { + setbits mode 0x80; # ENABLE_EXTENDED_FLAGS + } + + SetConsoleMode $conh $mode +} +interp alias {} twapi::set_console_input_mode {} twapi::_do_console_proc twapi::_set_console_input_mode stdin + +# Modify console input mode +proc twapi::_modify_console_input_mode {conh args} { + set prev [GetConsoleMode $conh] + set mode [_switches_to_bitmask $args [_console_input_mode_syms] $prev] + # If insertmode or quickedit mode are set, make sure to set extended bit + if {$mode & 0x60} { + setbits mode 0x80; # ENABLE_EXTENDED_FLAGS + } + + SetConsoleMode $conh $mode + # Returns the old modes + return [_bitmask_to_switches $prev [_console_input_mode_syms]] +} +interp alias {} twapi::modify_console_input_mode {} twapi::_do_console_proc twapi::_modify_console_input_mode stdin + +# +# Set console output mode +proc twapi::_set_console_output_mode {conh args} { + set mode [_switches_to_bitmask $args [_console_output_mode_syms]] + + SetConsoleMode $conh $mode + +} +interp alias {} twapi::set_console_output_mode {} twapi::_do_console_proc twapi::_set_console_output_mode stdout + +# Set console output mode +proc twapi::_modify_console_output_mode {conh args} { + set prev [GetConsoleMode $conh] + set mode [_switches_to_bitmask $args [_console_output_mode_syms] $prev] + + SetConsoleMode $conh $mode + # Returns the old modes + return [_bitmask_to_switches $prev [_console_output_mode_syms]] +} +interp alias {} twapi::modify_console_output_mode {} twapi::_do_console_proc twapi::_modify_console_output_mode stdout + + +# Create and return a handle to a screen buffer +proc twapi::create_console_screen_buffer {args} { + array set opts [parseargs args { + {inherit.bool 0} + {mode.arg readwrite {read write readwrite}} + {secd.arg ""} + {share.arg readwrite {none read write readwrite}} + } -maxleftover 0] + + switch -exact -- $opts(mode) { + read { set mode [_access_rights_to_mask generic_read] } + write { set mode [_access_rights_to_mask generic_write] } + readwrite { + set mode [_access_rights_to_mask {generic_read generic_write}] + } + } + switch -exact -- $opts(share) { + none { + set share 0 + } + read { + set share 1 ;# FILE_SHARE_READ + } + write { + set share 2 ;# FILE_SHARE_WRITE + } + readwrite { + set share 3 + } + } + + return [CreateConsoleScreenBuffer \ + $mode \ + $share \ + [_make_secattr $opts(secd) $opts(inherit)] \ + 1] +} + +# Retrieve information about a console screen buffer +proc twapi::_get_console_screen_buffer_info {conh args} { + array set opts [parseargs args { + all + textattr + cursorpos + maxwindowsize + size + windowlocation + windowpos + windowsize + } -maxleftover 0] + + lassign [GetConsoleScreenBufferInfo $conh] size cursorpos textattr windowlocation maxwindowsize + + set result [list ] + foreach opt {size cursorpos maxwindowsize windowlocation} { + if {$opts($opt) || $opts(all)} { + lappend result -$opt [set $opt] + } + } + + if {$opts(windowpos) || $opts(all)} { + lappend result -windowpos [lrange $windowlocation 0 1] + } + + if {$opts(windowsize) || $opts(all)} { + lassign $windowlocation left top right bot + lappend result -windowsize [list [expr {$right-$left+1}] [expr {$bot-$top+1}]] + } + + if {$opts(textattr) || $opts(all)} { + lappend result -textattr [_flags_to_console_output_attr $textattr] + } + + return $result +} +interp alias {} twapi::get_console_screen_buffer_info {} twapi::_do_console_proc twapi::_get_console_screen_buffer_info stdout + +# Set the cursor position +proc twapi::_set_console_cursor_position {conh pos} { + SetConsoleCursorPosition $conh $pos +} +interp alias {} twapi::set_console_cursor_position {} twapi::_do_console_proc twapi::_set_console_cursor_position stdout + +# Get the cursor position +proc twapi::get_console_cursor_position {conh} { + return [lindex [get_console_screen_buffer_info $conh -cursorpos] 1] +} + +# Write the specified string to the console +proc twapi::_console_write {conh s args} { + # Note writes are always in raw mode, + # TBD - support for scrolling + # TBD - support for attributes + + array set opts [parseargs args { + position.arg + {newlinemode.arg column {line column}} + {restoreposition.bool 0} + } -maxleftover 0] + + # Get screen buffer info including cursor position + array set csbi [get_console_screen_buffer_info $conh -cursorpos -size] + + # Get current console mode for later restoration + # If console is in processed mode, set it to raw mode + set oldmode [get_console_output_mode $conh] + set processed_index [lsearch -exact $oldmode "processed"] + if {$processed_index >= 0} { + # Console was in processed mode. Set it to raw mode + set newmode [lreplace $oldmode $processed_index $processed_index] + set_console_output_mode $conh $newmode + } + + trap { + # x,y are starting position to write + if {[info exists opts(position)]} { + lassign [_parse_integer_pair $opts(position)] x y + } else { + # No position specified, get current cursor position + lassign $csbi(-cursorpos) x y + } + + set startx [expr {$opts(newlinemode) == "column" ? $x : 0}] + + # Get screen buffer limits + lassign $csbi(-size) width height + + # Ensure line terminations are just \n + set s [string map [list \r\n \n] $s] + + # Write out each line at ($x,$y) + # Either \r or \n is considered a newline + foreach line [split $s \r\n] { + if {$y >= $height} break + set_console_cursor_position $conh [list $x $y] + if {$x < $width} { + # Write the characters - do not write more than buffer width + set num_chars [expr {$width-$x}] + if {[string length $line] < $num_chars} { + set num_chars [string length $line] + } + WriteConsole $conh $line $num_chars + } + + + # Calculate starting position of next line + incr y + set x $startx + } + + } finally { + # Restore cursor if requested + if {$opts(restoreposition)} { + set_console_cursor_position $conh $csbi(-cursorpos) + } + # Restore output mode if changed + if {[info exists newmode]} { + set_console_output_mode $conh $oldmode + } + } + + return +} +interp alias {} twapi::write_console {} twapi::_do_console_proc twapi::_console_write stdout +interp alias {} twapi::console_write {} twapi::_do_console_proc twapi::_console_write stdout + +# Fill an area of the console with the specified attribute +proc twapi::_fill_console {conh args} { + array set opts [parseargs args { + position.arg + numlines.int + numcols.int + {mode.arg column {line column}} + window.bool + fillchar.arg + } -ignoreunknown] + + # args will now contain attribute switches if any + set attr [_console_output_attr_to_flags $args] + + # Get screen buffer info for window and size of buffer + array set csbi [get_console_screen_buffer_info $conh -windowpos -windowsize -size] + # Height and width of the console + lassign $csbi(-size) conx cony + + # Figure out what area we want to fill + # startx,starty are starting position to write + # sizex, sizey are the number of rows/lines + if {[info exists opts(window)]} { + if {[info exists opts(numlines)] || [info exists opts(numcols)] + || [info exists opts(position)]} { + error "Option -window cannot be used togther with options -position, -numlines or -numcols" + } + lassign [_parse_integer_pair $csbi(-windowpos)] startx starty + lassign [_parse_integer_pair $csbi(-windowsize)] sizex sizey + } else { + if {[info exists opts(position)]} { + lassign [_parse_integer_pair $opts(position)] startx starty + } else { + set startx 0 + set starty 0 + } + if {[info exists opts(numlines)]} { + set sizey $opts(numlines) + } else { + set sizey $cony + } + if {[info exists opts(numcols)]} { + set sizex $opts(numcols) + } else { + set sizex [expr {$conx - $startx}] + } + } + + set firstcol [expr {$opts(mode) == "column" ? $startx : 0}] + + # Fill attribute at ($x,$y) + set x $startx + set y $starty + while {$y < $cony && $y < ($starty + $sizey)} { + if {$x < $conx} { + # Write the characters - do not write more than buffer width + set max [expr {$conx-$x}] + if {[info exists attr]} { + FillConsoleOutputAttribute $conh $attr [expr {$sizex > $max ? $max : $sizex}] [list $x $y] + } + if {[info exists opts(fillchar)]} { + FillConsoleOutputCharacter $conh $opts(fillchar) [expr {$sizex > $max ? $max : $sizex}] [list $x $y] + } + } + + # Calculate starting position of next line + incr y + set x $firstcol + } + + return +} +interp alias {} twapi::fill_console {} twapi::_do_console_proc twapi::_fill_console stdout + +# Clear the console +proc twapi::_clear_console {conh args} { + # I support we could just call fill_console but this code was already + # written and is faster + array set opts [parseargs args { + {fillchar.arg " "} + {windowonly.bool 0} + } -maxleftover 0] + + array set cinfo [get_console_screen_buffer_info $conh -size -windowpos -windowsize] + lassign $cinfo(-size) width height + if {$opts(windowonly)} { + # Only clear portion visible in the window. We have to do this + # line by line since we do not want to erase text scrolled off + # the window either in the vertical or horizontal direction + lassign $cinfo(-windowpos) x y + lassign $cinfo(-windowsize) w h + for {set i 0} {$i < $h} {incr i} { + FillConsoleOutputCharacter \ + $conh \ + $opts(fillchar) \ + $w \ + [list $x [expr {$y+$i}]] + } + } else { + FillConsoleOutputCharacter \ + $conh \ + $opts(fillchar) \ + [expr {($width*$height) }] \ + [list 0 0] + } + return +} +interp alias {} twapi::clear_console {} twapi::_do_console_proc twapi::_clear_console stdout +# +# Flush console input +proc twapi::_flush_console_input {conh} { + FlushConsoleInputBuffer $conh +} +interp alias {} twapi::flush_console_input {} twapi::_do_console_proc twapi::_flush_console_input stdin + +# Return number of pending console input events +proc twapi::_get_console_pending_input_count {conh} { + return [GetNumberOfConsoleInputEvents $conh] +} +interp alias {} twapi::get_console_pending_input_count {} twapi::_do_console_proc twapi::_get_console_pending_input_count stdin + +# Generate a console control event +proc twapi::generate_console_control_event {event {procgrp 0}} { + switch -exact -- $event { + ctrl-c {set event 0} + ctrl-break {set event 1} + default {error "Invalid event definition '$event'"} + } + GenerateConsoleCtrlEvent $event $procgrp +} + +# Get number of mouse buttons +proc twapi::num_console_mouse_buttons {} { + return [GetNumberOfConsoleMouseButtons] +} + +# Get console title text +proc twapi::get_console_title {} { + return [GetConsoleTitle] +} + +# Set console title text +proc twapi::set_console_title {title} { + return [SetConsoleTitle $title] +} + +# Get the handle to the console window +proc twapi::get_console_window {} { + return [GetConsoleWindow] +} + +# Get the largest console window size +proc twapi::_get_console_window_maxsize {conh} { + return [GetLargestConsoleWindowSize $conh] +} +interp alias {} twapi::get_console_window_maxsize {} twapi::_do_console_proc twapi::_get_console_window_maxsize stdout + +proc twapi::_set_console_active_screen_buffer {conh} { + SetConsoleActiveScreenBuffer $conh +} +interp alias {} twapi::set_console_active_screen_buffer {} twapi::_do_console_proc twapi::_set_console_active_screen_buffer stdout + +# Set the size of the console screen buffer +proc twapi::_set_console_screen_buffer_size {conh size} { + SetConsoleScreenBufferSize $conh [_parse_integer_pair $size] +} +interp alias {} twapi::set_console_screen_buffer_size {} twapi::_do_console_proc twapi::_set_console_screen_buffer_size stdout + +# Set the default text attribute +proc twapi::_set_console_default_attr {conh args} { + SetConsoleTextAttribute $conh [_console_output_attr_to_flags $args] +} +interp alias {} twapi::set_console_default_attr {} twapi::_do_console_proc twapi::_set_console_default_attr stdout + +# Set the console window position +proc twapi::_set_console_window_location {conh rect args} { + array set opts [parseargs args { + {absolute.bool true} + } -maxleftover 0] + + SetConsoleWindowInfo $conh $opts(absolute) $rect +} +interp alias {} twapi::set_console_window_location {} twapi::_do_console_proc twapi::_set_console_window_location stdout + +proc twapi::get_console_window_location {conh} { + return [lindex [get_console_screen_buffer_info $conh -windowlocation] 1] +} + +# Get the console code page +proc twapi::get_console_output_codepage {} { + return [GetConsoleOutputCP] +} + +# Set the console code page +proc twapi::set_console_output_codepage {cp} { + SetConsoleOutputCP $cp +} + +# Get the console input code page +proc twapi::get_console_input_codepage {} { + return [GetConsoleCP] +} + +# Set the console input code page +proc twapi::set_console_input_codepage {cp} { + SetConsoleCP $cp +} + +# Read a line of input +proc twapi::_console_read {conh args} { + if {[llength $args]} { + set oldmode [modify_console_input_mode $conh {*}$args] + } + trap { + return [ReadConsole $conh 1024] + } finally { + if {[info exists oldmode]} { + set_console_input_mode $conh {*}$oldmode + } + } +} +interp alias {} twapi::console_read {} twapi::_do_console_proc twapi::_console_read stdin + +proc twapi::_map_console_controlkeys {control} { + return [_make_symbolic_bitmask $control { + capslock 0x80 + enhanced 0x100 + leftalt 0x2 + leftctrl 0x8 + numlock 0x20 + rightalt 0x1 + rightctrl 4 + scrolllock 0x40 + shift 0x10 + } 0] +} + +proc twapi::_console_read_input_records {conh args} { + parseargs args { + {count.int 1} + peek + } -setvars -maxleftover 0 + set recs {} + if {$peek} { + set input [PeekConsoleInput $conh $count] + } else { + set input [ReadConsoleInput $conh $count] + } + foreach rec $input { + switch [format %d [lindex $rec 0]] { + 1 { + lassign [lindex $rec 1] keydown repeat keycode scancode char controlstate + lappend recs \ + [list key [list \ + keystate [expr {$keydown ? "down" : "up"}] \ + repeat $repeat keycode $keycode \ + scancode $scancode char $char \ + controls [_map_console_controlkeys $controlstate]]] + } + 2 { + lassign [lindex $rec 1] position buttonstate controlstate flags + set buttons {} + if {[expr {$buttonstate & 0x1}]} {lappend buttons left} + if {[expr {$buttonstate & 0x2}]} {lappend buttons right} + if {[expr {$buttonstate & 0x4}]} {lappend buttons left2} + if {[expr {$buttonstate & 0x8}]} {lappend buttons left3} + if {[expr {$buttonstate & 0x10}]} {lappend buttons left4} + if {$flags & 0x8} { + set horizontalwheel [expr {$buttonstate >> 16}] + } else { + set horizontalwheel 0 + } + if {$flags & 0x4} { + set verticalwheel [expr {$buttonstate >> 16}] + } else { + set verticalwheel 0 + } + lappend recs \ + [list mouse [list \ + position $position \ + buttons $buttons \ + controls [_map_console_controlkeys $controlstate] \ + doubleclick [expr {$flags & 0x2}] \ + horizontalwheel $horizontalwheel \ + moved [expr {$flags & 0x1}] \ + verticalwheel $verticalwheel]] + } + default { + lappend recs [list \ + [dict* {4 buffersize 8 menu 16 focus} [lindex $rec 0]] \ + [lindex $rec 1]] + } + } + } + return $recs +} +interp alias {} twapi::console_read_input_records {} twapi::_do_console_proc twapi::_console_read_input_records stdin + +# Set up a console handler +proc twapi::_console_ctrl_handler {ctrl} { + variable _console_control_script + if {[info exists _console_control_script]} { + return [uplevel #0 [linsert $_console_control_script end $ctrl]] + } + return 0; # Not handled +} +proc twapi::set_console_control_handler {script} { + variable _console_control_script + if {[string length $script]} { + if {![info exists _console_control_script]} { + Twapi_ConsoleEventNotifier 1 + } + set _console_control_script $script + } else { + if {[info exists _console_control_script]} { + Twapi_ConsoleEventNotifier 0 + unset _console_control_script + } + } +} + +# +# Utilities +# + +# Helper to call a proc after doing a stdin/stdout/stderr -> handle +# mapping. The handle is closed after calling the proc. The first +# arg in $args must be the console handle if $args is not an empty list +proc twapi::_do_console_proc {proc default args} { + if {[llength $args] == 0} { + set args [list $default] + } + set conh [lindex $args 0] + switch -exact -- [string tolower $conh] { + stdin - + stdout - + stderr { + set real_handle [get_console_handle $conh] + trap { + lset args 0 $real_handle + return [uplevel 1 [list $proc] $args] + } finally { + CloseHandle $real_handle + } + } + } + + return [uplevel 1 [list $proc] $args] +} + +proc twapi::_console_input_mode_syms {} { + return { + -processedinput 0x0001 + -lineinput 0x0002 + -echoinput 0x0004 + -windowinput 0x0008 + -mouseinput 0x0010 + -insertmode 0x0020 + -quickeditmode 0x0040 + -extendedmode 0x0080 + -autoposition 0x0100 + } +} + +proc twapi::_console_output_mode_syms {} { + return { -processedoutput 1 -wrapoutput 2 } +} + +twapi::proc* twapi::_console_output_attr {sym} { + variable _console_output_attr_syms + array set _console_output_attr_syms { + -fgblue 1 + -fggreen 2 + -fgturquoise 3 + -fgred 4 + -fgpurple 5 + -fgyellow 6 + -fggray 7 + -fgbright 8 + -fgwhite 15 + -bgblue 16 + -bggreen 32 + -bgturquoise 48 + -bgred 64 + -bgpurple 80 + -bgyellow 96 + -bggray 112 + -bgbright 128 + -bgwhite 240 + } +} { + variable _console_output_attr_syms + if {[info exists _console_output_attr_syms($sym)]} { + return $_console_output_attr_syms($sym) + } + + badargs! "Invalid console output attribute '$sym'" 3 +} + diff --git a/src/punk86.vfs/lib/twapi4.7.2/crypto.tcl b/src/punk86.vfs/lib/twapi4.7.2/crypto.tcl new file mode 100644 index 00000000..b7cc9c32 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/crypto.tcl @@ -0,0 +1,3457 @@ +# +# Copyright (c) 2007-2021, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi { + variable wintrust_guids + # Array key names match those in softpub.h in SDK + array set wintrust_guids { + action_generic_verify_v2 00AAC56B-CD44-11d0-8CC2-00C04FC295EE + action_trust_provider_test 573E31F8-DDBA-11d0-8CCB-00C04FC295EE + action_generic_cert_verify 189A3842-3041-11d1-85E1-00C04FC295EE + action_generic_chain_verify fc451c16-ac75-11d1-b4b8-00c04fb66ea0 + httpsprov_action 573E31F8-AABA-11d0-8CCB-00C04FC295EE + driver_action_verify F750E6C3-38EE-11d1-85E5-00C04FC295EE + } + + # Dictionaries used by capi_encrypt|decrypt_bytes to store partial blocks of data + # First level key is Crypto key handle + # Second level keys are Blocklen (block size in bytes) and Data (data bytes left over) + variable _capi_encrypt_partials + variable _capi_decrypt_partials + set _capi_encrypt_partials {} + set _capi_decrypt_partials {} +} + +### Hash functions + +proc twapi::capi_hash_create {hcrypt algid {hkey NULL}} { + return [CryptCreateHash $hcrypt [capi_algid $algid] $hkey] +} + +proc twapi::capi_hash_string {hhash s {enc utf-8}} { + return [capi_hash_bytes $hhash [encoding convertto $enc $s] 0] +} + +proc twapi::capi_hash_value {hhash} { + return [CryptGetHashParam $hhash 2]; # HP_HASHVAL +} + +proc twapi::capi_hash_sign {hhash keyspec args} { + # -pad not documented because new Windows version do not support X.931 + # and there are some openssl incompatibilities I cannot figure out + parseargs args { + {nohashoid.bool 0 1} + {pad.arg pkcs1 {pkcs1 x931}} + } -maxleftover 0 -setvars + set flags [expr {[dict get {pkcs1 0 x931 4} $pad] | $nohashoid}] + return [CryptSignHash $hhash [_crypt_keyspec $keyspec] "" $flags] +} + +proc twapi::capi_hash_verify {hhash sig hkey args} { + # -pad not documented because new Windows version do not support X.931 + # and there are some openssl incompatibilities I cannot figure out + parseargs args { + {nohashoid.bool 0 1} + {pad.arg pkcs1 {pkcs1 x931}} + } -maxleftover 0 -setvars + set flags [expr {[dict get {pkcs1 0 x931 4} $pad] | $nohashoid}] + return [CryptVerifySignature $hhash $sig $hkey "" $flags] +} + +proc twapi::_do_hash {csptype alg s {enc ""}} { + if {$enc ne ""} { + set s [encoding convertto $enc $s] + } + set hcrypt [crypt_acquire -csptype $csptype] + trap { + set hhash [capi_hash_create $hcrypt $alg] + capi_hash_bytes $hhash $s + return [capi_hash_value $hhash] + } finally { + if {[info exists hhash]} { + capi_hash_free $hhash + } + crypt_free $hcrypt + } +} + +interp alias {} twapi::md5 {} twapi::_do_hash prov_rsa_full md5 +interp alias {} twapi::sha1 {} twapi::_do_hash prov_rsa_full sha1 +interp alias {} twapi::sha256 {} twapi::_do_hash prov_rsa_aes sha_256 +interp alias {} twapi::sha384 {} twapi::_do_hash prov_rsa_aes sha_384 +interp alias {} twapi::sha512 {} twapi::_do_hash prov_rsa_aes sha_512 + +proc twapi::hmac {data key {prf sha1} {charset {}}} { + if {$charset ne ""} { + set data [encoding convertto $charset $data] + } + + # Choose prov_rsa_aes because older CSP's do not support sha256 + set hcrypt [crypt_acquire -csptype prov_rsa_aes] + try { + # The algorithm specified for importing the key actually is not + # executed at all. It's only used for importing the key. + # However it has to be something that will accept any key size. + # On Windows 8 at least, RC4 seems to require at least 5 byte keys. + # RC2 on the other hand, if the -ipsechmac flag is specifie + # will accept any number. TBD - the pbkdf2 source code implies + # on Win8.1 single byte keys will not be accepted by rc2 and + # keys need to be padded with 0's. Need to check that. + set hkey [crypt_import_key $hcrypt [capi_keyblob_concealed rc2 $key] -ipsechmac 1] + set hhash [capi_hash_create $hcrypt hmac $hkey] + # 5 -> HP_HMAC_INFO + CryptSetHashParam $hhash 5 [list [capi_algid $prf] "" ""] + capi_hash_bytes $hhash $data + return [capi_hash_value $hhash] + } finally { + if {[info exists hhash]} { + capi_hash_free $hhash + } + if {[info exists hkey]} { + capi_key_free $hkey + } + crypt_free $hcrypt + } +} + + +### Data protection + +proc twapi::protect_data {data args} { + + # Not used because doesn't seem to have any effect + # {promptonunprotect.bool 0 0x1} + parseargs args { + {description.arg ""} + {localmachine.bool 0 0x4} + {noui.bool 0 0x1} + {audit.bool 0 0x10} + {hwnd.arg NULL} + prompt.arg + } -setvars -maxleftover 0 + + if {[info exists prompt]} { + # 2 -> PROMPTONPROTECT + set prompt [list 2 $hwnd $prompt] + } else { + set prompt {} + } + + return [CryptProtectData $data $description "" "" $prompt [expr {$localmachine | $noui | $audit}]] +} + +proc twapi::unprotect_data {data args} { + # Do not seem to have any effect + # {promptonunprotect.bool 0 0x1} + # {promptonprotect.bool 0 0x2} + parseargs args { + {withdescription.bool 0} + {noui.bool 0 0x1} + {hwnd.arg NULL} + prompt.arg + } -setvars -maxleftover 0 + + if {[info exists prompt]} { + # 2 -> PROMPTONPROTECT + set prompt [list 2 $hwnd $prompt] + } else { + set prompt {} + } + + set data [CryptUnprotectData $data "" "" $prompt $noui] + if {$withdescription} { + return $data + } else { + return [lindex $data 0] + } +} + + + +################################################################ +# Certificate Stores + +# Close a certificate store +proc twapi::cert_store_release {hstore} { + CertCloseStore $hstore 0 + return +} + +proc twapi::cert_temporary_store {args} { + # TBD - add support for PKCS12_NO_PERSIST_KEY post-XP. If not + # specified and on XP document a means of getting rid of the key + # containers. See https://msdn.microsoft.com/en-us/library/ms867088.aspx#pk_topic6 + # Also CryptAcquireCertificatePrivateKey and GetCryptProvFromCert + # might be useful in this regard + parseargs args { + {encoding.arg {} {der pem {}}} + serialized.arg + pkcs7.arg + {password.arg ""} + pfx.arg + pkcs12.arg + {exportableprivatekeys.bool 0 1} + {userprotected.bool 0 2} + keysettype.arg + } -setvars -maxleftover 0 + + set nformats 0 + foreach format {serialized pkcs7 pfx pkcs12} { + if {[info exists $format]} { + set data [set $format] + incr nformats + } + } + if {$nformats > 1} { + badargs! "At most one of -pfx, -pkcs12, -pkcs7 or -serialized may be specified." + } + if {$nformats == 0} { + # 2 -> CERT_STORE_PROV_MEMORY + return [CertOpenStore 2 0 NULL 0 ""] + } + + # 0x10001 -> PKCS_7_ASN_ENCODING|X509_ASN_ENCODING + + if {[info exists serialized]} { + # 6 -> CERT_STORE_PROV_SERIALIZED + return [CertOpenStore 6 0x10001 NULL 0 $data] + } + + if {[info exists pkcs7]} { + # 5 -> CERT_STORE_PROV_PKCS7 + return [CertOpenStore 5 0x10001 NULL 0 [_pem_decode $data $encoding]] + } + + # PFX/PKCS12 + if {[string length $password] == 0} { + set password [conceal ""] + } + set flags 0 + if {[info exists keysettype]} { + set flags [dict! {user 0x1000 machine 0x20} $keysettype] + } + + set flags [tcl::mathop::| $flags $exportableprivatekeys $userprotected] + return [PFXImportCertStore $data $password $flags] +} + +proc twapi::cert_file_store_open {path args} { + set flags [_parse_store_open_opts $args] + + if {! ($flags & 0x00008000)} { + # If not readonly, set commitenable + set flags [expr {$flags | 0x00010000}] + } + + # 0x10001 -> PKCS_7_ASN_ENCODING|X509_ASN_ENCODING + # 8 -> CERT_STORE_PROV_FILENAME_W + return [CertOpenStore 8 0x10001 NULL $flags [file nativename [file normalize $path]]] +} + +proc twapi::cert_serialized_store_open {data args} { + set flags [_parse_store_open_opts $args] + + # 0x10001 -> PKCS_7_ASN_ENCODING|X509_ASN_ENCODING + # 6 -> CERT_STORE_PROV_SERIALIZED + return [CertOpenStore 6 0x10001 NULL $flags $data] +} + +proc twapi::cert_physical_store_open {name location args} { + variable _system_stores + + set flags [_parse_store_open_opts $args] + incr flags [_system_store_id $location] + # 14 -> CERT_STORE_PROV_PHYSICAL_W + return [CertOpenStore 14 0 NULL $flags $name] +} + +proc twapi::cert_physical_store_delete {name location} { + set flags 0x10; # CERT_STORE_DELETE_FLAG + incr flags [_system_store_id $location] + + # 14 -> CERT_STORE_PROV_PHYSICAL_W + return [CertOpenStore 14 0 NULL $flags $name] +} + +# TBD - document and figure out what format to return data in +proc twapi::cert_physical_stores {system_store_name location} { + return [CertEnumPhysicalStore $system_store_name [_system_store_id $location]] +} + +proc twapi::cert_system_store_open {name args} { + variable _system_stores + + if {[llength $args] == 0} { + return [CertOpenSystemStore $name] + } + + set flags [_parse_store_open_opts [lassign $args location]] + incr flags [_system_store_id $location] + return [CertOpenStore 10 0 NULL $flags $name] +} + +proc twapi::cert_system_store_delete {name location} { + set flags 0x10; # CERT_STORE_DELETE_FLAG + incr flags [_system_store_id $location] + return [CertOpenStore 10 0 NULL $flags $name] +} + +proc twapi::cert_system_store_locations {} { + set l {} + foreach e [CertEnumSystemStoreLocation 0] { + lappend l [lindex $e 0] + } + return $l +} + +proc twapi::cert_system_stores {location} { + set l {} + foreach e [CertEnumSystemStore [_system_store_id $location] ""] { + lappend l [lindex $e 0] + } + return $l +} + +proc twapi::cert_store_iterate {hstore varname script {type any} {term {}}} { + upvar 1 $varname cert + set cert NULL + while {1} { + set cert [cert_store_find_certificate $hstore $type $term $cert] + if {$cert eq ""} break + switch [catch {uplevel 1 $script} result options] { + 0 - + 4 { + # Normal execution or continue. Keep $cert to get next cert + # from store + } + 3 { + # break - get out of loop so free the last cert + cert_release $cert + set cert "" + return + } + 1 - + default { + cert_release $cert + set cert "" + return -options $options $result + } + } + } + return +} + +proc twapi::cert_store_find_certificate {hstore {type any} {term {}} {hcert NULL}} { + + # TBD subject_cert 11<<16 + # TBD key_spec 9<<16 + + set term_types { + any 0 + existing 13<<16 + key_identifier 15<<16 + md5_hash 4<<16 + subject_public_key_md5_hash 18<<16 + sha1_hash 1<<16 + signature_hash 14<<16 + issuer_name (2<<16)|4 + subject_name (2<<16)|7 + issuer_substring (8<<16)|4 + subject_substring (8<<16)|7 + property 5<<16 + public_key 6<<16 + } + + if {$type eq "property"} { + set term [_cert_prop_id $term] + } + set type [expr [dict! $term_types $type 1]] + + # 0x10001 -> PKCS_7_ASN_ENCODING|X509_ASN_ENCODING + return [CertFindCertificateInStore $hstore 0x10001 0 $type $term $hcert] +} + +proc twapi::cert_store_enum_contents {hstore {hcert NULL}} { + return [CertEnumCertificatesInStore $hstore $hcert] +} + +proc twapi::cert_store_add_certificate {hstore hcert args} { + array set opts [_cert_add_parseargs args] + return [CertAddCertificateContextToStore $hstore $hcert $opts(disposition)] +} + +proc twapi::cert_store_add_encoded_certificate {hstore enccert args} { + parseargs args { + {encoding.arg {} {der pem {}}} + } -ignoreunknown -setvars + array set opts [_cert_add_parseargs args] + return [CertAddEncodedCertificateToStore $hstore 0x10001 [_pem_decode $enccert $encoding] $opts(disposition)] +} + +proc twapi::cert_store_export_pem {hstore} { + set pem {} + cert_store_iterate $hstore c {append pem [cert_export $c]\n} + return $pem +} + +proc twapi::cert_store_export_pfx {hstore password args} { + parseargs args { + {exportprivatekeys.bool 0 0x4} + {failonmissingkey.bool 0 0x1} + {failonunexportablekey.bool 0 0x2} + } -maxleftover 0 -setvars + + if {[string length $password] == 0} { + set password [conceal ""] + } + + # NOTE: the -fail* flags only take effect iff the certificate in the store + # claims to have a private key but does not actually have one. It will + # not fail if the cert does not actually claim to have a private key + + set flags [tcl::mathop::| $exportprivatekeys $failonunexportablekey $failonmissingkey] + + return [PFXExportCertStoreEx $hstore $password {} $flags] +} +interp alias {} twapi::cert_store_export_pkcs12 {} twapi::cert_store_export_pfx + +proc twapi::cert_store_commit {hstore args} { + array set opts [parseargs args { + {force.bool 0} + } -maxleftover 0] + + return [Twapi_CertStoreCommit $hstore $opts(force)] +} + +proc twapi::cert_store_serialize {hstore} { + return [Twapi_CertStoreSerialize $hstore 1] +} + +proc twapi::cert_store_export_pkcs7 {hstore args} { + parseargs args { + {encoding.arg pem {der pem}} + } -setvars -maxleftover 0 + + return [_as_pem_or_der [Twapi_CertStoreSerialize $hstore 2] "PKCS7" $encoding] +} + +################################################################ +# Certificates + +interp alias {} twapi::cert_subject_name {} twapi::_cert_get_name subject +interp alias {} twapi::cert_issuer_name {} twapi::_cert_get_name issuer +proc twapi::_cert_get_name {field hcert args} { + + switch $field { + subject { set field 0 } + issuer { set field 1 } + default { badargs! "Invalid name type '$field': must be \"subject\" or \"issuer\"." + } + } + array set opts [parseargs args { + {name.arg oid_common_name} + {separator.arg comma {comma semicolon newline}} + {reverse.bool 0 0x02000000} + {noquote.bool 0 0x10000000} + {noplus.bool 0 0x20000000} + {format.arg x500 {x500 oid simple}} + } -maxleftover 0] + + set arg "" + switch $opts(name) { + email { set what 1 } + simpledisplay { set what 4 } + friendlydisplay {set what 5 } + dns { set what 6 } + url { set what 7 } + upn { set what 8 } + rdn { + set what 2 + switch $opts(format) { + simple {set arg 1} + oid {set arg 2} + x500 - + default {set arg 3} + } + set arg [expr {$arg | $opts(reverse) | $opts(noquote) | $opts(noplus)}] + switch $opts(separator) { + semicolon { set arg [expr {$arg | 0x40000000}] } + newline { set arg [expr {$arg | 0x08000000}] } + } + } + default { + set what 3; # Assume OID + set arg [oid $opts(name)] + } + } + + return [CertGetNameString $hcert $what $field $arg] + +} + +proc twapi::cert_blob_to_name {blob args} { + array set opts [parseargs args { + {format.arg x500 {x500 oid simple}} + {separator.arg comma {comma semi newline}} + {reverse.bool 0 0x02000000} + {noquote.bool 0 0x10000000} + {noplus.bool 0 0x20000000} + } -maxleftover 0] + + switch $opts(format) { + x500 {set arg 3} + simple {set arg 1} + oid {set arg 2} + } + + set arg [expr {$arg | $opts(reverse) | $opts(noquote) | $opts(noplus)}] + switch $opts(separator) { + semi { set arg [expr {$arg | 0x40000000}] } + newline { set arg [expr {$arg | 0x08000000}] } + } + + return [CertNameToStr $blob $arg] +} + +proc twapi::cert_name_to_blob {name args} { + array set opts [parseargs args { + {format.arg x500 {x500 oid simple}} + {separator.arg any {any comma semicolon newline}} + {reverse.bool 0 0x02000000} + {noquote.bool 0 0x10000000} + {noplus.bool 0 0x20000000} + } -maxleftover 0] + + switch $opts(format) { + x500 {set arg 3} + simple {set arg 1} + oid {set arg 2} + } + + set arg [expr {$arg | $opts(reverse) | $opts(noquote) | $opts(noplus)}] + switch $opts(separator) { + comma { set arg [expr {$arg | 0x04000000}] } + semicolon { set arg [expr {$arg | 0x40000000}] } + newline { set arg [expr {$arg | 0x08000000}] } + } + + return [CertStrToName $name $arg] +} + +proc twapi::cert_enum_properties {hcert args} { + parseargs args { + names + } -setvars -maxleftover 0 + + set id 0 + set ids {} + while {[set id [CertEnumCertificateContextProperties $hcert $id]]} { + if {$names} { + lappend ids [_cert_prop_name $id] + } else { + lappend ids $id + } + } + return $ids +} + +proc twapi::cert_property {hcert prop} { + # TBD - need to cook some properties - enhkey_usage + + if {[string is integer -strict $prop]} { + return [CertGetCertificateContextProperty $hcert $prop] + } else { + return [CertGetCertificateContextProperty $hcert [_cert_prop_id $prop] 1] + } +} + +proc twapi::cert_property_set {hcert prop propval} { + switch $prop { + pvk_file - + friendly_name - + description { + set val [encoding convertto unicode "${propval}\0"] + } + enhkey_usage { + set val [::twapi::CryptEncodeObjectEx 2.5.29.37 [_get_enhkey_usage_oids $propval]] + } + default { + badargs! "Invalid or unsupported property name \"$prop\". Must be one of [join $unicode_props {, }]." + } + } + + CertSetCertificateContextProperty $hcert [_cert_prop_id $prop] 0 $val +} + +proc twapi::cert_property_delete {hcert prop} { + CertSetCertificateContextProperty $hcert [_cert_prop_id $prop] 0 +} + +# TBD - Also add cert_set_key_prov_from_crypt_context +proc twapi::cert_set_key_prov {hcert keycontainer keyspec args} { + parseargs args { + csp.arg + {csptype.arg prov_rsa_full} + {keysettype.arg user {user machine}} + {silent.bool 0 0x40} + } -maxleftover 0 -nulldefault -setvars + + set flags $silent + if {$keysettype eq "machine"} { + incr flags 0x20; # CRYPT_KEYSET_MACHINE + } + + # 2 -> CERT_KEY_PROV_INFO_PROP_ID + # TBD - the provider param is hardcoded as {}. Should that be an option ? + CertSetCertificateContextProperty $hcert 2 0 \ + [list $keycontainer $csp [_csp_type_name_to_id $csptype] $flags {} [_crypt_keyspec $keyspec]] + return +} + +proc twapi::cert_export {hcert args} { + parseargs args { + {encoding.arg pem {der pem}} + } -maxleftover 0 -setvars + + return [_as_pem_or_der [lindex [Twapi_CertGetEncoded $hcert] 1] CERTIFICATE $encoding] +} + +proc twapi::cert_import {enccert args} { + parseargs args { + {encoding.arg {} {der pem {}}} + } -maxleftover 0 -setvars + return [CertCreateCertificateContext 0x10001 [_pem_decode $enccert $encoding]] +} + +proc twapi::cert_enhkey_usage {hcert {loc both}} { + return [_cert_decode_enhkey [CertGetEnhancedKeyUsage $hcert [dict! {property 4 extension 2 both 0} $loc 1]]] +} + +proc twapi::cert_key_usage {hcert} { + # 0x10001 -> PKCS_7_ASN_ENCODING|X509_ASN_ENCODING + return [_cert_decode_keyusage [Twapi_CertGetIntendedKeyUsage 0x10001 $hcert]] +} + +proc twapi::cert_thumbprint {hcert} { + binary scan [cert_property $hcert sha1_hash] H* hash + return $hash +} + +proc twapi::cert_info {hcert} { + # TBD - add option to cook extensions using _cert_decode_extension + # instead of returning the raw form + set info [twine { + -version -serialnumber -signaturealgorithm -issuer + -start -end -subject -publickey -issuerid -subjectid -extensions} \ + [Twapi_CertGetInfo $hcert]] + dict set info -start \ + [clock format \ + [large_system_time_to_secs_since_1970 [dict get $info -start]] \ + -timezone :UTC \ + -format "%Y-%m-%d %H:%M:%S"] + dict set info -end \ + [clock format \ + [large_system_time_to_secs_since_1970 [dict get $info -end]] \ + -timezone :UTC \ + -format "%Y-%m-%d %H:%M:%S"] + + return $info +} + +proc twapi::cert_extension {hcert oid} { + set ext [CertFindExtension $hcert [oid $oid]] + if {[llength $ext] == 0} { + return $ext + } + lassign $ext oid critical val + return [list $critical [_cert_decode_extension $oid $val]] +} + +proc twapi::cert_create_self_signed {subject keycontainer keyspec args} { + set args [_cert_create_parse_options $args opts] + + array set opts [parseargs args { + {keysettype.arg user {machine user}} + {silent.bool 0 0x40} + {csp.arg {}} + {csptype.arg {prov_rsa_full}} + {signaturealgorithm.arg {}} + } -maxleftover 0 -ignoreunknown] + + set name_blob [cert_name_to_blob $subject] + + set kiflags $opts(silent) + if {$opts(keysettype) eq "machine"} { + incr kiflags 0x20; # CRYPT_MACHINE_KEYSET + } + set keyinfo [list \ + $keycontainer \ + $opts(csp) \ + [_csp_type_name_to_id $opts(csptype)] \ + $kiflags \ + {} \ + [_crypt_keyspec $keyspec]] + + set flags 0; # Always 0 for now + return [CertCreateSelfSignCertificate NULL $name_blob $flags $keyinfo \ + [_make_algorithm_identifier $opts(signaturealgorithm)] \ + $opts(start) $opts(end) $opts(extensions)] +} + +proc twapi::cert_create_self_signed_from_crypt_context {subject hprov args} { + set args [_cert_create_parse_options $args opts] + + array set opts [parseargs args { + {signaturealgorithm.arg {}} + } -maxleftover 0] + + set name_blob [cert_name_to_blob $subject] + + set flags 0; # Always 0 for now + return [CertCreateSelfSignCertificate $hprov $name_blob $flags {} \ + [_make_algorithm_identifier $opts(signaturealgorithm)] \ + $opts(start) $opts(end) $opts(extensions)] +} + +proc twapi::cert_create {subject pubkey cissuer args} { + set args [_cert_create_parse_options $args opts] + + parseargs args { + {encoding.arg pem {der pem}} + } -maxleftover 0 -setvars + + # TBD - check that issuer is a CA - but then what about self-signed? + + set issuer_info [cert_info $cissuer] + set issuer_blob [cert_name_to_blob [dict get $issuer_info -subject] -format x500] + set sigalgo [dict get $issuer_info -signaturealgorithm] + + # If issuer cert has altnames, use they as issuer altnames for new cert + set issuer_altnames [lindex [cert_extension $cissuer 2.5.29.17] 1] + if {[llength $issuer_altnames]} { + lappend opts(extensions) [_make_altnames_ext $issuer_altnames 0 1] + } + + # The subject key id in issuer's cert will become the + # authority key id in the new cert + # TBD - if fail, get the CERT_KEY_IDENTIFIER_PROP_ID + # 2.5.29.14 -> oid_subject_key_identifier + set issuer_subject_key_id [cert_extension $cissuer 2.5.29.14] + if {[string length [lindex $issuer_subject_key_id 1]] } { + # 2.5.29.35 -> oid_authority_key_identifier + lappend opts(extensions) [list 2.5.29.35 0 [list [lindex $issuer_subject_key_id 1] {} {}]] + } + + # Generate a subject key identifier for this cert based on a hash + # of the public key + set subject_key_id [Twapi_HashPublicKeyInfo $pubkey] + lappend opts(extensions) [list 2.5.29.14 0 $subject_key_id] + + set start [timelist_to_large_system_time $opts(start)] + set end [timelist_to_large_system_time $opts(end)] + + # 2 -> CERT_V3 + # issuer_id and subject_id for the certificate are left empty + # as recommended by gutman's X.509 paper + set cert_info [list 2 $opts(serialnumber) $sigalgo $issuer_blob \ + $start $end \ + [cert_name_to_blob $subject] \ + $pubkey {} {} \ + $opts(extensions)] + + # We need to get the crypt provider for the issuer cert since + # that is what will sign the new cert + lassign [cert_property $cissuer key_prov_info] issuer_container issuer_provname issuer_provtype issuer_flags dontcare issuer_keyspec + set hissuerprov [crypt_acquire $issuer_container -csp $issuer_provname -csptype $issuer_provtype -keysettype [expr {$issuer_flags & 0x20 ? "machine" : "user"}]] + trap { + # 0x10001 -> X509_ASN_ENCODING, 2 -> X509_CERT_TO_BE_SIGNED + return [_as_pem_or_der [CryptSignAndEncodeCertificate $hissuerprov \ + $issuer_keyspec \ + 0x10001 2 $cert_info $sigalgo] \ + CERTIFICATE $encoding] + } finally { + # TBD - test to make sure ok to close this if caller had + # it open + crypt_free $hissuerprov + } +} + +# TBD - test +proc twapi::cert_chain_build {hcert args} { + # -timestamp not documented because not clear exactly how it behaves + # -disablepass1*, -returnlower* not documented because not clear how + # useful. + # TBD - what about CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT + parseargs args { + {cacheendcert.bool 0 0x1} + {disableauthrootautoupdate.bool 0 0x100} + {disablepass1qualityfiltering.bool 0 0x40} + {engine.arg user {user machine}} + {hstore.arg NULL} + {returnlowerqualitycontexts.bool 0 0x80} + {revocationcheck.arg all {none all leaf excluderoot}} + {revocationcheckcacheonly.bool 0 0x80000000} + {timestamp.arg ""} + {urlretrievalcacheonly.bool 0 0x4} + usageall.arg + usageany.arg + } -setvars -maxleftover 0 + + set flags [dict! {none 0 all 0x20000000 leaf 0x10000000 excluderoot 0x40000000} $revocationcheck] + set flags [tcl::mathop::| $flags $cacheendcert $revocationcheckcacheonly $urlretrievalcacheonly $disablepass1qualityfiltering $returnlowerqualitycontexts $disableauthrootautoupdate] + + set usage_op 1; # USAGE_MATCH_TYPE_OR + if {[info exists usageall]} { + if {[info exists usageany]} { + error "Only one of -usageall and -usageany may be specified" + } + set usage_op 0; # USAGE_MATCH_TYPE_AND + set usage [_get_enhkey_usage_oids $usageall] + } elseif {[info exists usageany]} { + set usage [_get_enhkey_usage_oids $usageany] + } else { + set usage {} + } + + return [CertGetCertificateChain \ + [dict* {user NULL machine {1 HCERTCHAINENGINE}} $engine] \ + $hcert $timestamp $hstore \ + [list [list $usage_op $usage]] $flags] +} + +proc twapi::cert_ancestors {hcert args} { + # Note - does not care if certs are valid or not + set certs {} + set hchain [cert_chain_build $hcert {*}$args] + trap { + set simple_chain [twapi::Twapi_CertChainSimpleChain $hchain 0] + } finally { + cert_chain_release $hchain + } + foreach elem [dict get $simple_chain chain] { + lappend certs [dict get $elem hcert] + } + return $certs +} + +proc twapi::cert_chain_simple_chain {hchain index} { + set simple_chain [twapi::Twapi_CertChainSimpleChain $hchain $index] + set errors [_map_trust_error [dict get $simple_chain trust_errors]] + dict set simple_chain trust_errors $errors + if {[llength $errors]} { + dict set simple_chain status fail + } else { + dict set simple_chain status ok + } + dict set simple_chain trust_info [_map_trust_info [dict get $simple_chain trust_info]] + set chain_elements {} + foreach elem [dict get $simple_chain chain] { + set errors [_map_trust_error [dict get $elem trust_errors]] + dict set elem trust_errors $errors + if {[llength $errors]} { + dict set elem status fail + } else { + dict set elem status ok + } + dict set elem trust_info [_map_trust_info [dict get $elem trust_info]] + if {[dict exists $elem revocation]} { + set revocation [dict get $elem revocation] + if {$revocation == 0} { + dict unset elem revocation + } else { + dict set elem revocation [_map_cert_verify_error $revocation] + } + } + if {[dict exists $elem application_usage]} { + dict set elem application_usage [_cert_decode_enhkey [dict get $elem application_usage]] + } + lappend chain_elements $elem + } + dict set simple_chain chain $chain_elements + return $simple_chain +} + +# TBD - test +proc twapi::cert_chain_trust_info {hchain} { + return [_map_trust_info [Twapi_CertChainInfo $hchain]] +} + +proc twapi::_map_trust_info {info} { + return [_make_symbolic_bitmask $info { + hasexactmatchissuer 0x00000001 + haskeymatchissuer 0x00000002 + hasnamematchissuer 0x00000004 + isselfsigned 0x00000008 + haspreferredissuer 0x00000100 + hasissuancechainpolicy 0x00000200 + hasvalidnameconstraints 0x00000400 + ispeertrusted 0x00000800 + hascrlvalidityextended 0x00001000 + isfromexclusivetruststore 0x00002000 + iscomplexchain 0x00010000 + }] +} + +# TBD - test +proc twapi::cert_chain_trust_errors {hchain} { + return [_map_trust_error [Twapi_CertChainError $hchain]] +} + +proc twapi::_map_trust_error {errbits} { + return [_make_symbolic_bitmask $errbits { + time 1 + revoked 4 + signature 8 + wrongusage 0x10 + untrustedroot 0x20 + revocationunknown 0x40 + trustcycle 0x80 + extension 0x100 + policy 0x200 + basiconstraints 0x400 + nameconstraints 0x800 + unsupportednameconstraint 0x1000 + undefinednameconstraint 0x2000 + unpermittednameconstraint 0x4000 + excludednameconstraint 0x8000 + revocationoffline 0x01000000 + noissuancechainpolicy 0x02000000 + distrust 0x04000000 + criticalextension 0x08000000 + weaksignature 0x00100000 + partialchain 0x00010000 + ctltime 0x00020000 + ctlsignature 0x00040000 + ctlusage 0x00080000 + }] +} + +proc twapi::cert_verify {hcert policy args} { + # TBD - should we explicitly look for nulls in the subject name? + # The Chrome source at + # https://src.chromium.org/svn/branches/455/src/net/base/x509_certificate_win.cc + # does this though it also uses the same calls as below. See + # CertSubjectCommonNameHasNull in that code. + set policy_id [dict! { + authenticode 2 authenticodets 3 base 1 basicconstraints 5 + extendedvalidation 8 microsoftroot 7 ntauth 6 + ssl 4 tls 4 + } $policy] + + # Construct policy specific options + set optdefs { + {ignoreerrors.arg {}} + policyparams.arg + {trustedroots.arg} + } + switch -exact -- $policy_id { + 4 { + # SSL/TLS + lappend optdefs server.arg + } + 5 { + # basicconstraints + lappend optdefs isa.arg + } + 6 { + # ntauth also accepts -isa as it includes basic constraints checks + lappend optdefs isa.arg + } + 7 { + # microsoftroot + lappend optdefs enabletestroot.bool + } + } + + array set opts [parseargs args $optdefs -ignoreunknown -setvars] + + if {![dict exists $args -usageall] && ![dict exists $args -usageany]} { + switch -exact -- $policy { + authenticodets - + authenticode { + dict lappend args -usageany code_signing + } + ssl - + tls { + if {[info exists server]} { + dict lappend args -usageany server_auth + } else { + dict lappend args -usageany client_auth + } + } + } + } + + set verify_flags 0 + if {[info exists isa]} { + switch -exact -- $isa { + ca { set verify_flags [expr {$verify_flags | 0x80000000}] } + endentity { set verify_flags [expr {$verify_flags | 0x40000000}] } + default { + error "Invalid value \"$isa\" specified for option -isa." + } + } + } + if {[info exists enabletestroot]} { + set verify_flags [expr {$verify_flags | 0x00010000}] + } + + if {$policy eq "basicconstraints"} { + # TBD - peertrust 0x1000, see below + set ignore_options {} + } else { + # Any other policy + # TBD - the meaning of these is not clear. Are they ignore + # error flags or options? + # peertrust 0x1000 + # trusttestroot 0x4000 + # allowtestroot 0x8000 + set ignore_options { + time 0x07 + basicconstraints 0x08 + unknownca 0x10 + usage 0x20 + name 0x40 + policy 0x80 + revocation 0xf00 + criticalextensions 0x2000 + } + } + + foreach ignore $ignoreerrors { + if {![dict exists $ignore_options $ignore]} { + error "Value $ignore for option -ignoreerrors cannot be used with policy $policy." + } + set verify_flags [expr {$verify_flags | [dict get $ignore_options $ignore]}] + } + + if {![info exists policyparams]} { + switch -exact -- $policy_id { + 4 { + # ssl/tls + if {[info exists server]} { + set policyparams [cert_policy_params_tls -ignoreerrors $ignoreerrors -server $server] + } else { + set policyparams [cert_policy_params_tls -ignoreerrors $ignoreerrors] + } + } + default { + set policyparams {} + } + } + } + + if {[info exists ignoreerrors] && "revocation" in $ignoreerrors} { + lappend args -revocationcheck none + } + set chainh [cert_chain_build $hcert {*}$args] + + trap { + # Actually verification is a bit tricky because the caller might + # have asked for certain errors to be ignored. + # Note that CertVerifyChainPolicy below does NOT check for revocation + # of certificates in the certificate chain as per Microsoft docs. + # We therefore check for revocation errors here and abort if present. + set chain_errors [cert_chain_trust_errors $chainh] + if {[llength $chain_errors]} { + if {"revoked" in $chain_errors} { + return revoked + } + if {"revocationoffline" in $chain_errors} { + return revocationoffline + } + if {"revocationunknown" in $chain_errors} { + return revocationunknown + } + + if {0} { + # For other kind of errors, caller might have indicated + # some types are to be ignored. In that case we will proceed + # to use CertVerifyTrustPolicy since that will allow + # control of which errors are to be ignored. As a + # special case, if caller has specified additional trusted + # roots, we will proceed to call CertVerifyTrustPolicy + # even when caller is not ignoring errors but only if + # there are no errors indicated. + if {[llength $chain_errors] > 1 || + [lindex $chain_errors 0] ne "untrustedroot" || + ![info exists trustedroots]} { + return $chain_errors + } + } + } + + set status [Twapi_CertVerifyChainPolicy $policy_id $chainh [list $verify_flags $policyparams]] + + # If caller had provided additional trusted roots that are not + # in the Windows trusted store, and the error is that the root is + # untrusted, see if the root cert is one of the passed trusted ones + # We will only deal when there is a single possible chain else + # the recheck becomes very complicated as we are not sure if + # the recheck will employ the same chain or not. + if {$status == 0x800B0109 && + [info exists trustedroots] && [llength $trustedroots] && + [cert_chain_simple_chain_count $chainh] == 1} { + set simple_chain [cert_chain_simple_chain $chainh 0] + # Double check no errors listed for this chain + set trust_errors [dict get $simple_chain trust_errors] + if {[llength $trust_errors] == 1 && + [lindex $trust_errors 0] eq "untrustedroot"} { + set certs_in_chain [dict get $simple_chain chain] + set root_cert [dict get [lindex $certs_in_chain end] hcert] + set thumbprint [cert_thumbprint $root_cert] + # Match against each trusted root + set trusted 0 + foreach trusted_cert $trustedroots { + if {$thumbprint eq [cert_thumbprint $trusted_cert]} { + set trusted 1 + break + } + } + if {$trusted} { + # Yes, the root is trusted. It is not enough to + # say validation is ok because even if root + # is trusted, other errors might show up + # once untrusted roots are ignored. So we have + # to call the verification again. + # 0x10 -> CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG + set verify_flags [expr {$verify_flags | 0x10}] + if {0} { + TBD - need to redo the policy params? + # 0x100 -> SECURITY_FLAG_IGNORE_UNKNOWN_CA + set checks [expr {$checks | 0x100}] + } + # Retry the call ignoring root errors + set status [Twapi_CertVerifyChainPolicy $policy_id $chainh [list $verify_flags $policyparams]] + } + } + } + + return [_map_cert_verify_error $status] + } finally { + if {[info exists simple_chain]} { + foreach cert [dict get $simple_chain chain] { + cert_release [dict get $cert hcert] + } + } + cert_chain_release $chainh + } + + return $status +} + +proc twapi::_map_cert_verify_error {err} { + if {![string is integer -strict $err]} { + return $err + } + return [dict* { + 0x00000000 ok + 0x80096004 signature + 0x80092010 revoked + 0x800b0109 untrustedroot + 0x800b010d untrustedtestroot + 0x800b010a partialchain + 0x800b0110 wrongusage + 0x800b0101 time + 0x800b0114 name + 0x800b0113 policy + 0x80096019 basicconstraints + 0x800b0105 criticalextension + 0x800b0102 validityperiodnesting + 0x80092011 norevocationdll + 0x80092012 norevocationcheck + 0x80092013 revocationoffline + 0x800b010f cnmatch + 0x800b0106 purpose + 0x800b010e revocationunknown + 0x800b0103 carole + } [format 0x%8.8x $err]] +} + +# TBD - document +proc twapi::cert_policy_params_tls {args} { + + parseargs args { + ignoreerrors.arg + server.arg + } -maxleftover 0 -setvars -ignoreunknown + + if {[info exists server]} { + set role 2; # AUTHTYPE_SERVER + } else { + set role 1; # AUTHTYPE_CLIENT + set server "" + } + + set ignore_options { + time 0x2000 + unknownca 0x100 + usage 0x200 + name 0x1000 + revocation 0x80 + } + set checks 0 + foreach ignore $ignoreerrors { + # Note we use dict*, not dict! so we can skip any ignore tokens + # that we don't know + set checks [expr {$checks | [dict* $ignore_options $ignore 0]}] + } + return [list $role $checks $server] +} + +proc twapi::cert_tls_verify {hcert args} { + return [cert_verify $hcert tls {*}$args] +} + +# TBD - provide a -peersubject option +proc twapi::cert_fetch {addr {port 443}} { + set so [tls_socket $addr $port] + trap { + set sspi_ctx [chan configure $so -context] + return [sspi_remote_cert $sspi_ctx] + } finally { + close $so + } +} + +proc twapi::cert_locate_private_key {hcert args} { + parseargs args { + {keysettype.arg any {any user machine}} + {silent 0 0x40} + } -maxleftover 0 -setvars + + return [CryptFindCertificateKeyProvInfo $hcert \ + [expr {$silent | [dict get {any 0 user 1 machine 2} $keysettype]}]] +} + +proc twapi::cert_request_parse {req args} { + parseargs args { + {encoding.arg {} {der pem {}}} + } -setvars -maxleftover 0 + + # 3 -> CRYPT_STRING_BASE64REQUESTHEADER + # 4 -> X509_CERT_REQUEST_TO_BE_SIGNED + lassign [::twapi::CryptDecodeObjectEx 4 [_pem_decode $req $encoding 3]] ver subject pubkey attrs + lappend reqdict version $ver pubkey $pubkey attributes $attrs + lappend reqdict subject [cert_blob_to_name $subject] + foreach attr $attrs { + lassign $attr oid values + if {$oid eq "1.2.840.113549.1.9.14"} { + # ...1.9.14 -> oid_rsa_certextensions + set extensions {} + foreach ext [lindex $values 0] { + lassign $ext oid critical value + set value [_cert_decode_extension $oid $value] + lappend extensions $oid [list $value $critical] + # Also add "option keyed" values + switch -exact -- $oid { + 2.5.29.15 { + lappend extensions -keyusage [list $value $critical] + } + 2.5.29.17 { + lappend extensions -altnames [list $value $critical] + } + 2.5.29.19 { + lappend extensions -basicconstraints [list $value $critical] + } + 2.5.29.37 { + lappend extensions -enhkeyusage [list $value $critical] + } + } + } + lappend reqdict extensions $extensions + } + } + + return $reqdict +} + + +proc twapi::cert_request_create {subject hprov keyspec args} { + set args [_cert_create_parse_options $args opts] + # TBD - barf if any elements other than extensions is set + # TBD - document signaturealgorithmid + parseargs args { + {signaturealgorithmid.arg oid_rsa_sha1rsa} + {encoding.arg pem {der pem}} + } -setvars -maxleftover 0 + + set sigoid [oid $signaturealgorithmid] + if {$sigoid ni [list [oid oid_rsa_sha1rsa] [oid oid_rsa_md5rsa] [oid oid_x957_sha1dsa]]} { + badargs! "Invalid signature algorithm '$sigalg'" + } + set keyspec [twapi::_crypt_keyspec $keyspec] + # 0x10001 -> PKCS_7_ASN_ENCODING|X509_ASN_ENCODING + # Pass oid_rsa_rsa as that seems to be what OPENSSL understands in + # a CSR + set pubkeyinfo [crypt_public_key $hprov $keyspec oid_rsa_rsa] + set attrs [list 0 [cert_name_to_blob $subject] $pubkeyinfo] + if {[llength $opts(extensions)]} { + lappend attrs [list [list [oid oid_rsa_certextensions] [list $opts(extensions)]]] + } else { + lappend attrs {} + } + return [_as_pem_or_der [CryptSignAndEncodeCertificate $hprov $keyspec 0x10001 4 $attrs $sigoid] "NEW CERTIFICATE REQUEST" $encoding] +} + + +################################################################ +# Cryptographic context commands + +proc twapi::crypt_acquire {args} { + # Backward compatibility - keycontainer can be specified as first arg + if {[llength $args] & 1} { + set args [lassign $args keycontainer] + } else { + set keycontainer "" + } + + parseargs args { + {csp.arg {}} + {csptype.arg prov_rsa_full} + keycontainer.arg + {keysettype.arg user {user machine}} + {create.bool 0 0x8} + {silent.bool 0 0x40} + verifycontext.bool + } -maxleftover 0 -setvars + + # The defaults for verifycontext are a little confusing. For a named + # key container, at least the MS CSP's require -verifycontext to be 0. + # For the frequent case where private keys are not required, MS recommends + # using the null key container with -verifycontext 1. So accordingly, + # if the keycontainer is empty (or unspecified), then it + # defaults to 1, else defaults to 0. + if {![info exists verifycontext]} { + if {$keycontainer eq ""} { + set verifycontext 1 + } else { + set verifycontext 0 + } + } + + if {$verifycontext} { + set verifycontext 0xf0000000 + } + + set flags [expr {$silent | $verifycontext}] + if {$keysettype eq "machine"} { + incr flags 0x20; # CRYPT_KEYSET_MACHINE + } + + trap { + return [CryptAcquireContext $keycontainer $csp [_csp_type_name_to_id $csptype] $flags] + } onerror {TWAPI_WIN32 0x80090016} { + # NTE_BAD_KEYSET - does not exist. Try to create it. + if {$create} { + set flags [expr {$flags | $create}] + return [CryptAcquireContext $keycontainer $csp [_csp_type_name_to_id $csptype] $flags] + } else { + rethrow + } + } +} + +proc twapi::crypt_free {hcrypt} { + twapi::CryptReleaseContext $hcrypt +} + +proc twapi::crypt_key_container_delete {keycontainer args} { + parseargs args { + csp.arg + {csptype.arg prov_rsa_full} + {keysettype.arg user {machine user}} + force + } -maxleftover 0 -nulldefault -setvars + + if {$keycontainer eq "" && ! $force} { + error "Default container cannot be deleted unless the -force option is specified" + } + + set flags 0x10; # CRYPT_DELETEKEYSET + if {$keysettype eq "machine"} { + incr flags 0x20; # CRYPT_MACHINE_KEYSET + } + + return [CryptAcquireContext $keycontainer $csp [_csp_type_name_to_id $csptype] $flags] +} + +proc twapi::crypt_generate_key {hprov algid args} { + + array set opts [parseargs args { + {archivable.bool 0 0x4000} + {salt.bool 0 4} + {exportable.bool 0 1} + {pregen.bool 0x40} + {userprotected.bool 0 2} + {nosalt40.bool 0 0x10} + {size.int 0} + } -maxleftover 0] + + set algid [capi_algid $algid] + + if {$opts(size) < 0 || $opts(size) > 65535} { + badargs! "Bad key size value '$size': must be positive integer less than 65536" + } + + return [CryptGenKey $hprov $algid [expr {($opts(size) << 16) | $opts(archivable) | $opts(salt) | $opts(exportable) | $opts(pregen) | $opts(userprotected) | $opts(nosalt40)}]] +} + +proc twapi::crypt_keypair {hprov keyspec} { + return [CryptGetUserKey $hprov [dict! {keyexchange 1 signature 2} $keyspec]] +} + +proc twapi::crypt_public_key_import {hprov key args} { + parseargs args { + {algid.arg 0} + {encoding.arg {} {native pem der {}}} + } -setvars + + if {$encoding eq "native"} { + set pub $key + } elseif {$encoding eq "der"} { + set pub [CryptDecodeObjectEx 8 $key] + } elseif {$encoding eq "pem" || + ($encoding eq "" && [string match -nocase "-----BEGIN*" $key])} { + set pub [CryptDecodeObjectEx 8 [CryptStringToBinary $key 0]] + } else { + # encoding is unspecified and is either der or native + if {[catch {set pub [CryptDecodeObjectEx 8 $key]}]} { + # Not DER, assume native + set pub $key + } + } + + return [CryptImportPublicKeyInfoEx $hprov 0x10001 $pub [capi_algid $algid]] +} + +proc twapi::crypt_public_key_export {hprov keyspec args} { + parseargs args { + algoid.arg + {encoding.arg pem {pem der native}} + } -setvars -nulldefault + + if {$algoid ne ""} { + set algoid [oid $algoid] + } + set pubkey [CryptExportPublicKeyInfoEx $hprov \ + [_crypt_keyspec $keyspec] \ + 0x10001 \ + $algoid \ + 0] + if {$encoding eq "native"} { + return $pubkey + } + # Generate SubjectPublicKeyInfo + set der [CryptEncodeObjectEx 8 $pubkey] + if {$encoding eq "der"} { + return $der + } + # 0x80000001 -> No CR (only LF) and headers + return "-----BEGIN PUBLIC KEY-----\n[CryptBinaryToString $der 0x80000001]-----END PUBLIC KEY-----\n" +} + +# For back compat - undocumented +proc twapi::crypt_public_key {hcrypt algid oid} { + return [crypt_public_key_export $hcrypt $algid -encoding native -algoid $oid] +} + +proc twapi::crypt_get_security_descriptor {hprov} { + return [CryptGetProvParam $hprov 8 7] +} + +proc twapi::crypt_set_security_descriptor {hprov secd} { + CryptSetProvParam $hprov 8 $secd +} + +proc twapi::crypt_key_container_name {hprov} { + return [CryptGetProvParam $hprov 6 0] +} + +proc twapi::crypt_key_container_unique_name {hprov} { + return [CryptGetProvParam $hprov 36 0] +} + +proc twapi::crypt_csp {hprov} { + return [CryptGetProvParam $hprov 4 0] +} + +proc twapi::csps {} { + set i 0 + set result {} + while {[llength [set csp [::twapi::CryptEnumProviders $i]]]} { + lappend result [lreplace $csp 0 0 [_csp_type_id_to_name [lindex $csp 0]]] + incr i + } + return $result +} +interp alias {} twapi::crypt_csps {} twapi::csps + +proc twapi::crypt_csp_type {hprov} { + return [_csp_type_id_to_name [CryptGetProvParam $hprov 16 0]] +} + +proc twapi::csp_types {} { + set i 0 + set result {} + while {[llength [set csptype [::twapi::CryptEnumProviderTypes $i]]]} { + lappend result [lreplace $csptype 0 0 [_csp_type_id_to_name [lindex $csptype 0]]] + incr i + } + return $result +} +interp alias {} twapi::crypt_csptypes {} twapi::csp_types + +proc twapi::crypt_key_container_names {hcrypt} { + return [CryptGetProvParam $hcrypt 2 0] +} + +proc twapi::crypt_session_key_size {hcrypt} { + return [CryptGetProvParam $hcrypt 20 0] +} + +proc twapi::crypt_keyx_keysize_increment {hcrypt} { + return [CryptGetProvParam $hcrypt 35 0] +} + +proc twapi::crypt_sig_keysize_increment {hcrypt} { + return [CryptGetProvParam $hcrypt 34 0] +} + +# TBD - Doc and test +proc twapi::crypt_admin_pin {hcrypt} { + return [CryptGetProvParam $hcrypt 31 0] +} + +# TBD - Doc and test +proc twapi::crypt_keyx_pin {hcrypt} { + return [CryptGetProvParam $hcrypt 32 0] +} + +# TBD - Doc and test +proc twapi::crypt_sig_pin {hcrypt} { + return [CryptGetProvParam $hcrypt 33 0] +} + +proc twapi::crypt_csp_version {hcrypt} { + set ver [CryptGetProvParam $hcrypt 5 0] + return [format %d.%d [expr {($ver & 0xff00)>>8}] [expr {$ver & 0xff}]] +} + +proc twapi::crypt_keyset_type {hcrypt} { + return [expr {[CryptGetProvParam $hcrypt 27 0] & 0x20 ? "machine" : "user"}] +} + +proc twapi::crypt_key_specifiers {hcrypt} { + set keyspec [CryptGetProvParam $hcrypt 39 0] + set keyspecs {} + if {$keyspec & 1} { + lappend keyspecs keyexchange + } + if {$keyspec & 2} { + lappend keyspecs signature + } + return $keyspecs +} + +proc twapi::crypt_symmetric_key_size {hcrypt} { + return [CryptGetProvParam $hcrypt 19 0] +} + +proc twapi::capi_key_export {hkey blob_type args} { + parseargs args { + {wrapper.arg NULL} + {v3.bool 0 0x80} + {oeap.bool 0 0x40} + {destroy.bool 0 0x04} + } -setvars -maxleftover 0 + + return [CryptExportKey $hkey $wrapper [_capi_keyblob_type_id $blob_type] [expr {$v3|$oeap}]] +} +interp alias {} twapi::crypt_export_key {} twapi::capi_key_export + + +proc twapi::crypt_import_key {hcrypt keyblob args} { + parseargs args { + {wrapper.arg NULL} + {exportable.bool 1 0x01} + {oaep.bool 0 0x40} + {userprotected.bool 0 0x02} + {ipsechmac.bool 0 0x100} + } -setvars -maxleftover 0 + return [CryptImportKey $hcrypt $keyblob $wrapper \ + [expr {$exportable|$oaep|$userprotected|$ipsechmac}]] +} +interp alias {} twapi::capi_key_import {} twapi::crypt_import_key + +proc twapi::crypt_derive_key {hcrypt algid passphrase args} { + parseargs args { + {size.int 0} + {exportable.bool 1 0x01} + {prf.arg sha1} + {method.arg pbkdf2} + {iterations.int 100000} + {salt.arg ""} + } -maxleftover 0 -setvars + + if {$method eq "pbkdf2"} { + set algnum [capi_algid $algid] + if {$size == 0} { + # Need to figure out the default key size for the algorithm + # The loop below does not work for des/3des/3des_112 because + # it will get the actual key size whereas CryptImportKey + # wants key size with pad/parity bits. So hardcode these + if {$algnum == 0x6601} { + set size 64; # + } elseif {$algnum == 0x6603} { + set size 192; # 3des + } elseif {$algnum == 0x6609} { + set size 128; # 3des_112 + } else { + foreach alg [crypt_algorithms $hcrypt] { + if {[dict get $alg algid] == $algnum} { + set size [dict get $alg defkeylen] + break + } + } + } + if {$size == 0} { + error "Could not figure out default key size for algorithm $algid. Please use the -size option." + } + } + set pbkdf2 [PBKDF2 $passphrase $size [capi_algid $prf] $salt $iterations] + set keyblob [list 0 2 0 $algnum $pbkdf2] + return [crypt_import_key $hcrypt $keyblob -exportable $exportable] + } else { + if {$size < 0 || $size > 65535} { + # Key size of 0 is default. Else it must be within 1-65535 + badargs! "Option -size value \"$size\" is not between 0 and 65535." + } + set hhash [capi_hash_create $hcrypt [capi_algid $method]] + twapi::trap { + capi_hash_password $hhash $passphrase + return [CryptDeriveKey $hcrypt [capi_algid $algid] $hhash \ + [expr {($size << 16) | $exportable}]] + } finally { + capi_hash_free $hhash + } + } +} + +proc twapi::pbkdf2 {pass nbits alg_id salt niters} { + return [PBKDF2 $pass $nbits [capi_algid $alg_id] $salt $niters] +} + + +proc twapi::capi_encrypt_bytes {bytes hkey args} { + variable _capi_encrypt_partials + parseargs args { + {hhash.arg NULL} + {final.bool 1} + {pad.arg oaep {oaep pkcs1}} + } -setvars -maxleftover 0 + + if {[dict exists $_capi_encrypt_partials $hkey Data]} { + append plaintext \ + [dict get $_capi_encrypt_partials $hkey Data] \ + $bytes + } else { + set plaintext $bytes + } + + if {$final} { + dict unset _capi_encrypt_partials $hkey + return [CryptEncrypt $hkey $hhash $final [dict! {pkcs1 0 oaep 0x40} $pad] $plaintext] + } + + # If not the final segment, we have to split it up into the block size multiple. + if {[dict exists $_capi_encrypt_partials $hkey Blocklen]} { + set blocklen [dict get $_capi_encrypt_partials $hkey Blocklen] + } else { + set blocklen [expr {[capi_key_blocklen $hkey] / 8}]; # Bits -> bytes + } + + # len is largest multiple of block size less than data length + set len [expr {([string length $plaintext] / $blocklen) * $blocklen}] + set enc [CryptEncrypt $hkey $hhash $final [dict! {pkcs1 0 oaep 0x40} $pad] [string range $plaintext 0 $len-1]] + # Note following will not happen if CryptEncrypt throws an error. As desired + set remain [string range $plaintext $len end] + if {[string length $remain]} { + # Remember additional data + dict set _capi_encrypt_partials $hkey Data $remain + dict set _capi_encrypt_partials $hkey Blocklen $blocklen + } else { + dict unset _capi_encrypt_partials $hkey + } + + return $enc +} + +proc twapi::capi_encrypt_string {s hkey args} { + # Explicitly parse args, not just pass on because this command + # does not support -final for symmetry with capi_decrypt_string + parseargs args { + {hhash.arg NULL} + {pad.arg oaep {oaep pkcs1}} + } -setvars -maxleftover 0 + return [capi_encrypt_bytes [encoding convertto utf-8 $s] $hkey -hhash $hhash -pad $pad] +} + +proc twapi::capi_decrypt_bytes {bytes hkey args} { + variable _capi_decrypt_partials + parseargs args { + {pad.arg oaep {oaep pkcs1 nopadcheck}} + {final.bool 1} + {hhash.arg NULL} + } -setvars -maxleftover 0 + + if {[dict exists $_capi_decrypt_partials $hkey Data]} { + append enc \ + [dict get $_capi_decrypt_partials $hkey Data] \ + $bytes + } else { + set enc $bytes + } + + if {$final} { + dict unset _capi_decrypt_partials $hkey + return [CryptDecrypt $hkey $hhash $final [dict! {pkcs1 0 oaep 0x40 nopadcheck 0x20} $pad] $enc] + } + + # If not the final segment, we have to split it up into the block size multiple. + if {[dict exists $_capi_decrypt_partials $hkey Blocklen]} { + set blocklen [dict get $_capi_decrypt_partials $hkey Blocklen] + } else { + set blocklen [expr {[capi_key_blocklen $hkey] / 8}]; # Bits -> bytes + } + + # len is largest multiple of block size less than data length + set len [expr {([string length $enc] / $blocklen) * $blocklen}] + set plaintext [CryptDecrypt $hkey $hhash $final [dict! {pkcs1 0 oaep 0x40} $pad] [string range $enc 0 $len-1]] + # Note following will not happen if CryptDecrypt throws an error. As desired + set remain [string range $enc $len end] + if {[string length $remain]} { + # Remember additional data + dict set _capi_decrypt_partials $hkey Data $remain + dict set _capi_decrypt_partials $hkey Blocklen $blocklen + } else { + dict unset _capi_decrypt_partials $hkey + } + + return $plaintext +} + +proc twapi::capi_decrypt_string {s hkey args} { + # Explicitly parse args, not just pass on because this command + # does not support -final for symmetry with capi_decrypt_string + parseargs args { + {hhash.arg NULL} + {pad.arg oaep {oaep pkcs1}} + } -setvars -maxleftover 0 + return [encoding convertfrom utf-8 [capi_decrypt_bytes $s $hkey -hhash $hhash -pad $pad]] +} + +# Returns the most capable CSP +proc twapi::_crypt_acquire_default {} { + if {[catch {crypt_acquire -csptype prov_rsa_aes} hcrypt] && + [catch {crypt_acquire -csptype prov_rsa_full -csp {Microsoft Enhanced Cryptographic Provider v1.0}} hcrypt]} { + set hcrypt [crypt_acquire] + } + set cspname [crypt_csp $hcrypt] + set csptype [crypt_csp_type $hcrypt] + # Redefine ourselves for next call + proc [namespace current]::_crypt_acquire_default {} "crypt_acquire -csp {$cspname} -csptype $csptype" + return $hcrypt +} + +proc twapi::_block_cipher {algo direction bytes keybytes args} { + + # Note: padding mode is not documented since MS providers only support + # one mode anyway + parseargs args { + mode.arg + iv.arg + padding.arg + } -setvars -maxleftover 0 + + set hcrypt [_crypt_acquire_default] + try { + set hkey [crypt_import_key $hcrypt [capi_keyblob_concealed $algo $keybytes]] + if {[info exists mode]} { + capi_key_mode $hkey $mode + } + if {[info exists iv]} { + capi_key_iv $hkey $iv + } + if {$direction eq "encrypt"} { + if {[info exists padding]} { + capi_key_padding $hkey $padding + } + set ciphertext [capi_encrypt_bytes $bytes $hkey] + } else { + set ciphertext [capi_decrypt_bytes $bytes $hkey] + } + } finally { + if {[info exists hkey]} { + capi_key_free $hkey + } + crypt_free $hcrypt + } + return $ciphertext +} + +# apply to avoid global variable pollution +apply {{} { + foreach {algo blocklen} {des 8 3des 8 aes_128 16 aes_192 16 aes_256 16} { + namespace eval twapi::$algo {} + interp alias {} twapi::${algo}::encrypt {} twapi::_block_cipher $algo encrypt + interp alias {} twapi::${algo}::decrypt {} twapi::_block_cipher $algo decrypt + interp alias {} twapi::${algo}::iv {} twapi::random_bytes $blocklen + namespace eval twapi::$algo { + namespace export encrypt decrypt iv + namespace ensemble create + } + } +}} + +### +# PKCS7 commands + +proc twapi::pkcs7_encrypt {bytes recipients encalg args} { + parseargs args { + {encoding.arg pem {pem der}} + {innertype.arg 0} + } -setvars -maxleftover 0 + + # TBD - add support for the following + set flags 0 + set encauxinfo {} + + set params [list \ + 0x10001 \ + NULL \ + [_make_algorithm_identifier $encalg] \ + $encauxinfo \ + $flags \ + $innertype] + return [_as_pem_or_der [CryptEncryptMessage $params $recipients $bytes] PKCS7 $encoding] +} + +proc twapi::pkcs7_decrypt {bytes stores args} { + parseargs args { + {encoding.arg {} {der pem {}}} + {silent.bool 0 0x40} + {certvar.arg ""} + } -maxleftover 0 -setvars + + set params [list \ + 0x10001 \ + $stores \ + $silent] + if {$certvar ne ""} { + upvar 1 $certvar hcert + set certvar hcert + } + + return [CryptDecryptMessage $params [_pem_decode $bytes $encoding] $certvar] +} + +proc twapi::pkcs7_sign {bytes hcert hashalg args} { + # TBD - document crls? + parseargs args { + {detached.bool 0} + {encoding.arg pem {pem der}} + {includecerts.arg all {none leaf all}} + {silent.bool 0 0x40} + {usesignerkeyid.bool 0 0x4} + {crls.arg {}} + {innercontenttype.arg 0} + } -setvars -maxleftover 0 + + set flags [expr {$usesignerkeyid | $silent}] + + switch -exact -- $includecerts { + leaf { set certs [list [cert_duplicate $hcert]] } + none { set certs {} } + all { set certs [cert_ancestors $hcert] } + } + # TBD - add support for the following + set hashaux {} + set authattrs {} + set unauthattrs {} + set encalg "" + set hashencaux "" + # 0x10001 -> PKCS_7_ASN_ENCODING|X509_ASN_ENCODING + set params [list \ + 0x10001 \ + $hcert \ + [_make_algorithm_identifier $hashalg] \ + $hashaux \ + $certs \ + $crls \ + $authattrs \ + $unauthattrs \ + $flags \ + $innercontenttype \ + $encalg \ + $hashencaux] + trap { + return [_as_pem_or_der [CryptSignMessage $params $detached [list $bytes]] PKCS7 $encoding] + } finally { + foreach c $certs { + cert_release $c + } + } +} + +proc twapi::pkcs7_verify {bytes args} { + parseargs args { + {encoding.arg {} {der pem {}}} + {contentvar.arg ""} + {certvar.arg ""} + } -maxleftover 0 -setvars -ignoreunknown + + if {$contentvar ne ""} { + upvar 1 $contentvar content + set contentvar content + } + set status [CryptVerifyMessageSignature [list 0x10001 NULL] 0 [_pem_decode $bytes $encoding] $contentvar hcert] + if {$status == 0} { + trap { + set status [cert_verify $hcert base {*}$args] + if {$status eq "ok"} { + if {$certvar ne ""} { + upvar 1 $certvar cert + set cert $hcert + unset hcert; # So we do not release it below + } + if {$contentvar ne ""} { + upvar 1 $contentvar con + set con content + } + } + } finally { + if {[info exists hcert]} { + cert_release $hcert + } + } + } else { + # Note these codes are different from those in _map_cert_verify_error + if {$status == 0x80090006} { + set status "signature" + } elseif {$status == 0x80090008} { + set status "invalidalgorithm" + } + } + + return $status +} + + +# For backwards compat - deprecated +interp alias {} twapi::crypt_key_free {} twapi::capi_key_free + +proc twapi::crypt_algorithms {hcrypt} { + set algs {} + foreach alg [CryptGetProvParam $hcrypt 22 0] { + lassign $alg algid defaultlen minlen maxlen protos name description + set protos [_make_symbolic_bitmask $protos { + ipsec 0x10 pct1 0x01 signing 0x20 ssl2 0x02 ssl3 0x04 tls1 0x08 + }] + lappend algs [list algid $algid defkeylen $defaultlen minkeylen $minlen maxkeylen $maxlen protocols $protos name $name description $description] + } + return $algs +} + +proc twapi::crypt_implementation_type {hcrypt} { + return [dict* {1 hardware 2 software 3 mixed 4 unknown 8 removable} [CryptGetProvParam $hcrypt 3 0]] +} + +proc twapi::capi_algid {s} { + if {[string is integer -strict $s]} { + return [expr {$s}]; # Return in decimal form + } + set algid [dict* { + 3des 0x00006603 + 3des_112 0x00006609 + aes 0x00006611 + aes_128 0x0000660e + aes_192 0x0000660f + aes_256 0x00006610 + agreedkey_any 0x0000aa03 + keyexchange 1 + signature 2 + cylink_mek 0x0000660c + des 0x00006601 + desx 0x00006604 + dh_ephem 0x0000aa02 + dh_sf 0x0000aa01 + dss_sign 0x00002200 + ecdh 0x0000aa05 + ecdsa 0x00002203 + ecmqv 0x0000a001 + hash_replace_owf 0x0000800b + hughes_md5 0x0000a003 + hmac 0x00008009 + kea_keyx 0x0000aa04 + mac 0x00008005 + md2 0x00008001 + md4 0x00008002 + md5 0x00008003 + no_sign 0x00002000 + pct1_master 0x00004c04 + rc2 0x00006602 + rc4 0x00006801 + rc5 0x0000660d + rsa_keyx 0x0000a400 + rsa_sign 0x00002400 + schannel_enc_key 0x00004c07 + schannel_mac_key 0x00004c03 + schannel_master_hash 0x00004c02 + sha 0x00008004 + sha1 0x00008004 + sha_256 0x0000800c + sha_384 0x0000800d + sha_512 0x0000800e + ssl2_master 0x00004c05 + ssl3_master 0x00004c01 + ssl3_shamd5 0x00008008 + tls1_master 0x00004c06 + tls1prf 0x0000800a + } $s ""] + + if {$algid eq ""} { + set oid [oid $s] + set algid [CertOIDToAlgId $oid] + if {$algid == 0} { + error "Could not map \"$s\" to algorithm id" + } + } + # Return the decimal form + return [expr {$algid}] +} + +# TBD - document +proc twapi::crypt_find_oid_info {key args} { + array set opts [parseargs args { + {restrict.arg any {sign encrypt any}} + keylen.int + {searchds.bool 0} + {oidgroup.arg 0} + } -maxleftover 0] + + # We will try key to be an OID, Alg Id, sign id or a simple + # name in turn + if {[catch { + set key [oid $key] + set keytype 1; # OID + }]} { + if {[catch { + set key [capi_algid $key] + set keytype 3; # Alg Id + }]} { + if {[catch { + # Sign - list of two alg id's + if {[llength $key] == 2} { + set key [list [capi_algid [lindex $key 0]] [capi_algid [lindex $key 1]]] + set keytype 4 + } else { + set keytype 2 ;# Name + } + }]} { + set keytype 2 ;# Name + } + } + } + + set oidgroup [oidgroup $opts(oidgroup)] + if {$opts(restrict) ne "any"} { + if {$oidgroup != 0 && $oidgroup != 3} { + error "The -restrict option can only be used with the oidgroup_pubkey_alg OID group" + } + if {$opts(restrict) eq "sign"} { + set keytype [expr {$keytype | 0x80000000}] + } else { + set keytype [expr {$keytype | 0x40000000}] + } + } + + if {[info exists opts(keylen)]} { + set oidgroup [expr {$oidgroup | ($opts(keylen) << 16)}] + } + + # Because search of active dir can be slow, turn it off unless + # caller explicitly requests it + if {! $opts(searchds)} { + set oidgroup [expr {$oidgroup | 0x80000000}] + } + + return [CryptFindOIDInfo $keytype $key $oidgroup] +} + +# TBD - document +proc twapi::crypt_enumerate_oid_info {{oidgroup 0}} { + # TBD - parse extra based on OID group + set ret {} + foreach info [CryptEnumOIDInfo [oidgroup $oidgroup]] { + lappend ret [twine {oid name oidgroup value extra} $info] + } + return $ret +} + +# TBD - test +proc twapi::_capi_parse {type arg args} { + parseargs args { + {contenttype.arg any} + {formattype.arg any} + {typesonly.bool 0} + } -setvars -maxleftover 0 + + # First try the formats not supported by CryptQueryObject + if {$contenttype in {any rsapublickey subjectpublickeyinfo}} { + if {$formattype eq "binary"} { + set encoding der + } elseif {$formattype eq "base64"} { + set encoding pem + } else { + set encoding "" + } + if {$type == 1} { + # arg is a file + set fd [open $arg] + trap { + fconfigure $fd -translation binary + set content [_pem_decode [read $fd] $encoding] + set is_pem [_is_pem $content] + } finally { + close $fd + } + } + if {$contenttype in {any subjectpublickeyinfo}} { + trap { + set data [CryptDecodeObjectEx 8 $content] + dict set ret contenttype subjectpublickeyinfo + dict set ret formattype [lindex {binary base64} $is_pem] + if {! $typesonly} { + dict set ret subjectpublickeyinfo $data + } + return $ret + } onerror {} { + if {$contenttype eq "subjectpublickeyinfo"} { + rethrow + } + # Go on to try other types + } + } + if {$contenttype in {any rsapublickey}} { + trap { + set data [CryptDecodeObjectEx 19 $content] + dict set ret contenttype rsapublickey + dict set ret formattype [lindex {binary base64} $is_pem] + if {! $typesonly} { + dict set ret rsapublickey $data + } + return $ret + } onerror {} { + if {$contenttype eq "rsapublickey"} { + rethrow + } + # Go on to try other types + } + } + } + + # No joy. Go on to try CryptQueryObject + + # Note - CERT_QUERY_CONTENT_FLAG_PFX_AND_LOAD not supported + # on XP/2k3 hence not included in expected_content_type + set contenttype [dict! { + cert 2 + ctl 4 + crl 8 + serializedstore 16 + serializedcert 32 + serializedctl 64 + serializedcrl 128 + pkcs7signed 256 + pkcs7unsigned 512 + pkcs7signedembed 1024 + pkcs10 2048 + pfx 4096 + certpair 8192 + any 0x3FFE + } $contenttype] + + set formattype [dict! { + binary 2 + base64 4 + asn1hex 8 + any 14 + } $formattype] + + set ret [CryptQueryObject $type $arg \ + $contenttype $formattype 0 $typesonly] + # We don't mention PKCS7_ASN v/s X509_ASN anywhere and use encoding + # to refer to PEM/DER so leave it off for now + dict unset ret encoding + dict set ret formattype [dict* { + 1 binary + 2 base64 + 3 asn1hex + } [dict get $ret formattype]] + dict set ret contenttype [dict* { + 1 cert + 2 ctl + 3 crl + 4 serializedstore + 5 serializedcert + 6 serializedctl + 7 serializedcrl + 8 pkcs7signed + 9 pkcs7unsigned + 10 pkcs7signedembed + 11 pkcs10 + 12 pfx + 13 certpair + } [dict get $ret contenttype]] + + return $ret +} +interp alias {} twapi::capi_parse_file {} twapi::_capi_parse 1 +interp alias {} twapi::capi_parse {} twapi::_capi_parse 2 + +### +# ASN.1 procs + +# TBD - document +proc twapi::asn1_decode_string {bin} { + # 24 -> X509_UNICODE_ANY_STRING + return [lindex [twapi::CryptDecodeObjectEx 24 $bin] 1] +} + +# TBD - document +proc twapi::asn1_encode_string {s {encformat utf8}} { + # 24 -> X509_UNICODE_ANY_STRING + return [twapi::CryptEncodeObjectEx 24 [list [dict! { + numeric 3 printable 4 teletex 5 t61 5 videotex 6 ia5 7 graphic 8 + visible 9 iso646 9 general 10 universal 11 int4 11 + bmp 12 unicode 12 utf8 13 + } $encformat] $s]] +} + +### +# Key procs + +proc twapi::_capi_key_param {param_id hkey args} { + if {[llength $args] == 0} { + return [CryptGetKeyParam $hkey $param_id] + } + if {[llength $args] == 1} { + return [CryptSetKeyParam $hkey $param_id [lindex $args 0]] + } + badargs! "Invalid syntax. Should be [lindex [info level -1] 0] HKEY ?VALUE?" 3 +} + +proc twapi::capi_key_iv {args} {return [_capi_key_param 1 {*}$args]} +proc twapi::capi_key_mode_bits {args} {return [_capi_key_param 5 {*}$args]} +proc twapi::capi_key_dss_p {args} {return [_capi_key_param 11 {*}$args]} +proc twapi::capi_key_dss_q {args} {return [_capi_key_param 13 {*}$args]} +proc twapi::capi_key_dss_g {args} {return [_capi_key_param 12 {*}$args]} +proc twapi::capi_key_effective_keylen {args} {return [_capi_key_param 19 {*}$args]} + +proc twapi::capi_key_blocklen {hkey} {return [CryptGetKeyParam $hkey 8]} +proc twapi::capi_key_certificate {hkey} {return [CryptGetKeyParam $hkey 26]} +proc twapi::capi_key_keylen {hkey} {return [CryptGetKeyParam $hkey 9]} + +proc twapi::capi_key_algid {hkey args} { + if {[llength $args] == 0} { + return [CryptGetKeyParam $hkey 7] + } + set args [lassign $args algid] + set algid [capi_algid $algid] + array set opts [parseargs args { + {archivable.bool 0 0x4000} + {salt.bool 0 4} + {exportable.bool 0 1} + {pregen.bool 0x40} + {userprotected.bool 0 2} + {nosalt40.bool 0 0x10} + {size.int 0} + } -maxleftover 0] + if {$opts(size) < 0 || $opts(size) > 65535} { + badargs! "Bad key size value '$size': must be positive integer less than 65536" + } + set flags [expr {($opts(size) << 16) | $opts(archivable) | $opts(salt) | $opts(exportable) | $opts(pregen) | $opts(userprotected) | $opts(nosalt40)}] + return [CryptSetKeyParam $hkey 7 $algid $flags] +} + +proc twapi::capi_key_mode {hkey args} { + if {[llength $args] == 0} { + return [dict* {1 cbc 2 ecb 3 ofb 4 cfb 5 cts} [CryptGetKeyParam $hkey 4]] + } + if {[llength $args] == 1} { + set val [dict* {cbc 1 ecb 2 ofb 3 cfb 4 cts 5} [lindex $args 0]] + return [CryptSetKeyParam $hkey 4 $val] + } + badargs! "Invalid syntax. Should be [lindex [info level 0] 0] HKEY ?VALUE?" +} + +proc twapi::capi_key_padding {hkey args} { + if {[llength $args] == 0} { + return [dict* {1 pkcs5 2 random 3 zeroes} [CryptGetKeyParam $hkey 3]] + } + if {[llength $args] == 1} { + set val [dict* {pkcs5 1 random 2 zeroes 3} [lindex $args 0]] + return [CryptSetKeyParam $hkey 3 $val] + } + badargs! "Invalid syntax. Should be [lindex [info level 0] 0] HKEY ?VALUE?" +} + +proc twapi::capi_key_permissions {hkey args} { + set bitmasks { + encrypt 0x01 decrypt 0x02 export 0x04 read 0x08 write 0x10 + mac 0x20 export_key 0x40 import_key 0x80 archive 0x100 + } + if {[llength $args] == 0} { + return [_make_symbolic_bitmask [CryptGetKeyParam $hkey 6] $bitmasks] + } + if {[llength $args] == 1} { + set val [_parse_symbolic_bitmask [lindex $args 0] $bitmasks] + return [CryptSetKeyParam $hkey 6 $val] + } + badargs! "Invalid syntax. Should be [lindex [info level 0] 0] HKEY ?VALUE?" +} + +proc twapi::capi_key_salt {hkey args} { + if {[llength $args] == 0} { + # 2 -> KP_SALT + return [CryptGetKeyParam $hkey 2] + } + if {[llength $args] == 1} { + # 10 -> KP_SALT_EX + return [CryptSetKeyParam $hkey 10 [lindex $args 0]] + } + badargs! "Invalid syntax. Should be [lindex [info level 0] 0] HKEY ?VALUE?" +} + +proc twapi::capi_keyblob_create {ver algid blob_type key} { + # 0 -> reserved field + return [list [_capi_keyblob_type_id $blob_type] $ver 0 [capi_algid $algid] $key] +} + +proc twapi::capi_keyblob_concealed {algid concealed_key} { + # 2 -> bVersion + # 0 -> concealed plaintextkeyblob + # Note: for our own home grown concealed type there is no + # BLOBHEADER + return [capi_keyblob_create 2 $algid concealed $concealed_key] +} + +proc twapi::capi_keyblob_plaintext {algid binkey} { + # typedef struct _PUBLICKEYSTRUC { + # BYTE bType; + # BYTE bVersion; + # WORD reserved; + # ALG_ID aiKeyAlg; + # } BLOBHEADER; + # 2 -> bVersion + set algnum [capi_algid $algid] + set blob_type [_capi_keyblob_type_id plaintext] + set len [string length $binkey] + set blob "[binary format ccsii $blob_type 2 0 $algnum $len]$binkey" + return [capi_keyblob_create 2 $algid plaintext $blob] +} + +proc twapi::capi_keyblob_version {kblob} { + return [lindex $kblob 1] +} + +proc twapi::capi_keyblob_algid {kblob} { + return [lindex $kblob 3] +} + +proc twapi::capi_keyblob_type {kblob} { + return [_capi_keyblob_type_name [lindex $kblob 0]] +} + +proc twapi::capi_keyblob_blob {kblob} { + return [lindex $kblob 4] +} + +proc twapi::_capi_keyblob_type_id {name} { + set blob_type [dict* { + concealed 0 + keystate 12 + opaque 9 + plaintext 8 + privatekey 7 + publickey 6 + publickeyex 10 + rfc3217 11 + simple 1 + } $name] +} + +proc twapi::_capi_keyblob_type_name {id} { + set blob_type [dict* { + 0 concealed + 1 simple + 6 publickey + 7 privatekey + 8 plaintext + 9 opaque + 10 publickeyex + 11 rfc3217 + 12 keystate + } [incr id 0]]; # incr to convert hex etc. to decimal + +} + +### +# Utility procs + +proc twapi::_make_algorithm_identifier {oid {param {}}} { + if {[string length $oid] == 0} { + return "" + } + if {0} { + # TBD - what modes to default to ? + switch -exact -- $oid { +#define szOID_NIST_AES128_CBC "2.16.840.1.101.3.4.1.2" +#define szOID_NIST_AES192_CBC "2.16.840.1.101.3.4.1.22" +#define szOID_NIST_AES256_CBC "2.16.840.1.101.3.4.1.42" + +#// For the above Algorithms, the AlgorithmIdentifier parameters must be +#// present and the parameters field MUST contain an AES-IV: +#// +#// AES-IV ::= OCTET STRING (SIZE(16)) + +#// NIST AES WRAP Algorithms +#define szOID_NIST_AES128_WRAP "2.16.840.1.101.3.4.1.5" +#define szOID_NIST_AES192_WRAP "2.16.840.1.101.3.4.1.25" +#define szOID_NIST_AES256_WRAP "2.16.840.1.101.3.4.1.45" + des { set oid "oid_rsa_des_ede3_cbc" } + des { set oid "oid_oiwsec_descbc" } + aes128 { TBD } + aes192 { TBD } + aes256 { TBD } + rc2 { set oid "oid_rsa_rc2cbc" } + rc4 { set oid "oid_rsa_rc4" } + } + } + set oid [oid $oid] + if {[string length $param]} { + return [list $oid $param] + } else { + return [list $oid] + } +} + +twapi::proc* twapi::_cert_prop_id {prop} { + # Certificate property menomics + variable _cert_prop_name_id_map + array set _cert_prop_name_id_map { + key_prov_handle 1 + key_prov_info 2 + sha1_hash 3 + hash 3 + md5_hash 4 + key_context 5 + key_spec 6 + ie30_reserved 7 + pubkey_hash_reserved 8 + enhkey_usage 9 + ctl_usage 9 + next_update_location 10 + friendly_name 11 + pvk_file 12 + description 13 + access_state 14 + signature_hash 15 + smart_card_data 16 + efs 17 + fortezza_data 18 + archived 19 + key_identifier 20 + auto_enroll 21 + pubkey_alg_para 22 + cross_cert_dist_points 23 + issuer_public_key_md5_hash 24 + subject_public_key_md5_hash 25 + id 26 + date_stamp 27 + issuer_serial_number_md5_hash 28 + subject_name_md5_hash 29 + extended_error_info 30 + + renewal 64 + archived_key_hash 65 + auto_enroll_retry 66 + aia_url_retrieved 67 + authority_info_access 68 + backed_up 69 + ocsp_response 70 + request_originator 71 + source_location 72 + source_url 73 + new_key 74 + ocsp_cache_prefix 75 + smart_card_root_info 76 + no_auto_expire_check 77 + ncrypt_key_handle 78 + hcryptprov_or_ncrypt_key_handle 79 + + subject_info_access 80 + ca_ocsp_authority_info_access 81 + ca_disable_crl 82 + root_program_cert_policies 83 + root_program_name_constraints 84 + subject_ocsp_authority_info_access 85 + subject_disable_crl 86 + cep 87 + + sign_hash_cng_alg 89 + + scard_pin_id 90 + scard_pin_info 91 + } +} { + variable _cert_prop_name_id_map + + if {[string is integer -strict $prop]} { + return $prop + } + if {![info exists _cert_prop_name_id_map($prop)]} { + badargs! "Unknown certificate property id '$prop'" 3 + } + + return $_cert_prop_name_id_map($prop) +} + +twapi::proc* twapi::_cert_prop_name {id} { + variable _cert_prop_name_id_map + variable _cert_prop_id_name_map + + _cert_prop_id key_prov_handle; # Just to init _cert_prop_name_id_map + array set _cert_prop_id_name_map [swapl [array get _cert_prop_name_id_map]] +} { + variable _cert_prop_id_name_map + if {[info exists _cert_prop_id_name_map($id)]} { + return $_cert_prop_id_name_map($id) + } + if {[string is integer -strict $id]} { + return $id + } + badargs! "Unknown certificate property id '$id'" 3 +} + +twapi::proc* twapi::_system_store_id {name} { + variable _system_store_locations + + set _system_store_locations { + service 0x40000 + "" 0x10000 + user 0x10000 + usergrouppolicy 0x70000 + localmachine 0x20000 + localmachineenterprise 0x90000 + localmachinegrouppolicy 0x80000 + services 0x50000 + users 0x60000 + } + + foreach loc [CertEnumSystemStoreLocation 0] { + dict set _system_store_locations {*}$loc + } +} { + variable _system_store_locations + + if {[string is integer -strict $name]} { + if {$name < 65536} { + badargs! "Invalid system store name $name" 3 + } + return $name + } + + return [dict! $_system_store_locations $name 2] +} + +twapi::proc* twapi::_csp_type_name_to_id prov { + variable _csp_type_name_id_map + + array set _csp_type_name_id_map { + prov_rsa_full 1 + prov_rsa_sig 2 + prov_dss 3 + prov_fortezza 4 + prov_ms_exchange 5 + prov_ssl 6 + prov_rsa_schannel 12 + prov_dss_dh 13 + prov_ec_ecdsa_sig 14 + prov_ec_ecnra_sig 15 + prov_ec_ecdsa_full 16 + prov_ec_ecnra_full 17 + prov_dh_schannel 18 + prov_spyrus_lynks 20 + prov_rng 21 + prov_intel_sec 22 + prov_replace_owf 23 + prov_rsa_aes 24 + } +} { + variable _csp_type_name_id_map + + set key [string tolower $prov] + + if {[info exists _csp_type_name_id_map($key)]} { + return $_csp_type_name_id_map($key) + } + + if {[string is integer -strict $prov]} { + return $prov + } + + badargs! "Invalid or unknown provider type '$prov'" 3 +} + +twapi::proc* twapi::_csp_type_id_to_name prov { + variable _csp_type_name_id_map + variable _csp_id_type_name_map + + _csp_type_name_to_id prov_rsa_full; # Just to ensure _csp_type_name_id_map exists + array set _csp_id_type_name_map [swapl [array get _csp_type_name_id_map]] +} { + variable _csp_id_type_name_map + if {[info exists _csp_id_type_name_map($prov)]} { + return $_csp_id_type_name_map($prov) + } + + if {[string is integer -strict $prov]} { + return $prov + } + + badargs! "Invalid or unknown CSP type id '$prov'" 3 +} + +twapi::proc* twapi::oid {name} { + variable _name_oid_map + if {![info exists _name_oid_map]} { + oids; # To init the map + } +} { + variable _name_oid_map + + if {[regexp {^\d+\.\d+(\.\d+)*$} $name]} { + return $name; # OID literal n.n... + } + if {[info exists _name_oid_map($name)]} { + return $_name_oid_map($name) + } + # Try by adding oid_ + if {[info exists _name_oid_map(oid_$name)]} { + return $_name_oid_map(oid_$name) + } + + badargs! "Invalid OID '$name'" + +} + +twapi::proc* twapi::oidname {oid} { + variable _oid_name_map + if {![info exists _oid_name_map]} { + oids; # To init the map + } +} { + variable _oid_name_map + + if {[info exists _oid_name_map($oid)]} { + return $_oid_name_map($oid) + } + if {[regexp {^\d([\d\.]*\d)?$} $oid]} { + return $oid + } else { + badargs! "Invalid OID '$oid'" + } +} + +# TBD - change OID mnemonics to those in RFC (see pki.tcl in tcllib) +twapi::proc* twapi::oids {{pattern *}} { + variable _oid_name_map + variable _name_oid_map + + # TBD - clean up table for rarely used OIDs + array set _name_oid_map { + oid_common_name "2.5.4.3" + oid_sur_name "2.5.4.4" + oid_device_serial_number "2.5.4.5" + oid_country_name "2.5.4.6" + oid_locality_name "2.5.4.7" + oid_state_or_province_name "2.5.4.8" + oid_street_address "2.5.4.9" + oid_organization_name "2.5.4.10" + oid_organizational_unit_name "2.5.4.11" + oid_title "2.5.4.12" + oid_description "2.5.4.13" + oid_search_guide "2.5.4.14" + oid_business_category "2.5.4.15" + oid_postal_address "2.5.4.16" + oid_postal_code "2.5.4.17" + oid_post_office_box "2.5.4.18" + oid_physical_delivery_office_name "2.5.4.19" + oid_telephone_number "2.5.4.20" + oid_telex_number "2.5.4.21" + oid_teletext_terminal_identifier "2.5.4.22" + oid_facsimile_telephone_number "2.5.4.23" + oid_x21_address "2.5.4.24" + oid_international_isdn_number "2.5.4.25" + oid_registered_address "2.5.4.26" + oid_destination_indicator "2.5.4.27" + oid_user_password "2.5.4.35" + oid_user_certificate "2.5.4.36" + oid_ca_certificate "2.5.4.37" + oid_authority_revocation_list "2.5.4.38" + oid_certificate_revocation_list "2.5.4.39" + oid_cross_certificate_pair "2.5.4.40" + + oid_rsa "1.2.840.113549" + oid_pkcs "1.2.840.113549.1" + oid_rsa_hash "1.2.840.113549.2" + oid_rsa_encrypt "1.2.840.113549.3" + + oid_pkcs_1 "1.2.840.113549.1.1" + oid_pkcs_2 "1.2.840.113549.1.2" + oid_pkcs_3 "1.2.840.113549.1.3" + oid_pkcs_4 "1.2.840.113549.1.4" + oid_pkcs_5 "1.2.840.113549.1.5" + oid_pkcs_6 "1.2.840.113549.1.6" + oid_pkcs_7 "1.2.840.113549.1.7" + oid_pkcs_8 "1.2.840.113549.1.8" + oid_pkcs_9 "1.2.840.113549.1.9" + oid_pkcs_10 "1.2.840.113549.1.10" + oid_pkcs_12 "1.2.840.113549.1.12" + + oid_rsa_rsa "1.2.840.113549.1.1.1" + oid_rsa_md2rsa "1.2.840.113549.1.1.2" + oid_rsa_md4rsa "1.2.840.113549.1.1.3" + oid_rsa_md5rsa "1.2.840.113549.1.1.4" + oid_rsa_sha1rsa "1.2.840.113549.1.1.5" + oid_rsa_setoaep_rsa "1.2.840.113549.1.1.6" + + oid_rsa_dh "1.2.840.113549.1.3.1" + + oid_rsa_data "1.2.840.113549.1.7.1" + oid_rsa_signeddata "1.2.840.113549.1.7.2" + oid_rsa_envelopeddata "1.2.840.113549.1.7.3" + oid_rsa_signenvdata "1.2.840.113549.1.7.4" + oid_rsa_digesteddata "1.2.840.113549.1.7.5" + oid_rsa_hasheddata "1.2.840.113549.1.7.5" + oid_rsa_encrypteddata "1.2.840.113549.1.7.6" + + oid_rsa_emailaddr "1.2.840.113549.1.9.1" + oid_rsa_unstructname "1.2.840.113549.1.9.2" + oid_rsa_contenttype "1.2.840.113549.1.9.3" + oid_rsa_messagedigest "1.2.840.113549.1.9.4" + oid_rsa_signingtime "1.2.840.113549.1.9.5" + oid_rsa_countersign "1.2.840.113549.1.9.6" + oid_rsa_challengepwd "1.2.840.113549.1.9.7" + oid_rsa_unstructaddr "1.2.840.113549.1.9.8" + oid_rsa_extcertattrs "1.2.840.113549.1.9.9" + oid_rsa_certextensions "1.2.840.113549.1.9.14" + oid_rsa_smimecapabilities "1.2.840.113549.1.9.15" + oid_rsa_prefersigneddata "1.2.840.113549.1.9.15.1" + + oid_rsa_smimealg "1.2.840.113549.1.9.16.3" + oid_rsa_smimealgesdh "1.2.840.113549.1.9.16.3.5" + oid_rsa_smimealgcms3deswrap "1.2.840.113549.1.9.16.3.6" + oid_rsa_smimealgcmsrc2wrap "1.2.840.113549.1.9.16.3.7" + + oid_rsa_md2 "1.2.840.113549.2.2" + oid_rsa_md4 "1.2.840.113549.2.4" + oid_rsa_md5 "1.2.840.113549.2.5" + + oid_rsa_rc2cbc "1.2.840.113549.3.2" + oid_rsa_rc4 "1.2.840.113549.3.4" + oid_rsa_des_ede3_cbc "1.2.840.113549.3.7" + oid_rsa_rc5_cbcpad "1.2.840.113549.3.9" + + + oid_ansi_x942 "1.2.840.10046" + oid_ansi_x942_dh "1.2.840.10046.2.1" + + oid_x957 "1.2.840.10040" + oid_x957_dsa "1.2.840.10040.4.1" + oid_x957_sha1dsa "1.2.840.10040.4.3" + + oid_ds "2.5" + oid_dsalg "2.5.8" + oid_dsalg_crpt "2.5.8.1" + oid_dsalg_hash "2.5.8.2" + oid_dsalg_sign "2.5.8.3" + oid_dsalg_rsa "2.5.8.1.1" + + oid_pkix_kp_server_auth "1.3.6.1.5.5.7.3.1" + oid_pkix_kp_client_auth "1.3.6.1.5.5.7.3.2" + oid_pkix_kp_code_signing "1.3.6.1.5.5.7.3.3" + oid_pkix_kp_email_protection "1.3.6.1.5.5.7.3.4" + oid_pkix_kp_ipsec_end_system "1.3.6.1.5.5.7.3.5" + oid_pkix_kp_ipsec_tunnel "1.3.6.1.5.5.7.3.6" + oid_pkix_kp_ipsec_user "1.3.6.1.5.5.7.3.7" + oid_pkix_kp_timestamp_signing "1.3.6.1.5.5.7.3.8" + oid_pkix_kp_ocsp_signing "1.3.6.1.5.5.7.3.9" + + oid_oiw "1.3.14" + + oid_oiwsec "1.3.14.3.2" + oid_oiwsec_md4rsa "1.3.14.3.2.2" + oid_oiwsec_md5rsa "1.3.14.3.2.3" + oid_oiwsec_md4rsa2 "1.3.14.3.2.4" + oid_oiwsec_desecb "1.3.14.3.2.6" + oid_oiwsec_descbc "1.3.14.3.2.7" + oid_oiwsec_desofb "1.3.14.3.2.8" + oid_oiwsec_descfb "1.3.14.3.2.9" + oid_oiwsec_desmac "1.3.14.3.2.10" + oid_oiwsec_rsasign "1.3.14.3.2.11" + oid_oiwsec_dsa "1.3.14.3.2.12" + oid_oiwsec_shadsa "1.3.14.3.2.13" + oid_oiwsec_mdc2rsa "1.3.14.3.2.14" + oid_oiwsec_sharsa "1.3.14.3.2.15" + oid_oiwsec_dhcommmod "1.3.14.3.2.16" + oid_oiwsec_desede "1.3.14.3.2.17" + oid_oiwsec_sha "1.3.14.3.2.18" + oid_oiwsec_mdc2 "1.3.14.3.2.19" + oid_oiwsec_dsacomm "1.3.14.3.2.20" + oid_oiwsec_dsacommsha "1.3.14.3.2.21" + oid_oiwsec_rsaxchg "1.3.14.3.2.22" + oid_oiwsec_keyhashseal "1.3.14.3.2.23" + oid_oiwsec_md2rsasign "1.3.14.3.2.24" + oid_oiwsec_md5rsasign "1.3.14.3.2.25" + oid_oiwsec_sha1 "1.3.14.3.2.26" + oid_oiwsec_dsasha1 "1.3.14.3.2.27" + oid_oiwsec_dsacommsha1 "1.3.14.3.2.28" + oid_oiwsec_sha1rsasign "1.3.14.3.2.29" + + oid_oiwdir "1.3.14.7.2" + oid_oiwdir_crpt "1.3.14.7.2.1" + oid_oiwdir_hash "1.3.14.7.2.2" + oid_oiwdir_sign "1.3.14.7.2.3" + oid_oiwdir_md2 "1.3.14.7.2.2.1" + oid_oiwdir_md2rsa "1.3.14.7.2.3.1" + + oid_infosec "2.16.840.1.101.2.1" + oid_infosec_sdnssignature "2.16.840.1.101.2.1.1.1" + oid_infosec_mosaicsignature "2.16.840.1.101.2.1.1.2" + oid_infosec_sdnsconfidentiality "2.16.840.1.101.2.1.1.3" + oid_infosec_mosaicconfidentiality "2.16.840.1.101.2.1.1.4" + oid_infosec_sdnsintegrity "2.16.840.1.101.2.1.1.5" + oid_infosec_mosaicintegrity "2.16.840.1.101.2.1.1.6" + oid_infosec_sdnstokenprotection "2.16.840.1.101.2.1.1.7" + oid_infosec_mosaictokenprotection "2.16.840.1.101.2.1.1.8" + oid_infosec_sdnskeymanagement "2.16.840.1.101.2.1.1.9" + oid_infosec_mosaickeymanagement "2.16.840.1.101.2.1.1.10" + oid_infosec_sdnskmandsig "2.16.840.1.101.2.1.1.11" + oid_infosec_mosaickmandsig "2.16.840.1.101.2.1.1.12" + oid_infosec_suiteasignature "2.16.840.1.101.2.1.1.13" + oid_infosec_suiteaconfidentiality "2.16.840.1.101.2.1.1.14" + oid_infosec_suiteaintegrity "2.16.840.1.101.2.1.1.15" + oid_infosec_suiteatokenprotection "2.16.840.1.101.2.1.1.16" + oid_infosec_suiteakeymanagement "2.16.840.1.101.2.1.1.17" + oid_infosec_suiteakmandsig "2.16.840.1.101.2.1.1.18" + oid_infosec_mosaicupdatedsig "2.16.840.1.101.2.1.1.19" + oid_infosec_mosaickmandupdsig "2.16.840.1.101.2.1.1.20" + oid_infosec_mosaicupdatedinteg "2.16.840.1.101.2.1.1.21" + } + + # OIDs for certificate extensions + array set _name_oid_map { + oid_authority_key_identifier_old "2.5.29.1" + oid_key_attributes "2.5.29.2" + oid_cert_policies_95 "2.5.29.3" + oid_key_usage_restriction "2.5.29.4" + oid_subject_alt_name_old "2.5.29.7" + oid_issuer_alt_name_old "2.5.29.8" + oid_basic_constraints_old "2.5.29.10" + oid_key_usage "2.5.29.15" + oid_privatekey_usage_period "2.5.29.16" + oid_basic_constraints "2.5.29.19" + + oid_cert_policies "2.5.29.32" + oid_any_cert_policy "2.5.29.32.0" + oid_inhibit_any_policy "2.5.29.54" + + oid_authority_key_identifier "2.5.29.35" + oid_subject_key_identifier "2.5.29.14" + oid_subject_alt_name2 "2.5.29.17" + oid_issuer_alt_name "2.5.29.18" + oid_crl_reason_code "2.5.29.21" + oid_reason_code_hold "2.5.29.23" + oid_crl_dist_points "2.5.29.31" + oid_enhanced_key_usage "2.5.29.37" + + oid_any_enhanced_key_usage "2.5.29.37.0" + + oid_crl_number "2.5.29.20" + oid_delta_crl_indicator "2.5.29.27" + oid_issuing_dist_point "2.5.29.28" + oid_freshest_crl "2.5.29.46" + oid_name_constraints "2.5.29.30" + + oid_policy_mappings "2.5.29.33" + oid_legacy_policy_mappings "2.5.29.5" + oid_policy_constraints "2.5.29.36" + } + + array set _oid_name_map [swapl [array get _name_oid_map]] +} { + variable _name_oid_map + return [array get _name_oid_map $pattern] +} + +# TBD - document +proc twapi::oidgroup {oidgroup} { + if {[string is integer -strict $oidgroup]} { + return $oidgroup + } + return [dict! { + oidgroup_hash_alg 1 + oidgroup_encrypt_alg 2 + oidgroup_pubkey_alg 3 + oidgroup_sign_alg 4 + oidgroup_rdn_attr 5 + oidgroup_ext_or_attr 6 + oidgroup_enhkey_usage 7 + oidgroup_policy 8 + oidgroup_template 9 + } $oidgroup] +} + +# TBD - document +proc twapi::oidgroup_token {oidgroup} { + return [lindex { + {} + oidgroup_hash_alg + oidgroup_encrypt_alg + oidgroup_pubkey_alg + oidgroup_sign_alg + oidgroup_rdn_attr + oidgroup_ext_or_attr + oidgroup_enhkey_usage + oidgroup_policy + oidgroup_template + } $oidgroup] +} + +proc twapi::_make_altnames_ext {altnames {critical 0} {issuer 0}} { + set names {} + foreach pair $altnames { + lassign $pair alttype altname + lappend names [list \ + [dict get { + other 1 + email 2 + dns 3 + directory 5 + url 7 + ip 8 + registered 9 + } $alttype] $altname] + } + + return [list [expr {$issuer ? "2.5.29.18" : "2.5.29.17"}] $critical $names] +} + +proc twapi::_get_enhkey_usage_oids {names} { + array set map [oids oid_pkix_kp_*] + + # We use an array to remove duplicates + array set oids {} + foreach name $names { + if {[info exists map($name)]} { + set oids($map($name)) 1 + } elseif {[info exists map(oid_pkix_kp_$name)]} { + set oids($map(oid_pkix_kp_$name)) 1 + } elseif {[regexp {^\d([\d\.]*\d)?$} $name]} { + # Any OID will do + set oids($name) 1 + } else { + error "Invalid Enhanced Key Usage OID \"$name\"" + } + } + return [array names oids] +} + +proc twapi::_make_enhkeyusage_ext {enhkeyusage {critical 0}} { + return [list "2.5.29.37" $critical [_get_enhkey_usage_oids $enhkeyusage]] +} + +twapi::proc* twapi::_init_keyusage_names {} { + variable _keyusage_byte1 + variable _keyusage_byte2 + set _keyusage_byte1 { + digital_signature 0x80 + non_repudiation 0x40 + key_encipherment 0x20 + data_encipherment 0x10 + key_agreement 0x08 + key_cert_sign 0x04 + crl_sign 0x02 + encipher_only 0x01 + } + set _keyusage_byte2 { + decipher_only 0x80 + } +} {} + +proc twapi::_make_basic_constraints_ext {basicconstraints {critical 1}} { + lassign $basicconstraints isca capathlenvalid capathlen + if {[string is boolean $isca] && [string is boolean $capathlenvalid] && + [string is integer -strict $capathlen] && $capathlen >= 0} { + return [list "2.5.29.19" $critical [list $isca $capathlenvalid $capathlen]] + } + error "Invalid basicconstraints value" +} + +proc twapi::_make_keyusage_ext {keyusage {critical 0}} { + variable _keyusage_byte1 + variable _keyusage_byte2 + + _init_keyusage_names + set byte1 0 + set byte2 0 + foreach usage $keyusage { + if {[dict exists $_keyusage_byte1 $usage]} { + set byte1 [expr {$byte1 | [dict get $_keyusage_byte1 $usage]}] + } elseif {[dict exists $_keyusage_byte2 $usage]} { + set byte2 [expr {$byte2 | [dict get $_keyusage_byte2 $usage]}] + } else { + error "Invalid key usage value \"$keyusage\"" + } + } + + set bin [binary format cc $byte1 $byte2] + # 7 -> # unused bits in last byte + return [list "2.5.29.15" $critical [list $bin 7]] +} + +# Given a byte array, decode to key usage flags +proc twapi::_cert_decode_keyusage {bin} { + variable _keyusage_byte1 + variable _keyusage_byte2 + + _init_keyusage_names + + binary scan $bin c* bytes + + if {[llength $bytes] == 0} { + return *; # Field not present, TBD + } + + set usages {} + set byte [lindex $bytes 0] + dict for {key val} $_keyusage_byte1 { + if {$byte & $val} { + lappend usages $key + } + } + + set byte [lindex $bytes 1] + dict for {key val} $_keyusage_byte2 { + if {$byte & $val} { + lappend usages $key + set byte [expr {$byte & ~$val}] + } + } + + if {0} { + # Commented out because some certificates seem to contain + # bits not defined by RF5280. Do not barf on these + + # For the second byte, not all bits are defined. Error if any + # that we do not understand + if {$byte} { + error "Key usage sequence $bytes includes unsupported bits" + } + + # If there are more bytes, they should all be 0 as well + foreach byte [lrange $bytes 2 end] { + if {$byte} { + error "Key usage sequence $bytes includes unsupported bits" + } + } + } + + return $usages +} + +proc twapi::_cert_decode_enhkey {vals} { + set result {} + set symmap [swapl [oids oid_pkix_kp_*]] + foreach val $vals { + if {[dict exists $symmap $val]} { + lappend result [string range [dict get $symmap $val] 12 end] + } else { + lappend result $val + } + } + return $result +} + +proc twapi::_cert_decode_extension {oid val} { + # TBD - see what other types need to be decoded + # 2.5.29.19 - basic constraints + # + switch $oid { + 2.5.29.15 { return [_cert_decode_keyusage $val] } + 2.5.29.37 { return [_cert_decode_enhkey $val] } + 2.5.29.17 - + 2.5.29.18 { + # TBD - replace with lmap for 8.6 + set names {} + foreach elem $val { + lappend names [list [dict* { + 1 other 2 email 3 dns 5 directory 7 url 8 ip 9 registered + } [lindex $elem 0]] [lindex $elem 1]] + } + return $names + } + } + return $val +} + +proc twapi::_crypt_keyspec {keyspec} { + return [dict* {keyexchange 1 signature 2} $keyspec] +} + +proc twapi::_cert_create_parse_options {optvals optsvar} { + upvar 1 $optsvar opts + + # TBD - add -issueraltnames + parseargs optvals { + start.arg + end.arg + serialnumber.arg + altnames.arg + enhkeyusage.arg + keyusage.arg + basicconstraints.arg + {purpose.arg {}} + {capathlen.int -1} + } -ignoreunknown -setvars + + set ca [expr {"ca" in $purpose}] + if {$ca} { + if {[info exists basicconstraints]} { + badargs! "Option -basicconstraints cannot be specified if \"ca\" is included in the -purpose option" + } + if {$capathlen < 0} { + set basicconstraints {{1 0 0} 1}; # No path length constraint + } else { + set basicconstraints [list [list 1 1 $capathlen] 1] + } + } else { + if {![info exists basicconstraints]} { + set basicconstraints {{0 0 0} 1} + } + } + set sslserver [expr {"server" in $purpose}] + set sslclient [expr {"client" in $purpose}] + + if {[info exists serialnumber]} { + if {$serialnumber <= 0 || $serialnumber > 0x7fffffffffffffff} { + badargs! "Serial number must be specified as a positive wide integer." + } + # Format as little endian + set opts(serialnumber) [binary format w $serialnumber] + } else { + # Generate 15 byte random and add high byte (little endian) + # to 0x01 to ensure it is treated as positive + set opts(serialnumber) "[random_bytes 15]\x01" + } + + # Validity period + if {[info exists start]} { + set opts(start) $start + } else { + set opts(start) [_seconds_to_timelist [clock seconds] 1] + } + if {[info exists end]} { + set opts(end) $end + } else { + set opts(end) $opts(start) + lset opts(end) 0 [expr {[lindex $opts(end) 0] + 1}] + # Ensure valid date (Feb 29 leap year -> non-leap year for example) + set opts(end) [clock format [clock scan [lrange $opts(end) 0 2] -format "%Y %N %e"] -format "%Y %N %e"] + lappend opts(end) 23 59 59 0 + } + + # Generate the extensions list + set exts {} + lappend exts [_make_basic_constraints_ext {*}$basicconstraints ] + if {$ca} { + lappend extra_keyusage key_cert_sign crl_sign + } + if {$sslserver || $sslclient} { + # TBD - not clear key_agreement is needed for SSL certs for + # either client or server. See + # https://access.redhat.com/documentation/en-us/red_hat_certificate_system/10/html/administration_guide/standard_x.509_v3_certificate_extensions + lappend extra_keyusage digital_signature key_encipherment key_agreement + if {$sslserver} { + lappend extra_enhkeyusage oid_pkix_kp_server_auth + } + if {$sslclient} { + lappend extra_enhkeyusage oid_pkix_kp_client_auth + } + } + + if {[info exists extra_keyusage]} { + if {[info exists keyusage]} { + # TBD - should it be marked critical or not ? + lset keyusage 0 [concat [lindex $keyusage 0] $extra_keyusage] + } else { + # TBD - should it be marked critical or not ? + set keyusage [list $extra_keyusage 1] + } + } + + if {[info exists keyusage]} { + lappend exts [_make_keyusage_ext {*}$keyusage] + } + + if {[info exists extra_enhkeyusage]} { + if {[info exists enhkeyusage]} { + # TBD - should it be marked critical or not ? + lset enhkeyusage 0 [concat [lindex $enhkeyusage 0] $extra_enhkeyusage] + } else { + # TBD - should it be marked critical or not ? + set enhkeyusage [list $extra_enhkeyusage 1] + } + } + if {[info exists enhkeyusage]} { + lappend exts [_make_enhkeyusage_ext {*}$enhkeyusage] + } + + if {[info exists altnames]} { + lappend exts [_make_altnames_ext {*}$altnames] + } + + set opts(extensions) $exts + + return $optvals +} + +proc twapi::_cert_add_parseargs {vargs} { + upvar 1 $vargs optvals + parseargs optvals { + {disposition.arg preserve {overwrite duplicate update preserve}} + } -maxleftover 0 -setvars + + # 4 -> CERT_STORE_ADD_ALWAYS + # 3 -> CERT_STORE_ADD_REPLACE_EXISTING + # 6 -> CERT_STORE_ADD_NEWER + # 1 -> CERT_STORE_ADD_NEW + + return [list disposition \ + [dict get { + duplicate 4 + overwrite 3 + update 6 + preserve 1 + } $disposition]] +} + +proc twapi::_parse_store_open_opts {optvals} { + array set opts [parseargs optvals { + {commitenable.bool 0 0x00010000} + {readonly.bool 0 0x00008000} + {existing.bool 0 0x00004000} + {create.bool 0 0x00002000} + {includearchived.bool 0 0x00000200} + {maxpermissions.bool 0 0x00001000} + {deferclose.bool 0 0x00000004} + {backupprivilege.bool 0 0x00000800} + } -maxleftover 0 -nulldefault] + + set flags 0 + foreach {opt val} [array get opts] { + incr flags $val + } + return $flags +} + +# Helper to return as der/pem based on encoding option +proc twapi::_as_pem_or_der {bin tag encoding} { + if {$encoding eq "pem"} { + # 1 -> CRYPT_STRING_BASE64 + # 0x80000000 -> LF-only, not CRLF + return "-----BEGIN $tag-----\n[CryptBinaryToString $bin 0x80000001]-----END $tag-----\n" + } else { + return $bin + } +} + +# Helper for converting input parameters if they are in PEM format +# pem_or_der is the data +# enc specifies the type of pem_or_der. If empty, we guess. +# pemtype should generally be +# 0 -> CRYPT_STRING_BASE64HEADER for certificates +# 1 -> CRYPT_STRING_BASE64 (no header) +# 3 -> CRYPT_STRING_BASE64REQUESTHEADER +# 6 -> CRYPT_STRING_BASE64_ANY (actually same as 0 or 1) +proc twapi::_pem_decode {pem_or_der enc {pemtype 6}} { + if {$enc eq "der"} { + return $pem_or_der + } + if {$enc eq "pem" || + [regexp -nocase {^\s*-----\s*BEGIN\s+} $pem_or_der]} { + return [CryptStringToBinary $pem_or_der $pemtype] + } + return $pem_or_der +} + +proc twapi::_is_pem {pem_or_der} { + return [regexp -nocase {^\s*-----\s*BEGIN\s+} $pem_or_der] +} + +# Utility proc to generate certs in a memory store - +# one self signed which is used to sign a client and a server cert +proc twapi::make_test_certs {{hstore {}} args} { + crypt_test_container_cleanup + + parseargs args { + {csp.arg {Microsoft Strong Cryptographic Provider}} + {csptype.arg prov_rsa_full} + unique + {duration.int 5} + } -maxleftover 0 -setvars + + set enddate [clock format [clock seconds] -format "%Y %N %e"] + lset enddate 0 [expr {[lindex $enddate 0]+$duration}] + # Ensure valid date e.g. Feb 29 non-leap year + set enddate [clock format [clock scan $enddate -format "%Y %N %e"] -format "%Y %N %e"] + + if {$unique} { + set uuid [twapi::new_uuid] + } else { + set uuid "" + } + + # Create the self signed CA cert + set container twapitestca$uuid + set crypt [twapi::crypt_acquire $container -csp $csp -csptype $csptype -create 1] + twapi::crypt_key_free [twapi::crypt_generate_key $crypt signature -exportable 1] + set ca_altnames [list [list [list email ${container}@twapitest.com] [list dns ${container}.twapitest.com] [list url http://${container}.twapitest.com] [list directory [cert_name_to_blob "CN=${container}altname"]] [list ip [binary format c4 {127 0 0 2}]]]] + set cert [twapi::cert_create_self_signed_from_crypt_context "CN=$container, C=IN, O=Tcl, OU=twapi" $crypt -purpose {ca} -altnames $ca_altnames -end $enddate] + if {[llength $hstore] == 0} { + set hstore [twapi::cert_temporary_store] + } + set ca_certificate [twapi::cert_store_add_certificate $hstore $cert] + twapi::cert_release $cert + twapi::cert_set_key_prov $ca_certificate $container signature -csp $csp -csptype $csptype + crypt_free $crypt + + # Create the client and server certs + foreach cert_type {intermediate server client altserver full min} { + set container twapitest${cert_type}$uuid + set subject $container + set crypt [twapi::crypt_acquire $container -csp $csp -csptype $csptype -create 1] + twapi::crypt_key_free [twapi::crypt_generate_key $crypt keyexchange -exportable 1] + switch $cert_type { + intermediate { + set req [cert_request_create "CN=$container, C=IN, O=Tcl, OU=twapi" $crypt keyexchange -purpose ca] + set signing_cert $ca_certificate + } + altserver { + # No COMMON name. Used for testing use of DNS altname + set altnames [list [list [list dns ${cert_type}.twapitest.com] [list dns ${cert_type}2.twapitest.com]]] + set req [cert_request_create "C=IN, O=Tcl, OU=twapi, OU=$container" $crypt keyexchange -purpose $cert_type -altnames $altnames] + set signing_cert $ca_certificate + } + client - + server { + set req [cert_request_create "CN=$container, C=IN, O=Tcl, OU=twapi" $crypt keyexchange -purpose $cert_type] + set signing_cert $intermediate_certificate + } + full { + set altnames [list [list [list email ${container}@twapitest.com] [list dns ${cert_type}.twapitest.com] [list url http://${container}.twapitest.com] [list directory [cert_name_to_blob "CN=${container}altname"]] [list ip [binary format c4 {127 0 0 1}]]]] + set req [cert_request_create \ + "CN=$container, C=IN, O=Tcl, OU=twapi" \ + $crypt keyexchange \ + -keyusage [list {crl_sign data_encipherment digital_signature key_agreement key_cert_sign key_encipherment non_repudiation} 1]\ + -enhkeyusage [list {client_auth code_signing email_protection ipsec_end_system ipsec_tunnel ipsec_user server_auth timestamp_signing ocsp_signing} 1] \ + -altnames $altnames] + set signing_cert $ca_certificate + } + min { + set req [cert_request_create "CN=$container" $crypt keyexchange] + set signing_cert $ca_certificate + } + } + crypt_free $crypt + set parsed_req [cert_request_parse $req] + set subject [dict get $parsed_req subject] + set pubkey [dict get $parsed_req pubkey] + set opts {} + foreach optname {-basicconstraints -keyusage -enhkeyusage -altnames} { + if {[dict exists $parsed_req extensions $optname]} { + lappend opts $optname [dict get $parsed_req extensions $optname] + } + } + set encoded_cert [cert_create $subject $pubkey $signing_cert {*}$opts -end $enddate] + set certificate [twapi::cert_store_add_encoded_certificate $hstore $encoded_cert] + twapi::cert_set_key_prov $certificate $container keyexchange -csp $csp -csptype $csptype + if {$cert_type eq "intermediate"} { + set intermediate_certificate $certificate + } else { + cert_release $certificate + } + } + + cert_release $ca_certificate + cert_release $intermediate_certificate + return $hstore +} + +proc twapi::dump_test_certs {hstore dir {pfxfile twapitest.pfx}} { + set fd [open [file join $dir $pfxfile] wb] + puts -nonewline $fd [cert_store_export_pfx $hstore "" -exportprivatekeys 1] + close $fd + cert_store_iterate $hstore c { + set fd [open [file join $dir [cert_subject_name $c -name simpledisplay].cer] wb] + puts -nonewline $fd [cert_export $c] + close $fd + } +} + +proc twapi::crypt_test_containers {} { + set crypt [crypt_acquire "" -verifycontext 1] + twapi::trap { + set names {} + foreach name [crypt_key_container_names $crypt] { + if {[string match -nocase twapitest* $name]} { + lappend names $name + } + } + } finally { + crypt_free $crypt + } + return $names +} + +proc twapi::crypt_test_container_cleanup {} { + foreach c [crypt_test_containers] { + crypt_key_container_delete $c + } +} + + +# If we are not being sourced from a executable resource, need to +# source the remaining support files. In the former case, they are +# automatically combined into one so the sourcing is not needed. +if {![info exists twapi::twapi_crypto_rc_sourced]} { + source [file join [file dirname [info script]] sspi.tcl] + source [file join [file dirname [info script]] tls.tcl] +} + diff --git a/src/punk86.vfs/lib/twapi4.7.2/device.tcl b/src/punk86.vfs/lib/twapi4.7.2/device.tcl new file mode 100644 index 00000000..3daf681e --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/device.tcl @@ -0,0 +1,624 @@ +# +# Copyright (c) 2008-2014 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi { + struct _PREVENT_MEDIA_REMOVAL { + BOOLEAN PreventMediaRemoval; + } + record device_element { class_guid device_instance reserved } +} + +interp alias {} close_devinfoset {} devinfoset_close + +proc twapi::rescan_devices {} { + CM_Reenumerate_DevNode_Ex [CM_Locate_DevNode_Ex "" 0] 0 +} + + +# Callback invoked for device changes. +# Does some processing of passed data and then invokes the +# real callback script +proc twapi::_device_notification_handler {id args} { + variable _device_notifiers + set idstr "devnotifier#$id" + if {![info exists _device_notifiers($idstr)]} { + # Notifications that expect a response default to "true" + return 1 + } + set script [lindex $_device_notifiers($idstr) 1] + + # For volume notifications, change drive bitmask to + # list of drives before passing back to script + set event [lindex $args 0] + if {[lindex $args 1] eq "volume" && + ($event eq "deviceremovecomplete" || $event eq "devicearrival")} { + lset args 2 [_drivemask_to_drivelist [lindex $args 2]] + + # Also indicate whether network volume and whether change is a media + # change or physical change + set attrs [list ] + set flags [lindex $args 3] + if {$flags & 1} { + lappend attrs mediachange + } + if {$flags & 2} { + lappend attrs networkvolume + } + lset args 3 $attrs + } + + return [uplevel #0 [linsert $script end $idstr {*}$args]] +} + +proc twapi::start_device_notifier {script args} { + variable _device_notifiers + + set script [lrange $script 0 end]; # Verify syntactically a list + + array set opts [parseargs args { + deviceinterface.arg + handle.arg + } -maxleftover 0] + + # For reference - some common device interface classes + # NOTE: NOT ALL HAVE BEEN VERIFIED! + # Network Card {ad498944-762f-11d0-8dcb-00c04fc3358c} + # Human Interface Device (HID) {4d1e55b2-f16f-11cf-88cb-001111000030} + # GUID_DEVINTERFACE_DISK - {53f56307-b6bf-11d0-94f2-00a0c91efb8b} + # GUID_DEVINTERFACE_CDROM - {53f56308-b6bf-11d0-94f2-00a0c91efb8b} + # GUID_DEVINTERFACE_PARTITION - {53f5630a-b6bf-11d0-94f2-00a0c91efb8b} + # GUID_DEVINTERFACE_TAPE - {53f5630b-b6bf-11d0-94f2-00a0c91efb8b} + # GUID_DEVINTERFACE_WRITEONCEDISK - {53f5630c-b6bf-11d0-94f2-00a0c91efb8b} + # GUID_DEVINTERFACE_VOLUME - {53f5630d-b6bf-11d0-94f2-00a0c91efb8b} + # GUID_DEVINTERFACE_MEDIUMCHANGER - {53f56310-b6bf-11d0-94f2-00a0c91efb8b} + # GUID_DEVINTERFACE_FLOPPY - {53f56311-b6bf-11d0-94f2-00a0c91efb8b} + # GUID_DEVINTERFACE_CDCHANGER - {53f56312-b6bf-11d0-94f2-00a0c91efb8b} + # GUID_DEVINTERFACE_STORAGEPORT - {2accfe60-c130-11d2-b082-00a0c91efb8b} + # GUID_DEVINTERFACE_KEYBOARD - {884b96c3-56ef-11d1-bc8c-00a0c91405dd} + # GUID_DEVINTERFACE_MOUSE - {378de44c-56ef-11d1-bc8c-00a0c91405dd} + # GUID_DEVINTERFACE_PARALLEL - {97F76EF0-F883-11D0-AF1F-0000F800845C} + # GUID_DEVINTERFACE_COMPORT - {86e0d1e0-8089-11d0-9ce4-08003e301f73} + # GUID_DEVINTERFACE_DISPLAY_ADAPTER - {5b45201d-f2f2-4f3b-85bb-30ff1f953599} + # GUID_DEVINTERFACE_USB_HUB - {f18a0e88-c30c-11d0-8815-00a0c906bed8} + # GUID_DEVINTERFACE_USB_DEVICE - {A5DCBF10-6530-11D2-901F-00C04FB951ED} + # GUID_DEVINTERFACE_USB_HOST_CONTROLLER - {3abf6f2d-71c4-462a-8a92-1e6861e6af27} + + + if {[info exists opts(deviceinterface)] && [info exists opts(handle)]} { + error "Options -deviceinterface and -handle are mutually exclusive." + } + + if {![info exists opts(deviceinterface)]} { + set opts(deviceinterface) "" + } + if {[info exists opts(handle)]} { + set type 6 + } else { + set opts(handle) NULL + switch -exact -- $opts(deviceinterface) { + port { set type 3 ; set opts(deviceinterface) "" } + volume { set type 2 ; set opts(deviceinterface) "" } + default { + # device interface class guid or empty string (for all device interfaces) + set type 5 + } + } + } + + set id [Twapi_RegisterDeviceNotification $type $opts(deviceinterface) $opts(handle)] + set idstr "devnotifier#$id" + + set _device_notifiers($idstr) [list $id $script] + return $idstr +} + +proc twapi::stop_device_notifier {idstr} { + variable _device_notifiers + + if {![info exists _device_notifiers($idstr)]} { + return; + } + + Twapi_UnregisterDeviceNotification [lindex $_device_notifiers($idstr) 0] + unset _device_notifiers($idstr) +} + +proc twapi::devinfoset {args} { + array set opts [parseargs args { + {guid.arg ""} + {classtype.arg setup {interface setup}} + {presentonly.bool false 0x2} + {currentprofileonly.bool false 0x8} + {deviceinfoset.arg NULL} + {hwin.int 0} + {system.arg ""} + {pnpenumerator.arg ""} + } -maxleftover 0] + + # DIGCF_ALLCLASSES is bitmask 4 + set flags [expr {$opts(guid) eq "" ? 0x4 : 0}] + if {$opts(classtype) eq "interface"} { + if {$opts(pnpenumerator) ne ""} { + error "The -pnpenumerator option cannot be used when -classtype interface is specified." + } + # DIGCF_DEVICEINTERFACE + set flags [expr {$flags | 0x10}] + } + + # DIGCF_PRESENT + set flags [expr {$flags | $opts(presentonly)}] + + # DIGCF_PRESENT + set flags [expr {$flags | $opts(currentprofileonly)}] + + return [SetupDiGetClassDevsEx \ + $opts(guid) \ + $opts(pnpenumerator) \ + $opts(hwin) \ + $flags \ + $opts(deviceinfoset) \ + $opts(system)] +} + + +# Given a device information set, returns the device elements within it +proc twapi::devinfoset_elements {hdevinfo} { + set result [list ] + set i 0 + trap { + while {true} { + lappend result [SetupDiEnumDeviceInfo $hdevinfo $i] + incr i + } + } onerror {TWAPI_WIN32 0x103} { + # Fine, Just means no more items + } onerror {TWAPI_WIN32 0x80070103} { + # Fine, Just means no more items (HRESULT version of above code) + } + + return $result +} + +# Given a device information set, returns the device elements within it +proc twapi::devinfoset_instance_ids {hdevinfo} { + set result [list ] + set i 0 + trap { + while {true} { + lappend result [device_element_instance_id $hdevinfo [SetupDiEnumDeviceInfo $hdevinfo $i]] + incr i + } + } onerror {TWAPI_WIN32 0x103} { + # Fine, Just means no more items + } onerror {TWAPI_WIN32 0x80070103} { + # Fine, Just means no more items (HRESULT version of above code) + } + + return $result +} + +# Returns a device instance element from a devinfoset +proc twapi::devinfoset_element {hdevinfo instance_id} { + return [SetupDiOpenDeviceInfo $hdevinfo $instance_id 0 0] +} + +# Get the registry property for a devinfoset element +proc twapi::devinfoset_element_registry_property {hdevinfo develem prop} { + Twapi_SetupDiGetDeviceRegistryProperty $hdevinfo $develem [_device_registry_sym_to_code $prop] +} + +# Given a device information set, returns a list of specified registry +# properties for all elements of the set +# args is list of properties to retrieve +proc twapi::devinfoset_registry_properties {hdevinfo args} { + set result [list ] + trap { + # Keep looping until there is an error saying no more items + set i 0 + while {true} { + + # First element is the DEVINFO_DATA element + set devinfo_data [SetupDiEnumDeviceInfo $hdevinfo $i] + set item [list -deviceelement $devinfo_data ] + + # Get all specified property values + foreach prop $args { + set intprop [_device_registry_sym_to_code $prop] + trap { + lappend item $prop \ + [list success \ + [Twapi_SetupDiGetDeviceRegistryProperty \ + $hdevinfo $devinfo_data $intprop]] + } onerror {} { + lappend item $prop [list fail [list [trapresult] $::errorCode]] + } + } + lappend result $item + + incr i + } + } onerror {TWAPI_WIN32 0x103} { + # Fine, Just means no more items + } onerror {TWAPI_WIN32 0x80070103} { + # Fine, Just means no more items (HRESULT version of above code) + } + + return $result +} + + +# Given a device information set, returns specified device interface +# properties +# TBD - document ? +proc twapi::devinfoset_interface_details {hdevinfo guid args} { + set result [list ] + + array set opts [parseargs args { + {matchdeviceelement.arg {}} + interfaceclass + flags + devicepath + deviceelement + ignoreerrors + } -maxleftover 0] + + trap { + # Keep looping until there is an error saying no more items + set i 0 + while {true} { + set interface_data [SetupDiEnumDeviceInterfaces $hdevinfo \ + $opts(matchdeviceelement) $guid $i] + set item [list ] + if {$opts(interfaceclass)} { + lappend item -interfaceclass [lindex $interface_data 0] + } + if {$opts(flags)} { + set flags [lindex $interface_data 1] + set symflags [_make_symbolic_bitmask $flags {active 1 default 2 removed 4} false] + lappend item -flags [linsert $symflags 0 $flags] + } + + if {$opts(devicepath) || $opts(deviceelement)} { + # Need to get device interface detail. + trap { + foreach {devicepath deviceelement} \ + [SetupDiGetDeviceInterfaceDetail \ + $hdevinfo \ + $interface_data \ + $opts(matchdeviceelement)] \ + break + + if {$opts(deviceelement)} { + lappend item -deviceelement $deviceelement + } + if {$opts(devicepath)} { + lappend item -devicepath $devicepath + } + } onerror {} { + if {! $opts(ignoreerrors)} { + rethrow + } + } + } + lappend result $item + + incr i + } + } onerror {TWAPI_WIN32 0x103} { + # Fine, Just means no more items + } onerror {TWAPI_WIN32 0x80070103} { + # Fine, Just means no more items (HRESULT version of above code) + } + + return $result +} + + +# Return the guids associated with a device class set name. Note +# the latter is not unique so multiple guids may be associated. +proc twapi::device_setup_class_name_to_guids {name args} { + array set opts [parseargs args { + system.arg + } -maxleftover 0 -nulldefault] + + return [twapi::SetupDiClassGuidsFromNameEx $name $opts(system)] +} + +# Utility functions + +proc twapi::_init_device_registry_code_maps {} { + variable _device_registry_syms + variable _device_registry_codes + + # Note this list is ordered based on the corresponding integer codes + set _device_registry_code_syms { + devicedesc hardwareid compatibleids unused0 service unused1 + unused2 class classguid driver configflags mfg friendlyname + location_information physical_device_object_name capabilities + ui_number upperfilters lowerfilters + bustypeguid legacybustype busnumber enumerator_name security + security_sds devtype exclusive characteristics address + ui_number_desc_format device_power_data + removal_policy removal_policy_hw_default removal_policy_override + install_state location_paths base_containerid + } + + set i 0 + foreach sym $_device_registry_code_syms { + set _device_registry_codes($sym) $i + incr i + } +} + +# Map a device registry property to a symbol +proc twapi::_device_registry_code_to_sym {code} { + _init_device_registry_code_maps + + # Once we have initialized, redefine ourselves so we do not do so + # every time. Note define at global ::twapi scope! + proc ::twapi::_device_registry_code_to_sym {code} { + variable _device_registry_code_syms + if {$code >= [llength $_device_registry_code_syms]} { + return $code + } else { + return [lindex $_device_registry_code_syms $code] + } + } + # Call the redefined proc + return [_device_registry_code_to_sym $code] +} + +# Map a device registry property symbol to a numeric code +proc twapi::_device_registry_sym_to_code {sym} { + _init_device_registry_code_maps + + # Once we have initialized, redefine ourselves so we do not do so + # every time. Note define at global ::twapi scope! + proc ::twapi::_device_registry_sym_to_code {sym} { + variable _device_registry_codes + # Return the value. If non-existent, an error will be raised + if {[info exists _device_registry_codes($sym)]} { + return $_device_registry_codes($sym) + } elseif {[string is integer -strict $sym]} { + return $sym + } else { + error "Unknown or unsupported device registry property symbol '$sym'" + } + } + # Call the redefined proc + return [_device_registry_sym_to_code $sym] +} + +# Do a device ioctl, returning result as a binary +# TBD - document that caller has to handle errors 122 (ERROR_INSUFFICIENT_BUFFER) and (ERROR_MORE_DATA) +proc twapi::device_ioctl {h code args} { + array set opts [parseargs args { + {input.arg {}} + {outputcount.int 0} + } -maxleftover 0] + + return [DeviceIoControl $h $code $opts(input) $opts(outputcount)] +} + + +# Return a list of physical disks. Note CD-ROMs and floppies not included +proc twapi::find_physical_disks {} { + # Disk interface class guid + set guid {{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}} + set hdevinfo [devinfoset \ + -guid $guid \ + -presentonly true \ + -classtype interface] + trap { + return [kl_flatten [devinfoset_interface_details $hdevinfo $guid -devicepath] -devicepath] + } finally { + devinfoset_close $hdevinfo + } +} + +# Return information about a physical disk +proc twapi::get_physical_disk_info {disk args} { + set result [list ] + + array set opts [parseargs args { + geometry + layout + all + } -maxleftover 0] + + if {$opts(all) || $opts(geometry) || $opts(layout)} { + set h [create_file $disk -createdisposition open_existing] + } + + trap { + if {$opts(all) || $opts(geometry)} { + # IOCTL_DISK_GET_DRIVE_GEOMETRY - 0x70000 + if {[binary scan [device_ioctl $h 0x70000 -outputcount 24] "wiiii" geom(-cylinders) geom(-mediatype) geom(-trackspercylinder) geom(-sectorspertrack) geom(-bytespersector)] != 5} { + error "DeviceIoControl 0x70000 on disk '$disk' returned insufficient data." + } + lappend result -geometry [array get geom] + } + + if {$opts(all) || $opts(layout)} { + # XP and later - IOCTL_DISK_GET_DRIVE_LAYOUT_EX + set data [device_ioctl $h 0x70050 -outputcount 624] + if {[binary scan $data "i i" partstyle layout(-partitioncount)] != 2} { + error "DeviceIoControl 0x70050 on disk '$disk' returned insufficient data." + } + set layout(-partitionstyle) [_partition_style_sym $partstyle] + switch -exact -- $layout(-partitionstyle) { + mbr { + if {[binary scan $data "@8 i" layout(-signature)] != 1} { + error "DeviceIoControl 0x70050 on disk '$disk' returned insufficient data." + } + } + gpt { + set pi(-diskid) [_binary_to_guid $data 32] + if {[binary scan $data "@8 w w i" layout(-startingusableoffset) layout(-usablelength) layout(-maxpartitioncount)] != 3} { + error "DeviceIoControl 0x70050 on disk '$disk' returned insufficient data." + } + } + raw - + unknown { + # No fields to add + } + } + + set layout(-partitions) [list ] + for {set i 0} {$i < $layout(-partitioncount)} {incr i} { + # Decode each partition in turn. Sizeof of PARTITION_INFORMATION_EX is 144 + lappend layout(-partitions) [_decode_PARTITION_INFORMATION_EX_binary $data [expr {48 + (144*$i)}]] + } + lappend result -layout [array get layout] + } + + } finally { + if {[info exists h]} { + CloseHandle $h + } + } + + return $result +} + +# Given a Tcl binary and offset, decode the PARTITION_INFORMATION_EX record +proc twapi::_decode_PARTITION_INFORMATION_EX_binary {bin off} { + if {[binary scan $bin "@$off i x4 w w i c" \ + pi(-partitionstyle) \ + pi(-startingoffset) \ + pi(-partitionlength) \ + pi(-partitionnumber) \ + pi(-rewritepartition)] != 5} { + error "Truncated partition structure." + } + + set pi(-partitionstyle) [_partition_style_sym $pi(-partitionstyle)] + + # MBR/GPT are at offset 32 in the structure + switch -exact -- $pi(-partitionstyle) { + mbr { + if {[binary scan $bin "@$off x32 c c c x i" pi(-partitiontype) pi(-bootindicator) pi(-recognizedpartition) pi(-hiddensectors)] != 4} { + error "Truncated partition structure." + } + # Show partition type in hex, not negative number + set pi(-partitiontype) [format 0x%2.2x [expr {0xff & $pi(-partitiontype)}]] + } + gpt { + set pi(-partitiontype) [_binary_to_guid $bin [expr {$off+32}]] + set pi(-partitionif) [_binary_to_guid $bin [expr {$off+48}]] + if {[binary scan $bin "@$off x64 w" pi(-attributes)] != 1} { + error "Truncated partition structure." + } + set pi(-name) [_ucs16_binary_to_string [string range $bin [expr {$off+72}] end]] + } + raw - + unknown { + # No fields to add + } + + } + + return [array get pi] +} + +# IOCTL_STORAGE_EJECT_MEDIA +interp alias {} twapi::eject {} twapi::eject_media +proc twapi::eject_media device { + # http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q165721& + set h [_open_disk_device $device] + trap { + device_ioctl $h 0x90018; # FSCTL_LOCK_VOLUME + device_ioctl $h 0x90020; # FSCTL_DISMOUNT_VOLUME + # IOCTL_STORAGE_MEDIA_REMOVAL (0) + device_ioctl $h 0x2d4804 -input [_PREVENT_MEDIA_REMOVAL 0] + device_ioctl $h 0x2d4808; # IOCTL_STORAGE_EJECT_MEDIA + } finally { + close_handle $h + } +} + +# IOCTL_DISK_LOAD_MEDIA +# TBD - should we use IOCTL_DISK_LOAD_MEDIA2 instead (0x2d080c) see +# SDK, faster if read / write access not necessary. We are closing +# the handle right away anyway but would that stop other apps from +# acessing the file system on the CD ? Need to try (note device +# has to be opened with FILE_READ_ATTRIBUTES only in that case) + +interp alias {} twapi::load_media {} twapi::_issue_disk_ioctl 0x2d480c + +# FSCTL_LOCK_VOLUME +# TBD - interp alias {} twapi::lock_volume {} twapi::_issue_disk_ioctl 0x90018 +# FSCTL_LOCK_VOLUME +# TBD - interp alias {} twapi::unlock_volume {} twapi::_issue_disk_ioctl 0x9001c + +proc twapi::_lock_media {lock device} { + # IOCTL_STORAGE_MEDIA_REMOVAL + _issue_disk_ioctl 0x2d4804 $device -input [_PREVENT_MEDIA_REMOVAL $lock] +} +interp alias {} twapi::lock_media {} twapi::_lock_media 1 +interp alias {} twapi::unlock_media {} twapi::_lock_media 0 + +proc twapi::_issue_disk_ioctl {ioctl device args} { + set h [_open_disk_device $device] + trap { + device_ioctl $h $ioctl {*}$args + } finally { + close_handle $h + } +} + +twapi::proc* twapi::_open_disk_device {device} { + package require twapi_storage +} { + # device must be "cdrom", X:, X:\\, X:/, a volume or a physical disk as + # returned from find_physical_disks + switch -regexp -nocase -- $device { + {^cdrom$} { + foreach drive [find_logical_drives] { + if {![catch {get_drive_type $drive} drive_type]} { + if {$drive_type eq "cdrom"} { + set device "\\\\.\\$drive" + break + } + } + } + if {$device eq "cdrom"} { + error "Could not find a CD-ROM device." + } + } + {^[[:alpha:]]:(/|\\)?$} { + set device "\\\\.\\[string range $device 0 1]" + } + {^\\\\\?\\.*#\{[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}\}$} { + # Device name ok + } + {^\\\\\?\\Volume\{[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}\}\\?$} { + # Volume name ok. But make sure we trim off any trailing + # \ since create_file will open the root dir instead of the device + set device [string trimright $device \\] + } + default { + # Just to prevent us from opening some file instead + error "Invalid device name '$device'" + } + } + + # http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q165721& + return [create_file $device -access {generic_read generic_write} \ + -createdisposition open_existing \ + -share {read write}] +} + + +# Map a partition style code to a symbol +proc twapi::_partition_style_sym {partstyle} { + set partstyle [lindex {mbr gpt raw} $partstyle] + if {$partstyle ne ""} { + return $partstyle + } + return "unknown" +} + diff --git a/src/punk86.vfs/lib/twapi4.7.2/etw.tcl b/src/punk86.vfs/lib/twapi4.7.2/etw.tcl new file mode 100644 index 00000000..df8d60a0 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/etw.tcl @@ -0,0 +1,1390 @@ +# +# Copyright (c) 2012-2014 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi { + # GUID's and event types for ETW. + variable _etw_mof + array set _etw_mof { + provider_name "TwapiETWProvider" + provider_guid "{B358E9D9-4D82-4A82-A129-BAC098C54746}" + eventclass_name "TwapiETWEventClass" + eventclass_guid "{D5B52E95-8447-40C1-B316-539894449B36}" + } + + # So we don't pollute namespace with temp vars + apply [list defs { + foreach {key val} $defs { + proc etw_twapi_$key {} "return $val" + } + } [namespace current]] [array get _etw_mof] + + # Cache of event definitions for parsing MOF events. Nested dictionary + # with the following structure (uppercase keys are variables, + # lower case are constant/tokens, "->" is nested dict, "-" is scalar): + # EVENTCLASSGUID -> + # classname - name of the class + # definitions -> + # VERSION -> + # EVENTTYPE -> + # eventtype - same as EVENTTYPE + # eventtypename - name / description for the event type + # fieldtypes - ordered list of field types for that event + # fields -> + # FIELDINDEX -> + # type - the field type in string format + # fieldtype - the corresponding field type numeric value + # extension - the MoF extension qualifier for the field + # + # The cache assumes that MOF event definitions are globally identical + # (ie. same on local and remote systems) + variable _etw_event_defs + set _etw_event_defs [dict create] + + # Keeps track of open trace handles for reading + variable _etw_trace_consumers + array set _etw_trace_consumers {} + + # Keep track of trace controller handles. Note we do not always + # need a handle for controller actions. We can also control based + # on name, for example if some other process has started the trace + variable _etw_trace_controllers + array set _etw_trace_controllers {} + + # + # These record definitions match the lists constructed in the ETW C code + # Note these are purposely formatted on single line so the record fieldnames + # print better. + + # Buffer header (EVENT_TRACE_LOGFILE) + record etw_event_trace_logfile {logfile logger_name current_time buffers_read trace_logfile_header buffer_size filled kernel_trace} + + # TRACE_LOGFILE_HEADER + record etw_trace_logfile_header {buffer_size version_major version_minor version_submajor version_subminor provider_version processor_count end_time timer_resolution max_file_size logfile_mode buffers_written pointer_size events_lost cpu_mhz time_zone boot_time perf_frequency start_time reserved_flags buffers_lost } + + # TDH based event definitions + + record tdh_event { header buffer_context extended_data data } + + record tdh_event_header { flags event_property tid pid timestamp + kernel_time user_time processor_time activity_id descriptor provider_guid} + record tdh_event_buffer_context { processor logger_id } + record tdh_event_data {provider_guid event_guid decoder provider_name level_name channel_name keyword_names task_name opcode_name message localized_provider_name activity_id related_activity_id properties flags} + + record tdh_event_data_descriptor {id version channel level opcode task keywords} + + # Definitions for EVENT_TRACE_LOGFILE + record tdh_buffer { logfile logger current_time buffers_read header buffer_size filled kernel_trace } + + record tdh_logfile_header { size major_version minor_version sub_version subminor_version provider_version processor_count end_time resolution max_file_size logfile_mode buffers_written pointer_size events_lost cpu_mhz timezone boot_time perf_frequency start_time reserved_flags buffers_lost } + + # MOF based event definitions + record mof_event {header instance_id parent_instance_id parent_guid data} + record mof_event_header {type level version tid pid timestamp guid kernel_time user_time processor_time} + + # Standard app visible event definitions. These are made + # compatible with the evt_* routines + record etw_event {-eventid -version -channel -level -opcode -task -keywordmask -timecreated -tid -pid -providerguid -usertime -kerneltime -providername -eventguid -channelname -levelname -opcodename -taskname -keywords -properties -message -sid} + + # Record for EVENT_TRACE_PROPERTIES + # TBD - document + record etw_trace_properties {logfile trace_name trace_guid buffer_size min_buffers max_buffers max_file_size logfile_mode flush_timer enable_flags clock_resolution age_limit buffer_count free_buffers events_lost buffers_written log_buffers_lost real_time_buffers_lost logger_tid} +} + + +proc twapi::etw_get_traces {args} { + parseargs args {detail} -setvars -maxleftover 0 + set sessions {} + foreach sess [QueryAllTraces] { + set name [etw_trace_properties trace_name $sess] + if {$detail} { + lappend sessions [etw_trace_properties $sess] + } else { + lappend sessions $name + } + } + return $sessions +} + +if {[twapi::min_os_version 6]} { + proc twapi::etw_get_provider_guid {name} { + return [lindex [Twapi_TdhEnumerateProviders $name] 0] + } + proc twapi::etw_get_providers {args} { + parseargs args { + detail + {types.arg {mof xml}} + } -setvars -maxleftover 0 + set providers {} + foreach rec [Twapi_TdhEnumerateProviders] { + lassign $rec guid type name + set type [dict* {0 xml 1 mof} $type] + if {$type in $types} { + if {$detail} { + lappend providers [list guid $guid type $type name $name] + } else { + lappend providers $name + } + } + } + return $providers + } +} else { + twapi::proc* twapi::etw_get_provider_guid {lookup_name} { + package require twapi_wmi + } { + set wmi [wmi_root -root wmi] + set oclasses {} + set providers {} + # TBD - check if ExecQuery would be faster + trap { + # All providers are direct subclasses of the EventTrace class + set oclasses [wmi_collect_classes $wmi -ancestor EventTrace -shallow] + foreach ocls $oclasses { + set quals [$ocls Qualifiers_] + trap { + set name [$quals -with {{Item Description}} -invoke Value 2 {}] + if {[string equal -nocase $name $lookup_name]} { + return [$quals -with {{Item Guid}} -invoke Value 2 {}] + } + } finally { + $quals -destroy + } + } + } finally { + foreach ocls $oclasses {$ocls -destroy} + $wmi -destroy + } + return "" + } + + twapi::proc* twapi::etw_get_providers {args} { + package require twapi_wmi + } { + parseargs args { detail {types.arg {mof xml}} } -setvars -maxleftover 0 + if {"mof" ni $types} { + return {}; # Older systems do not have xml based providers + } + set wmi [wmi_root -root wmi] + set oclasses {} + set providers {} + # TBD - check if ExecQuery would be faster + trap { + # All providers are direct subclasses of the EventTrace class + set oclasses [wmi_collect_classes $wmi -ancestor EventTrace -shallow] + foreach ocls $oclasses { + set quals [$ocls Qualifiers_] + trap { + set name [$quals -with {{Item Description}} -invoke Value 2 {}] + set guid [$quals -with {{Item Guid}} -invoke Value 2 {}] + if {$detail} { + lappend providers [list guid $guid type mof name $name] + } else { + lappend providers $name + } + } finally { + $quals -destroy + } + } + } finally { + foreach ocls $oclasses {$ocls -destroy} + $wmi -destroy + } + return $providers + } +} + +twapi::proc* twapi::etw_install_twapi_mof {} { + package require twapi_wmi +} { + variable _etw_mof + + # MOF definition for our ETW trace event. This is loaded into + # the system WMI registry so event readers can decode our events + # + # Note all strings are NullTerminated and not Counted so embedded nulls + # will not be handled correctly. The problem with using Counted strings + # is that the MSDN docs are inconsistent as to whether the count + # is number of *bytes* or number of *characters* and the existing tools + # are similarly confused. We avoid this by choosing null terminated + # strings despite the embedded nulls drawback. + # TBD - revisit this and see if counted can always be treated as + # bytes and not characters. + + # We do not want the pure binary builds think #pragma is a comment + # and remove the line! Bug 170 + #createtmfile-disable-compaction + set mof_template { + #pragma namespace("\\\\.\\root\\wmi") + + // Keep Description same as provider_name as that is how + // TDH library identifies it. Else there will be a mismatch + // between TdhEnumerateProviders and how we internally assume is + // the provider name + [dynamic: ToInstance, Description("@provider_name"), + Guid("@provider_guid")] + class @provider_name : EventTrace + { + }; + + [dynamic: ToInstance, Description("TWAPI ETW event class"): Amended, + Guid("@eventclass_guid")] + class @eventclass_name : @provider_name + { + }; + + // NOTE: The EventTypeName is REQUIRED else the MS LogParser app + // crashes (even though it should not) + + [dynamic: ToInstance, Description("TWAPI log message"): Amended, + EventType(1), EventTypeName("Message")] + class @eventclass_name_Message : @eventclass_name + { + [WmiDataId(1), Description("Log message"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Message; + }; + + [dynamic: ToInstance, Description("TWAPI variable trace"): Amended, + EventType(2), EventTypeName("VariableTrace")] + class @eventclass_name_VariableTrace : @eventclass_name + { + [WmiDataId(1), Description("Operation"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Operation; + [WmiDataId(2), Description("Variable name"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Name; + [WmiDataId(3), Description("Array index"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Index; + [WmiDataId(4), Description("Value"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Value; + [WmiDataId(5), Description("Context"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Context; + }; + + [dynamic: ToInstance, Description("TWAPI execution trace"): Amended, + EventType(3), EventTypeName("ExecutionTrace")] + class @eventclass_name_ExecutionTrace : @eventclass_name + { + [WmiDataId(1), Description("Operation"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Operation; + [WmiDataId(2), Description("Executed command"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Command; + [WmiDataId(3), Description("Status code"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Code; + [WmiDataId(4), Description("Result"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Result; + [WmiDataId(5), Description("Context"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Context; + }; + + [dynamic: ToInstance, Description("TWAPI command trace"): Amended, + EventType(4), EventTypeName("CommandTrace")] + class @eventclass_name_CommandTrace : @eventclass_name + { + [WmiDataId(1), Description("Operation"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Operation; + [WmiDataId(2), Description("Old command name"): Amended, read, StringTermination("NullTerminated"), Format("w")] string OldName; + [WmiDataId(3), Description("New command name"): Amended, read, StringTermination("NullTerminated"), Format("w")] string NewName; + [WmiDataId(4), Description("Context"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Context; + }; + } + + #createtmfile-enable-compaction + + set mof [string map \ + [list @provider_name $_etw_mof(provider_name) \ + @provider_guid $_etw_mof(provider_guid) \ + @eventclass_name $_etw_mof(eventclass_name) \ + @eventclass_guid $_etw_mof(eventclass_guid) \ + ] $mof_template] + + set mofc [twapi::IMofCompilerProxy new] + twapi::trap { + $mofc CompileBuffer $mof + } finally { + $mofc Release + } +} + +proc twapi::etw_uninstall_twapi_mof {} { + variable _etw_mof + + set wmi [twapi::_wmi wmi] + trap { + set omof [$wmi Get $_etw_mof(provider_name)] + $omof Delete_ + } finally { + if {[info exists omof]} { + $omof destroy + } + $wmi destroy + } +} + +proc twapi::etw_twapi_provider_register {} { + variable _etw_mof + return [twapi::RegisterTraceGuids $_etw_mof(provider_guid) $_etw_mof(eventclass_guid)] +} + +proc twapi::etw_log_message {htrace message {level 4}} { + set level [_etw_level_to_int $level] + if {[etw_provider_enable_level] >= $level} { + # Must match Message event type in MoF definition + # 1 -> event type for Message + TraceEvent $htrace 1 $level [encoding convertto unicode "$message\0"] + } +} + +proc twapi::etw_variable_tracker {htrace name1 name2 op} { + switch -exact -- $op { + array - + unset { set var "" } + default { + if {$name2 eq ""} { + upvar 1 $name1 var + } else { + upvar 1 $name1($name2) var + } + } + } + + if {[info level] > 1} { + set context [info level -1] + } else { + set context "" + } + + # Must match VariableTrace event type in MoF definition + TraceEvent $htrace 2 0 \ + [encoding convertto unicode "$op\0$name1\0$name2\0$var\0"] \ + [_etw_encode_limited_unicode $context] +} + + +proc twapi::etw_execution_tracker {htrace command args} { + set op [lindex $args end] + + switch -exact -- $op { + enter - + enterstep { + set code "" + set result "" + } + leave - + leavestep { + lassign $args code result + } + } + + if {[info level] > 1} { + set context [info level -1] + } else { + set context "" + } + + # Must match Execution event type in MoF definition + TraceEvent $htrace 3 0 \ + [encoding convertto unicode "$op\0"] \ + [_etw_encode_limited_unicode $command] \ + [encoding convertto unicode "$code\0"] \ + [_etw_encode_limited_unicode $result] \ + [_etw_encode_limited_unicode $context] +} + + +proc twapi::etw_command_tracker {htrace oldname newname op} { + if {[info level] > 1} { + set context [info level -1] + } else { + set context "" + } + # Must match CommandTrace event type in MoF definition + TraceEvent $htrace 4 0 \ + [encoding convertto unicode "$op\0$oldname\0$newname\0"] \ + [_etw_encode_limited_unicode $context] +} + +proc twapi::etw_parse_mof_event_class {ocls} { + # Returns a dict + # First level key - event type (integer) + # See description of _etw_event_defs for rest of the structure + + set result [dict create] + + # Iterate over the subclasses, collecting the event metadata + # Create a forward only enumerator for efficiency + # wbemFlagUseAmendedQualifiers|wbemFlagReturnImmediately|wbemFlagForwardOnly + # wbemQueryFlagsShallow + # -> 0x20031 + $ocls -with {{SubClasses_ 0x20031}} -iterate -cleanup osub { + # The subclass must have the eventtype property + # We fetch as a raw value so we can tell the + # original type + if {![catch { + $osub -with { + Qualifiers_ + {Item EventType} + } -invoke Value 2 {} -raw 1 + } event_types]} { + + # event_types is a raw value with a type descriptor as elem 0 + if {[variant_type $event_types] & 0x2000} { + # It is VT_ARRAY so value is already a list + set event_types [variant_value $event_types 0 0 0] + } else { + set event_types [list [variant_value $event_types 0 0 0]] + } + + set event_type_names {} + catch { + set event_type_names [$osub -with { + Qualifiers_ + {Item EventTypeName} + } -invoke Value 2 {} -raw 1] + # event_type_names is a raw value with a type descriptor as elem 0 + # It is IMPORTANT to check this else we cannot distinguish + # between a array (list) and a string with spaces + if {[variant_type $event_type_names] & 0x2000} { + # It is VT_ARRAY so value is already a list + set event_type_names [variant_value $event_type_names 0 0 0] + } else { + # Scalar value. Make into a list + set event_type_names [list [variant_value $event_type_names 0 0 0]] + } + } + + # The subclass has a EventType property. Pick up the + # field definitions. + set fields [dict create] + $osub -with Properties_ -iterate -cleanup oprop { + set quals [$oprop Qualifiers_] + # Event fields will have a WmiDataId qualifier + if {![catch {$quals -with {{Item WmiDataId}} Value} wmidataid]} { + # Yep this is a field, figure out its type + set type [_etw_decipher_mof_event_field_type $oprop $quals] + dict set type -fieldname [$oprop -get Name] + dict set fields $wmidataid $type + } + $quals destroy + } + + # Process the records to put the fields in order based on + # their wmidataid. If any info is missing or inconsistent + # we will mark the whole event type class has undecodable. + # Ids begin from 1. + set fieldtypes {} + for {set id 1} {$id <= [dict size $fields]} {incr id} { + if {![dict exists $fields $id]} { + # Discard all type info - missing type info + debuglog "Missing id $id for event type(s) $event_types for EventTrace Mof Class [$ocls -with {{SystemProperties_} {Item __CLASS}} Value]" + set fieldtypes {} + break; + } + lappend fieldtypes [dict get $fields $id -fieldname] [dict get $fields $id -fieldtype] + } + + foreach event_type $event_types event_type_name $event_type_names { + dict set result -definitions $event_type [dict create -eventtype $event_type -eventtypename $event_type_name -fields $fields -fieldtypes $fieldtypes] + } + } + } + + if {[dict size $result] == 0} { + return {} + } else { + dict set result -classname [$ocls -with {SystemProperties_ {Item __CLASS}} Value] + return $result + } +} + +# Deciphers an event field type + +proc twapi::_etw_decipher_mof_event_field_type {oprop oquals} { + # Maps event field type strings to enums to pass to the C code + # 0 should be unmapped. Note some are duplicates because they + # are the same format. Some are legacy formats not explicitly documented + # in MSDN but found in the sample code. + # Reference - Event Tracing MOF Qualifiers http://msdn.microsoft.com/en-us/library/windows/desktop/aa363800(v=vs.85).aspx + set etw_fieldtypes { + string 1 + stringnullterminated 1 + wstring 2 + wstringnullterminated 2 + stringcounted 3 + stringreversecounted 4 + wstringcounted 5 + wstringreversecounted 6 + boolean 7 + sint8 8 + uint8 9 + csint8 10 + cuint8 11 + sint16 12 + uint16 13 + uint32 14 + sint32 15 + sint64 16 + uint64 17 + xsint16 18 + xuint16 19 + xsint32 20 + xuint32 21 + xsint64 22 + xuint64 23 + real32 24 + real64 25 + object 26 + char16 27 + uint8guid 28 + objectguid 29 + objectipaddrv4 30 + uint32ipaddr 30 + objectipaddr 30 + objectipaddrv6 31 + objectvariant 32 + objectsid 33 + uint64wmitime 34 + objectwmitime 35 + uint16port 38 + objectport 39 + datetime 40 + stringnotcounted 41 + wstringnotcounted 42 + pointer 43 + sizet 43 + } + + # On any errors, we will set type to unknown or unsupported + set type unknown + set quals(extension) ""; # Hint for formatting for display + + if {![catch { + $oquals -with {{Item Pointer}} Value + }]} { + # Actual value does not matter + # If the Pointer qualifier exists, ignore everything else + set type pointer + } elseif {![catch { + $oquals -with {{Item PointerType}} Value + }]} { + # Actual value does not matter + # Some apps mistakenly use PointerType instead of Pointer + set type pointer + } else { + catch { + set type [string tolower [$oquals -with {{Item CIMTYPE}} Value]] + + # The following qualifiers may or may not exist + # TBD - not all may be required to be retrieved + # NOTE: MSDN says some qualifiers are case sensitive! + foreach qual {BitMap BitValues Extension Format Pointer StringTermination ValueMap Values ValueType XMLFragment} { + # catch in case it does not exist + set lqual [string tolower $qual] + set quals($lqual) "" + catch { + set quals($lqual) [$oquals -with [list [list Item $qual]] Value] + } + } + set type [string tolower "$quals(format)${type}$quals(stringtermination)"] + set quals(extension) [string tolower $quals(extension)] + # Not all extensions affect how the event field is extracted + # e.g. the noprint value + if {$quals(extension) in {ipaddr ipaddrv4 ipaddrv6 port variant wmitime guid sid}} { + append type $quals(extension) + } elseif {$quals(extension) eq "sizet"} { + set type sizet + } + } + } + + # Cannot handle arrays yet - TBD + if {[$oprop -get IsArray]} { + set type "arrayof$type" + } + + if {![dict exists $etw_fieldtypes $type]} { + set fieldtype 0 + } else { + set fieldtype [dict get $etw_fieldtypes $type] + } + + return [dict create -type $type -fieldtype $fieldtype -extension $quals(extension)] +} + +proc twapi::etw_find_mof_event_classes {oswbemservices args} { + # Return all classes where a GUID or name matches + + # To avoid iterating the tree multiple times, separate out the guids + # and the names and use separator comparators + + set guids {} + set names {} + + foreach arg $args { + if {[Twapi_IsValidGUID $arg]} { + # GUID's can be multiple format, canonicalize for lsearch + lappend guids [canonicalize_guid $arg] + } else { + lappend names $arg + } + } + + # Note there can be multiple versions sharing a single guid so + # we cannot use the wmi_collect_classes "-first" option to stop the + # search when one is found. + + set name_matcher [lambda* {names val} { + ::tcl::mathop::>= [lsearch -exact -nocase $names $val] 0 + } :: $names] + set guid_matcher [lambda* {guids val} { + ::tcl::mathop::>= [lsearch -exact -nocase $guids $val] 0 + } :: $guids] + + set named_classes {} + if {[llength $names]} { + foreach name $names { + catch {lappend named_classes [$oswbemservices Get $name]} + } + } + + if {[llength $guids]} { + set guid_classes [wmi_collect_classes $oswbemservices -ancestor EventTrace -matchqualifiers [list Guid $guid_matcher]] + } else { + set guid_classes {} + } + + return [concat $guid_classes $named_classes] +} + +proc twapi::etw_get_all_mof_event_classes {oswbemservices} { + return [twapi::wmi_collect_classes $oswbemservices -ancestor EventTrace -matchqualifiers [list Guid ::twapi::true]] +} + +proc twapi::etw_load_mof_event_class_obj {oswbemservices ocls} { + variable _etw_event_defs + set quals [$ocls Qualifiers_] + trap { + set guid [$quals -with {{Item Guid}} Value] + set vers "" + catch {set vers [$quals -with {{Item EventVersion}} Value]} + set def [etw_parse_mof_event_class $ocls] + # Class may be a provider, not a event class in which case + # def will be empty + if {[dict size $def]} { + dict set _etw_event_defs [canonicalize_guid $guid] $vers $def + } + } finally { + $quals destroy + } +} + +proc twapi::etw_load_mof_event_classes {oswbemservices args} { + if {[llength $args] == 0} { + set oclasses [etw_get_all_mof_event_classes $oswbemservices] + } else { + set oclasses [etw_find_mof_event_classes $oswbemservices {*}$args] + } + + foreach ocls $oclasses { + trap { + etw_load_mof_event_class_obj $oswbemservices $ocls + } finally { + $ocls destroy + } + } +} + +proc twapi::etw_open_file {path} { +# TBD - PROCESS_TRACE_MODE_RAW_TIMESTAMP + variable _etw_trace_consumers + + set path [file normalize $path] + + set htrace [OpenTrace $path 0] + set _etw_trace_consumers($htrace) $path + return $htrace +} + +proc twapi::etw_open_session {sessionname} { +# TBD - PROCESS_TRACE_MODE_RAW_TIMESTAMP + variable _etw_trace_consumers + + set htrace [OpenTrace $sessionname 1] + set _etw_trace_consumers($htrace) $sessionname + return $htrace +} + +proc twapi::etw_close_session {htrace} { + variable _etw_trace_consumers + + if {! [info exists _etw_trace_consumers($htrace)]} { + badargs! "Cannot find trace session with handle $htrace" + } + + CloseTrace $htrace + unset _etw_trace_consumers($htrace) + return +} + + +proc twapi::etw_process_events {args} { + array set opts [parseargs args { + callback.arg + start.arg + end.arg + } -nulldefault] + + if {[llength $args] == 0} { + error "At least one trace handle must be specified." + } + + return [ProcessTrace $args $opts(callback) $opts(start) $opts(end)] +} + +proc twapi::etw_open_formatter {} { + variable _etw_formatters + + if {[etw_force_mof] || ![twapi::min_os_version 6 0]} { + uplevel #0 package require twapi_wmi + # Need WMI MOF definitions + set id mof[TwapiId] + dict set _etw_formatters $id OSWBemServices [wmi_root -root wmi] + } else { + # Just a dummy if using a TDH based api + set id tdh[TwapiId] + # Nothing to set as yet but for consistency with MOF implementation + dict set _etw_formatters $id {} + } + return $id +} + +proc twapi::etw_close_formatter {formatter} { + variable _etw_formatters + if {[dict exists $_etw_formatters $formatter OSWBemServices]} { + [dict get $_etw_formatters $formatter OSWBemServices] -destroy + } + + dict unset _etw_formatters $formatter + if {[dict size $_etw_formatters] == 0} { + variable _etw_event_defs + # No more formatters + # Clear out event defs cache which can be quite large + # Really only needed for mof but doesn't matter + set _etw_event_defs {} + } + + return +} + +proc twapi::etw_format_events {formatter args} { + variable _etw_formatters + + if {![dict exists $_etw_formatters $formatter]} { + # We could actually just init ourselves but we want to force + # consistency and caller to release wmi COM object + badargs! "Invalid ETW formatter id \"$formatter\"" + } + + set events {} + if {[dict exists $_etw_formatters $formatter OSWBemServices]} { + set oswbemservices [dict get $_etw_formatters $formatter OSWBemServices] + foreach {bufd rawevents} $args { + lappend events [_etw_format_mof_events $oswbemservices $bufd $rawevents] + } + } else { + foreach {bufd rawevents} $args { + lappend events [_etw_format_tdh_events $bufd $rawevents] + } + } + + # Return as a recordarray + return [list [etw_event] [lconcat {*}$events]] +} + +proc twapi::_etw_format_tdh_events {bufdesc events} { + + set bufhdr [etw_event_trace_logfile trace_logfile_header $bufdesc] + set timer_resolution [etw_trace_logfile_header timer_resolution $bufhdr] + set private_session [expr {0x800 & [etw_trace_logfile_header logfile_mode $bufhdr]}] + set pointer_size [etw_trace_logfile_header pointer_size $bufhdr] + + set formatted_events {} + foreach event $events { + array set fields [tdh_event $event] + set formatted_event [tdh_event_header descriptor $fields(header)] + # Do not select provider_guid from header as for TDH it needs to come + # from the provider_guid in the data portion. + lappend formatted_event {*}[tdh_event_header select $fields(header) {timestamp tid pid}] + lappend formatted_event {*}[tdh_event_data select $fields(data) provider_guid] + if {$private_session} { + lappend formatted_event [expr {[tdh_event_header processor_time $fields(header)] * $timer_resolution}] 0 + } else { + lappend formatted_event [expr {[tdh_event_header user_time $fields(header)] * $timer_resolution}] [expr {[tdh_event_header kernel_time $fields(header)] * $timer_resolution}] + } + lappend formatted_event {*}[tdh_event_data select $fields(data) {provider_name event_guid channel_name level_name opcode_name task_name keyword_names properties message}] [dict* $fields(extended_data) sid ""] + + lappend formatted_events $formatted_event + } + return $formatted_events +} + +proc twapi::_etw_format_mof_events {oswbemservices bufdesc events} { + variable _etw_event_defs + + # TBD - it may be faster to special case NT kernel events as per + # the structures defined in http://msdn.microsoft.com/en-us/library/windows/desktop/aa364083(v=vs.85).aspx + # However, the MSDN warns that structures should not be created from + # MOF classes as alignment restrictions might be different + array set missing {} + foreach event $events { + set guid [mof_event_header guid [mof_event header $event]] + if {! [dict exists $_etw_event_defs $guid]} { + set missing($guid) "" + } + } + + if {[array size missing]} { + etw_load_mof_event_classes $oswbemservices {*}[array names missing] + } + + set bufhdr [etw_event_trace_logfile trace_logfile_header $bufdesc] + set timer_resolution [etw_trace_logfile_header timer_resolution $bufhdr] + set private_session [expr {0x800 & [etw_trace_logfile_header logfile_mode $bufhdr]}] + set pointer_size [etw_trace_logfile_header pointer_size $bufhdr] + + # TBD - what should provider_guid be for each event? + set provider_guid "" + + set formatted_events {} + foreach event $events { + array set hdr [mof_event_header [mof_event header $event]] + + # Formatted event must match field sequence in etw_event record + set formatted_event [list 0 $hdr(version) 0 $hdr(level) $hdr(type) 0 0 \ + $hdr(timestamp) $hdr(tid) $hdr(pid) $provider_guid] + + if {$private_session} { + lappend formatted_event [expr {$hdr(processor_time) * $timer_resolution}] 0 + } else { + lappend formatted_event [expr {$hdr(user_time) * $timer_resolution}] [expr {$hdr(kernel_time) * $timer_resolution}] + } + + if {[dict exists $_etw_event_defs $hdr(guid) $hdr(version) -definitions $hdr(type)]} { + set eventclass [dict get $_etw_event_defs $hdr(guid) $hdr(version) -classname] + set mof [dict get $_etw_event_defs $hdr(guid) $hdr(version) -definitions $hdr(type)] + set eventtypename [dict get $mof -eventtypename] + set properties [Twapi_ParseEventMofData \ + [mof_event data $event] \ + [dict get $mof -fieldtypes] \ + $pointer_size] + } elseif {[dict exists $_etw_event_defs $hdr(guid) "" -definitions $hdr(type)]} { + # If exact version not present, use one without + # a version + set eventclass [dict get $_etw_event_defs $hdr(guid) "" -classname] + set mof [dict get $_etw_event_defs $hdr(guid) "" -definitions $hdr(type)] + set eventtypename [dict get $mof -eventtypename] + set properties [Twapi_ParseEventMofData \ + [mof_event data $event] \ + [dict get $mof -fieldtypes] \ + $pointer_size] + } else { + # No definition. Create an entry so we know we already tried + # looking this up and don't keep retrying later + dict set _etw_event_defs $hdr(guid) {} + + # Nothing we can add to the event. Pass on with defaults + set eventtypename $hdr(type) + # Try to get at least the class name + if {[dict exists $_etw_event_defs $hdr(guid) $hdr(version) -classname]} { + set eventclass [dict get $_etw_event_defs $hdr(guid) $hdr(version) -classname] + } elseif {[dict exists $_etw_event_defs $hdr(guid) "" -classname]} { + set eventclass [dict get $_etw_event_defs $hdr(guid) "" -classname] + } else { + set eventclass "" + } + set properties [list _mofdata [mof_event data $event]] + } + + # eventclass -> provider_name + # TBD - should we get the Provider qualifier from Mof as provider_name? (Does it even exist?) + # mofformatteddata -> properties + # level name is not localized. Oh well, too bad + set level_name [dict* {0 {Log Always} 1 Critical 2 Error 3 Warning 4 Informational 5 Debug} $hdr(level)] + lappend formatted_event $eventclass $hdr(guid) "" $level_name $eventtypename "" "" $properties "" "" + + lappend formatted_events $formatted_event + } + + return $formatted_events +} + +proc twapi::etw_format_event_message {message properties} { + if {$message ne ""} { + set params {} + foreach {propname propval} $properties { + # Properties are always a list, even when scalars because + # there is no way of distinguishing between a scalar and + # an array of size 1 in the return values from TDH + lappend params [join $propval {, }] + } + catch {set message [format_message -fmtstring $message -params $params]} + } + return $message +} + + +proc twapi::etw_dump_to_file {args} { + array set opts [parseargs args { + {output.arg stdout} + {limit.int -1} + {format.arg csv {csv list}} + {separator.arg ,} + {fields.arg {-timecreated -levelname -providername -pid -taskname -opcodename -message}} + {filter.arg {}} + }] + + if {$opts(format) eq "csv"} { + package require csv + } + if {$opts(output) in [chan names]} { + # Writing to a channel + set outfd $opts(output) + set do_close 0 + } else { + if {[file exists $opts(output)]} { + error "File $opts(output) already exists." + } + set outfd [open $opts(output) a] + set do_close 1 + } + + set formatter [etw_open_formatter] + trap { + set varname ::twapi::_etw_dump_ctr[TwapiId] + set $varname 0; # Yes, set $varname, not set varname + set htraces {} + foreach arg $args { + if {[file exists $arg]} { + lappend htraces [etw_open_file $arg] + } else { + lappend htraces [etw_open_session $arg] + } + } + + if {$opts(format) eq "csv"} { + puts $outfd [csv::join $opts(fields) $opts(separator)] + } + if {[llength $htraces] == 0} { + return + } + # This is written using a callback to basically test the callback path + set callback [list apply { + {options outfd counter_varname max formatter bufd events} + { + array set opts $options + set events [etw_format_events $formatter $bufd $events] + foreach event [recordarray getlist $events -format dict -filter $opts(filter)] { + if {$max >= 0 && [set $counter_varname] >= $max} { + return -code break + } + array set fields $event + if {"-message" in $opts(fields)} { + if {$fields(-message) ne ""} { + set fields(-message) [etw_format_event_message $fields(-message) $fields(-properties)] + } else { + set fields(-message) "Properties: $fields(-properties)" + } + } + if {"-properties" in $opts(fields)} { + set fmtdata $fields(-properties) + if {[dict exists $fmtdata mofdata]} { + # Only show 32 bytes + binary scan [string range [dict get $fmtdata mofdata] 0 31] H* hex + dict set fmtdata mofdata [regsub -all (..) $hex {\1 }] + } + set fields(-properties) $fmtdata + } + set fmtlist {} + foreach field $opts(fields) { + lappend fmtlist $fields($field) + } + if {$opts(format) eq "csv"} { + puts $outfd [csv::join $fmtlist $opts(separator)] + } else { + puts $outfd $fmtlist + } + incr $counter_varname + } + } + } [array get opts] $outfd $varname $opts(limit) $formatter] + + # Process the events using the callback + etw_process_events -callback $callback {*}$htraces + + } finally { + unset -nocomplain $varname + foreach htrace $htraces { + etw_close_session $htrace + } + if {$do_close} { + close $outfd + } else { + flush $outfd + } + etw_close_formatter $formatter + } +} + +proc twapi::etw_dump_to_list {args} { + set htraces {} + set formatter [etw_open_formatter] + trap { + foreach arg $args { + if {[file exists $arg]} { + lappend htraces [etw_open_file $arg] + } else { + lappend htraces [etw_open_session $arg] + } + } + return [recordarray getlist [etw_format_events $formatter {*}[etw_process_events {*}$htraces]]] + } finally { + foreach htrace $htraces { + etw_close_session $htrace + } + etw_close_formatter $formatter + } +} + +proc twapi::etw_dump {args} { + set htraces {} + set formatter [etw_open_formatter] + trap { + foreach arg $args { + if {[file exists $arg]} { + lappend htraces [etw_open_file $arg] + } else { + lappend htraces [etw_open_session $arg] + } + } + return [recordarray get [etw_format_events $formatter {*}[etw_process_events {*}$htraces]]] + } finally { + foreach htrace $htraces { + etw_close_session $htrace + } + etw_close_formatter $formatter + } +} + + +proc twapi::etw_start_trace {session_name args} { + variable _etw_trace_controllers + + # Specialized for kernel debugging - {bufferingmode {} 0x400} + # Not supported until Win7 {noperprocessorbuffering {} 0x10000000} + # Not clear what conditions it can be used {usekbytesforsize {} 0x2000} + array set opts [parseargs args { + traceguid.arg + logfile.arg + buffersize.int + minbuffers.int + maxbuffers.int + maxfilesize.int + flushtimer.int + enableflags.int + {filemode.arg circular {sequential append rotate circular}} + {clockresolution.sym system {qpc 1 system 2 cpucycle 3}} + {private.bool 0 0x800} + {realtime.bool 0 0x100} + {secure.bool 0 0x80} + {privateinproc.bool 0 0x20800} + {sequence.sym none {none 0 local 0x8000 global 0x4000}} + {paged.bool 0 0x01000000} + {preallocate.bool 0 0x20} + } -maxleftover 0] + + if {!$opts(realtime) && (![info exists opts(logfile)] || $opts(logfile) eq "")} { + badargs! "Log file name must be specified if real time mode is not in effect" + } + + if {[string equal -nocase $session_name "NT Kernel Logger"] && + $opts(filemode) eq "rotate"} { + error "Option -filemode cannot have value \"rotate\" for NT Kernel Logger" + } + + set logfilemode 0 + switch -exact $opts(filemode) { + sequential { + if {[info exists opts(maxfilesize)]} { + # 1 -> EVENT_TRACE_FILE_MODE_SEQUENTIAL + set logfilemode [expr {$logfilemode | 1}] + } else { + # 0 -> EVENT_TRACE_FILE_MODE_NONE + # set logfilemode [expr {$logfilemode | 0}] + } + } + circular { + # 2 -> EVENT_TRACE_FILE_MODE_CIRCULAR + set logfilemode [expr {$logfilemode | 2}] + if {![info exists opts(maxfilesize)]} { + set opts(maxfilesize) 1; # 1MB default + } + } + rotate { + if {$opts(private) || $opts(privateinproc)} { + if {![min_os_version 6 2]} { + badargs! "Option -filemode must not be \"rotate\" for private traces" + } + } + + # 8 -> EVENT_TRACE_FILE_MODE_NEWFILE + set logfilemode [expr {$logfilemode | 8}] + if {![info exists opts(maxfilesize)]} { + set opts(maxfilesize) 1; # 1MB default + } + } + append { + if {$opts(private) || $opts(privateinproc) || $opts(realtime)} { + badargs! "Option -filemode must not be \"append\" for private or realtime traces" + } + # 4 -> EVENT_TRACE_FILE_MODE_APPEND + # Not clear what to do about maxfilesize. Keep as is for now + set logfilemode [expr {$logfilemode | 4}] + } + } + + if {![info exists opts(maxfilesize)]} { + set opts(maxfilesize) 0 + } + + if {$opts(realtime) && ($opts(private) || $opts(privateinproc))} { + badargs! "Option -realtime is incompatible with options -private and -privateinproc" + } + + foreach opt {traceguid logfile buffersize minbuffers maxbuffers flushtimer enableflags maxfilesize} { + if {[info exists opts($opt)]} { + lappend params -$opt $opts($opt) + } + } + + set logfilemode [expr {$logfilemode | $opts(sequence)}] + + set logfilemode [tcl::mathop::| $logfilemode $opts(realtime) $opts(private) $opts(privateinproc) $opts(secure) $opts(paged) $opts(preallocate)] + + lappend params -logfilemode $logfilemode + + if {$opts(filemode) eq "append" && $opts(clockresolution) != 2} { + error "Option -clockresolution must be set to 'system' if -filemode is append" + } + + if {($opts(filemode) eq "rotate" || $opts(preallocate)) && + $opts(maxfilesize) == 0} { + error "Option -maxfilesize must also be specified with -preallocate or -filemodenewfile." + } + + lappend params -clockresolution $opts(clockresolution) + + trap { + set h [StartTrace $session_name $params] + set _etw_trace_controllers($h) $session_name + return $h + } onerror {TWAPI_WIN32 5} { + return -options [trapoptions] "Access denied. This may be because the process does not have permission to create the specified logfile or because it is not running under an account permitted to control ETW traces." + } +} + +proc twapi::etw_start_kernel_trace {events args} { + + set enableflags 0 + + # Note sysconfig is a dummy event. It is always logged. + set eventmap { + process 0x00000001 + thread 0x00000002 + imageload 0x00000004 + diskio 0x00000100 + diskfileio 0x00000200 + pagefault 0x00001000 + hardfault 0x00002000 + tcpip 0x00010000 + registry 0x00020000 + dbgprint 0x00040000 + sysconfig 0x00000000 + } + + if {"diskfileio" in $events} { + lappend events diskio; # Required by diskfileio + } + + if {[min_os_version 6]} { + lappend eventmap {*}{ + processcounter 0x00000008 + contextswitch 0x00000010 + dpc 0x00000020 + interrupt 0x00000040 + systemcall 0x00000080 + diskioinit 0x00000400 + alpc 0x00100000 + splitio 0x00200000 + driver 0x00800000 + profile 0x01000000 + fileio 0x02000000 + fileioinit 0x04000000 + } + + if {"diskio" in $events} { + lappend events diskioinit + } + } + + if {[min_os_version 6 1]} { + lappend eventmap {*}{ + dispatcher 0x00000800 + virtualalloc 0x00004000 + } + } + + if {[min_os_version 6 2]} { + lappend eventmap {*}{ + vamap 0x00008000 + } + if {"sysconfig" ni $events} { + # EVENT_TRACE_FLAG_NO_SYSCONFIG + set enableflags [expr {$enableflags | 0x10000000}] + } + } + + foreach event $events { + set enableflags [expr {$enableflags | [dict! $eventmap $event]}] + } + + # Name "NT Kernel Logger" is hardcoded in Windows + # GUID is 9e814aad-3204-11d2-9a82-006008a86939 but does not need to be + # specified. Note kernel logger cannot use paged memory so + # -paged 0 is required + return [etw_start_trace "NT Kernel Logger" -enableflags $enableflags {*}$args -paged 0] +} + +proc twapi::etw_enable_provider {htrace guid enableflags level} { + set guid [_etw_provider_guid $guid] + return [EnableTrace 1 $enableflags [_etw_level_to_int $level] $guid $htrace] +} + +proc twapi::etw_disable_provider {htrace guid} { + set guid [_etw_provider_guid $guid] + return [EnableTrace 0 -1 5 $guid $htrace] +} + +proc twapi::etw_control_trace {action session args} { + variable _etw_trace_controllers + + if {[info exists _etw_trace_controllers($session)]} { + set sessionhandle $session + } else { + set sessionhandle 0 + set sessionname $session + } + + set action [dict get { + query 0 + stop 1 + update 2 + flush 3 + } $action] + + array set opts [parseargs args { + traceguid.arg + logfile.arg + maxbuffers.int + flushtimer.int + enableflags.int + realtime.bool + } -maxleftover 0] + + set params {} + + if {[info exists opts(realtime)]} { + if {$opts(realtime)} { + lappend params -logfilemode 0x100; # EVENT_TRACE_REAL_TIME_MODE + } else { + lappend params -logfilemode 0 + } + } + + if {[info exists opts(traceguid)]} { + append params -traceguid $opts(traceguid) + } + + if {[info exists sessionname]} { + lappend params -sessionname $sessionname + } + + if {$action == 2} { + # update + foreach opt {logfile flushtimer enableflags maxbuffers} { + if {[info exists opts($opt)]} { + lappend params -$opt $opts($opt) + } + } + } + + return [etw_trace_properties [ControlTrace $action $sessionhandle $params]] +} + +interp alias {} twapi::etw_update_trace {} twapi::etw_control_trace update + +proc twapi::etw_stop_trace {trace} { + variable _etw_trace_controllers + set stats [etw_control_trace stop $trace] + unset -nocomplain _etw_trace_controllers($trace) + return $stats +} + +proc twapi::etw_flush_trace {trace} { + return [etw_control_trace flush $trace] +} + +proc twapi::etw_query_trace {trace} { + set d [etw_control_trace query $trace] + set cres [lindex {{} qpc system cpucycle} [dict get $d clock_resolution]] + if {$cres ne ""} { + dict set d clock_resolution $cres + } + + #TBD - check whether -maxfilesize needs to be massaged + + return $d +} + + + +# +# Helper functions +# + + +# Return binary unicode with truncation if necessary +proc twapi::_etw_encode_limited_unicode {s {max 80}} { + if {[string length $s] > $max} { + set s "[string range $s 0 $max-3]..." + } + return [encoding convertto unicode "$s\0"] +} + +# Used for development/debug to see what all types are in use +proc twapi::_etw_get_types {} { + dict for {g gval} $::twapi::_etw_event_defs { + dict for {ver verval} $gval { + dict for {eventtype eval} [dict get $verval -definitions] { + dict for {id idval} [dict get $eval -fields] { + dict set types [dict get $idval -type] [dict get $verval -classname] $eventtype $id + } + } + } + } + return $types +} + +proc twapi::_etw_level_to_int {level} { + return [dict* {verbose 5 information 4 info 4 informational 4 warning 3 error 2 fatal 1 critical 1} [string tolower $level]] +} + +# Map provider guid/name to guid +proc twapi::_etw_provider_guid {lookup} { + if {[Twapi_IsValidGUID $lookup]} { + return $lookup + } + set guid [etw_get_provider_guid $lookup] + if {$guid eq ""} { + badargs! "Provider \"$lookup\" not found." + } + return $guid +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/eventlog.tcl b/src/punk86.vfs/lib/twapi4.7.2/eventlog.tcl new file mode 100644 index 00000000..205784fd --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/eventlog.tcl @@ -0,0 +1,391 @@ +# +# Copyright (c) 2004-2012, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +package require registry + +namespace eval twapi { + # We maintain caches so we do not do lookups all the time + # TBD - have a means of clearing this out + variable _eventlog_message_cache + set _eventlog_message_cache {} +} + + +# Read the event log +proc twapi::eventlog_read {hevl args} { + _eventlog_valid_handle $hevl read raise + + array set opts [parseargs args { + seek.int + {direction.arg forward} + }] + + if {[info exists opts(seek)]} { + set flags 2; # Seek + set offset $opts(seek) + } else { + set flags 1; # Sequential read + set offset 0 + } + + switch -glob -- $opts(direction) { + "" - + forw* { + setbits flags 4 + } + back* { + setbits flags 8 + } + default { + error "Invalid value '$opts(direction)' for -direction option" + } + } + + set results [list ] + + trap { + set recs [ReadEventLog $hevl $flags $offset] + } onerror {TWAPI_WIN32 38} { + # EOF - no more + set recs [list ] + } + foreach event $recs { + dict set event -type [string map {0 success 1 error 2 warning 4 information 8 auditsuccess 16 auditfailure} [dict get $event -level]] + lappend results $event + } + + return $results +} + + +# Get the oldest event log record index. $hevl must be read handle +proc twapi::eventlog_oldest {hevl} { + _eventlog_valid_handle $hevl read raise + return [GetOldestEventLogRecord $hevl] +} + +# Get the event log record count. $hevl must be read handle +proc twapi::eventlog_count {hevl} { + _eventlog_valid_handle $hevl read raise + return [GetNumberOfEventLogRecords $hevl] +} + +# Check if the event log is full. $hevl may be either read or write handle +# (only win2k plus) +proc twapi::eventlog_is_full {hevl} { + # Does not matter if $hevl is read or write, but verify it is a handle + _eventlog_valid_handle $hevl read + return [Twapi_IsEventLogFull $hevl] +} + +# Backup the event log +proc twapi::eventlog_backup {hevl file} { + _eventlog_valid_handle $hevl read raise + BackupEventLog $hevl $file +} + +# Clear the event log +proc twapi::eventlog_clear {hevl args} { + _eventlog_valid_handle $hevl read raise + array set opts [parseargs args {backup.arg} -nulldefault] + ClearEventLog $hevl $opts(backup) +} + + +# Formats the given event log record message +# +proc twapi::eventlog_format_message {rec args} { + variable _eventlog_message_cache + + array set opts [parseargs args { + width.int + langid.int + } -nulldefault] + + set source [dict get $rec -source] + set eventid [dict get $rec -eventid] + + if {[dict exists $_eventlog_message_cache $source fmtstring $opts(langid) $eventid]} { + set fmtstring [dict get $_eventlog_message_cache $source fmtstring $opts(langid) $eventid] + dict incr _eventlog_message_cache __fmtstring_hits + } else { + dict incr _eventlog_message_cache __fmtstring_misses + + # Find the registry key if we do not have it already + if {[dict exists $_eventlog_message_cache $source regkey]} { + dict incr _eventlog_message_cache __regkey_hits + set regkey [dict get $_eventlog_message_cache $source regkey] + } else { + set regkey [_find_eventlog_regkey $source] + dict set _eventlog_message_cache $source regkey $regkey + dict incr _eventlog_message_cache __regkey_misses + } + + # Get the message file, if there is one + if {! [catch {registry get $regkey "EventMessageFile"} path]} { + # Try each file listed in turn + foreach dll [split $path \;] { + set dll [expand_environment_strings $dll] + if {! [catch { + set fmtstring [format_message -module $dll -messageid $eventid -width $opts(width) -langid $opts(langid)] + } msg]} { + dict set _eventlog_message_cache $source fmtstring $opts(langid) $eventid $fmtstring + break + } + } + } + } + + if {! [info exists fmtstring]} { + dict incr _eventlog_message_cache __notfound + + set fmt "The message file or event definition for event id [dict get $rec -eventid] from source [dict get $rec -source] was not found. The following information was part of the event: " + set flds [list ] + for {set i 1} {$i <= [llength [dict get $rec -params]]} {incr i} { + lappend flds %$i + } + append fmt [join $flds ", "] + return [format_message -fmtstring $fmt \ + -params [dict get $rec -params] -width $opts(width)] + } + + set msg [format_message -fmtstring $fmtstring -params [dict get $rec -params]] + + # We'd found a message from the message file and replaced the string + # parameters. Now fill in the parameter file values if any. Note these are + # separate from the string parameters passed in through rec(-params) + + # First check if the formatted string itself still has placeholders + # Place holder for the parameters file are supposed to start + # with two % chars. Unfortunately, not all apps, even Microsoft's own + # DCOM obey this. So check for both % and %% + set placeholder_indices [regexp -indices -all -inline {%?%\d+} $msg] + if {[llength $placeholder_indices] == 0} { + # No placeholders. + return $msg + } + + # Loop through to replace placeholders. + set msg2 ""; # Holds result after param replacement + set prev_end 0 + foreach placeholder $placeholder_indices { + lassign $placeholder start end + # Append the stuff between previous placeholder and this one + append msg2 [string range $msg $prev_end [expr {$start-1}]] + set repl [string range $msg $start $end]; # Default if not found + set paramid [string trimleft $repl %]; # Skip "%" + if {[dict exists $_eventlog_message_cache $source paramstring $opts(langid) $paramid]} { + dict incr _eventlog_message_cache __paramstring_hits + set repl [format_message -fmtstring [dict get $_eventlog_message_cache $source paramstring $opts(langid) $paramid] -params [dict get $rec -params]] + } else { + dict incr _eventlog_message_cache __paramstring_misses + # Not in cache, need to look up + if {![info exists paramfiles]} { + # Construct list of parameter string files + + # TBD - cache registry key results? + # Find the registry key if we do not have it already + if {![info exists regkey]} { + if {[dict exists $_eventlog_message_cache $source regkey]} { + dict incr _eventlog_message_cache __regkey_hits + set regkey [dict get $_eventlog_message_cache $source regkey] + } else { + dict incr _eventlog_message_cache __regkey_misses + set regkey [_find_eventlog_regkey $source] + dict set _eventlog_message_cache $source regkey $regkey + } + } + set paramfiles {} + if {! [catch {registry get $regkey "ParameterMessageFile"} path]} { + # Loop through every placeholder, look for the entry in the + # parameters file and replace it if found + foreach paramfile [split $path \;] { + lappend paramfiles [expand_environment_strings $paramfile] + } + } + } + # Try each file listed in turn + foreach paramfile $paramfiles { + if {! [catch { + set paramstring [string trimright [format_message -module $paramfile -messageid $paramid -langid $opts(langid)] \r\n] + } ]} { + # Found the replacement + dict set _eventlog_message_cache $source paramstring $opts(langid) $paramid $paramstring + set repl [format_message -fmtstring $paramstring -params [dict get $rec -params]] + break + } + } + } + append msg2 $repl + set prev_end [incr end] + } + + # Tack on tail after last placeholder + append msg2 [string range $msg $prev_end end] + return $msg2 +} + +# Format the category +proc twapi::eventlog_format_category {rec args} { + + array set opts [parseargs args { + width.int + langid.int + } -nulldefault] + + set category [dict get $rec -category] + if {$category == 0} { + return "" + } + + variable _eventlog_message_cache + + set source [dict get $rec -source] + + # Get the category string from cache, if there is one + if {[dict exists $_eventlog_message_cache $source category $opts(langid) $category]} { + dict incr _eventlog_message_cache __category_hits + set fmtstring [dict get $_eventlog_message_cache $source category $opts(langid) $category] + } else { + dict incr _eventlog_message_cache __category_misses + + # Find the registry key if we do not have it already + if {[dict exists $_eventlog_message_cache $source regkey]} { + dict incr _eventlog_message_cache __regkey_hits + set regkey [dict get $_eventlog_message_cache $source regkey] + } else { + set regkey [_find_eventlog_regkey $source] + dict set _eventlog_message_cache $source regkey $regkey + dict incr _eventlog_message_cache __regkey_misses + } + + if {! [catch {registry get $regkey "CategoryMessageFile"} path]} { + # Try each file listed in turn + foreach dll [split $path \;] { + set dll [expand_environment_strings $dll] + if {! [catch { + set fmtstring [format_message -module $dll -messageid $category -width $opts(width) -langid $opts(langid)] + } msg]} { + dict set _eventlog_message_cache $source category $opts(langid) $category $fmtstring + break + } + } + } + } + + if {![info exists fmtstring]} { + set fmtstring "Category $category" + dict set _eventlog_message_cache $source category $opts(langid) $category $fmtstring + } + + return [format_message -fmtstring $fmtstring -params [dict get $rec -params]] +} + +proc twapi::eventlog_monitor_start {hevl script} { + variable _eventlog_notification_scripts + + set hevent [lindex [CreateEvent [_make_secattr {} 0] 0 0 ""] 0] + if {[catch {NotifyChangeEventLog $hevl $hevent} msg]} { + CloseHandle $hevent + error $msg $::errorInfo $::errorCode + } + + wait_on_handle $hevent -async twapi::_eventlog_notification_handler + set _eventlog_notification_scripts($hevent) $script + + # We do not want the application mistakenly closing the event + # while being waited on by the thread pool. That would be a big NO-NO + # so change the handle type so it cannot be passed to close_handle. + return [list evl $hevent] +} + +# Stop any notifications. Note these will stop even if the event log +# handle is closed but leave the event dangling. +proc twapi::eventlog_monitor_stop {hevent} { + variable _eventlog_notification_scripts + set hevent [lindex $hevent 1] + if {[info exists _eventlog_notification_scripts($hevent)]} { + unset _eventlog_notification_scripts($hevent) + cancel_wait_on_handle $hevent + CloseHandle $hevent + } +} + +proc twapi::_eventlog_notification_handler {hevent event} { + variable _eventlog_notification_scripts + if {[info exists _eventlog_notification_scripts($hevent)] && + $event eq "signalled"} { + uplevel #0 $_eventlog_notification_scripts($hevent) [list [list evl $hevent]] + } +} + +# TBD - document +proc twapi::eventlog_subscribe {source} { + set hevl [eventlog_open -source $source] + set hevent [lindex [CreateEvent [_make_secattr {} 0] 0 0 ""] 0] + if {[catch {NotifyChangeEventLog $hevl $hevent} msg]} { + set erinfo $::errorInfo + set ercode $::errorCode + CloseHandle $hevent + error $hsubscribe $erinfo $ercode + } + + return [list $hevl $hevent] +} + +# Utility procs + +# Find the registry key corresponding the given event log source +proc twapi::_find_eventlog_regkey {source} { + set topkey {HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog} + + # Set a default list of children to work around an issue in + # the Tcl [registry keys] command where a ERROR_MORE_DATA is returned + # instead of a retry with a larger buffer. + set keys {Application Security System} + catch {set keys [registry keys $topkey]} + # Get all keys under this key and look for a source under that + foreach key $keys { + # See above Tcl issue + set srckeys {} + catch {set srckeys [registry keys "${topkey}\\$key"]} + foreach srckey $srckeys { + if {[string equal -nocase $srckey $source]} { + return "${topkey}\\${key}\\$srckey" + } + } + } + + # Default to Application - TBD + return "${topkey}\\Application" +} + +proc twapi::_eventlog_dump {source chan} { + set hevl [eventlog_open -source $source] + while {[llength [set events [eventlog_read $hevl]]]} { + # print out each record + foreach eventrec $events { + array set event $eventrec + set timestamp [clock format $event(-timewritten) -format "%x %X"] + set source $event(-source) + set category [twapi::eventlog_format_category $eventrec -width -1] + set message [twapi::eventlog_format_message $eventrec -width -1] + puts $chan "$timestamp $source $category $message" + } + } + eventlog_close $hevl +} + + + + +# If we are not being sourced from a executable resource, need to +# source the remaining support files. In the former case, they are +# automatically combined into one so the sourcing is not needed. +if {![info exists twapi::twapi_eventlog_rc_sourced]} { + source [file join [file dirname [info script]] evt.tcl] + source [file join [file dirname [info script]] winlog.tcl] +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/evt.tcl b/src/punk86.vfs/lib/twapi4.7.2/evt.tcl new file mode 100644 index 00000000..61d19bc1 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/evt.tcl @@ -0,0 +1,718 @@ +# +# Copyright (c) 2012-2014, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# Event log handling for Vista and later + +namespace eval twapi { + variable _evt; # See _evt_init + + # System event fields in order returned by _evt_decode_event_system_fields + twapi::record evt_system_fields { + -providername -providerguid -eventid -qualifiers -level -task + -opcode -keywordmask -timecreated -eventrecordid -activityid + -relatedactivityid -pid -tid -channel + -computer -sid -version + } + + proc _evt_init {} { + variable _evt + + # Various structures that we maintain / cache for efficiency as they + # are commonly used are kept in the _evt array with the following keys: + + # system_render_context_handle - is the handle to a rendering + # context for the system portion of an event + set _evt(system_render_context_handle) [evt_render_context_system] + + # user_render_context_handle - is the handle to a rendering + # context for the user data portion of an event + set _evt(user_render_context_handle) [evt_render_context_user] + + # render_buffer - is NULL or holds a pointer to the buffer used to + # retrieve values so does not have to be reallocated every time. + set _evt(render_buffer) NULL + + # publisher_handles - caches publisher names to their meta information. + # This is a dictionary indexed with nested keys - + # publisher, session, lcid. TBD - need a mechanism to clear ? + set _evt(publisher_handles) [dict create] + + # -levelname - dict of publisher name / level number to level names + set _evt(-levelname) {} + + # -taskname - dict of publisher name / task number to task name + set _evt(-taskname) {} + + # -opcodename - dict of publisher name / opcode number to opcode name + set _evt(-opcodename) {} + + # No-op the proc once init is done + proc _evt_init {} {} + } +} + +# TBD - document +proc twapi::evt_local_session {} { + return NULL +} + +# TBD - document +proc twapi::evt_local_session? {hsess} { + return [pointer_null? $hsess] +} + +# TBD - document +proc twapi::evt_open_session {server args} { + array set opts [parseargs args { + user.arg + domain.arg + password.arg + {authtype.arg 0} + } -nulldefault -maxleftover 0] + + if {![string is integer -strict $opts(authtype)]} { + set opts(authtype) [dict get {default 0 negotiate 1 kerberos 2 ntlm 3} [string tolower $opts(authtype)]] + } + + return [EvtOpenSession 1 [list $server $opts(user) $opts(domain) $opts(password) $opts(authtype)] 0 0] +} + +# TBD - document +proc twapi::evt_close_session {hsess} { + if {![evt_local_session? $hsess]} { + evt_close $hsess + } +} + +proc twapi::evt_channels {{hevtsess NULL}} { + # TBD - document hevtsess + set chnames {} + set hevt [EvtOpenChannelEnum $hevtsess 0] + trap { + while {[set chname [EvtNextChannelPath $hevt]] ne ""} { + lappend chnames $chname + } + } finally { + evt_close $hevt + } + + return $chnames +} + +proc twapi::evt_clear_log {chanpath args} { + # TBD - document -session + array set opts [parseargs args { + {session.arg NULL} + {backup.arg ""} + } -maxleftover 0] + + return [EvtClearLog $opts(session) $chanpath [_evt_normalize_path $opts(backup)] 0] +} + +# TBD - document +proc twapi::evt_archive_exported_log {logpath args} { + array set opts [parseargs args { + {session.arg NULL} + {lcid.int 0} + } -maxleftover 0] + + return [EvtArchiveExportedLog $opts(session) [_evt_normalize_path $logpath] $opts(lcid) 0] +} + +proc twapi::evt_export_log {outfile args} { + # TBD - document -session + array set opts [parseargs args { + {session.arg NULL} + file.arg + channel.arg + {query.arg *} + {ignorequeryerrors 0 0x1000} + } -maxleftover 0] + + if {([info exists opts(file)] && [info exists opts(channel)]) || + ! ([info exists opts(file)] || [info exists opts(channel)])} { + error "Exactly one of -file or -channel must be specified." + } + + if {[info exists opts(file)]} { + set path [_evt_normalize_path $opts(file)] + incr opts(ignorequeryerrors) 2 + } else { + set path $opts(channel) + incr opts(ignorequeryerrors) 1 + } + + return [EvtExportLog $opts(session) $path $opts(query) [_evt_normalize_path $outfile] $opts(ignorequeryerrors)] +} + +# TBD - document +proc twapi::evt_create_bookmark {{mark ""}} { + return [EvtCreateBookmark $mark] +} + +# TBD - document +proc twapi::evt_render_context_xpaths {xpaths} { + return [EvtCreateRenderContext $xpaths 0] +} + +# TBD - document +proc twapi::evt_render_context_system {} { + return [EvtCreateRenderContext {} 1] +} + +# TBD - document +proc twapi::evt_render_context_user {} { + return [EvtCreateRenderContext {} 2] +} + +# TBD - document +proc twapi::evt_open_channel_config {chanpath args} { + array set opts [parseargs args { + {session.arg NULL} + } -maxleftover 0] + + return [EvtOpenChannelConfig $opts(session) $chanpath 0] +} + +# TBD - document +proc twapi::evt_get_channel_config {hevt args} { + set result {} + foreach opt $args { + lappend result $opt \ + [EvtGetChannelConfigProperty $hevt \ + [_evt_map_channel_config_property $hevt $propid]] + } + return $result +} + +# TBD - document +proc twapi::evt_set_channel_config {hevt propid val} { + return [EvtSetChannelConfigProperty $hevt [_evt_map_channel_config_property $propid 0 $val]] +} + + +# TBD - document +proc twapi::_evt_map_channel_config_property {propid} { + if {[string is integer -strict $propid]} { + return $propid + } + + # Note: values are from winevt.h, Win7 SDK has typos for last few + return [dict get { + -enabled 0 + -isolation 1 + -type 2 + -owningpublisher 3 + -classiceventlog 4 + -access 5 + -loggingretention 6 + -loggingautobackup 7 + -loggingmaxsize 8 + -logginglogfilepath 9 + -publishinglevel 10 + -publishingkeywords 11 + -publishingcontrolguid 12 + -publishingbuffersize 13 + -publishingminbuffers 14 + -publishingmaxbuffers 15 + -publishinglatency 16 + -publishingclocktype 17 + -publishingsidtype 18 + -publisherlist 19 + -publishingfilemax 20 + } $propid] +} + +# TBD - document +proc twapi::evt_event_info {hevt args} { + set result {} + foreach opt $args { + lappend result $opt [EvtGetEventInfo $hevt \ + [dict get {-queryids 0 -path 1} $opt]] + } + return $result +} + + +# TBD - document +proc twapi::evt_event_metadata_property {hevt args} { + set result {} + foreach opt $args { + lappend result $opt \ + [EvtGetEventMetadataProperty $hevt \ + [dict get { + -id 0 -version 1 -channel 2 -level 3 + -opcode 4 -task 5 -keyword 6 -messageid 7 -template 8 + } $opt]] + } + return $result +} + + +# TBD - document +proc twapi::evt_open_log_info {args} { + array set opts [parseargs args { + {session.arg NULL} + file.arg + channel.arg + } -maxleftover 0] + + if {([info exists opts(file)] && [info exists opts(channel)]) || + ! ([info exists opts(file)] || [info exists opts(channel)])} { + error "Exactly one of -file or -channel must be specified." + } + + if {[info exists opts(file)]} { + set path [_evt_normalize_path $opts(file)] + set flags 0x2 + } else { + set path $opts(channel) + set flags 0x1 + } + + return [EvtOpenLog $opts(session) $path $flags] +} + +# TBD - document +proc twapi::evt_log_info {hevt args} { + set result {} + foreach opt $args { + lappend result $opt [EvtGetLogInfo $hevt [dict get { + -creationtime 0 -lastaccesstime 1 -lastwritetime 2 + -filesize 3 -attributes 4 -numberoflogrecords 5 + -oldestrecordnumber 6 -full 7 + } $opt]] + } + return $result +} + +# TBD - document +proc twapi::evt_publisher_metadata_property {hpub args} { + set result {} + foreach opt $args { + set val [EvtGetPublisherMetadataProperty $hpub [dict get { + -publisherguid 0 -resourcefilepath 1 -parameterfilepath 2 + -messagefilepath 3 -helplink 4 -publishermessageid 5 + -channelreferences 6 -levels 12 -tasks 16 + -opcodes 21 -keywords 25 + } $opt] 0] + if {$opt ni {-channelreferences -levels -tasks -opcodes -keywords}} { + lappend result $opt $val + continue + } + set n [EvtGetObjectArraySize $val] + set val2 {} + for {set i 0} {$i < $n} {incr i} { + set rec {} + foreach {opt2 iopt} [dict get { + -channelreferences { -channelreferencepath 7 + -channelreferenceindex 8 -channelreferenceid 9 + -channelreferenceflags 10 -channelreferencemessageid 11} + -levels { -levelname 13 -levelvalue 14 -levelmessageid 15 } + -tasks { -taskname 17 -taskeventguid 18 -taskvalue 19 + -taskmessageid 20} + -opcodes {-opcodename 22 -opcodevalue 23 -opcodemessageid 24} + -keywords {-keywordname 26 -keywordvalue 27 + -keywordmessageid 28} + } $opt] { + lappend rec $opt2 [EvtGetObjectArrayProperty $val $iopt $i] + } + lappend val2 $rec + } + + evt_close $val + lappend result $opt $val2 + } + return $result +} + +# TBD - document +proc twapi::evt_query_info {hq args} { + set result {} + foreach opt $args { + lappend result $opt [EvtGetQueryInfo $hq [dict get { + -names 1 statuses 2 + } $opt]] + } + return $result +} + +# TBD - document +proc twapi::evt_object_array_size {hevt} { + return [EvtGetObjectArraySize $hevt] +} + +# TBD - document +proc twapi::evt_object_array_property {hevt index args} { + set result {} + + foreach opt $args { + lappend result $opt \ + [EvtGetObjectArrayProperty $hevt [dict get { + -channelreferencepath 7 + -channelreferenceindex 8 -channelreferenceid 9 + -channelreferenceflags 10 -channelreferencemessageid 11 + -levelname 13 -levelvalue 14 -levelmessageid 15 + -taskname 17 -taskeventguid 18 -taskvalue 19 + -taskmessageid 20 -opcodename 22 + -opcodevalue 23 -opcodemessageid 24 + -keywordname 26 -keywordvalue 27 -keywordmessageid 28 + }] $index] + } + return $result +} + +proc twapi::evt_publishers {{hsess NULL}} { + set pubs {} + set hevt [EvtOpenPublisherEnum $hsess 0] + trap { + while {[set pub [EvtNextPublisherId $hevt]] ne ""} { + lappend pubs $pub + } + } finally { + evt_close $hevt + } + + return $pubs +} + +# TBD - document +proc twapi::evt_open_publisher_metadata {pub args} { + array set opts [parseargs args { + {session.arg NULL} + logfile.arg + lcid.int + } -nulldefault -maxleftover 0] + + return [EvtOpenPublisherMetadata $opts(session) $pub $opts(logfile) $opts(lcid) 0] +} + +# TBD - document +proc twapi::evt_publisher_events_metadata {hpub args} { + set henum [EvtOpenEventMetadataEnum $hpub] + + # It is faster to build a list and then have Tcl shimmer to a dict when + # required + set meta {} + trap { + while {[set hmeta [EvtNextEventMetadata $henum 0]] ne ""} { + lappend meta [evt_event_metadata_property $hmeta {*}$args] + evt_close $hmeta + } + } finally { + evt_close $henum + } + + return $meta +} + +proc twapi::evt_query {args} { + array set opts [parseargs args { + {session.arg NULL} + file.arg + channel.arg + {query.arg *} + {ignorequeryerrors 0 0x1000} + {direction.sym forward {forward 0x100 reverse 0x200 backward 0x200}} + } -maxleftover 0] + + if {([info exists opts(file)] && [info exists opts(channel)]) || + ! ([info exists opts(file)] || [info exists opts(channel)])} { + error "Exactly one of -file or -channel must be specified." + } + + set flags $opts(ignorequeryerrors) + incr flags $opts(direction) + + if {[info exists opts(file)]} { + set path [_evt_normalize_path $opts(file)] + incr flags 0x2 + } else { + set path $opts(channel) + incr flags 0x1 + } + + return [EvtQuery $opts(session) $path $opts(query) $flags] +} + +proc twapi::evt_next {hresultset args} { + array set opts [parseargs args { + {timeout.int -1} + {count.int 1} + {status.arg} + } -maxleftover 0] + + if {[info exists opts(status)]} { + upvar 1 $opts(status) status + return [EvtNext $hresultset $opts(count) $opts(timeout) 0 status] + } else { + return [EvtNext $hresultset $opts(count) $opts(timeout) 0] + } +} + +twapi::proc* twapi::_evt_decode_event_system_fields {hevt} { + _evt_init +} { + variable _evt + set _evt(render_buffer) [Twapi_EvtRenderValues $_evt(system_render_context_handle) $hevt $_evt(render_buffer)] + set rec [Twapi_ExtractEVT_RENDER_VALUES $_evt(render_buffer)] + return [evt_system_fields set $rec \ + -providername [atomize [evt_system_fields -providername $rec]] \ + -providerguid [atomize [evt_system_fields -providerguid $rec]] \ + -channel [atomize [evt_system_fields -channel $rec]] \ + -computer [atomize [evt_system_fields -computer $rec]]] +} + +# TBD - document. Returns a list of user data values +twapi::proc* twapi::evt_decode_event_userdata {hevt} { + _evt_init +} { + variable _evt + set _evt(render_buffer) [Twapi_EvtRenderValues $_evt(user_render_context_handle) $hevt $_evt(render_buffer)] + return [Twapi_ExtractEVT_RENDER_VALUES $_evt(render_buffer)] +} + +twapi::proc* twapi::evt_decode_events {hevts args} { + _evt_init +} { + variable _evt + + array set opts [parseargs args { + {values.arg NULL} + {session.arg NULL} + {logfile.arg ""} + {lcid.int 0} + ignorestring.arg + message + levelname + taskname + opcodename + keywords + xml + } -ignoreunknown -hyphenated] + + # SAME ORDER AS _evt_decode_event_system_fields + set decoded_fields [evt_system_fields] + set decoded_events {} + + # ORDER MUST BE SAME AS order in which values are appended below + foreach opt {-levelname -taskname -opcodename -keywords -xml -message} { + if {$opts($opt)} { + lappend decoded_fields $opt + } + } + + foreach hevt $hevts { + set decoded [_evt_decode_event_system_fields $hevt] + # Get publisher from hevt + set publisher [evt_system_fields -providername $decoded] + + if {! [dict exists $_evt(publisher_handles) $publisher $opts(-session) $opts(-lcid)]} { + if {[catch { + dict set _evt(publisher_handles) $publisher $opts(-session) $opts(-lcid) [EvtOpenPublisherMetadata $opts(-session) $publisher $opts(-logfile) $opts(-lcid) 0] + }]} { + # TBD - debug log + dict set _evt(publisher_handles) $publisher $opts(-session) $opts(-lcid) NULL + } + } + set hpub [dict get $_evt(publisher_handles) $publisher $opts(-session) $opts(-lcid)] + + # See if cached values are present for -levelname -taskname + # and -opcodename. TBD - can -keywords be added to this ? + foreach {intopt opt callflag} {-level -levelname 2 -task -taskname 3 -opcode -opcodename 4} { + if {$opts($opt)} { + set ival [evt_system_fields $intopt $decoded] + if {[dict exists $_evt($opt) $publisher $ival]} { + lappend decoded [dict get $_evt($opt) $publisher $ival] + } else { + # Not cached. Look it up. Value of 0 -> null so + # just use ignorestring if specified. + if {$ival == 0 && [info exists opts(-ignorestring)]} { + set optval $opts(-ignorestring) + } else { + if {[info exists opts(-ignorestring)]} { + if {[EvtFormatMessage $hpub $hevt 0 $opts(-values) $callflag optval]} { + dict set _evt($opt) $publisher $ival $optval + } else { + # Note result not cached if not found since + # ignorestring may be different on every call + set optval $opts(-ignorestring) + } + } else { + # -ignorestring not specified so + # will raise error if not found + set optval [EvtFormatMessage $hpub $hevt 0 $opts(-values) $callflag] + dict set _evt($opt) $publisher $ival [atomize $optval] + } + } + lappend decoded $optval + } + } + } + + # Non-cached fields + # ORDER MUST BE SAME AS decoded_fields ABOVE + foreach {opt callflag} { + -keywords 5 + -xml 9 + } { + if {$opts($opt)} { + if {[info exists opts(-ignorestring)]} { + if {! [EvtFormatMessage $hpub $hevt 0 $opts(-values) $callflag optval]} { + set optval $opts(-ignorestring) + } + } else { + set optval [EvtFormatMessage $hpub $hevt 0 $opts(-values) $callflag] + } + lappend decoded $optval + } + } + + # We treat -message differently because on failure we want + # to extract the user data. -ignorestring is not used for this + # unless user data extraction also fails + if {$opts(-message)} { + if {[EvtFormatMessage $hpub $hevt 0 $opts(-values) 1 message]} { + lappend decoded $message + } else { + # TBD - make sure we have a test for this case. + # TBD - log + if {[catch { + lappend decoded "Message for event could not be found. Event contained user data: [join [evt_decode_event_userdata $hevt] ,]" + } message]} { + if {[info exists opts(-ignorestring)]} { + lappend decoded $opts(-ignorestring) + } else { + error $message + } + } + } + } + + lappend decoded_events $decoded + } + + return [list $decoded_fields $decoded_events] +} + +proc twapi::evt_decode_event {hevt args} { + return [recordarray index [evt_decode_events [list $hevt] {*}$args] 0 -format dict] +} + +# TBD - document +proc twapi::evt_format_publisher_message {hpub msgid args} { + + array set opts [parseargs args { + {values.arg NULL} + } -maxleftover 0] + + return [EvtFormatMessage $hpub NULL $msgid $opts(values) 8] +} + +# TBD - document +# Where is this used? +proc twapi::evt_free_EVT_VARIANT_ARRAY {p} { + evt_free $p +} + +# TBD - document +# Where is this used? +proc twapi::evt_free_EVT_RENDER_VALUES {p} { + evt_free $p +} + +# TBD - document +proc twapi::evt_seek {hresults pos args} { + array set opts [parseargs args { + {origin.arg first {first last current}} + bookmark.arg + {strict 0 0x10000} + } -maxleftover 0] + + if {[info exists opts(bookmark)]} { + set flags 4 + } else { + set flags [lsearch -exact {first last current} $opts(origin)] + incr flags; # 1 -> first, 2 -> last, 3 -> current + set opts(bookmark) NULL + } + + incr flags $opts(strict) + + EvtSeek $hresults $pos $opts(bookmark) 0 $flags +} + +proc twapi::evt_subscribe {path args} { + # TBD - document -session and -bookmark and -strict + array set opts [parseargs args { + {session.arg NULL} + {query.arg *} + bookmark.arg + includeexisting + {ignorequeryerrors 0 0x1000} + {strict 0 0x10000} + } -maxleftover 0] + + set flags [expr {$opts(ignorequeryerrors) | $opts(strict)}] + if {[info exists opts(bookmark)]} { + set flags [expr {$flags | 3}] + set bookmark $opts(origin) + } else { + set bookmark NULL + if {$opts(includeexisting)} { + set flags [expr {$flags | 2}] + } else { + set flags [expr {$flags | 1}] + } + } + + set hevent [lindex [CreateEvent [_make_secattr {} 0] 0 0 ""] 0] + if {[catch { + EvtSubscribe $opts(session) $hevent $path $opts(query) $bookmark $flags + } hsubscribe]} { + set erinfo $::errorInfo + set ercode $::errorCode + CloseHandle $hevent + error $hsubscribe $erinfo $ercode + } + + return [list $hsubscribe $hevent] +} + +proc twapi::_evt_normalize_path {path} { + # Do not want to rely on [file normalize] returning "" for "" + if {$path eq ""} { + return "" + } else { + return [file nativename [file normalize $path]] + } +} + +proc twapi::_evt_dump {args} { + array set opts [parseargs args { + {outfd.arg stdout} + count.int + } -ignoreunknown] + + set hq [evt_query {*}$args] + trap { + while {[llength [set hevts [evt_next $hq]]]} { + trap { + foreach ev [recordarray getlist [evt_decode_events $hevts -message -ignorestring None.] -format dict] { + if {[info exists opts(count)] && + [incr opts(count) -1] < 0} { + return + } + puts $opts(outfd) "[dict get $ev -timecreated] [dict get $ev -eventrecordid] [dict get $ev -providername]: [dict get $ev -eventrecordid] [dict get $ev -message]" + } + } finally { + evt_close {*}$hevts + } + } + } finally { + evt_close $hq + } +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/handle.tcl b/src/punk86.vfs/lib/twapi4.7.2/handle.tcl new file mode 100644 index 00000000..223608ac --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/handle.tcl @@ -0,0 +1,236 @@ +# +# Copyright (c) 2010, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi { + # Array maps handles we are waiting on to the ids of the registered waits + variable _wait_handle_ids + # Array maps id of registered wait to the corresponding callback scripts + variable _wait_handle_scripts + +} + +proc twapi::cast_handle {h type} { + # TBD - should this use pointer_from_address: + # return [pointer_from_address [address_from_pointer $h] $type] + return [list [lindex $h 0] $type] +} + +proc twapi::close_handle {h} { + + # Cancel waits on the handle, if any + cancel_wait_on_handle $h + + # Then close it + CloseHandle $h +} + +# Close multiple handles. In case of errors, collects them but keeps +# closing remaining handles and only raises the error at the end. +proc twapi::close_handles {args} { + # The original definition for this was broken in that it would + # gracefully accept non list parameters as a list of one. In 3.0 + # the handle format has changed so this does not happen + # naturally. We have to try and decipher whether it is a list + # of handles or a single handle. + + foreach arg $args { + if {[pointer? $arg]} { + # Looks like a single handle + if {[catch {close_handle $arg} msg]} { + set erinfo $::errorInfo + set ercode $::errorCode + set ermsg $msg + } + } else { + # Assume a list of handles + foreach h $arg { + if {[catch {close_handle $h} msg]} { + set erinfo $::errorInfo + set ercode $::errorCode + set ermsg $msg + } + } + } + } + + if {[info exists erinfo]} { + error $msg $erinfo $ercode + } +} + +# +# Wait on a handle +proc twapi::wait_on_handle {hwait args} { + variable _wait_handle_ids + variable _wait_handle_scripts + + # When we are invoked from callback, handle is always typed as HANDLE + # so convert it so lookups succeed + set h [cast_handle $hwait HANDLE] + + # 0x00000008 -> # WT_EXECUTEONCEONLY + array set opts [parseargs args { + {wait.int -1} + async.arg + {executeonce.bool false 0x00000008} + }] + + if {![info exists opts(async)]} { + if {[info exists _wait_handle_ids($h)]} { + error "Attempt to synchronously wait on handle that is registered for an asynchronous wait." + } + + set ret [WaitForSingleObject $h $opts(wait)] + if {$ret == 0x80} { + return abandoned + } elseif {$ret == 0} { + return signalled + } elseif {$ret == 0x102} { + return timeout + } else { + error "Unexpected value $ret returned from WaitForSingleObject" + } + } + + # async option specified + + # Do not wait on manual reset events as cpu will spin continuously + # queueing events + if {[pointer? $hwait HANDLE_MANUALRESETEVENT] && + ! $opts(executeonce) + } { + error "A handle to a manual reset event cannot be waited on asynchronously unless -executeonce is specified." + } + + # If handle already registered, cancel previous registration. + if {[info exists _wait_handle_ids($h)]} { + cancel_wait_on_handle $h + } + + + set id [Twapi_RegisterWaitOnHandle $h $opts(wait) $opts(executeonce)] + + # Set now that successfully registered + set _wait_handle_scripts($id) $opts(async) + set _wait_handle_ids($h) $id + + return +} + +# +# Cancel an async wait on a handle +proc twapi::cancel_wait_on_handle {h} { + variable _wait_handle_ids + variable _wait_handle_scripts + + if {[info exists _wait_handle_ids($h)]} { + Twapi_UnregisterWaitOnHandle $_wait_handle_ids($h) + unset _wait_handle_scripts($_wait_handle_ids($h)) + unset _wait_handle_ids($h) + } +} + +# +# Called from C when a handle is signalled or times out +proc twapi::_wait_handler {id h event} { + variable _wait_handle_ids + variable _wait_handle_scripts + + # We ignore the following stale event cases - + # - _wait_handle_ids($h) does not exist : the wait was canceled while + # and event was queued + # - _wait_handle_ids($h) exists but is different from $id - same + # as prior case, except that a new wait has since been initiated + # on the same handle value (which might have be for a different + # resource + + if {[info exists _wait_handle_ids($h)] && + $_wait_handle_ids($h) == $id} { + uplevel #0 [linsert $_wait_handle_scripts($id) end $h $event] + } + + return +} + +# Get the handle for a Tcl channel +proc twapi::get_tcl_channel_handle {chan direction} { + set direction [expr {[string equal $direction "write"] ? 1 : 0}] + return [Tcl_GetChannelHandle $chan $direction] +} + +# Duplicate a OS handle +proc twapi::duplicate_handle {h args} { + variable my_process_handle + + array set opts [parseargs args { + sourcepid.int + targetpid.int + access.arg + inherit + closesource + } -maxleftover 0] + + # Assume source and target processes are us + set source_ph $my_process_handle + set target_ph $my_process_handle + + if {[string is wideinteger $h]} { + set h [pointer_from_address $h HANDLE] + } + + trap { + set me [pid] + # If source pid specified and is not us, get a handle to the process + if {[info exists opts(sourcepid)] && $opts(sourcepid) != $me} { + set source_ph [get_process_handle $opts(sourcepid) -access process_dup_handle] + } + + # Ditto for target process... + if {[info exists opts(targetpid)] && $opts(targetpid) != $me} { + set target_ph [get_process_handle $opts(targetpid) -access process_dup_handle] + } + + # Do we want to close the original handle (DUPLICATE_CLOSE_SOURCE) + set flags [expr {$opts(closesource) ? 0x1: 0}] + + if {[info exists opts(access)]} { + set access [_access_rights_to_mask $opts(access)] + } else { + # If no desired access is indicated, we want the same access as + # the original handle + set access 0 + set flags [expr {$flags | 0x2}]; # DUPLICATE_SAME_ACCESS + } + + + set dup [DuplicateHandle $source_ph $h $target_ph $access $opts(inherit) $flags] + + # IF targetpid specified, return handle else literal + # (even if targetpid is us) + if {[info exists opts(targetpid)]} { + set dup [pointer_to_address $dup] + } + } finally { + if {$source_ph != $my_process_handle} { + CloseHandle $source_ph + } + if {$target_ph != $my_process_handle} { + CloseHandle $source_ph + } + } + + return $dup +} + +proc twapi::set_handle_inheritance {h inherit} { + # 1 -> HANDLE_FLAG_INHERIT + SetHandleInformation $h 0x1 [expr {$inherit ? 1 : 0}] +} + +proc twapi::get_handle_inheritance {h} { + # 1 -> HANDLE_FLAG_INHERIT + return [expr {[GetHandleInformation $h] & 1}] +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/input.tcl b/src/punk86.vfs/lib/twapi4.7.2/input.tcl new file mode 100644 index 00000000..cdae8cea --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/input.tcl @@ -0,0 +1,623 @@ +# +# Copyright (c) 2012 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +package require twapi_ui; # SetCursorPos etc. + +# Enable window input +proc twapi::enable_window_input {hwin} { + return [expr {[EnableWindow $hwin 1] != 0}] +} + +# Disable window input +proc twapi::disable_window_input {hwin} { + return [expr {[EnableWindow $hwin 0] != 0}] +} + +# CHeck if window input is enabled +proc twapi::window_input_enabled {hwin} { + return [IsWindowEnabled $hwin] +} + +# Simulate user input +proc twapi::send_input {inputlist} { + array set input_defs { + MOUSEEVENTF_MOVE 0x0001 + MOUSEEVENTF_LEFTDOWN 0x0002 + MOUSEEVENTF_LEFTUP 0x0004 + MOUSEEVENTF_RIGHTDOWN 0x0008 + MOUSEEVENTF_RIGHTUP 0x0010 + MOUSEEVENTF_MIDDLEDOWN 0x0020 + MOUSEEVENTF_MIDDLEUP 0x0040 + MOUSEEVENTF_XDOWN 0x0080 + MOUSEEVENTF_XUP 0x0100 + MOUSEEVENTF_WHEEL 0x0800 + MOUSEEVENTF_VIRTUALDESK 0x4000 + MOUSEEVENTF_ABSOLUTE 0x8000 + + KEYEVENTF_EXTENDEDKEY 0x0001 + KEYEVENTF_KEYUP 0x0002 + KEYEVENTF_UNICODE 0x0004 + KEYEVENTF_SCANCODE 0x0008 + + XBUTTON1 0x0001 + XBUTTON2 0x0002 + } + + set inputs [list ] + foreach input $inputlist { + if {[string equal [lindex $input 0] "mouse"]} { + lassign $input mouse xpos ypos + set mouseopts [lrange $input 3 end] + array unset opts + array set opts [parseargs mouseopts { + relative moved + ldown lup rdown rup mdown mup x1down x1up x2down x2up + wheel.int + }] + set flags 0 + if {! $opts(relative)} { + set flags $input_defs(MOUSEEVENTF_ABSOLUTE) + } + + if {[info exists opts(wheel)]} { + if {($opts(x1down) || $opts(x1up) || $opts(x2down) || $opts(x2up))} { + error "The -wheel input event attribute may not be specified with -x1up, -x1down, -x2up or -x2down events" + } + set mousedata $opts(wheel) + set flags $input_defs(MOUSEEVENTF_WHEEL) + } else { + if {$opts(x1down) || $opts(x1up)} { + if {$opts(x2down) || $opts(x2up)} { + error "The -x1down, -x1up mouse input attributes are mutually exclusive with -x2down, -x2up attributes" + } + set mousedata $input_defs(XBUTTON1) + } else { + if {$opts(x2down) || $opts(x2up)} { + set mousedata $input_defs(XBUTTON2) + } else { + set mousedata 0 + } + } + } + foreach {opt flag} { + moved MOVE + ldown LEFTDOWN + lup LEFTUP + rdown RIGHTDOWN + rup RIGHTUP + mdown MIDDLEDOWN + mup MIDDLEUP + x1down XDOWN + x1up XUP + x2down XDOWN + x2up XUP + } { + if {$opts($opt)} { + set flags [expr {$flags | $input_defs(MOUSEEVENTF_$flag)}] + } + } + + lappend inputs [list mouse $xpos $ypos $mousedata $flags] + + } else { + lassign $input inputtype vk scan keyopts + if {"-extended" ni $keyopts} { + set extended 0 + } else { + set extended $input_defs(KEYEVENTF_EXTENDEDKEY) + } + if {"-usescan" ni $keyopts} { + set usescan 0 + } else { + set usescan $input_defs(KEYEVENTF_SCANCODE) + } + switch -exact -- $inputtype { + keydown { + lappend inputs [list key $vk $scan [expr {$extended|$usescan}]] + } + keyup { + lappend inputs [list key $vk $scan \ + [expr {$extended + | $usescan + | $input_defs(KEYEVENTF_KEYUP) + }]] + } + key { + lappend inputs [list key $vk $scan [expr {$extended|$usescan}]] + lappend inputs [list key $vk $scan \ + [expr {$extended + | $usescan + | $input_defs(KEYEVENTF_KEYUP) + }]] + } + unicode { + lappend inputs [list key 0 $scan $input_defs(KEYEVENTF_UNICODE)] + lappend inputs [list key 0 $scan \ + [expr {$input_defs(KEYEVENTF_UNICODE) + | $input_defs(KEYEVENTF_KEYUP) + }]] + } + default { + error "Unknown input type '$inputtype'" + } + } + } + } + + SendInput $inputs +} + +# Block the input +proc twapi::block_input {} { + return [BlockInput 1] +} + +# Unblock the input +proc twapi::unblock_input {} { + return [BlockInput 0] +} + +# Send the given set of characters to the input queue +proc twapi::send_input_text {s} { + return [Twapi_SendUnicode $s] +} + +# send_keys - uses same syntax as VB SendKeys function +proc twapi::send_keys {keys} { + set inputs [_parse_send_keys $keys] + send_input $inputs +} + + +# Handles a hotkey notification +proc twapi::_hotkey_handler {msg atom key msgpos ticks} { + variable _hotkeys + + # Note it is not an error if a hotkey does not exist since it could + # have been deregistered in the time between hotkey input and receiving it. + set code 0 + if {[info exists _hotkeys($atom)]} { + foreach handler $_hotkeys($atom) { + set code [catch {uplevel #0 $handler} msg] + switch -exact -- $code { + 0 { + # Normal, keep going + } + 1 { + # Error - put in background and abort + after 0 [list error $msg $::errorInfo $::errorCode] + break + } + 3 { + break; # Ignore remaining handlers + } + default { + # Keep going + } + } + } + } + return -code $code "" +} + +proc twapi::register_hotkey {hotkey script args} { + variable _hotkeys + + # 0x312 -> WM_HOTKEY + _register_script_wm_handler 0x312 [list [namespace current]::_hotkey_handler] 1 + + array set opts [parseargs args { + append + } -maxleftover 0] + +# set script [lrange $script 0 end]; # Ensure a valid list + + lassign [_hotkeysyms_to_vk $hotkey] modifiers vk + set hkid "twapi_hk_${vk}_$modifiers" + set atom [GlobalAddAtom $hkid] + if {[info exists _hotkeys($atom)]} { + GlobalDeleteAtom $atom; # Undo above AddAtom since already there + if {$opts(append)} { + lappend _hotkeys($atom) $script + } else { + set _hotkeys($atom) [list $script]; # Replace previous script + } + return $atom + } + trap { + RegisterHotKey $atom $modifiers $vk + } onerror {} { + GlobalDeleteAtom $atom; # Undo above AddAtom + rethrow + } + set _hotkeys($atom) [list $script]; # Replace previous script + return $atom +} + +proc twapi::unregister_hotkey {atom} { + variable _hotkeys + if {[info exists _hotkeys($atom)]} { + UnregisterHotKey $atom + GlobalDeleteAtom $atom + unset _hotkeys($atom) + } +} + + +# Simulate clicking a mouse button +proc twapi::click_mouse_button {button} { + switch -exact -- $button { + 1 - + left { set down -ldown ; set up -lup} + 2 - + right { set down -rdown ; set up -rup} + 3 - + middle { set down -mdown ; set up -mup} + x1 { set down -x1down ; set up -x1up} + x2 { set down -x2down ; set up -x2up} + default {error "Invalid mouse button '$button' specified"} + } + + send_input [list \ + [list mouse 0 0 $down] \ + [list mouse 0 0 $up]] + return +} + +# Simulate mouse movement +proc twapi::move_mouse {xpos ypos {mode ""}} { + # If mouse trails are enabled, it leaves traces when the mouse is + # moved and does not clear them until mouse is moved again. So + # we temporarily disable mouse trails if we can + + if {[llength [info commands ::twapi::get_system_parameters_info]] != 0} { + set trail [get_system_parameters_info SPI_GETMOUSETRAILS] + set_system_parameters_info SPI_SETMOUSETRAILS 0 + } + switch -exact -- $mode { + -relative { + lappend cmd -relative + lassign [GetCursorPos] curx cury + incr xpos $curx + incr ypos $cury + } + -absolute - + "" { } + default { error "Invalid mouse movement mode '$mode'" } + } + + SetCursorPos $xpos $ypos + + # Restore trail setting if we had disabled it and it was originally enabled + if {[info exists trail] && $trail} { + set_system_parameters_info SPI_SETMOUSETRAILS $trail + } +} + +# Simulate turning of the mouse wheel +proc twapi::turn_mouse_wheel {wheelunits} { + send_input [list [list mouse 0 0 -relative -wheel $wheelunits]] + return +} + +# Get the mouse/cursor position +proc twapi::get_mouse_location {} { + return [GetCursorPos] +} + +proc twapi::get_input_idle_time {} { + # The formats are to convert wrapped 32bit signed to unsigned + set last_event [format 0x%x [GetLastInputInfo]] + set now [format 0x%x [GetTickCount]] + + # Deal with wrap around + if {$now >= $last_event} { + return [expr {$now - $last_event}] + } else { + return [expr {$now + (0xffffffff - $last_event) + 1}] + } +} + +# Initialize the virtual key table +proc twapi::_init_vk_map {} { + variable vk_map + + if {![info exists vk_map]} { + # Map tokens to VK_* key codes + array set vk_map { + BACK {0x08 0} + BACKSPACE {0x08 0} BS {0x08 0} BKSP {0x08 0} TAB {0x09 0} + CLEAR {0x0C 0} RETURN {0x0D 0} ENTER {0x0D 0} SHIFT {0x10 0} + CONTROL {0x11 0} MENU {0x12 0} ALT {0x12 0} PAUSE {0x13 0} + BREAK {0x13 0} CAPITAL {0x14 0} CAPSLOCK {0x14 0} + KANA {0x15 0} HANGEUL {0x15 0} HANGUL {0x15 0} JUNJA {0x17 0} + FINAL {0x18 0} HANJA {0x19 0} KANJI {0x19 0} ESCAPE {0x1B 0} + ESC {0x1B 0} CONVERT {0x1C 0} NONCONVERT {0x1D 0} + ACCEPT {0x1E 0} MODECHANGE {0x1F 0} SPACE {0x20 0} + PRIOR {0x21 0} PGUP {0x21 0} NEXT {0x22 0} PGDN {0x22 0} + END {0x23 0} HOME {0x24 0} LEFT {0x25 0} UP {0x26 0} + RIGHT {0x27 0} DOWN {0x28 0} SELECT {0x29 0} + PRINT {0x2A 0} PRTSC {0x2C 0} EXECUTE {0x2B 0} + SNAPSHOT {0x2C 0} INSERT {0x2D 0} INS {0x2D 0} + DELETE {0x2E 0} DEL {0x2E 0} HELP {0x2F 0} LWIN {0x5B 0} + RWIN {0x5C 0} APPS {0x5D 0} SLEEP {0x5F 0} NUMPAD0 {0x60 0} + NUMPAD1 {0x61 0} NUMPAD2 {0x62 0} NUMPAD3 {0x63 0} + NUMPAD4 {0x64 0} NUMPAD5 {0x65 0} NUMPAD6 {0x66 0} + NUMPAD7 {0x67 0} NUMPAD8 {0x68 0} NUMPAD9 {0x69 0} + MULTIPLY {0x6A 0} ADD {0x6B 0} SEPARATOR {0x6C 0} + SUBTRACT {0x6D 0} DECIMAL {0x6E 0} DIVIDE {0x6F 0} + F1 {0x70 0} F2 {0x71 0} F3 {0x72 0} F4 {0x73 0} + F5 {0x74 0} F6 {0x75 0} F7 {0x76 0} F8 {0x77 0} + F9 {0x78 0} F10 {0x79 0} F11 {0x7A 0} F12 {0x7B 0} + F13 {0x7C 0} F14 {0x7D 0} F15 {0x7E 0} F16 {0x7F 0} + F17 {0x80 0} F18 {0x81 0} F19 {0x82 0} F20 {0x83 0} + F21 {0x84 0} F22 {0x85 0} F23 {0x86 0} F24 {0x87 0} + NUMLOCK {0x90 0} SCROLL {0x91 0} SCROLLLOCK {0x91 0} + LSHIFT {0xA0 0} RSHIFT {0xA1 0 -extended} LCONTROL {0xA2 0} + RCONTROL {0xA3 0 -extended} LMENU {0xA4 0} LALT {0xA4 0} + RMENU {0xA5 0 -extended} RALT {0xA5 0 -extended} + BROWSER_BACK {0xA6 0} BROWSER_FORWARD {0xA7 0} + BROWSER_REFRESH {0xA8 0} BROWSER_STOP {0xA9 0} + BROWSER_SEARCH {0xAA 0} BROWSER_FAVORITES {0xAB 0} + BROWSER_HOME {0xAC 0} VOLUME_MUTE {0xAD 0} + VOLUME_DOWN {0xAE 0} VOLUME_UP {0xAF 0} + MEDIA_NEXT_TRACK {0xB0 0} MEDIA_PREV_TRACK {0xB1 0} + MEDIA_STOP {0xB2 0} MEDIA_PLAY_PAUSE {0xB3 0} + LAUNCH_MAIL {0xB4 0} LAUNCH_MEDIA_SELECT {0xB5 0} + LAUNCH_APP1 {0xB6 0} LAUNCH_APP2 {0xB7 0} + } + } +} + +# Find the next token from a send_keys argument +# Returns pair token,position after token +proc twapi::_parse_send_key_token {keys start} { + set char [string index $keys $start] + if {$char ne "\{"} { + return [list $char [incr start]] + } + # Need to find the matching end brace. Note special case of + # start/end brace enclosed within braces + set n [string length $keys] + # Jump past brace and succeeding character (which may be end brace) + set terminator [string first "\}" $keys $start+2] + if {$terminator < 0} { + error "Unterminated or empty braced key token." + } + return [list [string range $keys $start $terminator] [incr terminator]] +} + +# Appends to inputs the trailer in reverse order. trailer is reset +proc twapi::_flush_send_keys_trailer {vinputs vtrailer} { + upvar 1 $vinputs inputs + upvar 1 $vtrailer trailer + + lappend inputs {*}[lreverse $trailer] + set trailer {} +} + +# Constructs a list of input events by parsing a string in the format +# used by Visual Basic's SendKeys function. See that documentation +# for syntax. +proc twapi::_parse_send_keys {keys} { + variable vk_map + + _init_vk_map + array set modifier_vk {+ 0x10 ^ 0x11 % 0x12} + + # Array state holds state of the parse. An atom refers to a single + # character or a () group. + # modifiers - list of current modifiers in order they were added including + # those coming from containing groups. + # group_modifiers - stack of modifiers state when parsing groups. + # When a group begins, state(modifiers) is pushed on this stack. + # The top of the stack is used to initialize state(modifiers) + # for every atom within the group. When the group ends, + # the top of the stack is popped and discarded and state(modifiers) + # is reinitialized to new top of stack. + # trailer - list of trailing input records to add after next atom. Note + # these are stored in order of occurence but need to be reversed + # when emitted + # group_trailers - stack of trailers to add after group ends. Each + # element is a trailer which is a list of input records. + # cleanup_trailer - to be emitted right at the end if we have to + # reset CAPSLOCK/NUMLOCK/SCROLL + set state(modifiers) {} + set state(group_modifiers) [list $state(modifiers)]; # "Global" group + set state(trailer) {} + set state(group_trailers) {} + set state(cleanup_trailer) {} + + set inputs {} + + # If {CAPS,NUM,SCROLL}LOCK are set, need to reset them and then + # set them back + foreach vk {20 144 145} { + if {[GetKeyState $vk]} { + lappend inputs [list key $vk 0] + lappend state(cleanup_trailer) [list key $vk 0] + } + } + + set keyslen [string length $keys] + set pos 0; # Current parse position + while {$pos < $keyslen} { + lassign [_parse_send_key_token $keys $pos] token pos + switch -exact -- $token { + + - + ^ - + % { + if {$token in $state(modifiers)} { + # Following VB SendKeys + error "Modifier state for $token already set." + } + lappend state(modifiers) $token + lappend inputs [list keydown $modifier_vk($token) 0] + lappend state(trailer) [list keyup $modifier_vk($token) 0] + } + "(" { + # Start a group + lappend state(group_modifiers) $state(modifiers) + lappend state(group_trailers) $state(trailer) + set state(trailer) {} + } + ")" { + # Terminates group. Illegal if no group collection in progress + if {[llength $state(group_trailers)] == 0} { + error "Unmatched \")\" in send_keys string." + } + # If there is a live trailer inside group, emit it e.g. +(ab^) + _flush_send_keys_trailer inputs state(trailer) + # Now emit the group trailer + set trailer [lpop state(group_trailers)] + _flush_send_keys_trailer inputs trailer + # Discard the initial modifier state for this group + lpop state(group_modifiers) + # Set the current modifiers to outer group state + set state(modifiers) [lindex $state(group_modifiers) end] + } + default { + if {$token eq "~"} { + set token "{ENTER}" + } + # May be a single character to send, a braced virtual key + # or a braced single char with count + if {[string length $token] == 1} { + # Single character. + set key $token + set nch 1 + } elseif {[string index $token 0] eq "\{"} { + # NOTE: a ~ inside a brace is treated as a literal ~ + # and not the ENTER key + # Look for space skipping the starting brace and following + # character which may be itself a space (to be repeated) + set space_pos [string first " " $token 2] + if {$space_pos < 0} { + # No space found + set nch 1 + set key [string range $token 1 end-1] + } else { + # A key followed by a count + # Note space_pos >= 2 + set key [string range $token 1 $space_pos-1] + set nch [string trim [string range $token $space_pos+1 end-1]] + if {![string is integer -strict $nch] || $nch < 0} { + error "Invalid count \"$nch\" in send_keys." + } + } + } else { + # Problem in token parsing. Would be a bug. + error "Internal error: invalid token \"$token\" parsing send_keys string." + } + + set vk_leader {} + set vk_trailer {} + if {[string length $key] == 1} { + # Single character + lassign [VkKeyScan $key] modifiers vk + if {$modifiers == -1 || $vk == -1} { + scan $key %c code_point + set vk_rec [list unicode 0 $code_point] + } else { + # Generates input records for modifiers that are set + # unless they are already set. NOTE: Do NOT set the + # state(modifier) state since they will be in effect + # only for the current character. This is for correctly + # showing A-Z with shift and Ctrl-A etc. with control. + if {($modifiers & 0x1) && ("+" ni $state(modifiers))} { + lappend vk_leader [list keydown 0x10 0] + lappend vk_trailer [list keyup 0x10 0] + } + if {($modifiers & 0x2) && ("^" ni $state(modifiers))} { + lappend vk_leader [list keydown 0x11 0] + lappend vk_trailer [list keyup 0x11 0] + } + + if {($modifiers & 0x4) && ("%" ni $state(modifiers))} { + lappend vk_leader [list keydown 0x12 0] + lappend vk_trailer [list keyup 0x12 0] + } + set vk_rec [list key $vk 0] + } + } else { + # Virtual key string. Note modifiers ignored here + # as for VB SendKeys + if {[info exists vk_map($key)]} { + # Virtual key + set vk_rec [list key {*}$vk_map($key)] + } else { + error "Unknown braced virtual key \"$token\"." + } + } + lappend inputs {*}$vk_leader + lappend inputs {*}[lrepeat $nch $vk_rec] + # vk_trailer arises from the character itself, e.g. A + # has shift set, Ctrl-A has control set. + _flush_send_keys_trailer inputs vk_trailer + # state(trailer) arises from preceding +,^,% This is also + # emitted and reset as it applied only to this character + _flush_send_keys_trailer inputs state(trailer) + set state(modifiers) [lindex $state(group_modifiers) end] + } + } + } + # Emit left over trailer + _flush_send_keys_trailer inputs state(trailer) + + # Restore capslock/numlock + _flush_send_keys_trailer inputs state(cleanup_trailer) + + return $inputs +} + +# utility procedure to map symbolic hotkey to {modifiers virtualkey} +# We allow modifier map to be passed in because different api's use +# different bits for key modifiers +proc twapi::_hotkeysyms_to_vk {hotkey {modifier_map {ctrl 2 control 2 alt 1 menu 1 shift 4 win 8}}} { + variable vk_map + + _init_vk_map + + set keyseq [split [string tolower $hotkey] -] + set key [lindex $keyseq end] + + # Convert modifiers to bitmask + set modifiers 0 + foreach modifier [lrange $keyseq 0 end-1] { + setbits modifiers [dict! $modifier_map [string tolower $modifier]] + } + # Map the key to a virtual key code + if {[string length $key] == 1} { + # Single character + scan $key %c unicode + + # Only allow alphanumeric keys and a few punctuation symbols + # since keyboard layouts are not standard + if {$unicode >= 0x61 && $unicode <= 0x7A} { + # Lowercase letters - change to upper case virtual keys + set vk [expr {$unicode-32}] + } elseif {($unicode >= 0x30 && $unicode <= 0x39) + || ($unicode >= 0x41 && $unicode <= 0x5A)} { + # Digits or upper case + set vk $unicode + } else { + error "Only alphanumeric characters may be specified for the key. For non-alphanumeric characters, specify the virtual key code" + } + } elseif {[info exists vk_map($key)]} { + # It is a virtual key name + set vk [lindex $vk_map($key) 0] + } elseif {[info exists vk_map([string toupper $key])]} { + # It is a virtual key name + set vk [lindex $vk_map([string toupper $key]) 0] + } elseif {[string is integer -strict $key]} { + # Actual virtual key specification + set vk $key + } else { + error "Unknown or invalid key specifier '$key'" + } + + return [list $modifiers $vk] +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/metoo.tcl b/src/punk86.vfs/lib/twapi4.7.2/metoo.tcl new file mode 100644 index 00000000..91a32e5a --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/metoo.tcl @@ -0,0 +1,605 @@ +# MeTOO stands for "MeTOO Emulates TclOO" (at a superficial syntactic level) +# +# Implements a *tiny*, but useful, subset of TclOO, primarily for use +# with Tcl 8.4. Intent is that if you write code using MeToo, it should work +# unmodified with TclOO in 8.5/8.6. Obviously, don't try going the other way! +# +# Emulation is superficial, don't try to be too clever in usage. +# Doing funky, or even non-funky, things with object namespaces will +# not work as you would expect. +# +# See the metoo::demo proc for sample usage. Calling this proc +# with parameter "oo" will use the TclOO commands. Else the metoo:: +# commands. Note the demo code remains the same for both. +# +# The following fragment uses MeToo only if TclOO is not available: +# if {[llength [info commands oo::*]]} { +# namespace import oo::* +# } else { +# source metoo.tcl +# namespace import metoo::class +# } +# class create C {...} +# +# Summary of the TclOO subset implemented - see TclOO docs for detail : +# +# Creating a new class: +# metoo::class create CLASSNAME CLASSDEFINITION +# +# Destroying a class: +# CLASSNAME destroy +# - this also destroys objects of that class and recursively destroys +# child classes. NOTE: deleting the class namespace or renaming +# the CLASSNAME command to "" will NOT call object destructors. +# +# CLASSDEFINITION: Following may appear in CLASSDEFINTION +# method METHODNAME params METHODBODY +# - same as TclOO +# constructor params METHODBODY +# - same syntax as TclOO +# destructor METHODBODY +# - same syntax as TclOO +# unknown METHODNAME ARGS +# - if defined, called when an undefined method is invoked +# superclass SUPER +# - inherits from SUPER. Unlike TclOO, only single inheritance. Also +# no checks for inheritance loops. You'll find out quickly enough! +# All other commands within a CLASSDEFINITION will either raise error or +# work differently from TclOO. Actually you can use pretty much any +# Tcl command inside CLASSDEFINITION but the results may not be what you +# expect. Best to avoid this. +# +# METHODBODY: The following method-internal TclOO commands are available: +# my METHODNAME ARGS +# - to call another method METHODNAME +# my variable VAR1 ?VAR2...? +# - brings object-specific variables into scope +# next ?ARGS? +# - calls the superclass method of the same name +# self +# self object +# - returns the object name (usable as a command) +# self class +# - returns class of this object +# self namespace +# - returns namespace of this object +# +# Creating objects: +# CLASSNAME create OBJNAME ?ARGS? +# - creates object OBJNAME of class CLASSNAME, passing ARGS to constructor +# Returns the fully qualified object name that can be used as a command. +# CLASSNAME new ?ARGS? +# - creates a new object with an auto-generated name +# +# Destroying objects +# OBJNAME destroy +# - destroys the object calling destructors +# rename OBJNAME "" +# - same as above +# +# Renaming an object +# rename OBJNAME NEWNAME +# - the object can now be invoked using the new name. Note this is unlike +# classes which should not be renamed. +# +# +# Introspection (though different from TclOO) +# metoo::introspect object isa OBJECT ?CLASSNAME? +# - returns 1 if OBJECT is a metoo object and is of the specified class +# if CLASSNAME is specified. Returns 0 otherwise. +# metoo::introspect object list +# - returns list of all objects +# metoo::introspect class ancestors CLASSNAME +# - returns list of ancestors for a class +# +# Differences and missing features from TclOO: Everything not listed above +# is missing. Some notable differences: +# - MeTOO is class-based, not object based like TclOO, thus class instances +# (objects) cannot be modified by adding instance-specific methods etc.. +# Also a class is not itself an object. +# - Renaming classes does not work and will fail in mysterious ways +# - does not support class refinement/definition +# - no variable command at class level for automatically bringing variables +# into scope +# - no filters, forwarding, multiple-inheritance +# - no private methods (all methods are exported). + +# NOTE: file must be sourced at global level since metoo namespace is expected +# to be top level namespace + +# DO NOT DO THIS. ELSE TESTS FAIL BECAUSE they define tests in the +# metoo namespace which then get deleted by the line below when +# the package is lazy auto-loaded +# catch {namespace delete metoo} + +# TBD - variable ("my variable" is done, "variable" in method or +# class definition is not) +# TBD - default constructor and destructor to "next" (or maybe that +# is already taken care of by the inheritance code + +namespace eval metoo { + variable next_id 0 + + variable _objects; # Maps objects to its namespace + array set _objects {} + +} + +# Namespace in which commands in a class definition block are called +namespace eval metoo::define { + proc method {class_ns name params body} { + # Methods are defined in the methods subspace of the class namespace. + # We prefix with _m_ to prevent them from being directly called + # as procs, for example if the method is a Tcl command like "set" + # The first parameter to a method is always the object namespace + # denoted as the paramter "_this" + namespace eval ${class_ns}::methods [list proc _m_$name [concat [list _this] $params] $body] + + } + proc superclass {class_ns superclass} { + if {[info exists ${class_ns}::super]} { + error "Only one superclass allowed for a class" + } + set sup [uplevel 3 "namespace eval $superclass {namespace current}"] + set ${class_ns}::super $sup + # We store the subclass in the super so it can be destroyed + # if the super is destroyed. + set ${sup}::subclasses($class_ns) 1 + } + proc constructor {class_ns params body} { + method $class_ns constructor $params $body + } + proc destructor {class_ns body} { + method $class_ns destructor {} $body + } + proc export {args} { + # Nothing to do, all methods are exported anyways + # Command is here for compatibility only + } +} + +# Namespace in which commands used in objects methods are defined +# (self, my etc.) +namespace eval metoo::object { + proc next {args} { + upvar 1 _this this; # object namespace + + # Figure out what class context this is executing in. Note + # we cannot use _this in caller since that is the object namespace + # which is not necessarily related to the current class namespace. + set class_ns [namespace parent [uplevel 1 {namespace current}]] + + # Figure out the current method being called + set methodname [namespace tail [lindex [uplevel 1 {info level 0}] 0]] + + # Find the next method in the class hierarchy and call it + while {[info exists ${class_ns}::super]} { + set class_ns [set ${class_ns}::super] + if {[llength [info commands ${class_ns}::methods::$methodname]]} { + return [uplevel 1 [list ${class_ns}::methods::$methodname $this] $args] + } + } + + error "'next' command has no receiver in the hierarchy for method $methodname" + } + + proc self {{what object}} { + upvar 1 _this this + switch -exact -- $what { + class { return [namespace parent $this] } + namespace { return $this } + object { return [set ${this}::_(name)] } + default { + error "Argument '$what' not understood by self method" + } + } + } + + proc my {methodname args} { + # We insert the object namespace as the first parameter to the command. + # This is passed as the first parameter "_this" to methods. Since + # "my" can be only called from methods, we can retrieve it fro + # our caller. + upvar 1 _this this; # object namespace + + set class_ns [namespace parent $this] + + set meth [::metoo::_locate_method $class_ns $methodname] + if {$meth ne ""} { + # We need to invoke in the caller's context so upvar etc. will + # not be affected by this intermediate method dispatcher + return [uplevel 1 [list $meth $this] $args] + } + + # It is ok for constructor or destructor to be undefined. For + # the others, invoke "unknown" if it exists + if {$methodname eq "constructor" || $methodname eq "destructor"} { + return + } + + set meth [::metoo::_locate_method $class_ns "unknown"] + if {$meth ne ""} { + # We need to invoke in the caller's context so upvar etc. will + # not be affected by this intermediate method dispatcher + return [uplevel 1 [list $meth $this $methodname] $args] + } + + error "Unknown method $methodname" + } +} + +# Given a method name, locate it in the class hierarchy. Returns +# fully qualified method if found, else an empty string +proc metoo::_locate_method {class_ns methodname} { + # See if there is a method defined in this class. + # Breakage if method names with wildcard chars. Too bad + if {[llength [info commands ${class_ns}::methods::_m_$methodname]]} { + # We need to invoke in the caller's context so upvar etc. will + # not be affected by this intermediate method dispatcher + return ${class_ns}::methods::_m_$methodname + } + + # No method here, check for super class. + while {[info exists ${class_ns}::super]} { + set class_ns [set ${class_ns}::super] + if {[llength [info commands ${class_ns}::methods::_m_$methodname]]} { + return ${class_ns}::methods::_m_$methodname + } + } + + return ""; # Not found +} + +proc metoo::_new {class_ns cmd args} { + # class_ns expected to be fully qualified + variable next_id + + # IMPORTANT: + # object namespace *must* be child of class namespace. + # Saves a bit of bookkeeping. Putting it somewhere else will require + # changes to many other places in the code. + set objns ${class_ns}::o#[incr next_id] + + switch -exact -- $cmd { + create { + if {[llength $args] < 1} { + error "Insufficient args, should be: class create CLASSNAME ?args?" + } + # TBD - check if command already exists + # Note objname must always be fully qualified. Note cannot + # use namespace which here because the commmand does not + # yet exist. + set args [lassign $args objname] + if {[string compare :: [string range $objname 0 1]]} { + # Not fully qualified. Qualify based on caller namespace + set objname [uplevel 1 "namespace current"]::$objname + } + # Trip excess ":" - can happen in both above cases + set objname ::[string trimleft $objname :] + } + new { + set objname $objns + } + default { + error "Unknown command '$cmd'. Should be create or new." + } + } + + # Create the namespace. The array _ is used to hold private information + namespace eval $objns { + variable _ + } + set ${objns}::_(name) $objname + + # When invoked by its name, call the dispatcher. + interp alias {} $objname {} ${class_ns}::_call $objns + + # Register the object. We do this BEFORE running the constructor + variable _objects + set _objects($objname) $objns + + # Invoke the constructor + if {[catch { + $objname constructor {*}$args + } msg]} { + # Undo what we did + set erinfo $::errorInfo + set ercode $::errorCode + rename $objname "" + namespace delete $objns + error $msg $erinfo $ercode + } + + # TBD - does tracing cause a slowdown ? + # Set up trace to track when the object is renamed/destroyed + trace add command $objname {rename delete} [list [namespace current]::_trace_object_renames $objns] + + return $objname +} + +proc metoo::_trace_object_renames {objns oldname newname op} { + # Note the trace command fully qualifies oldname and newname + if {$op eq "rename"} { + variable _objects + set _objects($newname) $_objects($oldname) + unset _objects($oldname) + set ${objns}::_(name) $newname + } else { + $oldname destroy + } +} + +proc metoo::_class_cmd {class_ns cmd args} { + switch -exact -- $cmd { + create - + new { + return [uplevel 1 [list [namespace current]::_new $class_ns $cmd] $args] + } + destroy { + # Destroy all objects belonging to this class + foreach objns [namespace children ${class_ns} o#*] { + [set ${objns}::_(name)] destroy + } + # Destroy all classes that inherit from this + foreach child_ns [array names ${class_ns}::subclasses] { + # Child namespace is also subclass command + $child_ns destroy + } + trace remove command $class_ns {rename delete} [list ::metoo::_trace_class_renames] + namespace delete ${class_ns} + rename ${class_ns} "" + } + default { + error "Unknown command '$cmd'. Should be create, new or destroy." + } + } +} + +proc metoo::class {cmd cname definition} { + variable next_id + + if {$cmd ne "create"} { + error "Syntax: class create CLASSNAME DEFINITION" + } + + if {[uplevel 1 "namespace exists $cname"]} { + error "can't create class '$cname': namespace already exists with that name." + } + + # Resolve cname into a namespace in the caller's context + set class_ns [uplevel 1 "namespace eval $cname {namespace current}"] + + if {[llength [info commands $class_ns]]} { + # Delete the namespace we just created + namespace delete $class_ns + error "can't create class '$cname': command already exists with that name." + } + + # Define the commands/aliases that are used inside a class definition + foreach procname [info commands [namespace current]::define::*] { + interp alias {} ${class_ns}::[namespace tail $procname] {} $procname $class_ns + } + + # Define the built in commands callable within class instance methods + foreach procname [info commands [namespace current]::object::*] { + interp alias {} ${class_ns}::methods::[namespace tail $procname] {} $procname + } + + # Define the destroy method for the class object instances + namespace eval $class_ns { + method destroy {} { + set retval [my destructor] + # Remove trace on command rename/deletion. + # ${_this}::_(name) contains the object's current name on + # which the trace is set. + set me [set ${_this}::_(name)] + trace remove command $me {rename delete} [list ::metoo::_trace_object_renames $_this] + rename $me "" + unset -nocomplain ::metoo::_objects($me) + namespace delete $_this + return $retval + } + method variable {args} { + if {[llength $args]} { + set cmd [list upvar 0] + foreach varname $args { + lappend cmd ${_this}::$varname $varname + } + uplevel 1 $cmd + } + } + } + + # Define the class. Note we do this *after* the standard + # definitions (destroy etc.) above so that they can + # be overridden by the class definition. + if {[catch { + namespace eval $class_ns $definition + } msg ]} { + namespace delete $class_ns + error $msg $::errorInfo $::errorCode + } + + # Also define the call dispatcher within the class. + # TBD - not sure this is actually necessary any more + namespace eval ${class_ns} { + proc _call {objns methodname args} { + # Note this duplicates the "my" code but cannot call that as + # it adds another frame level which interferes with uplevel etc. + + set class_ns [namespace parent $objns] + + # We insert the object namespace as the first param to the command. + # This is passed as the first parameter "_this" to methods. + + set meth [::metoo::_locate_method $class_ns $methodname] + if {$meth ne ""} { + # We need to invoke in the caller's context so upvar etc. will + # not be affected by this intermediate method dispatcher + return [uplevel 1 [list $meth $objns] $args] + } + + # It is ok for constructor or destructor to be undefined. For + # the others, invoke "unknown" if it exists + + if {$methodname eq "constructor" || $methodname eq "destructor"} { + return + } + + set meth [::metoo::_locate_method $class_ns "unknown"] + if {$meth ne ""} { + # We need to invoke in the caller's context so upvar etc. will + # not be affected by this intermediate method dispatcher + return [uplevel 1 [list $meth $objns $methodname] $args] + } + + error "Unknown method $methodname" + } + } + + # The namespace is also a command used to create class instances + # TBD - check if command of that name already exists + interp alias {} $class_ns {} [namespace current]::_class_cmd $class_ns + # Set up trace to track when the class command is renamed/destroyed + trace add command $class_ns [list rename delete] ::metoo::_trace_class_renames + + return $class_ns +} + +proc metoo::_trace_class_renames {oldname newname op} { + if {$op eq "rename"} { + # TBD - this does not actually work. The rename succeeds anyways + error "MetOO classes may not be renamed" + } else { + $oldname destroy + } +} + +proc metoo::introspect {type info args} { + switch -exact -- $type { + "object" { + variable _objects + switch -exact -- $info { + "isa" { + if {[llength $args] == 0 || [llength $args] > 2} { + error "wrong # args: should be \"metoo::introspect $type $info OBJNAME ?CLASS?\"" + } + set objname [uplevel 1 [list namespace which -command [lindex $args 0]]] + if {![info exists _objects($objname)]} { + return 0 + } + if {[llength $args] == 1} { + # No class specified + return 1 + } + # passed classname assumed to be fully qualified + set objclass [namespace parent $_objects($objname)] + if {[string equal $objclass [lindex $args 1]]} { + # Direct hit + return 1 + } + + # No direct hit, check ancestors + if {[lindex $args 1] in [ancestors $objclass]} { + return 1 + } + + return 0 + } + + "list" { + if {[llength $args] > 1} { + error "wrong # args: should be \"metoo::introspect $type $info ?CLASS?" + } + variable _objects + if {[llength $args] == 0} { + return [array names _objects] + } + set objs {} + foreach obj [array names _objects] { + if {[introspect object isa $obj [lindex $args 0]]} { + lappend objs $obj + } + } + return $objs + } + default { + error "$info subcommand not supported for $type introspection" + } + } + } + + "class" { + switch -exact -- $info { + "ancestors" { + if {[llength $args] != 1} { + error "wrong # args: should be \"metoo::introspect $type $info CLASSNAME" + } + return [ancestors [lindex $args 0]] + } + default { + error "$info subcommand not supported for $type introspection" + } + } + } + default { + error "$type introspection not supported" + } + } +} + +proc metoo::ancestors {class_ns} { + # Returns ancestors of a class + + set ancestors [list ] + while {[info exists ${class_ns}::super]} { + lappend ancestors [set class_ns [set ${class_ns}::super]] + } + + return $ancestors +} + +namespace eval metoo { namespace export class } + +# Simple sample class showing all capabilities. Anything not shown here will +# probably not work. Call as "demo" to use metoo, or "demo oo" to use TclOO. +# Output should be same in both cases. +proc ::metoo::demo {{ns metoo}} { + ${ns}::class create Base { + constructor {x y} { puts "Base constructor ([self object]): $x, $y" + } + method m {} { puts "Base::m called" } + method n {args} { puts "Base::n called: [join $args {, }]"; my m } + method unknown {methodname args} { puts "Base::unknown called for $methodname [join $args {, }]"} + destructor { puts "Base::destructor ([self object])" } + } + + ${ns}::class create Derived { + superclass Base + constructor {x y} { puts "Derived constructor ([self object]): $x, $y" ; next $x $y } + destructor { puts "Derived::destructor called ([self object])" ; next } + method n {args} { puts "Derived::n ([self object]): [join $args {, }]"; next {*}$args} + method put {val} {my variable var ; set var $val} + method get {varname} {my variable var ; upvar 1 $varname retvar; set retvar $var} + } + + Base create b dum dee; # Create named object + Derived create d fee fi; # Create derived object + set o [Derived new fo fum]; # Create autonamed object + $o put 10; # Use of instance variable + $o get v; # Verify correct frame level ... + puts "v:$v"; # ...when calling methods + b m; # Direct method + b n; # Use of my to call another method + $o m; # Inherited method + $o n; # Overridden method chained to inherited + $o nosuchmethod arg1 arg2; # Invoke unknown + $o destroy; # Explicit destroy + rename b ""; # Destroy through rename + Base destroy; # Should destroy object d, Derived, Base +} + +# Hack to work with the various build configuration. +if {[info commands ::twapi::get_version] ne ""} { + package provide metoo [::twapi::get_version -patchlevel] +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/msi.tcl b/src/punk86.vfs/lib/twapi4.7.2/msi.tcl new file mode 100644 index 00000000..f50cea2e --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/msi.tcl @@ -0,0 +1,403 @@ +# +# Copyright (c) 2003-2018, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# Hack to work with the various build configuration. +if {[info commands ::twapi::get_version] ne ""} { + package provide twapi_msi [::twapi::get_version -patchlevel] +} + +# Rest of this file auto-generated + + +# Automatically generated type library interface +# File: msi.dll +# Name: WindowsInstaller +# GUID: {000C1092-0000-0000-C000-000000000046} +# Version: 1.0 +# LCID: 1033 +package require twapi_com + +namespace eval windowsinstaller { + + # Array mapping coclass names to their guids + variable _coclass_guids + + # Array mapping dispatch interface names to their guids + variable _dispatch_guids + + # Returns the GUID for a coclass or empty string if not found + proc coclass_guid {coclass_name} { + variable _coclass_guids + if {[info exists _coclass_guids($coclass_name)]} { + return $_coclass_guids($coclass_name) + } + return "" + } + # Returns the GUID for a dispatch name or empty string if not found + proc dispatch_guid {dispatch_name} { + variable _dispatch_guids + if {[info exists _dispatch_guids($dispatch_name)]} { + return $_dispatch_guids($dispatch_name) + } + return "" + } + # Marks the specified object to be of a specific dispatch/coclass type + proc declare {typename comobj} { + # First check if it is the name of a dispatch interface + set guid [dispatch_guid $typename] + if {$guid ne ""} { + $comobj -interfaceguid $guid + return + } + + # If not, check if it is the name of a coclass with a dispatch interface + set guid [coclass_guid $typename] + if {$guid ne ""} { + if {[info exists ::twapi::_coclass_idispatch_guids($guid)]} { + $comobj -interfaceguid $::twapi::_coclass_idispatch_guids($guid) + return + } + } + + error "Could not resolve interface for $coclass_name." + } + + # Enum MsiUILevel + array set MsiUILevel {msiUILevelNoChange 0 msiUILevelDefault 1 msiUILevelNone 2 msiUILevelBasic 3 msiUILevelReduced 4 msiUILevelFull 5 msiUILevelHideCancel 32 msiUILevelProgressOnly 64 msiUILevelEndDialog 128 msiUILevelSourceResOnly 256} + + # Enum MsiReadStream + array set MsiReadStream {msiReadStreamInteger 0 msiReadStreamBytes 1 msiReadStreamAnsi 2 msiReadStreamDirect 3} + + # Enum MsiRunMode + array set MsiRunMode {msiRunModeAdmin 0 msiRunModeAdvertise 1 msiRunModeMaintenance 2 msiRunModeRollbackEnabled 3 msiRunModeLogEnabled 4 msiRunModeOperations 5 msiRunModeRebootAtEnd 6 msiRunModeRebootNow 7 msiRunModeCabinet 8 msiRunModeSourceShortNames 9 msiRunModeTargetShortNames 10 msiRunModeWindows9x 12 msiRunModeZawEnabled 13 msiRunModeScheduled 16 msiRunModeRollback 17 msiRunModeCommit 18} + + # Enum MsiDatabaseState + array set MsiDatabaseState {msiDatabaseStateRead 0 msiDatabaseStateWrite 1} + + # Enum MsiViewModify + array set MsiViewModify {msiViewModifySeek -1 msiViewModifyRefresh 0 msiViewModifyInsert 1 msiViewModifyUpdate 2 msiViewModifyAssign 3 msiViewModifyReplace 4 msiViewModifyMerge 5 msiViewModifyDelete 6 msiViewModifyInsertTemporary 7 msiViewModifyValidate 8 msiViewModifyValidateNew 9 msiViewModifyValidateField 10 msiViewModifyValidateDelete 11} + + # Enum MsiColumnInfo + array set MsiColumnInfo {msiColumnInfoNames 0 msiColumnInfoTypes 1} + + # Enum MsiTransformError + array set MsiTransformError {msiTransformErrorNone 0 msiTransformErrorAddExistingRow 1 msiTransformErrorDeleteNonExistingRow 2 msiTransformErrorAddExistingTable 4 msiTransformErrorDeleteNonExistingTable 8 msiTransformErrorUpdateNonExistingRow 16 msiTransformErrorChangeCodePage 32 msiTransformErrorViewTransform 256} + + # Enum MsiEvaluateCondition + array set MsiEvaluateCondition {msiEvaluateConditionFalse 0 msiEvaluateConditionTrue 1 msiEvaluateConditionNone 2 msiEvaluateConditionError 3} + + # Enum MsiTransformValidation + array set MsiTransformValidation {msiTransformValidationNone 0 msiTransformValidationLanguage 1 msiTransformValidationProduct 2 msiTransformValidationPlatform 4 msiTransformValidationMajorVer 8 msiTransformValidationMinorVer 16 msiTransformValidationUpdateVer 32 msiTransformValidationLess 64 msiTransformValidationLessOrEqual 128 msiTransformValidationEqual 256 msiTransformValidationGreaterOrEqual 512 msiTransformValidationGreater 1024 msiTransformValidationUpgradeCode 2048} + + # Enum MsiDoActionStatus + array set MsiDoActionStatus {msiDoActionStatusNoAction 0 msiDoActionStatusSuccess 1 msiDoActionStatusUserExit 2 msiDoActionStatusFailure 3 msiDoActionStatusSuspend 4 msiDoActionStatusFinished 5 msiDoActionStatusWrongState 6 msiDoActionStatusBadActionData 7} + + # Enum MsiMessageStatus + array set MsiMessageStatus {msiMessageStatusError -1 msiMessageStatusNone 0 msiMessageStatusOk 1 msiMessageStatusCancel 2 msiMessageStatusAbort 3 msiMessageStatusRetry 4 msiMessageStatusIgnore 5 msiMessageStatusYes 6 msiMessageStatusNo 7} + + # Enum MsiMessageType + array set MsiMessageType {msiMessageTypeFatalExit 0 msiMessageTypeError 16777216 msiMessageTypeWarning 33554432 msiMessageTypeUser 50331648 msiMessageTypeInfo 67108864 msiMessageTypeFilesInUse 83886080 msiMessageTypeResolveSource 100663296 msiMessageTypeOutOfDiskSpace 117440512 msiMessageTypeActionStart 134217728 msiMessageTypeActionData 150994944 msiMessageTypeProgress 167772160 msiMessageTypeCommonData 184549376 msiMessageTypeOk 0 msiMessageTypeOkCancel 1 msiMessageTypeAbortRetryIgnore 2 msiMessageTypeYesNoCancel 3 msiMessageTypeYesNo 4 msiMessageTypeRetryCancel 5 msiMessageTypeDefault1 0 msiMessageTypeDefault2 256 msiMessageTypeDefault3 512} + + # Enum MsiInstallState + array set MsiInstallState {msiInstallStateNotUsed -7 msiInstallStateBadConfig -6 msiInstallStateIncomplete -5 msiInstallStateSourceAbsent -4 msiInstallStateInvalidArg -2 msiInstallStateUnknown -1 msiInstallStateBroken 0 msiInstallStateAdvertised 1 msiInstallStateRemoved 1 msiInstallStateAbsent 2 msiInstallStateLocal 3 msiInstallStateSource 4 msiInstallStateDefault 5} + + # Enum MsiCostTree + array set MsiCostTree {msiCostTreeSelfOnly 0 msiCostTreeChildren 1 msiCostTreeParents 2} + + # Enum MsiReinstallMode + array set MsiReinstallMode {msiReinstallModeFileMissing 2 msiReinstallModeFileOlderVersion 4 msiReinstallModeFileEqualVersion 8 msiReinstallModeFileExact 16 msiReinstallModeFileVerify 32 msiReinstallModeFileReplace 64 msiReinstallModeMachineData 128 msiReinstallModeUserData 256 msiReinstallModeShortcut 512 msiReinstallModePackage 1024} + + # Enum MsiInstallType + array set MsiInstallType {msiInstallTypeDefault 0 msiInstallTypeNetworkImage 1 msiInstallTypeSingleInstance 2} + + # Enum MsiInstallMode + array set MsiInstallMode {msiInstallModeNoSourceResolution -3 msiInstallModeNoDetection -2 msiInstallModeExisting -1 msiInstallModeDefault 0} + + # Enum MsiSignatureInfo + array set MsiSignatureInfo {msiSignatureInfoCertificate 0 msiSignatureInfoHash 1} + + # Enum MsiInstallContext + array set MsiInstallContext {msiInstallContextFirstVisible 0 msiInstallContextUserManaged 1 msiInstallContextUser 2 msiInstallContextMachine 4 msiInstallContextAllUserManaged 8} + + # Enum MsiInstallSourceType + array set MsiInstallSourceType {msiInstallSourceTypeUnknown 0 msiInstallSourceTypeNetwork 1 msiInstallSourceTypeURL 2 msiInstallSourceTypeMedia 4} + + # Enum MsiAssemblyType + array set MsiAssemblyType {msiProvideAssemblyNet 0 msiProvideAssemblyWin32 1} + + # Enum MsiProductScriptInfo + array set MsiProductScriptInfo {msiProductScriptInfoProductCode 0 msiProductScriptInfoProductLanguage 1 msiProductScriptInfoProductVersion 2 msiProductScriptInfoProductName 3 msiProductScriptInfoPackageName 4} + + # Enum MsiAdvertiseProductContext + array set MsiAdvertiseProductContext {msiAdvertiseProductMachine 0 msiAdvertiseProductUser 1} + + # Enum Constants + array set Constants {msiDatabaseNullInteger -2147483648} + + # Enum MsiOpenDatabaseMode + array set MsiOpenDatabaseMode {msiOpenDatabaseModeReadOnly 0 msiOpenDatabaseModeTransact 1 msiOpenDatabaseModeDirect 2 msiOpenDatabaseModeCreate 3 msiOpenDatabaseModeCreateDirect 4 msiOpenDatabaseModePatchFile 32} + + # Enum MsiSignatureOption + array set MsiSignatureOption {msiSignatureOptionInvalidHashFatal 1} + + # Enum MsiAdvertiseProductPlatform + array set MsiAdvertiseProductPlatform {msiAdvertiseCurrentPlatform 0 msiAdvertiseX86Platform 1 msiAdvertiseIA64Platform 2 msiAdvertiseX64Platform 4} + + # Enum MsiAdvertiseProductOptions + array set MsiAdvertiseProductOptions {msiAdvertiseDefault 0 msiAdvertiseSingleInstance 1} + + # Enum MsiAdvertiseScriptFlags + array set MsiAdvertiseScriptFlags {msiAdvertiseScriptCacheInfo 1 msiAdvertiseScriptShortcuts 4 msiAdvertiseScriptMachineAssign 8 msiAdvertiseScriptConfigurationRegistration 32 msiAdvertiseScriptValidateTransformsList 64 msiAdvertiseScriptClassInfoRegistration 128 msiAdvertiseScriptExtensionInfoRegistration 256 msiAdvertiseScriptAppInfo 384 msiAdvertiseScriptRegData 416} +} + +# Dispatch Interface Installer +set windowsinstaller::_dispatch_guids(Installer) "{000C1090-0000-0000-C000-000000000046}" +# Installer Methods +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} CreateRecord 1033 1 {1 1033 1 {26 {29 256}} {{3 1}} Count} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} OpenPackage 1033 1 {2 1033 1 {26 {29 512}} {{12 1} {3 {49 {3 0}}}} {PackagePath Options}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} OpenProduct 1033 1 {3 1033 1 {26 {29 512}} {{8 1}} ProductCode} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} OpenDatabase 1033 1 {4 1033 1 {26 {29 768}} {{8 1} {12 1}} {DatabasePath OpenMode}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} SummaryInformation 1033 2 {5 1033 2 {26 {29 1024}} {{8 1} {3 {49 {3 0}}}} {PackagePath UpdateCount}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} EnableLog 1033 1 {7 1033 1 24 {{8 1} {8 1}} {LogMode LogFile}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} InstallProduct 1033 1 {8 1033 1 24 {{8 1} {8 {49 {8 0}}}} {PackagePath PropertyValues}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} Version 1033 2 {9 1033 2 8 {} {}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} LastErrorRecord 1033 1 {10 1033 1 {26 {29 256}} {} {}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} RegistryValue 1033 1 {11 1033 1 8 {{12 1} {8 1} {12 17}} {Root Key Value}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} FileAttributes 1033 1 {13 1033 1 3 {{8 1}} FilePath} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} FileSize 1033 1 {15 1033 1 3 {{8 1}} FilePath} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} FileVersion 1033 1 {16 1033 1 8 {{8 1} {12 17}} {FilePath Language}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} Environment 1033 2 {12 1033 2 8 {{8 1}} Variable} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} Environment 1033 4 {12 1033 4 24 {{8 1} {8 1}} Variable} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ProductState 1033 2 {17 1033 2 {29 2432} {{8 1}} Product} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ProductInfo 1033 2 {18 1033 2 8 {{8 1} {8 1}} {Product Attribute}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ConfigureProduct 1033 1 {19 1033 1 24 {{8 1} {3 1} {3 1}} {Product InstallLevel InstallState}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ReinstallProduct 1033 1 {20 1033 1 24 {{8 1} {3 1}} {Product ReinstallMode}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} CollectUserInfo 1033 1 {21 1033 1 24 {{8 1}} Product} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ApplyPatch 1033 1 {22 1033 1 24 {{8 1} {8 1} {3 1} {8 1}} {PatchPackage InstallPackage InstallType CommandLine}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} FeatureParent 1033 2 {23 1033 2 8 {{8 1} {8 1}} {Product Feature}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} FeatureState 1033 2 {24 1033 2 {29 2432} {{8 1} {8 1}} {Product Feature}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} UseFeature 1033 1 {25 1033 1 24 {{8 1} {8 1} {3 1}} {Product Feature InstallMode}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} FeatureUsageCount 1033 2 {26 1033 2 3 {{8 1} {8 1}} {Product Feature}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} FeatureUsageDate 1033 2 {27 1033 2 7 {{8 1} {8 1}} {Product Feature}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ConfigureFeature 1033 1 {28 1033 1 24 {{8 1} {8 1} {3 1}} {Product Feature InstallState}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ReinstallFeature 1033 1 {29 1033 1 24 {{8 1} {8 1} {3 1}} {Product Feature ReinstallMode}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ProvideComponent 1033 1 {30 1033 1 8 {{8 1} {8 1} {8 1} {3 1}} {Product Feature Component InstallMode}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ComponentPath 1033 2 {31 1033 2 8 {{8 1} {8 1}} {Product Component}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ProvideQualifiedComponent 1033 1 {32 1033 1 8 {{8 1} {8 1} {3 1}} {Category Qualifier InstallMode}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} QualifierDescription 1033 2 {33 1033 2 8 {{8 1} {8 1}} {Category Qualifier}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ComponentQualifiers 1033 2 {34 1033 2 {26 {29 3328}} {{8 1}} Category} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} Products 1033 2 {35 1033 2 {26 {29 3328}} {} {}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} Features 1033 2 {36 1033 2 {26 {29 3328}} {{8 1}} Product} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} Components 1033 2 {37 1033 2 {26 {29 3328}} {} {}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ComponentClients 1033 2 {38 1033 2 {26 {29 3328}} {{8 1}} Component} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} Patches 1033 2 {39 1033 2 {26 {29 3328}} {{8 1}} Product} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} RelatedProducts 1033 2 {40 1033 2 {26 {29 3328}} {{8 1}} UpgradeCode} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} PatchInfo 1033 2 {41 1033 2 8 {{8 1} {8 1}} {Patch Attribute}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} PatchTransforms 1033 2 {42 1033 2 8 {{8 1} {8 1}} {Product Patch}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} AddSource 1033 1 {43 1033 1 24 {{8 1} {8 1} {8 1}} {Product User Source}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ClearSourceList 1033 1 {44 1033 1 24 {{8 1} {8 1}} {Product User}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ForceSourceListResolution 1033 1 {45 1033 1 24 {{8 1} {8 1}} {Product User}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} GetShortcutTarget 1033 2 {46 1033 2 {26 {29 256}} {{8 1}} ShortcutPath} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} FileHash 1033 1 {47 1033 1 {26 {29 256}} {{8 1} {3 1}} {FilePath Options}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} FileSignatureInfo 1033 1 {48 1033 1 {27 17} {{8 1} {3 1} {3 1}} {FilePath Options Format}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} RemovePatches 1033 1 {49 1033 1 24 {{8 1} {8 1} {3 1} {8 {49 {8 0}}}} {PatchList Product UninstallType PropertyList}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ApplyMultiplePatches 1033 1 {51 1033 1 24 {{8 1} {8 1} {8 1}} {PatchPackage Product PropertiesList}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} Product 1033 2 {53 1033 2 25 {{8 1} {8 1} {3 1} {{26 9} 10}} {Product UserSid iContext retval}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} Patch 1033 2 {56 1033 2 25 {{8 1} {8 1} {8 1} {3 1} {{26 9} 10}} {PatchCode ProductCode UserSid iContext retval}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ProductsEx 1033 2 {52 1033 2 {26 {29 2816}} {{8 1} {8 1} {3 1}} {Product UserSid Contexts}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} PatchesEx 1033 2 {55 1033 2 {26 {29 2816}} {{8 1} {8 1} {3 1} {3 1}} {Product UserSid Contexts filter}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ExtractPatchXMLData 1033 1 {57 1033 1 8 {{8 1}} PatchPath} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ProductCode 1033 2 {58 1033 2 8 {{8 1}} Component} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ProductElevated 1033 2 {59 1033 2 11 {{8 1}} Product} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ProvideAssembly 1033 1 {60 1033 1 8 {{8 1} {8 1} {3 1} {3 1}} {Assembly Context InstallMode AssemblyInfo}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ProductInfoFromScript 1033 2 {61 1033 2 12 {{8 1} {3 1}} {ScriptFile ProductInfo}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} AdvertiseProduct 1033 1 {62 1033 1 24 {{8 1} {3 1} {8 {49 {8 0}}} {3 {49 {3 0}}} {3 {49 {3 0}}}} {PackagePath iContext Transforms Language Options}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} CreateAdvertiseScript 1033 1 {63 1033 1 24 {{8 1} {8 1} {8 {49 {8 0}}} {3 {49 {3 0}}} {3 {49 {3 0}}} {3 {49 {3 0}}}} {PackagePath ScriptFilePath Transforms Language Platform Options}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} AdvertiseScript 1033 1 {64 1033 1 24 {{8 1} {3 1} {11 1}} {ScriptPath ScriptFlags RemoveItems}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} PatchFiles 1033 2 {65 1033 2 {26 {29 3328}} {{8 1} {8 1}} {Product PatchPackages}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ComponentsEx 1033 2 {66 1033 2 {26 {29 2816}} {{8 1} {3 1}} {UserSid Context}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ComponentClientsEx 1033 2 {67 1033 2 {26 {29 2816}} {{8 1} {8 1} {3 1}} {ComponentCode UserSid Context}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} ComponentPathEx 1033 2 {9068 1033 2 {26 {29 4480}} {{8 1} {8 1} {8 1} {3 1}} {ProductCode ComponentCode UserSid Context}} +# Installer Properties +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} UILevel 1033 2 {6 1033 2 {29 128} {} {}} +::twapi::dispatch_prototype_set {{000C1090-0000-0000-C000-000000000046}} UILevel 1033 4 {6 1033 4 24 {{{29 128} 1}} {}} + +# Dispatch Interface Record +set windowsinstaller::_dispatch_guids(Record) "{000C1093-0000-0000-C000-000000000046}" +# Record Methods +::twapi::dispatch_prototype_set {{000C1093-0000-0000-C000-000000000046}} StringData 1033 2 {1 1033 2 8 {{3 1}} Field} +::twapi::dispatch_prototype_set {{000C1093-0000-0000-C000-000000000046}} StringData 1033 4 {1 1033 4 24 {{3 1} {8 1}} Field} +::twapi::dispatch_prototype_set {{000C1093-0000-0000-C000-000000000046}} IntegerData 1033 2 {2 1033 2 3 {{3 1}} Field} +::twapi::dispatch_prototype_set {{000C1093-0000-0000-C000-000000000046}} IntegerData 1033 4 {2 1033 4 24 {{3 1} {3 1}} Field} +::twapi::dispatch_prototype_set {{000C1093-0000-0000-C000-000000000046}} SetStream 1033 1 {3 1033 1 24 {{3 1} {8 1}} {Field FilePath}} +::twapi::dispatch_prototype_set {{000C1093-0000-0000-C000-000000000046}} ReadStream 1033 1 {4 1033 1 8 {{3 1} {3 1} {3 1}} {Field Length Format}} +::twapi::dispatch_prototype_set {{000C1093-0000-0000-C000-000000000046}} FieldCount 1033 2 {0 1033 2 3 {} {}} +::twapi::dispatch_prototype_set {{000C1093-0000-0000-C000-000000000046}} IsNull 1033 2 {6 1033 2 11 {{3 1}} Field} +::twapi::dispatch_prototype_set {{000C1093-0000-0000-C000-000000000046}} DataSize 1033 2 {5 1033 2 3 {{3 1}} Field} +::twapi::dispatch_prototype_set {{000C1093-0000-0000-C000-000000000046}} ClearData 1033 1 {7 1033 1 24 {} {}} +::twapi::dispatch_prototype_set {{000C1093-0000-0000-C000-000000000046}} FormatText 1033 1 {8 1033 1 8 {} {}} + +# Dispatch Interface Session +set windowsinstaller::_dispatch_guids(Session) "{000C109E-0000-0000-C000-000000000046}" +# Session Methods +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} Installer 1033 2 {1 1033 2 {26 {29 0}} {} {}} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} Property 1033 2 {2 1033 2 8 {{8 1}} Name} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} Property 1033 4 {2 1033 4 24 {{8 1} {8 1}} Name} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} Language 1033 2 {3 1033 2 3 {} {}} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} Mode 1033 2 {4 1033 2 11 {{3 1}} Flag} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} Mode 1033 4 {4 1033 4 24 {{3 1} {11 1}} Flag} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} Database 1033 2 {5 1033 2 {26 {29 768}} {} {}} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} SourcePath 1033 2 {6 1033 2 8 {{8 1}} Folder} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} TargetPath 1033 2 {7 1033 2 8 {{8 1}} Folder} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} TargetPath 1033 4 {7 1033 4 24 {{8 1} {8 1}} Folder} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} DoAction 1033 1 {8 1033 1 {29 2048} {{8 1}} Action} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} Sequence 1033 1 {9 1033 1 {29 2048} {{8 1} {12 17}} {Table Mode}} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} EvaluateCondition 1033 1 {10 1033 1 {29 1792} {{8 1}} Expression} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} FormatRecord 1033 1 {11 1033 1 8 {{9 1}} Record} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} Message 1033 1 {12 1033 1 {29 2176} {{3 1} {9 1}} {Kind Record}} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} FeatureCurrentState 1033 2 {13 1033 2 {29 2432} {{8 1}} Feature} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} FeatureRequestState 1033 2 {14 1033 2 {29 2432} {{8 1}} Feature} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} FeatureRequestState 1033 4 {14 1033 4 24 {{8 1} {3 1}} Feature} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} FeatureValidStates 1033 2 {15 1033 2 3 {{8 1}} Feature} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} FeatureCost 1033 2 {16 1033 2 3 {{8 1} {3 1} {3 1}} {Feature CostTree State}} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} ComponentCurrentState 1033 2 {17 1033 2 {29 2432} {{8 1}} Component} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} ComponentRequestState 1033 2 {18 1033 2 {29 2432} {{8 1}} Component} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} ComponentRequestState 1033 4 {18 1033 4 24 {{8 1} {3 1}} Component} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} SetInstallLevel 1033 1 {19 1033 1 24 {{3 1}} Level} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} VerifyDiskSpace 1033 2 {20 1033 2 11 {} {}} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} ProductProperty 1033 2 {21 1033 2 8 {{8 1}} Property} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} FeatureInfo 1033 2 {22 1033 2 {26 {29 2688}} {{8 1}} Feature} +::twapi::dispatch_prototype_set {{000C109E-0000-0000-C000-000000000046}} ComponentCosts 1033 2 {23 1033 2 {26 {29 2816}} {{8 1} {3 1}} {Component State}} + +# Dispatch Interface Database +set windowsinstaller::_dispatch_guids(Database) "{000C109D-0000-0000-C000-000000000046}" +# Database Methods +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} DatabaseState 1033 2 {1 1033 2 {29 896} {} {}} +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} SummaryInformation 1033 2 {2 1033 2 {26 {29 1024}} {{3 {49 {3 0}}}} UpdateCount} +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} OpenView 1033 1 {3 1033 1 {26 {29 1152}} {{8 1}} Sql} +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} Commit 1033 1 {4 1033 1 24 {} {}} +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} PrimaryKeys 1033 2 {5 1033 2 {26 {29 256}} {{8 1}} Table} +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} Import 1033 1 {6 1033 1 24 {{8 1} {8 1}} {Folder File}} +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} Export 1033 1 {7 1033 1 24 {{8 1} {8 1} {8 1}} {Table Folder File}} +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} Merge 1033 1 {8 1033 1 11 {{9 1} {8 {49 {8 0}}}} {Database ErrorTable}} +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} GenerateTransform 1033 1 {9 1033 1 11 {{9 1} {8 {49 {8 0}}}} {ReferenceDatabase TransformFile}} +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} ApplyTransform 1033 1 {10 1033 1 24 {{8 1} {3 1}} {TransformFile ErrorConditions}} +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} EnableUIPreview 1033 1 {11 1033 1 {26 {29 1664}} {} {}} +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} TablePersistent 1033 2 {12 1033 2 {29 1792} {{8 1}} Table} +::twapi::dispatch_prototype_set {{000C109D-0000-0000-C000-000000000046}} CreateTransformSummaryInfo 1033 1 {13 1033 1 24 {{9 1} {8 1} {3 1} {3 1}} {ReferenceDatabase TransformFile ErrorConditions Validation}} + +# Dispatch Interface SummaryInfo +set windowsinstaller::_dispatch_guids(SummaryInfo) "{000C109B-0000-0000-C000-000000000046}" +# SummaryInfo Methods +::twapi::dispatch_prototype_set {{000C109B-0000-0000-C000-000000000046}} Property 1033 2 {1 1033 2 12 {{3 1}} Pid} +::twapi::dispatch_prototype_set {{000C109B-0000-0000-C000-000000000046}} Property 1033 4 {1 1033 4 24 {{3 1} {12 1}} Pid} +::twapi::dispatch_prototype_set {{000C109B-0000-0000-C000-000000000046}} PropertyCount 1033 2 {2 1033 2 3 {} {}} +::twapi::dispatch_prototype_set {{000C109B-0000-0000-C000-000000000046}} Persist 1033 1 {3 1033 1 24 {} {}} + +# Dispatch Interface View +set windowsinstaller::_dispatch_guids(View) "{000C109C-0000-0000-C000-000000000046}" +# View Methods +::twapi::dispatch_prototype_set {{000C109C-0000-0000-C000-000000000046}} Execute 1033 1 {1 1033 1 24 {{9 {49 {3 0}}}} Params} +::twapi::dispatch_prototype_set {{000C109C-0000-0000-C000-000000000046}} Fetch 1033 1 {2 1033 1 {26 {29 256}} {} {}} +::twapi::dispatch_prototype_set {{000C109C-0000-0000-C000-000000000046}} Modify 1033 1 {3 1033 1 24 {{3 1} {9 0}} {Mode Record}} +::twapi::dispatch_prototype_set {{000C109C-0000-0000-C000-000000000046}} ColumnInfo 1033 2 {5 1033 2 {26 {29 256}} {{3 1}} Info} +::twapi::dispatch_prototype_set {{000C109C-0000-0000-C000-000000000046}} Close 1033 1 {4 1033 1 24 {} {}} +::twapi::dispatch_prototype_set {{000C109C-0000-0000-C000-000000000046}} GetError 1033 1 {6 1033 1 8 {} {}} + +# Dispatch Interface UIPreview +set windowsinstaller::_dispatch_guids(UIPreview) "{000C109A-0000-0000-C000-000000000046}" +# UIPreview Methods +::twapi::dispatch_prototype_set {{000C109A-0000-0000-C000-000000000046}} Property 1033 2 {1 1033 2 8 {{8 1}} Name} +::twapi::dispatch_prototype_set {{000C109A-0000-0000-C000-000000000046}} Property 1033 4 {1 1033 4 24 {{8 1} {8 1}} Name} +::twapi::dispatch_prototype_set {{000C109A-0000-0000-C000-000000000046}} ViewDialog 1033 1 {2 1033 1 24 {{8 1}} Dialog} +::twapi::dispatch_prototype_set {{000C109A-0000-0000-C000-000000000046}} ViewBillboard 1033 1 {3 1033 1 24 {{8 1} {8 1}} {Control Billboard}} + +# Dispatch Interface FeatureInfo +set windowsinstaller::_dispatch_guids(FeatureInfo) "{000C109F-0000-0000-C000-000000000046}" +# FeatureInfo Methods +::twapi::dispatch_prototype_set {{000C109F-0000-0000-C000-000000000046}} Title 1033 2 {1 1033 2 8 {} {}} +::twapi::dispatch_prototype_set {{000C109F-0000-0000-C000-000000000046}} Description 1033 2 {2 1033 2 8 {} {}} +# FeatureInfo Properties +::twapi::dispatch_prototype_set {{000C109F-0000-0000-C000-000000000046}} Attributes 1033 2 {3 1033 2 3 {} {}} +::twapi::dispatch_prototype_set {{000C109F-0000-0000-C000-000000000046}} Attributes 1033 4 {3 1033 4 24 {{3 1}} {}} + +# Dispatch Interface RecordList +set windowsinstaller::_dispatch_guids(RecordList) "{000C1096-0000-0000-C000-000000000046}" +# RecordList Methods +::twapi::dispatch_prototype_set {{000C1096-0000-0000-C000-000000000046}} _NewEnum 1033 1 {-4 1033 1 13 {} {}} +::twapi::dispatch_prototype_set {{000C1096-0000-0000-C000-000000000046}} Item 1033 2 {0 1033 2 {26 {29 256}} {{3 0}} Index} +::twapi::dispatch_prototype_set {{000C1096-0000-0000-C000-000000000046}} Count 1033 2 {1 1033 2 3 {} {}} + +# Dispatch Interface StringList +set windowsinstaller::_dispatch_guids(StringList) "{000C1095-0000-0000-C000-000000000046}" +# StringList Methods +::twapi::dispatch_prototype_set {{000C1095-0000-0000-C000-000000000046}} _NewEnum 1033 1 {-4 1033 1 13 {} {}} +::twapi::dispatch_prototype_set {{000C1095-0000-0000-C000-000000000046}} Item 1033 2 {0 1033 2 8 {{3 0}} Index} +::twapi::dispatch_prototype_set {{000C1095-0000-0000-C000-000000000046}} Count 1033 2 {1 1033 2 3 {} {}} + +# Dispatch Interface Product +set windowsinstaller::_dispatch_guids(Product) "{000C10A0-0000-0000-C000-000000000046}" +# Product Methods +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} ProductCode 1033 2 {1 1033 2 25 {{{26 8} 10}} retval} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} UserSid 1033 2 {2 1033 2 25 {{{26 8} 10}} retval} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} Context 1033 2 {3 1033 2 25 {{{26 3} 10}} retval} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} State 1033 2 {4 1033 2 25 {{{26 3} 10}} retval} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} InstallProperty 1033 2 {5 1033 2 25 {{8 1} {{26 8} 10}} {Name retval}} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} ComponentState 1033 2 {6 1033 2 25 {{8 1} {{26 3} 10}} {Component retval}} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} FeatureState 1033 2 {7 1033 2 25 {{8 1} {{26 3} 10}} {Feature retval}} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} Sources 1033 2 {14 1033 2 25 {{3 1} {{26 9} 10}} {SourceType retval}} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} MediaDisks 1033 2 {15 1033 2 25 {{{26 9} 10}} retval} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} SourceListAddSource 1033 1 {8 1033 1 25 {{3 1} {8 1} {3 1}} {iSourceType Source dwIndex}} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} SourceListAddMediaDisk 1033 1 {9 1033 1 25 {{3 1} {8 1} {8 1}} {dwDiskId VolumeLabel DiskPrompt}} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} SourceListClearSource 1033 1 {10 1033 1 25 {{3 1} {8 1}} {iSourceType Source}} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} SourceListClearMediaDisk 1033 1 {11 1033 1 25 {{3 1}} iDiskId} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} SourceListClearAll 1033 1 {12 1033 1 25 {{3 1}} iSourceType} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} SourceListForceResolution 1033 1 {13 1033 1 25 {} {}} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} SourceListInfo 1033 2 {16 1033 2 25 {{8 1} {{26 8} 10}} {Property retval}} +::twapi::dispatch_prototype_set {{000C10A0-0000-0000-C000-000000000046}} SourceListInfo 1033 4 {16 1033 4 25 {{8 1} {8 1}} {Property retval}} + +# Dispatch Interface Patch +set windowsinstaller::_dispatch_guids(Patch) "{000C10A1-0000-0000-C000-000000000046}" +# Patch Methods +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} PatchCode 1033 2 {1 1033 2 25 {{{26 8} 10}} retval} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} ProductCode 1033 2 {2 1033 2 25 {{{26 8} 10}} retval} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} UserSid 1033 2 {3 1033 2 25 {{{26 8} 10}} retval} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} Context 1033 2 {4 1033 2 25 {{{26 3} 10}} retval} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} State 1033 2 {5 1033 2 25 {{{26 3} 10}} retval} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} Sources 1033 2 {12 1033 2 25 {{3 1} {{26 9} 10}} {SourceType retval}} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} MediaDisks 1033 2 {13 1033 2 25 {{{26 9} 10}} retval} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} SourceListAddSource 1033 1 {6 1033 1 25 {{3 1} {8 1} {3 1}} {iSourceType Source dwIndex}} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} SourceListAddMediaDisk 1033 1 {7 1033 1 25 {{3 1} {8 1} {8 1}} {dwDiskId VolumeLabel DiskPrompt}} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} SourceListClearSource 1033 1 {8 1033 1 25 {{3 1} {8 1}} {iSourceType Source}} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} SourceListClearMediaDisk 1033 1 {9 1033 1 25 {{3 1}} iDiskId} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} SourceListClearAll 1033 1 {10 1033 1 25 {{3 1}} iSourceType} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} SourceListForceResolution 1033 1 {11 1033 1 25 {} {}} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} SourceListInfo 1033 2 {14 1033 2 25 {{8 1} {{26 8} 10}} {Property retval}} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} SourceListInfo 1033 4 {14 1033 4 25 {{8 1} {8 1}} {Property retval}} +::twapi::dispatch_prototype_set {{000C10A1-0000-0000-C000-000000000046}} PatchProperty 1033 2 {15 1033 2 25 {{8 1} {{26 8} 10}} {Property Value}} + +# Dispatch Interface ComponentPath +set windowsinstaller::_dispatch_guids(ComponentPath) "{000C1099-0000-0000-C000-000000000046}" +# ComponentPath Methods +::twapi::dispatch_prototype_set {{000C1099-0000-0000-C000-000000000046}} ComponentCode 1033 2 {1 1033 2 25 {{{26 8} 10}} retval} +::twapi::dispatch_prototype_set {{000C1099-0000-0000-C000-000000000046}} Path 1033 2 {2 1033 2 25 {{{26 8} 10}} retval} +::twapi::dispatch_prototype_set {{000C1099-0000-0000-C000-000000000046}} State 1033 2 {3 1033 2 25 {{{26 3} 10}} retval} + +# Dispatch Interface Component +set windowsinstaller::_dispatch_guids(Component) "{000C1097-0000-0000-C000-000000000046}" +# Component Methods +::twapi::dispatch_prototype_set {{000C1097-0000-0000-C000-000000000046}} ComponentCode 1033 2 {1 1033 2 25 {{{26 8} 10}} retval} +::twapi::dispatch_prototype_set {{000C1097-0000-0000-C000-000000000046}} UserSid 1033 2 {2 1033 2 25 {{{26 8} 10}} retval} +::twapi::dispatch_prototype_set {{000C1097-0000-0000-C000-000000000046}} Context 1033 2 {3 1033 2 25 {{{26 3} 10}} retval} + +# Dispatch Interface ComponentClient +set windowsinstaller::_dispatch_guids(ComponentClient) "{000C1098-0000-0000-C000-000000000046}" +# ComponentClient Methods +::twapi::dispatch_prototype_set {{000C1098-0000-0000-C000-000000000046}} ProductCode 1033 2 {2 1033 2 25 {{{26 8} 10}} retval} +::twapi::dispatch_prototype_set {{000C1098-0000-0000-C000-000000000046}} ComponentCode 1033 2 {1 1033 2 25 {{{26 8} 10}} retval} +::twapi::dispatch_prototype_set {{000C1098-0000-0000-C000-000000000046}} UserSid 1033 2 {3 1033 2 25 {{{26 8} 10}} retval} +::twapi::dispatch_prototype_set {{000C1098-0000-0000-C000-000000000046}} Context 1033 2 {4 1033 2 25 {{{26 3} 10}} retval} + diff --git a/src/punk86.vfs/lib/twapi4.7.2/mstask.tcl b/src/punk86.vfs/lib/twapi4.7.2/mstask.tcl new file mode 100644 index 00000000..d1e37686 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/mstask.tcl @@ -0,0 +1,745 @@ +# +# Copyright (c) 2006-2013 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# Task scheduler API + +package require twapi_com + +namespace eval twapi { + variable CLSID_ITaskScheduler {{148BD52A-A2AB-11CE-B11F-00AA00530503}} + variable CLSID_ITask {{148BD520-A2AB-11CE-B11F-00AA00530503}} +} + +# Return an instance of the task scheduler +proc twapi::itaskscheduler_new {args} { + array set opts [parseargs args { + system.arg + } -maxleftover 0] + + # Get ITaskScheduler interface + set its [com_create_instance $::twapi::CLSID_ITaskScheduler -model inprocserver -interface ITaskScheduler -raw] + if {![info exists opts(system)]} { + return $its + } + trap { + itaskscheduler_set_target_system $its $opts(system) + } onerror {} { + IUnknown_Release $its + rethrow + } + return $its +} + +interp alias {} ::twapi::itaskscheduler_release {} ::twapi::IUnknown_Release + +# Return a new task interface +proc twapi::itaskscheduler_new_itask {its taskname} { + set iid_itask [name_to_iid ITask] + set iunk [ITaskScheduler_NewWorkItem $its $taskname $::twapi::CLSID_ITask $iid_itask] + trap { + set itask [Twapi_IUnknown_QueryInterface $iunk $iid_itask ITask] + } finally { + IUnknown_Release $iunk + } + return $itask +} + +# Get an existing task +proc twapi::itaskscheduler_get_itask {its taskname} { + set iid_itask [name_to_iid ITask] + set iunk [ITaskScheduler_Activate $its $taskname $iid_itask] + trap { + set itask [Twapi_IUnknown_QueryInterface $iunk $iid_itask ITask] + } finally { + IUnknown_Release $iunk + } + return $itask +} + +# Check if an itask exists +proc twapi::itaskscheduler_task_exists {its taskname} { + return [expr {[ITaskScheduler_IsOfType $its $taskname [name_to_iid ITask]] == 0 ? true : false}] +} + +# Return list of tasks +proc twapi::itaskscheduler_get_tasks {its} { + set ienum [ITaskScheduler_Enum $its] + trap { + set result [list ] + set more 1 + while {$more} { + lassign [IEnumWorkItems_Next $ienum 20] more items + set result [concat $result $items] + } + } finally { + IUnknown_Release $ienum + } + return $result +} + +# Sets the specified properties of the ITask +proc twapi::itask_configure {itask args} { + + array set opts [parseargs args { + application.arg + maxruntime.int + params.arg + priority.arg + workingdir.arg + account.arg + password.arg + comment.arg + creator.arg + data.arg + idlewait.int + idlewaitdeadline.int + interactive.bool + deletewhendone.bool + disabled.bool + hidden.bool + runonlyifloggedon.bool + startonlyifidle.bool + resumesystem.bool + killonidleend.bool + restartonidleresume.bool + dontstartonbatteries.bool + killifonbatteries.bool + } -maxleftover 0] + + if {[info exists opts(priority)]} { + switch -exact -- $opts(priority) { + normal {set opts(priority) 0x00000020} + abovenormal {set opts(priority) 0x00008000} + belownormal {set opts(priority) 0x00004000} + high {set opts(priority) 0x00000080} + realtime {set opts(priority) 0x00000100} + idle {set opts(priority) 0x00000040} + default {error "Unknown priority '$opts(priority)'. Must be one of 'normal', 'high', 'idle' or 'realtime'"} + } + } + + foreach {opt fn} { + application ITask_SetApplicationName + maxruntime ITask_SetMaxRunTime + params ITask_SetParameters + workingdir ITask_SetWorkingDirectory + priority ITask_SetPriority + comment IScheduledWorkItem_SetComment + creator IScheduledWorkItem_SetCreator + data IScheduledWorkItem_SetWorkItemData + errorretrycount IScheduledWorkItem_SetErrorRetryCount + errorretryinterval IScheduledWorkItem_SetErrorRetryInterval + } { + if {[info exists opts($opt)]} { + $fn $itask $opts($opt) + } + } + + if {[info exists opts(account)]} { + if {$opts(account) ne ""} { + if {![info exists opts(password)]} { + error "Option -password must be specified if -account is specified" + } + } else { + # System account. Set password to NULL pointer indicated + # by magic null pointer + set opts(password) $::twapi::nullptr + } + IScheduledWorkItem_SetAccountInformation $itask $opts(account) $opts(password) + } + + if {[info exists opts(idlewait)] || [info exists opts(idlewaitdeadline)]} { + # If either one is not specified, get the current settings + if {! ([info exists opts(idlewait)] && + [info exists opts(idlewaitdeadline)]) } { + lassign [IScheduledWorkItem_GetIdleWait $itask] idle dead + if {![info exists opts(idlewait)]} { + set opts(idlewait) $idle + } + if {![info exists opts(idlewaitdeadline)]} { + set opts(idlewaitdeadline) $dead + } + } + IScheduledWorkItem_SetIdleWait $itask $opts(idlewait) $opts(idlewaitdeadline) + } + + # Finally figure out and set the flags if needed + if {[info exists opts(interactive)] || + [info exists opts(deletewhendone)] || + [info exists opts(disabled)] || + [info exists opts(hidden)] || + [info exists opts(runonlyifloggedon)] || + [info exists opts(startonlyifidle)] || + [info exists opts(resumesystem)] || + [info exists opts(killonidleend)] || + [info exists opts(restartonidleresume)] || + [info exists opts(dontstartonbatteries)] || + [info exists opts(killifonbatteries)]} { + + # First, get the current flags + set flags [IScheduledWorkItem_GetFlags $itask] + foreach {opt val} { + interactive 0x1 + deletewhendone 0x2 + disabled 0x4 + startonlyifidle 0x10 + hidden 0x200 + runonlyifloggedon 0x2000 + resumesystem 0x1000 + killonidleend 0x20 + restartonidleresume 0x800 + dontstartonbatteries 0x40 + killifonbatteries 0x80 + } { + # Set / reset the bit if specified + if {[info exists opts($opt)]} { + if {$opts($opt)} { + setbits flags $val + } else { + resetbits flags $val + } + } + } + + # Now set the new value of flags + IScheduledWorkItem_SetFlags $itask $flags + } + + + return +} + +proc twapi::itask_get_info {itask args} { + # Note options errorretrycount and errorretryinterval are not implemented + # by the OS so left out + array set opts [parseargs args { + all + application + maxruntime + params + priority + workingdir + account + comment + creator + data + idlewait + idlewaitdeadline + interactive + deletewhendone + disabled + hidden + runonlyifloggedon + startonlyifidle + resumesystem + killonidleend + restartonidleresume + dontstartonbatteries + killifonbatteries + lastruntime + nextruntime + status + } -maxleftover 0] + + set result [list ] + if {$opts(all) || $opts(priority)} { + switch -exact -- [twapi::ITask_GetPriority $itask] { + 32 { set priority normal } + 64 { set priority idle } + 128 { set priority high } + 256 { set priority realtime } + 16384 { set priority belownormal } + 32768 { set priority abovenormal } + default { set priority unknown } + } + lappend result -priority $priority + } + + foreach {opt fn} { + application ITask_GetApplicationName + maxruntime ITask_GetMaxRunTime + params ITask_GetParameters + workingdir ITask_GetWorkingDirectory + account IScheduledWorkItem_GetAccountInformation + comment IScheduledWorkItem_GetComment + creator IScheduledWorkItem_GetCreator + data IScheduledWorkItem_GetWorkItemData + } { + if {$opts(all) || $opts($opt)} { + trap { + lappend result -$opt [$fn $itask] + } onerror {TWAPI_WIN32 -2147216625} { + # THe information is empty in the scheduler database + lappend result -$opt {} + } + } + } + + if {$opts(all) || $opts(lastruntime)} { + trap { + lappend result -lastruntime [_timelist_to_timestring [IScheduledWorkItem_GetMostRecentRunTime $itask]] + } onerror {TWAPI_WIN32 267011} { + # Not run yet at all + lappend result -lastruntime {} + } + } + + if {$opts(all) || $opts(nextruntime)} { + trap { + lappend result -nextruntime [_timelist_to_timestring [IScheduledWorkItem_GetNextRunTime $itask]] + } onerror {TWAPI_WIN32 267010} { + # Task is disabled + lappend result -nextruntime disabled + } onerror {TWAPI_WIN32 267015} { + # No triggers set + lappend result -nextruntime notriggers + } onerror {TWAPI_WIN32 267016} { + # No triggers set + lappend result -nextruntime oneventonly + } + } + + if {$opts(all) || $opts(status)} { + set status [IScheduledWorkItem_GetStatus $itask] + if {$status == 0x41300} { + set status ready + } elseif {$status == 0x41301} { + set status running + } elseif {$status == 0x41302} { + set status disabled + } elseif {$status == 0x41305} { + set status partiallydefined + } else { + set status unknown + } + lappend result -status $status + } + + + if {$opts(all) || $opts(idlewait) || $opts(idlewaitdeadline)} { + lassign [IScheduledWorkItem_GetIdleWait $itask] idle dead + if {$opts(all) || $opts(idlewait)} { + lappend result -idlewait $idle + } + if {$opts(all) || $opts(idlewaitdeadline)} { + lappend result -idlewaitdeadline $dead + } + } + + # Finally figure out and set the flags if needed + if {$opts(all) || + $opts(interactive) || + $opts(deletewhendone) || + $opts(disabled) || + $opts(hidden) || + $opts(runonlyifloggedon) || + $opts(startonlyifidle) || + $opts(resumesystem) || + $opts(killonidleend) || + $opts(restartonidleresume) || + $opts(dontstartonbatteries) || + $opts(killifonbatteries)} { + + # First, get the current flags + set flags [IScheduledWorkItem_GetFlags $itask] + foreach {opt val} { + interactive 0x1 + deletewhendone 0x2 + disabled 0x4 + startonlyifidle 0x10 + hidden 0x200 + runonlyifloggedon 0x2000 + resumesystem 0x1000 + killonidleend 0x20 + restartonidleresume 0x800 + dontstartonbatteries 0x40 + killifonbatteries 0x80 + } { + if {$opts(all) || $opts($opt)} { + lappend result -$opt [expr {($flags & $val) ? true : false}] + } + } + } + + + return $result +} + +# Get the runtimes for a task within an interval +proc twapi::itask_get_runtimes_within_interval {itask args} { + array set opts [parseargs args { + start.arg + end.arg + {count.int 1} + statusvar.arg + } -maxleftover 0] + + if {[info exists opts(start)]} { + set start [_timestring_to_timelist $opts(start)] + } else { + set start [_seconds_to_timelist [clock seconds]] + } + if {[info exists opts(end)]} { + set end [_timestring_to_timelist $opts(end)] + } else { + set end {2038 1 1 0 0 0 0} + } + + set result [list ] + if {[info exists opts(statusvar)]} { + upvar $opts(statusvar) status + } + lassign [IScheduledWorkItem_GetRunTimes $itask $start $end $opts(count)] status timelist + + foreach time $timelist { + lappend result [_timelist_to_timestring $time] + } + + + return $result +} + +# Saves the specified ITask +proc twapi::itask_save {itask} { + set ipersist [Twapi_IUnknown_QueryInterface $itask [name_to_iid IPersistFile] IPersistFile] + trap { + IPersistFile_Save $ipersist "" 1 + } finally { + IUnknown_Release $ipersist + } + return +} + +# Show property editor for a task +proc twapi::itask_edit_dialog {itask args} { + array set opts [parseargs args { + {hwin.arg 0} + } -maxleftover 0] + + return [twapi::IScheduledWorkItem_EditWorkItem $itask $opts(hwin) 0] +} + + +interp alias {} ::twapi::itask_release {} ::twapi::IUnknown_Release + +# Get information about a trigger +proc twapi::itasktrigger_get_info {itt} { + array set data [ITaskTrigger_GetTrigger $itt] + + set result(-begindate) [format %04d-%02d-%02d $data(wBeginYear) $data(wBeginMonth) $data(wBeginDay)] + + set result(-starttime) [format %02d:%02d $data(wStartHour) $data(wStartMinute)] + + if {$data(rgFlags) & 1} { + set result(-enddate) [format %04d-%02d-%02d $data(wEndYear) $data(wEndMonth) $data(wEndDay)] + } else { + set result(-enddate) "" + } + + set result(-duration) $data(MinutesDuration) + set result(-interval) $data(MinutesInterval) + if {$data(rgFlags) & 2} { + set result(-killatdurationend) true + } else { + set result(-killatdurationend) false + } + + if {$data(rgFlags) & 4} { + set result(-disabled) true + } else { + set result(-disabled) false + } + + switch -exact -- [lindex $data(type) 0] { + 0 { + set result(-type) once + } + 1 { + set result(-type) daily + set result(-period) [lindex $data(type) 1] + } + 2 { + set result(-type) weekly + set result(-period) [lindex $data(type) 1] + set result(-weekdays) [format 0x%x [lindex $data(type) 2]] + } + 3 { + set result(-type) monthlydate + set result(-daysofmonth) [format 0x%x [lindex $data(type) 1]] + set result(-months) [format 0x%x [lindex $data(type) 2]] + } + 4 { + set result(-type) monthlydow + set result(-weekofmonth) [lindex {first second third fourth last} [lindex $data(type) 2]] + set result(-weekdays) [format 0x%x [lindex $data(type) 2]] + set result(-months) [format 0x%x [lindex $data(type) 3]] + } + 5 { + set result(-type) onidle + } + 6 { + set result(-type) atsystemstart + } + 7 { + set result(-type) atlogon + } + } + return [array get result] +} + + +# Configure a task trigger +proc twapi::itasktrigger_configure {itt args} { + array set opts [parseargs args { + begindate.arg + enddate.arg + starttime.arg + interval.int + duration.int + killatdurationend.bool + disabled.bool + type.arg + weekofmonth.int + {period.int 1} + {weekdays.int 0x7f} + {daysofmonth.int 0x7fffffff} + {months.int 0xfff} + } -maxleftover 0] + + + array set data [ITaskTrigger_GetTrigger $itt] + + if {[info exists opts(begindate)]} { + lassign [split $opts(begindate) -] year month day + # Note we trim leading zeroes else Tcl thinks its octal + set data(wBeginYear) [scan $year %d] + set data(wBeginMonth) [scan $month %d] + set data(wBeginDay) [scan $day %d] + } + + if {[info exists opts(starttime)]} { + lassign [split $opts(starttime) :] hour minute + # Note we trim leading zeroes else Tcl thinks its octal + set data(wStartHour) [scan $hour %d] + set data(wStartMinute) [scan $minute %d] + } + + if {[info exists opts(enddate)]} { + if {$opts(enddate) ne ""} { + setbits data(rgFlags) 1; # Indicate end date is present + lassign [split $opts(enddate) -] year month day + # Note we trim leading zeroes else Tcl thinks its octal + set data(wEndYear) [scan $year %d] + set data(wEndMonth) [scan $month %d] + set data(wEndDay) [scan $day %d] + } else { + resetbits data(rgFlags) 1; # Indicate no end date + } + } + + + if {[info exists opts(duration)]} { + set data(MinutesDuration) $opts(duration) + } + + if {[info exists opts(interval)]} { + set data(MinutesInterval) $opts(interval) + } + + if {[info exists opts(killatdurationend)]} { + if {$opts(killatdurationend)} { + setbits data(rgFlags) 2 + } else { + resetbits data(rgFlags) 2 + } + } + + if {[info exists opts(disabled)]} { + if {$opts(disabled)} { + setbits data(rgFlags) 4 + } else { + resetbits data(rgFlags) 4 + } + } + + # Note the type specific options are only used if -type is specified + if {[info exists opts(type)]} { + switch -exact -- $opts(type) { + once { + set data(type) [list 0] + } + daily { + set data(type) [list 1 $opts(period)] + } + weekly { + set data(type) [list 2 $opts(period) $opts(weekdays)] + } + monthlydate { + set data(type) [list 3 $opts(daysofmonth) $opts(months)] + } + monthlydow { + set data(type) [list 4 $opts(weekofmonth) $opts(weekdays) $opts(months)] + } + onidle { + set data(type) [list 5] + } + atsystemstart { + set data(type) [list 6] + } + atlogon { + set data(type) [list 7] + } + } + } + + ITaskTrigger_SetTrigger $itt [array get data] + return +} + +interp alias {} ::twapi::itasktrigger_release {} ::twapi::IUnknown_Release + +# Create a new task from scratch. Basically a wrapper around the +# corresponding itaskscheduler, itask and itasktrigger calls +proc twapi::mstask_create {taskname args} { + + # The options are a combination of itask_configure and + # itasktrigger_configure. + # Note the disabled option default to false explicitly. This is because + # the task trigger will default to disabled unless specifically set. + array set opts [parseargs args { + system.arg + application.arg + maxruntime.int + params.arg + priority.arg + workingdir.arg + account.arg + password.arg + comment.arg + creator.arg + data.arg + idlewait.int + idlewaitdeadline.int + interactive.bool + deletewhendone.bool + {disabled.bool false} + hidden.bool + runonlyifloggedon.bool + startonlyifidle.bool + resumesystem.bool + killonidleend.bool + restartonidleresume.bool + dontstartonbatteries.bool + killifonbatteries.bool + begindate.arg + enddate.arg + starttime.arg + interval.int + duration.int + killatdurationend.bool + type.arg + period.int + weekdays.int + daysofmonth.int + months.int + } -maxleftover 0] + + set its [itaskscheduler_new] + trap { + if {[info exists opts(system)]} { + itaskscheduler_set_target_system $opts(system) + } + + set itask [itaskscheduler_new_itask $its $taskname] + # Construct the command line for configuring the task + set cmd [list itask_configure $itask] + foreach opt { + application + maxruntime + params + priority + workingdir + account + password + comment + creator + data + idlewait + idlewaitdeadline + interactive + deletewhendone + disabled + hidden + runonlyifloggedon + startonlyifidle + resumesystem + killonidleend + restartonidleresume + dontstartonbatteries + killifonbatteries + } { + if {[info exists opts($opt)]} { + lappend cmd -$opt $opts($opt) + } + } + eval $cmd + + # Now get a trigger and configure it + set itt [lindex [itask_new_itasktrigger $itask] 1] + set cmd [list itasktrigger_configure $itt] + foreach opt { + begindate + enddate + interval + starttime + duration + killatdurationend + type + period + weekdays + daysofmonth + months + disabled + } { + if {[info exists opts($opt)]} { + lappend cmd -$opt $opts($opt) + } + } + eval $cmd + + # Save the task + itask_save $itask + + } finally { + IUnknown_Release $its + if {[info exists itask]} { + IUnknown_Release $itask + } + if {[info exists itt]} { + IUnknown_Release $itt + } + } + return +} + +# Delete a task +proc twapi::mstask_delete {taskname args} { + # The options are a combination of itask_configure and + # itasktrigger_configure + array set opts [parseargs args { + system.arg + } -maxleftover 0] + set its [itaskscheduler_new] + trap { + if {[info exists opts(system)]} { + itaskscheduler_set_target_system $opts(system) + } + itaskscheduler_delete_task $its $taskname + } finally { + IUnknown_Release $its + } + return +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/multimedia.tcl b/src/punk86.vfs/lib/twapi4.7.2/multimedia.tcl new file mode 100644 index 00000000..57665197 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/multimedia.tcl @@ -0,0 +1,75 @@ +# +# Copyright (c) 2012 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# Generate sound for the specified duration +proc twapi::beep {args} { + array set opts [parseargs args { + {frequency.int 1000} + {duration.int 100} + {type.arg} + }] + + if {[info exists opts(type)]} { + switch -exact -- $opts(type) { + ok {MessageBeep 0} + hand {MessageBeep 0x10} + question {MessageBeep 0x20} + exclaimation {MessageBeep 0x30} + exclamation {MessageBeep 0x30} + asterisk {MessageBeep 0x40} + default {error "Unknown sound type '$opts(type)'"} + } + return + } + Beep $opts(frequency) $opts(duration) + return +} + +# Play the specified sound +proc twapi::play_sound {name args} { + array set opts [parseargs args { + alias + async + loop + nodefault + wait + nostop + }] + + if {$opts(alias)} { + set flags 0x00010000; #SND_ALIAS + } else { + set flags 0x00020000; #SND_FILENAME + } + if {$opts(loop)} { + # Note LOOP requires ASYNC + setbits flags 0x9; #SND_LOOP | SND_ASYNC + } else { + if {$opts(async)} { + setbits flags 0x0001; #SND_ASYNC + } else { + setbits flags 0x0000; #SND_SYNC + } + } + + if {$opts(nodefault)} { + setbits flags 0x0002; #SND_NODEFAULT + } + + if {! $opts(wait)} { + setbits flags 0x00002000; #SND_NOWAIT + } + + if {$opts(nostop)} { + setbits flags 0x0010; #SND_NOSTOP + } + + return [PlaySound $name 0 $flags] +} + +proc twapi::stop_sound {} { + PlaySound "" 0 0x0040; #SND_PURGE +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/namedpipe.tcl b/src/punk86.vfs/lib/twapi4.7.2/namedpipe.tcl new file mode 100644 index 00000000..7e222f13 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/namedpipe.tcl @@ -0,0 +1,103 @@ +# +# Copyright (c) 2010-2011, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# Implementation of named pipes + +proc twapi::namedpipe_server {name args} { + set name [file nativename $name] + + # Only byte mode currently supported. Message mode does + # not mesh well with Tcl channel infrastructure. + # readmode.arg + # writemode.arg + + array set opts [twapi::parseargs args { + {access.arg {read write}} + {writedacl 0 0x00040000} + {writeowner 0 0x00080000} + {writesacl 0 0x01000000} + {writethrough 0 0x80000000} + denyremote + {timeout.int 50} + {maxinstances.int 255} + {secd.arg {}} + {inherit.bool 0} + } -maxleftover 0] + + # 0x40000000 -> OVERLAPPED I/O + set open_mode [expr { + [twapi::_parse_symbolic_bitmask $opts(access) {read 1 write 2}] | + $opts(writedacl) | $opts(writeowner) | + $opts(writesacl) | $opts(writethrough) | + 0x40000000 + }] + + set pipe_mode 0 + if {$opts(denyremote)} { + if {! [twapi::min_os_version 6]} { + error "Option -denyremote not supported on this operating system." + } + set pipe_mode [expr {$pipe_mode | 8}] + } + + return [twapi::Twapi_NPipeServer $name $open_mode $pipe_mode \ + $opts(maxinstances) 4000 4000 $opts(timeout) \ + [_make_secattr $opts(secd) $opts(inherit)]] +} + +proc twapi::namedpipe_client {name args} { + set name [file nativename $name] + + # Only byte mode currently supported. Message mode does + # not mesh well with Tcl channel infrastructure. + # readmode.arg + # writemode.arg + + array set opts [twapi::parseargs args { + {access.arg {read write}} + impersonationlevel.arg + {impersonateeffectiveonly.bool false 0x00080000} + {impersonatecontexttracking.bool false 0x00040000} + } -maxleftover 0] + + # FILE_READ_DATA 0x00000001 + # FILE_WRITE_DATA 0x00000002 + # Note - use _parse_symbolic_bitmask because we allow user to specify + # numeric masks as well + set desired_access [twapi::_parse_symbolic_bitmask $opts(access) { + read 1 + write 2 + }] + + set flags 0 + if {[info exists opts(impersonationlevel)]} { + switch -exact -- $opts(impersonationlevel) { + anonymous { set flags 0x00100000 } + identification { set flags 0x00110000 } + impersonation { set flags 0x00120000 } + delegation { set flags 0x00130000 } + default { + # ERROR_BAD_IMPERSONATION_LEVEL + win32_error 1346 "Invalid impersonation level '$opts(impersonationlevel)'." + } + } + set flags [expr {$flags | $opts(impersonateeffectiveonly) | + $opts(impersonatecontexttracking)}] + } + + set share_mode 0; # Share none + set secattr {}; # At some point use this for "inherit" flag + set create_disposition 3; # OPEN_EXISTING + return [twapi::Twapi_NPipeClient $name $desired_access $share_mode \ + $secattr $create_disposition $flags] +} + +# Impersonate a named pipe client +proc twapi::impersonate_namedpipe_client {chan} { + set h [get_tcl_channel_handle $chan read] + ImpersonateNamedPipeClient $h +} + diff --git a/src/punk86.vfs/lib/twapi4.7.2/network.tcl b/src/punk86.vfs/lib/twapi4.7.2/network.tcl new file mode 100644 index 00000000..4cdbba87 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/network.tcl @@ -0,0 +1,1124 @@ +# +# Copyright (c) 2004-2014, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi { + record IP_ADAPTER_ADDRESSES_XP { + -ipv4ifindex -adaptername -unicastaddresses -anycastaddresses + -multicastaddresses -dnsservers -dnssuffix -description + -friendlyname -physicaladdress -flags -mtu -type -operstatus + -ipv6ifindex -zoneindices -prefixes + } + + if {[min_os_version 6]} { + record IP_ADAPTER_ADDRESSES [list {*}[IP_ADAPTER_ADDRESSES_XP] -transmitspeed -receivespeed -winsaddresses -gatewayaddresses -ipv4metric -ipv6metric -luid -dhcpv4server -compartmentid -networkguid -connectiontype -tunneltype -dhcpv6server -dhcpv6clientduid -dhcpv6iaid -dnssuffixes] + } else { + record IP_ADAPTER_ADDRESSES [IP_ADAPTER_ADDRESSES_XP] + } + + record IP_ADAPTER_UNICAST_ADDRESS { + -flags -address -prefixorigin -suffixorigin -dadstate -validlifetime -preferredlifetime -leaselifetime + } + + record IP_ADAPTER_ANYCAST_ADDRESS {-flags -address} + record IP_ADAPTER_MULTICAST_ADDRESS [IP_ADAPTER_ANYCAST_ADDRESS] + record IP_ADAPTER_DNS_SERVER_ADDRESS [IP_ADAPTER_ANYCAST_ADDRESS] +} + +proc twapi::get_network_adapters {} { + # 0x20 -> SKIP_FRIENDLYNAME + # 0x0f -> SKIP_DNS_SERVER, SKIP_UNICAST/MULTICAST/ANYCAST + return [lpick [GetAdaptersAddresses 0 0x2f] [enum [IP_ADAPTER_ADDRESSES] -adaptername]] +} + +proc twapi::get_network_adapters_detail {} { + set recs {} + # We only return fields common to all platforms + set fields [IP_ADAPTER_ADDRESSES_XP] + foreach rec [GetAdaptersAddresses 0 0] { + set rec [IP_ADAPTER_ADDRESSES set $rec \ + -physicaladdress [_hwaddr_binary_to_string [IP_ADAPTER_ADDRESSES -physicaladdress $rec]] \ + -unicastaddresses [ntwine [IP_ADAPTER_UNICAST_ADDRESS] [IP_ADAPTER_ADDRESSES -unicastaddresses $rec]] \ + -multicastaddresses [ntwine [IP_ADAPTER_MULTICAST_ADDRESS] [IP_ADAPTER_ADDRESSES -multicastaddresses $rec]] \ + -anycastaddresses [ntwine [IP_ADAPTER_ANYCAST_ADDRESS] [IP_ADAPTER_ADDRESSES -anycastaddresses $rec]] \ + -dnsservers [ntwine [IP_ADAPTER_DNS_SERVER_ADDRESS] [IP_ADAPTER_ADDRESSES -dnsservers $rec]]] + + lappend recs [IP_ADAPTER_ADDRESSES select $rec $fields] + } + return [list $fields $recs] +} + +# Get the list of local IP addresses +proc twapi::get_system_ipaddrs {args} { + array set opts [parseargs args { + {ipversion.arg 0} + {types.arg unicast} + adaptername.arg + } -maxleftover 0] + + # 0x20 -> SKIP_FRIENDLYNAME + # 0x08 -> SKIP_DNS_SERVER + set flags 0x2f + if {"all" in $opts(types)} { + set flags 0x20 + } else { + if {"unicast" in $opts(types)} {incr flags -1} + if {"anycast" in $opts(types)} {incr flags -2} + if {"multicast" in $opts(types)} {incr flags -4} + } + + set addrs {} + trap { + set entries [GetAdaptersAddresses [_ipversion_to_af $opts(ipversion)] $flags] + } onerror {TWAPI_WIN32 232} { + # Not installed, so no addresses + return {} + } + + foreach entry $entries { + if {[info exists opts(adaptername)] && + [string compare -nocase [IP_ADAPTER_ADDRESSES -adaptername $entry] $opts(adaptername)]} { + continue + } + + foreach rec [IP_ADAPTER_ADDRESSES -unicastaddresses $entry] { + lappend addrs [IP_ADAPTER_UNICAST_ADDRESS -address $rec] + } + foreach rec [IP_ADAPTER_ADDRESSES -anycastaddresses $entry] { + lappend addrs [IP_ADAPTER_ANYCAST_ADDRESS -address $rec] + } + foreach rec [IP_ADAPTER_ADDRESSES -multicastaddresses $entry] { + lappend addrs [IP_ADAPTER_MULTICAST_ADDRESS -address $rec] + } + } + + return [lsort -unique $addrs] +} + +# Get network related information +proc twapi::get_network_info {args} { + # Map options into the positions in result of GetNetworkParams + array set getnetworkparams_opts { + hostname 0 + domain 1 + dnsservers 2 + dhcpscopeid 4 + routingenabled 5 + arpproxyenabled 6 + dnsenabled 7 + } + + array set opts [parseargs args \ + [concat [list all] \ + [array names getnetworkparams_opts]]] + set result [list ] + foreach opt [array names getnetworkparams_opts] { + if {!$opts(all) && !$opts($opt)} continue + if {![info exists netparams]} { + set netparams [GetNetworkParams] + } + lappend result -$opt [lindex $netparams $getnetworkparams_opts($opt)] + } + + return $result +} + + +proc twapi::get_network_adapter_info {interface args} { + array set opts [parseargs args { + all + adaptername + anycastaddresses + description + dhcpenabled + dnsservers + dnssuffix + friendlyname + ipv4ifindex + ipv6ifindex + multicastaddresses + mtu + operstatus + physicaladdress + prefixes + type + unicastaddresses + zoneindices + + {ipversion.arg 0} + } -maxleftover 0 -hyphenated] + + set ipversion [_ipversion_to_af $opts(-ipversion)] + + set flags 0 + if {! $opts(-all)} { + # If not asked for some fields, don't bother getting them + if {! $opts(-unicastaddresses)} { incr flags 0x1 } + if {! $opts(-anycastaddresses)} { incr flags 0x2 } + if {! $opts(-multicastaddresses)} { incr flags 0x4 } + if {! $opts(-dnsservers)} { incr flags 0x8 } + if {! $opts(-friendlyname)} { incr flags 0x20 } + + if {$opts(-prefixes)} { incr flags 0x10 } + } else { + incr flags 0x10; # Want prefixes also + } + + set entries [GetAdaptersAddresses $ipversion $flags] + set nameindex [enum [IP_ADAPTER_ADDRESSES] -adaptername] + set entry [lsearch -nocase -exact -inline -index $nameindex $entries $interface] + if {[llength $entry] == 0} { + error "No interface matching '$interface'." + } + + array set result [IP_ADAPTER_ADDRESSES $entry] + if {$opts(-all) || $opts(-dhcpenabled)} { + set result(-dhcpenabled) [expr {($result(-flags) & 0x4) != 0}] + } + # Note even if -all is specified, we still loop through because + # the fields of IP_ADAPTER_ADDRESSES are a superset of options + foreach opt [IP_ADAPTER_ADDRESSES] { + # Select only those fields that have an option defined + # and that option is selected + if {!([info exists opts($opt)] && ($opts(-all) || $opts($opt)))} { + unset result($opt) + } + } + if {[info exists result(-physicaladdress)]} { + set result(-physicaladdress) [_hwaddr_binary_to_string $result(-physicaladdress)] + } + if {[info exists result(-unicastaddresses)]} { + set result(-unicastaddresses) [ntwine [IP_ADAPTER_UNICAST_ADDRESS] $result(-unicastaddresses)] + } + if {[info exists result(-multicastaddresses)]} { + set result(-multicastaddresses) [ntwine [IP_ADAPTER_MULTICAST_ADDRESS] $result(-multicastaddresses)] + } + if {[info exists result(-anycastaddresses)]} { + set result(-anycastaddresses) [ntwine [IP_ADAPTER_ANYCAST_ADDRESS] $result(-anycastaddresses)] + } + if {[info exists result(-dnsservers)]} { + set result(-dnsservers) [ntwine [IP_ADAPTER_DNS_SERVER_ADDRESS] $result(-dnsservers)] + } + + return [array get result] +} + +# Get the address->h/w address table +proc twapi::get_arp_table {args} { + array set opts [parseargs args { + sort + }] + + set arps [list ] + + foreach arp [GetIpNetTable $opts(sort)] { + lassign $arp ifindex hwaddr ipaddr type + # Token for enry 0 1 2 3 4 + set type [lindex {other other invalid dynamic static} $type] + if {$type == ""} { + set type other + } + lappend arps [list $ifindex [_hwaddr_binary_to_string $hwaddr] $ipaddr $type] + } + return [list [list ifindex hwaddr ipaddr type] $arps] +} + +# Return IP address for a hw address +proc twapi::ipaddr_to_hwaddr {ipaddr {varname ""}} { + if {![Twapi_IPAddressFamily $ipaddr]} { + error "$ipaddr is not a valid IP V4 address" + } + + foreach arp [GetIpNetTable 0] { + if {[lindex $arp 3] == 2} continue; # Invalid entry type + if {[string equal $ipaddr [lindex $arp 2]]} { + set result [_hwaddr_binary_to_string [lindex $arp 1]] + break + } + } + + # If could not get from ARP table, see if it is one of our own + # Ignore errors + if {![info exists result]} { + foreach ifc [get_network_adapters] { + catch { + array set netifinfo [get_network_adapter_info $ifc -unicastaddresses -physicaladdress] + if {$netifinfo(-physicaladdress) eq ""} continue + foreach elem $netifinfo(-unicastaddresses) { + if {[dict get $elem -address] eq $ipaddr} { + set result $netifinfo(-physicaladdress) + break + } + } + } + if {[info exists result]} { + break + } + } + } + + if {[info exists result]} { + if {$varname == ""} { + return $result + } + upvar $varname var + set var $result + return 1 + } else { + if {$varname == ""} { + error "Could not map IP address $ipaddr to a hardware address" + } + return 0 + } +} + +# Return hw address for a IP address +proc twapi::hwaddr_to_ipaddr {hwaddr {varname ""}} { + set hwaddr [string map {- "" : ""} $hwaddr] + foreach arp [GetIpNetTable 0] { + if {[lindex $arp 3] == 2} continue; # Invalid entry type + if {[string equal $hwaddr [_hwaddr_binary_to_string [lindex $arp 1] ""]]} { + set result [lindex $arp 2] + break + } + } + + # If could not get from ARP table, see if it is one of our own + # Ignore errors + if {![info exists result]} { + foreach ifc [get_network_adapters] { + catch { + array set netifinfo [get_network_adapter_info $ifc -unicastaddresses -physicaladdress] + if {$netifinfo(-physicaladdress) eq ""} continue + set ifhwaddr [string map {- ""} $netifinfo(-physicaladdress)] + if {[string equal -nocase $hwaddr $ifhwaddr]} { + foreach elem $netifinfo(-unicastaddresses) { + if {[dict get $elem -address] ne ""} { + set result [dict get $elem -address] + break + } + } + } + } + if {[info exists result]} { + break + } + } + } + + if {[info exists result]} { + if {$varname == ""} { + return $result + } + upvar $varname var + set var $result + return 1 + } else { + if {$varname == ""} { + error "Could not map hardware address $hwaddr to an IP address" + } + return 0 + } +} + +# Flush the arp table for a given interface +proc twapi::flush_arp_tables {args} { + if {[llength $args] == 0} { + set args [get_network_adapters] + } + foreach arg $args { + array set ifc [get_network_adapter_info $arg -type -ipv4ifindex] + if {$ifc(-type) != 24} { + trap { + FlushIpNetTable $ifc(-ipv4ifindex) + } onerror {} { + # Ignore - flush not supported for that interface type + } + } + } +} + +# Return the list of TCP connections +twapi::proc* twapi::get_tcp_connections {args} { + variable tcp_statenames + variable tcp_statevalues + + array set tcp_statevalues { + closed 1 + listen 2 + syn_sent 3 + syn_rcvd 4 + estab 5 + fin_wait1 6 + fin_wait2 7 + close_wait 8 + closing 9 + last_ack 10 + time_wait 11 + delete_tcb 12 + } + foreach {name val} [array get tcp_statevalues] { + set tcp_statenames($val) $name + } +} { + variable tcp_statenames + variable tcp_statevalues + + array set opts [parseargs args { + state + {ipversion.arg 0} + localaddr + remoteaddr + localport + remoteport + pid + modulename + modulepath + bindtime + all + matchstate.arg + matchlocaladdr.arg + matchremoteaddr.arg + matchlocalport.int + matchremoteport.int + matchpid.int + } -maxleftover 0] + + set opts(ipversion) [_ipversion_to_af $opts(ipversion)] + + if {! ($opts(state) || $opts(localaddr) || $opts(remoteaddr) || $opts(localport) || $opts(remoteport) || $opts(pid) || $opts(modulename) || $opts(modulepath) || $opts(bindtime))} { + set opts(all) 1 + } + + # Convert state to appropriate symbol if necessary + if {[info exists opts(matchstate)]} { + set matchstates [list ] + foreach stateval $opts(matchstate) { + if {[info exists tcp_statevalues($stateval)]} { + lappend matchstates $stateval + continue + } + if {[info exists tcp_statenames($stateval)]} { + lappend matchstates $tcp_statenames($stateval) + continue + } + error "Unrecognized connection state '$stateval' specified for option -matchstate" + } + } + + foreach opt {matchlocaladdr matchremoteaddr} { + if {[info exists opts($opt)]} { + # Note this also normalizes the address format + set $opt [_hosts_to_ip_addrs $opts($opt)] + if {[llength [set $opt]] == 0} { + return [list ]; # No addresses, so no connections will match + } + } + } + + # Get the complete list of connections + if {$opts(modulename) || $opts(modulepath) || $opts(bindtime) || $opts(all)} { + set level 8 + } else { + set level 5 + } + + # See if any matching needs to be done + if {[info exists opts(matchlocaladdr)] || [info exists opts(matchlocalport)] || + [info exist opts(matchremoteaddr)] || [info exists opts(matchremoteport)] || + [info exists opts(matchpid)] || [info exists opts(matchstate)]} { + set need_matching 1 + } else { + set need_matching 0 + } + + + set conns [list ] + foreach entry [_get_all_tcp 0 $level $opts(ipversion)] { + lassign $entry state localaddr localport remoteaddr remoteport pid bindtime modulename modulepath + + if {[string equal $remoteaddr 0.0.0.0]} { + # Socket not connected. WIndows passes some random value + # for remote port in this case. Set it to 0 + set remoteport 0 + } + + if {[info exists tcp_statenames($state)]} { + set state $tcp_statenames($state) + } + if {$need_matching} { + if {[info exists opts(matchpid)]} { + # See if this platform even returns the PID + if {$pid == ""} { + error "Connection process id not available on this system." + } + if {$pid != $opts(matchpid)} { + continue + } + } + if {[info exists matchlocaladdr] && + [lsearch -exact $matchlocaladdr $localaddr] < 0} { + # Not in match list + continue + } + if {[info exists matchremoteaddr] && + [lsearch -exact $matchremoteaddr $remoteaddr] < 0} { + # Not in match list + continue + } + if {[info exists opts(matchlocalport)] && + $opts(matchlocalport) != $localport} { + continue + } + if {[info exists opts(matchremoteport)] && + $opts(matchremoteport) != $remoteport} { + continue + } + if {[info exists matchstates] && [lsearch -exact $matchstates $state] < 0} { + continue + } + } + + # OK, now we have matched. Include specified fields in the result + set conn [list ] + foreach opt {localaddr localport remoteaddr remoteport state pid bindtime modulename modulepath} { + if {$opts(all) || $opts($opt)} { + lappend conn [set $opt] + } + } + lappend conns $conn + } + + # ORDER MUST MATCH ORDER ABOVE + set fields [list ] + foreach opt {localaddr localport remoteaddr remoteport state pid bindtime modulename modulepath} { + if {$opts(all) || $opts($opt)} { + lappend fields -$opt + } + } + + return [list $fields $conns] +} + + +# Return the list of UDP connections +proc twapi::get_udp_connections {args} { + array set opts [parseargs args { + {ipversion.arg 0} + localaddr + localport + pid + modulename + modulepath + bindtime + all + matchlocaladdr.arg + matchlocalport.int + matchpid.int + } -maxleftover 0] + + set opts(ipversion) [_ipversion_to_af $opts(ipversion)] + + if {! ($opts(localaddr) || $opts(localport) || $opts(pid) || $opts(modulename) || $opts(modulepath) || $opts(bindtime))} { + set opts(all) 1 + } + + if {[info exists opts(matchlocaladdr)]} { + # Note this also normalizes the address format + set matchlocaladdr [_hosts_to_ip_addrs $opts(matchlocaladdr)] + if {[llength $matchlocaladdr] == 0} { + return [list ]; # No addresses, so no connections will match + } + } + + # Get the complete list of connections + # Get the complete list of connections + if {$opts(modulename) || $opts(modulepath) || $opts(bindtime) || $opts(all)} { + set level 2 + } else { + set level 1 + } + set conns [list ] + foreach entry [_get_all_udp 0 $level $opts(ipversion)] { + foreach {localaddr localport pid bindtime modulename modulepath} $entry { + break + } + if {[info exists opts(matchpid)]} { + # See if this platform even returns the PID + if {$pid == ""} { + error "Connection process id not available on this system." + } + if {$pid != $opts(matchpid)} { + continue + } + } + if {[info exists matchlocaladdr] && + [lsearch -exact $matchlocaladdr $localaddr] < 0} { + continue + } + if {[info exists opts(matchlocalport)] && + $opts(matchlocalport) != $localport} { + continue + } + + # OK, now we have matched. Include specified fields in the result + set conn [list ] + foreach opt {localaddr localport pid bindtime modulename modulepath} { + if {$opts(all) || $opts($opt)} { + lappend conn [set $opt] + } + } + lappend conns $conn + } + + # ORDER MUST MATCH THAT ABOVE + set fields [list ] + foreach opt {localaddr localport pid bindtime modulename modulepath} { + if {$opts(all) || $opts($opt)} { + lappend fields -$opt + } + } + + return [list $fields $conns] +} + +# Terminates a TCP connection. Does not generate an error if connection +# does not exist +proc twapi::terminate_tcp_connections {args} { + array set opts [parseargs args { + matchstate.arg + matchlocaladdr.arg + matchremoteaddr.arg + matchlocalport.int + matchremoteport.int + matchpid.int + } -maxleftover 0] + + # TBD - ignore 'no such connection' errors + + # If local and remote endpoints fully specified, just directly call + # SetTcpEntry. Note pid must NOT be specified since we must then + # fall through and check for that pid + if {[info exists opts(matchlocaladdr)] && [info exists opts(matchlocalport)] && + [info exists opts(matchremoteaddr)] && [info exists opts(matchremoteport)] && + ! [info exists opts(matchpid)]} { + # 12 is "delete" code + catch { + SetTcpEntry [list 12 $opts(matchlocaladdr) $opts(matchlocalport) $opts(matchremoteaddr) $opts(matchremoteport)] + } + return + } + + # Get connection list and go through matching on each + # TBD - optimize by precalculating if *ANY* matching is to be done + # and if not, skip the whole matching sequence + foreach conn [twapi::recordarray getlist [get_tcp_connections {*}[_get_array_as_options opts]] -format dict] { + array set aconn $conn + # TBD - should we handle integer values of opts(state) ? + if {[info exists opts(matchstate)] && + $opts(matchstate) != $aconn(-state)} { + continue + } + if {[info exists opts(matchlocaladdr)] && + $opts(matchlocaladdr) != $aconn(-localaddr)} { + continue + } + if {[info exists opts(matchlocalport)] && + $opts(matchlocalport) != $aconn(-localport)} { + continue + } + if {[info exists opts(matchremoteaddr)] && + $opts(matchremoteaddr) != $aconn(-remoteaddr)} { + continue + } + if {[info exists opts(remoteport)] && + $opts(matchremoteport) != $aconn(-remoteport)} { + continue + } + if {[info exists opts(matchpid)] && + $opts(matchpid) != $aconn(-pid)} { + continue + } + # Matching conditions fulfilled + # 12 is "delete" code + catch { + SetTcpEntry [list 12 $aconn(-localaddr) $aconn(-localport) $aconn(-remoteaddr) $aconn(-remoteport)] + } + } + return +} + +# Flush cache of host names and ports. +# Backward compatibility - no op since we no longer have a cache +proc twapi::flush_network_name_cache {} {} + +# IP addr -> hostname +proc twapi::resolve_address {addr args} { + + # flushcache is ignored (for backward compatibility only) + array set opts [parseargs args { + flushcache + async.arg + } -maxleftover 0] + + # Note as a special case, we treat 0.0.0.0 explicitly since + # win32 getnameinfo translates this to the local host name which + # is completely bogus. + if {$addr eq "0.0.0.0"} { + if {[info exists opts(async)]} { + after idle [list after 0 $opts(async) [list $addr success $addr]] + return "" + } else { + return $addr + } + } + + # If async option, we will call back our internal function which + # will update the cache and then invoke the caller's script + if {[info exists opts(async)]} { + variable _address_handler_scripts + set id [Twapi_ResolveAddressAsync $addr] + set _address_handler_scripts($id) [list $addr $opts(async)] + return "" + } + + # Synchronous + set name [lindex [twapi::getnameinfo [list $addr] 8] 0] + if {$name eq $addr} { + # Could not resolve. + set name "" + } + + return $name +} + +# host name -> IP addresses +proc twapi::resolve_hostname {name args} { + set name [string tolower $name] + + # -flushcache option ignored (for backward compat only) + array set opts [parseargs args { + flushcache + async.arg + {ipversion.arg 0} + } -maxleftover 0] + + # NOTE: we do not pass the IP version to getaddrinfo but always + # give it 0 and then filter the results based on IP version ourselves + # if necessary. This is because of some confusion over behaviour + # with various combination of flags. + + set opts(ipversion) [_ipversion_to_af $opts(ipversion)] + set flags 0 + if {[min_os_version 6]} { + # 0x100 -> AI_ALL. By default, Windows enables the AI_ADDRCONFIG + # flat which will hide IPv6 addresses if the local system does + # not have an *global* IPv6 addr configured. We don't want that + # so set AI_ALL to override it and get back all addresses. + set flags 0x100; # AI_ALL + } + + # If async option, we will call back our internal function which + # will update the cache and then invoke the caller's script + if {[info exists opts(async)]} { + variable _hostname_handler_scripts + set id [Twapi_ResolveHostnameAsync $name 0 $flags] + set _hostname_handler_scripts($id) [list $opts(ipversion) $name $opts(async)] + return "" + } + + # Resolve address synchronously + set addrs [list ] + trap { + foreach endpt [twapi::getaddrinfo $name 0 0 0 0 $flags] { + # endpt is {family address port} + if {$opts(ipversion) == 0 || $opts(ipversion) == [lindex $endpt 0]} { + lappend addrs [lindex $endpt 1] + } + } + } onerror {TWAPI_WIN32 11001} { + # Ignore - 11001 -> no such host, so just return empty list + } onerror {TWAPI_WIN32 11002} { + # Ignore - 11002 -> no such host, non-authoritative + } onerror {TWAPI_WIN32 11003} { + # Ignore - 11001 -> no such host, non recoverable + } onerror {TWAPI_WIN32 11004} { + # Ignore - 11004 -> no such host, though valid syntax + } + + return $addrs +} + +# Look up a port name +proc twapi::port_to_service {port} { + set name "" + trap { + set name [lindex [twapi::getnameinfo [list 0.0.0.0 $port] 2] 1] + if {[string is integer $name] && $name == $port} { + # Some platforms return the port itself if no name exists + set name "" + } + } onerror {TWAPI_WIN32 11001} { + # Ignore - 11001 -> no such host, so just return empty list + } onerror {TWAPI_WIN32 11002} { + # Ignore - 11002 -> no such host, non-authoritative + } onerror {TWAPI_WIN32 11003} { + # Ignore - 11001 -> no such host, non recoverable + } onerror {TWAPI_WIN32 11004} { + # Ignore - 11004 -> no such host, though valid syntax + } + + # If we did not get a name back, check for some well known names + # that windows does not translate. Note some of these are names + # that windows does translate in the reverse direction! + if {$name eq ""} { + foreach {p n} { + 123 ntp + 137 netbios-ns + 138 netbios-dgm + 500 isakmp + 1900 ssdp + 4500 ipsec-nat-t + } { + if {$port == $p} { + set name $n + break + } + } + } + + return $name +} + + +# Port name -> number +proc twapi::service_to_port {name} { + + # TBD - add option for specifying protocol + set protocol 0 + + if {[string is integer $name]} { + return $name + } + + if {[catch { + # Return the first port + set port [lindex [lindex [twapi::getaddrinfo "" $name $protocol] 0] 2] + }]} { + set port "" + } + return $port +} + +# Get the routing table +proc twapi::get_routing_table {args} { + array set opts [parseargs args { + sort + } -maxleftover 0] + + set routes [list ] + foreach route [twapi::GetIpForwardTable $opts(sort)] { + lappend routes [_format_route $route] + } + + return $routes +} + +# Get the best route for given destination +proc twapi::get_route {args} { + array set opts [parseargs args { + {dest.arg 0.0.0.0} + {source.arg 0.0.0.0} + } -maxleftover 0] + return [_format_route [GetBestRoute $opts(dest) $opts(source)]] +} + +# Get the interface for a destination +proc twapi::get_outgoing_interface {{dest 0.0.0.0}} { + return [GetBestInterfaceEx $dest] +} + +proc twapi::get_ipaddr_version {addr} { + set af [Twapi_IPAddressFamily $addr] + if {$af == 2} { + return 4 + } elseif {$af == 23} { + return 6 + } else { + return 0 + } +} + +################################################################ +# Utility procs + +# Convert a route as returned by C code to Tcl format route +proc twapi::_format_route {route} { + foreach fld { + addr + mask + policy + nexthop + ifindex + type + protocol + age + nexthopas + metric1 + metric2 + metric3 + metric4 + metric5 + } val $route { + set r(-$fld) $val + } + + switch -exact -- $r(-type) { + 2 { set r(-type) invalid } + 3 { set r(-type) local } + 4 { set r(-type) remote } + 1 - + default { set r(-type) other } + } + + switch -exact -- $r(-protocol) { + 2 { set r(-protocol) local } + 3 { set r(-protocol) netmgmt } + 4 { set r(-protocol) icmp } + 5 { set r(-protocol) egp } + 6 { set r(-protocol) ggp } + 7 { set r(-protocol) hello } + 8 { set r(-protocol) rip } + 9 { set r(-protocol) is_is } + 10 { set r(-protocol) es_is } + 11 { set r(-protocol) cisco } + 12 { set r(-protocol) bbn } + 13 { set r(-protocol) ospf } + 14 { set r(-protocol) bgp } + 1 - + default { set r(-protocol) other } + } + + return [array get r] +} + + +# Convert binary hardware address to string format +proc twapi::_hwaddr_binary_to_string {b {joiner -}} { + if {[binary scan $b H* str]} { + set s "" + foreach {x y} [split $str ""] { + lappend s $x$y + } + return [join $s $joiner] + } else { + error "Could not convert binary hardware address" + } +} + +# Callback for address resolution +proc twapi::_address_resolve_handler {id status hostname} { + variable _address_handler_scripts + + if {![info exists _address_handler_scripts($id)]} { + # Queue a background error + after 0 [list error "Error: No entry found for id $id in address request table"] + return + } + lassign $_address_handler_scripts($id) addr script + unset _address_handler_scripts($id) + + # Before invoking the callback, store result if available + uplevel #0 [linsert $script end $addr $status $hostname] + return +} + +# Callback for hostname resolution +proc twapi::_hostname_resolve_handler {id status addrandports} { + variable _hostname_handler_scripts + + if {![info exists _hostname_handler_scripts($id)]} { + # Queue a background error + after 0 [list error "Error: No entry found for id $id in hostname request table"] + return + } + lassign $_hostname_handler_scripts($id) ipver name script + unset _hostname_handler_scripts($id) + + set addrs {} + if {$status eq "success"} { + foreach addr $addrandports { + lassign $addr ver addr + if {$ipver == 0 || $ipver == $ver} { + lappend addrs $addr + } + } + } elseif {$addrandports == 11001 || $addrandports == 11004} { + # For compatibility with the sync version and address resolution, + # We return an success if empty list if in fact the failure was + # that no name->address mapping exists + set status success + } + + uplevel #0 [linsert $script end $name $status $addrs] + return +} + +# Return list of all TCP connections +# Uses GetExtendedTcpTable if available, else AllocateAndGetTcpExTableFromStack +# $level is passed to GetExtendedTcpTable and dtermines format of returned +# data. Level 5 (default) matches what AllocateAndGetTcpExTableFromStack +# returns. Note level 6 and higher is two orders of magnitude more expensive +# to get for IPv4 and crashes in Windows for IPv6 (silently downgraded to +# level 5 for IPv6) +twapi::proc* twapi::_get_all_tcp {sort level address_family} { + variable _tcp_buf + set _tcp_buf(ptr) NULL + set _tcp_buf(size) 0 +} { + variable _tcp_buf + + if {$address_family == 0} { + return [concat [_get_all_tcp $sort $level 2] [_get_all_tcp $sort $level 23]] + } + + if {$address_family == 23 && $level > 5} { + set level 5; # IPv6 crashes for levels > 5 - Windows bug + } + + # Get required size of buffer. This also verifies that the + # GetExtendedTcpTable API exists on this system + # TBD - modify to do this check only once and not on every call + + if {[catch {twapi::GetExtendedTcpTable $_tcp_buf(ptr) $_tcp_buf(size) $sort $address_family $level} bufsz]} { + # No workee, try AllocateAndGetTcpExTableFromStack + # Note if GetExtendedTcpTable is not present, ipv6 is not + # available + if {$address_family == 2} { + return [AllocateAndGetTcpExTableFromStack $sort 0] + } else { + return {} + } + } + + # The required buffer size might change as connections + # are added or deleted. So we sit in a loop. + # Non-0 value indicates buffer was not large enough + # For safety, we only retry 10 times + set i 0 + while {$bufsz && [incr i] <= 10} { + if {! [pointer_null? $_tcp_buf(ptr)]} { + free $_tcp_buf(ptr) + set _tcp_buf(ptr) NULL + set _tcp_buf(size) 0 + } + + set _tcp_buf(ptr) [malloc $bufsz] + set _tcp_buf(size) $bufsz + + set bufsz [GetExtendedTcpTable $_tcp_buf(ptr) $_tcp_buf(size) $sort $address_family $level] + } + + if ($bufsz) { + # Repeated attempts failed + win32_error 122 + } + + return [Twapi_FormatExtendedTcpTable $_tcp_buf(ptr) $address_family $level] +} + +# See comments for _get_all_tcp above except this is for _get_all_udp +twapi::proc* twapi::_get_all_udp {sort level address_family} { + variable _udp_buf + set _udp_buf(ptr) NULL + set _udp_buf(size) 0 +} { + variable _udp_buf + + if {$address_family == 0} { + return [concat [_get_all_udp $sort $level 2] [_get_all_udp $sort $level 23]] + } + + if {$address_family == 23 && $level > 5} { + set level 5; # IPv6 crashes for levels > 5 - Windows bug + } + + # Get required size of buffer. This also verifies that the + # GetExtendedTcpTable API exists on this system + if {[catch {twapi::GetExtendedUdpTable $_udp_buf(ptr) $_udp_buf(size) $sort $address_family $level} bufsz]} { + # No workee, try AllocateAndGetUdpExTableFromStack + if {$address_family == 2} { + return [AllocateAndGetUdpExTableFromStack $sort 0] + } else { + return {} + } + } + + # The required buffer size might change as connections + # are added or deleted. So we sit in a loop. + # Non-0 value indicates buffer was not large enough + # For safety, we only retry 10 times + set i 0 + while {$bufsz && [incr i] <= 10} { + if {! [pointer_null? $_udp_buf(ptr)]} { + free $_udp_buf(ptr) + set _udp_buf(ptr) NULL + set _udp_buf(size) 0 + } + + set _udp_buf(ptr) [malloc $bufsz] + set _udp_buf(size) $bufsz + + set bufsz [GetExtendedUdpTable $_udp_buf(ptr) $_udp_buf(size) $sort $address_family $level] + } + + if ($bufsz) { + # Repeated attempts failed + win32_error 122 + } + + return [Twapi_FormatExtendedUdpTable $_udp_buf(ptr) $address_family $level] +} + + +# valid IP address +proc twapi::_valid_ipaddr_format {ipaddr} { + return [expr {[Twapi_IPAddressFamily $ipaddr] != 0}] +} + +# Given lists of IP addresses and DNS names, returns +# a list purely of IP addresses in normalized form +proc twapi::_hosts_to_ip_addrs hosts { + set addrs [list ] + foreach host $hosts { + if {[_valid_ipaddr_format $host]} { + lappend addrs [Twapi_NormalizeIPAddress $host] + } else { + # Not IP address. Try to resolve, ignoring errors + if {![catch {resolve_hostname $host} hostaddrs]} { + foreach addr $hostaddrs { + lappend addrs [Twapi_NormalizeIPAddress $addr] + } + } + } + } + return $addrs +} + +proc twapi::_ipversion_to_af {opt} { + if {[string is integer -strict $opt]} { + incr opt 0; # Normalize ints for switch + } + switch -exact -- [string tolower $opt] { + 4 - + inet { return 2 } + 6 - + inet6 { return 23 } + 0 - + any - + all { return 0 } + } + error "Invalid IP version '$opt'" +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/nls.tcl b/src/punk86.vfs/lib/twapi4.7.2/nls.tcl new file mode 100644 index 00000000..66b51db9 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/nls.tcl @@ -0,0 +1,467 @@ +# +# Copyright (c) 2003-2013, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi {} + +# Compatibility alias +interp alias {} twapi::get_user_default_langid {} twapi::get_user_langid +interp alias {} twapi::get_system_default_langid {} twapi::get_system_langid + +# +# Format a number +proc twapi::format_number {number lcid args} { + + set number [_verify_number_format $number] + + set lcid [_map_default_lcid_token $lcid] + + # If no options specified, format according to the passed locale + if {[llength $args] == 0} { + return [GetNumberFormat 1 $lcid 0 $number 0 0 0 . "" 0] + } + + array set opts [parseargs args { + idigits.int + ilzero.bool + sgrouping.int + sdecimal.arg + sthousand.arg + inegnumber.int + }] + + # Check the locale for unspecified options + foreach opt {idigits ilzero sgrouping sdecimal sthousand inegnumber} { + if {![info exists opts($opt)]} { + set opts($opt) [lindex [get_locale_info $lcid -$opt] 1] + } + } + + # If number of decimals is -1, see how many decimal places + # in passed string + if {$opts(idigits) == -1} { + lassign [split $number .] whole frac + set opts(idigits) [string length $frac] + } + + # Convert Locale format for grouping to integer calue + if {![string is integer $opts(sgrouping)]} { + # Format assumed to be of the form "N;M;....;0" + set grouping 0 + foreach n [split $opts(sgrouping) {;}] { + if {$n == 0} break + set grouping [expr {$n + 10*$grouping}] + } + set opts(sgrouping) $grouping + } + + set flags 0 + if {[info exists opts(nouseroverride)] && $opts(nouseroverride)} { + setbits flags 0x80000000 + } + return [GetNumberFormat 0 $lcid $flags $number $opts(idigits) \ + $opts(ilzero) $opts(sgrouping) $opts(sdecimal) \ + $opts(sthousand) $opts(inegnumber)] +} + + +# +# Format currency +proc twapi::format_currency {number lcid args} { + + set number [_verify_number_format $number] + + # Get semi-canonical form (get rid of preceding "+" etc.) + # Also verifies number syntax + set number [expr {$number+0}]; + + set lcid [_map_default_lcid_token $lcid] + + # If no options specified, format according to the passed locale + if {[llength $args] == 0} { + return [GetCurrencyFormat 1 $lcid 0 $number 0 0 0 . "" 0 0 ""] + } + + array set opts [parseargs args { + idigits.int + ilzero.bool + sgrouping.int + sdecimal.arg + sthousand.arg + inegcurr.int + icurrency.int + scurrency.arg + }] + + # Check the locale for unspecified options + foreach opt {idigits ilzero sgrouping sdecimal sthousand inegcurr icurrency scurrency} { + if {![info exists opts($opt)]} { + set opts($opt) [lindex [get_locale_info $lcid -$opt] 1] + } + } + + # If number of decimals is -1, see how many decimal places + # in passed string + if {$opts(idigits) == -1} { + lassign [split $number .] whole frac + set opts(idigits) [string length $frac] + } + + # Convert Locale format for grouping to integer calue + if {![string is integer $opts(sgrouping)]} { + # Format assumed to be of the form "N;M;....;0" + set grouping 0 + foreach n [split $opts(sgrouping) {;}] { + if {$n == 0} break + set grouping [expr {$n + 10*$grouping}] + } + set opts(sgrouping) $grouping + } + + set flags 0 + if {[info exists opts(nouseroverride)] && $opts(nouseroverride)} { + setbits flags 0x80000000 + } + + return [GetCurrencyFormat 0 $lcid $flags $number $opts(idigits) \ + $opts(ilzero) $opts(sgrouping) $opts(sdecimal) \ + $opts(sthousand) $opts(inegcurr) \ + $opts(icurrency) $opts(scurrency)] +} + + +# +# Get various info about a locale +proc twapi::get_locale_info {lcid args} { + + set lcid [_map_default_lcid_token $lcid] + + variable locale_info_class_map + if {![info exists locale_info_class_map]} { + # TBD - ilanguage not recommended for Vista. Remove it? + array set locale_info_class_map { + ilanguage 0x00000001 + slanguage 0x00000002 + senglanguage 0x00001001 + sabbrevlangname 0x00000003 + snativelangname 0x00000004 + icountry 0x00000005 + scountry 0x00000006 + sengcountry 0x00001002 + sabbrevctryname 0x00000007 + snativectryname 0x00000008 + idefaultlanguage 0x00000009 + idefaultcountry 0x0000000A + idefaultcodepage 0x0000000B + idefaultansicodepage 0x00001004 + idefaultmaccodepage 0x00001011 + slist 0x0000000C + imeasure 0x0000000D + sdecimal 0x0000000E + sthousand 0x0000000F + sgrouping 0x00000010 + idigits 0x00000011 + ilzero 0x00000012 + inegnumber 0x00001010 + snativedigits 0x00000013 + scurrency 0x00000014 + sintlsymbol 0x00000015 + smondecimalsep 0x00000016 + smonthousandsep 0x00000017 + smongrouping 0x00000018 + icurrdigits 0x00000019 + iintlcurrdigits 0x0000001A + icurrency 0x0000001B + inegcurr 0x0000001C + sdate 0x0000001D + stime 0x0000001E + sshortdate 0x0000001F + slongdate 0x00000020 + stimeformat 0x00001003 + idate 0x00000021 + ildate 0x00000022 + itime 0x00000023 + itimemarkposn 0x00001005 + icentury 0x00000024 + itlzero 0x00000025 + idaylzero 0x00000026 + imonlzero 0x00000027 + s1159 0x00000028 + s2359 0x00000029 + icalendartype 0x00001009 + ioptionalcalendar 0x0000100B + ifirstdayofweek 0x0000100C + ifirstweekofyear 0x0000100D + sdayname1 0x0000002A + sdayname2 0x0000002B + sdayname3 0x0000002C + sdayname4 0x0000002D + sdayname5 0x0000002E + sdayname6 0x0000002F + sdayname7 0x00000030 + sabbrevdayname1 0x00000031 + sabbrevdayname2 0x00000032 + sabbrevdayname3 0x00000033 + sabbrevdayname4 0x00000034 + sabbrevdayname5 0x00000035 + sabbrevdayname6 0x00000036 + sabbrevdayname7 0x00000037 + smonthname1 0x00000038 + smonthname2 0x00000039 + smonthname3 0x0000003A + smonthname4 0x0000003B + smonthname5 0x0000003C + smonthname6 0x0000003D + smonthname7 0x0000003E + smonthname8 0x0000003F + smonthname9 0x00000040 + smonthname10 0x00000041 + smonthname11 0x00000042 + smonthname12 0x00000043 + smonthname13 0x0000100E + sabbrevmonthname1 0x00000044 + sabbrevmonthname2 0x00000045 + sabbrevmonthname3 0x00000046 + sabbrevmonthname4 0x00000047 + sabbrevmonthname5 0x00000048 + sabbrevmonthname6 0x00000049 + sabbrevmonthname7 0x0000004A + sabbrevmonthname8 0x0000004B + sabbrevmonthname9 0x0000004C + sabbrevmonthname10 0x0000004D + sabbrevmonthname11 0x0000004E + sabbrevmonthname12 0x0000004F + sabbrevmonthname13 0x0000100F + spositivesign 0x00000050 + snegativesign 0x00000051 + ipossignposn 0x00000052 + inegsignposn 0x00000053 + ipossymprecedes 0x00000054 + ipossepbyspace 0x00000055 + inegsymprecedes 0x00000056 + inegsepbyspace 0x00000057 + fontsignature 0x00000058 + siso639langname 0x00000059 + siso3166ctryname 0x0000005A + idefaultebcdiccodepage 0x00001012 + ipapersize 0x0000100A + sengcurrname 0x00001007 + snativecurrname 0x00001008 + syearmonth 0x00001006 + ssortname 0x00001013 + idigitsubstitution 0x00001014 + } + } + + # array set opts [parseargs args [array names locale_info_class_map]] + + set result [list ] + foreach opt $args { + lappend result $opt [GetLocaleInfo $lcid $locale_info_class_map([string range $opt 1 end])] + } + return $result +} + + +proc twapi::map_code_page_to_name {cp} { + set code_page_names { + 0 "System ANSI default" + 1 "System OEM default" + 37 "IBM EBCDIC - U.S./Canada" + 437 "OEM - United States" + 500 "IBM EBCDIC - International" + 708 "Arabic - ASMO 708" + 709 "Arabic - ASMO 449+, BCON V4" + 710 "Arabic - Transparent Arabic" + 720 "Arabic - Transparent ASMO" + 737 "OEM - Greek (formerly 437G)" + 775 "OEM - Baltic" + 850 "OEM - Multilingual Latin I" + 852 "OEM - Latin II" + 855 "OEM - Cyrillic (primarily Russian)" + 857 "OEM - Turkish" + 858 "OEM - Multlingual Latin I + Euro symbol" + 860 "OEM - Portuguese" + 861 "OEM - Icelandic" + 862 "OEM - Hebrew" + 863 "OEM - Canadian-French" + 864 "OEM - Arabic" + 865 "OEM - Nordic" + 866 "OEM - Russian" + 869 "OEM - Modern Greek" + 870 "IBM EBCDIC - Multilingual/ROECE (Latin-2)" + 874 "ANSI/OEM - Thai (same as 28605, ISO 8859-15)" + 875 "IBM EBCDIC - Modern Greek" + 932 "ANSI/OEM - Japanese, Shift-JIS" + 936 "ANSI/OEM - Simplified Chinese (PRC, Singapore)" + 949 "ANSI/OEM - Korean (Unified Hangeul Code)" + 950 "ANSI/OEM - Traditional Chinese (Taiwan; Hong Kong SAR, PRC)" + 1026 "IBM EBCDIC - Turkish (Latin-5)" + 1047 "IBM EBCDIC - Latin 1/Open System" + 1140 "IBM EBCDIC - U.S./Canada (037 + Euro symbol)" + 1141 "IBM EBCDIC - Germany (20273 + Euro symbol)" + 1142 "IBM EBCDIC - Denmark/Norway (20277 + Euro symbol)" + 1143 "IBM EBCDIC - Finland/Sweden (20278 + Euro symbol)" + 1144 "IBM EBCDIC - Italy (20280 + Euro symbol)" + 1145 "IBM EBCDIC - Latin America/Spain (20284 + Euro symbol)" + 1146 "IBM EBCDIC - United Kingdom (20285 + Euro symbol)" + 1147 "IBM EBCDIC - France (20297 + Euro symbol)" + 1148 "IBM EBCDIC - International (500 + Euro symbol)" + 1149 "IBM EBCDIC - Icelandic (20871 + Euro symbol)" + 1200 "Unicode UCS-2 Little-Endian (BMP of ISO 10646)" + 1201 "Unicode UCS-2 Big-Endian" + 1250 "ANSI - Central European" + 1251 "ANSI - Cyrillic" + 1252 "ANSI - Latin I" + 1253 "ANSI - Greek" + 1254 "ANSI - Turkish" + 1255 "ANSI - Hebrew" + 1256 "ANSI - Arabic" + 1257 "ANSI - Baltic" + 1258 "ANSI/OEM - Vietnamese" + 1361 "Korean (Johab)" + 10000 "MAC - Roman" + 10001 "MAC - Japanese" + 10002 "MAC - Traditional Chinese (Big5)" + 10003 "MAC - Korean" + 10004 "MAC - Arabic" + 10005 "MAC - Hebrew" + 10006 "MAC - Greek I" + 10007 "MAC - Cyrillic" + 10008 "MAC - Simplified Chinese (GB 2312)" + 10010 "MAC - Romania" + 10017 "MAC - Ukraine" + 10021 "MAC - Thai" + 10029 "MAC - Latin II" + 10079 "MAC - Icelandic" + 10081 "MAC - Turkish" + 10082 "MAC - Croatia" + 12000 "Unicode UCS-4 Little-Endian" + 12001 "Unicode UCS-4 Big-Endian" + 20000 "CNS - Taiwan" + 20001 "TCA - Taiwan" + 20002 "Eten - Taiwan" + 20003 "IBM5550 - Taiwan" + 20004 "TeleText - Taiwan" + 20005 "Wang - Taiwan" + 20105 "IA5 IRV International Alphabet No. 5 (7-bit)" + 20106 "IA5 German (7-bit)" + 20107 "IA5 Swedish (7-bit)" + 20108 "IA5 Norwegian (7-bit)" + 20127 "US-ASCII (7-bit)" + 20261 "T.61" + 20269 "ISO 6937 Non-Spacing Accent" + 20273 "IBM EBCDIC - Germany" + 20277 "IBM EBCDIC - Denmark/Norway" + 20278 "IBM EBCDIC - Finland/Sweden" + 20280 "IBM EBCDIC - Italy" + 20284 "IBM EBCDIC - Latin America/Spain" + 20285 "IBM EBCDIC - United Kingdom" + 20290 "IBM EBCDIC - Japanese Katakana Extended" + 20297 "IBM EBCDIC - France" + 20420 "IBM EBCDIC - Arabic" + 20423 "IBM EBCDIC - Greek" + 20424 "IBM EBCDIC - Hebrew" + 20833 "IBM EBCDIC - Korean Extended" + 20838 "IBM EBCDIC - Thai" + 20866 "Russian - KOI8-R" + 20871 "IBM EBCDIC - Icelandic" + 20880 "IBM EBCDIC - Cyrillic (Russian)" + 20905 "IBM EBCDIC - Turkish" + 20924 "IBM EBCDIC - Latin-1/Open System (1047 + Euro symbol)" + 20932 "JIS X 0208-1990 & 0121-1990" + 20936 "Simplified Chinese (GB2312)" + 21025 "IBM EBCDIC - Cyrillic (Serbian, Bulgarian)" + 21027 "Extended Alpha Lowercase" + 21866 "Ukrainian (KOI8-U)" + 28591 "ISO 8859-1 Latin I" + 28592 "ISO 8859-2 Central Europe" + 28593 "ISO 8859-3 Latin 3" + 28594 "ISO 8859-4 Baltic" + 28595 "ISO 8859-5 Cyrillic" + 28596 "ISO 8859-6 Arabic" + 28597 "ISO 8859-7 Greek" + 28598 "ISO 8859-8 Hebrew" + 28599 "ISO 8859-9 Latin 5" + 28605 "ISO 8859-15 Latin 9" + 29001 "Europa 3" + 38598 "ISO 8859-8 Hebrew" + 50220 "ISO 2022 Japanese with no halfwidth Katakana" + 50221 "ISO 2022 Japanese with halfwidth Katakana" + 50222 "ISO 2022 Japanese JIS X 0201-1989" + 50225 "ISO 2022 Korean" + 50227 "ISO 2022 Simplified Chinese" + 50229 "ISO 2022 Traditional Chinese" + 50930 "Japanese (Katakana) Extended" + 50931 "US/Canada and Japanese" + 50933 "Korean Extended and Korean" + 50935 "Simplified Chinese Extended and Simplified Chinese" + 50936 "Simplified Chinese" + 50937 "US/Canada and Traditional Chinese" + 50939 "Japanese (Latin) Extended and Japanese" + 51932 "EUC - Japanese" + 51936 "EUC - Simplified Chinese" + 51949 "EUC - Korean" + 51950 "EUC - Traditional Chinese" + 52936 "HZ-GB2312 Simplified Chinese" + 54936 "Windows XP: GB18030 Simplified Chinese (4 Byte)" + 57002 "ISCII Devanagari" + 57003 "ISCII Bengali" + 57004 "ISCII Tamil" + 57005 "ISCII Telugu" + 57006 "ISCII Assamese" + 57007 "ISCII Oriya" + 57008 "ISCII Kannada" + 57009 "ISCII Malayalam" + 57010 "ISCII Gujarati" + 57011 "ISCII Punjabi" + 65000 "Unicode UTF-7" + 65001 "Unicode UTF-8" + } + + # TBD - isn't there a Win32 function to do this ? + set cp [expr {0+$cp}] + if {[dict exists $code_page_names $cp]} { + return [dict get $code_page_names $cp] + } else { + return "Code page $cp" + } +} + +# +# Get the name of a language +interp alias {} twapi::map_langid_to_name {} twapi::VerLanguageName + +# +# Extract language and sublanguage values +proc twapi::extract_primary_langid {langid} { + return [expr {$langid & 0x3ff}] +} +proc twapi::extract_sublanguage_langid {langid} { + return [expr {($langid >> 10) & 0x3f}] +} + +# +# Utility functions + +proc twapi::_map_default_lcid_token {lcid} { + if {$lcid == "systemdefault"} { + return 2048 + } elseif {$lcid == "userdefault"} { + return 1024 + } + return $lcid +} + +proc twapi::_verify_number_format {n} { + set n [string trimleft $n 0] + if {[regexp {^[+-]?[[:digit:]]*(\.)?[[:digit:]]*$} $n]} { + return $n + } else { + error "Invalid numeric format. Must be of a sequence of digits with an optional decimal point and leading plus/minus sign" + } +} + + diff --git a/src/punk86.vfs/lib/twapi4.7.2/os.tcl b/src/punk86.vfs/lib/twapi4.7.2/os.tcl new file mode 100644 index 00000000..87939756 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/os.tcl @@ -0,0 +1,1213 @@ +# +# Copyright (c) 2003-2012, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi {} + +# Returns an keyed list with the following elements: +# os_major_version +# os_minor_version +# os_build_number +# platform - currently always NT +# sp_major_version +# sp_minor_version +# suites - one or more from backoffice, blade, datacenter, enterprise, +# smallbusiness, smallbusiness_restricted, terminal, personal +# system_type - workstation, server +proc twapi::get_os_info {} { + variable _osinfo + + if {[info exists _osinfo]} { + return [array get _osinfo] + } + + array set verinfo [GetVersionEx] + set _osinfo(os_major_version) $verinfo(dwMajorVersion) + set _osinfo(os_minor_version) $verinfo(dwMinorVersion) + set _osinfo(os_build_number) $verinfo(dwBuildNumber) + set _osinfo(platform) "NT" + + set _osinfo(sp_major_version) $verinfo(wServicePackMajor) + set _osinfo(sp_minor_version) $verinfo(wServicePackMinor) + + set _osinfo(suites) [list ] + set suites $verinfo(wSuiteMask) + foreach {suite def} { + backoffice 0x4 blade 0x400 communications 0x8 compute_server 0x4000 + datacenter 0x80 embeddednt 0x40 embedded_restricted 0x800 + enterprise 0x2 personal 0x200 security_appliance 0x1000 + singleuserts 0x100 smallbusiness 0x1 + smallbusiness_restricted 0x20 storage_server 0x2000 + terminal 0x10 wh_server 0x8000 + } { + if {$suites & $def} { + lappend _osinfo(suites) $suite + } + } + + set system_type $verinfo(wProductType) + if {$system_type == 1} { + set _osinfo(system_type) "workstation"; # VER_NT_WORKSTATION + } elseif {$system_type == 3} { + set _osinfo(system_type) "server"; # VER_NT_SERVER + } elseif {$system_type == 2} { + set _osinfo(system_type) "domain_controller"; # VER_NT_DOMAIN_CONTROLLER + } else { + set _osinfo(system_type) "unknown" + } + + return [array get _osinfo] +} + +# Return a text string describing the OS version and options +# If specified, osinfo should be a keyed list containing +# data returned by get_os_info +proc twapi::get_os_description {} { + + array set osinfo [get_os_info] + + # Assume not terminal server + set tserver "" + + # Version + set osversion "$osinfo(os_major_version).$osinfo(os_minor_version)" + + set systype "" + + # Base OS name + switch -exact -- $osversion { + "5.0" { + set osname "Windows 2000" + if {[string equal $osinfo(system_type) "workstation"]} { + set systype "Professional" + } else { + if {"datacenter" in $osinfo(suites)} { + set systype "Datacenter Server" + } elseif {"enterprise" in $osinfo(suites)} { + set systype "Advanced Server" + } else { + set systype "Server" + } + } + } + "5.1" { + set osname "Windows XP" + if {"personal" in $osinfo(suites)} { + set systype "Home Edition" + } else { + set systype "Professional" + } + } + "5.2" { + set osname "Windows Server 2003" + if {[GetSystemMetrics 89]} { + append osname " R2" + } + if {"datacenter" in $osinfo(suites)} { + set systype "Datacenter Edition" + } elseif {"enterprise" in $osinfo(suites)} { + set systype "Enterprise Edition" + } elseif {"blade" in $osinfo(suites)} { + set systype "Web Edition" + } else { + set systype "Standard Edition" + } + } + "6.0" { + set prodtype [GetProductInfo] + if {$osinfo(system_type) eq "workstation"} { + set osname "Windows Vista" + } else { + set osname "Windows Server 2008" + } + } + "6.1" { + set prodtype [GetProductInfo] + if {$osinfo(system_type) eq "workstation"} { + set osname "Windows 7" + } else { + set osname "Windows Server 2008 R2" + } + } + "6.2" { + if {$osinfo(system_type) eq "workstation"} { + # Win8 does not follow the systype table below + switch -exact -- [format %x [GetProductInfo]] { + 3 {set systype ""} + 6 {set systype Pro} + default {set systype Enterprise} + } + set osname "Windows 8" + } else { + set prodtype [GetProductInfo] + + set osname "Windows Server 2012" + } + + } + "6.3" { + if {$osinfo(system_type) eq "workstation"} { + # Win8.1 probably (TBD) does not follow the systype table below + switch -exact -- [format %x [GetProductInfo]] { + 3 {set systype ""} + 6 {set systype Pro} + default {set systype Enterprise} + } + set osname "Windows 8.1" + } else { + set prodtype [GetProductInfo] + set osname "Windows Server 2012 R2" + } + } + default { + # Future release - can't really name, just make something up + catch {set prodtype [GetProductInfo]} + set osname "Windows" + } + } + + if {[info exists prodtype] && $prodtype} { + catch { + set systype [dict get { + 1 "Ultimate" + 2 "Home Basic" + 3 "Home Premium" + 4 "Enterprise" + 5 "Home Basic N" + 6 "Business" + 7 "Standard" + 8 "Datacenter" + 9 "Small Business Server" + a "Enterprise Server" + b "Starter" + c "Datacenter Server Core" + d "Standard Server Core" + e "Enterprise Server Core" + f "Enterprise Server Ia64" + 10 "Business N" + 11 "Web Server" + 12 "HPC Edition" + 13 "Home Server" + 14 "Storage Server Express" + 15 "Storage Server Standard" + 16 "Storage Server Workgroup" + 17 "Storage Server Enterprise" + 18 "Essential Server Solutions" + 19 "Small Business Server Premium" + 1a "Home Premium N" + 1b "Enterprise N" + 1c "Ultimate N" + 1d "Web Server Core" + 1e "Essential Business Server Management Server" + 1f "Essential Business Server Security Server" + 20 "Essential Business Server Messaging Server" + 21 "Server Foundation" + 22 "Home Premium Server" + 23 "Essential Server Solutions without Hyper-V" + 24 "Standard without Hyper-V" + 25 "Datacenter without Hyper-V" + 26 "Enterprise without Hyper-V" + 26 "Enterprise Server V" + 27 "Datacenter Server Core without Hyper-V" + 28 "Standard Core without Hyper-V" + 29 "Enterprise Server Core without Hyper-V" + 2a "Hyper-V Server" + 2b "Storage Express Server Core" + 2c "Storage Standard Server Core" + 2d "Storage Workgroup Server Core" + 2e "Storage Enterprise Server Core" + 2f "Starter N" + 30 "Professional" + 31 "Professional N" + 32 "Small Business Server 2011 Essentials" + 33 "Server For SB Solutions" + 34 "Standard Server Solutions" + 35 "Standard Server Solutions Core" + 36 "Server For SB Solutions EM" + 37 "Server For SB Solutions EM" + 38 "Windows MultiPoint Server" + 39 "Solution Embeddedserver Core" + 3a "Professional Embedded" + 3b "Windows Essential Server Solution Management" + 3c "Windows Essential Server Solution Additional" + 3d "Windows Essential Server Solution SVC" + 3e "Windows Essential Server Solution Additional SVC" + 3f "Small Business Premium Server Core" + 40 "Hyper Core V" + 41 "Embedded" + 42 "Starter E" + 43 "Home Basic E" + 44 "Home Premium E" + 45 "Professional E" + 46 "Enterprise E" + 47 "Ultimate E" + 48 "Enterprise Evaluation" + 4c "Multipoint Standard Server" + 4d "Multipoint Premium Server" + 4f "Standard Evaluation Server" + 50 "Datacenter Evaluation" + 54 "Enterprise N Evaluation" + 55 "Embedded Automotive" + 56 "Embedded Industry A" + 57 "Thin PC" + 58 "Embedded A" + 59 "Embedded Industry" + 5a "Embedded E" + 5b "Embedded Industry E" + 5c "Embedded Industry A E" + 5f "Storage Workgroup Evaluation Server" + 60 "Storage Standard Evaluation Server" + 61 "Core Arm" + 62 "N" + 63 "China" + 64 "Single Language" + 65 "" + 67 "Professional Wmc" + 68 "Mobile Core" + 69 "Embedded Industry Eval" + 6a "Embedded Industry E Eval" + 6b "Embedded Eval" + 6c "Embedded E Eval" + 6d "Core Server" + 6e "Cloud Storage Server" + abcdabcd "unlicensed" + } [format %x $prodtype]] + } + } + + if {"terminal" in $osinfo(suites)} { + set tserver " with Terminal Services" + } + + # Service pack + if {$osinfo(sp_major_version) != 0} { + set spver " Service Pack $osinfo(sp_major_version)" + } else { + set spver "" + } + + if {$systype ne ""} { + return "$osname $systype ${osversion} (Build $osinfo(os_build_number))${spver}${tserver}" + } else { + return "$osname ${osversion} (Build $osinfo(os_build_number))${spver}${tserver}" + } +} + +proc twapi::get_processor_group_config {} { + trap { + set info [GetLogicalProcessorInformationEx 4] + if {[llength $info]} { + set maxgroupcount [lindex $info 0 1 0] + set groups {} + set num -1 + foreach group [lindex $info 0 1 1] { + lappend groups [incr num] [twine {-maxprocessorcount -activeprocessorcount -processormask} $group] + } + } + return [list -maxgroupcount $maxgroupcount -activegroups $groups] + } onerror {TWAPI_WIN32 127} { + # Just try older APIs + set processor_count [lindex [GetSystemInfo] 5] + return [list -maxgroupcount 1 -activegroups [list 0 [list -maxprocessorcount $processor_count -activeprocessorcount $processor_count -processormask [expr {(1 << $processor_count) - 1}]]]] + } + +} + +proc twapi::get_numa_config {} { + trap { + set result {} + foreach rec [GetLogicalProcessorInformationEx 1] { + lappend result [lindex $rec 1 0] [twine {-processormask -group} [lindex $rec 1 1]] + } + return $result + } onerror {TWAPI_WIN32 127} { + # Use older APIs below + } + + # If GetLogicalProcessorInformation is available, records of type "1" + # indicate NUMA information. Use it. + trap { + set result {} + foreach rec [GetLogicalProcessorInformation] { + if {[lindex $rec 1] == 1} { + lappend result [lindex $rec 2] [list -processormask [lindex $rec 0] -group 0] + } + } + return $result + } onerror {TWAPI_WIN32 127} { + # API not present, fake it + } + + return $result +} + +# Returns proc information +# $processor should be processor number or "" for "total" +proc twapi::get_processor_info {processor args} { + + if {![string is integer $processor]} { + error "Invalid processor number \"$processor\". Should be a processor identifier or the empty string to signify all processors" + } + + if {![info exists ::twapi::get_processor_info_base_opts]} { + array set ::twapi::get_processor_info_base_opts { + idletime IdleTime + privilegedtime KernelTime + usertime UserTime + dpctime DpcTime + interrupttime InterruptTime + interrupts InterruptCount + } + } + + set sysinfo_opts { + arch + processorlevel + processorrev + processorname + processormodel + processorspeed + } + + array set opts [parseargs args \ + [concat all \ + [array names ::twapi::get_processor_info_base_opts] \ + $sysinfo_opts] -maxleftover 0] + + # Registry lookup for processor description + # If no processor specified, use 0 under the assumption all processors + # are the same + set reg_hwkey "HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\[expr {$processor == "" ? 0 : $processor}]" + + set results [list ] + + set processordata [Twapi_SystemProcessorTimes] + if {$processor ne ""} { + if {[llength $processordata] <= $processor} { + error "Invalid processor number '$processor'" + } + array set times [lindex $processordata $processor] + foreach {opt field} [array get ::twapi::get_processor_info_base_opts] { + if {$opts(all) || $opts($opt)} { + lappend results -$opt $times($field) + } + } + } else { + # Need information across all processors + foreach instancedata $processordata { + foreach {opt field} [array get ::twapi::get_processor_info_base_opts] { + incr times($field) [kl_get $instancedata $field] + } + foreach {opt field} [array get ::twapi::get_processor_info_base_opts] { + if {$opts(all) || $opts($opt)} { + lappend results -$opt $times($field) + } + } + } + } + + if {$opts(all) || $opts(arch) || $opts(processorlevel) || $opts(processorrev)} { + set sysinfo [GetSystemInfo] + if {$opts(all) || $opts(arch)} { + lappend results -arch [dict* { + 0 intel + 5 arm + 6 ia64 + 9 amd64 + 10 ia32_win64 + 65535 unknown + } [lindex $sysinfo 0]] + } + + if {$opts(all) || $opts(processorlevel)} { + lappend results -processorlevel [lindex $sysinfo 8] + } + + if {$opts(all) || $opts(processorrev)} { + lappend results -processorrev [format %x [lindex $sysinfo 9]] + } + } + + if {$opts(all) || $opts(processorname)} { + if {[catch {registry get $reg_hwkey "ProcessorNameString"} val]} { + set val "unknown" + } + lappend results -processorname $val + } + + if {$opts(all) || $opts(processormodel)} { + if {[catch {registry get $reg_hwkey "Identifier"} val]} { + set val "unknown" + } + lappend results -processormodel $val + } + + if {$opts(all) || $opts(processorspeed)} { + if {[catch {registry get $reg_hwkey "~MHz"} val]} { + set val "unknown" + } + lappend results -processorspeed $val + } + + return $results +} + +# Get mask of active processors +# TBD - handle processor groups +proc twapi::get_active_processor_mask {} { + return [format 0x%x [lindex [GetSystemInfo] 4]] +} + + +# Get number of active processors +proc twapi::get_processor_count {} { + trap { + set info [GetLogicalProcessorInformationEx 4] + if {[llength $info]} { + set count 0 + foreach group [lindex $info 0 1 1] { + incr count [lindex $group 1] + } + } + return $count + } onerror {TWAPI_WIN32 127} { + # GetLogicalProcessorInformationEx call does not exist + # so system does not support processor groups + return [lindex [GetSystemInfo] 5] + } +} + +# Get system memory information +proc twapi::get_memory_info {args} { + array set opts [parseargs args { + all + allocationgranularity + availcommit + availphysical + kernelpaged + kernelnonpaged + minappaddr + maxappaddr + pagesize + peakcommit + physicalmemoryload + processavailcommit + processcommitlimit + processtotalvirtual + processavailvirtual + swapfiles + swapfiledetail + systemcache + totalcommit + totalphysical + usedcommit + } -maxleftover 0] + + + set results [list ] + set mem [GlobalMemoryStatus] + foreach {opt fld} { + physicalmemoryload dwMemoryLoad + totalphysical ullTotalPhys + availphysical ullAvailPhys + processcommitlimit ullTotalPageFile + processavailcommit ullAvailPageFile + processtotalvirtual ullTotalVirtual + processavailvirtual ullAvailVirtual + } { + if {$opts(all) || $opts($opt)} { + lappend results -$opt [kl_get $mem $fld] + } + } + + if {$opts(all) || $opts(swapfiles) || $opts(swapfiledetail)} { + set swapfiles [list ] + set swapdetail [list ] + + foreach item [Twapi_SystemPagefileInformation] { + lassign $item current_size total_used peak_used path + set path [_normalize_path $path] + lappend swapfiles $path + lappend swapdetail $path [list $current_size $total_used $peak_used] + } + if {$opts(all) || $opts(swapfiles)} { + lappend results -swapfiles $swapfiles + } + if {$opts(all) || $opts(swapfiledetail)} { + lappend results -swapfiledetail $swapdetail + } + } + + if {$opts(all) || $opts(allocationgranularity) || + $opts(minappaddr) || $opts(maxappaddr) || $opts(pagesize)} { + set sysinfo [twapi::GetSystemInfo] + foreach {opt fmt index} { + pagesize %u 1 minappaddr 0x%lx 2 maxappaddr 0x%lx 3 allocationgranularity %u 7} { + if {$opts(all) || $opts($opt)} { + lappend results -$opt [format $fmt [lindex $sysinfo $index]] + } + } + } + + # This call is slightly expensive so check if it is really needed + if {$opts(all) || $opts(totalcommit) || $opts(usedcommit) || + $opts(availcommit) || + $opts(kernelpaged) || $opts(kernelnonpaged) + } { + set mem [GetPerformanceInformation] + set page_size [kl_get $mem PageSize] + foreach {opt fld} { + totalcommit CommitLimit + usedcommit CommitTotal + peakcommit CommitPeak + systemcache SystemCache + kernelpaged KernelPaged + kernelnonpaged KernelNonpaged + } { + if {$opts(all) || $opts($opt)} { + lappend results -$opt [expr {[kl_get $mem $fld] * $page_size}] + } + } + if {$opts(all) || $opts(availcommit)} { + lappend results -availcommit [expr {$page_size * ([kl_get $mem CommitLimit]-[kl_get $mem CommitTotal])}] + } + } + + return $results +} + +# Get the netbios name +proc twapi::get_computer_netbios_name {} { + return [GetComputerName] +} + +# Get the computer name +proc twapi::get_computer_name {{typename netbios}} { + if {[string is integer $typename]} { + set type $typename + } else { + set type [lsearch -exact {netbios dnshostname dnsdomain dnsfullyqualified physicalnetbios physicaldnshostname physicaldnsdomain physicaldnsfullyqualified} $typename] + if {$type < 0} { + error "Unknown computer name type '$typename' specified" + } + } + return [GetComputerNameEx $type] +} + +# Suspend system +proc twapi::suspend_system {args} { + array set opts [parseargs args { + {state.arg standby {standby hibernate}} + force.bool + disablewakeevents.bool + } -maxleftover 0 -nulldefault] + + eval_with_privileges { + SetSuspendState [expr {$opts(state) eq "hibernate"}] $opts(force) $opts(disablewakeevents) + } SeShutdownPrivilege +} + +# Shut down the system +proc twapi::shutdown_system {args} { + array set opts [parseargs args { + system.arg + {message.arg "System shutdown has been initiated"} + {timeout.int 60} + force + restart + } -nulldefault] + + eval_with_privileges { + InitiateSystemShutdown $opts(system) $opts(message) \ + $opts(timeout) $opts(force) $opts(restart) + } SeShutdownPrivilege +} + +# Abort a system shutdown +proc twapi::abort_system_shutdown {args} { + array set opts [parseargs args {system.arg} -nulldefault] + eval_with_privileges { + AbortSystemShutdown $opts(system) + } SeShutdownPrivilege +} + +twapi::proc* twapi::get_system_uptime {} { + package require twapi_pdh + variable _system_start_time + set ctr_path [pdh_counter_path System "System Up Time"] + set uptime [pdh_counter_path_value $ctr_path -format double] + set now [clock seconds] + set _system_start_time [expr {$now - round($uptime+0.5)}] +} { + variable _system_start_time + return [expr {[clock seconds] - $_system_start_time}] +} + +proc twapi::get_system_sid {} { + set lsah [get_lsa_policy_handle -access policy_view_local_information] + trap { + return [lindex [LsaQueryInformationPolicy $lsah 5] 1] + } finally { + close_lsa_policy_handle $lsah + } +} + +# Get the primary domain controller +proc twapi::get_primary_domain_controller {args} { + array set opts [parseargs args {system.arg domain.arg} -nulldefault -maxleftover 0] + return [NetGetDCName $opts(system) $opts(domain)] +} + +# Get a domain controller for a domain +proc twapi::find_domain_controller {args} { + array set opts [parseargs args { + system.arg + avoidself.bool + domain.arg + domainguid.arg + site.arg + rediscover.bool + allowstale.bool + require.arg + prefer.arg + justldap.bool + {inputnameformat.arg any {dns flat netbios any}} + {outputnameformat.arg any {dns flat netbios any}} + {outputaddrformat.arg any {ip netbios any}} + getdetails + } -maxleftover 0 -nulldefault] + + + set flags 0 + + if {$opts(outputaddrformat) eq "ip"} { + setbits flags 0x200 + } + + # Set required bits. + foreach req $opts(require) { + if {[string is integer $req]} { + setbits flags $req + } else { + switch -exact -- $req { + directoryservice { setbits flags 0x10 } + globalcatalog { setbits flags 0x40 } + pdc { setbits flags 0x80 } + kdc { setbits flags 0x400 } + timeserver { setbits flags 0x800 } + writable { setbits flags 0x1000 } + default { + error "Invalid token '$req' specified in value for option '-require'" + } + } + } + } + + # Set preferred bits. + foreach req $opts(prefer) { + if {[string is integer $req]} { + setbits flags $req + } else { + switch -exact -- $req { + directoryservice { + # If required flag is already set, don't set this + if {! ($flags & 0x10)} { + setbits flags 0x20 + } + } + timeserver { + # If required flag is already set, don't set this + if {! ($flags & 0x800)} { + setbits flags 0x2000 + } + } + default { + error "Invalid token '$req' specified in value for option '-prefer'" + } + } + } + } + + if {$opts(rediscover)} { + setbits flags 0x1 + } else { + # Only look at this option if rediscover is not set + if {$opts(allowstale)} { + setbits flags 0x100 + } + } + + if {$opts(avoidself)} { + setbits flags 0x4000 + } + + if {$opts(justldap)} { + setbits flags 0x8000 + } + + switch -exact -- $opts(inputnameformat) { + any { } + netbios - + flat { setbits flags 0x10000 } + dns { setbits flags 0x20000 } + default { + error "Invalid value '$opts(inputnameformat)' for option '-inputnameformat'" + } + } + + switch -exact -- $opts(outputnameformat) { + any { } + netbios - + flat { setbits flags 0x80000000 } + dns { setbits flags 0x40000000 } + default { + error "Invalid value '$opts(outputnameformat)' for option '-outputnameformat'" + } + } + + array set dcinfo [DsGetDcName $opts(system) $opts(domain) $opts(domainguid) $opts(site) $flags] + + if {! $opts(getdetails)} { + return $dcinfo(DomainControllerName) + } + + set result [list \ + -dcname $dcinfo(DomainControllerName) \ + -dcaddr [string trimleft $dcinfo(DomainControllerAddress) \\] \ + -domainguid $dcinfo(DomainGuid) \ + -domain $dcinfo(DomainName) \ + -dnsforest $dcinfo(DnsForestName) \ + -dcsite $dcinfo(DcSiteName) \ + -clientsite $dcinfo(ClientSiteName) \ + ] + + + if {$dcinfo(DomainControllerAddressType) == 1} { + lappend result -dcaddrformat ip + } else { + lappend result -dcaddrformat netbios + } + + if {$dcinfo(Flags) & 0x20000000} { + lappend result -dcnameformat dns + } else { + lappend result -dcnameformat netbios + } + + if {$dcinfo(Flags) & 0x40000000} { + lappend result -domainformat dns + } else { + lappend result -domainformat netbios + } + + if {$dcinfo(Flags) & 0x80000000} { + lappend result -dnsforestformat dns + } else { + lappend result -dnsforestformat netbios + } + + set features [list ] + foreach {flag feature} { + 0x1 pdc + 0x4 globalcatalog + 0x8 ldap + 0x10 directoryservice + 0x20 kdc + 0x40 timeserver + 0x80 closest + 0x100 writable + 0x200 goodtimeserver + } { + if {$dcinfo(Flags) & $flag} { + lappend features $feature + } + } + + lappend result -features $features + + return $result +} + +# Get the primary domain info +proc twapi::get_primary_domain_info {args} { + array set opts [parseargs args { + all + name + dnsdomainname + dnsforestname + domainguid + sid + type + } -maxleftover 0] + + set result [list ] + set lsah [get_lsa_policy_handle -access policy_view_local_information] + trap { + lassign [LsaQueryInformationPolicy $lsah 12] name dnsdomainname dnsforestname domainguid sid + if {[string length $sid] == 0} { + set type workgroup + set domainguid "" + } else { + set type domain + } + foreach opt {name dnsdomainname dnsforestname domainguid sid type} { + if {$opts(all) || $opts($opt)} { + lappend result -$opt [set $opt] + } + } + } finally { + close_lsa_policy_handle $lsah + } + + return $result +} + +# Get a element from SystemParametersInfo +proc twapi::get_system_parameters_info {uiaction} { + variable SystemParametersInfo_uiactions_get + # Format of an element is + # uiaction_indexvalue uiparam binaryscanstring malloc_size modifiers + # uiparam may be an int or "sz" in which case the malloc size + # is substituted for it. + # If modifiers contains "cbsize" the first dword is initialized + # with malloc_size + if {![info exists SystemParametersInfo_uiactions_get]} { + array set SystemParametersInfo_uiactions_get { + SPI_GETDESKWALLPAPER {0x0073 2048 unicode 4096} + SPI_GETBEEP {0x0001 0 i 4} + SPI_GETMOUSE {0x0003 0 i3 12} + SPI_GETBORDER {0x0005 0 i 4} + SPI_GETKEYBOARDSPEED {0x000A 0 i 4} + SPI_ICONHORIZONTALSPACING {0x000D 0 i 4} + SPI_GETSCREENSAVETIMEOUT {0x000E 0 i 4} + SPI_GETSCREENSAVEACTIVE {0x0010 0 i 4} + SPI_GETKEYBOARDDELAY {0x0016 0 i 4} + SPI_ICONVERTICALSPACING {0x0018 0 i 4} + SPI_GETICONTITLEWRAP {0x0019 0 i 4} + SPI_GETMENUDROPALIGNMENT {0x001B 0 i 4} + SPI_GETDRAGFULLWINDOWS {0x0026 0 i 4} + SPI_GETNONCLIENTMETRICS {0x0029 sz {i6 i5 cu8 A64 i2 i5 cu8 A64 i2 i5 cu8 A64 i5 cu8 A64 i5 cu8 A64} 500 cbsize} + SPI_GETMINIMIZEDMETRICS {0x002B sz i5 20 cbsize} + SPI_GETWORKAREA {0x0030 0 i4 16} + SPI_GETKEYBOARDPREF {0x0044 0 i 4 } + SPI_GETSCREENREADER {0x0046 0 i 4} + SPI_GETANIMATION {0x0048 sz i2 8 cbsize} + SPI_GETFONTSMOOTHING {0x004A 0 i 4} + SPI_GETLOWPOWERTIMEOUT {0x004F 0 i 4} + SPI_GETPOWEROFFTIMEOUT {0x0050 0 i 4} + SPI_GETLOWPOWERACTIVE {0x0053 0 i 4} + SPI_GETPOWEROFFACTIVE {0x0054 0 i 4} + SPI_GETMOUSETRAILS {0x005E 0 i 4} + SPI_GETSCREENSAVERRUNNING {0x0072 0 i 4} + SPI_GETFILTERKEYS {0x0032 sz i6 24 cbsize} + SPI_GETTOGGLEKEYS {0x0034 sz i2 8 cbsize} + SPI_GETMOUSEKEYS {0x0036 sz i7 28 cbsize} + SPI_GETSHOWSOUNDS {0x0038 0 i 4} + SPI_GETSTICKYKEYS {0x003A sz i2 8 cbsize} + SPI_GETACCESSTIMEOUT {0x003C 12 i3 12 cbsize} + SPI_GETSNAPTODEFBUTTON {0x005F 0 i 4} + SPI_GETMOUSEHOVERWIDTH {0x0062 0 i 4} + SPI_GETMOUSEHOVERHEIGHT {0x0064 0 i 4 } + SPI_GETMOUSEHOVERTIME {0x0066 0 i 4} + SPI_GETWHEELSCROLLLINES {0x0068 0 i 4} + SPI_GETMENUSHOWDELAY {0x006A 0 i 4} + SPI_GETSHOWIMEUI {0x006E 0 i 4} + SPI_GETMOUSESPEED {0x0070 0 i 4} + SPI_GETACTIVEWINDOWTRACKING {0x1000 0 i 4} + SPI_GETMENUANIMATION {0x1002 0 i 4} + SPI_GETCOMBOBOXANIMATION {0x1004 0 i 4} + SPI_GETLISTBOXSMOOTHSCROLLING {0x1006 0 i 4} + SPI_GETGRADIENTCAPTIONS {0x1008 0 i 4} + SPI_GETKEYBOARDCUES {0x100A 0 i 4} + SPI_GETMENUUNDERLINES {0x100A 0 i 4} + SPI_GETACTIVEWNDTRKZORDER {0x100C 0 i 4} + SPI_GETHOTTRACKING {0x100E 0 i 4} + SPI_GETMENUFADE {0x1012 0 i 4} + SPI_GETSELECTIONFADE {0x1014 0 i 4} + SPI_GETTOOLTIPANIMATION {0x1016 0 i 4} + SPI_GETTOOLTIPFADE {0x1018 0 i 4} + SPI_GETCURSORSHADOW {0x101A 0 i 4} + SPI_GETMOUSESONAR {0x101C 0 i 4 } + SPI_GETMOUSECLICKLOCK {0x101E 0 i 4} + SPI_GETMOUSEVANISH {0x1020 0 i 4} + SPI_GETFLATMENU {0x1022 0 i 4} + SPI_GETDROPSHADOW {0x1024 0 i 4} + SPI_GETBLOCKSENDINPUTRESETS {0x1026 0 i 4} + SPI_GETUIEFFECTS {0x103E 0 i 4} + SPI_GETFOREGROUNDLOCKTIMEOUT {0x2000 0 i 4} + SPI_GETACTIVEWNDTRKTIMEOUT {0x2002 0 i 4} + SPI_GETFOREGROUNDFLASHCOUNT {0x2004 0 i 4} + SPI_GETCARETWIDTH {0x2006 0 i 4} + SPI_GETMOUSECLICKLOCKTIME {0x2008 0 i 4} + SPI_GETFONTSMOOTHINGTYPE {0x200A 0 i 4} + SPI_GETFONTSMOOTHINGCONTRAST {0x200C 0 i 4} + SPI_GETFOCUSBORDERWIDTH {0x200E 0 i 4} + SPI_GETFOCUSBORDERHEIGHT {0x2010 0 i 4} + } + if {$::tcl_platform(pointerSize) == 4} { + set hc_struct_size 12 + set bfmt i3 + } else { + set hc_struct_size 16 + set bfmt i4 + } + set SystemParametersInfo_uiactions_get(SPI_GETHIGHCONTRAST) [list 0x0042 sz $bfmt $hc_struct_size cbsize] + } + + set key [string toupper $uiaction] + + # TBD - + # SPI_GETSOUNDSENTRY {0x0040 } + # SPI_GETICONMETRICS {0x002D } + # SPI_GETICONTITLELOGFONT {0x001F } + # SPI_GETDEFAULTINPUTLANG {0x0059 } + # SPI_GETFONTSMOOTHINGORIENTATION {0x2012} + + if {![info exists SystemParametersInfo_uiactions_get($key)]} { + set key SPI_$key + if {![info exists SystemParametersInfo_uiactions_get($key)]} { + error "Unknown SystemParametersInfo index symbol '$uiaction'" + } + } + + lassign $SystemParametersInfo_uiactions_get($key) index uiparam fmt sz modifiers + if {$uiparam eq "sz"} { + set uiparam $sz + } + set mem [malloc $sz] + trap { + if {[lsearch -exact $modifiers cbsize] >= 0} { + # A structure that needs first field set to its size + Twapi_WriteMemory 1 $mem 0 $sz [binary format i $sz] + } + SystemParametersInfo $index $uiparam $mem 0 + if {$fmt eq "unicode"} { + return [Twapi_ReadMemory 3 $mem 0 $sz 1] + } else { + set n [binary scan [Twapi_ReadMemory 1 $mem 0 $sz] $fmt {*}[lrange {val0 val1 val2 val3 val4 val5 val6 val7 val8 val9 val10 val11 val12 val13 val14 val15 val16 val17 val17} 0 [llength $fmt]-1]] + if {$n == 1} { + return $val0 + } else { + set result {} + for {set i 0} {$i < $n} {incr i} { + lappend result {*}[set val$i] + } + return $result + } + } + } finally { + free $mem + } +} + +proc twapi::set_system_parameters_info {uiaction val args} { + variable SystemParametersInfo_uiactions_set + + # Format of an element is + # uiaction_indexvalue uiparam binaryscanstring malloc_size modifiers + # uiparam may be an int or "sz" in which case the malloc size + # is substribnuted for it. + # If modifiers contains "cbsize" the first dword is initialized + # with malloc_size + if {![info exists SystemParametersInfo_uiactions_set]} { + array set SystemParametersInfo_uiactions_set { + SPI_SETBEEP {0x0002 bool} + SPI_SETMOUSE {0x0004 unsupported} + SPI_SETBORDER {0x0006 int} + SPI_SETKEYBOARDSPEED {0x000B int} + SPI_ICONHORIZONTALSPACING {0x000D int} + SPI_SETSCREENSAVETIMEOUT {0x000F int} + SPI_SETSCREENSAVEACTIVE {0x0011 bool} + SPI_SETDESKWALLPAPER {0x0014 unsupported} + SPI_SETDESKPATTERN {0x0015 int} + SPI_SETKEYBOARDDELAY {0x0017 int} + SPI_ICONVERTICALSPACING {0x0018 int} + SPI_SETICONTITLEWRAP {0x001A bool} + SPI_SETMENUDROPALIGNMENT {0x001C bool} + SPI_SETDOUBLECLKWIDTH {0x001D int} + SPI_SETDOUBLECLKHEIGHT {0x001E int} + SPI_SETDOUBLECLICKTIME {0x0020 int} + SPI_SETMOUSEBUTTONSWAP {0x0021 bool} + SPI_SETICONTITLELOGFONT {0x0022 LOGFONT} + SPI_SETDRAGFULLWINDOWS {0x0025 bool} + SPI_SETNONCLIENTMETRICS {0x002A NONCLIENTMETRICS} + SPI_SETMINIMIZEDMETRICS {0x002C MINIMIZEDMETRICS} + SPI_SETICONMETRICS {0x002E ICONMETRICS} + SPI_SETWORKAREA {0x002F RECT} + SPI_SETPENWINDOWS {0x0031} + SPI_SETHIGHCONTRAST {0x0043 HIGHCONTRAST} + SPI_SETKEYBOARDPREF {0x0045 bool} + SPI_SETSCREENREADER {0x0047 bool} + SPI_SETANIMATION {0x0049 ANIMATIONINFO} + SPI_SETFONTSMOOTHING {0x004B bool} + SPI_SETDRAGWIDTH {0x004C int} + SPI_SETDRAGHEIGHT {0x004D int} + SPI_SETHANDHELD {0x004E} + SPI_SETLOWPOWERTIMEOUT {0x0051 int} + SPI_SETPOWEROFFTIMEOUT {0x0052 int} + SPI_SETLOWPOWERACTIVE {0x0055 bool} + SPI_SETPOWEROFFACTIVE {0x0056 bool} + SPI_SETCURSORS {0x0057 int} + SPI_SETICONS {0x0058 int} + SPI_SETDEFAULTINPUTLANG {0x005A HKL} + SPI_SETLANGTOGGLE {0x005B int} + SPI_SETMOUSETRAILS {0x005D int} + SPI_SETFILTERKEYS {0x0033 FILTERKEYS} + SPI_SETTOGGLEKEYS {0x0035 TOGGLEKEYS} + SPI_SETMOUSEKEYS {0x0037 MOUSEKEYS} + SPI_SETSHOWSOUNDS {0x0039 bool} + SPI_SETSTICKYKEYS {0x003B STICKYKEYS} + SPI_SETACCESSTIMEOUT {0x003D ACCESSTIMEOUT} + SPI_SETSERIALKEYS {0x003F SERIALKEYS} + SPI_SETSOUNDSENTRY {0x0041 SOUNDSENTRY} + SPI_SETSNAPTODEFBUTTON {0x0060 bool} + SPI_SETMOUSEHOVERWIDTH {0x0063 int} + SPI_SETMOUSEHOVERHEIGHT {0x0065 int} + SPI_SETMOUSEHOVERTIME {0x0067 int} + SPI_SETWHEELSCROLLLINES {0x0069 int} + SPI_SETMENUSHOWDELAY {0x006B int} + SPI_SETSHOWIMEUI {0x006F bool} + SPI_SETMOUSESPEED {0x0071 castint} + SPI_SETACTIVEWINDOWTRACKING {0x1001 castbool} + SPI_SETMENUANIMATION {0x1003 castbool} + SPI_SETCOMBOBOXANIMATION {0x1005 castbool} + SPI_SETLISTBOXSMOOTHSCROLLING {0x1007 castbool} + SPI_SETGRADIENTCAPTIONS {0x1009 castbool} + SPI_SETKEYBOARDCUES {0x100B castbool} + SPI_SETMENUUNDERLINES {0x100B castbool} + SPI_SETACTIVEWNDTRKZORDER {0x100D castbool} + SPI_SETHOTTRACKING {0x100F castbool} + SPI_SETMENUFADE {0x1013 castbool} + SPI_SETSELECTIONFADE {0x1015 castbool} + SPI_SETTOOLTIPANIMATION {0x1017 castbool} + SPI_SETTOOLTIPFADE {0x1019 castbool} + SPI_SETCURSORSHADOW {0x101B castbool} + SPI_SETMOUSESONAR {0x101D castbool} + SPI_SETMOUSECLICKLOCK {0x101F bool} + SPI_SETMOUSEVANISH {0x1021 castbool} + SPI_SETFLATMENU {0x1023 castbool} + SPI_SETDROPSHADOW {0x1025 castbool} + SPI_SETBLOCKSENDINPUTRESETS {0x1027 bool} + SPI_SETUIEFFECTS {0x103F castbool} + SPI_SETFOREGROUNDLOCKTIMEOUT {0x2001 castint} + SPI_SETACTIVEWNDTRKTIMEOUT {0x2003 castint} + SPI_SETFOREGROUNDFLASHCOUNT {0x2005 castint} + SPI_SETCARETWIDTH {0x2007 castint} + SPI_SETMOUSECLICKLOCKTIME {0x2009 int} + SPI_SETFONTSMOOTHINGTYPE {0x200B castint} + SPI_SETFONTSMOOTHINGCONTRAST {0x200D unsupported} + SPI_SETFOCUSBORDERWIDTH {0x200F castint} + SPI_SETFOCUSBORDERHEIGHT {0x2011 castint} + } + } + + + array set opts [parseargs args { + persist + notify + } -nulldefault] + + set flags 0 + if {$opts(persist)} { + setbits flags 1 + } + + if {$opts(notify)} { + # Note that actually the notify flag has no effect if persist + # is not set. + setbits flags 2 + } + + set key [string toupper $uiaction] + + if {![info exists SystemParametersInfo_uiactions_set($key)]} { + set key SPI_$key + if {![info exists SystemParametersInfo_uiactions_set($key)]} { + error "Unknown SystemParametersInfo index symbol '$uiaction'" + } + } + + lassign $SystemParametersInfo_uiactions_set($key) index fmt + + switch -exact -- $fmt { + int { SystemParametersInfo $index $val NULL $flags } + bool { + set val [expr {$val ? 1 : 0}] + SystemParametersInfo $index $val NULL $flags + } + castint { + # We have to pass the value as a cast pointer + SystemParametersInfo $index 0 [Twapi_AddressToPointer $val] $flags + } + castbool { + # We have to pass the value as a cast pointer + set val [expr {$val ? 1 : 0}] + SystemParametersInfo $index 0 [Twapi_AddressToPointer $val] $flags + } + default { + error "The data format for $uiaction is not currently supported" + } + } + + return +} + +namespace eval twapi { + variable _wts_session_monitors + set _wts_session_monitors [dict create] +} + +proc twapi::start_wts_session_monitor {script args} { + variable _wts_session_monitors + + parseargs args { + all + } -maxleftover 0 -setvars + set script [lrange $script 0 end]; # Verify syntactically a list + + set id "wts#[TwapiId]" + if {[dict size $_wts_session_monitors] == 0} { + # No monitoring in progress. Start it + # 0x2B1 -> WM_WTSSESSION_CHANGE + Twapi_WTSRegisterSessionNotification $all + _register_script_wm_handler 0x2B1 [list [namespace current]::_wts_session_change_handler] 0 + } + + dict set _wts_session_monitors $id $script + return $id +} + + +proc twapi::stop_wts_session_monitor {id} { + variable _wts_session_monitors + + if {![dict exists $_wts_session_monitors $id]} { + return + } + + dict unset _wts_session_monitors $id + if {[dict size $_wts_session_monitors] == 0} { + # 0x2B1 -> WM_WTSSESSION_CHANGE + _unregister_script_wm_handler 0x2B1 [list [namespace current]::_wts_session_handler] + Twapi_WTSUnRegisterSessionNotification + } +} + +proc twapi::_wts_session_change_handler {msg change session_id msgpos ticks} { + variable _wts_session_monitors + + if {[dict size $_wts_session_monitors] == 0} { + return; # Not an error, could have deleted while already queued + } + + dict for {id script} $_wts_session_monitors { + set code [catch {uplevel #0 [linsert $script end $change $session_id]} msg] + if {$code == 1} { + # Error - put in background but we do not abort + after 0 [list error $msg $::errorInfo $::errorCode] + } + } + return +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/pdh.tcl b/src/punk86.vfs/lib/twapi4.7.2/pdh.tcl new file mode 100644 index 00000000..fadf8817 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/pdh.tcl @@ -0,0 +1,984 @@ +# +# Copyright (c) 2003-2014, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi { +} + +# +# Return list of toplevel performance objects +proc twapi::pdh_enumerate_objects {args} { + + array set opts [parseargs args { + datasource.arg + machine.arg + {detail.arg wizard} + refresh + } -nulldefault] + + # TBD - PdhEnumObjects enables the SeDebugPrivilege the first time it + # is called. Should we reset it if it was not already enabled? + # This seems to only happen on the first call + + return [PdhEnumObjects $opts(datasource) $opts(machine) \ + [_perf_detail_sym_to_val $opts(detail)] \ + $opts(refresh)] +} + +proc twapi::_pdh_enumerate_object_items_helper {selector objname args} { + array set opts [parseargs args { + datasource.arg + machine.arg + {detail.arg wizard} + refresh + } -nulldefault] + + if {$opts(refresh)} { + _refresh_perf_objects $opts(machine) $opts(datasource) + } + + return [PdhEnumObjectItems $opts(datasource) $opts(machine) \ + $objname \ + [_perf_detail_sym_to_val $opts(detail)] \ + $selector] +} + +interp alias {} twapi::pdh_enumerate_object_items {} twapi::_pdh_enumerate_object_items_helper 0 +interp alias {} twapi::pdh_enumerate_object_counters {} twapi::_pdh_enumerate_object_items_helper 1 +interp alias {} twapi::pdh_enumerate_object_instances {} twapi::_pdh_enumerate_object_items_helper 2 + + +# +# Construct a counter path +proc twapi::pdh_counter_path {object counter args} { + array set opts [parseargs args { + machine.arg + instance.arg + parent.arg + {instanceindex.int -1} + {localized.bool false} + } -nulldefault] + + if {$opts(instanceindex) == 0} { + # For XP. For first instance (index 0), the path should not contain + # "#0" but on XP it does. Reset it to -1 for Vista+ consistency + set opts(instanceindex) -1 + } + + + if {! $opts(localized)} { + # Need to localize the counter names + set object [_pdh_localize $object] + set counter [_pdh_localize $counter] + # TBD - not sure we need to localize parent + set opts(parent) [_pdh_localize $opts(parent)] + } + + # TBD - add options PDH_PATH_WBEM as documented in PdhMakeCounterPath + return [PdhMakeCounterPath $opts(machine) $object $opts(instance) \ + $opts(parent) $opts(instanceindex) $counter 0] + +} + +# +# Parse a counter path and return the individual elements +proc twapi::pdh_parse_counter_path {counter_path} { + return [twine {machine object instance parent instanceindex counter} [PdhParseCounterPath $counter_path 0]] +} + + +interp alias {} twapi::pdh_get_scalar {} twapi::_pdh_get 1 +interp alias {} twapi::pdh_get_array {} twapi::_pdh_get 0 + +proc twapi::_pdh_get {scalar hcounter args} { + + array set opts [parseargs args { + {format.arg large {long large double}} + {scale.arg {} {{} none x1000 nocap100}} + var.arg + } -ignoreunknown -nulldefault] + + set flags [_pdh_fmt_sym_to_val $opts(format)] + + if {$opts(scale) ne ""} { + set flags [expr {$flags | [_pdh_fmt_sym_to_val $opts(scale)]}] + } + + set status 1 + set result "" + trap { + if {$scalar} { + set result [PdhGetFormattedCounterValue $hcounter $flags] + } else { + set result [PdhGetFormattedCounterArray $hcounter $flags] + } + } onerror {TWAPI_WIN32 0x800007d1} { + # Error is that no such instance exists. + # If result is being returned in a variable, then + # we will not generate an error but pass back a return value + # of 0 + if {[string length $opts(var)] == 0} { + rethrow + } + set status 0 + } + + if {[string length $opts(var)]} { + uplevel [list set $opts(var) $result] + return $status + } else { + return $result + } +} + +# +# Get the value of a counter identified by the path. +# Should not be used to collect +# rate based options. +# TBD - document +proc twapi::pdh_counter_path_value {counter_path args} { + + array set opts [parseargs args { + {format.arg long} + scale.arg + datasource.arg + var.arg + full.bool + } -nulldefault] + + # Open the query + set hquery [pdh_query_open -datasource $opts(datasource)] + trap { + set hcounter [pdh_add_counter $hquery $counter_path] + pdh_query_refresh $hquery + if {[string length $opts(var)]} { + # Need to pass up value in a variable if so requested + upvar $opts(var) myvar + set opts(var) myvar + } + set value [pdh_get_scalar $hcounter -format $opts(format) \ + -scale $opts(scale) -full $opts(full) \ + -var $opts(var)] + } finally { + pdh_query_close $hquery + } + + return $value +} + + +# +# Constructs one or more counter paths for getting process information. +# Returned as a list of sublists. Each sublist corresponds to a counter path +# and has the form {counteroptionname datatype counterpath rate} +# datatype is the recommended format when retrieving counter value (eg. double) +# rate is 0 or 1 depending on whether the counter is a rate based counter or +# not (requires at least two readings when getting the value) +proc twapi::get_perf_process_counter_paths {pids args} { + variable _process_counter_opt_map + + if {![info exists _counter_opt_map]} { + # "descriptive string" format rate + array set _process_counter_opt_map { + privilegedutilization {"% Privileged Time" double 1} + processorutilization {"% Processor Time" double 1} + userutilization {"% User Time" double 1} + parent {"Creating Process ID" long 0} + elapsedtime {"Elapsed Time" large 0} + handlecount {"Handle Count" long 0} + pid {"ID Process" long 0} + iodatabytesrate {"IO Data Bytes/sec" large 1} + iodataopsrate {"IO Data Operations/sec" large 1} + iootherbytesrate {"IO Other Bytes/sec" large 1} + iootheropsrate {"IO Other Operations/sec" large 1} + ioreadbytesrate {"IO Read Bytes/sec" large 1} + ioreadopsrate {"IO Read Operations/sec" large 1} + iowritebytesrate {"IO Write Bytes/sec" large 1} + iowriteopsrate {"IO Write Operations/sec" large 1} + pagefaultrate {"Page Faults/sec" large 1} + pagefilebytes {"Page File Bytes" large 0} + pagefilebytespeak {"Page File Bytes Peak" large 0} + poolnonpagedbytes {"Pool Nonpaged Bytes" large 0} + poolpagedbytes {"Pool Paged Bytes" large 1} + basepriority {"Priority Base" large 1} + privatebytes {"Private Bytes" large 1} + threadcount {"Thread Count" large 1} + virtualbytes {"Virtual Bytes" large 1} + virtualbytespeak {"Virtual Bytes Peak" large 1} + workingset {"Working Set" large 1} + workingsetpeak {"Working Set Peak" large 1} + } + } + + set optdefs { + machine.arg + datasource.arg + all + refresh + } + + # Add counter names to option list + foreach cntr [array names _process_counter_opt_map] { + lappend optdefs $cntr + } + + # Parse options + array set opts [parseargs args $optdefs -nulldefault] + + # Force a refresh of object items + if {$opts(refresh)} { + # Silently ignore. The above counters are predefined and refreshing + # is just a time-consuming no-op. Keep the option for backward + # compatibility + if {0} { + _refresh_perf_objects $opts(machine) $opts(datasource) + } + } + + # TBD - could we not use get_perf_instance_counter_paths instead of rest of this code + + # Get the path to the process. + set pid_paths [get_perf_counter_paths \ + [_pdh_localize "Process"] \ + [list [_pdh_localize "ID Process"]] \ + $pids \ + -machine $opts(machine) -datasource $opts(datasource) \ + -all] + + if {[llength $pid_paths] == 0} { + # No thread + return [list ] + } + + # Construct the requested counter paths + set counter_paths [list ] + foreach {pid pid_path} $pid_paths { + + # We have to filter out an entry for _Total which might be present + # if pid includes "0" + # TBD - does _Total need to be localized? + if {$pid == 0 && [string match -nocase *_Total\#0* $pid_path]} { + continue + } + + # Break it down into components and store in array + array set path_components [pdh_parse_counter_path $pid_path] + + # Construct counter paths for this pid + foreach {opt counter_info} [array get _process_counter_opt_map] { + if {$opts(all) || $opts($opt)} { + lappend counter_paths \ + [list -$opt $pid [lindex $counter_info 1] \ + [pdh_counter_path $path_components(object) \ + [_pdh_localize [lindex $counter_info 0]] \ + -localized true \ + -machine $path_components(machine) \ + -parent $path_components(parent) \ + -instance $path_components(instance) \ + -instanceindex $path_components(instanceindex)] \ + [lindex $counter_info 2] \ + ] + } + } + } + + return $counter_paths +} + + +# Returns the counter path for the process with the given pid. This includes +# the pid counter path element +proc twapi::get_perf_process_id_path {pid args} { + return [get_unique_counter_path \ + [_pdh_localize "Process"] \ + [_pdh_localize "ID Process"] $pid] +} + + +# +# Constructs one or more counter paths for getting thread information. +# Returned as a list of sublists. Each sublist corresponds to a counter path +# and has the form {counteroptionname datatype counterpath rate} +# datatype is the recommended format when retrieving counter value (eg. double) +# rate is 0 or 1 depending on whether the counter is a rate based counter or +# not (requires at least two readings when getting the value) +proc twapi::get_perf_thread_counter_paths {tids args} { + variable _thread_counter_opt_map + + if {![info exists _thread_counter_opt_map]} { + array set _thread_counter_opt_map { + privilegedutilization {"% Privileged Time" double 1} + processorutilization {"% Processor Time" double 1} + userutilization {"% User Time" double 1} + contextswitchrate {"Context Switches/sec" long 1} + elapsedtime {"Elapsed Time" large 0} + pid {"ID Process" long 0} + tid {"ID Thread" long 0} + basepriority {"Priority Base" long 0} + priority {"Priority Current" long 0} + startaddress {"Start Address" large 0} + state {"Thread State" long 0} + waitreason {"Thread Wait Reason" long 0} + } + } + + set optdefs { + machine.arg + datasource.arg + all + refresh + } + + # Add counter names to option list + foreach cntr [array names _thread_counter_opt_map] { + lappend optdefs $cntr + } + + # Parse options + array set opts [parseargs args $optdefs -nulldefault] + + # Force a refresh of object items + if {$opts(refresh)} { + # Silently ignore. The above counters are predefined and refreshing + # is just a time-consuming no-op. Keep the option for backward + # compatibility + if {0} { + _refresh_perf_objects $opts(machine) $opts(datasource) + } + } + + # TBD - could we not use get_perf_instance_counter_paths instead of rest of this code + + # Get the path to the thread + set tid_paths [get_perf_counter_paths \ + [_pdh_localize "Thread"] \ + [list [_pdh_localize "ID Thread"]] \ + $tids \ + -machine $opts(machine) -datasource $opts(datasource) \ + -all] + + if {[llength $tid_paths] == 0} { + # No thread + return [list ] + } + + # Now construct the requested counter paths + set counter_paths [list ] + foreach {tid tid_path} $tid_paths { + # Break it down into components and store in array + array set path_components [pdh_parse_counter_path $tid_path] + foreach {opt counter_info} [array get _thread_counter_opt_map] { + if {$opts(all) || $opts($opt)} { + lappend counter_paths \ + [list -$opt $tid [lindex $counter_info 1] \ + [pdh_counter_path $path_components(object) \ + [_pdh_localize [lindex $counter_info 0]] \ + -localized true \ + -machine $path_components(machine) \ + -parent $path_components(parent) \ + -instance $path_components(instance) \ + -instanceindex $path_components(instanceindex)] \ + [lindex $counter_info 2] + ] + } + } + } + + return $counter_paths +} + + +# Returns the counter path for the thread with the given tid. This includes +# the tid counter path element +proc twapi::get_perf_thread_id_path {tid args} { + + return [get_unique_counter_path [_pdh_localize"Thread"] [_pdh_localize "ID Thread"] $tid] +} + + +# +# Constructs one or more counter paths for getting processor information. +# Returned as a list of sublists. Each sublist corresponds to a counter path +# and has the form {counteroptionname datatype counterpath rate} +# datatype is the recommended format when retrieving counter value (eg. double) +# rate is 0 or 1 depending on whether the counter is a rate based counter or +# not (requires at least two readings when getting the value) +# $processor should be the processor number or "" to get total +proc twapi::get_perf_processor_counter_paths {processor args} { + variable _processor_counter_opt_map + + if {![string is integer -strict $processor]} { + if {[string length $processor]} { + error "Processor id must be an integer or null to retrieve information for all processors" + } + set processor "_Total" + } + + if {![info exists _processor_counter_opt_map]} { + array set _processor_counter_opt_map { + dpcutilization {"% DPC Time" double 1} + interruptutilization {"% Interrupt Time" double 1} + privilegedutilization {"% Privileged Time" double 1} + processorutilization {"% Processor Time" double 1} + userutilization {"% User Time" double 1} + dpcrate {"DPC Rate" double 1} + dpcqueuerate {"DPCs Queued/sec" double 1} + interruptrate {"Interrupts/sec" double 1} + } + } + + set optdefs { + machine.arg + datasource.arg + all + refresh + } + + # Add counter names to option list + foreach cntr [array names _processor_counter_opt_map] { + lappend optdefs $cntr + } + + # Parse options + array set opts [parseargs args $optdefs -nulldefault -maxleftover 0] + + # Force a refresh of object items + if {$opts(refresh)} { + # Silently ignore. The above counters are predefined and refreshing + # is just a time-consuming no-op. Keep the option for backward + # compatibility + if {0} { + _refresh_perf_objects $opts(machine) $opts(datasource) + } + } + + # Now construct the requested counter paths + set counter_paths [list ] + foreach {opt counter_info} [array get _processor_counter_opt_map] { + if {$opts(all) || $opts($opt)} { + lappend counter_paths \ + [list $opt $processor [lindex $counter_info 1] \ + [pdh_counter_path \ + [_pdh_localize "Processor"] \ + [_pdh_localize [lindex $counter_info 0]] \ + -localized true \ + -machine $opts(machine) \ + -instance $processor] \ + [lindex $counter_info 2] \ + ] + } + } + + return $counter_paths +} + + + +# +# Returns a list comprising of the counter paths for counters with +# names in the list $counters from those instance(s) whose counter +# $key_counter matches the specified $key_counter_value +proc twapi::get_perf_instance_counter_paths {object counters + key_counter key_counter_values + args} { + # Parse options + array set opts [parseargs args { + machine.arg + datasource.arg + {matchop.arg "exact"} + skiptotal.bool + refresh + } -nulldefault] + + # Force a refresh of object items + if {$opts(refresh)} { + _refresh_perf_objects $opts(machine) $opts(datasource) + } + + # Get the list of instances that have the specified value for the + # key counter + set instance_paths [get_perf_counter_paths $object \ + [list $key_counter] $key_counter_values \ + -machine $opts(machine) \ + -datasource $opts(datasource) \ + -matchop $opts(matchop) \ + -skiptotal $opts(skiptotal) \ + -all] + + # Loop through all instance paths, and all counters to generate + # We store in an array to get rid of duplicates + array set counter_paths {} + foreach {key_counter_value instance_path} $instance_paths { + # Break it down into components and store in array + array set path_components [pdh_parse_counter_path $instance_path] + + # Now construct the requested counter paths + # TBD - what should -localized be here ? + foreach counter $counters { + set counter_path \ + [pdh_counter_path $path_components(object) \ + $counter \ + -localized true \ + -machine $path_components(machine) \ + -parent $path_components(parent) \ + -instance $path_components(instance) \ + -instanceindex $path_components(instanceindex)] + set counter_paths($counter_path) "" + } + } + + return [array names counter_paths] + + +} + + +# +# Returns a list comprising of the counter paths for all counters +# whose values match the specified criteria +proc twapi::get_perf_counter_paths {object counters counter_values args} { + array set opts [parseargs args { + machine.arg + datasource.arg + {matchop.arg "exact"} + skiptotal.bool + all + refresh + } -nulldefault] + + if {$opts(refresh)} { + _refresh_perf_objects $opts(machine) $opts(datasource) + } + + set items [pdh_enum_object_items $object \ + -machine $opts(machine) \ + -datasource $opts(datasource)] + lassign $items object_counters object_instances + + if {[llength $counters]} { + set object_counters $counters + } + set paths [_make_counter_path_list \ + $object $object_instances $object_counters \ + -skiptotal $opts(skiptotal) -machine $opts(machine)] + set result_paths [list ] + trap { + # Set up the query with the process id for all processes + set hquery [pdh_query_open -datasource $opts(datasource)] + foreach path $paths { + set hcounter [pdh_add_counter $hquery $path] + set lookup($hcounter) $path + } + + # Now collect the info + pdh_query_refresh $hquery + + # Now lookup each counter value to find a matching one + foreach hcounter [array names lookup] { + if {! [pdh_get_scalar $hcounter -var value]} { + # Counter or instance no longer exists + continue + } + + set match_pos [lsearch -$opts(matchop) $counter_values $value] + if {$match_pos >= 0} { + lappend result_paths \ + [lindex $counter_values $match_pos] $lookup($hcounter) + if {! $opts(all)} { + break + } + } + } + } finally { + # TBD - should we have a catch to throw errors? + pdh_query_close $hquery + } + + return $result_paths +} + + +# +# Returns the counter path for counter $counter with a value $value +# for object $object. Returns "" on no matches but exception if more than one +proc twapi::get_unique_counter_path {object counter value args} { + set matches [get_perf_counter_paths $object [list $counter ] [list $value] {*}$args -all] + if {[llength $matches] > 1} { + error "Multiple counter paths found matching criteria object='$object' counter='$counter' value='$value" + } + return [lindex $matches 0] +} + + + +# +# Utilities +# +proc twapi::_refresh_perf_objects {machine datasource} { + pdh_enumerate_objects -refresh + return +} + + +# +# Return the localized form of a counter name +# TBD - assumes machine is local machine! +proc twapi::_pdh_localize {name} { + variable _perf_counter_ids + variable _localized_perf_counter_names + + set name_index [string tolower $name] + + # If we already have a translation, return it + if {[info exists _localized_perf_counter_names($name_index)]} { + return $_localized_perf_counter_names($name_index) + } + + # Didn't already have it. Go generate the mappings + + # Get the list of counter names in English if we don't already have it + if {![info exists _perf_counter_ids]} { + foreach {id label} [registry get {HKEY_PERFORMANCE_DATA} {Counter 009}] { + set _perf_counter_ids([string tolower $label]) $id + } + } + + # If we have do not have id for the given name, we will just use + # the passed name as the localized version + if {! [info exists _perf_counter_ids($name_index)]} { + # Does not seem to exist. Just set localized name to itself + return [set _localized_perf_counter_names($name_index) $name] + } + + # We do have an id. THen try to get a translated name + if {[catch {PdhLookupPerfNameByIndex "" $_perf_counter_ids($name_index)} xname]} { + set _localized_perf_counter_names($name_index) $name + } else { + set _localized_perf_counter_names($name_index) $xname + } + + return $_localized_perf_counter_names($name_index) +} + + +# Given a list of instances and counters, return a cross product of the +# corresponding counter paths. +# The list is expected to be already localized +# Example: _make_counter_path_list "Process" (instance list) {{ID Process} {...}} +# TBD - bug - does not handle -parent in counter path +proc twapi::_make_counter_path_list {object instance_list counter_list args} { + array set opts [parseargs args { + machine.arg + skiptotal.bool + } -nulldefault] + + array set instances {} + foreach instance $instance_list { + if {![info exists instances($instance)]} { + set instances($instance) 1 + } else { + incr instances($instance) + } + } + + if {$opts(skiptotal)} { + catch {array unset instances "*_Total"} + } + + set counter_paths [list ] + foreach {instance count} [array get instances] { + while {$count} { + incr count -1 + foreach counter $counter_list { + lappend counter_paths [pdh_counter_path \ + $object $counter \ + -localized true \ + -machine $opts(machine) \ + -instance $instance \ + -instanceindex $count] + } + } + } + + return $counter_paths +} + + +# +# Given a set of counter paths in the format returned by +# get_perf_thread_counter_paths, get_perf_processor_counter_paths etc. +# return the counter information as a flat list of field value pairs +proc twapi::get_perf_values_from_metacounter_info {metacounters args} { + array set opts [parseargs args {{interval.int 100}}] + + set result [list ] + set counters [list ] + if {[llength $metacounters]} { + set hquery [pdh_query_open] + trap { + set counter_info [list ] + set need_wait 0 + foreach counter_elem $metacounters { + lassign $counter_elem pdh_opt key data_type counter_path wait + incr need_wait $wait + set hcounter [pdh_add_counter $hquery $counter_path] + lappend counters $hcounter + lappend counter_info $pdh_opt $key $counter_path $data_type $hcounter + } + + pdh_query_refresh $hquery + if {$need_wait} { + after $opts(interval) + pdh_query_refresh $hquery + } + + foreach {pdh_opt key counter_path data_type hcounter} $counter_info { + if {[pdh_get_scalar $hcounter -format $data_type -var value]} { + lappend result $pdh_opt $key $value + } + } + } onerror {} { + #puts "Error: $msg" + } finally { + pdh_query_close $hquery + } + } + + return $result + +} + +proc twapi::pdh_query_open {args} { + variable _pdh_queries + + array set opts [parseargs args { + datasource.arg + cookie.int + } -nulldefault] + + set qh [PdhOpenQuery $opts(datasource) $opts(cookie)] + set id pdh[TwapiId] + dict set _pdh_queries($id) Qh $qh + dict set _pdh_queries($id) Counters {} + dict set _pdh_queries($id) Meta {} + return $id +} + +proc twapi::pdh_query_refresh {qid args} { + variable _pdh_queries + _pdh_query_check $qid + PdhCollectQueryData [dict get $_pdh_queries($qid) Qh] + return +} + +proc twapi::pdh_query_close {qid} { + variable _pdh_queries + _pdh_query_check $qid + + dict for {ctrh -} [dict get $_pdh_queries($qid) Counters] { + PdhRemoveCounter $ctrh + } + + PdhCloseQuery [dict get $_pdh_queries($qid) Qh] + unset _pdh_queries($qid) +} + +proc twapi::pdh_add_counter {qid ctr_path args} { + variable _pdh_queries + + _pdh_query_check $qid + + parseargs args { + {format.arg large {long large double}} + {scale.arg {} {{} none x1000 nocap100}} + name.arg + cookie.int + array.bool + } -nulldefault -maxleftover 0 -setvars + + if {$name eq ""} { + set name $ctr_path + } + + if {[dict exists $_pdh_queries($qid) Meta $name]} { + error "A counter with name \"$name\" already present in the query." + } + + set flags [_pdh_fmt_sym_to_val $format] + + if {$scale ne ""} { + set flags [expr {$flags | [_pdh_fmt_sym_to_val $scale]}] + } + + set hctr [PdhAddCounter [dict get $_pdh_queries($qid) Qh] $ctr_path $flags] + dict set _pdh_queries($qid) Counters $hctr 1 + dict set _pdh_queries($qid) Meta $name [list Counter $hctr FmtFlags $flags Array $array] + + return $hctr +} + +proc twapi::pdh_remove_counter {qid ctrname} { + variable _pdh_queries + _pdh_query_check $qid + if {![dict exists $_pdh_queries($qid) Meta $ctrname]} { + badargs! "Counter \"$ctrname\" not present in query." + } + set hctr [dict get $_pdh_queries($qid) Meta $ctrname Counter] + dict unset _pdh_queries($qid) Counters $hctr + dict unset _pdh_queries($qid) Meta $ctrname + PdhRemoveCounter $hctr + return +} + +proc twapi::pdh_query_get {qid args} { + variable _pdh_queries + + _pdh_query_check $qid + + # Refresh the data + PdhCollectQueryData [dict get $_pdh_queries($qid) Qh] + + set meta [dict get $_pdh_queries($qid) Meta] + + if {[llength $args] != 0} { + set names $args + } else { + set names [dict keys $meta] + } + + set result {} + foreach name $names { + if {[dict get $meta $name Array]} { + lappend result $name [PdhGetFormattedCounterArray [dict get $meta $name Counter] [dict get $meta $name FmtFlags]] + } else { + lappend result $name [PdhGetFormattedCounterValue [dict get $meta $name Counter] [dict get $meta $name FmtFlags]] + } + } + + return $result +} + +twapi::proc* twapi::pdh_system_performance_query args { + variable _sysperf_defs + + set _sysperf_defs { + event_count { {Objects Events} {} } + mutex_count { {Objects Mutexes} {} } + process_count { {Objects Processes} {} } + section_count { {Objects Sections} {} } + semaphore_count { {Objects Semaphores} {} } + thread_count { {Objects Threads} {} } + handle_count { {Process "Handle Count" -instance _Total} {-format long} } + commit_limit { {Memory "Commit Limit"} {} } + committed_bytes { {Memory "Committed Bytes"} {} } + committed_percent { {Memory "% Committed Bytes In Use"} {-format double} } + memory_free_mb { {Memory "Available MBytes"} {} } + memory_free_kb { {Memory "Available KBytes"} {} } + page_fault_rate { {Memory "Page Faults/sec"} {} } + page_input_rate { {Memory "Pages Input/sec"} {} } + page_output_rate { {Memory "Pages Output/sec"} {} } + + disk_bytes_rate { {PhysicalDisk "Disk Bytes/sec" -instance _Total} {} } + disk_readbytes_rate { {PhysicalDisk "Disk Read Bytes/sec" -instance _Total} {} } + disk_writebytes_rate { {PhysicalDisk "Disk Write Bytes/sec" -instance _Total} {} } + disk_transfer_rate { {PhysicalDisk "Disk Transfers/sec" -instance _Total} {} } + disk_read_rate { {PhysicalDisk "Disk Reads/sec" -instance _Total} {} } + disk_write_rate { {PhysicalDisk "Disk Writes/sec" -instance _Total} {} } + disk_idle_percent { {PhysicalDisk "% Idle Time" -instance _Total} {-format double} } + } + + # Per-processor counters are based on above but the object name depends + # on the system in order to support > 64 processors + set obj_name [expr {[min_os_version 6 1] ? "Processor Information" : "Processor"}] + dict for {key ctr_name} { + interrupt_utilization "% Interrupt Time" + privileged_utilization "% Privileged Time" + processor_utilization "% Processor Time" + user_utilization "% User Time" + idle_utilization "% Idle Time" + } { + lappend _sysperf_defs $key \ + [list \ + [list $obj_name $ctr_name -instance _Total] \ + [list -format double]] + + lappend _sysperf_defs ${key}_per_cpu \ + [list \ + [list $obj_name $ctr_name -instance *] \ + [list -format double -array 1]] + } +} { + variable _sysperf_defs + + if {[llength $args] == 0} { + return [lsort -dictionary [dict keys $_sysperf_defs]] + } + + set qid [pdh_query_open] + trap { + foreach arg $args { + set def [dict! $_sysperf_defs $arg] + set ctr_path [pdh_counter_path {*}[lindex $def 0]] + pdh_add_counter $qid $ctr_path -name $arg {*}[lindex $def 1] + } + pdh_query_refresh $qid + } onerror {} { + pdh_query_close $qid + rethrow + } + + return $qid +} + +# +# Internal utility procedures +proc twapi::_pdh_query_check {qid} { + variable _pdh_queries + + if {![info exists _pdh_queries($qid)]} { + error "Invalid query id $qid" + } +} + +proc twapi::_perf_detail_sym_to_val {sym} { + # PERF_DETAIL_NOVICE 100 + # PERF_DETAIL_ADVANCED 200 + # PERF_DETAIL_EXPERT 300 + # PERF_DETAIL_WIZARD 400 + # PERF_DETAIL_COSTLY 0x00010000 + # PERF_DETAIL_STANDARD 0x0000FFFF + + return [dict get {novice 100 advanced 200 expert 300 wizard 400 costly 0x00010000 standard 0x0000ffff } $sym] +} + + +proc twapi::_pdh_fmt_sym_to_val {sym} { + # PDH_FMT_RAW 0x00000010 + # PDH_FMT_ANSI 0x00000020 + # PDH_FMT_UNICODE 0x00000040 + # PDH_FMT_LONG 0x00000100 + # PDH_FMT_DOUBLE 0x00000200 + # PDH_FMT_LARGE 0x00000400 + # PDH_FMT_NOSCALE 0x00001000 + # PDH_FMT_1000 0x00002000 + # PDH_FMT_NODATA 0x00004000 + # PDH_FMT_NOCAP100 0x00008000 + + return [dict get { + raw 0x00000010 + ansi 0x00000020 + unicode 0x00000040 + long 0x00000100 + double 0x00000200 + large 0x00000400 + noscale 0x00001000 + none 0x00001000 + 1000 0x00002000 + x1000 0x00002000 + nodata 0x00004000 + nocap100 0x00008000 + nocap 0x00008000 + } $sym] +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/pkgIndex.tcl b/src/punk86.vfs/lib/twapi4.7.2/pkgIndex.tcl new file mode 100644 index 00000000..1fc7471d --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/pkgIndex.tcl @@ -0,0 +1,119 @@ +# +# Tcl package index file +# + +namespace eval twapi { + variable scriptdir + proc set_scriptdir dir {variable scriptdir ; set scriptdir $dir} +} + +package ifneeded twapi_base 4.7.2 \ + [list load [file join $dir twapi472.dll] twapi_base] +package ifneeded twapi_com 4.7.2 \ + {load {} twapi_com} +package ifneeded metoo 4.7.2 \ + [list source [file join $dir metoo.tcl]] +package ifneeded twapi_com 4.7.2 \ + {load {} twapi_com} +package ifneeded twapi_msi 4.7.2 \ + [list source [file join $dir msi.tcl]] +package ifneeded twapi_power 4.7.2 \ + [list source [file join $dir power.tcl]] +package ifneeded twapi_printer 4.7.2 \ + [list source [file join $dir printer.tcl]] +package ifneeded twapi_synch 4.7.2 \ + [list source [file join $dir synch.tcl]] +package ifneeded twapi_security 4.7.2 \ + {load {} twapi_security} +package ifneeded twapi_account 4.7.2 \ + {load {} twapi_account} +package ifneeded twapi_apputil 4.7.2 \ + {load {} twapi_apputil} +package ifneeded twapi_clipboard 4.7.2 \ + {load {} twapi_clipboard} +package ifneeded twapi_console 4.7.2 \ + {load {} twapi_console} +package ifneeded twapi_crypto 4.7.2 \ + {load {} twapi_crypto} +package ifneeded twapi_device 4.7.2 \ + {load {} twapi_device} +package ifneeded twapi_etw 4.7.2 \ + {load {} twapi_etw} +package ifneeded twapi_eventlog 4.7.2 \ + {load {} twapi_eventlog} +package ifneeded twapi_mstask 4.7.2 \ + {load {} twapi_mstask} +package ifneeded twapi_multimedia 4.7.2 \ + {load {} twapi_multimedia} +package ifneeded twapi_namedpipe 4.7.2 \ + {load {} twapi_namedpipe} +package ifneeded twapi_network 4.7.2 \ + {load {} twapi_network} +package ifneeded twapi_nls 4.7.2 \ + {load {} twapi_nls} +package ifneeded twapi_os 4.7.2 \ + {load {} twapi_os} +package ifneeded twapi_pdh 4.7.2 \ + {load {} twapi_pdh} +package ifneeded twapi_process 4.7.2 \ + {load {} twapi_process} +package ifneeded twapi_rds 4.7.2 \ + {load {} twapi_rds} +package ifneeded twapi_resource 4.7.2 \ + {load {} twapi_resource} +package ifneeded twapi_service 4.7.2 \ + {load {} twapi_service} +package ifneeded twapi_share 4.7.2 \ + {load {} twapi_share} +package ifneeded twapi_shell 4.7.2 \ + {load {} twapi_shell} +package ifneeded twapi_storage 4.7.2 \ + {load {} twapi_storage} +package ifneeded twapi_ui 4.7.2 \ + {load {} twapi_ui} +package ifneeded twapi_input 4.7.2 \ + {load {} twapi_input} +package ifneeded twapi_winsta 4.7.2 \ + {load {} twapi_winsta} +package ifneeded twapi_wmi 4.7.2 \ + {load {} twapi_wmi} + +package ifneeded twapi 4.7.2 [subst { + twapi::set_scriptdir [list $dir] + package require twapi_base 4.7.2 + source [list [file join $dir twapi_entry.tcl]] + package require metoo 4.7.2 + package require twapi_com 4.7.2 + package require twapi_msi 4.7.2 + package require twapi_power 4.7.2 + package require twapi_printer 4.7.2 + package require twapi_synch 4.7.2 + package require twapi_security 4.7.2 + package require twapi_account 4.7.2 + package require twapi_apputil 4.7.2 + package require twapi_clipboard 4.7.2 + package require twapi_console 4.7.2 + package require twapi_crypto 4.7.2 + package require twapi_device 4.7.2 + package require twapi_etw 4.7.2 + package require twapi_eventlog 4.7.2 + package require twapi_mstask 4.7.2 + package require twapi_multimedia 4.7.2 + package require twapi_namedpipe 4.7.2 + package require twapi_network 4.7.2 + package require twapi_nls 4.7.2 + package require twapi_os 4.7.2 + package require twapi_pdh 4.7.2 + package require twapi_process 4.7.2 + package require twapi_rds 4.7.2 + package require twapi_resource 4.7.2 + package require twapi_service 4.7.2 + package require twapi_share 4.7.2 + package require twapi_shell 4.7.2 + package require twapi_storage 4.7.2 + package require twapi_ui 4.7.2 + package require twapi_input 4.7.2 + package require twapi_winsta 4.7.2 + package require twapi_wmi 4.7.2 + package provide twapi 4.7.2 +}] diff --git a/src/punk86.vfs/lib/twapi4.7.2/power.tcl b/src/punk86.vfs/lib/twapi4.7.2/power.tcl new file mode 100644 index 00000000..f8a793c1 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/power.tcl @@ -0,0 +1,136 @@ +# +# Copyright (c) 2003-2012 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi { + variable _power_monitors + set _power_monitors [dict create] +} + +# Get the power status of the system +proc twapi::get_power_status {} { + lassign [GetSystemPowerStatus] ac battery lifepercent reserved lifetime fulllifetime + + set acstatus unknown + if {$ac == 0} { + set acstatus off + } elseif {$ac == 1} { + # Note only value 1 is "on", not just any non-0 value + set acstatus on + } + + set batterycharging unknown + if {$battery == -1} { + set batterystate unknown + } elseif {$battery & 128} { + set batterystate notpresent; # No battery + } else { + if {$battery & 8} { + set batterycharging true + } else { + set batterycharging false + } + if {$battery & 4} { + set batterystate critical + } elseif {$battery & 2} { + set batterystate low + } else { + set batterystate high + } + } + + set batterylifepercent unknown + if {$lifepercent >= 0 && $lifepercent <= 100} { + set batterylifepercent $lifepercent + } + + set batterylifetime $lifetime + if {$lifetime == -1} { + set batterylifetime unknown + } + + set batteryfulllifetime $fulllifetime + if {$fulllifetime == -1} { + set batteryfulllifetime unknown + } + + return [kl_create2 { + -acstatus + -batterystate + -batterycharging + -batterylifepercent + -batterylifetime + -batteryfulllifetime + } [list $acstatus $batterystate $batterycharging $batterylifepercent $batterylifetime $batteryfulllifetime]] +} + + +# Power notification callback +proc twapi::_power_handler {msg power_event lparam msgpos ticks} { + variable _power_monitors + + if {[dict size $_power_monitors] == 0} { + return; # Not an error, could have deleted while already queued + } + + if {![kl_vget { + 0 apmquerysuspend + 2 apmquerysuspendfailed + 4 apmsuspend + 6 apmresumecritical + 7 apmresumesuspend + 9 apmbatterylow + 10 apmpowerstatuschange + 11 apmoemevent + 18 apmresumeautomatic + } $power_event power_event]} { + return; # Do not support this event + } + + dict for {id script} $_power_monitors { + set code [catch {uplevel #0 [linsert $script end $power_event $lparam]} msg] + if {$code == 1} { + # Error - put in background but we do not abort + after 0 [list error $msg $::errorInfo $::errorCode] + } + } + return +} + +proc twapi::start_power_monitor {script} { + variable _power_monitors + + set script [lrange $script 0 end]; # Verify syntactically a list + + set id "power#[TwapiId]" + if {[dict size $_power_monitors] == 0} { + # No power monitoring in progress. Start it + # 0x218 -> WM_POWERBROADCAST + _register_script_wm_handler 0x218 [list [namespace current]::_power_handler] 1 + } + + dict set _power_monitors $id $script + return $id +} + + +# Stop monitoring of the power +proc twapi::stop_power_monitor {id} { + variable _power_monitors + + if {![dict exists $_power_monitors $id]} { + return + } + + dict unset _power_monitors $id + if {[dict size $_power_monitors] == 0} { + _unregister_script_wm_handler 0x218 [list [namespace current]::_power_handler] + } +} + +# Hack to work with the various build configuration. +if {[info commands ::twapi::get_version] ne ""} { + package provide twapi_power [::twapi::get_version -patchlevel] +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/printer.tcl b/src/punk86.vfs/lib/twapi4.7.2/printer.tcl new file mode 100644 index 00000000..d73af00d --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/printer.tcl @@ -0,0 +1,58 @@ +# +# Copyright (c) 2004-2006 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi {} + +proc twapi::enumerate_printers {args} { + array set opts [parseargs args { + {proximity.arg all {local remote all any}} + } -maxleftover 0] + + set result [list ] + foreach elem [Twapi_EnumPrinters_Level4 \ + [string map {all 6 any 6 local 2 remote 4} $opts(proximity)] \ + ] { + lappend result [list [lindex $elem 0] [lindex $elem 1] \ + [_symbolize_printer_attributes [lindex $elem 2]]] + } + return [list {-name -server -attrs} $result] +} + + +# Utilities +# +proc twapi::_symbolize_printer_attributes {attr} { + return [_make_symbolic_bitmask $attr { + queued 0x00000001 + direct 0x00000002 + default 0x00000004 + shared 0x00000008 + network 0x00000010 + hidden 0x00000020 + local 0x00000040 + enabledevq 0x00000080 + keepprintedjobs 0x00000100 + docompletefirst 0x00000200 + workoffline 0x00000400 + enablebidi 0x00000800 + rawonly 0x00001000 + published 0x00002000 + fax 0x00004000 + ts 0x00008000 + pusheduser 0x00020000 + pushedmachine 0x00040000 + machine 0x00080000 + friendlyname 0x00100000 + tsgenericdriver 0x00200000 + peruser 0x00400000 + enterprisecloud 0x00800000 + }] +} + +# Hack to work with the various build configuration. +if {[info commands ::twapi::get_version] ne ""} { + package provide twapi_printer [::twapi::get_version -patchlevel] +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/process.tcl b/src/punk86.vfs/lib/twapi4.7.2/process.tcl new file mode 100644 index 00000000..5f37800b --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/process.tcl @@ -0,0 +1,2028 @@ +# +# Copyright (c) 2003-2020, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi {} + + +# Create a process +# TBD Use https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23/everyone-quotes-command-line-arguments-the-wrong-way/ +# to construct -cmdline value +proc twapi::create_process {path args} { + array set opts [parseargs args { + {debugchildtree.bool 0 0x1} + {debugchild.bool 0 0x2} + {createsuspended.bool 0 0x4} + {detached.bool 0 0x8} + {newconsole.bool 0 0x10} + {newprocessgroup.bool 0 0x200} + {separatevdm.bool 0 0x800} + {sharedvdm.bool 0 0x1000} + {inheriterrormode.bool 1 0x04000000} + {noconsole.bool 0 0x08000000} + {priority.arg normal {normal abovenormal belownormal high realtime idle}} + + {feedbackcursoron.bool 0 0x40} + {feedbackcursoroff.bool 0 0x80} + {fullscreen.bool 0 0x20} + + {cmdline.arg ""} + {inheritablechildprocess.bool 0} + {inheritablechildthread.bool 0} + {childprocesssecd.arg ""} + {childthreadsecd.arg ""} + {inherithandles.bool 0} + {env.arg ""} + {startdir.arg ""} + {desktop.arg __null__} + {title.arg ""} + windowpos.arg + windowsize.arg + screenbuffersize.arg + background.arg + foreground.arg + {showwindow.arg ""} + {stdhandles.arg ""} + {stdchannels.arg ""} + {returnhandles.bool 0} + + token.arg + } -maxleftover 0] + + set process_sec_attr [_make_secattr $opts(childprocesssecd) $opts(inheritablechildprocess)] + set thread_sec_attr [_make_secattr $opts(childthreadsecd) $opts(inheritablechildthread)] + + # Check incompatible options + if {$opts(newconsole) && $opts(detached)} { + error "Options -newconsole and -detached cannot be specified together" + } + if {$opts(sharedvdm) && $opts(separatevdm)} { + error "Options -sharedvdm and -separatevdm cannot be specified together" + } + + # Create the start up info structure + set si_flags 0 + if {[info exists opts(windowpos)]} { + lassign [_parse_integer_pair $opts(windowpos)] xpos ypos + setbits si_flags 0x4 + } else { + set xpos 0 + set ypos 0 + } + if {[info exists opts(windowsize)]} { + lassign [_parse_integer_pair $opts(windowsize)] xsize ysize + setbits si_flags 0x2 + } else { + set xsize 0 + set ysize 0 + } + if {[info exists opts(screenbuffersize)]} { + lassign [_parse_integer_pair $opts(screenbuffersize)] xscreen yscreen + setbits si_flags 0x8 + } else { + set xscreen 0 + set yscreen 0 + } + + set fg 7; # Default to white + set bg 0; # Default to black + if {[info exists opts(foreground)]} { + set fg [_map_console_color $opts(foreground) 0] + setbits si_flags 0x10 + } + if {[info exists opts(background)]} { + set bg [_map_console_color $opts(background) 1] + setbits si_flags 0x10 + } + + set si_flags [expr {$si_flags | + $opts(feedbackcursoron) | $opts(feedbackcursoroff) | + $opts(fullscreen)}] + + switch -exact -- $opts(showwindow) { + "" {set opts(showwindow) 1 } + hidden {set opts(showwindow) 0} + normal {set opts(showwindow) 1} + minimized {set opts(showwindow) 2} + maximized {set opts(showwindow) 3} + default {error "Invalid value '$opts(showwindow)' for -showwindow option"} + } + if {[string length $opts(showwindow)]} { + setbits si_flags 0x1 + } + + if {[llength $opts(stdhandles)] && [llength $opts(stdchannels)]} { + error "Options -stdhandles and -stdchannels cannot be used together" + } + + if {[llength $opts(stdhandles)]} { + if {! $opts(inherithandles)} { + error "Cannot specify -stdhandles option if option -inherithandles is specified as 0" + } + + setbits si_flags 0x100 + } + + # Figure out process creation flags + # 0x400 -> CREATE_UNICODE_ENVIRONMENT + set flags [expr {0x00000400 | + $opts(createsuspended) | $opts(debugchildtree) | + $opts(debugchild) | $opts(detached) | $opts(newconsole) | + $opts(newprocessgroup) | $opts(separatevdm) | + $opts(sharedvdm) | $opts(inheriterrormode) | + $opts(noconsole) }] + + switch -exact -- $opts(priority) { + normal {set priority 0x00000020} + abovenormal {set priority 0x00008000} + belownormal {set priority 0x00004000} + "" {set priority 0} + high {set priority 0x00000080} + realtime {set priority 0x00000100} + idle {set priority 0x00000040} + default {error "Unknown priority '$priority'"} + } + set flags [expr {$flags | $priority}] + + # Create the environment strings + if {[llength $opts(env)]} { + set child_env [list ] + foreach {envvar envval} $opts(env) { + lappend child_env "$envvar=$envval" + } + } else { + set child_env "__null__" + } + + trap { + # This is inside the trap because duplicated handles have + # to be closed. + if {[llength $opts(stdchannels)]} { + if {! $opts(inherithandles)} { + error "Cannot specify -stdhandles option if option -inherithandles is specified as 0" + } + if {[llength $opts(stdchannels)] != 3} { + error "Must specify 3 channels for -stdchannels option corresponding stdin, stdout and stderr" + } + + setbits si_flags 0x100 + + # Convert the channels to handles + lappend opts(stdhandles) [duplicate_handle [get_tcl_channel_handle [lindex $opts(stdchannels) 0] read] -inherit] + lappend opts(stdhandles) [duplicate_handle [get_tcl_channel_handle [lindex $opts(stdchannels) 1] write] -inherit] + lappend opts(stdhandles) [duplicate_handle [get_tcl_channel_handle [lindex $opts(stdchannels) 2] write] -inherit] + } + + set startup [list $opts(desktop) $opts(title) $xpos $ypos \ + $xsize $ysize $xscreen $yscreen \ + [expr {$fg|$bg}] $si_flags $opts(showwindow) \ + $opts(stdhandles)] + + if {[info exists opts(token)]} { + lassign [CreateProcessAsUser $opts(token) [file nativename $path] \ + $opts(cmdline) \ + $process_sec_attr $thread_sec_attr \ + $opts(inherithandles) $flags $child_env \ + [file normalize $opts(startdir)] $startup \ + ] ph th pid tid + + } else { + lassign [CreateProcess [file nativename $path] \ + $opts(cmdline) \ + $process_sec_attr $thread_sec_attr \ + $opts(inherithandles) $flags $child_env \ + [file normalize $opts(startdir)] $startup \ + ] ph th pid tid + } + } finally { + # If opts(stdchannels) is not an empty list, we duplicated the handles + # into opts(stdhandles) ourselves so free them + if {[llength $opts(stdchannels)]} { + # Free corresponding handles in opts(stdhandles) + close_handles $opts(stdhandles) + } + } + + # From the Tcl source code - (tclWinPipe.c) + # /* + # * "When an application spawns a process repeatedly, a new thread + # * instance will be created for each process but the previous + # * instances may not be cleaned up. This results in a significant + # * virtual memory loss each time the process is spawned. If there + # * is a WaitForInputIdle() call between CreateProcess() and + # * CloseHandle(), the problem does not occur." PSS ID Number: Q124121 + # */ + # WaitForInputIdle $ph 5000 -- Apparently this is only needed for NT 3.5 + + + if {$opts(returnhandles)} { + return [list $pid $tid $ph $th] + } else { + CloseHandle $th + CloseHandle $ph + return [list $pid $tid] + } +} + +# Wait until the process is ready +proc twapi::process_waiting_for_input {pid args} { + array set opts [parseargs args { + {wait.int 0} + } -maxleftover 0] + + if {$pid == [pid]} { + variable my_process_handle + return [WaitForInputIdle $my_process_handle $opts(wait)] + } + + set hpid [get_process_handle $pid] + trap { + return [WaitForInputIdle $hpid $opts(wait)] + } finally { + CloseHandle $hpid + } +} + + + +# Get a handle to a process +proc twapi::get_process_handle {pid args} { + # OpenProcess masks off the bottom two bits thereby converting + # an invalid pid to a real one. + if {(![string is integer -strict $pid]) || ($pid & 3)} { + win32_error 87 "Invalid PID '$pid'."; # "The parameter is incorrect" + } + array set opts [parseargs args { + {access.arg process_query_information} + {inherit.bool 0} + } -maxleftover 0] + return [OpenProcess [_access_rights_to_mask $opts(access)] $opts(inherit) $pid] +} + +# Return true if passed pid is system +proc twapi::is_system_pid {pid} { + # Note Windows 2000 System PID was 8 but we no longer support it. + return [expr {$pid == 4}] +} + +# Return true if passed pid is of idle process +proc twapi::is_idle_pid {pid} { + return [expr {$pid == 0}] +} + +# Get my process id +proc twapi::get_current_process_id {} { + return [::pid] +} + +# Get my thread id +proc twapi::get_current_thread_id {} { + return [GetCurrentThreadId] +} + +# Get the exit code for a process. Returns "" if still running. +proc twapi::get_process_exit_code {hpid} { + set code [GetExitCodeProcess $hpid] + return [expr {$code == 259 ? "" : $code}] +} + +# Return list of process ids +# Note if -path or -name is specified, then processes for which this +# information cannot be obtained are skipped +proc twapi::get_process_ids {args} { + + set save_args $args; # Need to pass to process_exists + array set opts [parseargs args { + user.arg + path.arg + name.arg + logonsession.arg + glob} -maxleftover 0] + + if {[info exists opts(path)] && [info exists opts(name)]} { + error "Options -path and -name are mutually exclusive" + } + + if {$opts(glob)} { + set match_op ~ + } else { + set match_op eq + } + + # If we do not care about user or path, Twapi_GetProcessList + # is faster than EnumProcesses or the WTS functions + if {[info exists opts(user)] == 0 && + [info exists opts(logonsession)] == 0 && + [info exists opts(path)] == 0} { + if {[info exists opts(name)] == 0} { + return [Twapi_GetProcessList -1 0] + } + # We need to match against the name + return [recordarray column [Twapi_GetProcessList -1 2] -pid \ + -filter [list [list "-name" $match_op $opts(name) -nocase]]] + } + + # Only want pids with a specific user or path or logon session + + # If is the name we are looking for, try using the faster WTS + # API's first. If they are not available, we try a slower method + # If we need to match paths or logon sessions, we don't try this + # at all as the wts api's don't provide that info + if {[info exists opts(path)] == 0 && + [info exists opts(logonsession)] == 0} { + if {![info exists opts(user)]} { + # How did we get here? + error "Internal error - option -user not specified where expected" + } + if {[catch {map_account_to_sid $opts(user)} sid]} { + # No such user. Return empty list (no processes) + return [list ] + } + + if {[info exists opts(name)]} { + set filter_expr [list [list pUserSid eq $sid -nocase] [list pProcessName $match_op $opts(name) -nocase]] + } else { + set filter_expr [list [list pUserSid eq $sid -nocase]] + } + + # Catch failures so we can try other means + if {! [catch {recordarray column [WTSEnumerateProcesses NULL] \ + ProcessId -filter $filter_expr} wtslist]} { + return $wtslist + } + } + + set process_pids [list ] + + + # Either we are matching on path/logonsession, or the WTS call failed + # Try yet another way. + + # Note that in the code below, we use "file join" with a single arg + # to convert \ to /. Do not use file normalize as that will also + # land up converting relative paths to full paths + if {[info exists opts(path)]} { + set opts(path) [file join $opts(path)] + } + + set process_pids [list ] + if {[info exists opts(name)]} { + # Note we may reach here if the WTS call above failed + set all_pids [recordarray column [Twapi_GetProcessList -1 2] ProcessId -filter [list [list ProcessName $match_op $opts(name) -nocase]]] + } else { + set all_pids [Twapi_GetProcessList -1 0] + } + + set filter_expr {} + set popts [list ] + if {[info exists opts(path)]} { + lappend popts -path + lappend filter_expr [list -path $match_op $opts(path) -nocase] + } + + if {[info exists opts(user)]} { + lappend popts -user + lappend filter_expr [list -user eq $opts(user) -nocase] + } + if {[info exists opts(logonsession)]} { + lappend popts -logonsession + lappend filter_expr [list -logonsession eq $opts(logonsession) -nocase] + } + + + set matches [recordarray get [get_multiple_process_info -matchpids $all_pids {*}$popts] -filter $filter_expr] + return [recordarray column $matches -pid] +} + +proc twapi::get_process_memory_info {{pid {}}} { + variable my_process_handle + + if {$pid eq "" || $pid == [pid]} { + set hpid $my_process_handle + } else { + set hpid [get_process_handle $pid -access {process_query_information process_vm_read}] + } + + try { + # Note: -pagefileusage and -privateusage are same according to SDK. + # However for Win7 and earlier, -pagefileusage is always set to 0. + # We return what was given and not try to fix it up. + return [twine { + -pagefaults -workingsetpeak -workingset + -poolpagedbytespeak -poolpagedbytes + -poolnonpagedbytespeak -poolnonpagedbytes + -pagefilebytes -pagefilebytespeak -privatebytes + } [GetProcessMemoryInfo $hpid]] + } finally { + if {$hpid != $my_process_handle} { + CloseHandle $hpid + } + } +} + +# Return list of modules handles for a process +proc twapi::get_process_modules {pid args} { + variable my_process_handle + + array set opts [parseargs args {handle name path base size entry all}] + + if {$opts(all)} { + foreach opt {handle name path base size entry} { + set opts($opt) 1 + } + } + set noopts [expr {($opts(name) || $opts(path) || $opts(base) || $opts(size) || $opts(entry) || $opts(handle)) == 0}] + + if {! $noopts} { + # Returning a record array + set fields {} + # ORDER MUST be same a value order below + foreach opt {handle name path base size entry} { + if {$opts($opt)} { + lappend fields -$opt + } + } + + } + + if {$pid == [pid]} { + set hpid $my_process_handle + } else { + set hpid [get_process_handle $pid -access {process_query_information process_vm_read}] + } + + set results [list ] + trap { + foreach module [EnumProcessModules $hpid] { + if {$noopts} { + lappend results $module + continue + } + set rec {} + if {$opts(handle)} { + lappend rec $module + } + if {$opts(name)} { + if {[catch {GetModuleBaseName $hpid $module} name]} { + set name "" + } + lappend rec $name + } + if {$opts(path)} { + if {[catch {GetModuleFileNameEx $hpid $module} path]} { + set path "" + } + lappend rec [_normalize_path $path] + } + if {$opts(base) || $opts(size) || $opts(entry)} { + if {[catch {GetModuleInformation $hpid $module} imagedata]} { + set base "" + set size "" + set entry "" + } else { + lassign $imagedata base size entry + } + foreach opt {base size entry} { + if {$opts($opt)} { + lappend rec [set $opt] + } + } + } + lappend results $rec + } + } finally { + if {$hpid != $my_process_handle} { + CloseHandle $hpid + } + } + + if {$noopts} { + return $results + } else { + return [list $fields $results] + } +} + + +# Kill a process +# Returns 1 if process was ended, 0 if not ended within timeout +proc twapi::end_process {pid args} { + + if {$pid == [pid]} { + error "The passed PID is the PID of the current process. end_process cannot be used to commit suicide." + } + + array set opts [parseargs args { + {exitcode.int 1} + force + {wait.int 0} + }] + + # In order to verify the process is really gone, we open the process + # if possible and then wait on its handle. If access restrictions prevent + # us from doing so, we ignore the issue and will simply check for the + # the PID later (which is not a sure check since PID's can be reused + # immediately) + catch {set hproc [get_process_handle $pid -access synchronize]} + + # First try to close nicely. We need to send messages to toplevels + # as well as message-only windows. We could make use of get_toplevel_windows + # and find_windows but those would require pulling in the whole + # twapi_ui package so do it ourselves. + set toplevels {} + foreach toplevel [EnumWindows] { + # Check if it belongs to pid. Errors are ignored, we simply + # will not send a message to that window + catch { + if {[lindex [GetWindowThreadProcessId $toplevel] 1] == $pid} { + lappend toplevels $toplevel + } + } + } + # Repeat for message only windows as EnumWindows skips them + set prev 0 + while {1} { + # Again, errors are ignored + # -3 -> HWND_MESSAGE windows + if {[catch { + set toplevel [FindWindowEx [list -3 HWND] $prev "" ""] + }]} { + break + } + if {[pointer_null? $toplevel]} break + catch { + if {[lindex [GetWindowThreadProcessId $toplevel] 1] == $pid} { + lappend toplevels $toplevel + } + } + set prev $toplevel + } + + if {[llength $toplevels]} { + # Try and close by sending them a message. WM_CLOSE is 0x10 + foreach toplevel $toplevels { + # Send a message but come back right away + # See Bug #139 as to why PostMessage instead of SendNotifyMessage + catch {PostMessage $toplevel 0x10 0 0} + } + + # Wait for the specified time to verify process has gone away + if {[info exists hproc]} { + set status [WaitForSingleObject $hproc $opts(wait)] + CloseHandle $hproc + set gone [expr {! $status}] + } else { + # We could not get a process handle to wait on, just check if + # PID still exists. This COULD be a false positive... + set gone [twapi::wait {process_exists $pid} 0 $opts(wait)] + } + if {$gone || ! $opts(force)} { + # Succeeded or do not want to force a kill + return $gone + } + + # Only wait 10 ms since we have already waited above + if {$opts(wait)} { + set opts(wait) 10 + } + } + + # Open the process for terminate access. IF access denied (5), retry after + # getting the required privilege + trap { + set hproc [get_process_handle $pid -access {synchronize process_terminate}] + } onerror {TWAPI_WIN32 5} { + # Retry - if still fail, then just throw the error + eval_with_privileges { + set hproc [get_process_handle $pid -access {synchronize process_terminate}] + } SeDebugPrivilege + } onerror {TWAPI_WIN32 87} { + # Process does not exist, we must have succeeded above but just + # took a bit longer for it to exit + return 1 + } + + trap { + TerminateProcess $hproc $opts(exitcode) + set status [WaitForSingleObject $hproc $opts(wait)] + if {$status == 0} { + return 1 + } + } finally { + CloseHandle $hproc + } + + return 0 +} + +# Get the path of a process +proc twapi::get_process_path {pid args} { + return [twapi::_get_process_name_path_helper $pid path {*}$args] +} + +# Get the path of a process +proc twapi::get_process_name {pid args} { + return [twapi::_get_process_name_path_helper $pid name {*}$args] +} + + +# Return list of device drivers +proc twapi::get_device_drivers {args} { + array set opts [parseargs args {name path base all}] + + set fields {} + # Order MUST be same as order of values below + foreach opt {base name path} { + if {$opts($opt) || $opts(all)} { + lappend fields -$opt + } + } + + set results [list ] + foreach module [EnumDeviceDrivers] { + unset -nocomplain rec + if {$opts(base) || $opts(all)} { + lappend rec $module + } + if {$opts(name) || $opts(all)} { + if {[catch {GetDeviceDriverBaseName $module} name]} { + set name "" + } + lappend rec $name + } + if {$opts(path) || $opts(all)} { + if {[catch {GetDeviceDriverFileName $module} path]} { + set path "" + } + lappend rec [_normalize_path $path] + } + if {[info exists rec]} { + lappend results $rec + } + } + + return [list $fields $results] +} + +# Check if the given process exists +# 0 - does not exist or exists but paths/names do not match, +# 1 - exists and matches path (or no -path or -name specified) +# -1 - exists but do not know path and cannot compare +proc twapi::process_exists {pid args} { + array set opts [parseargs args { path.arg name.arg glob}] + + # Simplest case - don't care about name or path + if {! ([info exists opts(path)] || [info exists opts(name)])} { + if {$pid == [pid]} { + return 1 + } + # TBD - would it be faster to do OpenProcess ? If success or + # access denied, process exists. + + if {[llength [Twapi_GetProcessList $pid 0]] == 0} { + return 0 + } else { + return 1 + } + } + + # Can't specify both name and path + if {[info exists opts(path)] && [info exists opts(name)]} { + error "Options -path and -name are mutually exclusive" + } + + if {$opts(glob)} { + set string_cmd match + } else { + set string_cmd equal + } + + if {[info exists opts(name)]} { + # Name is specified + set pidlist [Twapi_GetProcessList $pid 2] + if {[llength $pidlist] == 0} { + return 0 + } + return [string $string_cmd -nocase $opts(name) [lindex $pidlist 1 0 1]] + } + + # Need to match on the path + set process_path [get_process_path $pid -noexist "" -noaccess "(unknown)"] + if {[string length $process_path] == 0} { + # No such process + return 0 + } + + # Process with this pid exists + # Path still has to match + if {[string equal $process_path "(unknown)"]} { + # Exists but cannot check path/name + return -1 + } + + # Note we do not use file normalize here since that will tack on + # absolute paths which we do not want for glob matching + + # We use [file join ] to convert \ to / to avoid special + # interpretation of \ in string match command + return [string $string_cmd -nocase [file join $opts(path)] [file join $process_path]] +} + +# Get the parent process of a thread. Return "" if no such thread +proc twapi::get_thread_parent_process_id {tid} { + set status [catch { + set th [get_thread_handle $tid] + trap { + set pid [lindex [lindex [Twapi_NtQueryInformationThreadBasicInformation $th] 2] 0] + } finally { + CloseHandle $th + } + }] + + if {$status == 0} { + return $pid + } + + + # Could not use undocumented function. Try slooooow perf counter method + set pid_paths [get_perf_thread_counter_paths $tid -pid] + if {[llength $pid_paths] == 0} { + return "" + } + + if {[pdh_counter_path_value [lindex [lindex $pid_paths 0] 3] -var pid]} { + return $pid + } else { + return "" + } +} + +# Get the thread ids belonging to a process +proc twapi::get_process_thread_ids {pid} { + return [recordarray cell [get_multiple_process_info -matchpids [list $pid] -tids] 0 -tids] +} + + +# Get process information +proc twapi::get_process_info {pid args} { + # To avert a common mistake where pid is unspecified, use current pid + # so [get_process_info -name] becomes [get_process_info [pid] -name] + # TBD - should this be documented ? + + if {![string is integer -strict $pid]} { + set args [linsert $args 0 $pid] + set pid [pid] + } + + set rec [recordarray index [get_multiple_process_info {*}$args -matchpids [list $pid]] 0 -format dict] + if {"-pid" ni $args && "-all" ni $args} { + dict unset rec -pid + } + return $rec +} + + +# Get multiple process information +# TBD - document and write tests +proc twapi::get_multiple_process_info {args} { + + # Options that are directly available from Twapi_GetProcessList + # Dict value is the flags to pass to Twapi_GetProcessList + set base_opts { + basepriority 1 + parent 1 tssession 1 + name 2 + createtime 4 usertime 4 + privilegedtime 4 handlecount 4 + threadcount 4 + pagefaults 8 pagefilebytes 8 + pagefilebytespeak 8 poolnonpagedbytes 8 + poolnonpagedbytespeak 8 poolpagedbytes 8 + poolpagedbytespeak 8 virtualbytes 8 + virtualbytespeak 8 workingset 8 + workingsetpeak 8 + ioreadops 16 iowriteops 16 + iootherops 16 ioreadbytes 16 + iowritebytes 16 iootherbytes 16 + } + # Options that also dependent on Twapi_GetProcessList but not + # directly available + set base_calc_opts { elapsedtime 4 tids 32 } + + # Note -user is also a potential token opt but not listed below + # because it can be gotten by other means + set token_opts { + disabledprivileges elevation enabledprivileges groupattrs groups groupsids + integrity integritylabel logonsession primarygroup primarygroupsid + privileges restrictedgroupattrs restrictedgroups virtualized + } + + set optdefs [lconcat {all pid user path commandline priorityclass {noexist.arg {(no such process)}} {noaccess.arg {(unknown)}} matchpids.arg} \ + [dict keys $base_opts] \ + [dict keys $base_calc_opts] \ + $token_opts] + array set opts [parseargs args $optdefs -maxleftover 0] + set opts(pid) 1; # Always return pid, -pid option is for backward compat + + if {[info exists opts(matchpids)]} { + set pids $opts(matchpids) + } else { + set pids [Twapi_GetProcessList -1 0] + } + + set now [get_system_time] + + # We will return a record array. $records tracks a dict of record + # values keyed by pid, $fields tracks the names in the list elements + # [llength $fields] == [llength [lindex $records *]] + set records {} + set fields {} + + # If user is requested, try getting it through terminal services + # if possible since the token method fails on some newer platforms + if {$opts(all) || $opts(user)} { + _get_wts_pids wtssids wtsnames + } + + # See if any Twapi_GetProcessList options are requested and if + # so, calculate the appropriate flags + set baseflags 0 + set basenoexistvals {} + dict for {opt flag} $base_opts { + if {$opts($opt) || $opts(all)} { + set baseflags [expr {$baseflags | $flag}] + lappend basefields -$opt + lappend basenoexistvals $opts(noexist) + } + } + dict for {opt flag} $base_calc_opts { + if {$opts($opt) || $opts(all)} { + set baseflags [expr {$baseflags | $flag}] + } + } + + # See if we need to retrieve any base options + if {$baseflags} { + set pidarg [expr {[llength $pids] == 1 ? [lindex $pids 0] : -1}] + set data [twapi::Twapi_GetProcessList $pidarg [expr {$baseflags|1}]] + if {$opts(all) || $opts(elapsedtime) || $opts(tids)} { + array set baserawdata [recordarray getdict $data -key "-pid" -format dict] + } + if {[info exists basefields]} { + set fields $basefields + set records [recordarray getdict $data -slice $basefields -key "-pid"] + } + } + if {$opts(pid)} { + lappend fields -pid + } + foreach pid $pids { + # If base values were requested, but this pid does not exist + # use the "noexist" values + if {![dict exists $records $pid]} { + dict set records $pid $basenoexistvals + } + if {$opts(pid)} { + dict lappend records $pid $pid + } + } + + # If all we need are baseline options, and no massaging is required + # (as for elapsedtime, for example), we can return what we have + # without looping through below. Saves significant time. + set done 1 + foreach opt [list all user elapsedtime tids path commandline priorityclass \ + {*}$token_opts] { + if {$opts($opt)} { + set done 0 + break + } + } + + if {$done} { + set return_data {} + foreach pid $pids { + lappend return_data [dict get $records $pid] + } + return [list $fields $return_data] + } + + set requested_token_opts {} + foreach opt $token_opts { + if {$opts(all) || $opts($opt)} { + lappend requested_token_opts -$opt + } + } + + if {$opts(elapsedtime) || $opts(all)} { + lappend fields -elapsedtime + foreach pid $pids { + if {[info exists baserawdata($pid)]} { + set elapsed [twapi::kl_get $baserawdata($pid) -createtime] + if {$elapsed} { + # 100ns -> seconds + dict lappend records $pid [expr {($now-$elapsed)/10000000}] + } else { + # For some processes like, System and Idle, kernel + # returns start time of 0. Just use system uptime + if {![info exists system_uptime]} { + # Store locally so no refetch on each iteration + set system_uptime [get_system_uptime] + } + dict lappend records $pid $system_uptime + } + } else { + dict lappend records $pid $opts(noexist) + } + } + } + + if {$opts(tids) || $opts(all)} { + lappend fields -tids + foreach pid $pids { + if {[info exists baserawdata($pid)]} { + dict lappend records $pid [recordarray column [kl_get $baserawdata($pid) Threads] -tid] + } else { + dict lappend records $pid $opts(noexist) + } + } + } + + if {$opts(all) || $opts(path)} { + lappend fields -path + foreach pid $pids { + dict lappend records $pid [get_process_path $pid -noexist $opts(noexist) -noaccess $opts(noaccess)] + } + } + + if {$opts(all) || $opts(priorityclass)} { + lappend fields -priorityclass + foreach pid $pids { + trap { + set prioclass [get_priority_class $pid] + } onerror {TWAPI_WIN32 5} { + set prioclass $opts(noaccess) + } onerror {TWAPI_WIN32 87} { + set prioclass $opts(noexist) + } + dict lappend records $pid $prioclass + } + } + + if {$opts(all) || $opts(commandline)} { + lappend fields -commandline + foreach pid $pids { + dict lappend records $pid [get_process_commandline $pid -noexist $opts(noexist) -noaccess $opts(noaccess)] + } + } + + + if {$opts(all) || $opts(user) || [llength $requested_token_opts]} { + foreach pid $pids { + # Now get token related info, if any requested + # For returning as a record array, we have to be careful that + # each field is added in a specific order for every pid + # keeping in mind a different method might be used for different + # pids. So we collect the data in dictionary token_records and add + # at the end in a fixed order + set token_records {} + set requested_opts $requested_token_opts + unset -nocomplain user + if {$opts(all) || $opts(user)} { + # See if we already have the user. Note sid of system idle + # will be empty string + if {[info exists wtssids($pid)]} { + if {$wtssids($pid) == ""} { + # Put user as System + set user SYSTEM + } else { + # We speed up account lookup by caching sids + if {[info exists sidcache($wtssids($pid))]} { + set user $sidcache($wtssids($pid)) + } else { + set user [lookup_account_sid $wtssids($pid)] + set sidcache($wtssids($pid)) $user + } + } + } else { + lappend requested_opts -user + } + } + + if {[llength $requested_opts]} { + trap { + dict set token_records $pid [_token_info_helper -pid $pid {*}$requested_opts] + } onerror {TWAPI_WIN32 5} { + foreach opt $requested_opts { + dict set token_records $pid $opt $opts(noaccess) + } + # The NETWORK SERVICE and LOCAL SERVICE processes cannot + # be accessed. If we are looking for the logon session for + # these, try getting it from the witssid if we have it + # since the logon session is hardcoded for these accounts + if {"-logonsession" in $requested_opts} { + if {![info exists wtssids]} { + _get_wts_pids wtssids wtsnames + } + if {[info exists wtssids($pid)]} { + # Map user SID to logon session + switch -exact -- $wtssids($pid) { + S-1-5-18 { + # SYSTEM + dict set token_records $pid -logonsession 00000000-000003e7 + } + S-1-5-19 { + # LOCAL SERVICE + dict set token_records $pid -logonsession 00000000-000003e5 + } + S-1-5-20 { + # LOCAL SERVICE + dict set token_records $pid -logonsession 00000000-000003e4 + } + } + } + } + + # Similarly, if we are looking for user account, special case + # system and system idle processes + if {"-user" in $requested_opts} { + if {[is_idle_pid $pid] || [is_system_pid $pid]} { + set user SYSTEM + } else { + set user $opts(noaccess) + } + } + + } onerror {TWAPI_WIN32 87} { + foreach opt $requested_opts { + if {$opt eq "-user"} { + if {[is_idle_pid $pid] || [is_system_pid $pid]} { + set user SYSTEM + } else { + set user $opts(noexist) + } + } else { + dict set token_records $pid $opt $opts(noexist) + } + } + } + } + # Now add token values in a specific order - MUST MATCH fields BELOW + if {$opts(all) || $opts(user)} { + # TBD - BUG - user is supposed to be set to *something* by this + # point but WiTS throws error every blue moon on this line that + # user is not defined. Workaround. + if {![info exists user]} { + set user $opts(noaccess) + } + dict lappend records $pid $user + } + foreach opt $requested_token_opts { + if {[dict exists $token_records $pid $opt]} { + dict lappend records $pid [dict get $token_records $pid $opt] + } + } + } + # Now add token field names in a specific order - MUST MATCH ABOVE + if {$opts(all) || $opts(user)} { + lappend fields -user + } + foreach opt $requested_token_opts { + if {[dict exists $token_records $pid $opt]} { + lappend fields $opt + } + } + } + + set return_data {} + foreach pid $pids { + lappend return_data [dict get $records $pid] + } + return [list $fields $return_data] +} + + + +# Get thread information +# TBD - add info from GetGUIThreadInfo +proc twapi::get_thread_info {tid args} { + # TBD - modify so tid is optional like for get_process_info + + # Options that are directly available from Twapi_GetProcessList + if {![info exists ::twapi::get_thread_info_base_opts]} { + # Array value is the flags to pass to Twapi_GetProcessList + array set ::twapi::get_thread_info_base_opts { + pid 32 + elapsedtime 96 + waittime 96 + usertime 96 + createtime 96 + privilegedtime 96 + contextswitches 96 + basepriority 160 + priority 160 + startaddress 160 + state 160 + waitreason 160 + } + } + + set token_opts { + user + primarygroup + primarygroupsid + groups + groupsids + restrictedgroups + groupattrs + restrictedgroupattrs + privileges + enabledprivileges + disabledprivileges + } + + array set opts [parseargs args \ + [concat [list all \ + relativepriority \ + tid \ + [list noexist.arg "(no such thread)"] \ + [list noaccess.arg "(unknown)"]] \ + [array names ::twapi::get_thread_info_base_opts] \ + $token_opts ]] + + set requested_opts [_array_non_zero_switches opts $token_opts $opts(all)] + # Now get token info, if any + if {[llength $requested_opts]} { + trap { + trap { + set results [_token_info_helper -tid $tid {*}$requested_opts] + } onerror {TWAPI_WIN32 1008} { + # Thread does not have its own token. Use it's parent process + set results [_token_info_helper -pid [get_thread_parent_process_id $tid] {*}$requested_opts] + } + } onerror {TWAPI_WIN32 5} { + # No access + foreach opt $requested_opts { + lappend results $opt $opts(noaccess) + } + } onerror {TWAPI_WIN32 87} { + # Thread does not exist + foreach opt $requested_opts { + lappend results $opt $opts(noexist) + } + } + + } else { + set results [list ] + } + + # Now get the base options + set flags 0 + foreach opt [array names ::twapi::get_thread_info_base_opts] { + if {$opts($opt) || $opts(all)} { + set flags [expr {$flags | $::twapi::get_thread_info_base_opts($opt)}] + } + } + + if {$flags} { + # We need at least one of the base options + foreach tdata [recordarray column [twapi::Twapi_GetProcessList -1 $flags] Threads] { + set tdict [recordarray getdict $tdata -key "-tid" -format dict] + if {[dict exists $tdict $tid]} { + array set threadinfo [dict get $tdict $tid] + break + } + } + # It is possible that we looped through all the processes without + # a thread match. Hence we check again that we have threadinfo for + # each option value + foreach opt { + pid + waittime + usertime + createtime + privilegedtime + basepriority + priority + startaddress + state + waitreason + contextswitches + } { + if {$opts($opt) || $opts(all)} { + if {[info exists threadinfo]} { + lappend results -$opt $threadinfo(-$opt) + } else { + lappend results -$opt $opts(noexist) + } + } + } + + if {$opts(elapsedtime) || $opts(all)} { + if {[info exists threadinfo(-createtime)]} { + lappend results -elapsedtime [expr {[clock seconds]-[large_system_time_to_secs $threadinfo(-createtime)]}] + } else { + lappend results -elapsedtime $opts(noexist) + } + } + } + + + if {$opts(all) || $opts(relativepriority)} { + trap { + lappend results -relativepriority [get_thread_relative_priority $tid] + } onerror {TWAPI_WIN32 5} { + lappend results -relativepriority $opts(noaccess) + } onerror {TWAPI_WIN32 87} { + lappend results -relativepriority $opts(noexist) + } + } + + if {$opts(all) || $opts(tid)} { + lappend results -tid $tid + } + + return $results +} + +# Get a handle to a thread +proc twapi::get_thread_handle {tid args} { + # OpenThread masks off the bottom two bits thereby converting + # an invalid tid to a real one. We do not want this. + if {$tid & 3} { + win32_error 87; # "The parameter is incorrect" + } + + array set opts [parseargs args { + {access.arg thread_query_information} + {inherit.bool 0} + }] + return [OpenThread [_access_rights_to_mask $opts(access)] $opts(inherit) $tid] +} + +# Suspend a thread +proc twapi::suspend_thread {tid} { + set htid [get_thread_handle $tid -access thread_suspend_resume] + trap { + set status [SuspendThread $htid] + } finally { + CloseHandle $htid + } + return $status +} + +# Resume a thread +proc twapi::resume_thread {tid} { + set htid [get_thread_handle $tid -access thread_suspend_resume] + trap { + set status [ResumeThread $htid] + } finally { + CloseHandle $htid + } + return $status +} + +# Get the command line for a process +proc twapi::get_process_commandline {pid args} { + + if {[is_system_pid $pid] || [is_idle_pid $pid]} { + return "" + } + + array set opts [parseargs args { + {noexist.arg "(no such process)"} + {noaccess.arg "(unknown)"} + }] + + trap { + # Assume max command line len is 1024 chars (2048 bytes) + trap { + set hpid [get_process_handle $pid -access {process_query_information process_vm_read}] + } onerror {TWAPI_WIN32 87} { + # Process does not exist + return $opts(noexist) + } + + # Get the address where the PEB is stored - see Nebbett + set peb_addr [lindex [Twapi_NtQueryInformationProcessBasicInformation $hpid] 1] + + # Read the PEB as binary + # The pointer to the process parameter block is the 5th pointer field. + # The struct looks like: + # 32 bit - + # typedef struct _PEB { + # BYTE Reserved1[2]; + # BYTE BeingDebugged; + # BYTE Reserved2[1]; + # PVOID Reserved3[2]; + # PPEB_LDR_DATA Ldr; + # PRTL_USER_PROCESS_PARAMETERS ProcessParameters; + # BYTE Reserved4[104]; + # PVOID Reserved5[52]; + # PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine; + # BYTE Reserved6[128]; + # PVOID Reserved7[1]; + # ULONG SessionId; + # } PEB, *PPEB; + # 64 bit - + # typedef struct _PEB { + # BYTE Reserved1[2]; + # BYTE BeingDebugged; + # BYTE Reserved2[21]; + # PPEB_LDR_DATA LoaderData; + # PRTL_USER_PROCESS_PARAMETERS ProcessParameters; + # BYTE Reserved3[520]; + # PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine; + # BYTE Reserved4[136]; + # ULONG SessionId; + # } PEB; + # So in both cases the pointer is 4 pointers from the start + + if {[info exists ::tcl_platform(pointerSize)]} { + set pointer_size $::tcl_platform(pointerSize) + } else { + set pointer_size 4 + } + if {$pointer_size == 4} { + set pointer_scanner n + } else { + set pointer_scanner m + } + set mem [ReadProcessMemory $hpid [expr {$peb_addr+(4*$pointer_size)}] $pointer_size] + if {![binary scan $mem $pointer_scanner proc_param_addr]} { + error "Could not read PEB of process $pid" + } + + # Now proc_param_addr contains the address of the Process parameter + # structure which looks like: + # typedef struct _RTL_USER_PROCESS_PARAMETERS { + # Offsets: x86 x64 + # BYTE Reserved1[16]; 0 0 + # PVOID Reserved2[10]; 16 16 + # UNICODE_STRING ImagePathName; 56 96 + # UNICODE_STRING CommandLine; 64 112 + # } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS; + # UNICODE_STRING is defined as + # typedef struct _UNICODE_STRING { + # USHORT Length; + # USHORT MaximumLength; + # PWSTR Buffer; + # } UNICODE_STRING; + + # Note - among twapi supported builds, tcl_platform(pointerSize) + # not existing implies 32-bits + if {[info exists ::tcl_platform(pointerSize)] && + $::tcl_platform(pointerSize) == 8} { + # Read the CommandLine field + set mem [ReadProcessMemory $hpid [expr {$proc_param_addr + 112}] 16] + if {![binary scan $mem tutunum cmdline_bytelen cmdline_bufsize unused cmdline_addr]} { + error "Could not get address of command line" + } + } else { + # Read the CommandLine field + set mem [ReadProcessMemory $hpid [expr {$proc_param_addr + 64}] 8] + if {![binary scan $mem tutunu cmdline_bytelen cmdline_bufsize cmdline_addr]} { + error "Could not get address of command line" + } + } + + if {1} { + if {$cmdline_bytelen == 0} { + set cmdline "" + } else { + trap { + set mem [ReadProcessMemory $hpid $cmdline_addr $cmdline_bytelen] + } onerror {TWAPI_WIN32 299} { + # ERROR_PARTIAL_COPY + # Rumour has it this can be a transient error if the + # process is initializing, so try once more + Sleep 0; # Relinquish control to OS to run other process + # Retry + set mem [ReadProcessMemory $hpid $cmdline_addr $cmdline_bytelen] + } + } + } else { + THIS CODE NEEDS TO BE MODIFIED IF REINSTATED. THE ReadProcessMemory + parameters have changed + # Old pre-2.3 code + # Now read the command line itself. We do not know the length + # so assume MAX_PATH (1024) chars (2048 bytes). However, this may + # fail if the memory beyond the command line is not allocated in the + # target process. So we have to check for this error and retry with + # smaller read sizes + set max_len 2048 + while {$max_len > 128} { + trap { + ReadProcessMemory $hpid $cmdline_addr $pgbl $max_len + break + } onerror {TWAPI_WIN32 299} { + # Reduce read size + set max_len [expr {$max_len / 2}] + } + } + # OK, got something. It's in Unicode format, may not be null terminated + # or may have multiple null terminated strings. THe command line + # is the first string. + } + set cmdline [encoding convertfrom unicode $mem] + set null_offset [string first "\0" $cmdline] + if {$null_offset >= 0} { + set cmdline [string range $cmdline 0 [expr {$null_offset-1}]] + } + + } onerror {TWAPI_WIN32 5} { + # Access denied + set cmdline $opts(noaccess) + } onerror {TWAPI_WIN32 299} { + # Only part of the Read* could be completed + # Access denied + set cmdline $opts(noaccess) + } onerror {TWAPI_WIN32 87} { + # The parameter is incorrect + # Access denied (or should it be noexist?) + set cmdline $opts(noaccess) + } finally { + if {[info exists hpid]} { + CloseHandle $hpid + } + } + + return $cmdline +} + + +# Get process parent - can return "" +proc twapi::get_process_parent {pid args} { + array set opts [parseargs args { + {noexist.arg "(no such process)"} + {noaccess.arg "(unknown)"} + }] + + if {[is_system_pid $pid] || [is_idle_pid $pid]} { + return "" + } + + trap { + set parent [recordarray cell [twapi::Twapi_GetProcessList $pid 1] 0 InheritedFromProcessId] + if {$parent ne ""} { + return $parent + } + } onerror {} { + # Just try the other methods below + } + + trap { + set hpid [get_process_handle $pid] + return [lindex [Twapi_NtQueryInformationProcessBasicInformation $hpid] 5] + + } onerror {TWAPI_WIN32 5} { + set error noaccess + } onerror {TWAPI_WIN32 87} { + set error noexist + } finally { + if {[info exists hpid]} { + CloseHandle $hpid + } + } + + return $opts($error) +} + +# Get the base priority class of a process +proc twapi::get_priority_class {pid} { + set ph [get_process_handle $pid] + trap { + return [GetPriorityClass $ph] + } finally { + CloseHandle $ph + } +} + +# Get the base priority class of a process +proc twapi::set_priority_class {pid priority} { + if {$pid == [pid]} { + variable my_process_handle + SetPriorityClass $my_process_handle $priority + return + } + + set ph [get_process_handle $pid -access process_set_information] + trap { + SetPriorityClass $ph $priority + } finally { + CloseHandle $ph + } +} + +# Get the priority of a thread +proc twapi::get_thread_relative_priority {tid} { + set h [get_thread_handle $tid] + trap { + return [GetThreadPriority $h] + } finally { + CloseHandle $h + } +} + +# Set the priority of a thread +proc twapi::set_thread_relative_priority {tid priority} { + switch -exact -- $priority { + abovenormal { set priority 1 } + belownormal { set priority -1 } + highest { set priority 2 } + idle { set priority -15 } + lowest { set priority -2 } + normal { set priority 0 } + timecritical { set priority 15 } + default { + if {![string is integer -strict $priority]} { + error "Invalid priority value '$priority'." + } + } + } + + set h [get_thread_handle $tid -access thread_set_information] + trap { + SetThreadPriority $h $priority + } finally { + CloseHandle $h + } +} + +# Return type of process elevation +proc twapi::get_process_elevation {args} { + lappend args -elevation + return [lindex [_token_info_helper $args] 1] +} + +# Return integrity level of process +proc twapi::get_process_integrity {args} { + lappend args -integrity + return [lindex [_token_info_helper $args] 1] +} + +# Return whether a process is running under WoW64 +proc twapi::wow64_process {args} { + array set opts [parseargs args { + pid.arg + hprocess.arg + } -maxleftover 0] + + if {[info exists opts(hprocess)]} { + if {[info exists opts(pid)]} { + error "Options -pid and -hprocess cannot be used together." + } + return [IsWow64Process $opts(hprocess)] + } + + if {[info exists opts(pid)] && $opts(pid) != [pid]} { + trap { + set hprocess [get_process_handle $opts(pid)] + return [IsWow64Process $hprocess] + } finally { + if {[info exists hprocess]} { + CloseHandle $hprocess + } + } + } + + # Common case - checking about ourselves + variable my_process_handle + return [IsWow64Process $my_process_handle] +} + +# Check whether a process is virtualized +proc twapi::virtualized_process {args} { + lappend args -virtualized + return [lindex [_token_info_helper $args] 1] +} + +proc twapi::set_process_integrity {level args} { + lappend args -integrity $level + _token_set_helper $args +} + +proc twapi::set_process_virtualization {enable args} { + lappend args -virtualized $enable + _token_set_helper $args +} + +# Map a process handle to its pid +proc twapi::get_pid_from_handle {hprocess} { + return [lindex [Twapi_NtQueryInformationProcessBasicInformation $hprocess] 4] +} + +# Check if current process is an administrative process or not +proc twapi::process_in_administrators {} { + + # Administrators group SID - S-1-5-32-544 + + if {[get_process_elevation] ne "limited"} { + return [CheckTokenMembership NULL S-1-5-32-544] + } + + # When running as with a limited token under UAC, we cannot check + # if the process is in administrators group or not since the group + # will be disabled in the token. Rather, we need to get the linked + # token (which is unfiltered) and check that. + set tok [lindex [_token_info_helper -linkedtoken] 1] + trap { + return [CheckTokenMembership $tok S-1-5-32-544] + } finally { + close_token $tok + } +} + +# Get a module handle +proc twapi::get_module_handle {args} { + array set opts [parseargs args { + path.arg + pin.bool + } -nulldefault -maxleftover 0] + + return [GetModuleHandleEx $opts(pin) [file nativename $opts(path)]] +} + +# Get a module handle from an address +proc twapi::get_module_handle_from_address {addr args} { + array set opts [parseargs args { + pin.bool + } -nulldefault -maxleftover 0] + + return [GetModuleHandleEx [expr {$opts(pin) ? 5 : 4}] $addr] +} + + +proc twapi::load_user_profile {token args} { + # PI_NOUI -> 0x1 + parseargs args { + username.arg + {noui.bool 0 0x1} + defaultuserpath.arg + servername.arg + roamingprofilepath.arg + } -maxleftover 0 -setvars -nulldefault + + if {$username eq ""} { + set username [get_token_user $token -name] + } + + return [eval_with_privileges { + LoadUserProfile [list $token $noui $username $roamingprofilepath $defaultuserpath $servername] + } {SeRestorePrivilege SeBackupPrivilege}] +} + +# TBD - document +proc twapi::get_profile_type {} { + return [dict* {0 local 1 temporary 2 roaming 4 mandatory} [GetProfileType]] +} + + +proc twapi::_env_block_to_dict {block normalize} { + set env_dict {} + foreach env_str $block { + set pos [string first = $env_str] + set key [string range $env_str 0 $pos-1] + if {$normalize} { + set key [string toupper $key] + } + lappend env_dict $key [string range $env_str $pos+1 end] + } + return $env_dict +} + +proc twapi::get_system_environment_vars {args} { + parseargs args {normalize.bool} -nulldefault -setvars -maxleftover 0 + return [_env_block_to_dict [CreateEnvironmentBlock 0 0] $normalize] +} + +proc twapi::get_user_environment_vars {token args} { + parseargs args {inherit.bool normalize.bool} -nulldefault -setvars -maxleftover 0 + return [_env_block_to_dict [CreateEnvironmentBlock $token $inherit] $normalize] +} + +proc twapi::expand_system_environment_vars {s} { + return [ExpandEnvironmentStringsForUser 0 $s] +} + +proc twapi::expand_user_environment_vars {tok s} { + return [ExpandEnvironmentStringsForUser $tok $s] +} + +# +# Utility procedures + +# Get the path of a process +proc twapi::_get_process_name_path_helper {pid {type name} args} { + + if {$pid == [pid]} { + # It is our process! + set exe [info nameofexecutable] + if {$type eq "name"} { + return [file tail $exe] + } else { + return $exe + } + } + + array set opts [parseargs args { + {noexist.arg "(no such process)"} + {noaccess.arg "(unknown)"} + } -maxleftover 0] + + if {![string is integer $pid]} { + error "Invalid non-numeric pid $pid" + } + if {[is_system_pid $pid]} { + return "System" + } + if {[is_idle_pid $pid]} { + return "System Idle Process" + } + + # Try the quicker way if looking for a name + if {$type eq "name" && + ![catch { + Twapi_GetProcessList $pid 2 + } plist]} { + set name [lindex $plist 1 0 1] + if {$name ne ""} { + return $name + } + } + + # We first try using GetProcessImageFileName as that does not require + # the PROCESS_VM_READ privilege + if {[min_os_version 6 0]} { + set privs [list process_query_limited_information] + } else { + set privs [list process_query_information] + } + + trap { + set hprocess [get_process_handle $pid -access $privs] + set path [GetProcessImageFileName $hprocess] + if {$type eq "name"} { + return [file tail $path] + } + # Returned path is in native format, convert to win32 + return [normalize_device_rooted_path $path] + } onerror {TWAPI_WIN32 87} { + return $opts(noexist) + } onerror {} { + # Other errors, continue on to other methods + } finally { + if {[info exists hprocess]} { + twapi::close_handle $hprocess + } + } + + trap { + set hprocess [get_process_handle $pid -access {process_query_information process_vm_read}] + } onerror {TWAPI_WIN32 87} { + return $opts(noexist) + } onerror {TWAPI_WIN32 5} { + # Access denied + # If it is the name we want, first try WTS and if that + # fails try getting it from PDH (slowest) + + if {[string equal $type "name"]} { + if {! [catch {WTSEnumerateProcesses NULL} precords]} { + + return [lindex [recordarray column $precords pProcessName -filter [list [list ProcessId == $pid]]] 0] + } + + # That failed as well, try PDH. TBD - get rid of PDH + set pdh_path [lindex [lindex [twapi::get_perf_process_counter_paths [list $pid] -pid] 0] 3] + array set pdhinfo [pdh_parse_counter_path $pdh_path] + return $pdhinfo(instance) + } + return $opts(noaccess) + } + + trap { + set module [lindex [EnumProcessModules $hprocess] 0] + if {[string equal $type "name"]} { + set path [GetModuleBaseName $hprocess $module] + } else { + set path [_normalize_path [GetModuleFileNameEx $hprocess $module]] + } + } onerror {TWAPI_WIN32 5} { + # Access denied + # On win2k (and may be Win2k3), if the process has exited but some + # app still has a handle to the process, the OpenProcess succeeds + # but the EnumProcessModules call returns access denied. So + # check for this case + if {[min_os_version 5 0]} { + # Try getting exit code. 259 means still running. + # Anything else means process has terminated + if {[GetExitCodeProcess $hprocess] == 259} { + return $opts(noaccess) + } else { + return $opts(noexist) + } + } else { + rethrow + } + } onerror {TWAPI_WIN32 299} { + # Partial read - usually means either we are WOW64 and target + # is 64bit, or process is exiting / starting and not all mem is + # reachable yet + return $opts(noaccess) + } finally { + CloseHandle $hprocess + } + return $path +} + +# Fill in arrays with result from WTSEnumerateProcesses if available +proc twapi::_get_wts_pids {v_sids v_names} { + # Note this call is expected to fail on NT 4.0 without terminal server + if {! [catch {WTSEnumerateProcesses NULL} precords]} { + upvar $v_sids wtssids + upvar $v_names wtsnames + array set wtssids [recordarray getlist $precords -slice {ProcessId pUserSid} -format flat] + array set wtsnames [recordarray getlist $precords -slice {ProcessId pUserSid} -format flat] + } +} + +# Return various information from a process token +proc twapi::_token_info_helper {args} { + package require twapi_security + proc _token_info_helper {args} { + if {[llength $args] == 1} { + # All options specified as one argument + set args [lindex $args 0] + } + + if {0} { + Following options are passed on to get_token_info: + elevation + virtualized + restrictedgroups + primarygroup + primarygroupsid + privileges + enabledprivileges + disabledprivileges + logonsession + linkedtoken + Option -integrity is not passed on because it has to deal with + -raw and -label options + } + + array set opts [parseargs args { + pid.arg + hprocess.arg + tid.arg + hthread.arg + integrity + raw + label + user + groups + groupsids + } -ignoreunknown] + + if {[expr {[info exists opts(pid)] + [info exists opts(hprocess)] + + [info exists opts(tid)] + [info exists opts(hthread)]}] > 1} { + error "At most one option from -pid, -tid, -hprocess, -hthread can be specified." + } + + if {$opts(user)} { + lappend args -usersid + } + + if {$opts(groups) || $opts(groupsids)} { + lappend args -groupsids + } + + if {[info exists opts(hprocess)]} { + set tok [open_process_token -hprocess $opts(hprocess)] + } elseif {[info exists opts(pid)]} { + set tok [open_process_token -pid $opts(pid)] + } elseif {[info exists opts(hthread)]} { + set tok [open_thread_token -hthread $opts(hthread)] + } elseif {[info exists opts(tid)]} { + set tok [open_thread_token -tid $opts(tid)] + } else { + # Default is current process + set tok [open_process_token] + } + + trap { + array set result [get_token_info $tok {*}$args] + if {[info exists result(-usersid)]} { + set result(-user) [lookup_account_sid $result(-usersid)] + unset result(-usersid) + } + if {[info exists result(-groupsids)]} { + if {$opts(groups)} { + set result(-groups) {} + foreach sid $result(-groupsids) { + if {[catch {lookup_account_sid $sid} gname]} { + lappend result(-groups) $sid + } else { + lappend result(-groups) $gname + } + } + } + if {!$opts(groupsids)} { + unset result(-groupsids) + } + } + if {$opts(integrity)} { + if {$opts(raw)} { + set integrity [get_token_integrity $tok -raw] + } elseif {$opts(label)} { + set integrity [get_token_integrity $tok -label] + } else { + set integrity [get_token_integrity $tok] + } + set result(-integrity) $integrity + } + } finally { + close_token $tok + } + + return [array get result] + } + + return [_token_info_helper {*}$args] +} + +# Set various information for a process token +# Caller assumed to have enabled appropriate privileges +proc twapi::_token_set_helper {args} { + package require twapi_security + + proc _token_set_helper {args} { + if {[llength $args] == 1} { + # All options specified as one argument + set args [lindex $args 0] + } + + array set opts [parseargs args { + virtualized.bool + integrity.arg + {noexist.arg "(no such process)"} + {noaccess.arg "(unknown)"} + pid.arg + hprocess.arg + } -maxleftover 0] + + if {[info exists opts(pid)] && [info exists opts(hprocess)]} { + error "Options -pid and -hprocess cannot be specified together." + } + + # Open token with appropriate access rights depending on request. + set access [list token_adjust_default] + + if {[info exists opts(hprocess)]} { + set tok [open_process_token -hprocess $opts(hprocess) -access $access] + } elseif {[info exists opts(pid)]} { + set tok [open_process_token -pid $opts(pid) -access $access] + } else { + # Default is current process + set tok [open_process_token -access $access] + } + + set result [list ] + trap { + if {[info exists opts(integrity)]} { + set_token_integrity $tok $opts(integrity) + } + if {[info exists opts(virtualized)]} { + set_token_virtualization $tok $opts(virtualized) + } + } finally { + close_token $tok + } + + return $result + } + return [_token_set_helper {*}$args] +} + +# Map console color name to integer attribute +proc twapi::_map_console_color {colors background} { + set attr 0 + foreach color $colors { + switch -exact -- $color { + blue {setbits attr 1} + green {setbits attr 2} + red {setbits attr 4} + white {setbits attr 7} + bright {setbits attr 8} + black { } + default {error "Unknown color name $color"} + } + } + if {$background} { + set attr [expr {$attr << 4}] + } + return $attr +} + diff --git a/src/punk86.vfs/lib/twapi4.7.2/rds.tcl b/src/punk86.vfs/lib/twapi4.7.2/rds.tcl new file mode 100644 index 00000000..9f2757a1 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/rds.tcl @@ -0,0 +1,191 @@ +# +# Copyright (c) 2010, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# Remote Desktop Services - TBD - document and test + +namespace eval twapi {} + +proc twapi::rds_enumerate_sessions {args} { + array set opts [parseargs args { + {hserver.arg 0} + state.arg + } -maxleftover 0] + + set states {active connected connectquery shadow disconnected idle listen reset down init} + if {[info exists opts(state)]} { + if {[string is integer -strict $opts(state)]} { + set state $opts(state) + } else { + set state [lsearch -exact $states $opts(state)] + if {$state < 0} { + error "Invalid value '$opts(state)' specified for -state option." + } + } + } + + set sessions [WTSEnumerateSessions $opts(hserver)] + + if {[info exists state]} { + set sessions [recordarray get $sessions -filter [list [list State == $state]]] + } + + set result {} + foreach {sess rec} [recordarray getdict $sessions -key SessionId -format dict] { + set state [lindex $states [kl_get $rec State]] + if {$state eq ""} { + set state [kl_get $rec State] + } + lappend result $sess [list -tssession [kl_get $rec SessionId] \ + -winstaname [kl_get $rec pWinStationName] \ + -state $state] + } + return $result +} + +proc twapi::rds_disconnect_session args { + array set opts [parseargs args { + {hserver.arg 0} + {tssession.int -1} + {async.bool false} + } -maxleftover 0] + + WTSDisconnectSession $opts(hserver) $opts(tssession) [expr {! $opts(async)}] + +} + +proc twapi::rds_logoff_session args { + array set opts [parseargs args { + {hserver.arg 0} + {tssession.int -1} + {async.bool false} + } -maxleftover 0] + + WTSLogoffSession $opts(hserver) $opts(tssession) [expr {! $opts(async)}] +} + +proc twapi::rds_query_session_information {infoclass args} { + array set opts [parseargs args { + {hserver.arg 0} + {tssession.int -1} + } -maxleftover 0] + + return [WTSQuerySessionInformation $opts(hserver) $opts(tssession) $infoclass] +} + +interp alias {} twapi::rds_get_session_appname {} twapi::rds_query_session_information 1 +interp alias {} twapi::rds_get_session_clientdir {} twapi::rds_query_session_information 11 +interp alias {} twapi::rds_get_session_clientname {} twapi::rds_query_session_information 10 +interp alias {} twapi::rds_get_session_userdomain {} twapi::rds_query_session_information 7 +interp alias {} twapi::rds_get_session_initialprogram {} twapi::rds_query_session_information 0 +interp alias {} twapi::rds_get_session_oemid {} twapi::rds_query_session_information 3 +interp alias {} twapi::rds_get_session_user {} twapi::rds_query_session_information 5 +interp alias {} twapi::rds_get_session_winsta {} twapi::rds_query_session_information 6 +interp alias {} twapi::rds_get_session_intialdir {} twapi::rds_query_session_information 2 +interp alias {} twapi::rds_get_session_clientbuild {} twapi::rds_query_session_information 9 +interp alias {} twapi::rds_get_session_clienthwid {} twapi::rds_query_session_information 13 +interp alias {} twapi::rds_get_session_state {} twapi::rds_query_session_information 8 +interp alias {} twapi::rds_get_session_id {} twapi::rds_query_session_information 4 +interp alias {} twapi::rds_get_session_productid {} twapi::rds_query_session_information 12 +interp alias {} twapi::rds_get_session_protocol {} twapi::rds_query_session_information 16 + + +proc twapi::rds_send_message {args} { + + array set opts [parseargs args { + {hserver.arg 0} + tssession.int + title.arg + message.arg + {buttons.arg ok} + {icon.arg information} + defaultbutton.arg + {modality.arg task {task appl application system}} + {justify.arg left {left right}} + rtl.bool + foreground.bool + topmost.bool + showhelp.bool + service.bool + timeout.int + async.bool + } -maxleftover 0 -nulldefault] + + if {![kl_vget { + ok {0 {ok}} + okcancel {1 {ok cancel}} + abortretryignore {2 {abort retry ignore}} + yesnocancel {3 {yes no cancel}} + yesno {4 {yes no}} + retrycancel {5 {retry cancel}} + canceltrycontinue {6 {cancel try continue}} + } $opts(buttons) buttons]} { + error "Invalid value '$opts(buttons)' specified for option -buttons." + } + + set style [lindex $buttons 0] + switch -exact -- $opts(icon) { + warning - + exclamation {setbits style 0x30} + asterisk - + information {setbits style 0x40} + question {setbits style 0x20} + error - + hand - + stop {setbits style 0x10} + default { + error "Invalid value '$opts(icon)' specified for option -icon." + } + } + + # Map the default button + switch -exact -- [lsearch -exact [lindex $buttons 1] $opts(defaultbutton)] { + 1 {setbits style 0x100 } + 2 {setbits style 0x200 } + 3 {setbits style 0x300 } + default { + # First button, + # setbits style 0x000 + } + } + + switch -exact -- $opts(modality) { + system { setbits style 0x1000 } + task { setbits style 0x2000 } + appl - + application - + default { + # setbits style 0x0000 + } + } + + if {$opts(showhelp)} { setbits style 0x00004000 } + if {$opts(rtl)} { setbits style 0x00100000 } + if {$opts(justify) eq "right"} { setbits style 0x00080000 } + if {$opts(topmost)} { setbits style 0x00040000 } + if {$opts(foreground)} { setbits style 0x00010000 } + if {$opts(service)} { setbits style 0x00200000 } + + set response [WTSSendMessage $opts(hserver) $opts(tssession) $opts(title) \ + $opts(message) $style $opts(timeout) \ + [expr {!$opts(async)}]] + + switch -exact -- $response { + 1 { return ok } + 2 { return cancel } + 3 { return abort } + 4 { return retry } + 5 { return ignore } + 6 { return yes } + 7 { return no } + 8 { return close } + 9 { return help } + 10 { return tryagain } + 11 { return continue } + 32000 { return timeout } + 32001 { return async } + default { return $response } + } +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/registry.tcl b/src/punk86.vfs/lib/twapi4.7.2/registry.tcl new file mode 100644 index 00000000..9cb3403d --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/registry.tcl @@ -0,0 +1,490 @@ +# +# Copyright (c) 2020 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi {} + +# +# TBD -32bit and -64bit options are not documented +# pending test cases + +proc twapi::reg_key_copy {hkey to_hkey args} { + parseargs args { + subkey.arg + copysecd.bool + } -setvars -maxleftover 0 -nulldefault + + if {$copysecd} { + RegCopyTree $hkey $subkey $to_hkey + } else { + SHCopyKey $hkey $subkey $to_hkey + } +} + +proc twapi::reg_key_create {hkey subkey args} { + # TBD - document -link + # [opt_def [cmd -link] [arg BOOL]] If [const true], [arg SUBKEY] is stored as the + # value of the [const SymbolicLinkValue] value under [arg HKEY]. Default is + # [const false]. + parseargs args { + {access.arg generic_read} + {inherit.bool 0} + {secd.arg ""} + {volatile.bool 0 0x1} + {link.bool 0 0x2} + {backup.bool 0 0x4} + 32bit + 64bit + disposition.arg + } -maxleftover 0 -setvars + + set access [_access_rights_to_mask $access] + # Note: Following might be set via -access as well. The -32bit and -64bit + # options just make it a little more convenient for caller + if {$32bit} { + set access [expr {$access | 0x200}] + } + if {$64bit} { + set access [expr {$access | 0x100}] + } + lassign [RegCreateKeyEx \ + $hkey \ + $subkey \ + 0 \ + "" \ + [expr {$volatile | $backup}] \ + $access \ + [_make_secattr $secd $inherit] \ + ] hkey disposition_value + if {[info exists disposition]} { + upvar 1 $disposition created_or_existed + if {$disposition_value == 1} { + set created_or_existed created + } else { + # disposition_value == 2 + set created_or_existed existed + } + } + return $hkey +} + +proc twapi::reg_key_delete {hkey subkey args} { + parseargs args { + 32bit + 64bit + } -maxleftover 0 -setvars + + # TBD - document options after adding tests + set access 0 + if {$32bit} { + set access [expr {$access | 0x200}] + } + if {$64bit} { + set access [expr {$access | 0x100}] + } + + RegDeleteKeyEx $hkey $subkey $access +} + +proc twapi::reg_keys {hkey {subkey {}}} { + if {$subkey ne ""} { + set hkey [reg_key_open $hkey $subkey] + } + try { + return [RegEnumKeyEx $hkey 0] + } finally { + if {$subkey ne ""} { + reg_key_close $hkey + } + } +} + +proc twapi::reg_key_open {hkey subkey args} { + # Not documented: -link, -32bit, -64bit + # [opt_def [cmd -link] [arg BOOL]] If [const true], specifies the key is a + # symbolic link. Defaults to [const false]. + parseargs args { + {link.bool 0} + {access.arg generic_read} + 32bit + 64bit + } -maxleftover 0 -setvars + + set access [_access_rights_to_mask $access] + # Note: Following might be set via -access as well. The -32bit and -64bit + # options just make it a little more convenient for caller + if {$32bit} { + set access [expr {$access | 0x200}] + } + if {$64bit} { + set access [expr {$access | 0x100}] + } + return [RegOpenKeyEx $hkey $subkey $link $access] +} + +proc twapi::reg_value_delete {hkey args} { + if {[llength $args] == 1} { + RegDeleteValue $hkey [lindex $args 0] + } elseif {[llength $args] == 2} { + RegDeleteKeyValue $hkey {*}$args + } else { + error "Wrong # args: should be \"reg_value_delete ?SUBKEY? VALUENAME\"" + } +} + +proc twapi::reg_key_current_user {args} { + parseargs args { + {access.arg generic_read} + 32bit + 64bit + } -maxleftover 0 -setvars + + set access [_access_rights_to_mask $access] + # Note: Following might be set via -access as well. The -32bit and -64bit + # options just make it a little more convenient for caller + if {$32bit} { + set access [expr {$access | 0x200}] + } + if {$64bit} { + set access [expr {$access | 0x100}] + } + return [RegOpenCurrentUser $access] +} + +proc twapi::reg_key_user_classes_root {usertoken args} { + parseargs args { + {access.arg generic_read} + 32bit + 64bit + } -maxleftover 0 -setvars + + set access [_access_rights_to_mask $access] + # Note: Following might be set via -access as well. The -32bit and -64bit + # options just make it a little more convenient for caller + if {$32bit} { + set access [expr {$access | 0x200}] + } + if {$64bit} { + set access [expr {$access | 0x100}] + } + return [RegOpenUserClassesRoot $usertoken 0 $access] +} + +proc twapi::reg_key_export {hkey filepath args} { + parseargs args { + {secd.arg {}} + {format.arg xp {win2k xp}} + {compress.bool 1} + } -setvars + + set format [dict get {win2k 1 xp 2} $format] + if {! $compress} { + set format [expr {$format | 4}] + } + twapi::eval_with_privileges { + RegSaveKeyEx $hkey $filepath [_make_secattr $secd 0] $format + } SeBackupPrivilege +} + +proc twapi::reg_key_import {hkey filepath args} { + parseargs args { + {volatile.bool 0 0x1} + {force.bool 0 0x8} + } -setvars + twapi::eval_with_privileges { + RegRestoreKey $hkey $filepath [expr {$force | $volatile}] + } {SeBackupPrivilege SeRestorePrivilege} +} + +proc twapi::reg_key_load {hkey hivename filepath} { + twapi::eval_with_privileges { + RegLoadKey $hkey $subkey $filepath + } {SeBackupPrivilege SeRestorePrivilege} +} + +proc twapi::reg_key_unload {hkey hivename} { + twapi::eval_with_privileges { + RegUnLoadKey $hkey $subkey + } {SeBackupPrivilege SeRestorePrivilege} +} + +proc twapi::reg_key_monitor {hkey hevent args} { + parseargs args { + {keys.bool 0 0x1} + {attr.bool 0 0x2} + {values.bool 0 0x4} + {secd.bool 0 0x8} + {subtree.bool 0} + } -setvars + + set filter [expr {$keys | $attr | $values | $secd}] + if {$filter == 0} { + set filter 0xf + } + + RegNotifyChangeKeyValue $hkey $subtree $filter $hevent 1 +} + +proc twapi::reg_value_names {hkey {subkey {}}} { + if {$subkey eq ""} { + # 0 - value names only + return [RegEnumValue $hkey 0] + } + set hkey [reg_key_open $hkey $subkey] + try { + # 0 - value names only + return [RegEnumValue $hkey 0] + } finally { + reg_key_close $hkey + } +} + +proc twapi::reg_values {hkey {subkey {}}} { + if {$subkey eq ""} { + # 3 -> 0x1 - return data values, 0x2 - cooked data + return [RegEnumValue $hkey 3] + } + set hkey [reg_key_open $hkey $subkey] + try { + # 3 -> 0x1 - return data values, 0x2 - cooked data + return [RegEnumValue $hkey 3] + } finally { + reg_key_close $hkey + } +} + +proc twapi::reg_values_raw {hkey {subkey {}}} { + if {$subkey eq ""} { + # 0x1 - return data values + return [RegEnumValue $hkey 1] + } + set hkey [reg_key_open $hkey $subkey] + try { + return [RegEnumValue $hkey 1] + } finally { + reg_key_close $hkey + } +} + +proc twapi::reg_value_raw {hkey args} { + if {[llength $args] == 1} { + return [RegQueryValueEx $hkey [lindex $args 0] false] + } elseif {[llength $args] == 2} { + return [RegGetValue $hkey {*}$args 0x1000ffff false] + } else { + error "wrong # args: should be \"reg_value_get HKEY ?SUBKEY? VALUENAME\"" + } +} + +proc twapi::reg_value {hkey args} { + if {[llength $args] == 1} { + return [RegQueryValueEx $hkey [lindex $args 0] true] + } elseif {[llength $args] == 2} { + return [RegGetValue $hkey {*}$args 0x1000ffff true] + } else { + error "wrong # args: should be \"reg_value_get HKEY ?SUBKEY? VALUENAME\"" + } +} + +if {[twapi::min_os_version 6]} { + proc twapi::reg_value_set {hkey args} { + if {[llength $args] == 3} { + return [RegSetValueEx $hkey {*}$args] + } elseif {[llength $args] == 4} { + return [RegSetKeyValue $hkey {*}$args] + } else { + error "wrong # args: should be \"reg_value_set HKEY ?SUBKEY? VALUENAME TYPE VALUE\"" + } + } +} else { + proc twapi::reg_value_set {hkey args} { + if {[llength $args] == 3} { + lassign $args value_name value_type value + } elseif {[llength $args] == 4} { + lassign $args subkey value_name value_type value + set hkey [reg_key_open $hkey $subkey -access key_set_value] + } else { + error "wrong # args: should be \"reg_value_set HKEY ?SUBKEY? VALUENAME TYPE VALUE\"" + } + try { + RegSetValueEx $hkey $value_name $value_type $value + } finally { + if {[info exists subkey]} { + # We opened hkey + reg_close_key $hkey + } + } + } +} + +proc twapi::reg_key_override_undo {hkey} { + RegOverridePredefKey $hkey 0 +} + +proc twapi::_reg_walker {hkey path callback cbdata} { + # Callback for the key + set code [catch { + {*}$callback $cbdata $hkey $path + } cbdata ropts] + if {$code != 0} { + if {$code == 4} { + # Continue - skip children, continue with siblings + return $cbdata + } elseif {$code == 3} { + # Skip siblings as well + return -code break $cbdata + } elseif {$code == 2} { + # Stop complete iteration + return -code return $cbdata + } else { + return -options $ropts $cbdata + } + } + + # Iterate over child keys + foreach child_key [reg_keys $hkey] { + set child_hkey [reg_key_open $hkey $child_key] + try { + # Recurse to call into children + set code [catch { + _reg_walker $child_hkey [linsert $path end $child_key] $callback $cbdata + } cbdata ropts] + if {$code != 0 && $code != 4} { + if {$code == 3} { + # break - skip remaining child keys + return $cbdata + } elseif {$code == 2} { + # return - stop all iteration all up the tree + return -code return $cbdata + } else { + return -options $ropts $cbdata + } + } + } finally { + reg_key_close $child_hkey + } + } + + return $cbdata +} + +proc twapi::reg_walk {hkey args} { + parseargs args { + {subkey.arg {}} + callback.arg + {cbdata.arg ""} + } -maxleftover 0 -setvars + + + if {$subkey ne ""} { + set hkey [reg_key_open $hkey $subkey] + set path [list $subkey] + } else { + set path [list ] + } + + if {![info exists callback]} { + set callback [lambda {cbdata hkey path} {puts [join $path \\]}] + } + try { + set code [catch {_reg_walker $hkey $path $callback $cbdata } result ropts] + # Codes 2 (return), 3 (break) and 4 (continue) are just early terminations + if {$code == 1} { + return -options $ropts $result + } + } finally { + if {$subkey ne ""} { + reg_key_close $hkey + } + } + return $result +} + +proc twapi::_reg_iterator_callback {cbdata hkey path args} { + set cmd [yield [list $hkey $path {*}$args]] + # Loop until valid argument + while {1} { + switch -exact -- $cmd { + "" - + next { return $cbdata } + stop { return -code return $cbdata } + parentsibling { return -code break $cbdata } + sibling { return -code continue $cbdata } + default { + set ret [yieldto return -level 0 -code error "Invalid argument \"$cmd\"."] + } + } + } +} + +proc twapi::_reg_iterator_coro {hkey subkey} { + set cmd [yield [info coroutine]] + switch -exact -- $cmd { + "" - + next { + # Drop into reg_walk + } + stop - + parentsibling - + sibling { + return {} + } + default { + error "Invalid argument \"$cmd\"." + } + } + if {$subkey ne ""} { + set hkey [reg_key_open $hkey $subkey] + } + try { + reg_walk $hkey -callback [namespace current]::_reg_iterator_callback + } finally { + if {$subkey ne ""} { + reg_key_close $hkey + } + } + return +} + +proc twapi::reg_iterator {hkey {subkey {}}} { + variable reg_walk_counter + + return [coroutine "regwalk#[incr reg_walk_counter]" _reg_iterator_coro $hkey $subkey] +} + +proc twapi::reg_tree {hkey {subkey {}}} { + + set iter [reg_iterator $hkey $subkey] + + set paths {} + while {[llength [set item [$iter next]]]} { + lappend paths [join [lindex $item 1] \\] + } + return $paths +} + +proc twapi::reg_tree_values {hkey {subkey {}}} { + + set iter [reg_iterator $hkey $subkey] + + set tree {} + # Note here we cannot ignore the first empty node corresponding + # to the root because we have to return any values it contains. + while {[llength [set item [$iter next]]]} { + dict set tree [join [lindex $item 1] \\] [reg_values [lindex $item 0]] + } + return $tree +} + +proc twapi::reg_tree_values_raw {hkey {subkey {}}} { + set iter [reg_iterator $hkey $subkey] + + set tree {} + while {[llength [set item [$iter next]]]} { + dict set tree [join [lindex $item 1] \\] [reg_values_raw [lindex $item 0]] + } + return $tree +} + diff --git a/src/punk86.vfs/lib/twapi4.7.2/resource.tcl b/src/punk86.vfs/lib/twapi4.7.2/resource.tcl new file mode 100644 index 00000000..fea6cdda --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/resource.tcl @@ -0,0 +1,458 @@ +# Commands related to resource manipulation +# +# Copyright (c) 2003-2012 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +package require twapi_nls + +# Retrieve version info for a file +proc twapi::get_file_version_resource {path args} { + array set opts [parseargs args { + all + datetime + signature + structversion + fileversion + productversion + flags + fileos + filetype + foundlangid + foundcodepage + langid.arg + codepage.arg + }] + + + set ver [Twapi_GetFileVersionInfo $path] + + trap { + array set verinfo [Twapi_VerQueryValue_FIXEDFILEINFO $ver] + + set result [list ] + if {$opts(all) || $opts(signature)} { + lappend result -signature [format 0x%x $verinfo(dwSignature)] + } + + if {$opts(all) || $opts(structversion)} { + lappend result -structversion "[expr {0xffff & ($verinfo(dwStrucVersion) >> 16)}].[expr {0xffff & $verinfo(dwStrucVersion)}]" + } + + if {$opts(all) || $opts(fileversion)} { + lappend result -fileversion "[expr {0xffff & ($verinfo(dwFileVersionMS) >> 16)}].[expr {0xffff & $verinfo(dwFileVersionMS)}].[expr {0xffff & ($verinfo(dwFileVersionLS) >> 16)}].[expr {0xffff & $verinfo(dwFileVersionLS)}]" + } + + if {$opts(all) || $opts(productversion)} { + lappend result -productversion "[expr {0xffff & ($verinfo(dwProductVersionMS) >> 16)}].[expr {0xffff & $verinfo(dwProductVersionMS)}].[expr {0xffff & ($verinfo(dwProductVersionLS) >> 16)}].[expr {0xffff & $verinfo(dwProductVersionLS)}]" + } + + if {$opts(all) || $opts(flags)} { + set flags [expr {$verinfo(dwFileFlags) & $verinfo(dwFileFlagsMask)}] + lappend result -flags \ + [_make_symbolic_bitmask \ + [expr {$verinfo(dwFileFlags) & $verinfo(dwFileFlagsMask)}] \ + { + debug 1 + prerelease 2 + patched 4 + privatebuild 8 + infoinferred 16 + specialbuild 32 + } \ + ] + } + + if {$opts(all) || $opts(fileos)} { + switch -exact -- [format %08x $verinfo(dwFileOS)] { + 00010000 {set os dos} + 00020000 {set os os216} + 00030000 {set os os232} + 00040000 {set os nt} + 00050000 {set os wince} + 00000001 {set os windows16} + 00000002 {set os pm16} + 00000003 {set os pm32} + 00000004 {set os windows32} + 00010001 {set os dos_windows16} + 00010004 {set os dos_windows32} + 00020002 {set os os216_pm16} + 00030003 {set os os232_pm32} + 00040004 {set os nt_windows32} + default {set os $verinfo(dwFileOS)} + } + lappend result -fileos $os + } + + if {$opts(all) || $opts(filetype)} { + switch -exact -- [expr {0+$verinfo(dwFileType)}] { + 1 {set type application} + 2 {set type dll} + 3 { + set type "driver." + switch -exact -- [expr {0+$verinfo(dwFileSubtype)}] { + 1 {append type printer} + 2 {append type keyboard} + 3 {append type language} + 4 {append type display} + 5 {append type mouse} + 6 {append type network} + 7 {append type system} + 8 {append type installable} + 9 {append type sound} + 10 {append type comm} + 11 {append type inputmethod} + 12 {append type versionedprinter} + default {append type $verinfo(dwFileSubtype)} + } + } + 4 { + set type "font." + switch -exact -- [expr {0+$verinfo(dwFileSubtype)}] { + 1 {append type raster} + 2 {append type vector} + 3 {append type truetype} + default {append type $verinfo(dwFileSubtype)} + } + } + 5 { set type "vxd.$verinfo(dwFileSubtype)" } + 7 {set type staticlib} + default { + set type "$verinfo(dwFileType).$verinfo(dwFileSubtype)" + } + } + lappend result -filetype $type + } + + if {$opts(all) || $opts(datetime)} { + lappend result -datetime [expr {($verinfo(dwFileDateMS) << 32) + $verinfo(dwFileDateLS)}] + } + + # Any remaining arguments are treated as string names + + if {[llength $args] || $opts(foundlangid) || $opts(foundcodepage) || $opts(all)} { + # Find list of langid's and codepages and do closest match + set langid [expr {[info exists opts(langid)] ? $opts(langid) : [get_user_ui_langid]}] + set primary_langid [extract_primary_langid $langid] + set sub_langid [extract_sublanguage_langid $langid] + set cp [expr {[info exists opts(codepage)] ? $opts(codepage) : 0}] + + # Find a match in the following order: + # 0 Exact match for both langid and codepage + # 1 Exact match for langid + # 2 Primary langid matches (sublang does not) and exact codepage + # 3 Primary langid matches (sublang does not) + # 4 Language neutral + # 5 English + # 6 First langcp in list or "00000000" + set match(7) "00000000"; # In case list is empty + foreach langcp [Twapi_VerQueryValue_TRANSLATIONS $ver] { + set verlangid 0x[string range $langcp 0 3] + set vercp 0x[string range $langcp 4 7] + if {$verlangid == $langid && $vercp == $cp} { + set match(0) $langcp + break; # No need to look further + } + if {[info exists match(1)]} continue + if {$verlangid == $langid} { + set match(1) $langcp + continue; # Continue to look for match(0) + } + if {[info exists match(2)]} continue + set verprimary [extract_primary_langid $verlangid] + if {$verprimary == $primary_langid && $vercp == $cp} { + set match(2) $langcp + continue; # Continue to look for match(1) or better + } + if {[info exists match(3)]} continue + if {$verprimary == $primary_langid} { + set match(3) $langcp + continue; # Continue to look for match(2) or better + } + if {[info exists match(4)]} continue + if {$verprimary == 0} { + set match(4) $langcp; # LANG_NEUTRAL + continue; # Continue to look for match(3) or better + } + if {[info exists match(5)]} continue + if {$verprimary == 9} { + set match(5) $langcp; # English + continue; # Continue to look for match(4) or better + } + if {![info exists match(6)]} { + set match(6) $langcp + } + } + + # Figure out what is the best match we have + for {set i 0} {$i <= 7} {incr i} { + if {[info exists match($i)]} { + break + } + } + + if {$opts(foundlangid) || $opts(all)} { + set langid 0x[string range $match($i) 0 3] + lappend result -foundlangid [list $langid [VerLanguageName $langid]] + } + + if {$opts(foundcodepage) || $opts(all)} { + lappend result -foundcodepage 0x[string range $match($i) 4 7] + } + + foreach sname $args { + lappend result $sname [Twapi_VerQueryValue_STRING $ver $match($i) $sname] + } + + } + + } finally { + Twapi_FreeFileVersionInfo $ver + } + + return $result +} + +proc twapi::begin_resource_update {path args} { + array set opts [parseargs args { + deleteall + } -maxleftover 0] + + return [BeginUpdateResource $path $opts(deleteall)] +} + +# Note this is not an alias because we want to control arguments +# to UpdateResource (which can take more args that specified here) +proc twapi::delete_resource {hmod restype resname langid} { + UpdateResource $hmod $restype $resname $langid +} + + +# Note this is not an alias because we want to make sure $bindata is specified +# as an argument else it will have the effect of deleting a resource +proc twapi::update_resource {hmod restype resname langid bindata} { + UpdateResource $hmod $restype $resname $langid $bindata +} + +proc twapi::end_resource_update {hmod args} { + array set opts [parseargs args { + discard + } -maxleftover 0] + + return [EndUpdateResource $hmod $opts(discard)] +} + +proc twapi::read_resource {hmod restype resname langid} { + return [Twapi_LoadResource $hmod [FindResourceEx $hmod $restype $resname $langid]] +} + +proc twapi::read_resource_string {hmod resname langid} { + # As an aside, note that we do not use a LoadString call + # because it does not allow for specification of a langid + + # For a reference to how strings are stored, see + # http://blogs.msdn.com/b/oldnewthing/archive/2004/01/30/65013.aspx + # or http://support.microsoft.com/kb/196774 + + if {![string is integer -strict $resname]} { + error "String resources must have an integer id" + } + + lassign [resource_stringid_to_stringblockid $resname] block_id index_within_block + + return [lindex \ + [resource_stringblock_to_strings \ + [read_resource $hmod 6 $block_id $langid] ] \ + $index_within_block] +} + +# Give a list of strings, formats it as a string block. Number of strings +# must not be greater than 16. If less than 16 strings, remaining are +# treated as empty. +proc twapi::strings_to_resource_stringblock {strings} { + if {[llength $strings] > 16} { + error "Cannot have more than 16 strings in a resource string block." + } + + for {set i 0} {$i < 16} {incr i} { + set s [lindex $strings $i] + set n [string length $s] + append bin [binary format sa* $n [encoding convertto unicode $s]] + } + + return $bin +} + +proc twapi::resource_stringid_to_stringblockid {id} { + # Strings are stored in blocks of 16, with block id's beginning at 1, not 0 + return [list [expr {($id / 16) + 1}] [expr {$id & 15}]] +} + +proc twapi::extract_resources {hmod {withdata 0}} { + set result [dict create] + foreach type [enumerate_resource_types $hmod] { + set typedict [dict create] + foreach name [enumerate_resource_names $hmod $type] { + set namedict [dict create] + foreach lang [enumerate_resource_languages $hmod $type $name] { + if {$withdata} { + dict set namedict $lang [read_resource $hmod $type $name $lang] + } else { + dict set namedict $lang {} + } + } + dict set typedict $name $namedict + } + dict set result $type $typedict + } + return $result +} + +# TBD - test +proc twapi::write_bmp_file {filename bmp} { + # Assumes $bmp is clipboard content in format 8 (CF_DIB) + + # First parse the bitmap data to collect header information + binary scan $bmp "iiissiiiiii" size width height planes bitcount compression sizeimage xpelspermeter ypelspermeter clrused clrimportant + + # We only handle BITMAPINFOHEADER right now (size must be 40) + if {$size != 40} { + error "Unsupported bitmap format. Header size=$size" + } + + # We need to figure out the offset to the actual bitmap data + # from the start of the file header. For this we need to know the + # size of the color table which directly follows the BITMAPINFOHEADER + if {$bitcount == 0} { + error "Unsupported format: implicit JPEG or PNG" + } elseif {$bitcount == 1} { + set color_table_size 2 + } elseif {$bitcount == 4} { + # TBD - Not sure if this is the size or the max size + set color_table_size 16 + } elseif {$bitcount == 8} { + # TBD - Not sure if this is the size or the max size + set color_table_size 256 + } elseif {$bitcount == 16 || $bitcount == 32} { + if {$compression == 0} { + # BI_RGB + set color_table_size $clrused + } elseif {$compression == 3} { + # BI_BITFIELDS + set color_table_size 3 + } else { + error "Unsupported compression type '$compression' for bitcount value $bitcount" + } + } elseif {$bitcount == 24} { + set color_table_size $clrused + } else { + error "Unsupported value '$bitcount' in bitmap bitcount field" + } + + set filehdr_size 14; # sizeof(BITMAPFILEHEADER) + set bitmap_file_offset [expr {$filehdr_size+$size+($color_table_size*4)}] + set filehdr [binary format "a2 i x2 x2 i" "BM" [expr {$filehdr_size + [string length $bmp]}] $bitmap_file_offset] + + set fd [open $filename w] + fconfigure $fd -translation binary + + puts -nonewline $fd $filehdr + puts -nonewline $fd $bmp + + close $fd +} + +proc twapi::_load_image {flags type hmod path args} { + # The flags arg is generally 0x10 (load from file), or 0 (module) + # or'ed with 0x8000 (shared). The latter can be overridden by + # the -shared option but should not be except when loading from module. + array set opts [parseargs args { + {createdibsection.bool 0 0x2000} + {defaultsize.bool 0 0x40} + height.int + {loadtransparent.bool 0 0x20} + {monochrome.bool 0 0x1} + {shared.bool 0 0x8000} + {vgacolor.bool 0 0x80} + width.int + } -maxleftover 0 -nulldefault] + + set flags [expr {$flags | $opts(defaultsize) | $opts(loadtransparent) | $opts(monochrome) | $opts(shared) | $opts(vgacolor)}] + + set h [LoadImage $hmod $path $type $opts(width) $opts(height) $flags] + # Cast as _SHARED if required to offer some protection against + # being freed using DestroyIcon etc. + set type [lindex {HGDIOBJ HICON HCURSOR} $type] + if {$flags & 0x8000} { + append type _SHARED + } + return [cast_handle $h $type] +} + + +proc twapi::_load_image_from_system {type id args} { + variable _oem_image_syms + + if {![string is integer -strict $id]} { + if {![info exists _oem_image_syms]} { + # Bitmap symbols (type 0) + dict set _oem_image_syms 0 { + CLOSE 32754 UPARROW 32753 + DNARROW 32752 RGARROW 32751 + LFARROW 32750 REDUCE 32749 + ZOOM 32748 RESTORE 32747 + REDUCED 32746 ZOOMD 32745 + RESTORED 32744 UPARROWD 32743 + DNARROWD 32742 RGARROWD 32741 + LFARROWD 32740 MNARROW 32739 + COMBO 32738 UPARROWI 32737 + DNARROWI 32736 RGARROWI 32735 + LFARROWI 32734 SIZE 32766 + BTSIZE 32761 CHECK 32760 + CHECKBOXES 32759 BTNCORNERS 32758 + } + # Icon symbols (type 1) + dict set _oem_image_syms 1 { + SAMPLE 32512 HAND 32513 + QUES 32514 BANG 32515 + NOTE 32516 WINLOGO 32517 + WARNING 32515 ERROR 32513 + INFORMATION 32516 SHIELD 32518 + } + # Cursor symbols (type 2) + dict set _oem_image_syms 2 { + NORMAL 32512 IBEAM 32513 + WAIT 32514 CROSS 32515 + UP 32516 SIZENWSE 32642 + SIZENESW 32643 SIZEWE 32644 + SIZENS 32645 SIZEALL 32646 + NO 32648 HAND 32649 + APPSTARTING 32650 + } + + } + } + + set id [dict get $_oem_image_syms $type [string toupper $id]] + # Built-in system images must always be loaded shared (0x8000) + return [_load_image 0x8000 $type NULL $id {*}$args] +} + + +# 0x10 -> LR_LOADFROMFILE. Also 0x8000 not set (meaning unshared) +interp alias {} twapi::load_bitmap_from_file {} twapi::_load_image 0x10 0 NULL +interp alias {} twapi::load_icon_from_file {} twapi::_load_image 0x10 1 NULL +interp alias {} twapi::load_cursor_from_file {} twapi::_load_image 0x10 2 NULL + +interp alias {} twapi::load_bitmap_from_module {} twapi::_load_image 0 0 +interp alias {} twapi::load_icon_from_module {} twapi::_load_image 0 1 +interp alias {} twapi::load_cursor_from_module {} twapi::_load_image 0 2 + +interp alias {} twapi::load_bitmap_from_system {} twapi::_load_image_from_system 0 +interp alias {} twapi::load_icon_from_system {} twapi::_load_image_from_system 1 +interp alias {} twapi::load_cursor_from_system {} twapi::_load_image_from_system 2 + +interp alias {} twapi::free_icon {} twapi::DestroyIcon +interp alias {} twapi::free_bitmap {} twapi::DeleteObject +interp alias {} twapi::free_cursor {} twapi::DestroyCursor diff --git a/src/punk86.vfs/lib/twapi4.7.2/security.tcl b/src/punk86.vfs/lib/twapi4.7.2/security.tcl new file mode 100644 index 00000000..a0a799b5 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/security.tcl @@ -0,0 +1,2385 @@ +# +# Copyright (c) 2003-2014, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# TBD - allow SID and account name to be used interchangeably in various +# functions +# TBD - ditto for LUID v/s privilege names + +namespace eval twapi { + # Map privilege level mnemonics to priv level + array set priv_level_map {guest 0 user 1 admin 2} + + # TBD - the following are not used, enhancements needed ? + # OBJECT_INHERIT_ACE 0x1 + # CONTAINER_INHERIT_ACE 0x2 + # NO_PROPAGATE_INHERIT_ACE 0x4 + # INHERIT_ONLY_ACE 0x8 + # INHERITED_ACE 0x10 + # VALID_INHERIT_FLAGS 0x1F + + # Cache of privilege names to LUID's + variable _privilege_to_luid_map + set _privilege_to_luid_map {} + variable _luid_to_privilege_map {} + +} + + +# Returns token for a process +proc twapi::open_process_token {args} { + array set opts [parseargs args { + pid.int + hprocess.arg + {access.arg token_query} + } -maxleftover 0] + + set access [_access_rights_to_mask $opts(access)] + + # Get a handle for the process + if {[info exists opts(hprocess)]} { + if {[info exists opts(pid)]} { + error "Options -pid and -hprocess cannot be used together." + } + set ph $opts(hprocess) + } elseif {[info exists opts(pid)]} { + set ph [get_process_handle $opts(pid)] + } else { + variable my_process_handle + set ph $my_process_handle + } + trap { + # Get a token for the process + set ptok [OpenProcessToken $ph $access] + } finally { + # Close handle only if we did an OpenProcess + if {[info exists opts(pid)]} { + CloseHandle $ph + } + } + + return $ptok +} + +# Returns token for a process +proc twapi::open_thread_token {args} { + array set opts [parseargs args { + tid.int + hthread.arg + {access.arg token_query} + {self.bool false} + } -maxleftover 0] + + set access [_access_rights_to_mask $opts(access)] + + # Get a handle for the thread + if {[info exists opts(hthread)]} { + if {[info exists opts(tid)]} { + error "Options -tid and -hthread cannot be used together." + } + set th $opts(hthread) + } elseif {[info exists opts(tid)]} { + set th [get_thread_handle $opts(tid)] + } else { + set th [GetCurrentThread] + } + + trap { + # Get a token for the thread + set tok [OpenThreadToken $th $access $opts(self)] + } finally { + # Close handle only if we did an OpenProcess + if {[info exists opts(tid)]} { + CloseHandle $th + } + } + + return $tok +} + +proc twapi::close_token {tok} { + CloseHandle $tok +} + +# TBD - document and test +proc twapi::duplicate_token {tok args} { + parseargs args { + access.arg + {inherit.bool 0} + {secd.arg ""} + {impersonationlevel.sym impersonation {anonymous 0 identification 1 impersonation 2 delegation 3}} + {type.sym primary {primary 1 impersonation 2}} + } -maxleftover 0 -setvars + + if {[info exists access]} { + set access [_access_rights_to_mask $access] + } else { + # If no desired access is indicated, we want the same access as + # the original handle + set access 0 + } + + return [DuplicateTokenEx $tok $access \ + [_make_secattr $secd $inherit] \ + $impersonationlevel $type] +} + +proc twapi::get_token_info {tok args} { + array set opts [parseargs args { + defaultdacl + disabledprivileges + elevation + enabledprivileges + groupattrs + groups + groupsids + integrity + integritylabel + linkedtoken + logonsession + logonsessionsid + origin + primarygroup + primarygroupsid + privileges + restrictedgroupattrs + restrictedgroups + tssession + usersid + virtualized + } -maxleftover 0] + + # Do explicit check so we return error if no args specified + # and $tok is invalid + if {![pointer? $tok]} { + error "Invalid token handle '$tok'" + } + + # TBD - add an -ignorerrors option + + set result [dict create] + trap { + if {$opts(privileges) || $opts(disabledprivileges) || $opts(enabledprivileges)} { + lassign [GetTokenInformation $tok 13] gtigroups gtirestrictedgroups privs gtilogonsession + set privs [_map_luids_and_attrs_to_privileges $privs] + if {$opts(privileges)} { + lappend result -privileges $privs + } + if {$opts(enabledprivileges)} { + lappend result -enabledprivileges [lindex $privs 0] + } + if {$opts(disabledprivileges)} { + lappend result -disabledprivileges [lindex $privs 1] + } + } + if {$opts(defaultdacl)} { + lappend result -defaultdacl [get_token_default_dacl $tok] + } + if {$opts(origin)} { + lappend result -origin [get_token_origin $tok] + } + if {$opts(linkedtoken)} { + lappend result -linkedtoken [get_token_linked_token $tok] + } + if {$opts(elevation)} { + lappend result -elevation [get_token_elevation $tok] + } + if {$opts(integrity)} { + lappend result -integrity [get_token_integrity $tok] + } + if {$opts(integritylabel)} { + lappend result -integritylabel [get_token_integrity $tok -label] + } + if {$opts(virtualized)} { + lappend result -virtualized [get_token_virtualization $tok] + } + if {$opts(tssession)} { + lappend result -tssession [get_token_tssession $tok] + } + if {$opts(usersid)} { + # First element of groups is user sid + if {[info exists gtigroups]} { + lappend result -usersid [lindex $gtigroups 0 0 0] + } else { + lappend result -usersid [get_token_user $tok] + } + } + if {$opts(groups) || $opts(groupsids)} { + if {[info exists gtigroups]} { + set gsids {} + # First element of groups is user sid, skip it + foreach item [lrange $gtigroups 1 end] { + lappend gsids [lindex $item 0] + } + } else { + set gsids [get_token_groups $tok] + } + if {$opts(groupsids)} { + lappend result -groupsids $gsids + } + if {$opts(groups)} { + set items {} + foreach gsid $gsids { + lappend items [lookup_account_sid $gsid] + } + lappend result -groups $items + } + } + if {[min_os_version 6] && $opts(logonsessionsid)} { + # Only possible on Vista+ + lappend result -logonsessionsid [lindex [GetTokenInformation $tok 28] 0 0] + set opts(logonsessionsid) 0; # So we don't try second method below + } + if {$opts(groupattrs) || $opts(logonsessionsid)} { + if {[info exists gtigroups]} { + set items {} + # First element of groups is user sid, skip it + foreach item [lrange $gtigroups 1 end] { + set gattrs [map_token_group_attr [lindex $item 1]] + if {$opts(groupattrs)} { + lappend items [lindex $item 0] $gattrs + } + if {$opts(logonsessionsid) && "logon_id" in $gattrs} { + set logonsessionsid [lindex $item 0] + } + } + if {$opts(groupattrs)} { + lappend result -groupattrs $items + } + } else { + set groupattrs [get_token_groups_and_attrs $tok] + if {$opts(logonsessionsid)} { + foreach {sid gattrs} $groupattrs { + if {"logon_id" in $gattrs} { + set logonsessionsid $sid + break + } + } + } + if {$opts(groupattrs)} { + lappend result -groupattrs $groupattrs + } + } + if {$opts(logonsessionsid)} { + if {[info exists logonsessionsid]} { + lappend result -logonsessionsid $logonsessionsid + } else { + error "No logon session id found in token" + } + } + } + if {$opts(restrictedgroups)} { + if {![info exists gtirestrictedgroups]} { + set gtirestrictedgroups [get_token_restricted_groups_and_attrs $tok] + } + set items {} + foreach item $gtirestrictedgroups { + lappend items [lookup_account_sid [lindex $item 0]] + } + lappend result -restrictedgroups $items + } + if {$opts(restrictedgroupattrs)} { + if {[info exists gtirestrictedgroups]} { + set items {} + foreach item $gtirestrictedgroups { + lappend items [lindex $item 0] [map_token_group_attr [lindex $item 1]] + } + lappend result -restrictedgroupattrs $items + } else { + lappend result -restrictedgroupattrs [get_token_restricted_groups_and_attrs $tok] + } + } + if {$opts(primarygroupsid)} { + lappend result -primarygroupsid [get_token_primary_group $tok] + } + if {$opts(primarygroup)} { + lappend result -primarygroup [get_token_primary_group $tok -name] + } + if {$opts(logonsession)} { + if {[info exists gtilogonsession]} { + lappend result -logonsession $gtilogonsession + } else { + array set stats [get_token_statistics $tok] + lappend result -logonsession $stats(authluid) + } + } + } + + return $result +} + +proc twapi::get_token_tssession {tok} { + return [GetTokenInformation $tok 12] +} + +# TBD - document and test +proc twapi::set_token_tssession {tok tssession} { + Twapi_SetTokenSessionId $tok $tssession + return +} + +# Procs that differ between Vista and prior versions +if {[twapi::min_os_version 6]} { + proc twapi::get_token_elevation {tok} { + set elevation [GetTokenInformation $tok 18]; #TokenElevationType + switch -exact -- $elevation { + 1 { set elevation default } + 2 { set elevation full } + 3 { set elevation limited } + } + return $elevation + } + + proc twapi::get_token_virtualization {tok} { + return [GetTokenInformation $tok 24]; # TokenVirtualizationEnabled + } + + proc twapi::set_token_virtualization {tok enabled} { + # tok must have TOKEN_ADJUST_DEFAULT access + Twapi_SetTokenVirtualizationEnabled $tok [expr {$enabled ? 1 : 0}] + } + + # Get the integrity level associated with a token + proc twapi::get_token_integrity {tok args} { + # TokenIntegrityLevel -> 25 + lassign [GetTokenInformation $tok 25] integrity attrs + if {$attrs != 96} { + # TBD - is this ok? + } + return [_sid_to_integrity $integrity {*}$args] + } + + # Get the integrity level associated with a token + proc twapi::set_token_integrity {tok integrity} { + # SE_GROUP_INTEGRITY attribute - 0x20 + Twapi_SetTokenIntegrityLevel $tok [list [_integrity_to_sid $integrity] 0x20] + } + + proc twapi::get_token_integrity_policy {tok} { + set policy [GetTokenInformation $tok 27]; #TokenMandatoryPolicy + set result {} + if {$policy & 1} { + lappend result no_write_up + } + if {$policy & 2} { + lappend result new_process_min + } + return $result + } + + + proc twapi::set_token_integrity_policy {tok args} { + set policy [_parse_symbolic_bitmask $args { + no_write_up 0x1 + new_process_min 0x2 + }] + + Twapi_SetTokenMandatoryPolicy $tok $policy + } +} else { + # Versions for pre-Vista + proc twapi::get_token_elevation {tok} { + # Older OS versions have no concept of elevation. + return "default" + } + + proc twapi::get_token_virtualization {tok} { + # Older OS versions have no concept of elevation. + return 0 + } + + proc twapi::set_token_virtualization {tok enabled} { + # Older OS versions have no concept of elevation, so only disable + # allowed + if {$enabled} { + error "Virtualization not available on this platform." + } + return + } + + # Get the integrity level associated with a token + proc twapi::get_token_integrity {tok args} { + # Older OS versions have no concept of elevation. + # For future consistency in label mapping, fall through to mapping + # below instead of directly returning mapped value + set integrity S-1-16-8192 + + return [_sid_to_integrity $integrity {*}$args] + } + + # Get the integrity level associated with a token + proc twapi::set_token_integrity {tok integrity} { + # Old platforms have a "default" of medium that cannot be changed. + if {[_integrity_to_sid $integrity] ne "S-1-16-8192"} { + error "Invalid integrity level value '$integrity' for this platform." + } + return + } + + proc twapi::get_token_integrity_policy {tok} { + # Old platforms - no integrity + return 0 + } + + proc twapi::set_token_integrity_policy {tok args} { + # Old platforms - no integrity + return 0 + } +} + +proc twapi::well_known_sid {sidname args} { + parseargs args { + {domainsid.arg {}} + } -maxleftover 0 -setvars + + return [CreateWellKnownSid [_map_well_known_sid_name $sidname] $domainsid] +} + +proc twapi::is_well_known_sid {sid sidname} { + return [IsWellKnownSid $sid [_map_well_known_sid_name $sidname]] +} + +# Get the user account associated with a token +proc twapi::get_token_user {tok args} { + + array set opts [parseargs args [list name]] + # TokenUser -> 1 + set user [lindex [GetTokenInformation $tok 1] 0] + if {$opts(name)} { + set user [lookup_account_sid $user] + } + return $user +} + +# Get the groups associated with a token +proc twapi::get_token_groups {tok args} { + array set opts [parseargs args [list name] -maxleftover 0] + + set groups [list ] + # TokenGroups -> 2 + foreach group [GetTokenInformation $tok 2] { + if {$opts(name)} { + lappend groups [lookup_account_sid [lindex $group 0]] + } else { + lappend groups [lindex $group 0] + } + } + + return $groups +} + +# Get the groups associated with a token along with their attributes +# These are returned as a flat list of the form "sid attrlist sid attrlist..." +# where the attrlist is a list of attributes +proc twapi::get_token_groups_and_attrs {tok} { + + set sids_and_attrs [list ] + # TokenGroups -> 2 + foreach {group} [GetTokenInformation $tok 2] { + lappend sids_and_attrs [lindex $group 0] [map_token_group_attr [lindex $group 1]] + } + + return $sids_and_attrs +} + +# Get the groups associated with a token along with their attributes +# These are returned as a flat list of the form "sid attrlist sid attrlist..." +# where the attrlist is a list of attributes +proc twapi::get_token_restricted_groups_and_attrs {tok} { + set sids_and_attrs [list ] + # TokenRestrictedGroups -> 11 + foreach {group} [GetTokenInformation $tok 11] { + lappend sids_and_attrs [lindex $group 0] [map_token_group_attr [lindex $group 1]] + } + + return $sids_and_attrs +} + + +# Get list of privileges that are currently enabled for the token +# If -all is specified, returns a list {enabled_list disabled_list} +proc twapi::get_token_privileges {tok args} { + + set all [expr {[lsearch -exact $args -all] >= 0}] + # TokenPrivileges -> 3 + set privs [_map_luids_and_attrs_to_privileges [GetTokenInformation $tok 3]] + if {$all} { + return $privs + } else { + return [lindex $privs 0] + } +} + +# Return true if the token has the given privilege +proc twapi::check_enabled_privileges {tok privlist args} { + set all_required [expr {[lsearch -exact $args "-any"] < 0}] + + set luid_attr_list [list ] + foreach priv $privlist { + lappend luid_attr_list [list [map_privilege_to_luid $priv] 0] + } + return [Twapi_PrivilegeCheck $tok $luid_attr_list $all_required] +} + + +# Enable specified privileges. Returns "" if the given privileges were +# already enabled, else returns the privileges that were modified +proc twapi::enable_privileges {privlist} { + variable my_process_handle + + # Get our process token + set tok [OpenProcessToken $my_process_handle 0x28]; # QUERY + ADJUST_PRIVS + trap { + return [enable_token_privileges $tok $privlist] + } finally { + close_token $tok + } +} + + +# Disable specified privileges. Returns "" if the given privileges were +# already enabled, else returns the privileges that were modified +proc twapi::disable_privileges {privlist} { + variable my_process_handle + + # Get our process token + set tok [OpenProcessToken $my_process_handle 0x28]; # QUERY + ADJUST_PRIVS + trap { + return [disable_token_privileges $tok $privlist] + } finally { + close_token $tok + } +} + + +# Execute the given script with the specified privileges. +# After the script completes, the original privileges are restored +proc twapi::eval_with_privileges {script privs args} { + array set opts [parseargs args {besteffort} -maxleftover 0] + + if {[catch {enable_privileges $privs} privs_to_disable]} { + if {! $opts(besteffort)} { + return -code error -errorinfo $::errorInfo \ + -errorcode $::errorCode $privs_to_disable + } + set privs_to_disable [list ] + } + + set code [catch {uplevel $script} result] + switch $code { + 0 { + disable_privileges $privs_to_disable + return $result + } + 1 { + # Save error info before calling disable_privileges + set erinfo $::errorInfo + set ercode $::errorCode + disable_privileges $privs_to_disable + return -code error -errorinfo $::errorInfo \ + -errorcode $::errorCode $result + } + default { + disable_privileges $privs_to_disable + return -code $code $result + } + } +} + + +# Get the privilege associated with a token and their attributes +proc twapi::get_token_privileges_and_attrs {tok} { + set privs_and_attrs [list ] + # TokenPrivileges -> 3 + foreach priv [GetTokenInformation $tok 3] { + lassign $priv luid attr + lappend privs_and_attrs [map_luid_to_privilege $luid -mapunknown] \ + [map_token_privilege_attr $attr] + } + + return $privs_and_attrs + +} + + +# Get the sid that will be used as the owner for objects created using this +# token. Returns name instead of sid if -name options specified +proc twapi::get_token_owner {tok args} { + # TokenOwner -> 4 + return [ _get_token_sid_field $tok 4 $args] +} + + +# Get the sid that will be used as the primary group for objects created using +# this token. Returns name instead of sid if -name options specified +proc twapi::get_token_primary_group {tok args} { + # TokenPrimaryGroup -> 5 + return [ _get_token_sid_field $tok 5 $args] +} + +proc twapi::get_token_default_dacl {tok} { + # TokenDefaultDacl -> 6 + return [GetTokenInformation $tok 6] +} + +proc twapi::get_token_origin {tok} { + # TokenOrigin -> 17 + return [GetTokenInformation $tok 17] +} + +# Return the source of an access token +proc twapi::get_token_source {tok} { + return [GetTokenInformation $tok 7]; # TokenSource +} + + +# Return the token type of an access token +proc twapi::get_token_type {tok} { + # TokenType -> 8 + set type [GetTokenInformation $tok 8] + if {$type == 1} { + return "primary" + } elseif {$type == 2} { + return "impersonation" + } else { + return $type + } +} + +# Return the token type of an access token +proc twapi::get_token_impersonation_level {tok} { + # TokenImpersonationLevel -> 9 + return [_map_impersonation_level [GetTokenInformation $tok 9]] +} + +# Return the linked token when a token is filtered +proc twapi::get_token_linked_token {tok} { + # TokenLinkedToken -> 19 + return [GetTokenInformation $tok 19] +} + +# Return token statistics +proc twapi::get_token_statistics {tok} { + array set stats {} + set labels {luid authluid expiration type impersonationlevel + dynamiccharged dynamicavailable groupcount + privilegecount modificationluid} + # TokenStatistics -> 10 + set statinfo [GetTokenInformation $tok 10] + foreach label $labels val $statinfo { + set stats($label) $val + } + set stats(type) [expr {$stats(type) == 1 ? "primary" : "impersonation"}] + set stats(impersonationlevel) [_map_impersonation_level $stats(impersonationlevel)] + + return [array get stats] +} + + +# Enable the privilege state of a token. Generates an error if +# the specified privileges do not exist in the token (either +# disabled or enabled), or cannot be adjusted +proc twapi::enable_token_privileges {tok privs} { + set luid_attrs [list] + foreach priv $privs { + # SE_PRIVILEGE_ENABLED -> 2 + lappend luid_attrs [list [map_privilege_to_luid $priv] 2] + } + + set privs [list ] + foreach {item} [Twapi_AdjustTokenPrivileges $tok 0 $luid_attrs] { + lappend privs [map_luid_to_privilege [lindex $item 0] -mapunknown] + } + return $privs + + + +} + +# Disable the privilege state of a token. Generates an error if +# the specified privileges do not exist in the token (either +# disabled or enabled), or cannot be adjusted +proc twapi::disable_token_privileges {tok privs} { + set luid_attrs [list] + foreach priv $privs { + lappend luid_attrs [list [map_privilege_to_luid $priv] 0] + } + + set privs [list ] + foreach {item} [Twapi_AdjustTokenPrivileges $tok 0 $luid_attrs] { + lappend privs [map_luid_to_privilege [lindex $item 0] -mapunknown] + } + return $privs +} + +# Disable all privs in a token +proc twapi::disable_all_token_privileges {tok} { + set privs [list ] + foreach {item} [Twapi_AdjustTokenPrivileges $tok 1 [list ]] { + lappend privs [map_luid_to_privilege [lindex $item 0] -mapunknown] + } + return $privs +} + + +# Map a privilege given as a LUID +proc twapi::map_luid_to_privilege {luid args} { + variable _luid_to_privilege_map + + array set opts [parseargs args [list system.arg mapunknown] -nulldefault] + + if {[dict exists $_luid_to_privilege_map $opts(system) $luid]} { + return [dict get $_luid_to_privilege_map $opts(system) $luid] + } + + # luid may in fact be a privilege name. Check for this + if {[is_valid_luid_syntax $luid]} { + trap { + set name [LookupPrivilegeName $opts(system) $luid] + dict set _luid_to_privilege_map $opts(system) $luid $name + } onerror {TWAPI_WIN32 1313} { + if {! $opts(mapunknown)} { + rethrow + } + set name "Privilege-$luid" + # Do not put in cache as privilege name might change? + } + } else { + # Not a valid LUID syntax. Check if it's a privilege name + if {[catch {map_privilege_to_luid $luid -system $opts(system)}]} { + error "Invalid LUID '$luid'" + } + return $luid; # $luid is itself a priv name + } + + return $name +} + + +# Map a privilege to a LUID +proc twapi::map_privilege_to_luid {priv args} { + variable _privilege_to_luid_map + + array set opts [parseargs args [list system.arg] -nulldefault] + + if {[dict exists $_privilege_to_luid_map $opts(system) $priv]} { + return [dict get $_privilege_to_luid_map $opts(system) $priv] + } + + # First check for privilege names we might have generated + if {[string match "Privilege-*" $priv]} { + set priv [string range $priv 10 end] + } + + # If already a LUID format, return as is, else look it up + if {[is_valid_luid_syntax $priv]} { + return $priv + } + + set luid [LookupPrivilegeValue $opts(system) $priv] + # This is an expensive call so stash it unless cache too big + if {[dict size $_privilege_to_luid_map] < 100} { + dict set _privilege_to_luid_map $opts(system) $priv $luid + } + + return $luid +} + + +# Return 1/0 if in LUID format +proc twapi::is_valid_luid_syntax {luid} { + return [regexp {^[[:xdigit:]]{8}-[[:xdigit:]]{8}$} $luid] +} + + +################################################################ +# Functions related to ACE's and ACL's + +# Create a new ACE +proc twapi::new_ace {type account rights args} { + array set opts [parseargs args { + {self.bool 1} + {recursecontainers.bool 0 2} + {recurseobjects.bool 0 1} + {recurseonelevelonly.bool 0 4} + {auditsuccess.bool 1 0x40} + {auditfailure.bool 1 0x80} + }] + + set sid [map_account_to_sid $account] + + set access_mask [_access_rights_to_mask $rights] + + switch -exact -- $type { + mandatory_label - + allow - + deny - + audit { + set typecode [_ace_type_symbol_to_code $type] + } + default { + error "Invalid or unsupported ACE type '$type'" + } + } + + set inherit_flags [expr {$opts(recursecontainers) | $opts(recurseobjects) | + $opts(recurseonelevelonly)}] + if {! $opts(self)} { + incr inherit_flags 8; #INHERIT_ONLY_ACE + } + + if {$type eq "audit"} { + set inherit_flags [expr {$inherit_flags | $opts(auditsuccess) | $opts(auditfailure)}] + } + + return [list $typecode $inherit_flags $access_mask $sid] +} + +# Get the ace type (allow, deny etc.) +proc twapi::get_ace_type {ace} { + return [_ace_type_code_to_symbol [lindex $ace 0]] +} + + +# Set the ace type (allow, deny etc.) +proc twapi::set_ace_type {ace type} { + return [lreplace $ace 0 0 [_ace_type_symbol_to_code $type]] +} + +# Get the access rights in an ACE +proc twapi::get_ace_rights {ace args} { + array set opts [parseargs args { + {type.arg ""} + resourcetype.arg + raw + } -maxleftover 0] + + if {$opts(raw)} { + return [format 0x%x [lindex $ace 2]] + } + + if {[lindex $ace 0] == 0x11} { + # MANDATORY_LABEL -> 0x11 + # Resource type is immaterial + return [_access_mask_to_rights [lindex $ace 2] mandatory_label] + } + + # Backward compatibility - in 2.x -type was documented instead + # of -resourcetype + if {[info exists opts(resourcetype)]} { + return [_access_mask_to_rights [lindex $ace 2] $opts(resourcetype)] + } else { + return [_access_mask_to_rights [lindex $ace 2] $opts(type)] + } +} + +# Set the access rights in an ACE +proc twapi::set_ace_rights {ace rights} { + return [lreplace $ace 2 2 [_access_rights_to_mask $rights]] +} + + +# Get the ACE sid +proc twapi::get_ace_sid {ace} { + return [lindex $ace 3] +} + +# Set the ACE sid +proc twapi::set_ace_sid {ace account} { + return [lreplace $ace 3 3 [map_account_to_sid $account]] +} + + +# Get audit flags - TBD document and test +proc twapi::get_ace_audit {ace} { + set audit {} + set mask [lindex $ace 1] + if {$mask & 0x40} { + lappend audit "success" + } + if {$mask & 0x80} { + lappend audit "failure" + } + return $audit +} + +# Get the inheritance options +proc twapi::get_ace_inheritance {ace} { + + set inherit_opts [list ] + set inherit_mask [lindex $ace 1] + + lappend inherit_opts -self \ + [expr {($inherit_mask & 8) == 0}] + lappend inherit_opts -recursecontainers \ + [expr {($inherit_mask & 2) != 0}] + lappend inherit_opts -recurseobjects \ + [expr {($inherit_mask & 1) != 0}] + lappend inherit_opts -recurseonelevelonly \ + [expr {($inherit_mask & 4) != 0}] + lappend inherit_opts -inherited \ + [expr {($inherit_mask & 16) != 0}] + + return $inherit_opts +} + +# Set the inheritance options. Unspecified options are not set +proc twapi::set_ace_inheritance {ace args} { + + array set opts [parseargs args { + self.bool + recursecontainers.bool + recurseobjects.bool + recurseonelevelonly.bool + }] + + set inherit_flags [lindex $ace 1] + if {[info exists opts(self)]} { + if {$opts(self)} { + resetbits inherit_flags 0x8; #INHERIT_ONLY_ACE -> 0x8 + } else { + setbits inherit_flags 0x8; #INHERIT_ONLY_ACE -> 0x8 + } + } + + foreach { + opt mask + } { + recursecontainers 2 + recurseobjects 1 + recurseonelevelonly 4 + } { + if {[info exists opts($opt)]} { + if {$opts($opt)} { + setbits inherit_flags $mask + } else { + resetbits inherit_flags $mask + } + } + } + + return [lreplace $ace 1 1 $inherit_flags] +} + + +# Sort ACE's in the standard recommended Win2K order +proc twapi::sort_aces {aces} { + + _init_ace_type_symbol_to_code_map + + foreach type [array names twapi::_ace_type_symbol_to_code_map] { + set direct_aces($type) [list ] + set inherited_aces($type) [list ] + } + + # Sort order is as follows: all direct (non-inherited) ACEs come + # before all inherited ACEs. Within these groups, the order should be + # access denied ACEs, access denied ACEs for objects/properties, + # access allowed ACEs, access allowed ACEs for objects/properties, + # TBD - check this ordering against http://msdn.microsoft.com/en-us/library/windows/desktop/aa379298%28v=vs.85%29.aspx + foreach ace $aces { + set type [get_ace_type $ace] + # INHERITED_ACE -> 0x10 + if {[lindex $ace 1] & 0x10} { + lappend inherited_aces($type) $ace + } else { + lappend direct_aces($type) $ace + } + } + + # TBD - check this order ACE's, especially audit and mandatory label + return [concat \ + $direct_aces(deny) \ + $direct_aces(deny_object) \ + $direct_aces(deny_callback) \ + $direct_aces(deny_callback_object) \ + $direct_aces(allow) \ + $direct_aces(allow_object) \ + $direct_aces(allow_compound) \ + $direct_aces(allow_callback) \ + $direct_aces(allow_callback_object) \ + $direct_aces(audit) \ + $direct_aces(audit_object) \ + $direct_aces(audit_callback) \ + $direct_aces(audit_callback_object) \ + $direct_aces(mandatory_label) \ + $direct_aces(alarm) \ + $direct_aces(alarm_object) \ + $direct_aces(alarm_callback) \ + $direct_aces(alarm_callback_object) \ + $inherited_aces(deny) \ + $inherited_aces(deny_object) \ + $inherited_aces(deny_callback) \ + $inherited_aces(deny_callback_object) \ + $inherited_aces(allow) \ + $inherited_aces(allow_object) \ + $inherited_aces(allow_compound) \ + $inherited_aces(allow_callback) \ + $inherited_aces(allow_callback_object) \ + $inherited_aces(audit) \ + $inherited_aces(audit_object) \ + $inherited_aces(audit_callback) \ + $inherited_aces(audit_callback_object) \ + $inherited_aces(mandatory_label) \ + $inherited_aces(alarm) \ + $inherited_aces(alarm_object) \ + $inherited_aces(alarm_callback) \ + $inherited_aces(alarm_callback_object)] +} + +# Pretty print an ACL +proc twapi::get_acl_text {acl args} { + array set opts [parseargs args { + {resourcetype.arg raw} + {offset.arg ""} + } -maxleftover 0] + + set count 0 + set result "$opts(offset)Rev: [get_acl_rev $acl]\n" + foreach ace [get_acl_aces $acl] { + append result "$opts(offset)ACE #[incr count]\n" + append result [get_ace_text $ace -offset "$opts(offset) " -resourcetype $opts(resourcetype)] + } + return $result +} + +# Pretty print an ACE +proc twapi::get_ace_text {ace args} { + array set opts [parseargs args { + {resourcetype.arg raw} + {offset.arg ""} + } -maxleftover 0] + + if {$ace eq "null"} { + return "Null" + } + + set offset $opts(offset) + array set bools {0 No 1 Yes} + array set inherit_flags [get_ace_inheritance $ace] + append inherit_text "${offset}Inherited: $bools($inherit_flags(-inherited))\n" + append inherit_text "${offset}Include self: $bools($inherit_flags(-self))\n" + append inherit_text "${offset}Recurse containers: $bools($inherit_flags(-recursecontainers))\n" + append inherit_text "${offset}Recurse objects: $bools($inherit_flags(-recurseobjects))\n" + append inherit_text "${offset}Recurse single level only: $bools($inherit_flags(-recurseonelevelonly))\n" + + set rights [get_ace_rights $ace -type $opts(resourcetype)] + if {[lsearch -glob $rights *_all_access] >= 0} { + set rights "All" + } else { + set rights [join $rights ", "] + } + + set acetype [get_ace_type $ace] + append result "${offset}Type: [string totitle $acetype]\n" + set user [get_ace_sid $ace] + catch {append user " ([map_account_to_name [get_ace_sid $ace]])"} + append result "${offset}User: $user\n" + append result "${offset}Rights: $rights\n" + if {$acetype eq "audit"} { + append result "${offset}Audit conditions: [join [get_ace_audit $ace] {, }]\n" + } + append result $inherit_text + + return $result +} + +# Create a new ACL +proc twapi::new_acl {{aces ""}} { + # NOTE: we ALWAYS set aclrev to 2. This may not be correct for the + # supplied ACEs but that's ok. The C level code calculates the correct + # acl rev level and overwrites anyways. + return [list 2 $aces] +} + +# Creates an ACL that gives the specified rights to specified trustees +proc twapi::new_restricted_dacl {accounts rights args} { + set access_mask [_access_rights_to_mask $rights] + + set aces {} + foreach account $accounts { + lappend aces [new_ace allow $account $access_mask {*}$args] + } + + return [new_acl $aces] + +} + +# Return the list of ACE's in an ACL +proc twapi::get_acl_aces {acl} { + return [lindex $acl 1] +} + +# Set the ACE's in an ACL +proc twapi::set_acl_aces {acl aces} { + # Note, we call new_acl since when ACEs change, the rev may also change + return [new_acl $aces] +} + +# Append to the ACE's in an ACL +proc twapi::append_acl_aces {acl aces} { + return [set_acl_aces $acl [concat [get_acl_aces $acl] $aces]] +} + +# Prepend to the ACE's in an ACL +proc twapi::prepend_acl_aces {acl aces} { + return [set_acl_aces $acl [concat $aces [get_acl_aces $acl]]] +} + +# Arrange the ACE's in an ACL in a standard order +proc twapi::sort_acl_aces {acl} { + return [set_acl_aces $acl [sort_aces [get_acl_aces $acl]]] +} + +# Return the ACL revision of an ACL +proc twapi::get_acl_rev {acl} { + return [lindex $acl 0] +} + + +# Create a new security descriptor +proc twapi::new_security_descriptor {args} { + array set opts [parseargs args { + owner.arg + group.arg + dacl.arg + sacl.arg + } -maxleftover 0] + + set secd [Twapi_InitializeSecurityDescriptor] + + # TBD - where are the control bits set? THe set_security_descrip[tor_* + # don't seem to set the control bits for related fields either. + foreach field {owner group dacl sacl} { + if {[info exists opts($field)]} { + set secd [set_security_descriptor_$field $secd $opts($field)] + } + } + + return $secd +} + +# Return the control bits in a security descriptor +# TBD - update for new Windows versions +proc twapi::get_security_descriptor_control {secd} { + if {[_null_secd $secd]} { + error "Attempt to get control field from NULL security descriptor." + } + + set control [lindex $secd 0] + + set retval [list ] + if {$control & 0x0001} { + lappend retval owner_defaulted + } + if {$control & 0x0002} { + lappend retval group_defaulted + } + if {$control & 0x0004} { + lappend retval dacl_present + } + if {$control & 0x0008} { + lappend retval dacl_defaulted + } + if {$control & 0x0010} { + lappend retval sacl_present + } + if {$control & 0x0020} { + lappend retval sacl_defaulted + } + if {$control & 0x0100} { + # Not documented because should not actually appear when reading a secd + lappend retval dacl_auto_inherit_req + } + if {$control & 0x0200} { + # Not documented because should not actually appear when reading a secd + lappend retval sacl_auto_inherit_req + } + if {$control & 0x0400} { + lappend retval dacl_auto_inherited + } + if {$control & 0x0800} { + lappend retval sacl_auto_inherited + } + if {$control & 0x1000} { + lappend retval dacl_protected + } + if {$control & 0x2000} { + lappend retval sacl_protected + } + if {$control & 0x4000} { + lappend retval rm_control_valid + } + if {$control & 0x8000} { + lappend retval self_relative + } + return $retval +} + +# Return the owner in a security descriptor +proc twapi::get_security_descriptor_owner {secd} { + if {[_null_secd $secd]} { + win32_error 87 "Attempt to get owner field from NULL security descriptor." + } + return [lindex $secd 1] +} + +# Set the owner in a security descriptor +proc twapi::set_security_descriptor_owner {secd account {defaulted 0}} { + if {[_null_secd $secd]} { + set secd [new_security_descriptor] + } + lassign $secd control - group dacl sacl + set sid [map_account_to_sid $account] + if {$defaulted} { + set control [expr {$control | 0x1}]; # SE_OWNER_DEFAULTED + } else { + set control [expr {$control & ~0x1}]; # ! SE_OWNER_DEFAULTED + } + return [list $control $sid $group $dacl $sacl] +} + +# Return the group in a security descriptor +proc twapi::get_security_descriptor_group {secd} { + if {[_null_secd $secd]} { + win32_error 87 "Attempt to get group field from NULL security descriptor." + } + return [lindex $secd 2] +} + +# Set the group in a security descriptor +proc twapi::set_security_descriptor_group {secd account {defaulted 0}} { + if {[_null_secd $secd]} { + set secd [new_security_descriptor] + } + lassign $secd control owner - dacl sacl + set sid [map_account_to_sid $account] + if {$defaulted} { + set control [expr {$control | 0x2}]; # SE_GROUP_DEFAULTED + } else { + set control [expr {$control & ~0x2}]; # ! SE_GROUP_DEFAULTED + } + return [list $control $owner $sid $dacl $sacl] +} + +# Return the DACL in a security descriptor +proc twapi::get_security_descriptor_dacl {secd} { + if {[_null_secd $secd]} { + win32_error 87 "Attempt to get DACL field from NULL security descriptor." + } + return [lindex $secd 3] +} + +# Set the dacl in a security descriptor +proc twapi::set_security_descriptor_dacl {secd acl {defaulted 0}} { + if {![_is_valid_acl $acl]} { + error "Invalid ACL <$acl>." + } + if {[_null_secd $secd]} { + set secd [new_security_descriptor] + } + lassign $secd control owner group - sacl + if {$acl eq "null"} { + set control [expr {$control & ~0x4}]; # ! SE_DACL_PRESENT + } else { + set control [expr {$control | 0x4}]; # SE_DACL_PRESENT + } + if {$defaulted} { + set control [expr {$control | 0x8}]; # SE_DACL_DEFAULTED + } else { + set control [expr {$control & ~0x8}]; # ! SE_DACL_DEFAULTED + } + return [list $control $owner $group $acl $sacl] +} + +# Return the SACL in a security descriptor +proc twapi::get_security_descriptor_sacl {secd} { + if {[_null_secd $secd]} { + win32_error 87 "Attempt to get SACL field from NULL security descriptor." + } + return [lindex $secd 4] +} + +# Set the sacl in a security descriptor +proc twapi::set_security_descriptor_sacl {secd acl {defaulted 0}} { + if {![_is_valid_acl $acl]} { + error "Invalid ACL <$acl>." + } + if {[_null_secd $secd]} { + set secd [new_security_descriptor] + } + lassign $secd control owner group dacl - + if {$acl eq "null"} { + set control [expr {$control & ~0x10}]; # ! SE_SACL_PRESENT + } else { + set control [expr {$control | 0x10}]; # SE_SACL_PRESENT + } + if {$defaulted} { + set control [expr {$control | 0x20}]; # SE_SACL_DEFAULTED + } else { + set control [expr {$control & ~0x20}]; # ! SE_SACL_DEFAULTED + } + return [list $control $owner $group $dacl $acl] +} + +# Get the specified security information for the given object +proc twapi::get_resource_security_descriptor {restype name args} { + + # -mandatory_label field is not documented. Should we ? TBD + array set opts [parseargs args { + owner + group + dacl + sacl + mandatory_label + all + handle + }] + + set wanted 0 + + # OWNER_SECURITY_INFORMATION 1 + # GROUP_SECURITY_INFORMATION 2 + # DACL_SECURITY_INFORMATION 4 + # SACL_SECURITY_INFORMATION 8 + foreach {field mask} {owner 1 group 2 dacl 4 sacl 8} { + if {$opts($field) || $opts(all)} { + incr wanted $mask; # Equivalent to OR operation + } + } + + # LABEL_SECURITY_INFORMATION 0x10 + if {[min_os_version 6]} { + if {$opts(mandatory_label) || $opts(all)} { + incr wanted 16; # OR with 0x10 + } + } + + # Note if no options specified, we ask for everything except + # SACL's which require special privileges + if {! $wanted} { + set wanted 0x7 + if {[min_os_version 6]} { + incr wanted 0x10 + } + } + + if {$opts(handle)} { + set restype [_map_resource_symbol_to_type $restype false] + if {$restype == 5} { + # GetSecurityInfo crashes if a handles is passed in for + # SE_LMSHARE (even erroneously). It expects a string name + # even though the prototype says HANDLE. Protect against this. + error "Share resource type (share or 5) cannot be used with -handle option" + } + set secd [GetSecurityInfo \ + [CastToHANDLE $name] \ + $restype \ + $wanted] + } else { + # GetNamedSecurityInfo seems to fail with a overlapped i/o + # in progress error under some conditions. If this happens + # try getting with resource-specific API's if possible. + trap { + set secd [GetNamedSecurityInfo \ + $name \ + [_map_resource_symbol_to_type $restype true] \ + $wanted] + } onerror {} { + # TBD - see what other resource-specific API's there are + if {$restype eq "share"} { + set secd [lindex [get_share_info $name -secd] 1] + } else { + # Throw the same error + rethrow + } + } + } + + return $secd +} + + +# Set the specified security information for the given object +# See http://search.cpan.org/src/TEVERETT/Win32-Security-0.50/README +# for a good discussion even though that applies to Perl +proc twapi::set_resource_security_descriptor {restype name secd args} { + + # PROTECTED_DACL_SECURITY_INFORMATION 0x80000000 + # PROTECTED_SACL_SECURITY_INFORMATION 0x40000000 + # UNPROTECTED_DACL_SECURITY_INFORMATION 0x20000000 + # UNPROTECTED_SACL_SECURITY_INFORMATION 0x10000000 + array set opts [parseargs args { + all + handle + owner + group + dacl + sacl + mandatory_label + {protect_dacl {} 0x80000000} + {unprotect_dacl {} 0x20000000} + {protect_sacl {} 0x40000000} + {unprotect_sacl {} 0x10000000} + }] + + + if {![min_os_version 6]} { + if {$opts(mandatory_label)} { + error "Option -mandatory_label not supported by this version of Windows" + } + } + + if {$opts(protect_dacl) && $opts(unprotect_dacl)} { + error "Cannot specify both -protect_dacl and -unprotect_dacl." + } + + if {$opts(protect_sacl) && $opts(unprotect_sacl)} { + error "Cannot specify both -protect_sacl and -unprotect_sacl." + } + + set mask [expr {$opts(protect_dacl) | $opts(unprotect_dacl) | + $opts(protect_sacl) | $opts(unprotect_sacl)}] + + if {$opts(owner) || $opts(all)} { + set opts(owner) [get_security_descriptor_owner $secd] + setbits mask 1; # OWNER_SECURITY_INFORMATION + } else { + set opts(owner) "" + } + + if {$opts(group) || $opts(all)} { + set opts(group) [get_security_descriptor_group $secd] + setbits mask 2; # GROUP_SECURITY_INFORMATION + } else { + set opts(group) "" + } + + if {$opts(dacl) || $opts(all)} { + set opts(dacl) [get_security_descriptor_dacl $secd] + setbits mask 4; # DACL_SECURITY_INFORMATION + } else { + set opts(dacl) null + } + + if {$opts(sacl) || $opts(mandatory_label) || $opts(all)} { + set sacl [get_security_descriptor_sacl $secd] + if {$opts(sacl) || $opts(all)} { + setbits mask 0x8; # SACL_SECURITY_INFORMATION + } + if {[min_os_version 6]} { + if {$opts(mandatory_label) || $opts(all)} { + setbits mask 0x10; # LABEL_SECURITY_INFORMATION + } + } + set opts(sacl) $sacl + } else { + set opts(sacl) null + } + + if {$mask == 0} { + error "Must specify at least one of the options -all, -dacl, -sacl, -owner, -group or -mandatory_label" + } + + if {$opts(handle)} { + set restype [_map_resource_symbol_to_type $restype false] + if {$restype == 5} { + # GetSecurityInfo crashes if a handles is passed in for + # SE_LMSHARE (even erroneously). It expects a string name + # even though the prototype says HANDLE. Protect against this. + error "Share resource type (share or 5) cannot be used with -handle option" + } + + SetSecurityInfo \ + [CastToHANDLE $name] \ + [_map_resource_symbol_to_type $restype false] \ + $mask \ + $opts(owner) \ + $opts(group) \ + $opts(dacl) \ + $opts(sacl) + } else { + SetNamedSecurityInfo \ + $name \ + [_map_resource_symbol_to_type $restype true] \ + $mask \ + $opts(owner) \ + $opts(group) \ + $opts(dacl) \ + $opts(sacl) + } +} + +# Get integrity level from a security descriptor +proc twapi::get_security_descriptor_integrity {secd args} { + if {[min_os_version 6]} { + foreach ace [get_acl_aces [get_security_descriptor_sacl $secd]] { + if {[get_ace_type $ace] eq "mandatory_label"} { + if {! [dict get [get_ace_inheritance $ace] -self]} continue; # Does not apply to itself + set integrity [_sid_to_integrity [get_ace_sid $ace] {*}$args] + set rights [get_ace_rights $ace -resourcetype mandatory_label] + return [list $integrity $rights] + } + } + } + return {} +} + +# Get integrity level for a resource +proc twapi::get_resource_integrity {restype name args} { + # Note label and raw options are simply passed on + + if {![min_os_version 6]} { + return "" + } + set saved_args $args + array set opts [parseargs args { + label + raw + handle + }] + + if {$opts(handle)} { + set secd [get_resource_security_descriptor $restype $name -mandatory_label -handle] + } else { + set secd [get_resource_security_descriptor $restype $name -mandatory_label] + } + + return [get_security_descriptor_integrity $secd {*}$saved_args] +} + + +proc twapi::set_security_descriptor_integrity {secd integrity rights args} { + # Not clear from docs whether this can + # be done without interfering with SACL fields. Nevertheless + # we provide this proc because we might want to set the + # integrity level on new objects create thru CreateFile etc. + # TBD - need to test under vista and win 7 + + array set opts [parseargs args { + {recursecontainers.bool 0} + {recurseobjects.bool 0} + } -maxleftover 0] + + # We preserve any non-integrity aces in the sacl. + set sacl [get_security_descriptor_sacl $secd] + set aces {} + foreach ace [get_acl_aces $sacl] { + if {[get_ace_type $ace] ne "mandatory_label"} { + lappend aces $ace + } + } + + # Now create and attach an integrity ace. Note placement does not + # matter + lappend aces [new_ace mandatory_label \ + [_integrity_to_sid $integrity] \ + [_access_rights_to_mask $rights] \ + -self 1 \ + -recursecontainers $opts(recursecontainers) \ + -recurseobjects $opts(recurseobjects)] + + return [set_security_descriptor_sacl $secd [new_acl $aces]] +} + +proc twapi::set_resource_integrity {restype name integrity rights args} { + array set opts [parseargs args { + {recursecontainers.bool 0} + {recurseobjects.bool 0} + handle + } -maxleftover 0] + + set secd [set_security_descriptor_integrity \ + [new_security_descriptor] \ + $integrity \ + $rights \ + -recurseobjects $opts(recurseobjects) \ + -recursecontainers $opts(recursecontainers)] + + if {$opts(handle)} { + set_resource_security_descriptor $restype $name $secd -mandatory_label -handle + } else { + set_resource_security_descriptor $restype $name $secd -mandatory_label + } +} + + +# Convert a security descriptor to SDDL format +proc twapi::security_descriptor_to_sddl {secd} { + return [twapi::ConvertSecurityDescriptorToStringSecurityDescriptor $secd 1 0x1f] +} + +# Convert SDDL to a security descriptor +proc twapi::sddl_to_security_descriptor {sddl} { + return [twapi::ConvertStringSecurityDescriptorToSecurityDescriptor $sddl 1] +} + +# Return the text for a security descriptor +proc twapi::get_security_descriptor_text {secd args} { + if {[_null_secd $secd]} { + return "null" + } + + array set opts [parseargs args { + {resourcetype.arg raw} + } -maxleftover 0] + + append result "Flags:\t[get_security_descriptor_control $secd]\n" + set name [get_security_descriptor_owner $secd] + if {$name eq ""} { + set name Undefined + } else { + catch {set name [map_account_to_name $name]} + } + append result "Owner:\t$name\n" + set name [get_security_descriptor_group $secd] + if {$name eq ""} { + set name Undefined + } else { + catch {set name [map_account_to_name $name]} + } + append result "Group:\t$name\n" + + if {0} { + set acl [get_security_descriptor_dacl $secd] + append result "DACL Rev: [get_acl_rev $acl]\n" + set index 0 + foreach ace [get_acl_aces $acl] { + append result "\tDACL Entry [incr index]\n" + append result "[get_ace_text $ace -offset "\t " -resourcetype $opts(resourcetype)]" + } + set acl [get_security_descriptor_sacl $secd] + append result "SACL Rev: [get_acl_rev $acl]\n" + set index 0 + foreach ace [get_acl_aces $acl] { + append result "\tSACL Entry $index\n" + append result [get_ace_text $ace -offset "\t " -resourcetype $opts(resourcetype)] + } + } else { + append result "DACL:\n" + append result [get_acl_text [get_security_descriptor_dacl $secd] -offset " " -resourcetype $opts(resourcetype)] + append result "SACL:\n" + append result [get_acl_text [get_security_descriptor_sacl $secd] -offset " " -resourcetype $opts(resourcetype)] + } + + return $result +} + + +# Log off +proc twapi::logoff {args} { + array set opts [parseargs args { + {force {} 0x4} + {forceifhung {} 0x10} + } -maxleftover 0] + ExitWindowsEx [expr {$opts(force) | $opts(forceifhung)}] 0 +} + +# Lock the workstation +proc twapi::lock_workstation {} { + LockWorkStation +} + + +# Get a new LUID +proc twapi::new_luid {} { + return [AllocateLocallyUniqueId] +} + + +# Get the description of a privilege +proc twapi::get_privilege_description {priv} { + if {[catch {LookupPrivilegeDisplayName "" $priv} desc]} { + # The above function will only return descriptions for + # privileges, not account rights. Hard code descriptions + # for some account rights + set desc [dict* { + SeBatchLogonRight "Log on as a batch job" + SeDenyBatchLogonRight "Deny logon as a batch job" + SeDenyInteractiveLogonRight "Deny interactive logon" + SeDenyNetworkLogonRight "Deny access to this computer from the network" + SeRemoteInteractiveLogonRight "Remote interactive logon" + SeDenyRemoteInteractiveLogonRight "Deny interactive remote logon" + SeDenyServiceLogonRight "Deny logon as a service" + SeInteractiveLogonRight "Log on locally" + SeNetworkLogonRight "Access this computer from the network" + SeServiceLogonRight "Log on as a service" + } $priv] + } + return $desc +} + + + +# For backward compatibility, emulate GetUserName using GetUserNameEx +proc twapi::GetUserName {} { + return [file tail [GetUserNameEx 2]] +} + + +################################################################ +# Utility and helper functions + + + +# Returns an sid field from a token +proc twapi::_get_token_sid_field {tok field options} { + array set opts [parseargs options {name}] + set owner [GetTokenInformation $tok $field] + if {$opts(name)} { + set owner [lookup_account_sid $owner] + } + return $owner +} + +# Map token group attributes +# TBD - write a test for this +proc twapi::map_token_group_attr {attr} { + # SE_GROUP_MANDATORY 0x00000001 + # SE_GROUP_ENABLED_BY_DEFAULT 0x00000002 + # SE_GROUP_ENABLED 0x00000004 + # SE_GROUP_OWNER 0x00000008 + # SE_GROUP_USE_FOR_DENY_ONLY 0x00000010 + # SE_GROUP_LOGON_ID 0xC0000000 + # SE_GROUP_RESOURCE 0x20000000 + # SE_GROUP_INTEGRITY 0x00000020 + # SE_GROUP_INTEGRITY_ENABLED 0x00000040 + + return [_make_symbolic_bitmask $attr { + mandatory 0x00000001 + enabled_by_default 0x00000002 + enabled 0x00000004 + owner 0x00000008 + use_for_deny_only 0x00000010 + logon_id 0xC0000000 + resource 0x20000000 + integrity 0x00000020 + integrity_enabled 0x00000040 + }] +} + +# Map token privilege attributes +# TBD - write a test for this +proc twapi::map_token_privilege_attr {attr} { + # SE_PRIVILEGE_ENABLED_BY_DEFAULT 0x00000001 + # SE_PRIVILEGE_ENABLED 0x00000002 + # SE_PRIVILEGE_USED_FOR_ACCESS 0x80000000 + + return [_make_symbolic_bitmask $attr { + enabled_by_default 0x00000001 + enabled 0x00000002 + used_for_access 0x80000000 + }] +} + + + +# Map an ace type symbol (eg. allow) to the underlying ACE type code +proc twapi::_ace_type_symbol_to_code {type} { + _init_ace_type_symbol_to_code_map + return $::twapi::_ace_type_symbol_to_code_map($type) +} + + +# Map an ace type code to an ACE type symbol +proc twapi::_ace_type_code_to_symbol {type} { + _init_ace_type_symbol_to_code_map + return $::twapi::_ace_type_code_to_symbol_map($type) +} + + +# Init the arrays used for mapping ACE type symbols to codes and back +proc twapi::_init_ace_type_symbol_to_code_map {} { + + if {[info exists ::twapi::_ace_type_symbol_to_code_map]} { + return + } + + # ACCESS_ALLOWED_ACE_TYPE 0x0 + # ACCESS_DENIED_ACE_TYPE 0x1 + # SYSTEM_AUDIT_ACE_TYPE 0x2 + # SYSTEM_ALARM_ACE_TYPE 0x3 + # ACCESS_ALLOWED_COMPOUND_ACE_TYPE 0x4 + # ACCESS_ALLOWED_OBJECT_ACE_TYPE 0x5 + # ACCESS_DENIED_OBJECT_ACE_TYPE 0x6 + # SYSTEM_AUDIT_OBJECT_ACE_TYPE 0x7 + # SYSTEM_ALARM_OBJECT_ACE_TYPE 0x8 + # ACCESS_ALLOWED_CALLBACK_ACE_TYPE 0x9 + # ACCESS_DENIED_CALLBACK_ACE_TYPE 0xA + # ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE 0xB + # ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE 0xC + # SYSTEM_AUDIT_CALLBACK_ACE_TYPE 0xD + # SYSTEM_ALARM_CALLBACK_ACE_TYPE 0xE + # SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE 0xF + # SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE 0x10 + # SYSTEM_MANDATORY_LABEL_ACE_TYPE 0x11 + + # Define the array. + array set ::twapi::_ace_type_symbol_to_code_map { + allow 0 deny 1 audit 2 alarm 3 allow_compound 4 + allow_object 5 deny_object 6 audit_object 7 + alarm_object 8 allow_callback 9 deny_callback 10 + allow_callback_object 11 deny_callback_object 12 + audit_callback 13 alarm_callback 14 audit_callback_object 15 + alarm_callback_object 16 mandatory_label 17 + } + + # Now define the array in the other direction + foreach {sym code} [array get ::twapi::_ace_type_symbol_to_code_map] { + set ::twapi::_ace_type_code_to_symbol_map($code) $sym + } +} + +# Map a resource symbol type to value +proc twapi::_map_resource_symbol_to_type {sym {named true}} { + if {[string is integer $sym]} { + return $sym + } + + # Note "window" is not here because window stations and desktops + # do not have unique names and cannot be used with Get/SetNamedSecurityInfo + switch -exact -- $sym { + file { return 1 } + service { return 2 } + printer { return 3 } + registry { return 4 } + share { return 5 } + kernelobj { return 6 } + } + if {$named} { + error "Resource type '$sym' not valid for named resources." + } + + switch -exact -- $sym { + windowstation { return 7 } + directoryservice { return 8 } + directoryserviceall { return 9 } + providerdefined { return 10 } + wmiguid { return 11 } + registrywow6432key { return 12 } + } + + error "Resource type '$sym' not valid" +} + +# Valid LUID syntax +proc twapi::_is_valid_luid_syntax luid { + return [regexp {^[[:xdigit:]]{8}-[[:xdigit:]]{8}$} $luid] +} + + +# Delete rights for an account +proc twapi::_delete_rights {account system} { + # Remove the user from the LSA rights database. Ignore any errors + catch { + remove_account_rights $account {} -all -system $system + + # On Win2k SP1 and SP2, we need to delay a bit for notifications + # to complete before deleting the account. + # See http://support.microsoft.com/?id=316827 + lassign [get_os_version] major minor sp dontcare + if {($major == 5) && ($minor == 0) && ($sp < 3)} { + after 1000 + } + } +} + + +# Get a token for a user +proc twapi::open_user_token {username password args} { + + array set opts [parseargs args { + domain.arg + {type.arg batch {interactive network batch service unlock network_cleartext new_credentials}} + {provider.arg default {default winnt35 winnt40 winnt50}} + } -nulldefault] + + # LOGON32_LOGON_INTERACTIVE 2 + # LOGON32_LOGON_NETWORK 3 + # LOGON32_LOGON_BATCH 4 + # LOGON32_LOGON_SERVICE 5 + # LOGON32_LOGON_UNLOCK 7 + # LOGON32_LOGON_NETWORK_CLEARTEXT 8 + # LOGON32_LOGON_NEW_CREDENTIALS 9 + set type [dict get {interactive 2 network 3 batch 4 service 5 + unlock 7 network_cleartext 8 new_credentials 9} $opts(type)] + + # LOGON32_PROVIDER_DEFAULT 0 + # LOGON32_PROVIDER_WINNT35 1 + # LOGON32_PROVIDER_WINNT40 2 + # LOGON32_PROVIDER_WINNT50 3 + set provider [dict get {default 0 winnt35 1 winnt40 2 winnt50 3} $opts(provider)] + + # If username is of the form user@domain, then domain must not be specified + # If username is not of the form user@domain, then domain is set to "." + # if it is empty + if {[regexp {^([^@]+)@(.+)} $username dummy user domain]} { + if {[string length $opts(domain)] != 0} { + error "The -domain option must not be specified when the username is in UPN format (user@domain)" + } + } else { + if {[string length $opts(domain)] == 0} { + set opts(domain) "." + } + } + + return [LogonUser $username $opts(domain) $password $type $provider] +} + + +# Impersonate a user given a token +proc twapi::impersonate_token {token} { + ImpersonateLoggedOnUser $token +} + + +# Impersonate a user +proc twapi::impersonate_user {args} { + set token [open_user_token {*}$args] + trap { + impersonate_token $token + } finally { + close_token $token + } +} + +# Impersonate self +proc twapi::impersonate_self {level} { + switch -exact -- $level { + anonymous { set level 0 } + identification { set level 1 } + impersonation { set level 2 } + delegation { set level 3 } + default { + error "Invalid impersonation level $level" + } + } + ImpersonateSelf $level +} + +# Set a thread token - currently only for current thread +proc twapi::set_thread_token {token} { + SetThreadToken NULL $token +} + +# Reset a thread token - currently only for current thread +proc twapi::reset_thread_token {} { + SetThreadToken NULL NULL +} + +proc twapi::_cred_cook {cred} { + set rec [twine {flags type target comment lastwritten credblob persist attributes targetalias username} $cred] + dict with rec { + set type [dict* { + 1 generic 2 domain_password 3 domain_certificate 4 domain_visible_password 5 generic_certificate 6 domain_extended} $type] + set persist [dict* { + 1 session 2 local_machine 3 enterprise + } $persist] + } + return $rec +} + +proc twapi::credentials {{pattern {}}} { + trap { + set raw [CredEnumerate $pattern 0] + } onerror {TWAPI_WIN32 1168} { + # Not found / no entries + return {} + } + + return [lmap cred $raw { _cred_cook $cred }] +} + +proc twapi::cred_delete {target {type generic}} { + if {[string is integer -strict $type]} { + set type_flags $type + } else { + set type_flags [dict get { + generic 1 + domain_password 2 + domain_certificate 3 + domain_visible_password 4 + generic_certificate 5 + domain_extended 6 + } $type] + } + CredDelete $target $type_flags 0 + return +} + +proc twapi::cred_get {target {type generic}} { + if {[string is integer -strict $type]} { + set type_flags $type + } else { + set type_flags [dict get { + generic 1 + domain_password 2 + domain_certificate 3 + domain_visible_password 4 + generic_certificate 5 + domain_extended 6 + } $type] + } + return [_cred_cook [CredRead $target $type_flags 0]] +} + + +# TBD - document after implementing AuditQuerySystemPolicy and friends +# for Vista & later +proc twapi::get_audit_policy {lsah} { + lassign [LsaQueryInformationPolicy $lsah 2] enabled audit_masks + set settings {} + foreach name { + system logon object_access privilege_use detailed_tracking + policy_change account_management directory_service_access + account_logon + } mask $audit_masks { + # Copied from the Perl Win32 book. + set setting {} + if {$mask == 0 || ($mask & 4)} { + set setting {} + } elseif {$mask & 3} { + if {$mask & 1} { lappend setting log_on_success } + if {$mask & 2} { lappend setting log_on_failure } + } else { + error "Unexpected audit mask value $mask" + } + lappend settings $name $setting + } + + return [list $enabled $settings] +} + + +# TBD - document after implementing AuditQuerySystemPolicy and friends +# for Vista & later +proc twapi::set_audit_policy {lsah enable settings} { + set audit_masks {} + # NOTE: the order here MUST match the enum definition for + # POLICY_AUDIT_EVENT_TYPE (see SDK docs) + foreach name { + system logon object_access privilege_use detailed_tracking + policy_change account_management directory_service_access + account_logon + } { + set mask 0; # POLICY_AUDIT_EVENT_UNCHANGED + if {[dict exists $settings $name]} { + set setting [dict get $settings $name] + # 4 -> POLICY_AUDIT_EVENT_NONE resets existing FAILURE|SUCCESS + set mask 4 + if {"log_on_success" in $setting} { + set mask [expr {$mask | 1}]; # POLICY_AUDIT_EVENT_SUCCESS + } + if {"log_on_failure" in $setting} { + set mask [expr {$mask | 2}]; # POLICY_AUDIT_EVENT_FAILURE + } + } + lappend audit_masks $mask + } + + Twapi_LsaSetInformationPolicy_AuditEvents $lsah $enable $audit_masks +} + +# Returns true if null security descriptor +proc twapi::_null_secd {secd} { + if {[llength $secd] == 0} { + return 1 + } else { + return 0 + } +} + +# Returns true if a valid ACL +proc twapi::_is_valid_acl {acl} { + if {$acl eq "null"} { + return 1 + } else { + return [IsValidAcl $acl] + } +} + +# Returns true if a valid ACL +proc twapi::_is_valid_security_descriptor {secd} { + if {[_null_secd $secd]} { + return 1 + } else { + return [IsValidSecurityDescriptor $secd] + } +} + +# Maps a integrity SID to integer or label +proc twapi::_sid_to_integrity {sid args} { + # Note - to make it simpler for callers, additional options are ignored + array set opts [parseargs args { + label + raw + }] + + if {$opts(raw) && $opts(label)} { + error "Options -raw and -label may not be specified together." + } + + if {![string equal -length 7 S-1-16-* $sid]} { + error "Unexpected integrity level value '$sid' returned by GetTokenInformation." + } + + if {$opts(raw)} { + return $sid + } + + set integrity [string range $sid 7 end] + + if {! $opts(label)} { + # Return integer level + return $integrity + } + + # Map to a label + if {$integrity < 4096} { + return untrusted + } elseif {$integrity < 8192} { + return low + } elseif {$integrity < 8448} { + return medium + } elseif {$integrity < 12288} { + return mediumplus + } elseif {$integrity < 16384} { + return high + } else { + return system + } + +} + +proc twapi::_integrity_to_sid {integrity} { + # Integrity level must be either a number < 65536 or a valid string + # or a SID. Check for the first two and convert to SID. Anything else + # will be trapped by the actual call as an invalid format. + if {[string is integer -strict $integrity]} { + set integrity S-1-16-[format %d $integrity]; # In case in hex + } else { + switch -glob -- $integrity { + untrusted { set integrity S-1-16-0 } + low { set integrity S-1-16-4096 } + medium { set integrity S-1-16-8192 } + mediumplus { set integrity S-1-16-8448 } + high { set integrity S-1-16-12288 } + system { set integrity S-1-16-16384 } + S-1-16-* { + if {![string is integer -strict [string range $integrity 7 end]]} { + error "Invalid integrity level '$integrity'" + } + # Format in case level component was in hex/octal + set integrity S-1-16-[format %d [string range $integrity 7 end]] + } + default { + error "Invalid integrity level '$integrity'" + } + } + } + return $integrity +} + +proc twapi::_map_luids_and_attrs_to_privileges {luids_and_attrs} { + set enabled_privs [list ] + set disabled_privs [list ] + foreach item $luids_and_attrs { + set priv [map_luid_to_privilege [lindex $item 0] -mapunknown] + # SE_PRIVILEGE_ENABLED -> 0x2 + if {[lindex $item 1] & 2} { + lappend enabled_privs $priv + } else { + lappend disabled_privs $priv + } + } + + return [list $enabled_privs $disabled_privs] +} + +# Map impersonation level to symbol +proc twapi::_map_impersonation_level ilevel { + set map { + 0 anonymous + 1 identification + 2 impersonation + 3 delegation + } + if {[dict exists $map [incr ilevel 0]]} { + return [dict get $map $ilevel] + } else { + return $ilevel + } +} + +proc twapi::_map_well_known_sid_name {sidname} { + if {[string is integer -strict $sidname]} { + return $sidname + } + + set sidname [string tolower $sidname] + set sidname [dict* { + administrator accountadministrator + {cert publishers} accountcertadmins + {domain computers} accountcomputers + {domain controllers} accountcontrollers + {domain admins} accountdomainadmins + {domain guests} accountdomainguests + {domain users} accountdomainusers + {enterprise admins} accountenterpriseadmins + guest accountguest + krbtgt accountkrbtgt + {read-only domain controllers} accountreadonlycontrollers + {schema admins} accountschemaadmins + {anonymous logon} anonymous + {authenticated users} authenticateduser + batch batch + administrators builtinadministrators + {all application packages} builtinanypackage + {backup operators} builtinbackupoperators + {distributed com users} builtindcomusers + builtin builtindomain + {event log readers} builtineventlogreadersgroup + guests builtinguests + {performance log users} builtinperfloggingusers + {performance monitor users} builtinperfmonitoringusers + {power users} builtinpowerusers + {remote desktop users} builtinremotedesktopusers + replicator builtinreplicator + users builtinusers + {console logon} consolelogon + {creator group} creatorgroup + {creator group server} creatorgroupserver + {creator owner} creatorowner + {owner rights} creatorownerrights + {creator owner server} creatorownerserver + dialup dialup + {digest authentication} digestauthentication + {enterprise domain controllers} enterprisecontrollers + {enterprise read-only domain controllers beta} enterprisereadonlycontrollers + {high mandatory level} highlabel + interactive interactive + local local + {local service} localservice + system localsystem + {low mandatory level} lowlabel + {medium mandatory level} mediumlabel + {medium plus mandatory level} mediumpluslabel + network network + {network service} networkservice + {enterprise read-only domain controllers} newenterprisereadonlycontrollers + {ntlm authentication} ntlmauthentication + {null sid} null + proxy proxy + {remote interactive logon} remotelogonid + restricted restrictedcode + {schannel authentication} schannelauthentication + self self + service service + {system mandatory level} systemlabel + {terminal server user} terminalserver + {untrusted mandatory level} untrustedlabel + everyone world + {write restricted} writerestrictedcode + } $sidname] + + return [dict! { + null 0 + world 1 + local 2 + creatorowner 3 + creatorgroup 4 + creatorownerserver 5 + creatorgroupserver 6 + ntauthority 7 + dialup 8 + network 9 + batch 10 + interactive 11 + service 12 + anonymous 13 + proxy 14 + enterprisecontrollers 15 + self 16 + authenticateduser 17 + restrictedcode 18 + terminalserver 19 + remotelogonid 20 + logonids 21 + localsystem 22 + localservice 23 + networkservice 24 + builtindomain 25 + builtinadministrators 26 + builtinusers 27 + builtinguests 28 + builtinpowerusers 29 + builtinaccountoperators 30 + builtinsystemoperators 31 + builtinprintoperators 32 + builtinbackupoperators 33 + builtinreplicator 34 + builtinprewindows2000compatibleaccess 35 + builtinremotedesktopusers 36 + builtinnetworkconfigurationoperators 37 + accountadministrator 38 + accountguest 39 + accountkrbtgt 40 + accountdomainadmins 41 + accountdomainusers 42 + accountdomainguests 43 + accountcomputers 44 + accountcontrollers 45 + accountcertadmins 46 + accountschemaadmins 47 + accountenterpriseadmins 48 + accountpolicyadmins 49 + accountrasandiasservers 50 + ntlmauthentication 51 + digestauthentication 52 + schannelauthentication 53 + thisorganization 54 + otherorganization 55 + builtinincomingforesttrustbuilders 56 + builtinperfmonitoringusers 57 + builtinperfloggingusers 58 + builtinauthorizationaccess 59 + builtinterminalserverlicenseservers 60 + builtindcomusers 61 + builtiniusers 62 + iuser 63 + builtincryptooperators 64 + untrustedlabel 65 + lowlabel 66 + mediumlabel 67 + highlabel 68 + systemlabel 69 + writerestrictedcode 70 + creatorownerrights 71 + cacheableprincipalsgroup 72 + noncacheableprincipalsgroup 73 + enterprisereadonlycontrollers 74 + accountreadonlycontrollers 75 + builtineventlogreadersgroup 76 + newenterprisereadonlycontrollers 77 + builtincertsvcdcomaccessgroup 78 + mediumpluslabel 79 + locallogon 80 + consolelogon 81 + thisorganizationcertificate 82 + applicationpackageauthority 83 + builtinanypackage 84 + capabilityinternetclient 85 + capabilityinternetclientserver 86 + capabilityprivatenetworkclientserver 87 + capabilitypictureslibrary 88 + capabilityvideoslibrary 89 + capabilitymusiclibrary 90 + capabilitydocumentslibrary 91 + capabilitysharedusercertificates 92 + capabilityenterpriseauthentication 93 + capabilityremovablestorage 94 + } $sidname] +} + diff --git a/src/punk86.vfs/lib/twapi4.7.2/service.tcl b/src/punk86.vfs/lib/twapi4.7.2/service.tcl new file mode 100644 index 00000000..649b480f --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/service.tcl @@ -0,0 +1,1187 @@ +# +# Copyright (c) 2003-2007, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi { + # When the process hosts Windows services, service_state + # is used to keep state of each service. The variable + # is indexed by NAME,FIELD where NAME is the name + # of the service and FIELD is one of "state", "script", + # "checkpoint", "waithint", "exitcode", "servicecode", + # "seq", "seqack" + variable service_state + + # Map service state names to integers + variable service_state_values + array set service_state_values { + stopped 1 + start_pending 2 + stop_pending 3 + running 4 + continue_pending 5 + pause_pending 6 + paused 7 + } +} + + +# Return 1/0 depending on whether the given service exists +# $name may be either the internal or display name +proc twapi::service_exists {name args} { + array set opts [parseargs args {system.arg database.arg} -nulldefault] + # 0x00020000 -> STANDARD_RIGHTS_READ + set scm [OpenSCManager $opts(system) $opts(database) 0x00020000] + + trap { + GetServiceKeyName $scm $name + set exists 1 + } onerror {TWAPI_WIN32 1060} { + # "no such service" error for internal name. + # Try display name + trap { + GetServiceDisplayName $scm $name + set exists 1 + } onerror {TWAPI_WIN32 1060} { + set exists 0 + } + } finally { + CloseServiceHandle $scm + } + + return $exists +} + + +# Create a service of the specified name +proc twapi::create_service {name command args} { + array set opts [parseargs args { + displayname.arg + {servicetype.arg win32_own_process {win32_own_process win32_share_process file_system_driver kernel_driver}} + {interactive.bool 0} + {starttype.arg auto_start {auto_start boot_start demand_start disabled system_start}} + {errorcontrol.arg normal {ignore normal severe critical}} + loadordergroup.arg + dependencies.arg + account.arg + password.arg + system.arg + database.arg + } -nulldefault] + + + if {[string length $opts(displayname)] == 0} { + set opts(displayname) $name + } + + if {[string length $command] == 0} { + error "The executable path must not be null when creating a service" + } + set opts(command) $command + + switch -exact -- $opts(servicetype) { + file_system_driver - + kernel_driver { + if {$opts(interactive)} { + error "Option -interactive cannot be specified when -servicetype is $opts(servicetype)." + } + } + default { + if {$opts(interactive) && [string length $opts(account)]} { + error "Option -interactive cannot be specified with the -account option as interactive services must run under the LocalSystem account." + } + if {[string equal $opts(starttype) "boot_start"] + || [string equal $opts(starttype) "system_start"]} { + error "Option -starttype value must be one of auto_start, demand_start or disabled when -servicetype is '$opts(servicetype)'." + } + } + } + + # Map keywords to integer values + set opts(servicetype) [_map_servicetype_sym $opts(servicetype)] + set opts(starttype) [_map_starttype_sym $opts(starttype)] + set opts(errorcontrol) [_map_errorcontrol_sym $opts(errorcontrol)] + + # If interactive, add the flag to the service type + if {$opts(interactive)} { + setbits opts(servicetype) 0x100; # SERVICE_INTERACTIVE_PROCESS + } + + # Ignore password if username not specified + if {[string length $opts(account)] == 0} { + set opts(password) "" + } else { + # If domain/system not specified, tack on ".\" for local system + if {[string first \\ $opts(account)] < 0} { + set opts(account) ".\\$opts(account)" + } + } + + # 2 -> SC_MANAGER_CREATE_SERVICE + set scm [OpenSCManager $opts(system) $opts(database) 2] + trap { + # 0x000F01FF -> SERVICE_ALL_ACCESS + set svch [CreateService \ + $scm \ + $name \ + $opts(displayname) \ + 0x000F01FF \ + $opts(servicetype) \ + $opts(starttype) \ + $opts(errorcontrol) \ + $opts(command) \ + $opts(loadordergroup) \ + "" \ + $opts(dependencies) \ + $opts(account) \ + $opts(password)] + + CloseServiceHandle $svch + + } finally { + CloseServiceHandle $scm + } + + return +} + + +# Delete the given service +proc twapi::delete_service {name args} { + + array set opts [parseargs args {system.arg database.arg} -nulldefault] + + # 0x00010000 -> DELETE access + set opts(scm_priv) 0x00010000 + set opts(svc_priv) 0x00010000 + set opts(proc) twapi::DeleteService + + _service_fn_wrapper $name opts + + return +} + + +# Get the internal name of a service +proc twapi::get_service_internal_name {name args} { + array set opts [parseargs args {system.arg database.arg} -nulldefault] + # 0x00020000 -> STANDARD_RIGHTS_READ + set scm [OpenSCManager $opts(system) $opts(database) 0x00020000] + + trap { + if {[catch {GetServiceKeyName $scm $name} internal_name]} { + # Maybe this is an internal name itself + GetServiceDisplayName $scm $name; # Will throw an error if not internal name + set internal_name $name + } + } finally { + CloseServiceHandle $scm + } + + return $internal_name +} + +proc twapi::get_service_display_name {name args} { + array set opts [parseargs args {system.arg database.arg} -nulldefault] + # 0x00020000 -> STANDARD_RIGHTS_READ + set scm [OpenSCManager $opts(system) $opts(database) 0x00020000] + + trap { + if {[catch {GetServiceDisplayName $scm $name} display_name]} { + # Maybe this is an display name itself + GetServiceKeyName $scm $name; # Will throw an error if not display name + set display_name $name + } + } finally { + CloseServiceHandle $scm + } + + return $display_name +} + +proc twapi::start_service {name args} { + array set opts [parseargs args { + system.arg + database.arg + params.arg + wait.int + } -nulldefault] + set opts(svc_priv) 0x10; # SERVICE_START + set opts(proc) twapi::StartService + set opts(args) [list $opts(params)] + unset opts(params) + + trap { + _service_fn_wrapper $name opts + } onerror {TWAPI_WIN32 1056} { + # Error 1056 means service already running + } + + return [wait {twapi::get_service_state $name -system $opts(system) -database $opts(database)} running $opts(wait)] +} + +# TBD - test +proc twapi::notify_service {name code args} { + array set opts [parseargs args { + system.arg + database.arg + ignorecodes.arg + } -nulldefault] + + if {[string is integer -strict $code] && $code >= 128 && $code <= 255} { + # 0x100 -> SERVICE_USER_DEFINED_CONTROL + set access 0x100 + } elseif {$code eq "paramchange"} { + # 0x40 -> SERVICE_PAUSE_CONTINUE + set access 0x40 + set code 6; # PARAMCHANGE + } else { + badargs! "Invalid service notification code \"$code\"." + } + + set scm [OpenSCManager $opts(system) $opts(database) 0x00020000] + trap { + set svch [OpenService $scm $name $access] + } finally { + CloseServiceHandle $scm + } + + trap { + ControlService $svch $code + } onerror {TWAPI_WIN32} { + if {[lsearch -exact -integer $opts(ignorecodes) [lindex $::errorCode 1]] < 0} { + # Not one of the error codes we can ignore. + rethrow + } + } finally { + CloseServiceHandle $svch + } + return +} + +proc twapi::control_service {name code access finalstate args} { + array set opts [parseargs args { + system.arg + database.arg + ignorecodes.arg + wait.int + } -nulldefault] + # 0x00020000 -> STANDARD_RIGHTS_READ + set scm [OpenSCManager $opts(system) $opts(database) 0x00020000] + trap { + set svch [OpenService $scm $name $access] + } finally { + CloseServiceHandle $scm + } + + trap { + ControlService $svch $code + } onerror {TWAPI_WIN32} { + if {[lsearch -exact -integer $opts(ignorecodes) [lindex $::errorCode 1]] < 0} { + # Not one of the error codes we can ignore. + rethrow + } + } finally { + CloseServiceHandle $svch + } + + if {[string length $finalstate]} { + # Wait until service is in specified state + return [wait {twapi::get_service_state $name -system $opts(system) -database $opts(database)} $finalstate $opts(wait)] + } else { + return 0 + } +} + +proc twapi::stop_service {name args} { + # 1 -> SERVICE_CONTROL_STOP + # 0x20 -> SERVICE_STOP + control_service $name 1 0x20 stopped -ignorecodes 1062 {*}$args +} + +proc twapi::pause_service {name args} { + # 2 -> SERVICE_CONTROL_PAUSE + # 0x40 -> SERVICE_PAUSE_CONTINUE + control_service $name 2 0x40 paused {*}$args +} + +proc twapi::continue_service {name args} { + # 3 -> SERVICE_CONTROL_CONTINUE + # 0x40 -> SERVICE_PAUSE_CONTINUE + control_service $name 3 0x40 running {*}$args +} + +proc twapi::interrogate_service {name args} { + # 4 -> SERVICE_CONTROL_INTERROGATE + # 0x80 -> SERVICE_INTERROGATE + control_service $name 4 0x80 "" {*}$args + return +} + + +# Retrieve status information for a service +proc twapi::get_service_status {name args} { + array set opts [parseargs args {system.arg database.arg} -nulldefault] + # 0x00020000 -> STANDARD_RIGHTS_READ + set scm [OpenSCManager $opts(system) $opts(database) 0x00020000] + trap { + # 4 -> SERVICE_QUERY_STATUS + set svch [OpenService $scm $name 4] + } finally { + # Do not need SCM anymore + CloseServiceHandle $scm + } + + trap { + return [QueryServiceStatusEx $svch 0] + } finally { + CloseServiceHandle $svch + } +} + + +# Get the state of the service +proc twapi::get_service_state {name args} { + return [kl_get [get_service_status $name {*}$args] state] +} + + +# Get the current configuration for a service +proc twapi::get_service_configuration {name args} { + array set opts [parseargs args { + system.arg + database.arg + all + servicetype + interactive + errorcontrol + starttype + command + loadordergroup + account + displayname + dependencies + description + scm_handle.arg + tagid + failureactions + delayedstart + } -nulldefault -hyphenated] + + if {$opts(-scm_handle) eq ""} { + # Use 0x00020000 -> STANDARD_RIGHTS_READ for SCM + set scmh [OpenSCManager $opts(-system) $opts(-database) 0x00020000] + trap { + set svch [OpenService $scmh $name 1]; # 1 -> SERVICE_QUERY_CONFIG + } finally { + CloseServiceHandle $scmh + } + } else { + set svch [OpenService $opts(-scm_handle) $name 1]; # 1 -> SERVICE_QUERY_CONFIG + } + + trap { + set result [QueryServiceConfig $svch] + if {$opts(-all) || $opts(-description)} { + dict set result -description {} + # For backwards compatibility, ignore errors if description + # cannot be obtained + catch { + dict set result -description [QueryServiceConfig2 $svch 1]; # 1 -> SERVICE_CONFIG_DESCRIPTION + } + } + + if {$opts(-all) || $opts(-failureactions)} { + # 2 -> SERVICE_CONFIG_FAILURE_ACTIONS + lassign [QueryServiceConfig2 $svch 2] resetperiod rebootmsg command failure_actions + set actions {} + foreach action $failure_actions { + lappend actions [list [dict* {0 none 1 restart 2 reboot 3 run} [lindex $action 0]] [lindex $action 1]] + } + dict set result -failureactions [list -resetperiod $resetperiod -rebootmsg $rebootmsg -command $command -actions $actions] + } + if {$opts(-all) || $opts(-delayedstart)} { + if {[min_os_version 6]} { + # 3 -> SERVICE_CONFIG_DELAYED_AUTO_START_INFO + dict set result -delayedstart [QueryServiceConfig2 $svch 3] + } else { + dict set result -delayedstart 0 + } + } + } finally { + CloseServiceHandle $svch + } + + if {! $opts(-all)} { + set result [dict filter $result script {k val} {set opts($k)}] + } + + if {[dict exists $result -errorcontrol]} { + dict set result -errorcontrol [_map_errorcontrol_code [dict get $result -errorcontrol]] + } + + if {[dict exists $result -starttype]} { + dict set result -starttype [_map_starttype_code [dict get $result -starttype]] + } + + return $result +} + +# Sets a service configuration +proc twapi::set_service_configuration {name args} { + # Get the current values - we will need these for validation + # with the new values + array set current [get_service_configuration $name -all] + set current(-password) ""; # This is not returned by get_service_configuration + + # Now parse arguments, filling in defaults + array set opts [parseargs args { + displayname.arg + servicetype.arg + interactive.bool + starttype.arg + errorcontrol.arg + command.arg + loadordergroup.arg + dependencies.arg + account.arg + password.arg + {system.arg ""} + {database.arg ""} + }] + + if {[info exists opts(account)] && ! [info exists opts(password)]} { + error "Option -password must also be specified when -account is specified." + } + + # Merge current configuration with specified options + foreach opt { + displayname + servicetype + interactive + starttype + errorcontrol + command + loadordergroup + dependencies + account + password + } { + if {[info exists opts($opt)]} { + set winparams($opt) $opts($opt) + } else { + set winparams($opt) $current(-$opt) + } + } + + # Validate the new configuration + switch -exact -- $winparams(servicetype) { + file_system_driver - + kernel_driver { + if {$winparams(interactive)} { + error "Option -interactive cannot be specified when -servicetype is $winparams(servicetype)." + } + } + default { + if {$winparams(interactive) && + [string length $winparams(account)] && + [string compare -nocase $winparams(account) "LocalSystem"] + } { + error "Option -interactive cannot be specified with the -account option as interactive services must run under the LocalSystem account." + } + if {[string equal $winparams(starttype) "boot_start"] + || [string equal $winparams(starttype) "system_start"]} { + error "Option -starttype value must be one of auto_start, demand_start or disabled when -servicetype is '$winparams(servicetype)'." + } + } + } + + # Map keywords to integer values + set winparams(servicetype) [_map_servicetype_sym $winparams(servicetype)] + set winparams(starttype) [_map_starttype_sym $winparams(starttype)] + set winparams(errorcontrol) [_map_errorcontrol_sym $winparams(errorcontrol)] + + # Merge the interactive setting + # 0x100 -> SERVICE_INTERACTIVE_PROCESS + if {$winparams(interactive)} { + setbits winparams(servicetype) 0x100 + } else { + resetbits winparams(servicetype) 0x100 + } + + # If domain/system not specified, tack on ".\" for local system + if {[string length $winparams(account)]} { + if {[string first \\ $winparams(account)] < 0} { + set winparams(account) ".\\$winparams(account)" + } + } + + # Now replace any options that were not specified with "no change" + # tokens. + foreach opt {servicetype starttype errorcontrol} { + if {![info exists opts($opt)]} { + set winparams($opt) 0xffffffff; # SERVICE_NO_CHANGE + } + } + # -servicetype and -interactive go in same field + if {![info exists opts(servicetype)] && ![info exists opts(interactive)]} { + set winparams(servicetype) 0xffffffff; # SERVICE_NO_CHANGE + } + + foreach opt {command loadordergroup dependencies account password displayname} { + if {![info exists opts($opt)]} { + set winparams($opt) $twapi::nullptr + } + } + + set opts(scm_priv) 0x00020000; # 0x00020000 -> STANDARD_RIGHTS_READ + set opts(svc_priv) 2; # 2 -> SERVICE_CHANGE_CONFIG + + set opts(proc) twapi::ChangeServiceConfig + set opts(args) \ + [list \ + $winparams(servicetype) \ + $winparams(starttype) \ + $winparams(errorcontrol) \ + $winparams(command) \ + $winparams(loadordergroup) \ + "" \ + $winparams(dependencies) \ + $winparams(account) \ + $winparams(password) \ + $winparams(displayname)] + + _service_fn_wrapper $name opts + + return +} + +proc twapi::set_service_delayed_start {name delay args} { + array set opts [parseargs args { + {system.arg ""} + {database.arg ""} + } -maxleftover 0] + + set opts(scm_priv) 0x00020000; # 0x00020000 -> STANDARD_RIGHTS_READ + set opts(svc_priv) 2; # 2 -> SERVICE_CHANGE_CONFIG + + set opts(proc) twapi::ChangeServiceConfig2 + set opts(args) [list 3 $delay] + + _service_fn_wrapper $name opts + return +} + +proc twapi::set_service_description {name description args} { + array set opts [parseargs args { + {system.arg ""} + {database.arg ""} + } -maxleftover 0] + + set opts(scm_priv) 0x00020000; # 0x00020000 -> STANDARD_RIGHTS_READ + set opts(svc_priv) 2; # 2 -> SERVICE_CHANGE_CONFIG + + set opts(proc) twapi::ChangeServiceConfig2 + set opts(args) [list 1 $description] + + _service_fn_wrapper $name opts + return +} + +proc twapi::set_service_failure_actions {name args} { + array set opts [parseargs args { + {system.arg ""} + {database.arg ""} + resetperiod.arg + {rebootmsg.arg __null__} + {command.arg __null__} + actions.arg + } -maxleftover 0] + + set opts(scm_priv) 0x00020000; # 0x00020000 -> STANDARD_RIGHTS_READ + set opts(svc_priv) 2; # 2 -> SERVICE_CHANGE_CONFIG + + # If option actions is not specified, actions for the service + # are left unchanged. + if {[info exists opts(actions)]} { + set actions {} + foreach action $opts(actions) { + if {[llength $action] != 2} { + error "Invalid format for failure action" + } + set action_code [dict* {none 0 restart 1 reboot 2 run 3} [lindex $action 0]] + if {$action_code == 1} { + # Also need SERVICE_START access right for restart action + set opts(svc_priv) [expr {$opts(svc_priv) | 0x10}] + } + lappend actions [list $action_code [lindex $action 1]] + } + if {![info exists opts(resetperiod)] || $opts(resetperiod) eq "infinite"} { + set opts(resetperiod) 0xffffffff + } + set fail_params [list $opts(resetperiod) $opts(rebootmsg) $opts(command) $actions] + } else { + if {[info exists opts(resetperiod)]} { + badargs! "Option -resetperiod can only be used if the -actions option is also specified." + } + set fail_params [list 0 $opts(rebootmsg) $opts(command)] + } + + set opts(proc) twapi::ChangeServiceConfig2 + set opts(args) [list 2 $fail_params]; # 2 -> SERVICE_CONFIG_FAILURE_ACTIONS + _service_fn_wrapper $name opts + return +} + +# Get status for the specified service types +proc twapi::get_multiple_service_status {args} { + set service_types [list \ + kernel_driver \ + file_system_driver \ + adapter \ + recognizer_driver \ + user_own_process \ + user_share_process \ + win32_own_process \ + win32_share_process] + set switches [concat $service_types \ + [list active inactive] \ + [list system.arg database.arg]] + array set opts [parseargs args $switches -nulldefault] + + set servicetype 0 + foreach type $service_types { + if {$opts($type)} { + set servicetype [expr { $servicetype | [_map_servicetype_sym $type]}] + } + } + if {$servicetype == 0} { + # No type specified, return all + set servicetype 0x3f + } + + set servicestate 0 + if {$opts(active)} { + set servicestate 1; # 1 -> SERVICE_ACTIVE + } + if {$opts(inactive)} { + set servicestate [expr {$servicestate | 2}]; # 2 -> SERVICE_INACTIVE + } + if {$servicestate == 0} { + # No state specified, include all + set servicestate 3 + } + + # 4 -> SC_MANAGER_ENUMERATE_SERVICE + set scm [OpenSCManager $opts(system) $opts(database) 4] + trap { + set fields { + servicetype state controls_accepted exitcode service_code + checkpoint wait_hint pid serviceflags name displayname interactive + } + return [list $fields [EnumServicesStatusEx $scm 0 $servicetype $servicestate __null__]] + } finally { + CloseServiceHandle $scm + } +} + + +# Get status for the dependents of the specified service +proc twapi::get_dependent_service_status {name args} { + array set opts [parseargs args \ + [list active inactive system.arg database.arg] \ + -nulldefault] + + set servicestate 0 + if {$opts(active)} { + set servicestate 1; # 1 -> SERVICE_ACTIVE + } + if {$opts(inactive)} { + set servicestate [expr {$servicestate | 2}]; # SERVICE_INACTIVE + } + if {$servicestate == 0} { + # No state specified, include all + set servicestate 3 + } + + set opts(svc_priv) 8; # SERVICE_ENUMERATE_DEPENDENTS + set opts(proc) twapi::EnumDependentServices + set opts(args) [list $servicestate] + + set fields { + servicetype state controls_accepted exitcode service_code + checkpoint wait_hint name displayname interactive + } + + return [list $fields [_service_fn_wrapper $name opts]] + + +} + + +################################################################ +# Commands for running as a service + +proc twapi::run_as_service {services args} { + variable service_state + + if {[llength $services] == 0} { + win32_error 87 "No services specified" + } + + array set opts [parseargs args { + interactive.bool + {controls.arg {stop shutdown}} + } -nulldefault -maxleftover 0] + + # Currently service controls are per process, not per service and + # are fixed for the duration of the process. + # TBD - C code actually allows for per service controls. Expose? + set service_state(controls) [_parse_service_accept_controls $opts(controls)] + if {![min_os_version 5 1]} { + # Not accepted on Win2k + if {$service_state(controls) & 0x80} { + error "Service control type 'sessionchange' is not valid on this platform" + } + } + + if {[llength $services] == 1} { + set type 0x10; # WIN32_OWN_PROCESS + } else { + set type 0x20; # WIN32_SHARE_PROCESS + } + if {$opts(interactive)} { + setbits type 0x100; # INTERACTIVE_PROCESS + } + + set service_defs [list ] + foreach service $services { + lassign $service name script + set name [string tolower $name] + lappend service_defs [list $name $service_state(controls)] + set service_state($name,state) stopped + set service_state($name,script) $script + set service_state($name,checkpoint) 0 + set service_state($name,waithint) 2000; # 2 seconds + set service_state($name,exitcode) 0 + set service_state($name,servicecode) 0 + set service_state($name,seq) 0 + set service_state($name,seqack) 0 + } + + twapi::Twapi_BecomeAService $type {*}$service_defs + + # Turn off console events by installing our own handler, + # else tclsh will exit when a user logs off even if it is running + # as a service + # COMMENTED OUT because now done in C code itself + # proc ::twapi::_service_console_handler args { return 1 } + # set_console_control_handler ::twapi::_service_console_handler + + # Redefine ourselves as we should not be called again + proc ::twapi::run_as_service args { + error "Already running as a service" + } +} + + +# Callback that handles requests from the service control manager +proc twapi::_service_handler {name service_status_handle control args} { + # TBD - should we catch the error or let the C code see it ? + if {[catch { + _service_handler_unsafe $name $service_status_handle $control $args + } msg]} { + # TBD - log error message + catch {eventlog_log "Error in service handler for service $name. $msg Stack: $::errorInfo" -type error} + } +} + +# Can raise an error +proc twapi::_service_handler_unsafe {name service_status_handle control extra_args} { + variable service_state + + set name [string tolower $name] + + # The service handler will receive control codes from the service + # control manager and modify the state of a service accordingly. + # It also calls the script registered by the application for + # the service. The caller is expected to complete the state change + # by calling service_change_state_complete either inside the + # callback or at some later point. + + set tell_app true; # Does app need to be notified ? + set report_status true; # Whether we should update status + set need_response true; # App should report status back + + switch -glob -- "$service_state($name,state),$control" { + stopped,start { + set service_state($name,state) start_pending + set service_state($name,checkpoint) 1 + } + start_pending,shutdown - + paused,shutdown - + pause_pending,shutdown - + continue_pending,shutdown - + running,shutdown - + start_pending,stop - + paused,stop - + pause_pending,stop - + continue_pending,stop - + running,stop { + set service_state($name,state) stop_pending + set service_state($name,checkpoint) 1 + } + running,pause { + set service_state($name,state) pause_pending + set service_state($name,checkpoint) 1 + } + pause_pending,continue - + paused,continue { + set service_state($name,state) continue_pending + set service_state($name,checkpoint) 1 + } + *,interrogate { + # No state change, we will simply report status below + set tell_app false; # No need to bother the application + } + *,userdefined - + *,paramchange - + *,netbindadd - + *,netbindremove - + *,netbindenable - + *,netbinddisable - + *,deviceevent - + *,hardwareprofilechange - + *,powerevent - + *,sessionchange { + # Notifications, should not report status. + set report_status false + set need_response false + } + default { + # All other cases are no-ops (e.g. paused,pause) or + # don't make logical sense (e.g. stop_pending,continue) + # For now, we simply ignore them but not sure + # if we should just update service status anyways + return + } + } + + if {$report_status} { + _report_service_status $name + } + + set result 0 + if {$tell_app} { + if {[catch { + if {$need_response} { + set seq [incr service_state($name,seq)] + } else { + set seq -1 + } + set result [uplevel #0 [linsert $service_state($name,script) end $control $name $seq {*}$extra_args]] + # Note that if the above script may call back into us, + # via update_service_status for example, the service + # state may be updated at this point + } msg]} { + # TBD - report if the script throws errors + } + } + + if {$result eq "allow"} { + set result 0 + } elseif {$result eq "deny"} { + set result 0x424D5144; # BROADCAST_QUERY_DENY + } + + return $result +} + +# Called by the application to update it's status +# status should be one of "running", "paused" or "stopped" +# seq is 0 or the sequence number of a previous callback to +# the application to which this is the response. +proc twapi::update_service_status {name seq state args} { + variable service_state + + if {$state ni {running paused stopped}} { + error "Invalid state token $state" + } + + if {$seq == -1} { + # This was a notification. App should not have responded. + # Just ignore it + return ignored + } + + array set opts [parseargs args { + exitcode.int + servicecode.int + waithint.int + } -maxleftover 0] + + set name [string tolower $name] + + # Depending on the current state of the application, + # we may or may not be able to change state. For + # example, if the current state is "running" and + # the new state is "stopped", that is ok. But the + # converse is not allowed since we cannot + # transition from stopped to running unless + # the SCM has sent us a start signal. + + # If the seq is greater than the last one we sent, bug somewhere + if {$service_state($name,seq) < $seq} { + error "Invalid sequence number $seq (too large) for service status update." + } + + # If we have a request outstanding (to the app) that the app + # has not yet responded to, then all calls from the app with + # no seq number (i.e. 0) or calls with an older sequence number + # are ignored. + if {($service_state($name,seq) > $service_state($name,seqack)) && + ($seq == 0 || $seq < $service_state($name,seq))} { + # Ignore this request + return ignored + } + + set service_state($name,seqack) $seq; # last responded sequence number + + # If state specified as stopped, store the exit codes + if {$state eq "stopped"} { + if {[info exists opts(exitcode)]} { + set service_state($name,exitcode) $opts(exitcode) + } + if {[info exists opts(servicecode)]} { + set service_state($name,servicecode) $opts(servicecode) + } + } + + upvar 0 service_state($name,state) current_state + + # If there is no state change, nothing to do + if {$state eq $current_state} { + return nochange + } + + switch -exact -- $state { + stopped { + # Application can stop at any time from any other state. + # No questions asked. + } + running { + if {$current_state eq "stopped" || $current_state eq "paused"} { + # This should not happen if all the rules are followed by the + # application code. + #error "Service $name attempted to transition directly from stopped or paused state to running state without an intermediate pending state" + return invalidchange + } + } + paused { + if {$current_state ne "pause_pending" && + $current_state ne "continue_pending"} { + # This should not happen if all the rules are followed by the + # application code. + #error "Service $name attempted to transition from $current_state state to paused state" + return invalidchange + } + } + } + + set current_state $state + _report_service_status $name + + if {$state eq "stopped"} { + # If all services have stopped, tell the app + set all_stopped true + foreach {entry val} [array get service_state *,state] { + if {$val ne "stopped"} { + set all_stopped false + break + } + } + if {$all_stopped} { + uplevel #0 [linsert $service_state($name,script) end all_stopped $name 0] + } + } + + return changed; # State changed +} + + +# Report the status of a service back to the SCM +proc twapi::_report_service_status {name} { + variable service_state + upvar 0 service_state($name,state) current_state + + # If the state is a pending state, then make sure we + # increment the checkpoint value + if {[string match *pending $current_state]} { + incr service_state($name,checkpoint) + set waithint $service_state($name,waithint) + } else { + set service_state($name,checkpoint) 0 + set waithint 0 + } + + # Currently service controls are per process, not per service and + # are fixed for the duration of the process. So we always pass + # service_state(controls). Applications has to ensure it can handle + # all control signals in all states (ignoring them as desired) + if {[catch { + Twapi_SetServiceStatus $name $::twapi::service_state_values($current_state) $service_state($name,exitcode) $service_state($name,servicecode) $service_state($name,checkpoint) $waithint $service_state(controls) + } msg]} { + # TBD - report error - but how ? bgerror? + catch {twapi::eventlog_log "Error setting service status: $msg"} + } + + # If we had supplied a wait hint, we are telling the SCM, we will call + # it back within that period of time, so schedule ourselves. + if {$waithint} { + set delay [expr {($waithint*3)/4}] + after $delay ::twapi::_call_scm_within_waithint $name $current_state $service_state($name,checkpoint) + } + + return +} + + +# Queued to regularly update the SCM when we are in any of the pending states +proc ::twapi::_call_scm_within_waithint {name orig_state orig_checkpoint} { + variable service_state + + # We only call to update staus if the state and checkpoint have + # not changed since the routine was queued + if {($service_state($name,state) eq $orig_state) && + ($service_state($name,checkpoint) == $orig_checkpoint)} { + _report_service_status $name + } +} + + +################################################################ +# Utility procedures + +# Map an integer service type code into a list consisting of +# {SERVICETYPESYMBOL BOOLEAN}. If there is not symbolic service type +# for the service, just the integer code is returned. The BOOLEAN +# is 1/0 depending on whether the service type code is interactive +proc twapi::_map_servicetype_code {servicetype} { + # 0x100 -> SERVICE_INTERACTIVE_PROCESS + set interactive [expr {($servicetype & 0x100) != 0}] + set servicetype [expr {$servicetype & (~ 0x100)}] + set servicetype [kl_get [list \ + 16 win32_own_process \ + 32 win32_share_process \ + 80 user_own_process \ + 96 user_share_process \ + 1 kernel_driver \ + 2 file_system_driver \ + 4 adapter \ + 8 recognizer_driver \ + ] $servicetype $servicetype] + return [list $servicetype $interactive] +} + +# Map service type sym to int code +proc twapi::_map_servicetype_sym {sym} { + return [dict get {kernel_driver 1 file_system_driver 2 adapter 4 recognizer_driver 8 win32_own_process 16 win32_share_process 32 user_own_process 80 user_share_process 96} $sym] +} + +# Map a start type code into a symbol. Returns the integer code if +# no mapping possible +proc twapi::_map_starttype_code {code} { + incr code 0; # Make canonical int + set type [lindex {boot_start system_start auto_start demand_start disabled} $code] + if {$type eq ""} { + return $code + } else { + return $type + } +} + +# Map starttype sym to int code +proc twapi::_map_starttype_sym {sym} { + return [dict get {boot_start 0 system_start 1 auto_start 2 demand_start 3 disabled 4} $sym] +} + +# Map a error control code into a symbol. Returns the integer code if +# no mapping possible +proc twapi::_map_errorcontrol_code {code} { + incr code 0; # Make canonical int + set error [lindex {ignore normal severe critical} $code] + if {$error eq ""} { + return $code + } else { + return $error + } +} + +# Map error control sym to int code +proc twapi::_map_errorcontrol_sym {sym} { + return [dict get {ignore 0 normal 1 severe 2 critical 3} $sym] +} + +# Standard template for calling a service function. v_opts should refer +# to an array with the following elements: +# opts(system) - target system. Must be specified +# opts(database) - target database. Must be specified +# opts(scm_priv) - requested privilege when opening SCM. STANDARD_RIGHTS_READ +# is used if unspecified. Not used if scm_handle is specified +# opts(scm_handle) - handle to service control manager. Optional +# opts(svc_priv) - requested privilege when opening service. Must be present +# opts(proc) - proc/function to call. The first arg is the service handle +# opts(args) - additional arguments to pass to the function. +# Empty if unspecified +proc twapi::_service_fn_wrapper {name v_opts} { + upvar $v_opts opts + + # Use 0x00020000 -> STANDARD_RIGHTS_READ for SCM if not specified + set scm_priv [expr {[info exists opts(scm_priv)] ? $opts(scm_priv) : 0x00020000}] + + if {[info exists opts(scm_handle)] && + $opts(scm_handle) ne ""} { + set scm $opts(scm_handle) + } else { + set scm [OpenSCManager $opts(system) $opts(database) $scm_priv] } + trap { + set svch [OpenService $scm $name $opts(svc_priv)] + } finally { + # No need for scm handle anymore. Close it unless it was + # passed to us + if {(![info exists opts(scm_handle)]) || + ($opts(scm_handle) eq "")} { + CloseServiceHandle $scm + } + } + + set proc_args [expr {[info exists opts(args)] ? $opts(args) : ""}] + trap { + set results [eval [list $opts(proc) $svch] $proc_args] + } finally { + CloseServiceHandle $svch + } + + return $results +} + +# Called back for reporting background errors. Note this is called +# from the C++ services code, not from scripts. +proc twapi::_service_background_error {winerror msg} { + twapi::win32_error $winerror $msg +} + +# Parse symbols for controls accepted by a service +proc twapi::_parse_service_accept_controls {controls} { + return [_parse_symbolic_bitmask $controls { + stop 0x00000001 + pause_continue 0x00000002 + shutdown 0x00000004 + paramchange 0x00000008 + netbindchange 0x00000010 + hardwareprofilechange 0x00000020 + powerevent 0x00000040 + sessionchange 0x00000080 + }] +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/share.tcl b/src/punk86.vfs/lib/twapi4.7.2/share.tcl new file mode 100644 index 00000000..76809064 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/share.tcl @@ -0,0 +1,966 @@ +# +# Copyright (c) 2003-2014, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi { + # Win SDK based structure definitions + + record SHARE_INFO_0 {-name} + record SHARE_INFO_1 {-name -type -comment} + record SHARE_INFO_2 {-name -type -comment -permissions -max_conn -current_conn -path -passwd} + record SHARE_INFO_502 {-name -type -comment -permissions -max_conn -current_conn -path -passwd -reserved -secd} + + record USE_INFO_0 {-localdevice -remoteshare} + record USE_INFO_1 {-localdevice -remoteshare -password -status -type -opencount -usecount} + record USE_INFO_2 {-localdevice -remoteshare -password -status -type -opencount -usecount -user -domain} + + record SESSION_INFO_0 {-clientname} + record SESSION_INFO_1 {-clientname -user -opencount -activeseconds -idleseconds -attrs} + record SESSION_INFO_2 {-clientname -user -opencount -activeseconds -idleseconds -attrs -clienttype} + record SESSION_INFO_502 {-clientname -user -opencount -activeseconds -idleseconds -attrs -clienttype -transport} + record SESSION_INFO_10 {-clientname -user -activeseconds -idleseconds} + + record FILE_INFO_2 {-id} + record FILE_INFO_3 {-id -permissions -lockcount -path -user} + + record CONNECTION_INFO_0 {-id} + record CONNECTION_INFO_1 {-id -type -opencount -usercount -activeseconds -user -netname} + + struct NETRESOURCE { + DWORD dwScope; + DWORD dwType; + DWORD dwDisplayType; + DWORD dwUsage; + LPCWSTR lpLocalName; + LPCWSTR lpRemoteName; + LPCWSTR lpComment; + LPCWSTR lpProvider; + }; + + struct NETINFOSTRUCT { + DWORD cbStructure; + DWORD dwProviderVersion; + DWORD dwStatus; + DWORD dwCharacteristics; + HANDLE dwHandle; + WORD wNetType; + DWORD dwPrinters; + DWORD dwDrives; + } +} + +# TBD - is there a Tcl wrapper around NetShareCheck? + +# Create a network share +proc twapi::new_share {sharename path args} { + array set opts [parseargs args { + {system.arg ""} + {type.arg "file"} + {comment.arg ""} + {max_conn.int -1} + secd.arg + } -maxleftover 0] + + # If no security descriptor specified, default to "Everyone, + # read permission". Levaing it empty will give everyone all permissions + # which is probably not a good idea! + if {![info exists opts(secd)]} { + set opts(secd) [new_security_descriptor -dacl [new_acl [list [new_ace allow S-1-1-0 1179817]]]] + } + + NetShareAdd $opts(system) \ + $sharename \ + [_share_type_symbols_to_code $opts(type)] \ + $opts(comment) \ + $opts(max_conn) \ + [file nativename $path] \ + $opts(secd) +} + +# Delete a network share +proc twapi::delete_share {sharename args} { + array set opts [parseargs args {system.arg} -nulldefault] + NetShareDel $opts(system) $sharename 0 +} + +# Enumerate network shares +proc twapi::get_shares {args} { + + array set opts [parseargs args { + {system.arg ""} + {type.arg ""} + excludespecial + level.int + } -maxleftover 0] + + if {$opts(type) != ""} { + set type_filter [_share_type_symbols_to_code $opts(type) 1] + } + + if {[info exists opts(level)] && $opts(level) > 0} { + set level $opts(level) + } else { + # Either -level not specified or specified as 0 + # We need at least level 1 to filter on type + set level 1 + } + + set record_proc SHARE_INFO_$level + set raw_data [_net_enum_helper NetShareEnum -system $opts(system) -level $level -fields [$record_proc]] + set recs [list ] + foreach rec [recordarray getlist $raw_data] { + # 0xC0000000 -> 0x80000000 (STYPE_SPECIAL), 0x40000000 (STYPE_TEMPORARY) + set special [expr {[$record_proc -type $rec] & 0xC0000000}] + if {$special && $opts(excludespecial)} { + continue + } + # We need the special cast to int because else operands get promoted + # to 64 bits as the hex is treated as an unsigned value + set share_type [$record_proc -type $rec] + if {[info exists type_filter] && [expr {int($share_type & ~ $special)}] != $type_filter} { + continue + } + set rec [$record_proc set $rec -type [_share_type_code_to_symbols $share_type]] + if {[info exists opts(level)]} { + lappend recs $rec + } else { + lappend recs [$record_proc -name $rec] + } + } + + if {[info exists opts(level)]} { + set ra [list [$record_proc] $recs] + if {$opts(level) == 0} { + # We actually need only a level 0 subset + return [recordarray get $ra -slice [SHARE_INFO_0]] + } + return $ra + } else { + return $recs + } +} + + +# Get details about a share +proc twapi::get_share_info {sharename args} { + array set opts [parseargs args { + system.arg + all + name + type + path + comment + max_conn + current_conn + secd + } -nulldefault -hyphenated] + + set level 0 + + if {$opts(-all) || $opts(-name) || $opts(-type) || $opts(-comment)} { + set level 1 + set record_proc SHARE_INFO_1 + } + + if {$opts(-all) || $opts(-max_conn) || $opts(-current_conn) || $opts(-path)} { + set level 2 + set record_proc SHARE_INFO_2 + } + + if {$opts(-all) || $opts(-secd)} { + set level 502 + set record_proc SHARE_INFO_502 + } + + if {! $level} { + return + } + + set rec [NetShareGetInfo $opts(-system) $sharename $level] + set result [list ] + foreach opt {-name -comment -max_conn -current_conn -path -secd} { + if {$opts(-all) || $opts($opt)} { + lappend result $opt [$record_proc $opt $rec] + } + } + if {$opts(-all) || $opts(-type)} { + lappend result -type [_share_type_code_to_symbols [$record_proc -type $rec]] + } + + return $result +} + + +# Set a share configuration +proc twapi::set_share_info {sharename args} { + array set opts [parseargs args { + {system.arg ""} + comment.arg + max_conn.int + secd.arg + }] + + # First get the current config so we can change specified fields + # and write back + array set shareinfo [get_share_info $sharename -system $opts(system) \ + -comment -max_conn -secd] + foreach field {comment max_conn secd} { + if {[info exists opts($field)]} { + set shareinfo(-$field) $opts($field) + } + } + + NetShareSetInfo $opts(system) $sharename $shareinfo(-comment) \ + $shareinfo(-max_conn) $shareinfo(-secd) +} + + +# Get list of remote shares +proc twapi::get_client_shares {args} { + array set opts [parseargs args { + {system.arg ""} + level.int + } -maxleftover 0] + + if {[info exists opts(level)]} { + set rec_proc USE_INFO_$opts(level) + set ra [_net_enum_helper NetUseEnum -system $opts(system) -level $opts(level) -fields [$rec_proc]] + set fields [$rec_proc] + set have_status [expr {"-status" in $fields}] + set have_type [expr {"-type" in $fields}] + if {! ($have_status || $have_type)} { + return $ra + } + set recs {} + foreach rec [recordarray getlist $ra] { + if {$have_status} { + set rec [$rec_proc set $rec -status [_map_useinfo_status [$rec_proc -status $rec]]] + } + if {$have_type} { + set rec [$rec_proc set $rec -type [_map_useinfo_type [$rec_proc -type $rec]]] + } + lappend recs $rec + } + return [list $fields $recs] + } + + # -level not specified. Just return a list of the remote share names + return [recordarray column [_net_enum_helper NetUseEnum -system $opts(system) -level 0 -fields [USE_INFO_0]] -remoteshare] +} + + +# Connect to a share +proc twapi::connect_share {remoteshare args} { + array set opts [parseargs args { + {type.arg "disk"} + localdevice.arg + provider.arg + password.arg + nopassword + defaultpassword + user.arg + {window.arg 0} + {interactive {} 0x8} + {prompt {} 0x10} + {updateprofile {} 0x1} + {commandline {} 0x800} + } -nulldefault] + + set flags 0 + + switch -exact -- $opts(type) { + "any" {set type 0} + "disk" - + "file" {set type 1} + "printer" {set type 2} + default { + error "Invalid network share type '$opts(type)'" + } + } + + # localdevice - "" means no local device, * means pick any, otherwise + # it's a local device to be mapped + if {$opts(localdevice) == "*"} { + set opts(localdevice) "" + setbits flags 0x80; # CONNECT_REDIRECT + } + + if {$opts(defaultpassword) && $opts(nopassword)} { + error "Options -defaultpassword and -nopassword may not be used together" + } + if {$opts(nopassword)} { + set opts(password) "" + set ignore_password 1 + } else { + set ignore_password 0 + if {$opts(defaultpassword)} { + set opts(password) "" + } + } + + set flags [expr {$flags | $opts(interactive) | $opts(prompt) | + $opts(updateprofile) | $opts(commandline)}] + + return [Twapi_WNetUseConnection $opts(window) $type $opts(localdevice) \ + $remoteshare $opts(provider) $opts(user) $ignore_password \ + $opts(password) $flags] +} + +# Disconnects an existing share +proc twapi::disconnect_share {sharename args} { + array set opts [parseargs args {updateprofile force}] + + set flags [expr {$opts(updateprofile) ? 0x1 : 0}] + WNetCancelConnection2 $sharename $flags $opts(force) +} + + +# Get information about a connected share +proc twapi::get_client_share_info {sharename args} { + if {$sharename eq ""} { + error "A share name cannot be the empty string" + } + + # We have to use a combination of NetUseGetInfo and + # WNetGetResourceInformation as neither gives us the full information + # THe former takes the local device name if there is one and will + # only accept a UNC if there is an entry for the UNC with + # no local device mapped. The latter + # always wants the UNC. So we need to figure out exactly if there + # is a local device mapped to the sharename or not + # TBD _ see if this is really the case. Also, NetUse only works with + # LANMAN, not WebDAV. So see if there is a way to only use WNet* + # variants + + # There may be multiple entries for the same UNC + # If there is an entry for the UNC with no device mapped, select + # that else select any of the local devices mapped to it + # TBD - any better way of finding out a mapping than calling + # get_client_shares? + # TBD - use wnet_connected_resources + foreach {elem_device elem_unc} [recordarray getlist [get_client_shares -level 0] -format flat] { + if {[string equal -nocase $sharename $elem_unc]} { + if {$elem_device eq ""} { + # Found an entry without a local device. Use it + set unc $elem_unc + unset -nocomplain local; # In case we found a match earlier + break + } else { + # Found a matching device + set local $elem_device + set unc $elem_unc + # Keep looping in case we find an entry with no local device + # (which we will prefer) + } + } else { + # See if the sharename is actually a local device name + if {[string equal -nocase [string trimright $elem_device :] [string trimright $sharename :]]} { + # Device name matches. Use it + set local $elem_device + set unc $elem_unc + break + } + } + } + + if {![info exists unc]} { + win32_error 2250 "Share '$sharename' not found." + } + + # At this point $unc is the UNC form of the share and + # $local is either undefined or the local mapped device if there is one + + array set opts [parseargs args { + user + localdevice + remoteshare + status + type + opencount + usecount + domain + provider + comment + all + } -maxleftover 0 -hyphenated] + + + # Call Twapi_NetGetInfo always to get status. If we are not connected, + # we will not call WNetGetResourceInformation as that will time out + if {[info exists local]} { + set share [NetUseGetInfo "" $local 2] + } else { + set share [NetUseGetInfo "" $unc 2] + } + array set shareinfo [USE_INFO_2 $share] + unset shareinfo(-password) + if {[info exists shareinfo(-status)]} { + set shareinfo(-status) [_map_useinfo_status $shareinfo(-status)] + } + if {[info exists shareinfo(-type)]} { + set shareinfo(-type) [_map_useinfo_type $shareinfo(-type)] + } + + if {$opts(-all) || $opts(-comment) || $opts(-provider)} { + # Only get this information if we are connected + if {$shareinfo(-status) eq "connected"} { + set wnetinfo [lindex [Twapi_WNetGetResourceInformation $unc "" 0] 0] + set shareinfo(-comment) [lindex $wnetinfo 6] + set shareinfo(-provider) [lindex $wnetinfo 7] + } else { + set shareinfo(-comment) "" + set shareinfo(-provider) "" + } + } + + if {$opts(-all)} { + return [array get shareinfo] + } + + # Get rid of unwanted fields + foreach opt { + -user + -localdevice + -remoteshare + -status + -type + -opencount + -usecount + -domain + -provider + -comment + } { + if {! $opts($opt)} { + unset -nocomplain shareinfo($opt) + } + } + + return [array get shareinfo] +} + + +# Enumerate sessions +proc twapi::find_lm_sessions args { + array set opts [parseargs args { + all + {matchclient.arg ""} + {system.arg ""} + {matchuser.arg ""} + transport + clientname + user + clienttype + opencount + idleseconds + activeseconds + attrs + } -maxleftover 0] + + set level [_calc_minimum_session_info_level opts] + + # On all platforms, client must be in UNC format + set opts(matchclient) [_make_unc_computername $opts(matchclient)] + + trap { + set sessions [_net_enum_helper NetSessionEnum -system $opts(system) -preargs [list $opts(matchclient) $opts(matchuser)] -level $level -fields [SESSION_INFO_$level]] + } onerror {TWAPI_WIN32 2312} { + # No session matching the specified client + set sessions {} + } onerror {TWAPI_WIN32 2221} { + # No session matching the user + set sessions {} + } + + return [_format_lm_sessions $sessions opts] +} + + +# Get information about a session +proc twapi::get_lm_session_info {client user args} { + array set opts [parseargs args { + all + {system.arg ""} + transport + clientname + user + clienttype + opencount + idleseconds + activeseconds + attrs + } -maxleftover 0] + + set level [_calc_minimum_session_info_level opts] + if {$level == -1} { + # No data requested so return empty list + return [list ] + } + + if {![min_os_version 5]} { + # System name is specified. If NT, make sure it is UNC form + set opts(system) [_make_unc_computername $opts(system)] + } + + # On all platforms, client must be in UNC format + set client [_make_unc_computername $client] + + # Note an error is generated if no matching session exists + set sess [NetSessionGetInfo $opts(system) $client $user $level] + + return [recordarray index [_format_lm_sessions [list [SESSION_INFO_$level] [list $sess]] opts] 0 -format dict] +} + +# Delete sessions +proc twapi::end_lm_sessions args { + array set opts [parseargs args { + {client.arg ""} + {system.arg ""} + {user.arg ""} + } -maxleftover 0] + + if {![min_os_version 5]} { + # System name is specified. If NT, make sure it is UNC form + set opts(system) [_make_unc_computername $opts(system)] + } + + if {$opts(client) eq "" && $opts(user) eq ""} { + win32_error 87 "At least one of -client and -user must be specified." + } + + # On all platforms, client must be in UNC format + set opts(client) [_make_unc_computername $opts(client)] + + trap { + NetSessionDel $opts(system) $opts(client) $opts(user) + } onerror {TWAPI_WIN32 2312} { + # No session matching the specified client - ignore error + } onerror {TWAPI_WIN32 2221} { + # No session matching the user - ignore error + } + return +} + +# Enumerate open files +proc twapi::find_lm_open_files args { + array set opts [parseargs args { + {basepath.arg ""} + {system.arg ""} + {matchuser.arg ""} + all + permissions + id + lockcount + path + user + } -maxleftover 0] + + set level 3 + if {! ($opts(all) || $opts(permissions) || $opts(lockcount) || + $opts(path) || $opts(user))} { + # Only id's required + set level 2 + } + + # TBD - change to use -resume option to _net_enum_helper as there + # might be a lot of files + trap { + set files [_net_enum_helper NetFileEnum -system $opts(system) -preargs [list [file nativename $opts(basepath)] $opts(matchuser)] -level $level -fields [FILE_INFO_$level]] + } onerror {TWAPI_WIN32 2221} { + # No files matching the user + set files [list [FILE_INFO_$level] {}] + } + + return [_format_lm_open_files $files opts] +} + +# Get information about an open LM file +proc twapi::get_lm_open_file_info {fid args} { + array set opts [parseargs args { + {system.arg ""} + all + permissions + id + lockcount + path + user + } -maxleftover 0] + + # System name is specified. If NT, make sure it is UNC form + if {![min_os_version 5]} { + set opts(system) [_make_unc_computername $opts(system)] + } + + set level 3 + if {! ($opts(all) || $opts(permissions) || $opts(lockcount) || + $opts(path) || $opts(user))} { + # Only id's required. We actually already have this but don't + # return it since we want to go ahead and make the call in case + # the id does not exist + set level 2 + } + + return [recordarray index [_format_lm_open_files [list [FILE_INFO_$level] [list [NetFileGetInfo $opts(system) $fid $level]]] opts] 0 -format dict] +} + +# Close an open LM file +proc twapi::close_lm_open_file {fid args} { + array set opts [parseargs args { + {system.arg ""} + } -maxleftover 0] + trap { + NetFileClose $opts(system) $fid + } onerror {TWAPI_WIN32 2314} { + # No such fid. Ignore, perhaps it was closed in the meanwhile + } +} + + +# Enumerate open connections +proc twapi::find_lm_connections args { + array set opts [parseargs args { + client.arg + {system.arg ""} + share.arg + all + id + type + opencount + usercount + activeseconds + user + clientname + sharename + } -maxleftover 0] + + if {! ([info exists opts(client)] || [info exists opts(share)])} { + win32_error 87 "Must specify either -client or -share option." + } + + if {[info exists opts(client)] && [info exists opts(share)]} { + win32_error 87 "Must not specify both -client and -share options." + } + + if {[info exists opts(client)]} { + set qualifier [_make_unc_computername $opts(client)] + } else { + set qualifier $opts(share) + } + + set level 0 + if {$opts(all) || $opts(type) || $opts(opencount) || + $opts(usercount) || $opts(user) || + $opts(activeseconds) || $opts(clientname) || $opts(sharename)} { + set level 1 + } + + # TBD - change to use -resume option to _net_enum_helper since + # there might be a log of connections + set conns [_net_enum_helper NetConnectionEnum -system $opts(system) -preargs [list $qualifier] -level $level -fields [CONNECTION_INFO_$level]] + + # NOTE fields MUST BE IN SAME ORDER AS VALUES BELOW + if {! $opts(all)} { + set fields {} + foreach opt {id opencount usercount activeseconds user type} { + if {$opts(all) || $opts($opt)} { + lappend fields -$opt + } + } + if {$opts(all) || $opts(clientname) || $opts(sharename)} { + lappend fields -netname + } + set conns [recordarray get $conns -slice $fields] + } + set fields [recordarray fields $conns] + if {"-type" in $fields} { + set type_enum [enum $fields -type] + } + if {"-netname" in $fields} { + set netname_enum [enum $fields -netname] + } + + if {! ([info exists type_enum] || [info exists netname_enum])} { + # No need to massage any data + return $conns + } + + set recs {} + foreach rec [recordarray getlist $conns] { + if {[info exists type_enum]} { + lset rec $type_enum [_share_type_code_to_symbols [lindex $rec $type_enum]] + } + if {[info exists netname_enum]} { + # What's returned in the netname field depends on what we + # passed as the qualifier + if {[info exists opts(client)]} { + set sharename [lindex $rec $netname_enum] + set clientname [_make_unc_computername $opts(client)] + } else { + set sharename $opts(share) + set clientname [_make_unc_computername [lindex $rec $netname_enum]] + } + if {$opts(all) || $opts(clientname)} { + lappend rec $clientname + } + if {$opts(all) || $opts(sharename)} { + lappend rec $sharename + } + } + lappend recs $rec + } + if {$opts(all) || $opts(clientname)} { + lappend fields -clientname + } + if {$opts(all) || $opts(sharename)} { + lappend fields -sharename + } + + return [list $fields $recs] +} + +proc twapi::wnet_connected_resources {args} { + # Accept both file/disk and print/printer for historical reasons + # file and printer are official to match get_client_share_info + parseargs args { + {type.sym any {any 0 file 1 disk 1 print 2 printer 2}} + } -maxleftover 0 -setvars + set h [WNetOpenEnum 1 $type 0 ""] + trap { + set resources {} + set structdef [twapi::NETRESOURCE] + while {[llength [set rs [WNetEnumResource $h 100 $structdef]]]} { + foreach r $rs { + lappend resources [lrange $r 4 5] + } + } + } finally { + WNetCloseEnum $h + } + return $resources +} + +################################################################ +# Utility functions + +# Common code to figure out what SESSION_INFO level is required +# for the specified set of requested fields. v_opts is name +# of array indicating which fields are required +proc twapi::_calc_minimum_session_info_level {v_opts} { + upvar $v_opts opts + + # Set the information level requested based on options specified. + # We set the level to the one that requires the lowest possible + # privilege level and still includes the data requested. + if {$opts(all) || $opts(transport)} { + return 502 + } elseif {$opts(clienttype)} { + return 2 + } elseif {$opts(opencount) || $opts(attrs)} { + return 1 + } elseif {$opts(clientname) || $opts(user) || + $opts(idleseconds) || $opts(activeseconds)} { + return 10 + } else { + return 0 + } +} + +# Common code to format a session record. v_opts is name of array +# that controls which fields are returned +# sessions is a record array +proc twapi::_format_lm_sessions {sessions v_opts} { + upvar $v_opts opts + + if {! $opts(all)} { + set fields {} + foreach opt { + transport user opencount idleseconds activeseconds + clienttype clientname attrs + } { + if {$opts(all) || $opts($opt)} { + lappend fields -$opt + } + } + set sessions [recordarray get $sessions -slice $fields] + } + + set fields [recordarray fields $sessions] + if {"-clientname" in $fields} { + set client_enum [enum $fields -clientname] + } + if {"-attrs" in $fields} { + set attrs_enum [enum $fields -attrs] + } + + if {! ([info exists client_enum] || [info exists attrs_enum])} { + return $sessions + } + + # Need to map client name and attrs fields + set recs {} + foreach rec [recordarray getlist $sessions] { + if {[info exists client_enum]} { + lset rec $client_enum [_make_unc_computername [lindex $rec $client_enum]] + } + if {[info exists attrs_enum]} { + set attrs {} + set flags [lindex $rec $attrs_enum] + if {$flags & 1} { + lappend attrs guest + } + if {$flags & 2} { + lappend attrs noencryption + } + lset rec $attrs_enum $attrs + } + lappend recs $rec + } + return [list $fields $recs] +} + +# Common code to format a lm open file record. v_opts is name of array +# that controls which fields are returned +proc twapi::_format_lm_open_files {files v_opts} { + upvar $v_opts opts + + if {! $opts(all)} { + set fields {} + foreach opt { + id lockcount path user permissions + } { + if {$opts(all) || $opts($opt)} { + lappend fields -$opt + } + } + set files [recordarray get $files -slice $fields] + } + + set fields [recordarray fields $files] + + if {"-permissions" ni $fields} { + return $files + } + + # Need to massage permissions + set enum [enum $fields -permissions] + + set recs {} + foreach rec [recordarray getlist $files] { + set permissions [list ] + set perms [lindex $rec $enum] + foreach {flag perm} {1 read 2 write 4 create} { + if {$perms & $flag} { + lappend permissions $perm + } + } + lset rec $enum $permissions + lappend recs $rec + } + + return [list $fields $recs] +} + +# NOTE: THIS ONLY MAPS FOR THE Net* functions, NOT THE WNet* +proc twapi::_share_type_symbols_to_code {typesyms {basetypeonly 0}} { + + # STYPE_DISKTREE 0 + # STYPE_PRINTQ 1 + # STYPE_DEVICE 2 + # STYPE_IPC 3 + switch -exact -- [lindex $typesyms 0] { + file { set code 0 } + printer { set code 1 } + device { set code 2 } + ipc { set code 3 } + default { + error "Unknown type network share type symbol [lindex $typesyms 0]" + } + } + + if {$basetypeonly} { + return $code + } + + # STYPE_TEMPORARY 0x40000000 + # STYPE_SPECIAL 0x80000000 + set special 0 + foreach sym [lrange $typesyms 1 end] { + switch -exact -- $sym { + special { setbits special 0x80000000 } + temporary { setbits special 0x40000000 } + file - + printer - + device - + ipc { + error "Base share type symbol '$sym' cannot be used as a share attribute type" + } + default { + error "Unknown type network share type symbol '$sym'" + } + } + } + + return [expr {$code | $special}] +} + + +# First element is always the base type of the share +# NOTE: THIS ONLY MAPS FOR THE Net* functions, NOT THE WNet* +proc twapi::_share_type_code_to_symbols {type} { + + # STYPE_DISKTREE 0 + # STYPE_PRINTQ 1 + # STYPE_DEVICE 2 + # STYPE_IPC 3 + # STYPE_TEMPORARY 0x40000000 + # STYPE_SPECIAL 0x80000000 + + set special [expr {$type & 0xC0000000}] + + # We need the special cast to int because else operands get promoted + # to 64 bits as the hex is treated as an unsigned value + switch -exact -- [expr {int($type & ~ $special)}] { + 0 {set sym "file"} + 1 {set sym "printer"} + 2 {set sym "device"} + 3 {set sym "ipc"} + default {set sym $type} + } + + set typesyms [list $sym] + + if {$special & 0x80000000} { + lappend typesyms special + } + + if {$special & 0x40000000} { + lappend typesyms temporary + } + + return $typesyms +} + +# Make sure a computer name is in unc format unless it is an empty +# string (local computer) +proc twapi::_make_unc_computername {name} { + if {$name eq ""} { + return "" + } else { + return "\\\\[string trimleft $name \\]" + } +} + +proc twapi::_map_useinfo_status {status} { + set sym [lindex {connected paused lostsession disconnected networkerror connecting reconnecting} $status] + if {$sym ne ""} { + return $sym + } else { + return $status + } +} + +proc twapi::_map_useinfo_type {type} { + # Note share type and use info types are different + return [_share_type_code_to_symbols [expr {$type & 0x3fffffff}]] +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/shell.tcl b/src/punk86.vfs/lib/twapi4.7.2/shell.tcl new file mode 100644 index 00000000..b471e2e7 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/shell.tcl @@ -0,0 +1,627 @@ +# +# Copyright (c) 2004-2011 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi {} + + +# Get the specified shell folder +proc twapi::get_shell_folder {csidl args} { + variable csidl_lookup + + array set opts [parseargs args {create} -maxleftover 0] + + # Following are left out because they refer to virtual folders + # and will return error if used here + # CSIDL_BITBUCKET - 0xa + if {![info exists csidl_lookup]} { + array set csidl_lookup { + CSIDL_ADMINTOOLS 0x30 + CSIDL_COMMON_ADMINTOOLS 0x2f + CSIDL_APPDATA 0x1a + CSIDL_COMMON_APPDATA 0x23 + CSIDL_COMMON_DESKTOPDIRECTORY 0x19 + CSIDL_COMMON_DOCUMENTS 0x2e + CSIDL_COMMON_FAVORITES 0x1f + CSIDL_COMMON_MUSIC 0x35 + CSIDL_COMMON_PICTURES 0x36 + CSIDL_COMMON_PROGRAMS 0x17 + CSIDL_COMMON_STARTMENU 0x16 + CSIDL_COMMON_STARTUP 0x18 + CSIDL_COMMON_TEMPLATES 0x2d + CSIDL_COMMON_VIDEO 0x37 + CSIDL_COOKIES 0x21 + CSIDL_DESKTOPDIRECTORY 0x10 + CSIDL_FAVORITES 0x6 + CSIDL_HISTORY 0x22 + CSIDL_INTERNET_CACHE 0x20 + CSIDL_LOCAL_APPDATA 0x1c + CSIDL_MYMUSIC 0xd + CSIDL_MYPICTURES 0x27 + CSIDL_MYVIDEO 0xe + CSIDL_NETHOOD 0x13 + CSIDL_PERSONAL 0x5 + CSIDL_PRINTHOOD 0x1b + CSIDL_PROFILE 0x28 + CSIDL_PROFILES 0x3e + CSIDL_PROGRAMS 0x2 + CSIDL_PROGRAM_FILES 0x26 + CSIDL_PROGRAM_FILES_COMMON 0x2b + CSIDL_RECENT 0x8 + CSIDL_SENDTO 0x9 + CSIDL_STARTMENU 0xb + CSIDL_STARTUP 0x7 + CSIDL_SYSTEM 0x25 + CSIDL_TEMPLATES 0x15 + CSIDL_WINDOWS 0x24 + CSIDL_CDBURN_AREA 0x3b + } + } + + if {![string is integer $csidl]} { + set csidl_key [string toupper $csidl] + if {![info exists csidl_lookup($csidl_key)]} { + # Try by adding a CSIDL prefix + set csidl_key "CSIDL_$csidl_key" + if {![info exists csidl_lookup($csidl_key)]} { + error "Invalid CSIDL value '$csidl'" + } + } + set csidl $csidl_lookup($csidl_key) + } + + trap { + set path [SHGetSpecialFolderPath 0 $csidl $opts(create)] + } onerror {} { + # Try some other way to get the information + switch -exact -- [format %x $csidl] { + 1a { catch {set path $::env(APPDATA)} } + 2b { catch {set path $::env(CommonProgramFiles)} } + 26 { catch {set path $::env(ProgramFiles)} } + 24 { catch {set path $::env(windir)} } + 25 { catch {set path [file join $::env(systemroot) system32]} } + } + if {![info exists path]} { + return "" + } + } + + return $path +} + +# Displays a shell property dialog for the given object +proc twapi::shell_object_properties_dialog {path args} { + array set opts [parseargs args { + {type.arg file {file printer volume}} + {hwin.int 0} + {page.arg ""} + } -maxleftover 0] + + + if {$opts(type) eq "file"} { + set path [file nativename [file normalize $path]] + } + + SHObjectProperties $opts(hwin) \ + [string map {printer 1 file 2 volume 4} $opts(type)] \ + $path \ + $opts(page) +} + +# Writes a shell shortcut +proc twapi::write_shortcut {link args} { + + array set opts [parseargs args { + path.arg + idl.arg + args.arg + desc.arg + hotkey.arg + iconpath.arg + iconindex.int + {showcmd.arg normal} + workdir.arg + relativepath.arg + runas.bool + } -nulldefault -maxleftover 0] + + # Map hot key to integer if needed + if {![string is integer -strict $opts(hotkey)]} { + if {$opts(hotkey) eq ""} { + set opts(hotkey) 0 + } else { + # Try treating it as symbolic + lassign [_hotkeysyms_to_vk $opts(hotkey)] modifiers vk + set opts(hotkey) $vk + if {$modifiers & 1} { + set opts(hotkey) [expr {$opts(hotkey) | (4<<8)}] + } + if {$modifiers & 2} { + set opts(hotkey) [expr {$opts(hotkey) | (2<<8)}] + } + if {$modifiers & 4} { + set opts(hotkey) [expr {$opts(hotkey) | (1<<8)}] + } + if {$modifiers & 8} { + set opts(hotkey) [expr {$opts(hotkey) | (8<<8)}] + } + } + } + + # IF a known symbol translate it. Note caller can pass integer + # values as well which will be kept as they are. Bogus valuse and + # symbols will generate an error on the actual call so we don't + # check here. + switch -exact -- $opts(showcmd) { + minimized { set opts(showcmd) 7 } + maximized { set opts(showcmd) 3 } + normal { set opts(showcmd) 1 } + } + + Twapi_WriteShortcut $link $opts(path) $opts(idl) $opts(args) \ + $opts(desc) $opts(hotkey) $opts(iconpath) $opts(iconindex) \ + $opts(relativepath) $opts(showcmd) $opts(workdir) $opts(runas) +} + + +# Read a shortcut +proc twapi::read_shortcut {link args} { + array set opts [parseargs args { + timeout.int + {hwin.int 0} + + {_comment {Path format flags}} + {shortnames {} 1} + {uncpath {} 2} + {rawpath {} 4} + + {_comment {Resolve flags}} + {install {} 128} + {nolinkinfo {} 64} + {notrack {} 32} + {nosearch {} 16} + {anymatch {} 2} + {noui {} 1} + } -maxleftover 0] + + set pathfmt [expr {$opts(shortnames) | $opts(uncpath) | $opts(rawpath)}] + + # 4 -> SLR_UPDATE + set resolve_flags [expr {4 | $opts(install) | $opts(nolinkinfo) | + $opts(notrack) | $opts(nosearch) | + $opts(anymatch) | $opts(noui)}] + + array set shortcut [twapi::Twapi_ReadShortcut $link $pathfmt $opts(hwin) $resolve_flags] + + switch -exact -- $shortcut(-showcmd) { + 1 { set shortcut(-showcmd) normal } + 3 { set shortcut(-showcmd) maximized } + 7 { set shortcut(-showcmd) minimized } + } + + return [array get shortcut] +} + + + +# Writes a url shortcut +proc twapi::write_url_shortcut {link url args} { + + array set opts [parseargs args { + {missingprotocol.arg 0} + } -nulldefault -maxleftover 0] + + switch -exact -- $opts(missingprotocol) { + guess { + set opts(missingprotocol) 1; # IURL_SETURL_FL_GUESS_PROTOCOL + } + usedefault { + # 3 -> IURL_SETURL_FL_GUESS_PROTOCOL | IURL_SETURL_FL_USE_DEFAULT_PROTOCOL + # The former must also be specified (based on experimentation) + set opts(missingprotocol) 3 + } + default { + if {![string is integer -strict $opts(missingprotocol)]} { + error "Invalid value '$opts(missingprotocol)' for -missingprotocol option." + } + } + } + + Twapi_WriteUrlShortcut $link $url $opts(missingprotocol) +} + +# Read a url shortcut +proc twapi::read_url_shortcut {link} { + return [Twapi_ReadUrlShortcut $link] +} + +# Invoke a url shortcut +proc twapi::invoke_url_shortcut {link args} { + + array set opts [parseargs args { + verb.arg + {hwin.int 0} + allowui + } -maxleftover 0] + + set flags 0 + if {$opts(allowui)} {setbits flags 1} + if {! [info exists opts(verb)]} { + setbits flags 2 + set opts(verb) "" + } + + Twapi_InvokeUrlShortcut $link $opts(verb) $flags $opts(hwin) +} + +# Send a file to the recycle bin +proc twapi::recycle_file {fn args} { + return [recycle_files [list $fn] {*}$args] +} + +# Send multiple files to the recycle bin - from Alexandru +# This is much faster than "recycle_file"! +proc twapi::recycle_files {fns args} { + array set opts [parseargs args { + confirm.bool + showerror.bool + } -maxleftover 0 -nulldefault] + + if {$opts(confirm)} { + set flags 0x40; # FOF_ALLOWUNDO + } else { + set flags 0x50; # FOF_ALLOWUNDO | FOF_NOCONFIRMATION + } + + if {! $opts(showerror)} { + set flags [expr {$flags | 0x0400}]; # FOF_NOERRORUI + } + + set fns [lmap fn $fns { + file nativename [file normalize $fn] + }] + + return [expr {[lindex [Twapi_SHFileOperation 0 3 $fns __null__ $flags ""] 0] ? false : true}] +} + +proc twapi::shell_execute args { + # TBD - Document following shell_execute options after testing. + # [opt_def [cmd -connect] [arg BOOLEAN]] + # [opt_def [cmd -hicon] [arg HANDLE]] + # [opt_def [cmd -hkeyclass] [arg BOOLEAN]] + # [opt_def [cmd -hotkey] [arg HOTKEY]] + # [opt_def [cmd -nozonechecks] [arg BOOLEAN]] + + array set opts [parseargs args { + class.arg + dir.arg + {hicon.arg NULL} + {hkeyclass.arg NULL} + {hmonitor.arg NULL} + hotkey.arg + hwin.int + idl.arg + params.arg + path.arg + {show.arg 1} + verb.arg + + {getprocesshandle.bool 0 0x00000040} + {connect.bool 0 0x00000080} + {wait.bool 0x00000100 0x00000100} + {substenv.bool 0 0x00000200} + {noui.bool 0 0x00000400} + {unicode.bool 0 0x00004000} + {noconsole.bool 0 0x00008000} + {asyncok.bool 0 0x00100000} + {nozonechecks.bool 0 0x00800000} + {waitforinputidle.bool 0 0x02000000} + {logusage.bool 0 0x04000000} + {invokeidlist.bool 0 0x0000000C} + } -maxleftover 0 -nulldefault] + + set fmask 0 + + foreach {opt mask} { + class 1 + idl 4 + } { + if {$opts($opt) ne ""} { + setbits fmask $mask + } + } + + if {$opts(hkeyclass) ne "NULL"} { + setbits fmask 3 + } + + set fmask [expr {$fmask | + $opts(getprocesshandle) | $opts(connect) | $opts(wait) | + $opts(substenv) | $opts(noui) | $opts(unicode) | + $opts(noconsole) | $opts(asyncok) | $opts(nozonechecks) | + $opts(waitforinputidle) | $opts(logusage) | + $opts(invokeidlist)}] + + if {$opts(hicon) ne "NULL" && $opts(hmonitor) ne "NULL"} { + error "Cannot specify -hicon and -hmonitor options together." + } + + set hiconormonitor NULL + if {$opts(hicon) ne "NULL"} { + set hiconormonitor $opts(hicon) + set flags [expr {$flags | 0x00000010}] + } elseif {$opts(hmonitor) ne "NULL"} { + set hiconormonitor $opts(hmonitor) + set flags [expr {$flags | 0x00200000}] + } + + if {![string is integer -strict $opts(show)]} { + set opts(show) [dict get { + hide 0 + shownormal 1 + normal 1 + showminimized 2 + showmaximized 3 + maximize 3 + shownoactivate 4 + show 5 + minimize 6 + showminnoactive 7 + showna 8 + restore 9 + showdefault 10 + forceminimize 11 + } $opts(show)] + } + + if {$opts(hotkey) eq ""} { + set hotkey 0 + } else { + lassign [_hotkeysyms_to_vk $opts(hotkey) { + shift 1 + ctrl 2 + control 2 + alt 4 + menu 4 + ext 8 + }] modifiers vk + set hotkey [expr {($modifiers << 16) | $vk}] + } + if {$hotkey != 0} { + setbits fmask 0x00000020 + } + return [Twapi_ShellExecuteEx \ + $fmask \ + $opts(hwin) \ + $opts(verb) \ + $opts(path) \ + $opts(params) \ + $opts(dir) \ + $opts(show) \ + $opts(idl) \ + $opts(class) \ + $opts(hkeyclass) \ + $hotkey \ + $hiconormonitor] +} + + +namespace eval twapi::systemtray { + + namespace path [namespace parent] + + # Dictionary mapping id->handler, hicon + variable _icondata + set _icondata [dict create] + + variable _icon_id_ctr + + variable _message_map + array set _message_map { + 123 contextmenu + 512 mousemove + 513 lbuttondown + 514 lbuttonup + 515 lbuttondblclk + 516 rbuttondown + 517 rbuttonup + 518 rbuttondblclk + 519 mbuttondown + 520 mbuttonup + 521 mbuttondblclk + 522 mousewheel + 523 xbuttondown + 524 xbuttonup + 525 xbuttondblclk + 1024 select + 1025 keyselect + 1026 balloonshow + 1027 balloonhide + 1028 balloontimeout + 1029 balloonuserclick + } + + proc _make_NOTIFYICONW {id args} { + # TBD - implement -hiddenicon and -sharedicon using + # dwState and dwStateMask + set state 0 + set statemask 0 + array set opts [parseargs args { + hicon.arg + tip.arg + balloon.arg + timeout.int + version.int + balloontitle.arg + {balloonicon.arg none {info warning error user none}} + {silent.bool 0} + } -maxleftover 0] + + set timeout_or_version 0 + if {[info exists opts(version)]} { + if {[info exists opts(timeout)]} { + error "Cannot simultaneously specify -timeout and -version." + } + set timeout_or_version $opts(version) + } else { + if {[info exists opts(timeout)]} { + set timeout_or_version $opts(timeout) + } + } + + set flags 0x1; # uCallbackMessage member is valid + if {[info exists opts(hicon)]} { + incr flags 0x2; # hIcon member is valid + } else { + set opts(hicon) NULL + } + + if {[info exists opts(tip)]} { + incr flags 0x4 + # Truncate if necessary to 127 chars + set opts(tip) [string range $opts(tip) 0 127] + } else { + set opts(tip) "" + } + + if {[info exists opts(balloon)] || [info exists opts(balloontitle)]} { + incr flags 0x10 + } + + if {[info exists opts(balloon)]} { + set opts(balloon) [string range $opts(balloon) 0 255] + } else { + set opts(balloon) "" + } + + if {[info exists opts(balloontitle)]} { + set opts(balloontitle) [string range $opts(balloontitle) 0 63] + } else { + set opts(balloontitle) "" + } + + # Calculate padding for text fields (in bytes so 2*num padchars) + set tip_padcount [expr {2*(128 - [string length $opts(tip)])}] + set balloon_padcount [expr {2*(256 - [string length $opts(balloon)])}] + set balloontitle_padcount [expr {2 * (64 - [string length $opts(balloontitle)])}] + if {$opts(balloonicon) eq "user"} { + if {![min_os_version 5 1 2]} { + # 'user' not supported before XP SP2 + set opts(balloonicon) none + } + } + + set balloonflags [dict get { + none 0 + info 1 + warning 2 + error 3 + user 4 + } $opts(balloonicon)] + + if {$balloonflags == 4} { + if {![info exists opts(hicon)]} { + error "Option -hicon must be specified if value of -balloonicon option is 'user'" + } + } + + if {$opts(silent)} { + incr balloonflags 0x10 + } + + if {$::tcl_platform(pointerSize) == 8} { + set addrfmt m + set alignment x4 + } else { + set addrfmt n + set alignment x0 + } + + set hwnd [pointer_to_address [Twapi_GetNotificationWindow]] + set opts(hicon) [pointer_to_address $opts(hicon)] + + set bin [binary format "${alignment}${addrfmt}nnn" $hwnd $id $flags [_get_script_wm NOTIFY_ICON_CALLBACK]] + append bin \ + [binary format ${alignment}${addrfmt} $opts(hicon)] \ + [encoding convertto unicode $opts(tip)] \ + [binary format "x${tip_padcount}nn" $state $statemask] \ + [encoding convertto unicode $opts(balloon)] \ + [binary format "x${balloon_padcount}n" $timeout_or_version] \ + [encoding convertto unicode $opts(balloontitle)] \ + [binary format "x${balloontitle_padcount}nx16" $balloonflags] + return "[binary format n [expr {4+[string length $bin]}]]$bin" + } + + proc addicon {hicon {cmdprefix ""}} { + variable _icon_id_ctr + variable _icondata + + _register_script_wm_handler [_get_script_wm NOTIFY_ICON_CALLBACK] [list [namespace current]::_icon_handler] 1 + _register_script_wm_handler [_get_script_wm TASKBAR_RESTART] [list [namespace current]::_taskbar_restart_handler] 1 + + set id [incr _icon_id_ctr] + + # 0 -> Add + Shell_NotifyIcon 0 [_make_NOTIFYICONW $id -hicon $hicon] + + # 4 -> set version (controls notification behaviour) to 3 (Win2K+) + if {[catch { + Shell_NotifyIcon 4 [_make_NOTIFYICONW $id -version 3] + } ermsg]} { + set ercode $::errorCode + set erinfo $::errorInfo + removeicon $id + error $ermsg $erinfo $ercode + } + + if {[llength $cmdprefix]} { + dict set _icondata $id handler $cmdprefix + } + dict set _icondata $id hicon $hicon + + return $id + } + + proc removeicon {id} { + variable _icondata + + # Ignore errors in case dup call + catch {Shell_NotifyIcon 2 [_make_NOTIFYICONW $id]} + dict unset _icondata $id + } + + proc modifyicon {id args} { + # TBD - do we need to [dict set _icondata hicon ...] ? + Shell_NotifyIcon 1 [_make_NOTIFYICONW $id {*}$args] + } + + proc _icon_handler {msg id notification msgpos ticks} { + variable _icondata + variable _message_map + + if {![dict exists $_icondata $id handler]} { + return; # Stale or no handler specified + } + + # Translate the notification into text + if {[info exists _message_map($notification)]} { + set notification $_message_map($notification) + } + + uplevel #0 [linsert [dict get $_icondata $id handler] end $id $notification $msgpos $ticks] + } + + proc _taskbar_restart_handler {args} { + variable _icondata + # Need to add icons back into taskbar + dict for {id icodata} $_icondata { + # 0 -> Add + Shell_NotifyIcon 0 [_make_NOTIFYICONW $id -hicon [dict get $icodata hicon]] + } + } + + namespace export addicon modifyicon removeicon + namespace ensemble create +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/sspi.tcl b/src/punk86.vfs/lib/twapi4.7.2/sspi.tcl new file mode 100644 index 00000000..aa4ec70e --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/sspi.tcl @@ -0,0 +1,801 @@ +# +# Copyright (c) 2007-2013, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval twapi { + + + # Holds SSPI security contexts indexed by a handle + # Each element is a dict with the following keys: + # State - state of the security context - see sspi_step + # Handle - the Win32 SecHandle for the context + # Input - Pending input from remote end to be passed in to + # SSPI provider (only valid for streams) + # Output - list of SecBuffers that contain data to be sent + # to remote end during a SSPI negotiation + # Inattr - requested context attributes + # Outattr - context attributes returned from service provider + # (currently not used) + # Expiration - time when context will expire + # Ctxtype - client, server + # Target - + # Datarep - data representation format + # Credentials - handle for credentials to pass to sspi provider + variable _sspi_state + array set _sspi_state {} + + proc* _init_security_context_syms {} { + variable _server_security_context_syms + variable _client_security_context_syms + variable _secpkg_capability_syms + + + # Symbols used for mapping server security context flags + array set _server_security_context_syms { + confidentiality 0x10 + connection 0x800 + delegate 0x1 + extendederror 0x8000 + identify 0x80000 + integrity 0x20000 + mutualauth 0x2 + replaydetect 0x4 + sequencedetect 0x8 + stream 0x10000 + } + + # Symbols used for mapping client security context flags + array set _client_security_context_syms { + confidentiality 0x10 + connection 0x800 + delegate 0x1 + extendederror 0x4000 + identify 0x20000 + integrity 0x10000 + manualvalidation 0x80000 + mutualauth 0x2 + replaydetect 0x4 + sequencedetect 0x8 + stream 0x8000 + usesessionkey 0x20 + usesuppliedcreds 0x80 + } + + # Symbols used for mapping security package capabilities + array set _secpkg_capability_syms { + integrity 0x00000001 + privacy 0x00000002 + tokenonly 0x00000004 + datagram 0x00000008 + connection 0x00000010 + multirequired 0x00000020 + clientonly 0x00000040 + extendederror 0x00000080 + impersonation 0x00000100 + acceptwin32name 0x00000200 + stream 0x00000400 + negotiable 0x00000800 + gsscompatible 0x00001000 + logon 0x00002000 + asciibuffers 0x00004000 + fragment 0x00008000 + mutualauth 0x00010000 + delegation 0x00020000 + readonlywithchecksum 0x00040000 + restrictedtokens 0x00080000 + negoextender 0x00100000 + negotiable2 0x00200000 + appcontainerpassthrough 0x00400000 + appcontainerchecks 0x00800000 + } + } {} +} + +# Return list of security packages +proc twapi::sspi_enumerate_packages {args} { + set pkgs [EnumerateSecurityPackages] + if {[llength $args] == 0} { + set names [list ] + foreach pkg $pkgs { + lappend names [kl_get $pkg Name] + } + return $names + } + + # TBD - why is this hyphenated ? + array set opts [parseargs args { + all capabilities version rpcid maxtokensize name comment + } -maxleftover 0 -hyphenated] + + _init_security_context_syms + variable _secpkg_capability_syms + set retdata {} + foreach pkg $pkgs { + set rec {} + if {$opts(-all) || $opts(-capabilities)} { + lappend rec -capabilities [_make_symbolic_bitmask [kl_get $pkg fCapabilities] _secpkg_capability_syms] + } + foreach {opt field} {-version wVersion -rpcid wRPCID -maxtokensize cbMaxToken -name Name -comment Comment} { + if {$opts(-all) || $opts($opt)} { + lappend rec $opt [kl_get $pkg $field] + } + } + dict set recdata [kl_get $pkg Name] $rec + } + return $recdata +} + +proc twapi::sspi_schannel_credentials args { + # TBD - do all these options work ? Check before documenting + # since they seem to be duplicated in InitializeSecurityContext + parseargs args { + certificates.arg + {rootstore.arg NULL} + sessionlifespan.int + usedefaultclientcert.bool + {disablereconnects.bool 0 0x80} + {revocationcheck.arg none {full endonly excluderoot none}} + {ignoreerrorrevocationoffline.bool 0 0x1000} + {ignoreerrornorevocationcheck.bool 0 0x800} + {validateservercert.bool 1} + cipherstrength.arg + protocols.arg + } -setvars -nulldefault -maxleftover 0 + + set flags [expr {$disablereconnects | $ignoreerrornorevocationcheck | $ignoreerrorrevocationoffline}] + incr flags [dict get { + none 0 full 0x200 excluderoot 0x400 endonly 0x100 + } $revocationcheck] + + if {$validateservercert} { + incr flags 0x20; # SCH_CRED_AUTO_CRED_VALIDATION + } else { + incr flags 0x8; # SCH_CRED_MANUAL_CRED_VALIDATION + } + if {$usedefaultclientcert} { + incr flags 0x40; # SCH_CRED_USE_DEFAULT_CREDS + } else { + incr flags 0x10; # SCH_CRED_NO_DEFAULT_CREDS + } + + set protbits 0 + foreach prot $protocols { + set protbits [expr { + $protbits | [dict! { + ssl2 0xc ssl3 0x30 tls1 0xc0 tls1.1 0x300 tls1.2 0xc00 + } $prot] + }] + } + + switch [llength $cipherstrength] { + 0 { set minbits 0 ; set maxbits 0 } + 1 { set minbits [lindex $cipherstrength 0] ; set maxbits $minbits } + 2 { + set minbits [lindex $cipherstrength 0] + set maxbits [lindex $cipherstrength 1] + } + default { + error "Invalid value '$cipherstrength' for option -cipherstrength" + } + } + + # 4 -> SCHANNEL_CRED_VERSION + return [list 4 $certificates $rootstore {} {} $protbits $minbits $maxbits $sessionlifespan $flags 0] +} + +proc twapi::sspi_winnt_identity_credentials {user domain password} { + return [list $user $domain $password] +} + +proc twapi::sspi_acquire_credentials {args} { + parseargs args { + {credentials.arg {}} + principal.arg + {package.arg NTLM} + {role.arg both {client server inbound outbound both}} + getexpiration + } -maxleftover 0 -setvars -nulldefault + + set creds [AcquireCredentialsHandle $principal \ + [dict* { + unisp {Microsoft Unified Security Protocol Provider} + ssl {Microsoft Unified Security Protocol Provider} + tls {Microsoft Unified Security Protocol Provider} + } $package] \ + [kl_get {inbound 1 server 1 outbound 2 client 2 both 3} $role] \ + "" $credentials] + + if {$getexpiration} { + return [kl_create2 {-handle -expiration} $creds] + } else { + return [lindex $creds 0] + } +} + +# Frees credentials +proc twapi::sspi_free_credentials {cred} { + FreeCredentialsHandle $cred +} + +# Return a client context +proc twapi::sspi_client_context {cred args} { + _init_security_context_syms + variable _client_security_context_syms + + parseargs args { + target.arg + {datarep.arg network {native network}} + confidentiality.bool + connection.bool + delegate.bool + extendederror.bool + identify.bool + integrity.bool + manualvalidation.bool + mutualauth.bool + replaydetect.bool + sequencedetect.bool + stream.bool + usesessionkey.bool + usesuppliedcreds.bool + } -maxleftover 0 -nulldefault -setvars + + set context_flags 0 + foreach {opt flag} [array get _client_security_context_syms] { + if {[set $opt]} { + set context_flags [expr {$context_flags | $flag}] + } + } + + set drep [kl_get {native 0x10 network 0} $datarep] + return [_construct_sspi_security_context \ + sspiclient#[TwapiId] \ + [InitializeSecurityContext \ + $cred \ + "" \ + $target \ + $context_flags \ + 0 \ + $drep \ + [list ] \ + 0] \ + client \ + $context_flags \ + $target \ + $cred \ + $drep \ + ] +} + +# Delete a security context +proc twapi::sspi_delete_context {ctx} { + variable _sspi_state + set h [_sspi_context_handle $ctx] + if {[llength $h]} { + DeleteSecurityContext $h + } + unset _sspi_state($ctx) +} + +# Shuts down a security context in orderly fashion +# Caller should start sspi_step +proc twapi::sspi_shutdown_context {ctx} { + variable _sspi_state + + _sspi_context_handle $ctx; # Verify handle + dict with _sspi_state($ctx) { + switch -nocase -- [lindex [QueryContextAttributes $Handle 10] 4] { + schannel - + "Microsoft Unified Security Protocol Provider" {} + default { return } + } + + # Signal to security provider we want to shutdown + Twapi_ApplyControlToken_SCHANNEL_SHUTDOWN $Handle + + if {$Ctxtype eq "client"} { + set rawctx [InitializeSecurityContext \ + $Credentials \ + $Handle \ + $Target \ + $Inattr \ + 0 \ + $Datarep \ + [list ] \ + 0] + } else { + set rawctx [AcceptSecurityContext \ + $Credentials \ + $Handle \ + [list ] \ + $Inattr \ + $Datarep] + } + lassign $rawctx State Handle out Outattr Expiration extra + if {$State in {ok expired}} { + return [list done [_gather_secbuf_data $out]] + } else { + return [list continue [_gather_secbuf_data $out]] + } + } +} + +# Take the next step in an SSPI negotiation +# Returns +# {done data extradata} +# {continue data} +# {expired data} +proc twapi::sspi_step {ctx {received ""}} { + variable _sspi_state + variable _client_security_context_syms + + _sspi_validate_handle $ctx + + dict with _sspi_state($ctx) { + # Note the dictionary content variables are + # State, Handle, Output, Outattr, Expiration, + # Ctxtype, Inattr, Target, Datarep, Credentials + + # Append new input to existing input + append Input $received + switch -exact -- $State { + ok { + set data [_gather_secbuf_data $Output] + set Output {} + + # $Input at this point contains left over input that is + # actually application data (streaming case). + # Application should pass this to decrypt commands + return [list done $data $Input[set Input ""]] + } + continue { + # Continue with the negotiation + if {[string length $Input] != 0} { + # Pass in received data to SSPI. + # Most providers take only the first buffer + # but SChannel/UNISP need the second. Since + # others don't seem to mind the second buffer + # we always always include it + # 2 -> SECBUFFER_TOKEN, 0 -> SECBUFFER_EMPTY + set inbuflist [list [list 2 $Input] [list 0]] + if {$Ctxtype eq "client"} { + set rawctx [InitializeSecurityContext \ + $Credentials \ + $Handle \ + $Target \ + $Inattr \ + 0 \ + $Datarep \ + $inbuflist \ + 0] + } else { + set rawctx [AcceptSecurityContext \ + $Credentials \ + $Handle \ + $inbuflist \ + $Inattr \ + $Datarep] + } + lassign $rawctx State Handle out Outattr Expiration extra + lappend Output {*}$out + # When the error is incomplete_credentials, we will retry + # with the SEC_I_INCOMPLETE_CREDENTIALS flag set. For + # this the Input should remain the same. Otherwise set it + # to whatever remains to be processed in the buffer. + if {$State ne "incomplete_credentials"} { + set Input $extra + } + # Will recurse at proc end + } else { + # There was no received data. Return any data + # to be sent to remote end + set data [_gather_secbuf_data $Output] + set Output {} + return [list continue $data ""] + } + } + incomplete_message { + # Caller has to get more data from remote end + set State continue + return [list continue "" ""] + } + expired { + # Remote end closed in middle of negotiation + return [list disconnected "" ""] + } + incomplete_credentials { + # In this state, the remote has asked for an client certificate. + # In this case, we ask Schannel to limit itself to whatever + # the user supplied and retry. Servers that ask for a cert + # but do not mandate it will then proceed. However, we only + # do this if we have not already tried this route. If we have, + # then generate an error. The real solution would be to attempt + # to look up new credentials by retrieving a certificate + # from the certificate store (possibly by asking the user) but + # this is not implemented. + # TBD - get client cert from user. See + # https://github.com/david-maw/StreamSSL and + # https://www.codeproject.com/Articles/1094525/Configuring-SSL-and-Client-Certificate-Validation + if {$Inattr & $_client_security_context_syms(usesuppliedcreds)} { + # Already tried with this. Give up. + set ermsg "Handling of incomplete credentials not implemented. If using TLS, specify the -credentials option to tls_socket to provide credentials." + error $ermsg "" [list TWAPI SSPI UNSUPPORTED $ermsg] + } + set Inattr [expr {$Inattr | $_client_security_context_syms(usesuppliedcreds)}] + set State continue + # Fall to bottom to recurse one more time + } + complete - + complete_and_continue { + # Should not actually occur as sspi.c no longer returns + # these codes + error "State $State handling not implemented." + } + } + } + + # Recurse to return next state. + # This has to be OUTSIDE the [dict with] above else it will not + # see the updated values + return [sspi_step $ctx] +} + +# Return a server context +proc twapi::sspi_server_context {cred clientdata args} { + _init_security_context_syms + variable _server_security_context_syms + + parseargs args { + {datarep.arg network {native network}} + confidentiality.bool + connection.bool + delegate.bool + extendederror.bool + identify.bool + integrity.bool + mutualauth.bool + replaydetect.bool + sequencedetect.bool + stream.bool + } -maxleftover 0 -nulldefault -setvars + + set context_flags 0 + foreach {opt flag} [array get _server_security_context_syms] { + if {[set $opt]} { + set context_flags [expr {$context_flags | $flag}] + } + } + + set drep [kl_get {native 0x10 network 0} $datarep] + return [_construct_sspi_security_context \ + sspiserver#[TwapiId] \ + [AcceptSecurityContext \ + $cred \ + "" \ + [list [list 2 $clientdata]] \ + $context_flags \ + $drep] \ + server \ + $context_flags \ + "" \ + $cred \ + $drep \ + ] +} + + +# Get the security context flags after completion of request +proc ::twapi::sspi_context_features {ctx} { + variable _sspi_state + + set ctxh [_sspi_context_handle $ctx] + + _init_security_context_syms + + # We could directly look in the context itself but intead we make + # an explicit call, just in case they change after initial setup + set flags [QueryContextAttributes $ctxh 14] + + # Mapping of symbols depends on whether it is a client or server + # context + if {[dict get $_sspi_state($ctx) Ctxtype] eq "client"} { + upvar 0 [namespace current]::_client_security_context_syms syms + } else { + upvar 0 [namespace current]::_server_security_context_syms syms + } + + set result [list -raw $flags] + foreach {sym flag} [array get syms] { + lappend result -$sym [expr {($flag & $flags) != 0}] + } + + return $result +} + +# Get the user name for a security context +proc twapi::sspi_context_username {ctx} { + return [QueryContextAttributes [_sspi_context_handle $ctx] 1] +} + +# Get the field size information for a security context +# TBD - update for SSL +proc twapi::sspi_context_sizes {ctx} { + set sizes [QueryContextAttributes [_sspi_context_handle $ctx] 0] + return [twine {-maxtoken -maxsig -blocksize -trailersize} $sizes] +} + +proc twapi::sspi_remote_cert {ctx} { + return [QueryContextAttributes [_sspi_context_handle $ctx] 0x53] +} + +proc twapi::sspi_local_cert {ctx} { + return [QueryContextAttributes [_sspi_context_handle $ctx] 0x54] +} + +proc twapi::sspi_issuers_accepted_by_peer {ctx} { + return [QueryContextAttributes [_sspi_context_handle $ctx] 0x59] +} + +# Returns a signature +proc twapi::sspi_sign {ctx data args} { + parseargs args { + {seqnum.int 0} + {qop.int 0} + } -maxleftover 0 -setvars + + return [MakeSignature \ + [_sspi_context_handle $ctx] \ + $qop \ + $data \ + $seqnum] +} + +# Verify signature +proc twapi::sspi_verify_signature {ctx sig data args} { + parseargs args { + {seqnum.int 0} + } -maxleftover 0 -setvars + + # Buffer type 2 - Token, 1- Data + return [VerifySignature \ + [_sspi_context_handle $ctx] \ + [list [list 2 $sig] [list 1 $data]] \ + $seqnum] +} + +# Encrypts a data as per a context +# Returns {securitytrailer encrypteddata padding} +proc twapi::sspi_encrypt {ctx data args} { + parseargs args { + {seqnum.int 0} + {qop.int 0} + } -maxleftover 0 -setvars + + return [EncryptMessage \ + [_sspi_context_handle $ctx] \ + $qop \ + $data \ + $seqnum] +} + +proc twapi::sspi_encrypt_stream {ctx data args} { + variable _sspi_state + + set h [_sspi_context_handle $ctx] + + # TBD - docment options + parseargs args { + {qop.int 0} + } -maxleftover 0 -setvars + + set enc "" + while {[string length $data]} { + lassign [EncryptStream $h $qop $data] fragment data + lappend enc $fragment + } + + return [join $enc ""] +} + +# chan must be in binary mode +proc twapi::sspi_encrypt_and_write {ctx data chan args} { + variable _sspi_state + + set h [_sspi_context_handle $ctx] + + parseargs args { + {qop.int 0} + {flush.bool 1} + } -maxleftover 0 -setvars + + while {[string length $data]} { + lassign [EncryptStream $h $qop $data] fragment data + puts -nonewline $chan $fragment + } + + if {$flush} { + chan flush $chan + } +} + + +# Decrypts a message +# TBD - why does this not return a status like sspi_decrypt_stream ? +proc twapi::sspi_decrypt {ctx sig data padding args} { + variable _sspi_state + _sspi_validate_handle $ctx + + parseargs args { + {seqnum.int 0} + } -maxleftover 0 -setvars + + # Buffer type 2 - Token, 1- Data, 9 - padding + set decrypted [DecryptMessage \ + [dict get $_sspi_state($ctx) Handle] \ + [list [list 2 $sig] [list 1 $data] [list 9 $padding]] \ + $seqnum] + set plaintext {} + # Pick out only the data buffers, ignoring pad buffers and signature + # Optimize copies by keeping as a list so in the common case of a + # single buffer can return it as is. Multiple buffers are expensive + # because Tcl will shimmer each byte array into a list and then + # incur additional copies during joining + foreach buf $decrypted { + # SECBUFFER_DATA -> 1 + if {[lindex $buf 0] == 1} { + lappend plaintext [lindex $buf 1] + } + } + + if {[llength $plaintext] < 2} { + return [lindex $plaintext 0] + } else { + return [join $plaintext ""] + } +} + +# Decrypts a stream +proc twapi::sspi_decrypt_stream {ctx data} { + variable _sspi_state + set hctx [_sspi_context_handle $ctx] + + # SSL decryption is done in max size chunks. + # We will loop collecting as much data as possible. Collecting + # as a list and joining at end minimizes internal byte copies + set plaintext {} + lassign [DecryptStream $hctx [dict get $_sspi_state($ctx) Input] $data] status decrypted extra + lappend plaintext $decrypted + + # TBD - handle renegotiate status + while {$status eq "ok" && [string length $extra]} { + # See if additional data and loop again + lassign [DecryptStream $hctx $extra] status decrypted extra + lappend plaintext $decrypted + } + + dict set _sspi_state($ctx) Input $extra + if {$status eq "incomplete_message"} { + set status ok + } + return [list $status [join $plaintext ""]] +} + + +################################################################ +# Utility procs + + +# Construct a high level SSPI security context structure +# rawctx is context as returned from C level code +proc twapi::_construct_sspi_security_context {id rawctx ctxtype inattr target credentials datarep} { + variable _sspi_state + + set _sspi_state($id) [dict merge [dict create Ctxtype $ctxtype \ + Inattr $inattr \ + Target $target \ + Datarep $datarep \ + Credentials $credentials] \ + [twine \ + {State Handle Output Outattr Expiration Input} \ + $rawctx]] + + return $id +} + +proc twapi::_sspi_validate_handle {ctx} { + variable _sspi_state + + if {![info exists _sspi_state($ctx)]} { + badargs! "Invalid SSPI security context handle $ctx" 3 + } +} + +proc twapi::_sspi_context_handle {ctx} { + variable _sspi_state + + if {![info exists _sspi_state($ctx)]} { + badargs! "Invalid SSPI security context handle $ctx" 3 + } + + return [dict get $_sspi_state($ctx) Handle] +} + +proc twapi::_gather_secbuf_data {bufs} { + if {[llength $bufs] == 1} { + return [lindex [lindex $bufs 0] 1] + } else { + set data {} + foreach buf $bufs { + # First element is buffer type, which we do not care + # Second element is actual data + lappend data [lindex $buf 1] + } + return [join $data {}] + } +} + +if {0} { + TBD - delete + set cred [sspi_acquire_credentials -package ssl -role client] + set client [sspi_client_context $cred -stream 1 -manualvalidation 1] + set out [sspi_step $client] + set so [socket 192.168.1.127 443] + fconfigure $so -blocking 0 -buffering none -translation binary + puts -nonewline $so [lindex $out 1] + + set data [read $so] + set out [sspi_step $client $data] + puts -nonewline $so [lindex $out 1] + + set data [read $so] + set out [sspi_step $client $data] + + set out [sspi_encrypt_stream $client "GET / HTTP/1.0\r\n\r\n"] + puts -nonewline $so $out + set data [read $so] + set d [sspi_decrypt_stream $client $data] + sspi_shutdown_context $client + close $so ; sspi_free_credentials $cred ; sspi_free_context $client + sspi_context_free $client + sspi_shutdown_context $client + + # INTERNAL client-server + proc 'sslsetup {} { + uplevel #0 { + twapi + source ../tests/testutil.tcl + set ca [make_test_certs] + set cacert [cert_store_find_certificate $ca subject_substring twapitestca] + set scert [cert_store_find_certificate $ca subject_substring twapitestserver] + set scred [sspi_acquire_credentials -package ssl -role server -credentials [sspi_schannel_credentials -certificates [list $scert]]] + set ccert [cert_store_find_certificate $ca subject_substring twapitestclient] + set ccred [sspi_acquire_credentials -package ssl -role client -credentials [sspi_schannel_credentials]] + set cctx [sspi_client_context $ccred -stream 1 -manualvalidation 1] + set cstep [sspi_step $cctx] + + set sctx [sspi_server_context $scred [lindex $cstep 1] -stream 1] + set sstep [sspi_step $sctx] + set cstep [sspi_step $cctx [lindex $sstep 1]] + set sstep [sspi_step $sctx [lindex $cstep 1]] + set cstep [sspi_step $cctx [lindex $sstep 1]] + } + } + set out [sspi_encrypt_stream $cctx "This is a test"] + + sspi_decrypt_stream $sctx $out + sspi_decrypt_stream $sctx "" + set out [sspi_encrypt_stream $sctx "This is a testx"] + sspi_decrypt_stream $cctx $out + + proc 'ccred {} { + set store [cert_system_store_open twapitest user] + set ccert [cert_store_find_certificate $store subject_substring twapitestclient] + set ccred [sspi_acquire_credentials -package ssl -role client -credentials [sspi_schannel_credentials -certificates [list $ccert]]] + cert_store_release $store + cert_release $ccert + return $ccred + } + +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/storage.tcl b/src/punk86.vfs/lib/twapi4.7.2/storage.tcl new file mode 100644 index 00000000..72bd2d73 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/storage.tcl @@ -0,0 +1,616 @@ +# +# Copyright (c) 2003, 2008 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# TBD - convert file spec to drive root path + +# Get info associated with a drive +proc twapi::get_volume_info {drive args} { + + set drive [_drive_rootpath $drive] + + array set opts [parseargs args { + all size freespace used useravail type serialnum label maxcomponentlen fstype attr device extents + } -maxleftover 0] + + if {$opts(all)} { + # -all option does not cover -type, -extents and -device + foreach opt { + all size freespace used useravail serialnum label maxcomponentlen fstype attr + } { + set opts($opt) 1 + } + } + + set result [list ] + if {$opts(size) || $opts(freespace) || $opts(used) || $opts(useravail)} { + lassign [GetDiskFreeSpaceEx $drive] useravail size freespace + foreach opt {size freespace useravail} { + if {$opts($opt)} { + lappend result -$opt [set $opt] + } + } + if {$opts(used)} { + lappend result -used [expr {$size - $freespace}] + } + } + + if {$opts(type)} { + set drive_type [get_drive_type $drive] + lappend result -type $drive_type + } + if {$opts(device)} { + if {[_is_unc $drive]} { + # UNC paths cannot be used with QueryDosDevice + lappend result -device "" + } else { + lappend result -device [QueryDosDevice [string range $drive 0 1]] + } + } + + if {$opts(extents)} { + set extents {} + if {! [_is_unc $drive]} { + trap { + set device_handle [create_file "\\\\.\\[string range $drive 0 1]" -createdisposition open_existing] + set bin [device_ioctl $device_handle 0x560000 -outputcount 32] + if {[binary scan $bin i nextents] != 1} { + error "Truncated information returned from ioctl 0x560000" + } + set off 8 + for {set i 0} {$i < $nextents} {incr i} { + if {[binary scan $bin "@$off i x4 w w" extent(-disknumber) extent(-startingoffset) extent(-extentlength)] != 3} { + error "Truncated information returned from ioctl 0x560000" + } + lappend extents [array get extent] + incr off 24; # Size of one extent element + } + } onerror {} { + # Do nothing, device does not support extents or access denied + # Empty list is returned + } finally { + if {[info exists device_handle]} { + CloseHandle $device_handle + } + } + } + + lappend result -extents $extents + } + + if {$opts(serialnum) || $opts(label) || $opts(maxcomponentlen) + || $opts(fstype) || $opts(attr)} { + foreach {label serialnum maxcomponentlen attr fstype} \ + [GetVolumeInformation $drive] { break } + foreach opt {label maxcomponentlen fstype} { + if {$opts($opt)} { + lappend result -$opt [set $opt] + } + } + if {$opts(serialnum)} { + set low [expr {$serialnum & 0x0000ffff}] + set high [expr {($serialnum >> 16) & 0x0000ffff}] + lappend result -serialnum [format "%.4X-%.4X" $high $low] + } + if {$opts(attr)} { + set attrs [list ] + foreach {sym val} { + case_preserved_names 2 + unicode_on_disk 4 + persistent_acls 8 + file_compression 16 + volume_quotas 32 + supports_sparse_files 64 + supports_reparse_points 128 + supports_remote_storage 256 + volume_is_compressed 0x8000 + supports_object_ids 0x10000 + supports_encryption 0x20000 + named_streams 0x40000 + read_only_volume 0x80000 + sequential_write_once 0x00100000 + supports_transactions 0x00200000 + supports_hard_links 0x00400000 + supports_extended_attributes 0x00800000 + supports_open_by_file_id 0x01000000 + supports_usn_journal 0x02000000 + } { + if {$attr & $val} { + lappend attrs $sym + } + } + lappend result -attr $attrs + } + } + + return $result +} +interp alias {} twapi::get_drive_info {} twapi::get_volume_info + + +# Check if disk has at least n bytes available for the user (NOT total free) +proc twapi::user_drive_space_available {drv space} { + return [expr {$space <= [lindex [get_drive_info $drv -useravail] 1]}] +} + +# Get the drive type +proc twapi::get_drive_type {drive} { + # set type [GetDriveType "[string trimright $drive :/\\]:\\"] + set type [GetDriveType [_drive_rootpath $drive]] + switch -exact -- $type { + 0 { return unknown} + 1 { return invalid} + 2 { return removable} + 3 { return fixed} + 4 { return remote} + 5 { return cdrom} + 6 { return ramdisk} + } +} + +# Get list of drives +proc twapi::find_logical_drives {args} { + array set opts [parseargs args {type.arg}] + + set drives [list ] + foreach drive [_drivemask_to_drivelist [GetLogicalDrives]] { + if {(![info exists opts(type)]) || + [lsearch -exact $opts(type) [get_drive_type $drive]] >= 0} { + lappend drives $drive + } + } + return $drives +} + +twapi::proc* twapi::drive_ready {drive} { + uplevel #0 package require twapi_device +} { + set drive [string trimright $drive "/\\"] + if {[string length $drive] != 2 || [string index $drive 1] ne ":"} { + error "Invalid drive specification" + } + set drive "\\\\.\\$drive" + + # Do our best to avoid the Windows "Drive not ready" dialog + # 1 -> SEM_FAILCRITICALERRORS + if {[min_os_version 6]} { + set old_mode [SetErrorMode 1] + } + trap { + + # We will first try using IOCTL_STORAGE_CHECK_VERIFY2 as that is + # much faster and only needs FILE_READ_ATTRIBUTES access. + set error [catch { + set h [create_file $drive -access file_read_attributes \ + -createdisposition open_existing -share {read write}] + device_ioctl $h 0x2d0800; # IOCTL_STORAGE_CHECK_VERIFY2 + }] + if {[info exists h]} { + close_handle $h + } + if {! $error} { + return 1; # Device is ready + } + + # On error, try the older slower method. Note we now need + # GENERIC_READ access. (NOTE: FILE_READ_DATA will not work with some + # volume types) + unset -nocomplain h + set error [catch { + set h [create_file $drive -access generic_read \ + -createdisposition open_existing -share {read write}] + device_ioctl $h 0x2d4800; # IOCTL_STORAGE_CHECK_VERIFY + }] + if {[info exists h]} { + close_handle $h + } + if {! $error} { + return 1; # Device is ready + } + + # Remote shares sometimes return access denied with the above + # even when actually available. Try with good old file exists + # on root directory + return [file exists "[string range $drive end-1 end]\\"] + } finally { + if {[min_os_version 6]} { + SetErrorMode $old_mode + } + } +} + + +# Set the drive label +proc twapi::set_drive_label {drive label} { + SetVolumeLabel [_drive_rootpath $drive] $label +} + +# Maps a drive letter to the given path +proc twapi::map_drive_local {drive path args} { + array set opts [parseargs args {raw}] + + set drive [string range [_drive_rootpath $drive] 0 1] + DefineDosDevice $opts(raw) $drive [file nativename $path] +} + + +# Unmaps a drive letter +proc twapi::unmap_drive_local {drive args} { + array set opts [parseargs args { + path.arg + raw + } -nulldefault] + + set drive [string range [_drive_rootpath $drive] 0 1] + + set flags $opts(raw) + setbits flags 0x2; # DDD_REMOVE_DEFINITION + if {$opts(path) ne ""} { + setbits flags 0x4; # DDD_EXACT_MATCH_ON_REMOVE + } + DefineDosDevice $flags $drive [file nativename $opts(path)] +} + + +# Callback from C code +proc twapi::_filesystem_monitor_handler {id changes} { + variable _filesystem_monitor_scripts + if {[info exists _filesystem_monitor_scripts($id)]} { + return [uplevel #0 [linsert $_filesystem_monitor_scripts($id) end $id $changes]] + } else { + # Callback queued after close. Ignore + } +} + +# Monitor file changes +proc twapi::begin_filesystem_monitor {path script args} { + variable _filesystem_monitor_scripts + + array set opts [parseargs args { + {subtree.bool 0} + {filename.bool 0 0x1} + {dirname.bool 0 0x2} + {attr.bool 0 0x4} + {size.bool 0 0x8} + {write.bool 0 0x10} + {access.bool 0 0x20} + {create.bool 0 0x40} + {secd.bool 0 0x100} + {pattern.arg ""} + {patterns.arg ""} + } -maxleftover 0] + + if {[string length $opts(pattern)] && + [llength $opts(patterns)]} { + error "Options -pattern and -patterns are mutually exclusive. Note option -pattern is deprecated." + } + + if {[string length $opts(pattern)]} { + # Old style single pattern. Convert to new -patterns + set opts(patterns) [list "+$opts(pattern)"] + } + + # Change to use \ style path separator as that is what the file monitoring functions return + if {[llength $opts(patterns)]} { + foreach pat $opts(patterns) { + # Note / is replaced by \\ within the pattern + # since \ needs to be escaped with another \ within + # string match patterns + lappend pats [string map [list / \\\\] $pat] + } + set opts(patterns) $pats + } + + set flags [expr { $opts(filename) | $opts(dirname) | $opts(attr) | + $opts(size) | $opts(write) | $opts(access) | + $opts(create) | $opts(secd)}] + + if {! $flags} { + # If no options specified, default to all + set flags 0x17f + } + + set id [Twapi_RegisterDirectoryMonitor $path $opts(subtree) $flags $opts(patterns)] + set _filesystem_monitor_scripts($id) $script + return $id +} + +# Stop monitoring of files +proc twapi::cancel_filesystem_monitor {id} { + variable _filesystem_monitor_scripts + if {[info exists _filesystem_monitor_scripts($id)]} { + Twapi_UnregisterDirectoryMonitor $id + unset _filesystem_monitor_scripts($id) + } +} + + +# Get list of volumes +proc twapi::find_volumes {} { + set vols [list ] + set found 1 + # Assumes there has to be at least one volume + lassign [FindFirstVolume] handle vol + while {$found} { + lappend vols $vol + lassign [FindNextVolume $handle] found vol + } + FindVolumeClose $handle + return $vols +} + +# Get list of volume mount points +proc twapi::find_volume_mount_points {vol} { + set mntpts [list ] + set found 1 + trap { + lassign [FindFirstVolumeMountPoint $vol] handle mntpt + } onerror {TWAPI_WIN32 18} { + # ERROR_NO_MORE_FILES + # No volume mount points + return [list ] + } onerror {TWAPI_WIN32 3} { + # Volume does not support them + return [list ] + } + + # At least one volume found + while {$found} { + lappend mntpts $mntpt + lassign [FindNextVolumeMountPoint $handle] found mntpt + } + FindVolumeMountPointClose $handle + return $mntpts +} + +# Set volume mount point +proc twapi::mount_volume {volpt volname} { + # Note we don't use _drive_rootpath for trimming since may not be root path + SetVolumeMountPoint "[string trimright $volpt /\\]\\" "[string trimright $volname /\\]\\" +} + +# Delete volume mount point +proc twapi::unmount_volume {volpt} { + # Note we don't use _drive_rootpath for trimming since may not be root path + DeleteVolumeMountPoint "[string trimright $volpt /\\]\\" +} + +# Get the volume mounted at a volume mount point +proc twapi::get_mounted_volume_name {volpt} { + # Note we don't use _drive_rootpath for trimming since may not be root path + return [GetVolumeNameForVolumeMountPoint "[string trimright $volpt /\\]\\"] +} + +# Get the mount point corresponding to a given path +proc twapi::get_volume_mount_point_for_path {path} { + return [GetVolumePathName [file nativename $path]] +} + + +# Return the times associated with a file +proc twapi::get_file_times {fd args} { + array set opts [parseargs args { + all + mtime + ctime + atime + } -maxleftover 0] + + # Figure out if fd is a file path, Tcl channel or a handle + set close_handle false + if {[file exists $fd]} { + # It's a file name + # 0x02000000 -> FILE_FLAG_BACKUP_SEMANTICS, always required in case + # opening a directory (even if SeBackupPrivilege is not held + set h [create_file $fd -createdisposition open_existing -flags 0x02000000] + set close_handle true + } elseif {[catch {fconfigure $fd}]} { + # Not a Tcl channel, See if handle + if {[pointer? $fd]} { + set h $fd + } else { + error "$fd is not an existing file, handle or Tcl channel." + } + } else { + # Tcl channel + set h [get_tcl_channel_handle $fd read] + } + + set result [list ] + + foreach opt {ctime atime mtime} time [GetFileTime $h] { + if {$opts(all) || $opts($opt)} { + lappend result -$opt $time + } + } + + if {$close_handle} { + CloseHandle $h + } + + return $result +} + + +# Set the times associated with a file +proc twapi::set_file_times {fd args} { + + array set opts [parseargs args { + mtime.arg + ctime.arg + atime.arg + preserveatime + } -maxleftover 0 -nulldefault] + + if {$opts(atime) ne "" && $opts(preserveatime)} { + win32_error 87 "Cannot specify -atime and -preserveatime at the same time." + } + if {$opts(preserveatime)} { + set opts(atime) -1; # Meaning preserve access to original + } + + # Figure out if fd is a file path, Tcl channel or a handle + set close_handle false + if {[file exists $fd]} { + if {$opts(preserveatime)} { + win32_error 87 "Cannot specify -preserveatime unless file is specified as a Tcl channel or a Win32 handle." + } + + # It's a file name + # 0x02000000 -> FILE_FLAG_BACKUP_SEMANTICS, always required in case + # opening a directory (even if SeBackupPrivilege is not held + set h [create_file $fd -access {generic_write} -createdisposition open_existing -flags 0x02000000] + set close_handle true + } elseif {[catch {fconfigure $fd}]} { + # Not a Tcl channel, assume a handle + set h $fd + } else { + # Tcl channel + set h [get_tcl_channel_handle $fd read] + } + + SetFileTime $h $opts(ctime) $opts(atime) $opts(mtime) + + if {$close_handle} { + CloseHandle $h + } + + return +} + +# Convert a device based path to a normalized Win32 path with drive letters +proc twapi::normalize_device_rooted_path {path args} { + # TBD - keep a cache ? + # For example, we need to map \Device\HarddiskVolume1 to C: + # Can only do that by enumerating logical drives + set npath [file nativename $path] + if {![string match -nocase {\\Device\\*} $npath]} { + error "$path is not a valid device based path." + } + array set device_map {} + foreach drive [find_logical_drives] { + set device_path [lindex [lindex [get_volume_info $drive -device] 1] 0] + if {$device_path ne ""} { + set len [string length $device_path] + if {[string equal -nocase -length $len $path $device_path]} { + # Prefix matches, must be terminated by end or path separator + set ch [string index $npath $len] + if {$ch eq "" || $ch eq "\\"} { + set path ${drive}[string range $npath $len end] + if {[llength $args]} { + upvar [lindex $args 0] retvar + set retvar $path + return 1 + } else { + return $path + } + } + } + } + } + + if {[llength $args]} { + return 0 + } else { + error "Could not map device based path '$path'" + } +} + +proc twapi::flush_channel {chan} { + flush $chan + FlushFileBuffers [get_tcl_channel_handle $chan write] +} + +proc twapi::find_file_open {path args} { + variable _find_tokens + variable _find_counter + parseargs args { + {detail.arg basic {basic full}} + } -setvars -maxleftover 0 + + set detail_level [expr {$detail eq "basic" ? 1 : 0}] + if {[min_os_version 6 1]} { + set flags 2; # FIND_FIRST_EX_LARGE_FETCH - Win 7 + } else { + set flags 0 + } + # 0 -> search op. Could be specified as 1 to limit search to + # directories but that is only advisory and does not seem to work + # in many cases. So don't bother making it an option. + lassign [FindFirstFileEx $path $detail_level 0 "" $flags] handle entry + set token ff#[incr _find_counter] + set _find_tokens($token) [list Handle $handle Entry $entry] + return $token +} + +proc twapi::find_file_close {token} { + variable _find_tokens + if {[info exists _find_tokens($token)]} { + FindClose [dict get $_find_tokens($token) Handle] + unset _find_tokens($token) + } + return +} + +proc twapi::decode_file_attributes {attrs} { + return [_make_symbolic_bitmask $attrs { + archive 0x20 + compressed 0x800 + device 0x40 + directory 0x10 + encrypted 0x4000 + hidden 0x2 + integrity_stream 0x8000 + normal 0x80 + not_content_indexed 0x2000 + no_scrub_data 0x20000 + offline 0x1000 + readonly 0x1 + recall_on_data_access 0x400000 + recall_on_open 0x40000 + reparse_point 0x400 + sparse_file 0x200 + system 0x4 + temporary 0x100 + virtual 0x10000 + }] +} + +proc twapi::find_file_next {token varname} { + variable _find_tokens + if {![info exists _find_tokens($token)]} { + return false + } + if {[dict exists $_find_tokens($token) Entry]} { + set entry [dict get $_find_tokens($token) Entry] + dict unset _find_tokens($token) Entry + } else { + set entry [FindNextFile [dict get $_find_tokens($token) Handle]] + } + if {[llength $entry]} { + upvar 1 $varname result + set result [twine {attrs ctime atime mtime size reserve0 reserve1 name altname} $entry] + return true + } else { + return false + } +} + +# Utility functions + +proc twapi::_drive_rootpath {drive} { + if {[_is_unc $drive]} { + # UNC + return "[string trimright $drive ]\\" + } else { + return "[string trimright $drive :/\\]:\\" + } +} + +proc twapi::_is_unc {path} { + return [expr {[string match {\\\\*} $path] || [string match //* $path]}] +} + + diff --git a/src/punk86.vfs/lib/twapi4.7.2/synch.tcl b/src/punk86.vfs/lib/twapi4.7.2/synch.tcl new file mode 100644 index 00000000..eabf5a71 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/synch.tcl @@ -0,0 +1,94 @@ +# +# Copyright (c) 2004, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license +# +# TBD - tcl wrappers for semaphores + +namespace eval twapi { +} + +# +# Create and return a handle to a mutex +proc twapi::create_mutex {args} { + array set opts [parseargs args { + name.arg + secd.arg + inherit.bool + lock.bool + } -nulldefault -maxleftover 0] + + if {$opts(name) ne "" && $opts(lock)} { + # TBD - remove this mutex limitation + # This is not a Win32 limitation but ours. Would need to change the C + # implementation and our return format + error "Option -lock must not be specified as true if mutex is named" + } + + return [CreateMutex [_make_secattr $opts(secd) $opts(inherit)] $opts(lock) $opts(name)] +} + +# Get handle to an existing mutex +proc twapi::open_mutex {name args} { + array set opts [parseargs args { + {inherit.bool 0} + {access.arg {mutex_all_access}} + } -maxleftover 0] + + return [OpenMutex [_access_rights_to_mask $opts(access)] $opts(inherit) $name] +} + +# Lock the mutex +proc twapi::lock_mutex {h args} { + array set opts [parseargs args { + {wait.int -1} + }] + + return [wait_on_handle $h -wait $opts(wait)] +} + + +# Unlock the mutex +proc twapi::unlock_mutex {h} { + ReleaseMutex $h +} + +# +# Create and return a handle to a event +proc twapi::create_event {args} { + array set opts [parseargs args { + name.arg + secd.arg + inherit.bool + signalled.bool + manualreset.bool + existvar.arg + } -nulldefault -maxleftover 0] + + if {$opts(name) ne "" && $opts(signalled)} { + # Not clear whether event will be signalled state if it already + # existed but was not signalled + error "Option -signalled must not be specified as true if event is named." + } + + lassign [CreateEvent [_make_secattr $opts(secd) $opts(inherit)] $opts(manualreset) $opts(signalled) $opts(name)] h preexisted + if {$opts(manualreset)} { + # We want to catch attempts to wait on manual reset handles + set h [cast_handle $h HANDLE_MANUALRESETEVENT] + } + if {$opts(existvar) ne ""} { + upvar 1 $opts(existvar) existvar + set existvar $preexisted + } + + return $h +} + +interp alias {} twapi::set_event {} twapi::SetEvent +interp alias {} twapi::reset_event {} twapi::ResetEvent + +# Hack to work with the various build configuration. +if {[info commands ::twapi::get_version] ne ""} { + package provide twapi_synch [::twapi::get_version -patchlevel] +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/tls.tcl b/src/punk86.vfs/lib/twapi4.7.2/tls.tcl new file mode 100644 index 00000000..977ac751 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/tls.tcl @@ -0,0 +1,1296 @@ +# +# Copyright (c) 2012-2020, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license +namespace eval twapi::tls { + # Each element of _channels is dictionary with the following keys + # Socket - the underlying socket. This key will not exist if + # socket has been closed. + # State - SERVERINIT, CLIENTINIT, LISTENERINIT, OPEN, NEGOTIATING, CLOSED + # Type - SERVER, CLIENT, LISTENER + # Blocking - 0/1 indicating whether blocking or non-blocking channel + # WatchMask - list of {read write} indicating what events to post + # Target - Name for server cert + # Credentials - credentials handle to use for local end of connection + # FreeCredentials - if credentials should be freed on connection cleanup + # AcceptCallback - application callback on a listener and server socket. + # On listener, it is the accept command prefix. On a server + # (accepted socket) it is the prefix plus arguments passed to + # accept callback. On client and on servers sockets initialized + # with starttls, this key must NOT be present + # SspiContext - SSPI context for the connection + # Input - plaintext data to pass to app + # Output - plaintext data to encrypt and output + # ReadEventPosted - if this key exists, a chan postevent for read + # is already in progress and a second one should not be posted + # WriteEventPosted - if this key exists, a chan postevent for write + # is already in progress and a second one should not be posted + # WriteDisabled - 0 normally. Set to 1 on a half-close + + variable _channels + array set _channels {} + + # Socket command - Tcl socket by default. + variable _socket_cmd ::socket + + namespace path [linsert [namespace path] 0 [namespace parent]] + +} + +proc twapi::tls_socket_command {args} { + set orig_command $tls::_socket_cmd + if {[llength $args] == 1} { + set tls::_socket_cmd [lindex $args 0] + } elseif {[llength $args] != 0} { + error "wrong # args: should be \"tls_socket_command ?cmd?\"" + } + return $orig_command +} + +interp alias {} twapi::tls_socket {} twapi::tls::_socket +proc twapi::tls::_socket {args} { + variable _channels + variable _socket_cmd + + debuglog [info level 0] + + parseargs args { + myaddr.arg + myport.int + async + socketcmd.arg + server.arg + peersubject.arg + requestclientcert + {credentials.arg {}} + {verifier.arg {}} + } -setvars + + set chan [chan create {read write} [list [namespace current]]] + # NOTE: We were originally using badargs! instead of error to raise + # exceptions. However that lands up bypassing the trap because of + # the way badargs! is implemented. So stick to error. + trap { + set socket_args {} + foreach opt {myaddr myport} { + if {[info exists $opt]} { + lappend socket_args -$opt [set $opt] + } + } + if {$async} { + lappend socket_args -async + } + + if {[info exists server]} { + if {$server eq ""} { + error "Cannot specify an empty value for -server." + } + + if {[info exists peersubject]} { + error "Option -peersubject cannot be specified for with -server" + } + set peersubject "" + set type LISTENER + lappend socket_args -server [list [namespace current]::_accept $chan] + if {[llength $credentials] == 0} { + error "Option -credentials must be specified for server sockets" + } + } else { + if {![info exists peersubject]} { + set peersubject [lindex $args 0] + } + set requestclientcert 0; # Not valid for client side + set server "" + set type CLIENT + } + + if {[info exists socketcmd]} { + if {$socketcmd eq ""} { + set socketcmd ::socket + } + } else { + set socketcmd $_socket_cmd + } + } onerror {} { + catch {chan close $chan} + rethrow + } + trap { + set so [$socketcmd {*}$socket_args {*}$args] + _init $chan $type $so $credentials $peersubject $requestclientcert [lrange $verifier 0 end] $server + + if {$type eq "CLIENT"} { + if {$async} { + chan event $so writable [list [namespace current]::_so_write_handler $chan] + } else { + _client_blocking_negotiate $chan + if {(![info exists _channels($chan)]) || + [dict get $_channels($chan) State] ne "OPEN"} { + if {[info exists _channels($chan)] && + [dict exists $_channels($chan) ErrorResult]} { + error [dict get $_channels($chan) ErrorResult] + } else { + error "TLS negotiation aborted" + } + } + } + } + } onerror {} { + # If _init did not even go as far initializing _channels($chan), + # close socket ourselves. If it was initialized, the socket + # would have been closed even on error + if {![info exists _channels($chan)]} { + catch {chan close $so} + } + catch {chan close $chan} + # DON'T ACCESS _channels HERE ON + if {[string match "wrong # args*" [trapresult]]} { + badargs! "wrong # args: should be \"tls_socket ?-credentials creds? ?-verifier command? ?-peersubject peer? ?-myaddr addr? ?-myport myport? ?-async? host port\" or \"tls_socket ?-credentials creds? ?-verifier command? -server command ?-myaddr addr? port\"" + } else { + rethrow + } + } + + return $chan +} + +interp alias {} twapi::starttls {} twapi::tls::_starttls +proc twapi::tls::_starttls {so args} { + variable _channels + + debuglog [info level 0] + + trap { + parseargs args { + server + requestclientcert + peersubject.arg + {credentials.arg {}} + {verifier.arg {}} + } -setvars -maxleftover 0 + + if {$server} { + if {[info exists peersubject]} { + badargs! "Option -peersubject cannot be specified with -server." + } + if {[llength $credentials] == 0} { + error "Option -credentials must be specified for server sockets." + } + set peersubject "" + set type SERVER + } else { + set requestclientcert 0; # Ignored for client side + if {![info exists peersubject]} { + # TBD - even if verifier is specified ? + badargs! "Option -peersubject must be specified for client connections." + } + set type CLIENT + } + set chan [chan create {read write} [list [namespace current]]] + } onerror {} { + chan close $so + rethrow + } + trap { + # Get config from the wrapped socket and reset its handlers + # Do not get all options because that results in reverse name + # lookups for -peername and -sockname causing a stall. + foreach opt { + -blocking -buffering -buffersize -encoding -eofchar -translation + } { + lappend so_opts $opt [chan configure $so $opt] + } + + # NOTE: we do NOT save read and write handlers and attach + # them to the new channel because the channel name is different. + # Thus in most cases the callbacks, which often are passed the + # channel name as an arg, would not be valid. It is up + # to the caller to reestablish handlers + # TBD - maybe keep handlers but replace $so with $chan in them ? + chan event $so readable {} + chan event $so writable {} + _init $chan $type $so $credentials $peersubject $requestclientcert [lrange $verifier 0 end] "" + # Copy saved config to wrapper channel + chan configure $chan {*}$so_opts + if {$type eq "CLIENT"} { + if {[dict get $_channels($chan) Blocking]} { + _client_blocking_negotiate $chan + if {(![info exists _channels($chan)]) || + [dict get $_channels($chan) State] ne "OPEN"} { + if {[info exists _channels($chan)] && + [dict exists $_channels($chan) ErrorResult]} { + error [dict get $_channels($chan) ErrorResult] + } else { + error "TLS negotiation aborted" + } + } + } else { + _negotiate $chan + } + } else { + # Note: unlike the tls_socket server case, here we + # do not need to switch a blocking socket to non-blocking + # and then switch back, primarily because the socket + # is already open and there is no need for a callback + # when connection opens. + if {! [dict get $_channels($chan) Blocking]} { + chan configure $so -blocking 0 + chan event $so readable [list [namespace current]::_so_read_handler $chan] + } + _negotiate $chan + } + } onerror {} { + # If _init did not even go as far initializing _channels($chan), + # close socket ourselves. If it was initialized, the socket + # would have been closed even on error + if {![info exists _channels($chan)]} { + catch {chan close $so} + } + catch {chan close $chan} + # DON'T ACCESS _channels HERE ON + if {[string match "wrong # args*" [trapresult]]} { + badargs! "wrong # args: should be \"tls_socket ?-credentials creds? ?-verifier command? ?-peersubject peer? ?-myaddr addr? ?-myport myport? ?-async? host port\" or \"tls_socket ?-credentials creds? ?-verifier command? -server command ?-myaddr addr? port\"" + } else { + rethrow + } + } + + return $chan +} + +interp alias {} twapi::tls_state {} twapi::tls::_state +proc twapi::tls::_state {chan} { + variable _channels + if {![info exists _channels($chan)]} { + twapi::badargs! "Not a valid TLS channel." + } + return [dict get $_channels($chan) State] +} + +interp alias {} twapi::tls_handshake {} twapi::tls::_handshake +proc twapi::tls::_handshake {chan} { + variable _channels + if {![info exists _channels($chan)]} { + twapi::badargs "Not a valid TLS channel." + } + + dict with _channels($chan) {} + + # For a blocking channel, complete the handshake before returning + if {$Blocking} { + switch -exact $State { + NEGOTIATING - CLIENTINIT - SERVERINIT { + _negotiate2 $chan + } + OPEN {} + LISTERNERINIT { + error "Cannot do a TLS handshake on a listening socket." + } + CLOSED - + default { + error "Channel has been closed or in error state." + } + } + } else { + # For non-blocking channels, simply return the state + switch -exact -- $State { + OPEN {} + CLIENTINIT - SERVERINIT - LISTENERINIT - NEGOTIATING { + return 0 + } + CLOSED - default { + error "Channel has been closed or in error state." + } + } + } + return 1 +} + +proc twapi::tls::_accept {listener so raddr raport} { + variable _channels + + debuglog [info level 0] + + trap { + set chan [chan create {read write} [list [namespace current]]] + _init $chan SERVER $so [dict get $_channels($listener) Credentials] "" [dict get $_channels($listener) RequestClientCert] [dict get $_channels($listener) Verifier] [linsert [dict get $_channels($listener) AcceptCallback] end $chan $raddr $raport] + # If we negotiate the connection, the socket is blocking so + # will hang the whole operation. Instead we mark it non-blocking + # and the switch back to blocking when the connection gets opened. + # For accepts to work, the event loop has to be running anyways. + chan configure $so -blocking 0 + chan event $so readable [list [namespace current]::_so_read_handler $chan] + _negotiate $chan + } onerror {} { + catch {_cleanup $chan} + rethrow + } + return +} + +proc twapi::tls::initialize {chan mode} { + debuglog [info level 0] + + # All init is done in chan creation routine after base socket is created + return {initialize finalize watch blocking read write configure cget cgetall} +} + +proc twapi::tls::finalize {chan} { + debuglog [info level 0] + _cleanup $chan + return +} + +proc twapi::tls::blocking {chan mode} { + debuglog [info level 0] + + variable _channels + + dict set _channels($chan) Blocking $mode + + if {![dict exists $_channels($chan) Socket]} { + # We do not currently generate an error because the Tcl socket + # command does not either on a fconfigure when remote has + # closed connection + return + } + set so [dict get $_channels($chan) Socket] + fconfigure $so -blocking $mode + + # There is an issue with Tcl sockets created with -async switching + # from blocking->non-blocking->blocking and writing to the socket + # before connection is fully open. The internal buffers containing + # data that was written before the connection was open do not get + # flushed even if there was an explicit flush call by the application. + # Doing a flush after changing blocking mode seems to fix this + # problem. TBD - check if still the case + flush $so + + # TBD - Should we change handlers BEFORE flushing? + + # The flush may recursively call event handler (possibly) which + # may change state so have to retrieve values from _channels again. + if {![dict exists $_channels($chan) Socket]} { + return + } + set so [dict get $_channels($chan) Socket] + + if {[dict get $_channels($chan) Blocking] == 0} { + # Non-blocking + # Since we need to negotiate TLS we always have socket event + # handlers irrespective of the state of the watch mask + chan event $so readable [list [namespace current]::_so_read_handler $chan] + chan event $so writable [list [namespace current]::_so_write_handler $chan] + } else { + # TBD - is this right? Application may have file event handlers even + # on blocking sockets + chan event $so readable {} + chan event $so writable {} + } + return +} + +proc twapi::tls::watch {chan watchmask} { + debuglog [info level 0] + variable _channels + + dict set _channels($chan) WatchMask $watchmask + + if {"read" in $watchmask} { + # Post a read even if we already have input or if the + # underlying socket has gone away. + # TBD - do we have a mechanism for continuously posting + # events when socket has gone away ? Do we even post once + # when socket is closed (on error for example) + if {[string length [dict get $_channels($chan) Input]] || ![dict exists $_channels($chan) Socket]} { + _post_read_event $chan + } + # Turn read handler back on in case it had been turned off. + chan event [dict get $_channels($chan) Socket] readable [list [namespace current]::_so_read_handler $chan] + } + + if {"write" in [dict get $_channels($chan) WatchMask]} { + if {[dict get $_channels($chan) State] in {OPEN NEGOTIATING CLOSED} } { + _post_write_event $chan + } + # TBD - do we need to turn write handler back on? + } + + return +} + +proc twapi::tls::read {chan nbytes} { + variable _channels + + debuglog [info level 0] + + if {$nbytes == 0} { + return {} + } + + # This is not inside the dict with because _negotiate will update the dict + if {[dict get $_channels($chan) State] in {SERVERINIT CLIENTINIT NEGOTIATING}} { + _negotiate $chan + if {[dict get $_channels($chan) State] in {SERVERINIT CLIENTINIT NEGOTIATING}} { + # If a blocking channel, should have come back with negotiation + # complete. If non-blocking, return EAGAIN to indicate no + # data yet + if {[dict get $_channels($chan) Blocking]} { + error "TLS negotiation failed on blocking channel" + } else { + return -code error EAGAIN + } + } + } + + dict with _channels($chan) { + # Either in OPEN or CLOSED state. For the latter, if an error is + # present, immediately raise it else go on to return any pending data. + if {$State eq "CLOSED" && [info exists ErrorResult]} { + error $ErrorResult + } + # Try to read more bytes if don't have enough AND conn is open + set status ok + if {[string length $Input] < $nbytes && $State eq "OPEN"} { + if {$Blocking} { + # For blocking channels, we do not want to block if some + # bytes are already available. The refchan will call us + # with number of bytes corresponding to its buffer size, + # not what app's read call has asked. It expects us + # to return whatever we have (but at least one byte) + # and block only if nothing is available + while {[string length $Input] == 0 && $status eq "ok"} { + # The channel does not compress so we need to read in + # at least $needed bytes. Because of TLS overhead, we may + # actually need even more + set status ok + set data [_blocking_read $Socket] + if {[string length $data]} { + lassign [sspi_decrypt_stream $SspiContext $data] status plaintext + # Note plaintext might be "" if complete cipher block + # was not received + append Input $plaintext + } else { + set status eof + } + } + } else { + # Non-blocking - read all that we can + set status ok + set data [chan read $Socket] + if {[string length $data]} { + lassign [sspi_decrypt_stream $SspiContext $data] status plaintext + append Input $plaintext + } else { + if {[chan eof $Socket]} { + set status eof + } + } + if {[string length $Input] == 0} { + # Do not have enough data. See if connection closed + # TBD - also handle status == renegotiate + if {$status eq "ok"} { + # Not closed, just waiting for data + return -code error EAGAIN + } + } + } + } + + # TBD - use inline K operator to make this faster? Probably no use + # since Input is also referred to from _channels($chan) + set ret [string range $Input 0 $nbytes-1] + set Input [string range $Input $nbytes end] + if {"read" in [dict get $_channels($chan) WatchMask] && [string length $Input]} { + _post_read_event $chan + } + if {$status ne "ok"} { + # TBD - handle renegotiate + debuglog "read: setting State CLOSED" + + # Need a EOF event even if read event posted. See Bug #203 + _post_eof_event $chan + set State CLOSED + lassign [sspi_shutdown_context $SspiContext] _ outdata + if {[info exists Socket]} { + if {[string length $outdata] && $status ne "eof"} { + puts -nonewline $Socket $outdata + } + catch {close $Socket} + unset Socket + } + } + return $ret; # Note ret may be "" + } +} + +proc twapi::tls::write {chan data} { + variable _channels + + set datalen [string length $data] + debuglog "twapi::tls::write: $chan, $datalen bytes" + + # This is not inside the dict with below because _negotiate will update the dict + if {[dict get $_channels($chan) State] in {SERVERINIT CLIENTINIT NEGOTIATING}} { + _negotiate $chan + if {[dict get $_channels($chan) State] in {SERVERINIT CLIENTINIT NEGOTIATING}} { + if {[dict get $_channels($chan) Blocking]} { + # If a blocking channel, negotiation should have completed + error "TLS negotiation failed on blocking channel" + } else { + # TBD - which of the following alternatives to use? + if {1} { + # Store for later output once connection is open + debuglog "twapi::tls::write conn not open, appending $datalen bytes to pending output" + dict append _channels($chan) Output $data + return $datalen + } else { + # If non-blocking, return EAGAIN to indicate channel + # not open yet. + debuglog "twapi::tls::write returning EAGAIN" + return -code error EAGAIN + } + } + } + } + + dict with _channels($chan) { + debuglog "twapi::tls::write state $State" + switch $State { + CLOSED { + # Just like a Tcl socket, we do not raise an error on a + # write to a closed socket. Simply throw away the data/ + # However, if an error already exists (negotiation fail) + # raise it. + if {[info exists ErrorResult]} { + error $ErrorResult + } + } + OPEN { + if {$WriteDisabled} { + error "Channel closed for output." + } + # There might be pending output if channel has just + # transitioned to OPEN state + _flush_pending_output $chan + # TBD - use sspi_encrypt_and_write instead + chan puts -nonewline $Socket [sspi_encrypt_stream $SspiContext $data] + flush $Socket + } + default { + append Output $data + } + } + } + debuglog "twapi::tls::write returning $datalen" + return $datalen +} + +proc twapi::tls::configure {chan opt val} { + debuglog [info level 0] + # Does not make sense to change creds and verifier after creation + switch $opt { + -context - + -verifier - + -credentials { + error "$opt is a read-only option." + } + default { + chan configure [_chansocket $chan] $opt $val + } + } + + return +} + +proc twapi::tls::cget {chan opt} { + debuglog [info level 0] + variable _channels + + switch $opt { + -credentials { + return [dict get $_channels($chan) Credentials] + } + -verifier { + return [dict get $_channels($chan) Verifier] + } + -context { + return [dict get $_channels($chan) SspiContext] + } + -error { + if {[dict exists $_channels($chan) ErrorResult]} { + set result "[dict get $_channels($chan) ErrorResult]" + if {$result ne ""} { + return $result + } + } + # Get -error from underlying socket + # -error should not raise an error but return the error as result + catch {chan configure [_chansocket $chan] -error} result + return $result + } + default { + return [chan configure [_chansocket $chan] $opt] + } + } +} + +proc twapi::tls::cgetall {chan} { + debuglog [info level 0] + variable _channels + dict with _channels($chan) { + if {[info exists Socket]} { + # First get all options underlying socket supports. Note this may + # or may not a Tcl native socket. + array set so_config [chan configure $Socket] + # Only return options that are not owned by the core channel code + # and apply to the $chan itself. + foreach {opt val} [chan configure $Socket] { + if {$opt ni {-blocking -buffering -buffersize -encoding -eofchar -translation}} { + lappend config $opt $val + } + } + } + lappend config -credentials $Credentials \ + -verifier $Verifier \ + -context $SspiContext + } + return $config +} + +# Implement a half-close command since Tcl does not support it for +# reflected channels. +interp alias {} twapi::tls_close {} twapi::tls::_close +proc twapi::tls::_close {chan {direction ""}} { + + if {$direction in {read r re rea}} { + error "Half close of input side not currently supported for TLS sockets." + } + + # We handle write-side half-closes. Let Tcl close handle everything else. + if {$direction ni {write w wr wri writ}} { + return [close $chan] + } + + # Closing the write side of the channel + + variable _channels + + dict with _channels($chan) {} + if {$State eq "CLOSED"} return + if {$State ne "OPEN"} { + error "Connection not in OPEN state." + } + flush $chan + # Note state may have changed + if {[dict get $_channels($chan) State] ne "OPEN"} { + return + } + # Flush internally buffered, if any. Can happen if we buffered + # data before TLS negotiation was complete. + _flush_pending_output $chan + close $Socket write + dict set _channels($chan) WriteDisabled 1 + return +} + +proc twapi::tls::_chansocket {chan} { + debuglog [info level 0] + variable _channels + if {![info exists _channels($chan)]} { + error "Channel $chan not found." + } + if {![dict exists $_channels($chan) Socket]} { + set error "Socket not connected." + if {[dict exists $_channels($chan) ErrorResult]} { + append error " [dict get $_channels($chan) ErrorResult]" + } + error $error + } + return [dict get $_channels($chan) Socket] +} + +proc twapi::tls::_init {chan type so creds peersubject requestclientcert verifier {accept_callback {}}} { + debuglog [info level 0] + variable _channels + + # TBD - verify that -buffering none is the right thing to do + # as the scripted channel interface takes care of this itself + chan configure $so -translation binary -buffering none + set _channels($chan) [list Socket $so \ + State ${type}INIT \ + Type $type \ + Blocking [chan configure $so -blocking] \ + WatchMask {} \ + WriteDisabled 0 \ + RequestClientCert $requestclientcert \ + Verifier $verifier \ + SspiContext {} \ + PeerSubject $peersubject \ + Input {} Output {}] + + if {[llength $creds]} { + set free_creds 0 + } else { + set creds [sspi_acquire_credentials -package tls -role client -credentials [sspi_schannel_credentials]] + set free_creds 1 + } + dict set _channels($chan) Credentials $creds + dict set _channels($chan) FreeCredentials $free_creds + + # See SF issue #178. Need to supply -usesuppliedcreds to sspi_client_context + # else servers that request (even optionally) client certs might fail since + # we do not currently implement incomplete credentials handling. This + # option will prevent schannel from trying to automatically look up client + # certificates. + dict set _channels($chan) UseSuppliedCreds 0; # TBD - make this use settable option + + if {[string length $accept_callback] && + ($type eq "LISTENER" || $type eq "SERVER")} { + dict set _channels($chan) AcceptCallback $accept_callback + } +} + +proc twapi::tls::_cleanup {chan} { + debuglog [info level 0] + variable _channels + if {[info exists _channels($chan)]} { + # Note _cleanup can be called in inconsistent state so not all + # keys may be set up + dict with _channels($chan) { + if {[info exists SspiContext]} { + if {$State eq "OPEN"} { + lassign [sspi_shutdown_context $SspiContext] _ outdata + if {[string length $outdata] && [info exists Socket]} { + if {[catch {puts -nonewline $Socket $outdata} msg]} { + # TBD - debug log + } + } + } + if {[catch {sspi_delete_context $SspiContext} msg]} { + # TBD - debug log + } + } + if {[info exists Socket]} { + if {[catch {chan close $Socket} msg]} { + # TBD - debug log socket close error + } + } + if {[info exists Credentials] && $FreeCredentials} { + if {[catch {sspi_free_credentials $Credentials} msg]} { + # TBD - debug log + } + } + } + unset _channels($chan) + } +} + +proc twapi::tls::_cleanup_failed_accept {chan} { + debuglog [info level 0] + variable _channels + # This proc is called from the event loop when negotiation fails + # on a server TLS channel that is not yet open (and hence not + # known to the application). For some protection against + # channel name re-use (which does not happen as of 8.6) + # check the state before cleaning up. + if {[info exists _channels($chan)] && + [dict get $_channels($chan) Type] eq "SERVER" && + [dict get $_channels($chan) State] eq "CLOSED"} { + close $chan; # Really close + } +} + +if {[llength [info commands ::twapi::tls_background_error]] == 0} { + proc twapi::tls_background_error {result ropts} { + return -options $ropts $result + } +} + +proc twapi::tls::_negotiate_from_handler {chan} { + # Called from socket read / write handlers if + # negotiation is still in progress. + # Returns the error code from next step of + # negotiation. + # 1 -> ok, + # 0 -> some error occured, most likely negotiation failure + variable _channels + if {[catch {_negotiate $chan} result ropts]} { + if {![dict exists $_channels($chan) ErrorResult]} { + dict set _channels($chan) ErrorResult $result + } + if {"read" in [dict get $_channels($chan) WatchMask]} { + _post_read_event $chan + } + if {"write" in [dict get $_channels($chan) WatchMask]} { + _post_write_event $chan + } + # For SERVER sockets, force error because no other way + # to record some error happened. + if {[dict get $_channels($chan) Type] eq "SERVER"} { + ::twapi::tls_background_error $result $ropts + # Above should raise an error, else do it ourselves + # since stack needs to be rewound + return -options $ropts $result + } + return 0 + } + return 1 +} + +proc twapi::tls::_so_read_handler {chan} { + debuglog [info level 0] + variable _channels + + if {[info exists _channels($chan)]} { + if {[dict get $_channels($chan) State] in {SERVERINIT CLIENTINIT NEGOTIATING}} { + if {![_negotiate_from_handler $chan]} { + return + } + } + + if {"read" in [dict get $_channels($chan) WatchMask]} { + _post_read_event $chan + } else { + # We are not asked to generate read events, turn off the read + # event handler unless we are negotiating + if {[dict get $_channels($chan) State] ni {SERVERINIT CLIENTINIT NEGOTIATING}} { + if {[dict exists $_channels($chan) Socket]} { + chan event [dict get $_channels($chan) Socket] readable {} + } + } + } + } + return +} + +proc twapi::tls::_so_write_handler {chan} { + debuglog [info level 0] + variable _channels + + if {[info exists _channels($chan)]} { + dict with _channels($chan) {} + + # If we are not actually asked to generate write events, + # the only time we want a write handler is on a client -async + # Once it runs, we never want it again else it will keep triggering + # as sockets are always writable + if {"write" ni $WatchMask} { + if {[info exists Socket]} { + chan event $Socket writable {} + } + } + + if {$State in {SERVERINIT CLIENTINIT NEGOTIATING}} { + if {![_negotiate_from_handler $chan]} { + # TBD - should we throw so bgerror gets run? + return + } + } + + # Do not use local var $State because _negotiate might have updated it + if {"write" in $WatchMask && [dict get $_channels($chan) State] eq "OPEN"} { + _post_write_event $chan + } + } + return +} + +proc twapi::tls::_negotiate chan { + debuglog [info level 0] + trap { + _negotiate2 $chan + } onerror {} { + variable _channels + if {[info exists _channels($chan)]} { + if {[dict get $_channels($chan) Type] eq "SERVER" && + [dict get $_channels($chan) State] in {SERVERINIT NEGOTIATING}} { + # There is no one to clean up accepted sockets (server) that + # fail verification (or error out) since application does + # not know about them. So queue some garbage + # cleaning. + after 0 [namespace current]::_cleanup_failed_accept $chan + } + dict set _channels($chan) State CLOSED + dict set _channels($chan) ErrorOptions [trapoptions] + dict set _channels($chan) ErrorResult [trapresult] + if {[dict exists $_channels($chan) Socket]} { + catch {close [dict get $_channels($chan) Socket]} + dict unset _channels($chan) Socket + } + } + rethrow + } +} + +proc twapi::tls::_negotiate2 {chan} { + variable _channels + + dict with _channels($chan) {}; # dict -> local vars + + debuglog [info level 0] + switch $State { + NEGOTIATING { + if {$Blocking && ![info exists AcceptCallback]} { + return [_blocking_negotiate_loop $chan] + } + + set data [chan read $Socket] + if {[string length $data] == 0} { + if {[chan eof $Socket]} { + throw {TWAPI TLS NEGOTIATE EOF} "Unexpected EOF during TLS negotiation (NEGOTIATING)" + } else { + # No data yet, just keep waiting + debuglog "Waiting (chan $chan) for more data on Socket $Socket" + return + } + } else { + lassign [sspi_step $SspiContext $data] status outdata leftover + debuglog "sspi_step returned status $status with [string length $outdata] bytes" + if {[string length $outdata]} { + chan puts -nonewline $Socket $outdata + chan flush $Socket + } + switch $status { + done { + if {[string length $leftover]} { + lassign [sspi_decrypt_stream $SspiContext $leftover] status plaintext + dict append _channels($chan) Input $plaintext + if {$status ne "ok"} { + # TBD - shutdown channel or let _cleanup do it? + } + } + _open $chan + } + continue { + # Keep waiting for next input + } + default { + debuglog "sspi_step returned $status" + error "Unexpected status $status from sspi_step" + } + } + } + } + + CLIENTINIT { + if {$Blocking} { + _client_blocking_negotiate $chan + } else { + dict set _channels($chan) State NEGOTIATING + set SspiContext [sspi_client_context $Credentials -usesuppliedcreds $UseSuppliedCreds -stream 1 -target $PeerSubject -manualvalidation [expr {[llength $Verifier] > 0}]] + dict set _channels($chan) SspiContext $SspiContext + lassign [sspi_step $SspiContext] status outdata + if {[string length $outdata]} { + chan puts -nonewline $Socket $outdata + chan flush $Socket + } + if {$status ne "continue"} { + error "Unexpected status $status from sspi_step" + } + } + } + + SERVERINIT { + # For server sockets created from tls_socket, we + # always take the non-blocking path as we set the socket + # to be non-blocking so as to not hold up the whole app + # For server sockets created with starttls + # (AcceptCallback will not exist), we can do a blocking + # negotiate. + if {$Blocking && ![info exists AcceptCallback]} { + _server_blocking_negotiate $chan + } else { + set data [chan read $Socket] + if {[string length $data] == 0} { + if {[chan eof $Socket]} { + throw {TWAPI TLS NEGOTIATE EOF} "Unexpected EOF during TLS negotiation (SERVERINIT)" + } else { + # No data yet, just keep waiting + debuglog "$chan: no data from socket $Socket. Waiting..." + return + } + } else { + debuglog "Setting $chan State=NEGOTIATING" + + dict set _channels($chan) State NEGOTIATING + set SspiContext [sspi_server_context $Credentials $data -stream 1 -mutualauth $RequestClientCert] + dict set _channels($chan) SspiContext $SspiContext + lassign [sspi_step $SspiContext] status outdata leftover + debuglog "sspi_step returned status $status with [string length $outdata] bytes" + if {[string length $outdata]} { + debuglog "Writing [string length $outdata] bytes to socket $Socket" + chan puts -nonewline $Socket $outdata + chan flush $Socket + } + switch $status { + done { + if {[string length $leftover]} { + lassign [sspi_decrypt_stream $SspiContext $leftover] status plaintext + dict append _channels($chan) Input $plaintext + if {$status ne "ok"} { + # TBD - shut down channel + } + } + debuglog "Marking channel $chan open" + _open $chan + } + continue { + # Keep waiting for next input + } + default { + error "Unexpected status $status from sspi_step" + } + } + } + } + } + + default { + error "Internal error: _negotiate called in state [dict get $_channels($chan) State]" + } + } + + return +} + +proc twapi::tls::_client_blocking_negotiate {chan} { + debuglog [info level 0] + variable _channels + dict with _channels($chan) { + set State NEGOTIATING + set SspiContext [sspi_client_context $Credentials -usesuppliedcreds $UseSuppliedCreds -stream 1 -target $PeerSubject -manualvalidation [expr {[llength $Verifier] > 0}]] + } + return [_blocking_negotiate_loop $chan] +} + +proc twapi::tls::_server_blocking_negotiate {chan} { + debuglog [info level 0] + variable _channels + dict set _channels($chan) State NEGOTIATING + set so [dict get $_channels($chan) Socket] + set indata [_blocking_read $so] + if {[chan eof $so]} { + throw {TWAPI TLS NEGOTIATE EOF} "Unexpected EOF during TLS negotiation (server)." + } + dict set _channels($chan) SspiContext [sspi_server_context [dict get $_channels($chan) Credentials] $indata -stream 1 -mutualauth [dict get $_channels($chan) RequestClientCert]] + return [_blocking_negotiate_loop $chan] +} + +proc twapi::tls::_blocking_negotiate_loop {chan} { + debuglog [info level 0] + variable _channels + + dict with _channels($chan) {}; # dict -> local vars + + lassign [sspi_step $SspiContext] status outdata + debuglog "sspi_step status $status" + # Keep looping as long as the SSPI state machine tells us to + while {$status eq "continue"} { + # If the previous step had any output, send it out + if {[string length $outdata]} { + debuglog "Writing [string length $outdata] to socket $Socket" + chan puts -nonewline $Socket $outdata + chan flush $Socket + } + + set indata [_blocking_read $Socket] + debuglog "Read [string length $indata] from socket $Socket" + if {[chan eof $Socket]} { + throw {TWAPI TLS NEGOTIATE EOF} "Unexpected EOF during TLS negotiation." + } + trap { + lassign [sspi_step $SspiContext $indata] status outdata leftover + } onerror {} { + debuglog "sspi_step returned error: [trapresult]" + close $Socket + unset Socket + rethrow + } + debuglog "sspi_step status $status" + } + + # Send output irrespective of status + if {[string length $outdata]} { + chan puts -nonewline $Socket $outdata + chan flush $Socket + } + + if {$status eq "done"} { + if {[string length $leftover]} { + lassign [sspi_decrypt_stream $SspiContext $leftover] status plaintext + dict append _channels($chan) Input $plaintext + if {$status ne "ok"} { + error "Error status $status decrypting data" + } + } + _open $chan + } else { + # Should not happen. Negotiation failures will raise an error, + # not return a value + error "TLS negotiation failed: status $status." + } + + return +} + +proc twapi::tls::_blocking_read {so} { + debuglog [info level 0] + # Read from a blocking socket. We do not know how much data is needed + # so read a single byte and then read any pending + set input [chan read $so 1] + if {[string length $input]} { + set more [chan pending input $so] + if {$more > 0} { + append input [chan read $so $more] + } + } + return $input +} + +proc twapi::tls::_flush_pending_output {chan} { + variable _channels + + dict with _channels($chan) { + if {[string length $Output]} { + debuglog "_flush_pending_output: flushing output" + puts -nonewline $Socket [sspi_encrypt_stream $SspiContext $Output] + set Output "" + } + } + return +} + +# Transitions connection to OPEN or throws error if verifier returns false +# or fails +proc twapi::tls::_open {chan} { + debuglog [info level 0] + variable _channels + + dict with _channels($chan) {}; # dict -> local vars + + if {[llength $Verifier] == 0} { + # No verifier specified. In this case, we would not have specified + # -manualvalidation in creating the context and the system would + # have done the verification already for client. For servers, + # there is no verification of clients to be done by default + + # For compatibility with TLS we call accept callbacks AFTER verification + dict set _channels($chan) State OPEN + if {[info exists AcceptCallback]} { + # Server sockets are set up to be non-blocking during negotiation + # Change them back to original state before notifying app + chan configure $Socket -blocking [dict get $_channels($chan) Blocking] + chan event $Socket readable {} + after 0 $AcceptCallback + } + # If there is any pending output waiting for the connection to + # open, write it out + _flush_pending_output $chan + + return + } + + # TBD - what if verifier closes the channel + if {[{*}$Verifier $chan $SspiContext]} { + dict set _channels($chan) State OPEN + # For compatibility with TLS we call accept callbacks AFTER verification + if {[info exists AcceptCallback]} { + # Server sockets are set up to be non-blocking during + # negotiation. Change them back to original state + # before notifying app + chan configure $Socket -blocking [dict get $_channels($chan) Blocking] + chan event $Socket readable {} + after 0 $AcceptCallback + } + _flush_pending_output $chan + return + } else { + error "SSL/TLS negotiation failed. Verifier callback returned false." "" [list TWAPI TLS VERIFYFAIL] + } +} + +# Calling [chan postevent] results in filevent handlers being called right +# away which can recursively call back into channel code making things +# more than a bit messy. So we always schedule them through the event loop +proc twapi::tls::_post_read_event_callback {chan} { + debuglog [info level 0] + variable _channels + if {[info exists _channels($chan)]} { + dict unset _channels($chan) ReadEventPosted + if {"read" in [dict get $_channels($chan) WatchMask]} { + chan postevent $chan read + } + } +} +proc twapi::tls::_post_read_event {chan} { + debuglog [info level 0] + variable _channels + if {![dict exists $_channels($chan) ReadEventPosted]} { + # Note after 0 after idle does not work - (never get called) + # not sure why so just do after 0 + dict set _channels($chan) ReadEventPosted \ + [after 0 [namespace current]::_post_read_event_callback $chan] + } +} +proc twapi::tls::_post_eof_event_callback {chan} { + debuglog [info level 0] + variable _channels + if {[info exists _channels($chan)]} { + if {"read" in [dict get $_channels($chan) WatchMask]} { + chan postevent $chan read + } + } +} +proc twapi::tls::_post_eof_event {chan} { + # EOF events are always generated event if a read event is already posted. + # See Bug #203 + debuglog [info level 0] + after 0 [namespace current]::_post_eof_event_callback $chan +} + + +proc twapi::tls::_post_write_event_callback {chan} { + debuglog [info level 0] + variable _channels + if {[info exists _channels($chan)]} { + dict unset _channels($chan) WriteEventPosted + if {"write" in [dict get $_channels($chan) WatchMask]} { + # NOTE: we do not check state here as we should generate an event + # even in the CLOSED state - see Bug #206 + chan postevent $chan write + } + } +} +proc twapi::tls::_post_write_event {chan} { + debuglog [info level 0] + variable _channels + if {![dict exists $_channels($chan) WriteEventPosted]} { + # Note after 0 after idle does not work - (never get called) + # not sure why so just do after 0 + dict set _channels($chan) WriteEventPosted \ + [after 0 [namespace current]::_post_write_event_callback $chan] + } +} + +namespace eval twapi::tls { + namespace ensemble create -subcommands { + initialize finalize blocking watch read write configure cget cgetall + } +} + +proc twapi::tls::sample_server_creds pfxFile { + set fd [open $pfxFile rb] + set pfx [read $fd] + close $fd + # Set up the store containing the certificates + set certStore [twapi::cert_temporary_store -pfx $pfx] + # Set up the client and server credentials + set serverCert [twapi::cert_store_find_certificate $certStore subject_substring twapitestserver] + # TBD - check if certs can be released as soon as we obtain credentials + set creds [twapi::sspi_acquire_credentials -credentials [twapi::sspi_schannel_credentials -certificates [list $serverCert]] -package unisp -role server] + twapi::cert_release $serverCert + twapi::cert_store_release $certStore + return $creds +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/twapi.tcl b/src/punk86.vfs/lib/twapi4.7.2/twapi.tcl new file mode 100644 index 00000000..20a5f179 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/twapi.tcl @@ -0,0 +1,858 @@ +# +# Copyright (c) 2003-2018, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# General definitions and procs used by all TWAPI modules + +package require Tcl 8.5 +package require registry + +namespace eval twapi { + # Get rid of this ugliness - TBD + # Note this is different from NULL or {0 VOID} etc. It is more like + # a null token passed to functions that expect ptr to strings and + # allow the ptr to be NULL. + variable nullptr "__null__" + + variable scriptdir [file dirname [info script]] + + # Name of the var holding log messages in reflected in the C + # code, don't change it! + variable log_messages {} + + ################################################################ + # Following procs are used early in init process so defined here + + # Throws a bad argument error that appears to come from caller's invocation + # (if default level is 2) + proc badargs! {msg {level 2}} { + return -level $level -code error -errorcode [list TWAPI BADARGS $msg] $msg + } + + proc lambda {arglist body {ns {}}} { + return [list ::apply [list $arglist $body $ns]] + } + + # Similar to lambda but takes additional parameters to be passed + # to the anonymous functin + proc lambda* {arglist body {ns {}} args} { + return [list ::apply [list $arglist $body $ns] {*}$args] + } + + # Rethrow original exception from inside a trap + proc rethrow {} { + return -code error -level 0 -options [twapi::trapoptions] [twapi::trapresult] + } + + # Dict lookup, returns default (from args) if not in dict and + # key itself if no defaults specified + proc dict* {d key args} { + if {[dict exists $d $key]} { + return [dict get $d $key] + } elseif {[llength $args]} { + return [lindex $args 0] + } else { + return $key + } + } + + proc dict! {d key {frame 0}} { + if {[dict exists $d $key]} { + return [dict get $d $key] + } else { + # frame is how must above the caller errorInfo must appear + return [badargs! "Bad value \"$key\". Must be one of [join [dict keys $d] {, }]" [incr frame 2]] + } + } + + + # Defines a proc with some initialization code + proc proc* {procname arglist initcode body} { + if {![string match ::* $procname]} { + set ns [uplevel 1 {namespace current}] + set procname ${ns}::$procname + } + set proc_def [format {proc %s {%s} {%s ; proc %s {%s} {%s} ; uplevel 1 [list %s] [lrange [info level 0] 1 end]}} $procname $arglist $initcode $procname $arglist $body $procname] + uplevel 1 $proc_def + } + + # Swap keys and values + proc swapl {l} { + set swapped {} + foreach {a b} $l { + lappend swapped $b $a + } + return $swapped + } + + # TBD - see if C would make faster + # Returns a list consisting of n'th index within each sublist element + # Should we allow n to be a nested index ? C impl may be harder + proc lpick {l {n 0}} { + set result {} + foreach e $l { + lappend result [lindex $e $n] + } + return $result + } + + # Simple helper to treat lists as a stack + proc lpop {vl} { + upvar 1 $vl l + set top [lindex $l end] + # K combinator trick to reset l to allow lreplace to work in place + set l [lreplace $l [set l end] end] + return $top + } + + # twine list of n items + proc ntwine {fields l} { + set ntwine {} + foreach e $l { + lappend ntwine [twine $fields $e] + } + return $ntwine + } + + # Qualifies a name in context of caller's caller + proc callerns {name} { + if {[string match "::*" $name]} { + return $name + } + if {[info level] > 2} { + return [uplevel 2 namespace current]::$name + } else { + return ::$name + } + } +} + +# Make twapi versions the same as the base module versions +set twapi::version(twapi) $::twapi::version(twapi_base) + +# +# log for tracing / debug messages. +proc twapi::debuglog_clear {} { + variable log_messages + set log_messages {} +} + +proc twapi::debuglog_enable {} { + catch {rename [namespace current]::debuglog {}} + interp alias {} [namespace current]::debuglog {} [namespace current]::Twapi_AppendLog +} + +proc twapi::debuglog_disable {} { + proc [namespace current]::debuglog {args} {} +} + +proc twapi::debuglog_get {} { + variable log_messages + return $log_messages +} + +# Logging disabled by default +twapi::debuglog_disable + +proc twapi::get_build_config {{key ""}} { + variable build_ids + array set config [GetTwapiBuildInfo] + + # This is actually a runtime config and might not have been initialized + if {[info exists ::twapi::use_tcloo_for_com]} { + if {$::twapi::use_tcloo_for_com} { + set config(comobj_ootype) tcloo + } else { + set config(comobj_ootype) metoo + } + } else { + set config(comobj_ootype) uninitialized + } + + if {$key eq ""} { + return [array get config] + } else { + if {![info exists config($key)]} { + error "key not known"; # Matches tcl::pkgconfig error message + } + return $config($key) + } +} + +# This matches the pkgconfig command as defined by Tcl_RegisterConfig +# TBD - Doc and test +proc twapi::pkgconfig {subcommand {arg {}}} { + if {$subcommand eq "list"} { + if {$arg ne ""} { + error {wrong # args: should be "twapi::pkgconfig list"} + } + return [dict keys [get_build_config]] + } elseif {$subcommand eq "get"} { + if {$arg eq ""} { + error {wrong # args: should be "twapi::pkgconfig get key"} + } + return [get_build_config $arg] + } else { + error {wrong # args: should be "tcl::pkgconfig subcommand ?arg?"} + } +} + +# TBD - document +proc twapi::support_report {} { + set report "Operating system: [get_os_description]\n" + append report "Processors: [get_processor_count]\n" + append report "WOW64: [wow64_process]\n" + append report "Virtualized: [virtualized_process]\n" + append report "System locale: [get_system_default_lcid], [get_system_default_langid]\n" + append report "User locale: [get_user_default_lcid], [get_user_default_langid]\n" + append report "Tcl version: [info patchlevel]\n" + append report "tcl_platform:\n" + foreach k [lsort -dictionary [array names ::tcl_platform]] { + append report " $k = $::tcl_platform($k)\n" + } + append report "TWAPI version: [get_version -patchlevel]\n" + array set a [get_build_config] + append report "TWAPI config:\n" + foreach k [lsort -dictionary [array names a]] { + append report " $k = $a($k)\n" + } + append report "\nDebug log:\n[join [debuglog_get] \n]\n" +} + + +# Returns a list of raw Windows API functions supported +proc twapi::list_raw_api {} { + set rawapi [list ] + foreach fn [info commands ::twapi::*] { + if {[regexp {^::twapi::([A-Z][^_]*)$} $fn ignore fn]} { + lappend rawapi $fn + } + } + return $rawapi +} + + +# Wait for $wait_ms milliseconds or until $script returns $guard. $gap_ms is +# time between retries to call $script +# TBD - write a version that will allow other events to be processed +proc twapi::wait {script guard wait_ms {gap_ms 10}} { + if {$gap_ms == 0} { + set gap_ms 10 + } + set end_ms [expr {[clock clicks -milliseconds] + $wait_ms}] + while {[clock clicks -milliseconds] < $end_ms} { + set script_result [uplevel $script] + if {[string equal $script_result $guard]} { + return 1 + } + after $gap_ms + } + # Reached limit, one last try + return [string equal [uplevel $script] $guard] +} + +# Get twapi version +proc twapi::get_version {args} { + variable version + array set opts [parseargs args {patchlevel}] + if {$opts(patchlevel)} { + return $version(twapi) + } else { + # Only return major, minor + set ver $version(twapi) + regexp {^([[:digit:]]+\.[[:digit:]]+)[.ab]} $version(twapi) - ver + return $ver + } +} + +# Set all elements of the array to specified value +proc twapi::_array_set_all {v_arr val} { + upvar $v_arr arr + foreach e [array names arr] { + set arr($e) $val + } +} + +# Check if any of the specified array elements are non-0 +proc twapi::_array_non_zero_entry {v_arr indices} { + upvar $v_arr arr + foreach i $indices { + if {$arr($i)} { + return 1 + } + } + return 0 +} + +# Check if any of the specified array elements are non-0 +# and return them as a list of options (preceded with -) +proc twapi::_array_non_zero_switches {v_arr indices all} { + upvar $v_arr arr + set result [list ] + foreach i $indices { + if {$all || ([info exists arr($i)] && $arr($i))} { + lappend result -$i + } + } + return $result +} + + +# Bitmask operations on 32bit values +# The int() casts are to deal with hex-decimal sign extension issues +proc twapi::setbits {v_bits mask} { + upvar $v_bits bits + set bits [expr {int($bits) | int($mask)}] + return $bits +} +proc twapi::resetbits {v_bits mask} { + upvar $v_bits bits + set bits [expr {int($bits) & int(~ $mask)}] + return $bits +} + +# Return a bitmask corresponding to a list of symbolic and integer values +# If symvals is a single item, it is an array else a list of sym bitmask pairs +proc twapi::_parse_symbolic_bitmask {syms symvals} { + if {[llength $symvals] == 1} { + upvar $symvals lookup + } else { + array set lookup $symvals + } + set bits 0 + foreach sym $syms { + if {[info exists lookup($sym)]} { + set bits [expr {$bits | $lookup($sym)}] + } else { + set bits [expr {$bits | $sym}] + } + } + return $bits +} + +# Return a list of symbols corresponding to a bitmask +proc twapi::_make_symbolic_bitmask {bits symvals {append_unknown 1}} { + if {[llength $symvals] == 1} { + upvar $symvals lookup + set map [array get lookup] + } else { + set map $symvals + } + set symbits 0 + set symmask [list ] + foreach {sym val} $map { + if {$bits & $val} { + set symbits [expr {$symbits | $val}] + lappend symmask $sym + } + } + + # Get rid of bits that mapped to symbols + set bits [expr {$bits & ~$symbits}] + # If any left over, add them + if {$bits && $append_unknown} { + lappend symmask $bits + } + return $symmask +} + +# Return a bitmask corresponding to a list of symbolic and integer values +# If symvals is a single item, it is an array else a list of sym bitmask pairs +# Ditto for switches - an array or flat list of switch boolean pairs +proc twapi::_switches_to_bitmask {switches symvals {bits 0}} { + if {[llength $symvals] == 1} { + upvar $symvals lookup + } else { + array set lookup $symvals + } + if {[llength $switches] == 1} { + upvar $switches swtable + } else { + array set swtable $switches + } + + foreach {switch bool} [array get swtable] { + if {$bool} { + set bits [expr {$bits | $lookup($switch)}] + } else { + set bits [expr {$bits & ~ $lookup($switch)}] + } + } + return $bits +} + +# Return a list of switche bool pairs corresponding to a bitmask +proc twapi::_bitmask_to_switches {bits symvals} { + if {[llength $symvals] == 1} { + upvar $symvals lookup + set map [array get lookup] + } else { + set map $symvals + } + set symbits 0 + set symmask [list ] + foreach {sym val} $map { + if {$bits & $val} { + set symbits [expr {$symbits | $val}] + lappend symmask $sym 1 + } else { + lappend symmask $sym 0 + } + } + + return $symmask +} + +# Make and return a keyed list +proc twapi::kl_create {args} { + if {[llength $args] & 1} { + error "No value specified for keyed list field [lindex $args end]. A keyed list must have an even number of elements." + } + return $args +} + +# Make a keyed list given fields and values +interp alias {} twapi::kl_create2 {} twapi::twine + +# Set a key value +proc twapi::kl_set {kl field newval} { + set i 0 + foreach {fld val} $kl { + if {[string equal $fld $field]} { + incr i + return [lreplace $kl $i $i $newval] + } + incr i 2 + } + lappend kl $field $newval + return $kl +} + +# Check if a field exists in the keyed list +proc twapi::kl_vget {kl field varname} { + upvar $varname var + return [expr {! [catch {set var [kl_get $kl $field]}]}] +} + +# Remote/unset a key value +proc twapi::kl_unset {kl field} { + array set arr $kl + unset -nocomplain arr($field) + return [array get arr] +} + +# Compare two keyed lists +proc twapi::kl_equal {kl_a kl_b} { + array set a $kl_a + foreach {kb valb} $kl_b { + if {[info exists a($kb)] && ($a($kb) == $valb)} { + unset a($kb) + } else { + return 0 + } + } + if {[array size a]} { + return 0 + } else { + return 1 + } +} + +# Return the field names in a keyed list in the same order that they +# occured +proc twapi::kl_fields {kl} { + set fields [list ] + foreach {fld val} $kl { + lappend fields $fld + } + return $fields +} + +# Returns a flat list of the $field fields from a list +# of keyed lists +proc twapi::kl_flatten {list_of_kl args} { + set result {} + foreach kl $list_of_kl { + foreach field $args { + lappend result [kl_get $kl $field] + } + } + return $result +} + + +# Return an array as a list of -index value pairs +proc twapi::_get_array_as_options {v_arr} { + upvar $v_arr arr + set result [list ] + foreach {index value} [array get arr] { + lappend result -$index $value + } + return $result +} + +# Parse a list of two integers or a x,y pair and return a list of two integers +# Generate exception on format error using msg +proc twapi::_parse_integer_pair {pair {msg "Invalid integer pair"}} { + if {[llength $pair] == 2} { + lassign $pair first second + if {[string is integer -strict $first] && + [string is integer -strict $second]} { + return [list $first $second] + } + } elseif {[regexp {^([[:digit:]]+),([[:digit:]]+)$} $pair dummy first second]} { + return [list $first $second] + } + + error "$msg: '$pair'. Should be a list of two integers or in the form 'x,y'" +} + + +# Convert file names by substituting \SystemRoot and \??\ sequences +proc twapi::_normalize_path {path} { + # Get rid of \??\ prefixes + regsub {^[\\/]\?\?[\\/](.*)} $path {\1} path + + # Replace leading \SystemRoot with real system root + if {[string match -nocase {[\\/]Systemroot*} $path] && + ([string index $path 11] in [list "" / \\])} { + return [file join [twapi::GetSystemWindowsDirectory] [string range $path 12 end]] + } else { + return [file normalize $path] + } +} + + +# Convert seconds to a list {Year Month Day Hour Min Sec Ms} +# (Ms will always be zero). +proc twapi::_seconds_to_timelist {secs {gmt 0}} { + # For each field, we need to trim the leading zeroes + set result [list ] + foreach x [clock format $secs -format "%Y %m %e %k %M %S 0" -gmt $gmt] { + lappend result [scan $x %d] + } + return $result +} + +# Convert local time list {Year Month Day Hour Min Sec Ms} to seconds +# (Ms field is ignored) +# TBD - fix this gmt issue - not clear whether caller expects gmt time +proc twapi::_timelist_to_seconds {timelist} { + return [clock scan [_timelist_to_timestring $timelist] -gmt false] +} + +# Convert local time list {Year Month Day Hour Min Sec Ms} to a time string +# (Ms field is ignored) +proc twapi::_timelist_to_timestring {timelist} { + if {[llength $timelist] < 6} { + error "Invalid time list format" + } + + return "[lindex $timelist 0]-[lindex $timelist 1]-[lindex $timelist 2] [lindex $timelist 3]:[lindex $timelist 4]:[lindex $timelist 5]" +} + +# Convert a time string to a time list +proc twapi::_timestring_to_timelist {timestring} { + return [_seconds_to_timelist [clock scan $timestring -gmt false]] +} + +# Parse raw memory like binary scan command +proc twapi::mem_binary_scan {mem off mem_sz args} { + uplevel [list binary scan [Twapi_ReadMemory 1 $mem $off $mem_sz]] $args +} + + +# Validate guid syntax +proc twapi::_validate_guid {guid} { + if {![Twapi_IsValidGUID $guid]} { + error "Invalid GUID syntax: '$guid'" + } +} + +# Validate uuid syntax +proc twapi::_validate_uuid {uuid} { + if {![regexp {^[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}$} $uuid]} { + error "Invalid UUID syntax: '$uuid'" + } +} + +# Extract a UCS-16 string from a binary. Cannot directly use +# encoding convertfrom because that will not stop at the terminating +# null. The UCS-16 assumed to be little endian. +proc twapi::_ucs16_binary_to_string {bin {off 0}} { + set bin [string range $bin $off end] + + # Find the terminating null. + set off [string first \0\0 $bin] + while {$off > 0 && ($off & 1)} { + # Offset off is odd and so crosses a char boundary, so not the + # terminating null. Step to the char boundary and start search again + incr off + set off [string first \0\0 $bin $off] + } + # off is offset of terminating UCS-16 null, or -1 if not found + if {$off < 0} { + # No terminator + return [encoding convertfrom unicode $bin] + } else { + return [encoding convertfrom unicode [string range $bin 0 $off-1]] + } +} + +# Extract a string from a binary. Cannot directly use +# encoding convertfrom because that will not stop at the terminating +# null. +proc twapi::_ascii_binary_to_string {bin {off 0}} { + set bin [string range $bin $off end] + + # Find the terminating null. + set off [string first \0 $bin] + + # off is offset of terminating null, or -1 if not found + if {$off < 0} { + # No terminator + return [encoding convertfrom ascii $bin] + } else { + return [encoding convertfrom ascii [string range $bin 0 $off-1]] + } +} + + +# Given a binary, return a GUID. The formatting is done as per the +# Windows StringFromGUID2 convention used by COM +proc twapi::_binary_to_guid {bin {off 0}} { + if {[binary scan $bin "@$off i s s H4 H12" g1 g2 g3 g4 g5] != 5} { + error "Invalid GUID binary" + } + + return [format "{%8.8X-%2.2hX-%2.2hX-%s}" $g1 $g2 $g3 [string toupper "$g4-$g5"]] +} + +# Given a guid string, return a GUID in binary form +proc twapi::_guid_to_binary {guid} { + _validate_guid $guid + lassign [split [string range $guid 1 end-1] -] g1 g2 g3 g4 g5 + return [binary format "i s s H4 H12" 0x$g1 0x$g2 0x$g3 $g4 $g5] +} + +# Return a guid from raw memory +proc twapi::_decode_mem_guid {mem {off 0}} { + return [_binary_to_guid [Twapi_ReadMemory 1 $mem $off 16]] +} + +# Convert a Windows registry value to Tcl form. mem is a raw +# memory object. off is the offset into the memory object to read. +# $type is a integer corresponding +# to the registry types +proc twapi::_decode_mem_registry_value {type mem len {off 0}} { + set type [expr {$type}]; # Convert hex etc. to decimal form + switch -exact -- $type { + 1 - + 2 { + return [list [expr {$type == 2 ? "expand_sz" : "sz"}] \ + [Twapi_ReadMemory 3 $mem $off $len 1]] + } + 7 { + # Collect strings until we come across an empty string + # Note two nulls right at the start will result in + # an empty list. Should it result in a list with + # one empty string element? Most code on the web treats + # it as the former so we do too. + set multi [list ] + while {1} { + set str [Twapi_ReadMemory 3 $mem $off -1] + set n [string length $str] + # Check for out of bounds. Cannot check for this before + # actually reading the string since we do not know size + # of the string. + if {($len != -1) && ($off+$n+1) > $len} { + error "Possible memory corruption: read memory beyond specified memory size." + } + if {$n == 0} { + return [list multi_sz $multi] + } + lappend multi $str + # Move offset by length of the string and terminating null + # (times 2 since unicode and we want byte offset) + incr off [expr {2*($n+1)}] + } + } + 4 { + if {$len < 4} { + error "Insufficient number of bytes to convert to integer." + } + return [list dword [Twapi_ReadMemory 0 $mem $off]] + } + 5 { + if {$len < 4} { + error "Insufficient number of bytes to convert to big-endian integer." + } + set type "dword_big_endian" + set scanfmt "I" + set len 4 + } + 11 { + if {$len < 8} { + error "Insufficient number of bytes to convert to wide integer." + } + set type "qword" + set scanfmt "w" + set len 8 + } + 0 { set type "none" } + 6 { set type "link" } + 8 { set type "resource_list" } + 3 { set type "binary" } + default { + error "Unsupported registry value type '$type'" + } + } + + set val [Twapi_ReadMemory 1 $mem $off $len] + if {[info exists scanfmt]} { + if {[binary scan $val $scanfmt val] != 1} { + error "Could not convert from binary value using scan format $scanfmt" + } + } + + return [list $type $val] +} + + +proc twapi::_log_timestamp {} { + return [clock format [clock seconds] -format "%a %T"] +} + + +# Helper for Net*Enum type functions taking a common set of arguments +proc twapi::_net_enum_helper {function args} { + if {[llength $args] == 1} { + set args [lindex $args 0] + } + + # -namelevel is used internally to indicate what level is to be used + # to retrieve names. -preargs and -postargs are used internally to + # add additional arguments at specific positions in the generic call. + array set opts [parseargs args { + {system.arg ""} + level.int + resume.int + filter.int + {namelevel.int 0} + {preargs.arg {}} + {postargs.arg {}} + {namefield.int 0} + fields.arg + } -maxleftover 0] + + if {[info exists opts(level)]} { + set level $opts(level) + if {! [info exists opts(fields)]} { + badargs! "Option -fields must be specified if -level is specified" + } + } else { + set level $opts(namelevel) + } + + # Note later we need to know if opts(resume) was specified so + # don't change this to just default -resume to 0 above + if {[info exists opts(resume)]} { + set resumehandle $opts(resume) + } else { + set resumehandle 0 + } + + set moredata 1 + set result {} + while {$moredata} { + if {[info exists opts(filter)]} { + lassign [$function $opts(system) {*}$opts(preargs) $level $opts(filter) {*}$opts(postargs) $resumehandle] moredata resumehandle totalentries entries + } else { + lassign [$function $opts(system) {*}$opts(preargs) $level {*}$opts(postargs) $resumehandle] moredata resumehandle totalentries entries + } + # If caller does not want all data in one lump stop here + if {[info exists opts(resume)]} { + if {[info exists opts(level)]} { + return [list $moredata $resumehandle $totalentries [list $opts(fields) $entries]] + } else { + # Return flat list of names + return [list $moredata $resumehandle $totalentries [lpick $entries $opts(namefield)]] + } + } + + lappend result {*}$entries + } + + # Return what we have. Format depend on caller options. + if {[info exists opts(level)]} { + return [list $opts(fields) $result] + } else { + return [lpick $result $opts(namefield)] + } +} + +# If we are not being sourced from a executable resource, need to +# source the remaining support files. In the former case, they are +# automatically combined into one so the sourcing is not needed. +if {![info exists twapi::twapi_base_rc_sourced]} { + apply {{filelist} { + set dir [file dirname [info script]] + foreach f $filelist { + uplevel #0 [list source [file join $dir $f]] + } + }} {base.tcl handle.tcl win.tcl adsi.tcl} +} + +# Used in various matcher callbacks to signify always include etc. +# TBD - document +proc twapi::true {args} { + return true +} + + +namespace eval twapi { + # Get a handle to ourselves. This handle never need be closed + variable my_process_handle [GetCurrentProcess] +} + +# Only used internally for test validation. +# NOT the same as export_public_commands +proc twapi::_get_public_commands {} { + variable exports; # Populated via pkgIndex.tcl + if {[info exists exports]} { + return [concat {*}[dict values $exports]] + } else { + set cmds {} + foreach cmd [lsearch -regexp -inline -all [info commands [namespace current]::*] {::twapi::[a-z].*}] { + lappend cmds [namespace tail $cmd] + } + return $cmds + } +} + +proc twapi::export_public_commands {} { + variable exports; # Populated via pkgIndex.tcl + if {[info exists exports]} { + # Only export commands under twapi (e.g. not metoo) + dict for {ns cmds} $exports { + if {[regexp {^::twapi($|::)} $ns]} { + uplevel #0 [list namespace eval $ns [list namespace export {*}$cmds] +] + } + } + } else { + set cmds {} + foreach cmd [lsearch -regexp -inline -all [info commands [namespace current]::*] {::twapi::[a-z].*}] { + lappend cmds [namespace tail $cmd] + } + namespace eval [namespace current] "namespace export {*}$cmds" + } +} + +proc twapi::import_commands {} { + export_public_commands + uplevel namespace import twapi::* +} + diff --git a/src/punk86.vfs/lib/twapi4.7.2/twapi472.dll b/src/punk86.vfs/lib/twapi4.7.2/twapi472.dll new file mode 100644 index 0000000000000000000000000000000000000000..92ed64ddb386725f5556e7e49610529c6dfc4f48 GIT binary patch literal 610816 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 XG;j)9R%5tX*L1yEpK%kO?0^3k`5OS> literal 0 HcmV?d00001 diff --git a/src/punk86.vfs/lib/twapi4.7.2/twapi_entry.tcl b/src/punk86.vfs/lib/twapi4.7.2/twapi_entry.tcl new file mode 100644 index 00000000..a30dc5eb --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/twapi_entry.tcl @@ -0,0 +1,11 @@ +# -*- tcl -*- +namespace eval twapi { + variable version + set version(twapi) 4.7.2 + variable patchlevel 4.7.2 + variable package_name twapi + variable dll_base_name twapi[string map {. {}} 4.7.2] + variable scriptdir [file dirname [info script]] +} + +source [file join $twapi::scriptdir twapi.tcl] diff --git a/src/punk86.vfs/lib/twapi4.7.2/ui.tcl b/src/punk86.vfs/lib/twapi4.7.2/ui.tcl new file mode 100644 index 00000000..bfced989 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/ui.tcl @@ -0,0 +1,1430 @@ +# +# Copyright (c) 2003-2012 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# TBD - define a C function and way to implement window callback so +# that SetWindowLong(GWL_WNDPROC) can be implemente +# + + +# TBD - document the following class names +# SciCalc CALC.EXE +# CalWndMain CALENDAR.EXE +# Cardfile CARDFILE.EXE +# Clipboard CLIPBOARD.EXE +# Clock CLOCK.EXE +# CtlPanelClass CONTROL.EXE +# XLMain EXCEL.EXE +# Session MS-DOS.EXE +# Notepad NOTEPAD.EXE +# pbParent PBRUSH.EXE +# Pif PIFEDIT.EXE +# PrintManager PRINTMAN.EXE +# Progman PROGMAN.EXE (Windows Program Manager) +# Recorder RECORDER.EXE +# Reversi REVERSI.EXE +# #32770 SETUP.EXE +# Solitaire SOL.EXE +# Terminal TERMINAL.EXE +# WFS_Frame WINFILE.EXE +# MW_WINHELP WINHELP.EXE +# #32770 WINVER.EXE +# OpusApp WINWORD.EXE +# MSWRITE_MENU WRITE.EXE +# OMain Microsoft Access +# XLMAIN Microsoft Excel +# rctrl_renwnd32 Microsoft Outlook +# PP97FrameClass Microsoft PowerPoint +# OpusApp Microsoft Word + +namespace eval twapi { + struct POINT {LONG x; LONG y;} + struct RECT { LONG left; LONG top; LONG right; LONG bottom; } + struct WINDOWPLACEMENT { + UINT cbSize; + UINT flags; + UINT showCmd; + struct POINT ptMinPosition; + struct POINT ptMaxPosition; + struct RECT rcNormalPosition; + } +} + +proc twapi::get_window_placement {hwin} { + GetWindowPlacement $hwin [WINDOWPLACEMENT] +} + +# Set the focus to the given window +proc twapi::set_focus {hwin} { + return [_return_window [_attach_hwin_and_eval $hwin {SetFocus $hwin}]] +} + +# Enumerate toplevel windows +proc twapi::get_toplevel_windows {args} { + + array set opts [parseargs args { + {pid.arg} + {pids.arg} + }] + + set toplevels [twapi::EnumWindows] + + if {[info exists opts(pids)]} { + set pids $opts(pids) + } elseif {[info exists opts(pid)]} { + set pids [list $opts(pid)] + } else { + return $toplevels + } + + set process_toplevels [list ] + foreach toplevel $toplevels { + set pid [get_window_process $toplevel] + if {[lsearch -exact -integer $pids $pid] >= 0} { + lappend process_toplevels $toplevel + } + } + + return $process_toplevels +} + + +# Find a window based on given criteria +proc twapi::find_windows {args} { + # TBD - would incorporating FindWindowEx be faster + # TBD - apparently on Windows 8, you need to use FindWindowEx to + # get non-toplevel Metro windows + + array set opts [parseargs args { + ancestor.arg + caption.bool + child.bool + class.arg + {match.arg string {string glob regexp}} + maximize.bool + maximizebox.bool + messageonlywindow.bool + minimize.bool + minimizebox.bool + overlapped.bool + pids.arg + popup.bool + single + style.arg + text.arg + toplevel.bool + visible.bool + } -maxleftover 0] + + if {[info exists opts(style)] + ||[info exists opts(overlapped)] + || [info exists opts(popup)] + || [info exists opts(child)] + || [info exists opts(minimizebox)] + || [info exists opts(maximizebox)] + || [info exists opts(minimize)] + || [info exists opts(maximize)] + || [info exists opts(visible)] + || [info exists opts(caption)] + } { + set need_style 1 + } else { + set need_style 0 + } + + # Figure out the type of match if -text specified + if {[info exists opts(text)]} { + switch -exact -- $opts(match) { + glob { + set text_compare [list string match -nocase $opts(text)] + } + string { + set text_compare [list string equal -nocase $opts(text)] + } + regexp { + set text_compare [list regexp -nocase $opts(text)] + } + default { + error "Invalid value '$opts(match)' specified for -match option" + } + } + } + + # First build a list of potential candidates. There are two main + # categories we have to look at - ordinary windows and message-only + # windows. Normally, both are included. However, if -messageonlywindow + # is specified, then we only include the former or the latter + # depending on the value of the -messageonlywindow option + + set include_ordinary true + if {[info exists opts(messageonlywindow)]} { + if {$opts(messageonlywindow)} { + if {[info exists opts(toplevel)] && $opts(toplevel)} { + error "Options -toplevel and -messageonlywindow cannot be both specified as true" + } + if {[info exists opts(text)]} { + # See bug 3213001 + error "Option -text cannot be specified if -messageonlywindow is specified as true" + } + if {[info exists opts(ancestor)]} { + error "Option -ancestor cannot be specified if -messageonlywindow is specified as true" + } + set include_ordinary false + } + set include_messageonly $opts(messageonlywindow) + } else { + # -messageonlywindow not specified at all. Only include + # messageonly windows if toplevel is not specified as true + # Also, if opts(text) is specified, will never match messageonly + # so set it to false to we do not pick up messageonly windows + # (which will hang if we go looking for them with -text : see + # bug 3213001). + if {([info exists opts(toplevel)] && $opts(toplevel)) || + [info exists opts(ancestor)] || [info exists opts(text)] + } { + set include_messageonly false + } else { + set include_messageonly true + } + } + + if {$include_messageonly} { + set class "" + if {[info exists opts(class)]} { + set class $opts(class) + } + set text "" + if {[info exists opts(text)] && + $opts(match) eq "string"} { + set text $opts(text) + } + set messageonly_candidates [_get_message_only_windows] + } else { + set messageonly_candidates [list ] + } + + if {$include_ordinary} { + # TBD - make use of FindWindowEx function if possible + + # If only interested in toplevels, just start from there + if {[info exists opts(toplevel)]} { + if {$opts(toplevel)} { + set ordinary_candidates [get_toplevel_windows] + if {[info exists opts(ancestor)]} { + error "Option -ancestor may not be specified together with -toplevel true" + } + } else { + # We do not want windows to be toplevels. Remember list + # so we can check below. + set toplevels [get_toplevel_windows] + } + } + + if {![info exists ordinary_candidates]} { + # -toplevel TRuE not specified. + # If ancestor is not specified, we start from the desktop window + # Note ancestor, if specified, is never included in the search + if {[info exists opts(ancestor)] && ![pointer_null? $opts(ancestor)]} { + set ordinary_candidates [get_descendent_windows $opts(ancestor)] + } else { + set desktop [get_desktop_window] + set ordinary_candidates [concat [list $desktop] [get_descendent_windows $desktop]] + } + } + } else { + set ordinary_candidates [list ] + } + + + set matches [list ] + foreach win [concat $messageonly_candidates $ordinary_candidates] { + # Why are we not using a trap here instead of catch ? TBD + set status [catch { + if {[info exists toplevels]} { + # We do NOT want toplevels + if {[lsearch -exact $toplevels $win] >= 0} { + # This is toplevel, which we don't want + continue + } + } + + # TBD - what is the right order to check from a performance + # point of view + + if {$need_style} { + set win_styles [get_window_style $win] + set win_style [lindex $win_styles 0] + set win_exstyle [lindex $win_styles 1] + set win_styles [lrange $win_styles 2 end] + } + + if {[info exists opts(style)] && [llength $opts(style)]} { + lassign $opts(style) style exstyle + if {[string length $style] && ($style != $win_style)} continue + if {[string length $exstyle] && ($exstyle != $win_exstyle)} continue + } + + set match 1 + foreach opt {visible overlapped popup child minimizebox + maximizebox minimize maximize caption + } { + if {[info exists opts($opt)]} { + if {(! $opts($opt)) == ([lsearch -exact $win_styles $opt] >= 0)} { + set match 0 + break + } + } + } + if {! $match} continue + + # TBD - should we use get_window_class or get_window_real_class + if {[info exists opts(class)] && + [string compare -nocase $opts(class) [get_window_class $win]]} { + continue + } + + if {[info exists opts(pids)]} { + set pid [get_window_process $win] + if {[lsearch -exact -integer $opts(pids) $pid] < 0} continue + } + + if {[info exists opts(text)]} { + set text [get_window_text $win] + if {![eval $text_compare [list [get_window_text $win]]]} continue + } + # Matches all criteria. If we only want one, return it, else + # add to match list + if {$opts(single)} { + return $win + } + lappend matches $win + } result ] + + switch -exact -- $status { + 0 { + # No error, just keep going + } + 1 { + # Error, see if error code is no window and if so, ignore + lassign $::errorCode subsystem code msg + if {$subsystem == "TWAPI_WIN32"} { + # Window has disappeared so just do not include it + # Cannot just actual code since many different codes + # might be returned in this case + } else { + error $result $::errorInfo $::errorCode + } + } + 2 { + return $result; # Block executed a return + } + 3 { + break; # Block executed a break + } + 4 { + continue; # Block executed a continue + } + } + } + + return $matches + +} + + +# Return all descendent windows +proc twapi::get_descendent_windows {parent_hwin} { + return [EnumChildWindows $parent_hwin] +} + +# Return the parent window +proc twapi::get_parent_window {hwin} { + # Note - we use GetAncestor and not GetParent because the latter + # will return the owner in the case of a toplevel window + # 1 -> GA_PARENT -> 1 + return [_return_window [GetAncestor $hwin 1]] +} + +# Return owner window +proc twapi::get_owner_window {hwin} { + # GW_OWNER -> 4 + return [_return_window [twapi::GetWindow $hwin 4]] +} + +# Return immediate children of a window (not all children) +proc twapi::get_child_windows {hwin} { + set children [list ] + # TBD - maybe get_first_child/get_next_child would be more efficient + foreach w [get_descendent_windows $hwin] { + if {[_same_window $hwin [get_parent_window $w]]} { + lappend children $w + } + } + return $children +} + +# Return first child in z-order +proc twapi::get_first_child {hwin} { + # GW_CHILD -> 5 + return [_return_window [twapi::GetWindow $hwin 5]] +} + + +# Return the next sibling window in z-order +proc twapi::get_next_sibling_window {hwin} { + # GW_HWNDNEXT -> 2 + return [_return_window [twapi::GetWindow $hwin 2]] +} + +# Return the previous sibling window in z-order +proc twapi::get_prev_sibling_window {hwin} { + # GW_HWNDPREV -> 3 + return [_return_window [twapi::GetWindow $hwin 3]] +} + +# Return the sibling window that is highest in z-order +proc twapi::get_first_sibling_window {hwin} { + # GW_HWNDFIRST -> 0 + return [_return_window [twapi::GetWindow $hwin 0]] +} + +# Return the sibling window that is lowest in z-order +proc twapi::get_last_sibling_window {hwin} { + # GW_HWNDLAST -> 1 + return [_return_window [twapi::GetWindow $hwin 1]] +} + +# Return the desktop window +proc twapi::get_desktop_window {} { + return [_return_window [twapi::GetDesktopWindow]] +} + +# Return the shell window +proc twapi::get_shell_window {} { + return [_return_window [twapi::GetShellWindow]] +} + +# Return the pid for a window +proc twapi::get_window_process {hwin} { + return [lindex [GetWindowThreadProcessId $hwin] 1] +} + +# Return the thread for a window +proc twapi::get_window_thread {hwin} { + return [lindex [GetWindowThreadProcessId $hwin] 0] +} + +# Return the style of the window. Returns a list of two integers +# the first contains the style bits, the second the extended style bits +proc twapi::get_window_style {hwin} { + # GWL_STYLE -> -16, GWL_EXSTYLE -20 + set style [GetWindowLongPtr $hwin -16] + set exstyle [GetWindowLongPtr $hwin -20] + return [concat [list $style $exstyle] [_style_mask_to_symbols $style $exstyle]] +} + + +# Set the style of the window. Returns a list of two integers +# the first contains the original style bits, the second the +# original extended style bits +proc twapi::set_window_style {hwin style exstyle} { + # GWL_STYLE -> -16, GWL_EXSTYLE -20 + set style [SetWindowLongPtr $hwin -16 $style] + set exstyle [SetWindowLongPtr $hwin -20 $exstyle] + + redraw_window_frame $hwin + return +} + + +# Return the class of the window +proc twapi::get_window_class {hwin} { + return [GetClassName $hwin] +} + +# Return the real class of the window +proc twapi::get_window_real_class {hwin} { + return [RealGetWindowClass $hwin] +} + +# Return the identifier corrpsonding to the application instance +proc twapi::get_window_application {hwin} { + # GWL_HINSTANCE -> -6 + return [GetWindowLongPtr $hwin -6] +} + +# Return the window id (this is different from the handle!) +proc twapi::get_window_id {hwin} { + # GWL_ID -> -12 + return [GetWindowLongPtr $hwin -12] +} + +# Return the user data associated with a window +proc twapi::get_window_userdata {hwin} { + # GWL_USERDATA -> -21 + return [GetWindowLongPtr $hwin -21] +} + + +# Get the foreground window +proc twapi::get_foreground_window {} { + return [_return_window [GetForegroundWindow]] +} + +# Set the foreground window - returns 1/0 on success/fail +proc twapi::set_foreground_window {hwin} { + return [SetForegroundWindow $hwin] +} + + +# Activate a window - this is only brought the foreground if its application +# is in the foreground +proc twapi::set_active_window_for_thread {hwin} { + return [_return_window [_attach_hwin_and_eval $hwin {SetActiveWindow $hwin}]] +} + +# Get active window for an application +proc twapi::get_active_window_for_thread {tid} { + return [_return_window [_get_gui_thread_info $tid hwndActive]] +} + + +# Get focus window for an application +proc twapi::get_focus_window_for_thread {tid} { + return [_get_gui_thread_info $tid hwndFocus] +} + +# Get active window for current thread +proc twapi::get_active_window_for_current_thread {} { + return [_return_window [GetActiveWindow]] +} + +# Update the frame - needs to be called after setting certain style bits +proc twapi::redraw_window_frame {hwin} { + # 0x4037 -> SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | + # SWP_NOMOVE | SWP_NOSIZE | + # SWP_NOZORDER | SWP_FRAMECHANGED + SetWindowPos $hwin 0 0 0 0 0 0x4037 +} + +# Redraw the window +proc twapi::redraw_window {hwin {opt ""}} { + if {[string length $opt]} { + if {[string compare $opt "-force"]} { + error "Invalid option '$opt'" + } + invalidate_screen_region -hwin $hwin -rect [list ] -bgerase + } + + UpdateWindow $hwin + return +} + +# Set the window position +proc twapi::move_window {hwin x y args} { + array set opts [parseargs args { + {sync} + }] + + # Not using MoveWindow because that will require knowing the width + # and height (or retrieving it) + # 0x15 -> SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER + set flags 0x15 + if {! $opts(sync)} { + setbits flags 0x4000; # SWP_ASYNCWINDOWPOS + } + SetWindowPos $hwin 0 $x $y 0 0 $flags +} + +# Resize window +proc twapi::resize_window {hwin w h args} { + array set opts [parseargs args { + {sync} + }] + + + # Not using MoveWindow because that will require knowing the x and y pos + # (or retrieving them) + # 0x16 -> SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER + set flags 0x16 + if {! $opts(sync)} { + setbits flags 0x4000; # SWP_ASYNCWINDOWPOS + } + SetWindowPos $hwin 0 0 0 $w $h $flags +} + +# Sets the window's z-order position +# pos is either window handle or a symbol +proc twapi::set_window_zorder {hwin pos} { + switch -exact -- $pos { + top { + set pos [pointer_from_address 0 HWND]; #HWND_TOP + } + bottom { + set pos [pointer_from_address 1 HWND]; #HWND_BOTTOM + } + toplayer { + set pos [pointer_from_address -1 HWND]; #HWND_TOPMOST + } + bottomlayer { + set pos [pointer_from_address -2 HWND]; #HWND_NOTOPMOST + } + } + + # 0x4013 -> SWP_ASYNCWINDOWPOS|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE + SetWindowPos $hwin $pos 0 0 0 0 0x4013 +} + + +# Show the given window. Returns 1 if window was previously visible, else 0 +proc twapi::show_window {hwin args} { + array set opts [parseargs args {sync activate normal startup}] + + set show 0 + if {$opts(startup)} { + set show 10; #SW_SHOWDEFAULT + } else { + if {$opts(activate)} { + if {$opts(normal)} { + set show 1; #SW_SHOWNORMAL + } else { + set show 5; #SW_SHOW + } + } else { + if {$opts(normal)} { + set show 4; #SW_SHOWNOACTIVATE + } else { + set show 8; #SW_SHOWNA + } + } + } + + _show_window $hwin $show $opts(sync) +} + +# Hide the given window. Returns 1 if window was previously visible, else 0 +proc twapi::hide_window {hwin args} { + array set opts [parseargs args {sync}] + _show_window $hwin 0 $opts(sync); # 0 -> SW_HIDE +} + +# Restore the given window. Returns 1 if window was previously visible, else 0 +proc twapi::restore_window {hwin args} { + array set opts [parseargs args {sync activate}] + if {$opts(activate)} { + _show_window $hwin 9 $opts(sync); # 9 -> SW_RESTORE + } else { + OpenIcon $hwin + } +} + +# Maximize the given window. Returns 1 if window was previously visible, else 0 +proc twapi::maximize_window {hwin args} { + array set opts [parseargs args {sync}] + _show_window $hwin 3 $opts(sync); # 3 -> SW_SHOWMAXIMIZED +} + + +# Minimize the given window. Returns 1 if window was previously visible, else 0 +proc twapi::minimize_window {hwin args} { + array set opts [parseargs args {sync activate shownext}] + + # TBD - when should we use SW_FORCEMINIMIZE ? + # TBD - do we need to attach to the window's thread? + # TBD - when should we use CloseWindow instead? + + if $opts(activate) { + set show 2; #SW_SHOWMINIMIZED + } else { + if {$opts(shownext)} { + set show 6; #SW_MINIMIZE + } else { + set show 7; #SW_SHOWMINNOACTIVE + } + } + + _show_window $hwin $show $opts(sync) +} + + +# Hides popup windows +proc twapi::hide_owned_popups {hwin} { + ShowOwnedPopups $hwin 0 +} + +# Show hidden popup windows +proc twapi::show_owned_popups {hwin} { + ShowOwnedPopups $hwin 1 +} + +# Close a window +proc twapi::close_window {hwin args} { + array set opts [parseargs args { + block + {wait.int 10} + } -maxleftover 0] + + if {0} { + Cannot close Explorer windows using SendMessage* + if {$opts(block)} { + set block 3; #SMTO_BLOCK|SMTO_ABORTIFHUNG + } else { + set block 2; #SMTO_NORMAL|SMTO_ABORTIFHUNG + } + + # WM_CLOSE -> 0x10 + if {[catch {SendMessageTimeout $hwin 0x10 0 0 $block $opts(wait)} msg]} { + # Do no treat timeout as an error + set erCode $::errorCode + set erInfo $::errorInfo + if {[lindex $erCode 0] != "TWAPI_WIN32" || + ([lindex $erCode 1] != 0 && [lindex $erCode 1] != 1460)} { + error $msg $erInfo $erCode + } + } + } else { + # Implement using PostMessage since that allows closing of + # Explorer windows + + # Note - opts(block) is ignored here + + # 0x10 -> WM_CLOSE + PostMessage $hwin 0x10 0 0 + if {$opts(wait)} { + wait [list ::twapi::window_exists $hwin] 0 $opts(wait) + } + } + return [twapi::window_exists $hwin] +} + +# CHeck if window is minimized +proc twapi::window_minimized {hwin} { + return [IsIconic $hwin] +} + +# CHeck if window is maximized +proc twapi::window_maximized {hwin} { + return [IsZoomed $hwin] +} + +# Check if window is visible +proc twapi::window_visible {hwin} { + return [IsWindowVisible $hwin] +} + +# Check if a window exists +proc twapi::window_exists {hwin} { + return [IsWindow $hwin] +} + +# CHeck if window input is enabled +proc twapi::window_unicode_enabled {hwin} { + return [IsWindowUnicode $hwin] +} + +# Check if child is a child of parent +proc twapi::window_is_child {parent child} { + return [IsChild $parent $child] +} + +# Flash the given window +proc twapi::flash_window_caption {hwin args} { + array set opts [parseargs args {toggle}] + + return [FlashWindow $hwin $opts(toggle)] +} + +# FlashWindow not in binary any more, emulate it +proc twapi::FlashWindow {hwin toggle} { + FlashWindowEx [list $hwin 1 $toggle 0] +} + +# Flash the given window and/or the taskbar icon +proc twapi::flash_window {hwin args} { + array set opts [parseargs args { + period.int + count.int + nocaption + notaskbar + start + stop + untilforeground + } -maxleftover 0 -nulldefault] + + set flags 0 + + if {! $opts(stop)} { + # Flash title bar? + if {! $opts(nocaption)} { + incr flags 1; # FLASHW_CAPTION + } + + # Flash taskbar icon ? + if {! $opts(notaskbar)} { + incr flags 2; # FLASHW_TRAY + } + + # Continuous modes ? + if {$opts(untilforeground)} { + # Continuous until foreground window + # NOTE : FLASHW_TIMERNOFG is no implemented because it seems to be + # broken - it only flashes once, at least on Windows XP. Keep + # it in case other platforms work correctly. + incr flags 0xc; # FLASHW_TIMERNOFG + } elseif {$opts(start)} { + # Continuous until stopped + incr flags 4; # FLASHW_TIMER + } elseif {$opts(count) == 0} { + set opts(count) 1 + } + } + + return [FlashWindowEx [list $hwin $flags $opts(count) $opts(period)]] +} + + +# Show/hide window caption buttons. hwin must be a toplevel +proc twapi::configure_window_titlebar {hwin args} { + + array set opts [parseargs args { + visible.bool + sysmenu.bool + minimizebox.bool + maximizebox.bool + contexthelp.bool + } -maxleftover 0] + + # Get the current style setting + lassign [get_window_style $hwin] style exstyle + + # See if each option is specified. Else use current setting + # 0x00080000 -> WS_SYSMENU + # 0x00020000 -> WS_MINIMIZEBOX + # 0x00010000 -> WS_MAXIMIZEBOX + # 0x00C00000 -> WS_CAPTION + foreach {opt def} { + sysmenu 0x00080000 + minimizebox 0x00020000 + maximizebox 0x00010000 + visible 0x00C00000 + } { + if {[info exists opts($opt)]} { + set $opt [expr {$opts($opt) ? $def : 0}] + } else { + set $opt [expr {$style & $def}] + } + } + + # Ditto for extended style and context help + if {[info exists opts(contexthelp)]} { + # WS_EX_CONTEXTHELP -> 0x00000400 + set contexthelp [expr {$opts(contexthelp) ? 0x00000400 : 0}] + } else { + set contexthelp [expr {$exstyle & 0x00000400}] + } + + # The min/max/help buttons all depend on sysmenu being set. + if {($minimizebox || $maximizebox || $contexthelp) && ! $sysmenu} { + # Don't bother raising error, since the underlying API allows it + #error "Cannot enable minimize, maximize and context help buttons unless system menu is present" + } + + # Reset existing sysmenu,minimizebox,maximizebox,caption + set style [expr {$style & 0xff34ffff}] + ; # Add back new settings + set style [expr {$style | $sysmenu | $minimizebox | $maximizebox | $visible}] + + # Reset contexthelp and add new setting back + set exstyle [expr {$exstyle & 0xfffffbff}] + set exstyle [expr {$exstyle | $contexthelp}] + + set_window_style $hwin $style $exstyle +} + +# Arrange window icons +proc twapi::arrange_icons {{hwin ""}} { + if {$hwin == ""} { + set hwin [get_desktop_window] + } + ArrangeIconicWindows $hwin +} + +# Get the window text/caption +proc twapi::get_window_text {hwin} { + # TBD - see https://devblogs.microsoft.com/oldnewthing/20030821-00/?p=42833 + twapi::GetWindowText $hwin +} + +# Set the window text/caption +proc twapi::set_window_text {hwin text} { + twapi::SetWindowText $hwin $text +} + +# Get size of client area +proc twapi::get_window_client_area_size {hwin} { + return [lrange [GetClientRect $hwin] 2 3] +} + +# Get window coordinates +proc twapi::get_window_coordinates {hwin} { + return [GetWindowRect $hwin] +} + +# Get the window under the point +proc twapi::get_window_at_location {x y} { + return [WindowFromPoint [list $x $y]] +} + +# Marks a screen region as invalid forcing a redraw +proc twapi::invalidate_screen_region {args} { + array set opts [parseargs args { + {hwin.arg 0} + rect.arg + bgerase + } -nulldefault -maxleftover 0] + + InvalidateRect $opts(hwin) $opts(rect) $opts(bgerase) +} + +# Get the caret blink time +proc twapi::get_caret_blink_time {} { + return [GetCaretBlinkTime] +} + +# Set the caret blink time +proc twapi::set_caret_blink_time {ms} { + return [SetCaretBlinkTime $ms] +} + +# Hide the caret +proc twapi::hide_caret {} { + HideCaret 0 +} + +# Show the caret +proc twapi::show_caret {} { + ShowCaret 0 +} + +# Get the caret position +proc twapi::get_caret_location {} { + return [GetCaretPos] +} + +# Get the caret position +proc twapi::set_caret_location {point} { + return [SetCaretPos [lindex $point 0] [lindex $point 1]] +} + + +# Get display size +proc twapi::get_display_size {} { + return [lrange [get_window_coordinates [get_desktop_window]] 2 3] +} + + +# Get path to the desktop wallpaper +interp alias {} twapi::get_desktop_wallpaper {} twapi::get_system_parameters_info SPI_GETDESKWALLPAPER + + +# Set desktop wallpaper +proc twapi::set_desktop_wallpaper {path args} { + + array set opts [parseargs args { + persist + }] + + if {$opts(persist)} { + set flags 3; # Notify all windows + persist + } else { + set flags 2; # Notify all windows + } + + if {$path == "default"} { + SystemParametersInfo 0x14 0 NULL 0 + return + } + + if {$path == "none"} { + set path "" + } + + set mem_size [expr {2 * ([string length $path] + 1)}] + set mem [malloc $mem_size] + trap { + twapi::Twapi_WriteMemory 3 $mem 0 $mem_size $path + SystemParametersInfo 0x14 0 $mem $flags + } finally { + free $mem + } +} + +# Get desktop work area +interp alias {} twapi::get_desktop_workarea {} twapi::get_system_parameters_info SPI_GETWORKAREA + + + +# Get the color depth of the display +proc twapi::get_color_depth {{hwin 0}} { + set h [GetDC $hwin] + trap { + return [GetDeviceCaps $h 12] + } finally { + ReleaseDC $hwin $h + } +} + + +# Enumerate the display adapters in a system +proc twapi::get_display_devices {} { + set devs [list ] + for {set i 0} {true} {incr i} { + trap { + set dev [EnumDisplayDevices "" $i 0] + } onerror {TWAPI_WIN32} { + # We don't check for a specific error since experimentation + # shows the error code returned at the end of enumeration + # is not fixed - can be 2, 18, 87 and maybe others + break + } + lappend devs [_format_display_device $dev] + } + + return $devs +} + +# Enumerate the display monitors for an display device +proc twapi::get_display_monitors {args} { + array set opts [parseargs args { + device.arg + activeonly + } -maxleftover 0] + + if {[info exists opts(device)]} { + set devs [list $opts(device)] + } else { + set devs [list ] + foreach dev [get_display_devices] { + lappend devs [kl_get $dev -name] + } + } + + set monitors [list ] + foreach dev $devs { + for {set i 0} {true} {incr i} { + trap { + set monitor [EnumDisplayDevices $dev $i 0] + } onerror {} { + # We don't check for a specific error since experimentation + # shows the error code returned at the end of enumeration + # is not fixed - can be 2, 18, 87 and maybe others + break + } + if {(! $opts(activeonly)) || + ([lindex $monitor 2] & 1)} { + lappend monitors [_format_display_monitor $monitor] + } + } + } + + return $monitors +} + +# Return the monitor corresponding to a window +proc twapi::get_display_monitor_from_window {hwin args} { + array set opts [parseargs args { + default.arg + } -maxleftover 0] + + # hwin may be a window id or a Tk window. On error we assume it is + # a window id + catch { + set hwin [pointer_from_address [winfo id $hwin] HWND] + } + + set flags 0 + if {[info exists opts(default)]} { + switch -exact -- $opts(default) { + primary { set flags 1 } + nearest { set flags 2 } + default { error "Invalid value '$opts(default)' for -default option" } + } + } + + trap { + return [MonitorFromWindow $hwin $flags] + } onerror {TWAPI_WIN32 0} { + win32_error 1461 "Window does not map to a monitor." + } +} + +# Return the monitor corresponding to a screen cocordinates +proc twapi::get_display_monitor_from_point {x y args} { + array set opts [parseargs args { + default.arg + } -maxleftover 0] + + set flags 0 + if {[info exists opts(default)]} { + switch -exact -- $opts(default) { + primary { set flags 1 } + nearest { set flags 2 } + default { error "Invalid value '$opts(default)' for -default option" } + } + } + + trap { + return [MonitorFromPoint [list $x $y] $flags] + } onerror {TWAPI_WIN32 0} { + win32_error 1461 "Virtual screen coordinates ($x,$y) do not map to a monitor." + } +} + + +# Return the monitor corresponding to a screen rectangle +proc twapi::get_display_monitor_from_rect {rect args} { + array set opts [parseargs args { + default.arg + } -maxleftover 0] + + set flags 0 + if {[info exists opts(default)]} { + switch -exact -- $opts(default) { + primary { set flags 1 } + nearest { set flags 2 } + default { error "Invalid value '$opts(default)' for -default option" } + } + } + + trap { + return [MonitorFromRect $rect $flags] + } onerror {TWAPI_WIN32 0} { + win32_error 1461 "Virtual screen rectangle <[join $rect ,]> does not map to a monitor." + } +} + +proc twapi::get_display_monitor_info {hmon} { + return [_format_monitor_info [GetMonitorInfo $hmon]] +} + +proc twapi::get_multiple_display_monitor_info {} { + set result [list ] + foreach elem [EnumDisplayMonitors NULL ""] { + lappend result [get_display_monitor_info [lindex $elem 0]] + } + return $result +} + + +proc twapi::tkpath_to_hwnd {tkpath} { + return [cast_handle [winfo id $tkpath] HWND] +} + +# TBD - document +proc twapi::high_contrast_on {} { + set hc [lindex [get_system_parameters_info SPI_GETHIGHCONTRAST] 1] + return [expr {$hc & 1}] +} + +################################################################ +# Utility routines + +# Helper function to wrap GetGUIThreadInfo +# Returns the value of the given fields. If a single field is requested, +# returns it as a scalar else returns a flat list of FIELD VALUE pairs +proc twapi::_get_gui_thread_info {tid args} { + array set gtinfo [GetGUIThreadInfo $tid] + set result [list ] + foreach field $args { + set value $gtinfo($field) + switch -exact -- $field { + cbSize { } + rcCaret { + set value [list $value(left) \ + $value(top) \ + $value(right) \ + $value(bottom)] + } + } + lappend result $value + } + + if {[llength $args] == 1} { + return [lindex $result 0] + } else { + return $result + } +} + + +# if $hwin corresponds to a null window handle, returns an empty string +proc twapi::_return_window {hwin} { + if {[pointer_null? $hwin HWND]} { + return $twapi::null_hwin + } + return $hwin +} + +# Return 1 if same window +proc twapi::_same_window {hwin1 hwin2} { + # If either is a empty/null handle, no match, even if both empty/null + if {[string length $hwin1] == 0 || [string length $hwin2] == 0} { + return 0 + } + if {[pointer_null? $hwin1] || [pointer_null? $hwin2]} { + return 0 + } + + # Need integer compare + return [pointer_equal? $hwin1 $hwin2] +} + +# Helper function for showing/hiding windows +proc twapi::_show_window {hwin cmd {wait 0}} { + # If either our thread owns the window or we want to wait for it to + # process the command, use the synchrnous form of the function + if {$wait || ([get_window_thread $hwin] == [GetCurrentThreadId])} { + ShowWindow $hwin $cmd + } else { + ShowWindowAsync $hwin $cmd + } +} + + + +# Map style bits to a style symbol list +proc twapi::_style_mask_to_symbols {style exstyle} { + set attrs [list ] + if {$style & 0x80000000} { + lappend attrs popup + if {$style & 0x00020000} { lappend attrs group } + if {$style & 0x00010000} { lappend attrs tabstop } + } else { + if {$style & 0x40000000} { + lappend attrs child + } else { + lappend attrs overlapped + } + if {$style & 0x00020000} { lappend attrs minimizebox } + if {$style & 0x00010000} { lappend attrs maximizebox } + } + + # Note WS_BORDER, WS_DLGFRAME and WS_CAPTION use same bits + if {$style & 0x00C00000} { + lappend attrs caption + } else { + if {$style & 0x00800000} { lappend attrs border } + if {$style & 0x00400000} { lappend attrs dlgframe } + } + + foreach {sym mask} { + minimize 0x20000000 + visible 0x10000000 + disabled 0x08000000 + clipsiblings 0x04000000 + clipchildren 0x02000000 + maximize 0x01000000 + vscroll 0x00200000 + hscroll 0x00100000 + sysmenu 0x00080000 + thickframe 0x00040000 + } { + if {$style & $mask} { + lappend attrs $sym + } + } + + if {$exstyle & 0x00001000} { + lappend attrs right + } else { + lappend attrs left + } + if {$exstyle & 0x00002000} { + lappend attrs rtlreading + } else { + lappend attrs ltrreading + } + if {$exstyle & 0x00004000} { + lappend attrs leftscrollbar + } else { + lappend attrs rightscrollbar + } + + foreach {sym mask} { + dlgmodalframe 0x00000001 + noparentnotify 0x00000004 + topmost 0x00000008 + acceptfiles 0x00000010 + transparent 0x00000020 + mdichild 0x00000040 + toolwindow 0x00000080 + windowedge 0x00000100 + clientedge 0x00000200 + contexthelp 0x00000400 + controlparent 0x00010000 + staticedge 0x00020000 + appwindow 0x00040000 + } { + if {$exstyle & $mask} { + lappend attrs $sym + } + } + + return $attrs +} + + +# Test proc for displaying all colors for a class +proc twapi::_show_theme_colors {class part {state ""}} { + set w [toplevel .themetest$class$part$state] + + set h [OpenThemeData [tkpath_to_hwnd $w] $class] + wm title $w "$class Colors" + + label $w.title -text "$class, $part, $state" -bg white + grid $w.title - + + if {![string is integer -strict $part]} { + set part [TwapiGetThemeDefine $part] + } + + if {![string is integer -strict $state]} { + set state [TwapiGetThemeDefine $state] + } + + foreach x {BORDERCOLOR FILLCOLOR TEXTCOLOR EDGELIGHTCOLOR EDGESHADOWCOLOR EDGEFILLCOLOR TRANSPARENTCOLOR GRADIENTCOLOR1 GRADIENTCOLOR2 GRADIENTCOLOR3 GRADIENTCOLOR4 GRADIENTCOLOR5 SHADOWCOLOR GLOWCOLOR TEXTBORDERCOLOR TEXTSHADOWCOLOR GLYPHTEXTCOLOR FILLCOLORHINT BORDERCOLORHINT ACCENTCOLORHINT BLENDCOLOR} { + set prop [TwapiGetThemeDefine TMT_$x] + if {![catch {GetThemeColor $h $part $state $prop} color]} { + label $w.l-$x -text $x + label $w.c-$x -text $color -bg $color + grid $w.l-$x $w.c-$x + } else { + label $w.l-$x -text $x + label $w.c-$x -text "Not defined" + grid $w.l-$x $w.c-$x + } + } + CloseThemeData $h +} + +# Test proc for displaying all sys colors for a class +# class might be "WINDOW" +proc twapi::_show_theme_syscolors {class} { + destroy .themetest$class + set w [toplevel .themetest$class] + + set h [OpenThemeData [tkpath_to_hwnd $w] $class] + wm title $w "$class SysColors" + + label $w.title -text "$class" -bg white + grid $w.title - + + + for {set x 0} {$x <= 30} {incr x} { + if {![catch {GetThemeSysColor $h $x} color]} { + set color #[format %6.6x $color] + label $w.l-$x -text $x + label $w.c-$x -text $color -bg $color + grid $w.l-$x $w.c-$x + } else { + label $w.l-$x -text $x + label $w.c-$x -text "Not defined" + grid $w.l-$x $w.c-$x + } + } + CloseThemeData $h +} + +# Test proc for displaying all fonts for a class +proc twapi::_show_theme_fonts {class part {state ""}} { + set w [toplevel .themetest$class$part$state] + + set h [OpenThemeData [tkpath_to_hwnd $w] $class] + wm title $w "$class fonts" + + label $w.title -text "$class, $part, $state" -bg white + grid $w.title - + + set part [TwapiGetThemeDefine $part] + set state [TwapiGetThemeDefine $state] + + foreach x {GLYPHTYPE FONT} { + set prop [TwapiGetThemeDefine TMT_$x] + if {![catch {GetThemeFont $h NULL $part $state $prop} font]} { + label $w.l-$x -text $x + label $w.c-$x -text $font + grid $w.l-$x $w.c-$x + } + } + CloseThemeData $h +} + + + +# Formats a display device as returned by C into a keyed list +proc twapi::_format_display_device {dev} { + + # Field names - SAME ORDER AS IN $dev!! + set fields {-name -description -flags -id -key} + + set flags [lindex $dev 2] + foreach {opt flag} { + desktop 0x00000001 + multidriver 0x00000002 + primary 0x00000004 + mirroring 0x00000008 + vgacompatible 0x00000010 + removable 0x00000020 + modespruned 0x08000000 + remote 0x04000000 + disconnect 0x02000000 + } { + lappend fields -$opt + lappend dev [expr { $flags & $flag ? true : false }] + } + + return [kl_create2 $fields $dev] +} + +# Formats a display monitor as returned by C into a keyed list +proc twapi::_format_display_monitor {dev} { + + # Field names - SAME ORDER AS IN $dev!! + set fields {-name -description -flags -id -key} + + set flags [lindex $dev 2] + foreach {opt flag} { + active 0x00000001 + attached 0x00000002 + } { + lappend fields -$opt + lappend dev [expr { $flags & $flag ? true : false }] + } + + return [kl_create2 $fields $dev] +} + +# Format a monitor info struct +proc twapi::_format_monitor_info {hmon} { + return [kl_create2 {-extent -workarea -primary -name} $hmon] +} + +# Get message-only windows +proc twapi::_get_message_only_windows {} { + + set wins [list ] + set prev 0 + # -3 -> HWND_MESSAGE windows + + while true { + set win [FindWindowEx [list -3 HWND] $prev "" ""] + if {[pointer_null? $win]} break + lappend wins $win + set prev $win + } + + return $wins +} + diff --git a/src/punk86.vfs/lib/twapi4.7.2/win.tcl b/src/punk86.vfs/lib/twapi4.7.2/win.tcl new file mode 100644 index 00000000..d0b62170 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/win.tcl @@ -0,0 +1,131 @@ +# +# Copyright (c) 2012 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# Contains common windowing and notification infrastructure + +namespace eval twapi { + variable null_hwin "" + + # Windows messages that are directly accessible from script. These + # are handled by the default notifications window and passed to + # the twapi::_script_wm_handler. These messages must be in the + # range (1056 = 1024+32) - (1024+32+31) (see twapi_wm.h) + variable _wm_script_msgs + array set _wm_script_msgs { + TASKBAR_RESTART 1031 + NOTIFY_ICON_CALLBACK 1056 + } + proc _get_script_wm {tok} { + variable _wm_script_msgs + return $_wm_script_msgs($tok) + } +} + +# Backward compatibility aliases +interp alias {} twapi::GetWindowLong {} twapi::GetWindowLongPtr +interp alias {} twapi::SetWindowLong {} twapi::SetWindowLongPtr + +# Return the long value at the given index +# This is a raw function, and should generally be used only to get +# non-system defined indices +proc twapi::get_window_long {hwin index} { + return [GetWindowLongPtr $hwin $index] +} + +# Set the long value at the given index and return the previous value +# This is a raw function, and should generally be used only to get +# non-system defined indices +proc twapi::set_window_long {hwin index val} { + set oldval [SetWindowLongPtr $hwin $index $val] +} + +# Set the user data associated with a window. Returns the previous value +proc twapi::set_window_userdata {hwin val} { + # GWL_USERDATA -> -21 + return [SetWindowLongPtr $hwin -21 $val] +} + +# Attaches to the thread queue of the thread owning $hwin and executes +# script in the caller's scope +proc twapi::_attach_hwin_and_eval {hwin script} { + set me [GetCurrentThreadId] + set hwin_tid [lindex [GetWindowThreadProcessId $hwin] 0] + if {$hwin_tid == 0} { + error "Window $hwin does not exist or could not get its thread owner" + } + + # Cannot (and no need to) attach to oneself so just exec script directly + if {$me == $hwin_tid} { + return [uplevel 1 $script] + } + + trap { + if {![AttachThreadInput $me $hwin_tid 1]} { + error "Could not attach to thread input for window $hwin" + } + set result [uplevel 1 $script] + } finally { + AttachThreadInput $me $hwin_tid 0 + } + + return $result +} + +proc twapi::_register_script_wm_handler {msg cmdprefix {overwrite 0}} { + variable _wm_registrations + + # Ensure notification window exists + twapi::Twapi_GetNotificationWindow + + # The incr ensures decimal format + # The lrange ensure proper list format + if {$overwrite} { + set _wm_registrations([incr msg 0]) [list [lrange $cmdprefix 0 end]] + } else { + lappend _wm_registrations([incr msg 0]) [lrange $cmdprefix 0 end] + } +} + +proc twapi::_unregister_script_wm_handler {msg cmdprefix} { + variable _wm_registrations + + # The incr ensures decimal format + incr msg 0 + # The lrange ensure proper list format + if {[info exists _wm_registrations($msg)]} { + set _wm_registrations($msg) [lsearch -exact -inline -not -all $_wm_registrations($msg) [lrange $cmdprefix 0 end]] + } +} + +# Handles notifications from the common window for script level windows +# messages (see win.c) +proc twapi::_script_wm_handler {msg wparam lparam msgpos ticks} { + variable _wm_registrations + + set code 0 + if {[info exists _wm_registrations($msg)]} { + foreach handler $_wm_registrations($msg) { + set code [catch {uplevel #0 [linsert $handler end $msg $wparam $lparam $msgpos $ticks]} msg] + switch -exact -- $code { + 1 { + # TBD - should remaining handlers be called even on error ? + after 0 [list error $msg $::errorInfo $::errorCode] + break + } + 3 { + break; # Ignore remaining handlers + } + default { + # Keep going + } + } + } + } else { + # TBD - debuglog - no handler for $msg + } + + return +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/winlog.tcl b/src/punk86.vfs/lib/twapi4.7.2/winlog.tcl new file mode 100644 index 00000000..d48d6cd5 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/winlog.tcl @@ -0,0 +1,304 @@ +# +# Copyright (c) 2012, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +# Routines to unify old and new Windows event log APIs + +namespace eval twapi { + # Dictionary to map eventlog consumer handles to various related info + # The primary key is the read handle to the event channel/source. + # Nested keys depend on OS version + variable _winlog_handles +} + +proc twapi::winlog_open {args} { + variable _winlog_handles + + # TBD - document -authtype + array set opts [parseargs args { + {system.arg ""} + channel.arg + file.arg + {authtype.arg 0} + {direction.arg forward {forward backward}} + } -maxleftover 0] + + if {[info exists opts(file)] && + ($opts(system) ne "" || [info exists opts(channel)])} { + error "Option '-file' cannot be used with '-channel' or '-system'" + } else { + if {![info exists opts(channel)]} { + set opts(channel) "Application" + } + } + + if {[min_os_version 6]} { + # Use new Vista APIs + if {[info exists opts(file)]} { + set hsess NULL + set hq [evt_query -file $opts(file) -ignorequeryerrors] + } else { + if {$opts(system) eq ""} { + set hsess [twapi::evt_local_session] + } else { + set hsess [evt_open_session $opts(system) -authtype $opts(authtype)] + } + # evt_query will not read new events from a channel once + # eof is reached. So if reading in forward direction, we use + # evt_subscribe. Backward it does not matter. + if {$opts(direction) eq "forward"} { + lassign [evt_subscribe $opts(channel) -session $hsess -ignorequeryerrors -includeexisting] hq signal + dict set _winlog_handles $hq signal $signal + } else { + set hq [evt_query -session $hsess -channel $opts(channel) -ignorequeryerrors -direction $opts(direction)] + } + } + + dict set _winlog_handles $hq session $hsess + } else { + if {[info exists opts(file)]} { + set hq [eventlog_open -file $opts(file)] + dict set _winlog_handles $hq channel $opts(file) + } else { + set hq [eventlog_open -system $opts(system) -source $opts(channel)] + dict set _winlog_handles $hq channel $opts(channel) + } + dict set _winlog_handles $hq direction $opts(direction) + } + return $hq +} + +proc twapi::winlog_close {hq} { + variable _winlog_handles + + if {! [dict exists $_winlog_handles $hq]} { + error "Invalid event consumer handler '$hq'" + } + + if {[dict exists $_winlog_handles $hq signal]} { + # Catch in case app has closed event directly, for + # example when returned through winlog_subscribe + catch {close_handle [dict get $_winlog_handles $hq signal]} + } + if {[min_os_version 6]} { + set hsess [dict get $_winlog_handles $hq session] + evt_close $hq + evt_close_session $hsess + } else { + eventlog_close $hq + } + + dict unset _winlog_handles $hq + return +} + +proc twapi::winlog_event_count {args} { + # TBD - document and -authtype + array set opts [parseargs args { + {system.arg ""} + channel.arg + file.arg + {authtype.arg 0} + } -maxleftover 0] + + if {[info exists opts(file)] && + ($opts(system) ne "" || [info exists opts(channel)])} { + error "Option '-file' cannot be used with '-channel' or '-system'" + } else { + if {![info exists opts(channel)]} { + set opts(channel) "Application" + } + } + + if {[min_os_version 6]} { + # Use new Vista APIs + trap { + if {[info exists opts(file)]} { + set hsess NULL + set hevl [evt_open_log_info -file $opts(file)] + } else { + if {$opts(system) eq ""} { + set hsess [twapi::evt_local_session] + } else { + set hsess [evt_open_session $opts(system) -authtype $opts(authtype)] + } + set hevl [evt_open_log_info -session $hsess -channel $opts(channel)] + } + return [lindex [evt_log_info $hevl -numberoflogrecords] 1] + } finally { + if {[info exists hsess]} { + evt_close_session $hsess + } + if {[info exists hevl]} { + evt_close $hevl + } + } + } else { + if {[info exists opts(file)]} { + set hevl [eventlog_open -file $opts(file)] + } else { + set hevl [eventlog_open -system $opts(system) -source $opts(channel)] + } + + trap { + return [eventlog_count $hevl] + } finally { + eventlog_close $hevl + } + } +} + +if {[twapi::min_os_version 6]} { + + proc twapi::winlog_read {hq args} { + parseargs args { + {lcid.int 0} + } -setvars -maxleftover 0 + + # TBD - is 10 an appropriate number of events to read? + set events [evt_next $hq -timeout 0 -count 10 -status status] + if {[llength $events]} { + trap { + set result [evt_decode_events $events -lcid $lcid -ignorestring "" -message -levelname -taskname] + } finally { + evt_close {*}$events + } + return $result + } + + # No events were returned. Check status whether it is fatal error + # or not. SUCCESS, NO_MORE_ITEMS, TIMEOUT, INVALID_OPERATION + # are acceptable. This last happens when another EvtNext is done + # after an NO_MORE_ITEMS is already returned. + if {$status == 0 || $status == 259 || $status == 1460 || $status == 4317} { + # Even though $events is empty, still pass it in so it returns + # an empty record array in the correct format. + return [evt_decode_events $events -lcid $lcid -ignorestring "" -message -levelname -taskname] + } else { + win32_error $status + } + } + + proc twapi::winlog_subscribe {channelpath} { + variable _winlog_handles + lassign [evt_subscribe $channelpath -ignorequeryerrors] hq signal + dict set _winlog_handles $hq signal $signal + dict set _winlog_handles $hq session NULL; # local session + return [list $hq $signal] + } + + interp alias {} twapi::winlog_clear {} twapi::evt_clear_log + + proc twapi::winlog_backup {channel outpath} { + evt_export_log $outpath -channel $channel + return + } + +} else { + + proc twapi::winlog_read {hq args} { + parseargs args { + {lcid.int 0} + } -setvars -maxleftover 0 + + variable _winlog_handles + set fields {-channel -taskname -message -providername -eventid -level -levelname -eventrecordid -computer -sid -timecreated} + set values {} + set channel [dict get $_winlog_handles $hq channel] + foreach evl [eventlog_read $hq -direction [dict get $_winlog_handles $hq direction]] { + # Note order must be same as fields above + lappend values \ + [list \ + $channel \ + [eventlog_format_category $evl -langid $lcid] \ + [eventlog_format_message $evl -langid $lcid -width -1] \ + [dict get $evl -source] \ + [dict get $evl -eventid] \ + [dict get $evl -level] \ + [dict get $evl -type] \ + [dict get $evl -recordnum] \ + [dict get $evl -system] \ + [dict get $evl -sid] \ + [secs_since_1970_to_large_system_time [dict get $evl -timewritten]]] + } + return [list $fields $values] + } + + proc twapi::winlog_subscribe {source} { + variable _winlog_handles + lassign [eventlog_subscribe $source] hq hevent + dict set _winlog_handles $hq channel $source + dict set _winlog_handles $hq direction forward + dict set _winlog_handles $hq signal $hevent + return [list $hq $hevent] + } + + proc twapi::winlog_clear {source args} { + set hevl [eventlog_open -source $source] + trap { + eventlog_clear $hevl {*}$args + } finally { + eventlog_close $hevl + } + return + } + + proc twapi::winlog_backup {source outpath} { + set hevl [eventlog_open -source $source] + trap { + eventlog_backup $hevl $outpath + } finally { + eventlog_close $hevl + } + return + } + +} + + +proc twapi::_winlog_dump_list {{channels {Application System Security}} {atomize 0}} { + set evlist {} + foreach channel $channels { + set hevl [winlog_open -channel $channel] + trap { + while {[llength [set events [winlog_read $hevl]]]} { + foreach e [recordarray getlist $events -format dict] { + if {$atomize} { + dict set ev -message [atomize [dict get $e -message]] + dict set ev -levelname [atomize [dict get $e -levelname]] + dict set ev -channel [atomize [dict get $e -channel]] + dict set ev -providername [atomize [dict get $e -providername]] + dict set ev -taskname [atomize [dict get $e -taskname]] + dict set ev -eventid [atomize [dict get $e -eventid]] + dict set ev -account [atomize [dict get $e -userid]] + } else { + dict set ev -message [dict get $e -message] + dict set ev -levelname [dict get $e -levelname] + dict set ev -channel [dict get $e -channel] + dict set ev -providername [dict get $e -providername] + dict set ev -taskname [dict get $e -taskname] + dict set ev -eventid [dict get $e -eventid] + dict set ev -account [dict get $e -userid] + } + lappend evlist $ev + } + } + } finally { + winlog_close $hevl + } + } + return $evlist +} + +proc twapi::_winlog_dump {{channel Application} {fd stdout}} { + set hevl [winlog_open -channel $channel] + while {[llength [set events [winlog_read $hevl]]]} { + # print out each record + foreach ev [recordarray getlist $events -format dict] { + puts $fd "[dict get $ev -timecreated] [dict get $ev -providername]: [dict get $ev -message]" + } + } + winlog_close $hevl +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/winsta.tcl b/src/punk86.vfs/lib/twapi4.7.2/winsta.tcl new file mode 100644 index 00000000..3383e414 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/winsta.tcl @@ -0,0 +1,113 @@ +# +# Copyright (c) 2004-2012, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + + +# TBD - document and test +proc twapi::get_active_console_tssession {} { + return [WTSGetActiveConsoleSessionId] +} + +proc twapi::get_current_window_station_handle {} { + return [GetProcessWindowStation] +} + +# Get the handle to a window station +proc twapi::get_window_station_handle {winsta args} { + array set opts [parseargs args { + inherit.bool + {access.arg generic_read} + } -nulldefault] + + set access_rights [_access_rights_to_mask $opts(access)] + + return [OpenWindowStation $winsta $opts(inherit) $access_rights] +} + + +# Close a window station handle +proc twapi::close_window_station_handle {hwinsta} { + # Trying to close our window station handle will generate an error + if {$hwinsta != [get_current_window_station_handle]} { + CloseWindowStation $hwinsta + } + return +} + +# List all window stations +proc twapi::find_window_stations {} { + return [EnumWindowStations] +} + + +# Enumerate desktops in a window station +proc twapi::find_desktops {args} { + array set opts [parseargs args {winsta.arg}] + + if {[info exists opts(winsta)]} { + set hwinsta [get_window_station_handle $opts(winsta)] + } else { + set hwinsta [get_current_window_station_handle] + } + + trap { + return [EnumDesktops $hwinsta] + } finally { + # Note close_window_station_handle protects against + # hwinsta being the current window station handle so + # we do not need to do that check here + close_window_station_handle $hwinsta + } +} + + +# Get the handle to a desktop +proc twapi::get_desktop_handle {desk args} { + array set opts [parseargs args { + inherit.bool + allowhooks.bool + {access.arg generic_read} + } -nulldefault] + + set access_mask [_access_rights_to_mask $opts(access)] + + # If certain access rights are specified, we must add certain other + # access rights. See OpenDesktop SDK docs + set access_rights [_access_mask_to_rights $access_mask] + if {"read_control" in $access_rights || + "write_dacl" in $access_rights || + "write_owner" in $access_rights} { + lappend access_rights desktop_readobject desktop_writeobjects + set access_mask [_access_rights_to_mask $opts(access)] + } + + return [OpenDesktop $desk $opts(allowhooks) $opts(inherit) $access_mask] +} + +# Close the desktop handle +proc twapi::close_desktop_handle {hdesk} { + CloseDesktop $hdesk +} + +# Set the process window station +proc twapi::set_process_window_station {hwinsta} { + SetProcessWindowStation $hwinsta +} + +proc twapi::get_desktop_user_sid {hdesk} { + return [GetUserObjectInformation $hdesk 4] +} + +proc twapi::get_window_station_user_sid {hwinsta} { + return [GetUserObjectInformation $hwinsta 4] +} + +proc twapi::get_desktop_name {hdesk} { + return [GetUserObjectInformation $hdesk 2] +} + +proc twapi::get_window_station_name {hwinsta} { + return [GetUserObjectInformation $hwinsta 2] +} diff --git a/src/punk86.vfs/lib/twapi4.7.2/wmi.tcl b/src/punk86.vfs/lib/twapi4.7.2/wmi.tcl new file mode 100644 index 00000000..e31debb4 --- /dev/null +++ b/src/punk86.vfs/lib/twapi4.7.2/wmi.tcl @@ -0,0 +1,223 @@ +# +# Copyright (c) 2012 Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +package require twapi_com + +# TBD - document? + +twapi::class create ::twapi::IMofCompilerProxy { + superclass ::twapi::IUnknownProxy + + constructor {args} { + if {[llength $args] == 0} { + set args [list [::twapi::com_create_instance "{6daf9757-2e37-11d2-aec9-00c04fb68820}" -interface IMofCompiler -raw]] + } + next {*}$args + } + + method CompileBuffer args { + my variable _ifc + return [::twapi::IMofCompiler_CompileBuffer $_ifc {*}$args] + } + + method CompileFile args { + my variable _ifc + return [::twapi::IMofCompiler_CompileFile $_ifc {*}$args] + } + + method CreateBMOF args { + my variable _ifc + return [::twapi::IMofCompiler_CreateBMOF $_ifc {*}$args] + } + + twapi_exportall +} + + +# +# Get WMI service - TBD document +proc twapi::wmi_root {args} { + array set opts [parseargs args { + {root.arg cimv2} + {impersonationlevel.arg impersonate {default anonymous identify delegate impersonate} } + } -maxleftover 0] + + # TBD - any injection attacks possible ? Need to quote ? + return [comobj_object "winmgmts:{impersonationLevel=$opts(impersonationlevel)}!//./root/$opts(root)"] +} +# Backwards compat +proc twapi::_wmi {{top cimv2}} { + return [wmi_root -root $top] +} + +# TBD - see if using ExecQuery would be faster if it supports all the options +proc twapi::wmi_collect_classes {swbemservices args} { + array set opts [parseargs args { + {ancestor.arg {}} + shallow + first + matchproperties.arg + matchsystemproperties.arg + matchqualifiers.arg + {collector.arg {lindex}} + } -maxleftover 0] + + + # Create a forward only enumerator for efficiency + # wbemFlagUseAmendedQualifiers | wbemFlagReturnImmediately | wbemFlagForwardOnly + set flags 0x20030 + if {$opts(shallow)} { + incr flags 1; # 0x1 -> wbemQueryFlagShallow + } + + set classes [$swbemservices SubclassesOf $opts(ancestor) $flags] + set matches {} + set delete_on_error {} + twapi::trap { + $classes -iterate class { + set matched 1 + foreach {opt fn} { + matchproperties Properties_ + matchsystemproperties SystemProperties_ + matchqualifiers Qualifiers_ + } { + if {[info exists opts($opt)]} { + foreach {name matcher} $opts($opt) { + if {[catch { + if {! [{*}$matcher [$class -with [list [list -get $fn] [list Item $name]] Value]]} { + set matched 0 + break; # Value does not match + } + } msg ]} { + # TBD - log debug error if not property found + # No such property or no access + set matched 0 + break + } + } + } + if {! $matched} { + # Already failed to match, no point continuing looping + break + } + } + + if {$matched} { + # Note collector code is responsible for disposing + # of $class as appropriate. But we take care of deleting + # when an error occurs after some accumulation has + # already occurred. + lappend delete_on_error $class + if {$opts(first)} { + return [{*}$opts(collector) $class] + } else { + lappend matches [{*}$opts(collector) $class] + } + } else { + $class destroy + } + } + } onerror {} { + foreach class $delete_on_error { + if {[comobj? $class]} { + $class destroy + } + } + rethrow + } finally { + $classes destroy + } + + return $matches +} + +proc twapi::wmi_extract_qualifier {qual} { + foreach prop {name value isamended propagatestoinstance propagatestosubclass isoverridable} { + dict set result $prop [$qual -get $prop] + } + return $result +} + +proc twapi::wmi_extract_property {propobj} { + foreach prop {name value cimtype isarray islocal origin} { + dict set result $prop [$propobj -get $prop] + } + + $propobj -with Qualifiers_ -iterate -cleanup qual { + set rec [wmi_extract_qualifier $qual] + dict set result qualifiers [string tolower [dict get $rec name]] $rec + } + + return $result +} + +proc twapi::wmi_extract_systemproperty {propobj} { + # Separate from wmi_extract_property because system properties do not + # have Qualifiers_ + foreach prop {name value cimtype isarray islocal origin} { + dict set result $prop [$propobj -get $prop] + } + + return $result +} + + +proc twapi::wmi_extract_method {mobj} { + foreach prop {name origin} { + dict set result $prop [$mobj -get $prop] + } + + # The InParameters and OutParameters properties are SWBEMObjects + # the properties of which describe the parameters. + foreach inout {inparameters outparameters} { + set paramsobj [$mobj -get $inout] + if {[$paramsobj -isnull]} { + dict set result $inout {} + } else { + $paramsobj -with Properties_ -iterate -cleanup pobj { + set rec [wmi_extract_property $pobj] + dict set result $inout [string tolower [dict get $rec name]] $rec + } + } + } + + $mobj -with Qualifiers_ -iterate qual { + set rec [wmi_extract_qualifier $qual] + dict set result qualifiers [string tolower [dict get $rec name]] $rec + $qual destroy + } + + return $result +} + + +proc twapi::wmi_extract_class {obj} { + + set result [dict create] + + # Class qualifiers + $obj -with Qualifiers_ -iterate -cleanup qualobj { + set rec [wmi_extract_qualifier $qualobj] + dict set result qualifiers [string tolower [dict get $rec name]] $rec + } + + $obj -with Properties_ -iterate -cleanup propobj { + set rec [wmi_extract_property $propobj] + dict set result properties [string tolower [dict get $rec name]] $rec + } + + $obj -with SystemProperties_ -iterate -cleanup propobj { + set rec [wmi_extract_systemproperty $propobj] + dict set result systemproperties [string tolower [dict get $rec name]] $rec + } + + $obj -with Methods_ -iterate -cleanup mobj { + set rec [wmi_extract_method $mobj] + dict set result methods [string tolower [dict get $rec name]] $rec + } + + return $result +} diff --git a/src/punk86.vfs/main.tcl b/src/punk86.vfs/main.tcl new file mode 100644 index 00000000..dcfc10cc --- /dev/null +++ b/src/punk86.vfs/main.tcl @@ -0,0 +1,9 @@ + + package require starkit + starkit::startup + if {[llength $::argv]} { + package require app-shellspy + } else { + package require app-punk + } + diff --git a/src/tclkit86bi.vfs/bin/tk86.dll b/src/tclkit86bi.vfs/bin/tk86.dll new file mode 100644 index 0000000000000000000000000000000000000000..cbd7cd8b3c74ea8ed3e1c342b41f0a432d293e23 GIT binary patch literal 1777416 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 z z_^J(#muN>jmmU|@M5iDEz^Eh5ksTPRiM5wG{qA50#y7fb04Pr9in46Uxh((cX6sIv z!pl@SnjZt+MUY5Bo3~iB*Bor~*xuS(d->P!ZRC~9Dgpu*X6?<(`Qo223)`sXaYuis z5$yc|P%nm8AdjG4T?X|DPzFvk`+v_t?FOn+yv(BT!!g&i5M)lO+xO;J^;!7$RO)vWF^H?gjJMeOFdf3)z5>{dc2v)%W?D z%%_zqo!(#4WYFm2LdJ!F!G@h(DsZeyoBsv7;u2n@$r=tsWd>N(UN5_ci6z4)!meZw zX=ke+2F9Uaue+Ry>q)C`Z*oRBB>l8-2wuNa8B!UY*X#s!R<4V_DNzPTW2B|}R$EMS zLTM5C?<7ebVk*dI5h$xBm{daJC|f7wYd_2xj}H_mGA5M7lAv6$Ybc5({ZFB2zl`%J z>?xqS9xzoH3o*T9xuTVSqUt#foBzy}i!1&p5Dd9BG)?;p! zDB~u#53r=Ro-G@&hL=j+ zR)Q8%jfR=cSs5qt5wCS@#We)K{gCZ2WLC3NT-LwDRthg6sTdz1#f2-@c{hEdtn(}sn&D>?{y%GC? ziap{V9_}f=Zljm}9M3({k&~0^HUEwW0CJ4W%>G>R0Pr$-qzU#WTorJSx#A}#TRN%> zM>w2`fZ2IX@Fp8m=8yh_cofP1@SEn(XC@>aY-HnXRyVe^*?%=A-sg#6;hrdvnkL{L zzE1y7y4NSYog+4+2UmVU8d2>RV`BXswlTHF&fiEY&K<>$5{OSGXe(A-dhdKZf~x+D zHqepPu6^vY+Gvkae{1f1_%0NZZAEG_w|n&s!NYj8KYFGnf8d%GH9w{^g(ll z{tc!zdFUVCC3W?0&}IWYk(ekZc9wE>6%%Kb66Y2ZyNgdLo~jMx0-hprT4V+XJrm`m zqRUHRURU_DN>b!*@6JM;;|eJoO%Hrh?=xQ*SN=wsYK{!i=Tv z(jxO9APnsmdxqHy8g+o97Z`l4T1g3~-s7mMLkKFO*`QEw zYJX{4P5@)G#1Nb@W-^d#+&7_W-@NRX5ivu5jo_EroADZ%+Cg1Oe_wYH@Bv(HTXhid zPu>-e2$$LMI@{CIVL&27kNb)yL{0$~_PA=^vlJY1L9M~iU$u$o7Go;Sf8#25DiE&w zwya@t^fs&f>=}Tq`k2bj<^;m=`F&QWr}c9nU6uM{@Oh|xbgn**xg=4!et44|5*+K4 zHgxgjd@C@UnfkRQRhX|_MHWcXof9>l#&sn!Oxu@Y>3q${0OpVtl$|oepE``VSl8I1 zSQNHCI=GogDuu=d0-peB&jwf5GP!61zCZ$9tzB(k3vrXJ_1aO`sfws=**C54mq=6; zx;bJv^`|y8%sxY3|2CXR6@~WNVaX3m2eL3hU;THZ4F$@#k6tR-hYPg4hx(x9aW21Q zwpv7m5PzwHK16=59kKQ+3{l-K;p@0^#9x-*h0#;~t#fvT&*`Q7tg&mwa^g0yvlb%wr9~ovEim5#CAGXfy$2r;!v5B8IF8pY*srjbA7p z4IL?c;Z3MiC4K4kUMRx|9=8cU)A;VN zf0-F!C&7E2Wj%$Pg(J61}^*p;6I(r{;Y`c>*zq(oO4u&JhJS)?jE zxa6z|J^|dJpTW6~Nk{N)@Z8>xW3wj$DO7wB;UAF-Uu#m?ofp?R)f1`|=#+aFukHey zvNx~g*+fCP2q=YMUBglfz{f03tz*S5MK{~~{b zg|Ecu2yarVzT2C0M}04?Y4s+#jWHhZ1a>Lzs1hkZs2^}CH(F3rQf{u_PjtgAZQhq2_cC9D07?I+)u7Yf z{Ir+(C6)rZcTSu4+CWd;7B6NtzBzHPVPK25dR5h&R__$92RU^W52vly_XdjcYwF4z z?}&BtVq3fkev_q6NJn4&x+qs8zolGyBe$tS{*o@rip#o1)IWLHx+^Y71I~ zdtWtK?`Qlj0bomS+~S?R4Hz^3ZW;9FtzbN*RBbTFYgilPtxSx%lFiS99f**=i6^F| zEne57Dm29F)boEV^v?)+o=J^f!)krnAfz6kjx+waCGK@SqSqJ6wwC{YS294)cuWs} zHk4)oGteuUX!TqbTE*ipmpP=#?Vvw0q?TWR{mXBKLWUgM=$$|62M}k0Q%|c z)eM@yPC&k|#wPN=)Q{fHwq~O4KWLXGzl8wZ;!QSY7hRDZFw%D_hZ`MTHg;S$!9QID6tIe7W`c3}FM3X+n6Z1=57qHA zH>kK+i@~&d{+^`NcJqa|_47WXZ{q6&zUH&Q(kh%qD!}b|Zt%N#hNIO`0L5?Zry}rl z+7YYgRfB%*L8YNorlb@L7}x^%v;o~To-9a(C^wANiA z-l#}@SnN@|?)y{&Pi}!oQ*YOcH+k)(87-4$v{ueYRL)3x4U+E-1^M1kknarz`QA{F z?+pd{-cXS54F&n$P>}DysSrID-V@`;X?$zcb-kb@CRsgC(z#(h{QcTMc#iBq{lWN# zNWKJ9c(Ng+Oixe%nU(*<_=@l?n;SDg5r<9qGMD8($}Nn5E{FkS8Xu5K!7J_q9&nH# zW?}#WuM=FxXv1om{D6MCJv0;vP zdTr`^_#u5rb2Kc>{=vpzR0?OwKmhW`##jxh0mOter?W4M%VibI+ZF~sF~JRaWsTq+H*@};%^$;mQNJrmv^4c&*P=_^yTm#z_|a0m@^Hm6OSjf6 zlF_6Lbg@BmseaM&=%WKT;YS1ZZq2%4ojp4sEdMIPzZt&?RsWYrWbE*rpgg;oR1j~I#%ZNRf-pU0qj6YJ*6W7Q4hv5EG*GF8ZhIdreWE z=$pNVH*n~O^#t&K;^4s^Y7GY^K$Zb;#mPT&FOzgL;RsM#CE?=M!aP6oz)cV@c-a`em$2ru~TD*|MOm+ z@qU$3^ADCJ%US8Lcd%o-$4?ZzLkD&-x#HcRgcxwscY~UP(d1=hPy^vX{y#$=Oi{vm zv5```7E6Q;oXk?5nRH=jv&c6_*1S)(UJtZbR3Z-M9{ijo)JZ zUZz92^R=e|oE$8t92StV0Dsd?@GmTbzx4g^A8Ait+${vq&*)fSR{*=%TvtOW&spRV zx%<=ywEc0BoG!GE`FYd_T^j(?beS|07|M$sFotLvbOmE!<~@-AVgCPv{~7~pL_8)f zTRB{4-LXMQltXujx&rh>XOUQ>9zo~1)Z;qLQ8A)J{y6qT*`f-A&rEcLK3~lf6YXFV zZ5M=y`Wv$vwCJIEG~!K8v+YES@>&Wk;$`-N${l`RC&gSmgQypd|6wHyLqa3Zh zBeYKX-=LLwSGn`G_gy*?tukiZ95uTD-=gAYZJ#I;7bHt31@Hd zdxf$4dSsDQUE${tG-dT~SEiloj}_}s{oTbk)qiR6ZBuwT$^#8-aA&LD&mOivz(Q-utl+A38*^GkkebB;&o?uY($w4Fx|x7Nvw|+ZNrxE74nyFxxTbEc;4xJW?0SXA zC|wGGXo*I}fA%ip7$%X~er=4x>g;*ru@-uk#esLkD({j>@Gbti+eaBo5y3%xoHx4} z*GFKT1fK_knX@BY%oBM|zepvCAksVgoOjB0GtYUaZ4d7;R&Q7xRDGCLpm%ze;v7Kl zs>AK~YKACyIc#Xf-ro^SwYtQ7ky(OA&UU zrM&}AZE!)TRI#))m}- zHUT7uNi>e(xAq*Nm-)F7<%kXQ4*=zwqe+{;H&1K5MKXGqjsF6L<2jk&9t_?-hgC$} zJImC@fv}d`S!n+ny{F@G$^4h=>u6K7BEgUyJaGoRlV2hf`9KPAHV3OoHLeNoHR3t? zPQl~rp%(9I!o6YW#0h(N=s!Vg!~8vk=Cvp;-XcYN)*)4$x-7%Q=T-f!#io{rGtHRK zudPvn-`3ia`^0LiRG%G{EUVEkSgb6irsbI^e%{5^`2=an`g!18 zbtrfnlonu;aJ1qCFqX{rVXF^B*Ms~YM7Z6DpqLy`w5#1;yj1wgGw4Ac+T^-*Kjbrw z)LmB9UQqQmnpXz1eK2Ns);H982bG9z=kM00i@yG@x{t>mf zj0yu$sl{T^U^jBa{l4pYHfnD~@sn|L0>9FzW|`KxF^KO`S%D%FbvD)~)6{nnnbcTW z@tvLX&bn3{m0A+`E>)1Gl{sD55a{5e->v(PmZuvISp z>jmR`z-TC0YH~C?(CT!fei|{yJ7seuR5zO{)3!c5lhH%`Nv%D&B%7hK3$%{`ZFP8N z3g5${km%H>F{HZsdabT6VGxe0y40#-){(YE72C0PmG{(x(R6m2YNO@x6`H#=NZ71u z4t?M~nE`({!R zrW#OKAQbqOw*Whv*Xc_)FZoHulPf1z?U zL=~T_Bm4{GkvA)d{nmWj&y`c&tYy_bQ=wU*m(!bC;<;6+PW4hG;&_j*3J;7|u8MEi zp_p42hJ>=kBilN5^{SWov_8Ip7&9ag^U?SxV%RWcByTBlPXsf(Uz}FvFJtH1@k~H@ zChpeSME(oi!FF!0^KDlU_tbsZI6VC&S!hf(v8}^KUgoOH?C{ZdH(*cl{qADIr7mGX zF=4(XEa|m`hkCxszOaTSa<1njo+T0Vj3en1aTCuRFT=?wt>8o9j(?0oU=-uYS(wYx zJD#=^xfo-pa9)!4YQ6v5(E~8S_T{|$?!9G_)5lmmWikTi)Ra@Sm~M2mTGrJnM&`oVbw31)ip2sGq>h45QSd3GfU?d06Clm5X| z!9%wu=#znS!5`ZFG4;d!Vgwvfe$Bv=mXdyZOlqdSfYYlBgmu*XGL*Ss)V`1170#Pf z$Z-CPp7OQ&aX5$fGC~SCf?zU#g}P5(*`mdh!G&+R70iKJ4Mc4rlj~9(;5dohQXQNY z<=RmOja;saqg=6|G0OGu$Xu?=qg)e%-7S}HJd+oS0-v(^()J8uQ9dAL@dOsWGGNq` zot8W3HR6**Pzb)eMV`y{f>{mwB(9-vS-0Iw103cr@6ii0!H^j{rDd`-=>LfY%c15! zFww!e>0T;8`vN2w!+U2gA#aVasuV~wK^7`D8 zzfpc!otK#xZikgQpk)38Om`u^#R8o$&?RuJc?XyrFq_X@uM+wmv|>upN;QcRrbVn| z3P|MPi zCBXT62Dd+rKav9E5779M9jxGAvy3A{U4qBOH>2QJ)tHFjX*kfI5nqJQGqv>N83i1z z#n29Pifucu_z7I^-h>iwm$|oY_jaLsyVSkus_FEm_u$A-H!V4X&=(o5Hoq-v0TwWp z_2TQ!XW_HrJB|VoJ`op&J$xqK#NR>!0~GCNDj!7U-;Ua|AS$nc>$q6-37_I~zuJGP z^3(ohh4zoEkM@h=VNUtMXD26wuBy!!+QOzPX5|W_BzzQ=!t&Qyy+(nZ5DqDSf`z8q%V9lJ9=hR9ykPm{=FjxH z7RRhiBpM(UxY8#!i*472SA!tqLA_cU9qLv0c7OO6GFUH`_NSwGiHXGQAGm<4qkmxQ zB4U=ZSLJ1Hri!?CYo*L$OL_M0!XUs7H0IMFamx6L^n2$hc`D7 zD*(%->H3U@V(!nS_ysQAoOIonM0)#J7tWYthTe(m@QdAFr+k|4d*f%`bpzg2t0%4Z z?i!G+!uxJ`aI~Ng4V3hq?PE+?PzYOBd?Uvcc2#_W6<2=^EiCCroS0w977`RFl)vEv z%5Q*w9s1!hfQs~`^7E4ESDKRCpS%=sXix3A2itRx5}}c(jD&yz@AiD6J2(^-J^gNF zVgL z^EKzH6XnKNM_k3S{cqgU6Ec(6X+yY?Sy#rhb^L#u|M&3!ji9~C*)GpPYm)8qH})H= zS!lmA*;+kf)w~IX^_nvzubRJ=x%nYJt)I6$GHR8cly=0H^Y)i1^@z>dTWOU2w$58J zpn<^@(n19@S53jJYsg?N-1$3)w$mdwn%@JB!LQp44`>3jV`Oe~-^^ zco$WDfs&YXx9ii6^SXd|#53o8o;r_MKf*kp+FLm`7wz)dKEd~5KQKp9V9E{eblKda zyR*K+xMFy_8-_=T7-}mNp{?vh(N=b%XlsMD70;z!05TzqE^CCwQ{E+KYCygpm3>E` zk{V|WH1wmLv5^~50h^}~<+4ug2E-xEYufM*wpN<0lgIEcn#D@;nf}pqP+}?TAN3M< z%2@xXmu6!8!=g*$H>)S^(;xOqVpVVTs5{PnLu7&1v>77S+3xk}fMwJx`>I#iX>sA+ za6UL=wc5JM>-!Oz=$o2b0Rzm_S6TYJFY4!sc_#yD+s=Ihy&f<1jrG0yW&lVaAwP!G zVGgJv`4s$#8L8MeRg5IpJ$1&gGy>Z>f32x>k2;B_Mw^Dl--d~|Na1kbkIla7y&^Uv zyT=e>%j14wRYGW*Lnt%Wx+gfR0)MhibV*@8V7*Y-5mRT&b{wat}Awce{t1>m^3Xb4z`{dvM{T3pQxNrehhnw_tXTlw)<4P60o| zDpvby_{Y6UhyvaUn@6U#5m}R2_-!SN<2LXhp4cr#XVP-E&CWn!kKHbO1u}9FjM)wX zAHLt94`u|8^_Vf}31vGqroaC-k>c`AiJeugzejIj>Ly9cfE}>4oVjof9^es8MUR{K z^12@6>KXZIcD*gICUe^Y$S9V5LL2XT{2Y^!m(T?#(>-l&HREy}qZcmtqIB zyPO-9bI3eI4>&@(czwX@)0sEm9Pp8-;6|@+p-YnI`w@W^sCpOGNU!U>zT@22s+W~y zE$chd)l~HoNx&*Ecu%R|4qC_8s^63fzGzA8ks+pzSUYdLs$e?!9q?F`g`*Oyo*je5 zZui*GH2XBKg{DuRsA|{DI}#6*um2qfNwD;;Th+X-r=d(frdP+>n>TowH(V9dW2#~P z$|?6XuS-2AX%Y=k?EQ6A2O|{*C|;{>fa1041}L)M4N$yR-2iPU3{b$h0ScU@z(EFS z{6`D6vynv^5KtG}4>w4`fD>A(-L+NT>5nVLo4{>b1F^(l%XZ}oiTpTB8ylV|mC|=O zUQYX6+rzWTz*7^2M-;44LDS?J*jb$~f+M}`fnX&1O?{7}(B37AzFpkW4BWo(w6+m3EKZ+O6VBA|ggR!}A24i#h8GJMf<;m=;U_dgW-1b=hVqL>?aTky5dpDsD4IW@UZ^euRddo*QNv> zWw(Bc=nSImZ-lu^vobUp0UEiiTUq6ARFb#~=vev$DEMv!;T!)A1Z*)M0AU->m%`!j z{}Tj|TOHgIfp}T-+i;I(Z1VWmV3WQZ)j7E*;Q$$H$N!bUN&~mi1RM4Ddf$^*#I`5G z-%^tJk8BrG|xTNt1J zA9ZgZA6HfF|7Y5S253DgHc}su;0@Z83N6xWBds?>Cv*Z+sM3}c1JqmK_9|+n2}Hm) zFbOaYlSV*AMMXg63JMDHEl--H&*dql(iSRE9-Tv4NI}{ZX!Co2);?!uk{0#){r&O# z_4R6IpMCb(4{NWz_F8MNwf4%zOUT^8<5%Lqv#gZ7#}tXIkB7pso0i$?Ny<3$JY_m#zEqOr6GKMipsaJ)$)yK{L?7}4EqEud798Ey7H zmXnXe`=COGXJek#F$w;#R~dv;%adIa)6I}A62HR zsoLDzsWiXD4Q`=b9dQS*s#f>jdO^nlzUReva^q7qR>f-nBKq24z0+A(q^nl)X};FOqG-CtnX187W7@F-T)R@*=XmwcN|{>b;$}bs zU6O2qeKdbTxyFf!^sTB0yI&3wDDQ-n`NH{77|CmHiKCK8-=S}bue8>FZq@7)ryYmY z*9g?Z&mQV(yo_-Y-zNoQTDEvm_U9MLE_@Hft3P}6GY%IU6b{wlVtsbj_j0&+$t5{F z{Plkq;9&<%-|m|3bWIDp_G`MSEf^9y5!53ZSgS4p^dAEZtgBAeJ(14=ddW-BYNnz; zm>Z%=f*ke1X1Ro;6Z9;YEREYFi{ZXhH|qC_-Or>r zjRQ#<_{H6&{AC=LqXXCFjI=RhbVl0!F1$_lT^KX%g?3iJxf(YMFkNWaLL+S*xkVNI zD`z3@Q||`qb=H;ugLhu*@tScNsOF5ou}$8Y{jt>_)fER@~I#aG6r}Cs1 z3F~SZK&>qbjBMu=dCMLO`$$BSYH*nNI)Ycg-?}Ra3QU0sI5Y_S*sgXBY#!XnN5vQjkU=N?2gz{!tLyJ? za?iP*(7%SE{aR|n3c9*qfq5mLg(M4Cecfm0>K|O6KW#`2^Gb%hZ~FXC=v4>hoo}W$ zUIHi^%8Or7rNMF#MM9Z_9IIyDpxete|7yj>%n*M6&=7pLFy4L0T;6-WYN_wfEe9FN zoZb&qoTWTVr2({V|1O}HiZkAOit+abww<++y@~YQ`(wFImP3AGCiYw>NX3yNzXFYM9kCQ%|ICuzTlY>FM=| z5(7HGG=KEK;JNWQCt%1xH<7-_?Haq9j%Jr`9<)W|)>HZ(N1=B$K0&25>C58L>P|1S zl18Jcl~rqMt5%X9OMf*Ht?uzMI%SEbo~nAPwrUl9M*SSoMg-vt?y`(To^jVCch`F7TLUl}? zar<7gJFyzZNd%fb{KK{bvlh zS5cO4{O$In%600vny29Y2-(-f)7NP>WMiY#QHz(7*=Tch8J}<&cjq!jyNuHm&js;grr4Pg7ta!B(;YIRS&XF~ zZ@P?4{cqg`n>u8#c9GpqH9QF7?~HF)@sl`q>cj^M!lP2nf9JiOtq>MN_Aqt>Lhe|l z;Qj+FX@)H!+{_V+>43AOss6HdzsXhlVbchAQCX)TQ--@JTV@d@loKBLuycNHzBX3Q zKp=3FNxSVce+fgr3pswqspn+ZV+J+iTZlyba+fox>EJPu32s+Wgx_Y?1*c7SLI{LU zijZ-Z3*=j;whL`(g5H99#QB{zkJp2HJL*5Iw{FjGIai}D*H2(dvlaxFL5aFxrZh7b zVMk+?K9fBGLLfHCg=lq!5}BEBlZr)>kP*#jE5c>;ZSScjgc=NAu6+~S_&U$Q_;cFq zPPM`rWufiM=Il=}5f5x%;PRa9%l+1C*}jYg7Sx-!eJQgHsZDNJYPK&luJavOYAu}f z88Uid`FO2bZ_e&TH@v$u<9CKPo{?k4lQ&a>P>otnUTZlOW4z(cqgkf{J&W9ys#H>B z_2?&OWfFUe8@*DuTBZVP?a5w8L`BfB(9mMV1sx%349ZUbKvF^S9isAG$TI4EIKN+@ zVDF@%BCqZ9yx~c+!_!2b0;>t#Gmu}eM4_TUjf4JN5b&@i?9Be@QI!BYkRgh) z8}NEIb~F^JqYcrsSJW+78LRqhNMck^Cbo(#814>BGVQfgs{2A93U>_p()f+s$+dU& zA|@^R5TGma&nHRmmp*J~$;}NS9Cns$_uK#fNq-aG7ZCb@4N>2~QfR8ZR`D~YzPXtM zJBRc!PJQ$H|14DB+{qJsvJOnkZ?v?jZ=4P|r{uXRC>3gOKBp^oC+jR_oUBt=E)%l1 zGz=$XtdJ7T&C!58Z4q3cu~S59L(R<)g^gWCz>0Fa_>=e(uJ>m$TOq&3D$bnpMZ%0}N> z!N7$Gd9=X(GP$xv$J|a;W2V6}!-VYArXJ0XSqClPQuygo;DBUTIlYb93O0VuFzXEF zIG%n`_=f!tO77!y(jRDPlG|JI{C5HW!3S3MFr^2J?_d`t$E=+g@%uhak$0_d^P} zAt{U=&RJ|cwPMM~6%kf}`1-9E=r&eZ4%bWPkAN4o%`MMgau!4Cd zi-RWp-|N)@b8n#Qno$=V%V^*wI7cQtNfpeA6l zEQEKmgD*T?Ys`T}%|y0s6+|8Z^E6h99Jt2WJ)hJKo7}-q?3n2>p_j@ejya=7 zk)UrTU#OOLHxH7m$c~ylyof!}b;abL^gV8U?(*8cCKQVEr$FBu+@JFuH6mUpwXqS; z^OB?QlQ_ecDp!dc-8*|Rvham^AYo2ly!D5IFC0`P_C5MV;;sigoXLR?x(o-Sb&VdK zt@x7v3vz9K?6H8p=ULjlA z)>HC~^;hDR;aH(~Wh=qf$>fVd@#;`bd-6enm58NuWoj@LKz=*9}q) zjcSJc2d@8*od$Xb_sDgrh~w9^C`z(Drw^9|W;2$uV+E^97s^Q%R8^nOS9N8ssz&5_ zC-qo0DOb(Se3nSvp)puB*I6~@QBgr}sB9ZO&z|V2LHnS<_I48EdUF!haCeFWip6kk z;Uv@)3-#gFz9J{jC3XFA5JOhFAswuVo+y2erCVtqNI6S)+1|SK>zb6=z`CY%Z~H$b z4~?edhTy3)79kf2ZAKB?0 ziKRBgs=BKE#<}tIsf%JrvK9F0P2w)7>`dT0gmC@%c$XoLT2KFja#vDCA$o4x-hJX9z6>2Y%h#X~)ctfR<6Jz%j> z53#gjqn441D>iDu{^agQ>Y+*Tw*Sz?7E8d}+=i)us5kQ&Iro|-fW$+Uo#dn~h!z_- zo1NGG!D4d0SZ`XCb4d@5ym3A`=uKoL^KuhmFY=Z*EBA}8z;3@w1>slAMm-AG^p6vABy3^ps!PZwjev~=6@en zsQbuh*i0=L+F*|-<3WP#Vbp-V#5{%3tVc2Af-l`uPj&DmUfa8}rc0O1{;d~Y@(m(E zDv40#95!fj9N&)q`YioDmOo{SWRW=fV%ZOlzPL1=vf6lPSSZuQ1`Hf%bd~-*o;~#` z*f5NXR$fZrkgwAiCCt!msm#P%^vq4tkJytKBdrq(V z1gbt&yQD@nbdj8gT}A^YVpN0i%j;Bg&RBA`k)uFP&xbuJqbK@Yj$Cu&yishZ`q#;- z->0@KXw6rpS*w4dlJfL#*rBgpQ{iXz=P9)?PL)jI52q{^#Lt5ComA?zb};y~dELM~ zA|MrIVny%8Z;WTAcH0z=(BJ1uP%deA7;8rEvQzl`X6}q2q&Jv4I(mbtqqZVmIeLT2RP+mSiM})-FX`_}{-#O7`?UR7 z#!OgawNQ#fx-~(Z71133SG)^lCVvsTY_M4T4R$t2c_&Z#H=;t5eFzv}Yxv?)e+0$t zxnQZ2Em!cI{8^|!*uF?KwnnBNGL0wl1Lq1K{WXjx`;3NQhpCToqY2J9=!u-JP}U0f z6-_!T1o^;@J)dN$_{_zfJ$C%m{ttqV01j<7}gGsJj6!J7tI}(b)cBIEtCSTmw_GC0Q zrn33V+@`MHN7hxZU-GADYGh^a{qY5-l`Ur*fce@5W4}lZ;=UaBPG5TJS5 zwOFOT_Vqlx*A!P$S5d%3$(e_(?{d39oCBZi$R`c~0*EH8x4w9FpV#^*v)D3ag4eb} zv!7YSwq=GEFFqcYWO$uc^ygL-ZMrUVu1o(!R5cnj$PM)BQ(NbflfboUQ;|H(9raY! za@lZJNW)sz(dz7FbO0pmzxdEh@xRlF{%8tsqU4IQgQ~)_@?XO^Ks;@4kD&p4Z2XCcB`U;(qH!iYc ziV|g}o{kRm;H?*ipJUihXCFCDT#A%BLxKxByA=f&Z2Beza>x3xqM7m?Gld!*bj=*X zD+=%c!+lU(uhx55T#t~uA7>uP}JsdsEmJe}P% zQ%C(=6j9^egY!d;6Sx@n3*rKk%hfwL*&P5JaE;~3m+`Ta51o6dY>(XYp!4@Dwr}Bx zLJUwRzd7rz#}J*+3^F5Ty;WCzlf~u%4;FJC`CuQ-VFsmn;eI8^lxYWRNno4gwQ{>y zuv;M)wU_aP_#{lD^e{c8C;#;q(gh%huO(X%F#*&Xmr+J_4~`={Vt1y)Gh8SJMV2j^ zekj#KUgABVGCGGj1cQKK-ZH7&Y6&n8qRB}jN{~pxEfx7@|MoNs##VgbhIF~I%P?km4z{bHh zq)`kg7Ey!q8W75{^$7#>s}18m?Q{}aATlN2KSS}YK4z`jg_rDZs)32;cp%Fuf!9jl zqX6IPQkz8;LAzxscE8>qm_4N1H~FxiO5gO(6=SOvD?+$gz-Z-T<13S`og!GUuHRl_!yPFu^b*FJ+9yS5dlx`36KX~(}(woYj79PdM= zaKdTxtoi`0smKgQUIefRU)laT&^UuVNL}?Buk{$ZWpl6x?VEoDPYh$Vd2=&f4ask` zy}m`AvXU~wV`1gz!&~;>f`G_mFekPK{PUn2pw=t#d<;W zZcF()RhxxcfQ@9AyJOog=`PAXQFi>cou|@uWu-+J zFt$z?Z;-RsLw%<+*Bn1ee@yNW;iTC<{}5Xd!EF)v^1y9U1}0Jbp`3eoisv7->UpYn zFKbBE@Q5=>JUi*I(xTKV|3&pZ*FL?}u9xfOcF%fgmv#m6J_0eH_!HDk^Ou>JNWE&I zqo98elRMzI=io7f-y!a;@jDak_o2!fei3C_E5TtUuC2uQMu{6L7m)}T1ZF!Mi7}pE z5Oyxg&=h@jJj}l>h;1NbfYoUWyJ}ed4*ZL5fok7LV$zcV;zi9HC?}~L0KKPEZHU?T z-IT{{nW}^GtZ+whq#>wZ+IbF%9GirJ>8#QezF=h~4X`I|_@|UjK8qBysz~D; zAHD$4lb6+Fx4l`Zy_f?1S&Ua2@yKhxfTVdQrCzrjBGuHfA(bIsb5w^&S^gdzgtmZs ze-z*6=QEM{Mp^aSTp!P9YEy5<4!vFsl-Kq$f9Zug8c6ONW;ik5a-_($$A$LT57RV3Kt(lpIN)SLHeWk5T%;dZbnu@xgftjvhwW4WMBr-EB8!D>U8s~ko6uL=y zI0=AA+=qtBn%dN+T>M-FLUx)5N@xzcON%Zp6n&7ptsZaZRrbO|ENbVm+QIr3UzB`3 zf~a&hF+AQ#?gNI>-&eow_{^pf@tEbw2L%Bxy%m!#(6~!t%1&opl#P&}MT);8vSr;8 zwYUHW1qX)F&L4E`;!$rBQ&!FSKQlCcW0ymNjPoy#S9djjC|+&xe(mJ#TR#erXCfc1 z7Wom@%W+ey0O2si{&6Ap@09%V4MLIFKjWH(oF^~V$er^Dv!pPI>AO2e6yyzC`!<$FbBQUqT+ShxMt za7iuOn23+z&XuBO=axN34gbklvd~}E2_)**EdMefLx)0wYD>>wuf0A;|B??*0XrBs zw#E4!ru8Fq2JEr**7WUwlnXzRiHfp+9T9ZhOYWfY9DcmaLp($a>p?e-X-a0%4N>Vb z9gF4=?q`28f9+|)p4`D$8EX=jH_B zRR6#0FSqMxg}g6Eg`Tc`p4C)x z^7p->%*cxq#MGVD^#ZJ#W2*2%3ZjOY7+~AmA$$?+GbV|*?_p4OWR}~B@@=vWMG=8A zizN)x8NwfDPr=ksOcdT(2-X7;ZjxN&Evw`SW?}MewRroGhEDxyri^N8iq10QnknQ_ zVgk`nz0bAr>|s!#Kr^>IUtKnX-wtAxu=0VGLE#ucapo?iL;EfAd+K&lC~b z+07pE2aO++owitTAT(MCdY=6qUOSF&1X-ZP!kt01Sm&)V={5=7%h32HoZIZ%Tw-W< z2y6BrkXmA&Ip))o9x&?+~`Z)0!_H2albpg>y8LJQYxsCQm{S!eIcEB2X) zyKJ+4UZd|FzX_%!Qg7SoK0sp>GT+>jol5)?rra;3LPIAC`G2sFTWGN8K=C>2e=D%s z1{PY6{Neg=4+}ahcq4P}%szNK*ETw)F)VydL1E*0_2O{m`y1{>JY6#pWiNLB+&AkI zIsV)FgWX5Tbjse}ESRLhgB6JJsM5`KiDNq#Dl{d+@HE*^N`_rWzB{<{&bnU5ddlpC zQvmUh3Xl7o(bOIeWU@aiJ(OyR)<9eWSQxnvYU(pfx>td&JMAvm*(G?F>3f?*o zlyaTkgIWl<9kDU0#_?4a<+h7_K^f8nz1 zr>ro9f2!A}EhH{K$-vIcJIi*%vvAtdOxn2K^v)s}PS}UHywNRoAnT33W)>ahxkK|i z@WqMD;Z*++x{%{{37kI6#FcKGHBQIzs`%AdOTC^*ShxWw3Gk5!kV{476czW_#9bx#mGEMUPTP=YZ zpHztgVH(W%scO%Z>!;vs#l=|z7lQC{IsV4I`1|qW#vZuCZKnh11H_LTI$nSB0ms`` zW}gF^!uWB?egEmT?b3AZ54az{Pep4ezDD;&7WtE{&S6SQ*uJ16XMZtYXJvUi!Egu9 z>qAy({`wKPw7mslJNwx|L~1KbO^_jI#bSTb+vs=t)EZpA;?Z4Q zh$I|j6p=KZl}+P#nN9&aNQ(tX{h8N8cJQCr4)NLDv1f5RbA0Y zXH|DBvL&jXQ@O@+27meNXH*~Z@=fPc0M5e5{F3@;=F+_i%MW2*6G>#wFN=5mwKyJm zBA)qXnOHGNbKHi+){@9XD>ygI-ZECo81_x^eNSgU$dF8V_jIL;o+&;oTHUo|Y}$-GGH33S zn(V4Z_0h@!=|cqV8>iw?3jCcqWdbMQ=v|o;J*SeID`ud}#i;ea3X6fBcyr3G?(Kk+%`p;*V zkEMPr?C_tp9Up$3@}*4;{4MiZb#Fz?b=?2H6{r!C+T<{!QTmrt`Pik*x`4t>Xd?AY za@$@pziszv@w%^kIWV4-857A_{0Fs9;X~J7tdu^YE+*(Ab3qh{SY+*n{s3tIPPt&2 z_*YRE>$#ABPj1Jg>eBjH`bXm2VODX)muhHwX2M71sd~Q-?YWjantWkjRG#CM*|x9N ztJ@ZWv`MYj))lTn^>+lFQoluv#XntNkPNX<4B;+I#UbX@&K*gG$QfEP`-fSY2gMl)d znKSIf+0c?q7tcDG5@C%$urv3OhFdCe5 z7~OPaG_!c%{<(AJ%t`g__EUXb{YO@HXNtdAz1nL%f}t4puA#Ug^s=>Nfo#Had19Wx zMEh~AeZvpUJ|EaBNR1NxxxDg(pm_COZ6jM77aF@czQxS&Fj zim=PyL}nuMUr^%~xFFZtJ|?fxvvg!+SI*Fn|9%J3BWG? z_*YTi1sz~(tZG|ob=T`hMpkdwhfzlkh^Y-#U76y#s@18TL|mtfu~hbtcl`R-b<+kksF*&IyT!6H;OnxBg)jo>?R(z@Q|mdCNhZ1RG&8Wua9tXRtLy&=Co zhtP9mi;Z=u$IKXZ0Xm=cikvP|{&SIXgiNpXo6K-L{pruN$)G+_8Aq3im=%i?f+IAh zhip+O1~rV?tvjFBQ>qU&COw(rwH?cI`W`KM2;|hrF4kncA6lg)O3n$@yS>vzrZptp zy=jCV%+Yp$X1vUfOisf6GN)=d+EE|JJy9aJ9Yp$ga=SsK-@uU>i6263QP&HIXyZ75 zCUYWIKH~${E1AWS zGbcsrB3->7$j`s1vc|ZfuDZ*Hi9p`ngbIjm&4K{XdsUrCnaN5lvL@Bftel`|QT-eG zlLNz3cBJC9e~BTusQNkwjit|67~=?GVl35Dn>lq~a_ukzyhk%N#b5xq;?!mg`3$!S zzchZ(Cfp|L8NPcDEBE)j)`^S+2COuukJTM2B2v|fphweTB2p81JIvljlm0>Qn9G?M z?ZziWy}GW{8ZCg~d|TbOq%_r6)o-29yvd55xEaP`WlmV7uYkgY;x&Q9K|1!?()^B$ zfpC(p@rgDMK}U8_$J3{YnK4t?V^6sJ=sGdd;ry6s$kTP=r?2QAQBRG-C%-y`k? z#5-ubq*>Y3C%z?Tot`KPi+F;2=&XT+a5mgzZuCmI(-V?+zG*y6W&iT-)OZsKc&K z_{ZDhCQe*Tn~660f4@D>-%e+>zxdhj;cV}3hP(yOZ};$g7!oMk;kDxmw?ih7p$j*s z+MXCq_C{ij_ox=1I~0Is654E9BgTa5^4O+QaqB8{%;udD8C`U{^sZ0u}2Ubo5S>B&F%IuU&B z5Dd3?ef`gTEb4>|_{+IVa{OibDw8tST&0ioFP?6_^Ze>~}ZBH&a4cRiD?1mM85h=g>K=35!BQZ#b$6ZT@sa3Euf17G!aVyP9i<+Bj5Je!-!n6R`5yxL~xTQb(@3N z*38tR#&5+km+YIwzQ6R)-nboW-e!f{LcACet=>g|i7iwF%Y`{DQ&Tp*-?=KzOdsyl z`xYAJxk5r;|L))A#@E_zzg6%cD zpy}J6phS2?5xNhKj0#zi5c9_Shr>sf)3tRGpios z-iFnY>U$01b*Vi|J|%^;W~eUnEsj29Od5~$pO!8jm%S=&*#Cq-jgM*65i2Jx>}%lt502|>FE61Eqc;}7w~ zf(cKmrZ>w|^QulN3OqG+kZCbW-bvV9OFOf}zbBA+Z8a1kic2jV?VxLv7PRYJ$&Tc7 z)^xDlt#lfh>Et3lNu(}YMEo0lEyj42n(9B#TXqwPw6Ta}w{|mpdWe!&3|hd`IJsR2 z5lwZoDWdIb{A{4P5NX|yIxlYyXE6BmfQ--=lG$NWh+S2c>q1_Vh#-WabriW~lXH|m z)-7`VrTr@p5kTP4c?7toqr9X1Ai$3%bI*YQ;@uDuZ(*Gt4EReq~zKIxxF#8cpDI+~;zW0>h~M=X7pBsu@NKptLWvv(d}`Ew|V{@2F#hc)2y7#5Fv zuUh@ddOrxClYi%a7y-@hhdJcCpu*lrB6U{{_((Oo2i zC1BB-t3^)qk4s^M^g*&FNUphB3o^*m2~<&0O$|jG^10`Q$<);slJwezfrS^sTzD}T z!hASS?+UJlxn4!n#qWPLjMn%5*TbxbVEwb#!#szmFO{cQ*jri!lXpn!@b7Og9Kdn* z0N2CZ*<@S5(I3|q;11V9S5o^e@FzB|Y5x-#*nNRn?0>5Sb<`taRgbzq2K(}>Tzw92Q$>M)a>eNK))R@;k8xd~EdCfO_M?kWy zC4GuaH&ETb^m$ZdHE8wmqeWYG21>^hXyA7CXic3iLi-Ud$5LjAs$0*#!DA||O)8$e zOlBenlT0VKsWcX6LKf`;OTE?>`Y=7yShSC&@x$HtFnOsX$jTHSkMkhv<9G)DKXgUOD@Nl`4}UcQ)~l@ecs=9}7s9K@ifF{G&-mbzkMMK^-YReox4xvWZ{-W% zYeT`lYhTr-A4Yb$K2?+XetkNdKG`q}I#xfDPU)60EhkcRPtfq%bn1#c%-O|?i2ZaU z>F5ONOL67|u_NI(02!((FtHtCTI(N0C4%~YQ6*4+Szra~niM`9_2>jnywX{6c`8}W zlVecDkxuAD=Maso&>yUcwStGVFN%5=T>xWXlnf8OWj^JELQ5`)W)|)>%iVZ#Rb(bw zcuv7yfj@pbzh04&I1iHtteuDLG&7|{=Hv>NQg#^{M3&cwf^)DUA6=i@uiwr}mU<(e z+Sl~(5QOvBG2)!O#Hef+&6#|ShH&aqxfKFLi`RNJ&#{zIcDvfGIR3o_ z@8bpaZ6kk3eb%q-)|Y&J8ri)lbPDRVu{}e%u>ZO{PV{p+8}WN??%s4$%@H4=-JQ8v zX5?zKJ!eA8vR&^En$6??$`qQmIQuD*0VVOfX{5luAUfAYsF{-fy+~TB@0csK^pFQ5 zoiPHRF8eA^XyHjO>5o;f^_G2(j68mU!Q?K1rg4PDI<3vj8&;cornag(ni)B)w(Uud zu{I!DiiAe1yDvX!&6R3L|HRRJ0*>O~MUZH=dbnRZ)qrKjSHZ+^D<*A<#Z-?Xf8m!< zTfKH^Gx~*ZPsudzow;D^X_?}uqp5whRgceHuzqIbt-9S$pO$HOy0i`zW(UGw8CRiq zmcBWi1FzElndl{YnSe;Fs>ks+EX07n=|X{~IPa{+=!SPi9YBx#UQ24%+_sQIQ^b>*~V!I&vFX$&s!{CyoQVrT_j9(|@CnK6cW&Q_^E-kr8UD zq05g|@mIItaUuGML}tum46VqH#rr_{vc%zi8~P(XZBM2Q*u>}O zLtOLLUi!hN(XN2qD0h14rNbIOxW?v!5=Al`urI6=GGQ;9QJUN*N8-`3Cra^=qmOhQEKzrg}@lM{0U>$=x@WC(#&+7&P~m0)7zT$Noo!p*PNPI>g)t(C;Y@3 zIn>Y*_YXcgSi61>#WT}Uu6LHIq8NX4STj}F73t$#Fe9g?)LXr!_-C0^ep06RGi_U& z4^3@}RrN)|s?%4%GZ8;7GiFV4#jxxzUKnB8aK7HM^pRMaZluqKf18Pzn2?-)GcW*? zYMbNLx0h16*XrzBxnWmo;_qF<`}a9ToxoV0j8?6H00FX>Q&98Oi%q~49D_HKArhlr+@u6j*pwJVxFOPQ%sH~(7mW^=|_%pPi))K%4$ zTD$v25%*!4;+jnHjHull;q@YBxK5WI&$$jpw2w{|c&vAMPH=oHR^Xy$|F<9K`Ye$xMr? zslg!*y1eT!{R(VIWC<5dU!^fekGV=?j&!Ob|Lb}Y1~~XK4;OUo-a znWjMz4?fZ!#xcO?-@+KIXWlI0K^F;xn251OJF|V6u%tXVtf)L>TBaZye4j*J`lrUW zgb@#tHZ74QGeDAQ!%+qvFyO&=Xn((e2f^^1uC|O7Q{A_8#iVuqwKM}2F5ssI+Yi-S z1dV8Nxqw5zu^xH~$1<<|6Kq;_$>r)Fv|wsD4;jOr7GIC z&h%n`DReTV6b1Syu#f`oX&Xw|@fWZlaC^Z>T33?rPM(_R@o;Sp?kI_-f1vTjS(9)d z!?E-8S{JZwadzlTFr?INA7e!V+hm#%QKuQNHOuI+(Jre^FHSeXt-SnoQySoK;X3S3eXP)P6&nrb+tBaiYCO*{R0{RJjEFpP4~ip27+e*mCOwE zpV+SW*>!DBlj;m5R0P}dpVPW5d6lCI5Z)X$ zm@llhr)~ZY^m#*8sauA%bk;{T4|y*C^xj#7sw~L;egH9~1In4JadTwj%`6vlvKk$lKSivBEP=1 zI*Ti15y?TJ=2EVa2F+P|6|00+1sV0OEV8;QFh5ry$XJ;DBS;{iw2ok8ww{n;ML*cg zg>SeHACBwrIAGNH0aQ7kKPNnSGDkG6GK~J@LM+!|eA2Z3LRGJ6>unnT`B@s(6Ljbi zR=EESdPN1H!&=Fihb#QcI>W27XjV`~3xhKJ9(rDJ4Dor+~VC2SAliu8mjK zw^)UNOKXW_nY8nh=Op}QeU}5ZEbt7vZc*~FO!0!8+pQWEG57|zdwccG+CCn#=(5?F zU?FSH6hhWM16b|rN}fPI8@%2{0sMnR_(J*^c1>>vmGuv&SoC3P8t~_fsDr0=I0Ie{ z#nUz00l`-R0m%J604rF0KcuuRK9-(Yh4Pg@BY^i1`g;xYFMn2{gW_k_@QZOu>%SIH z0V@_6RMkTsAfdMuZhP{r>up2-B6-|M&45+~F7f zL{qNQub4NxGrSzS)Bi3Dok`k18pV}M2@XKdyVY|X^G`Nn9YmtgQB8<%|K$80za~Gw z{a#XscR-u@-Dfu-g!)v_X`D!!gDXzXpdRu-)F^y*2PYx^?FIbgPyX0d4i7B>Ol?GQ``vjE7x@Q~)mHPRnpUSQvE7=X`j+y?n9>Gv@0T25I!z z*DrEu7zGG!Qts6Lv0ue##**QE#JtPaR}hTtaYv8z9M|*j^UqWC{C)R4NFO(m(-mBu z36PMF>A!;T(FEB?qXTrg*yG1@WPTUK5|jav9k3shl-dbZ))&DkqKf4FPXqjja=;2I z6yt8Vy3{_uo$@o&j73o-%+T(;8em~{5l+prOCPoiLR8Ax-Nj({lVP-Ld8_C`0NB8@ z1)g-tyR)5%ol`5g+Zys0o>8K}#7^`D-otb>3%aAJKSz@MDOn8d%wGR2j8~D7y_!OO-`t!9$`#u?scG<~ z1YmRaf4CQ8Mq?>CLh9 z0$u&)UG*MKCfDLJyb!St%eVw3Ny*KaHwkPCoE;p8&!?im@riJg?f;rn;M}5?1{uMf z^IxoI=L^P#+lzoDhZS}*4%5Q;;@T4j5Y9xY(S(Nt*R zKTv$I#Wzv#ydr-k?_HJZoWD!OjiDLY=|IX-U#OB)abc=E`;#vVz^l!6&GzGv+NYBm z9_=@^8v85{H|!dlN|`+WLOpOGauGdtQc8|q4&wLC{_W1nn`zJNqMxW!913n(A#RQQ zVVwQjSAhQx%+e~h(!mxg6!cPR9tY%to5Ce`{>o&-U%5+~o_GY-!utG}pqxL{Tc* zZLT4am2yQQo3m@%nO%Q29hP02U3!;*$SqfY*dqw=;f$h8Qg-`YsyC?hX;-Ui>vtA) zzvmpZ>RHTyRu%QOvXlJoG}{AS8yE>XnduuR4TI+AitP*G)}vSSuT_JoM~LGaOReHo zU9bIb%1M`ejXF-sj6`EAVjxwjYC`q2CR2+uGcNdzR~Of1W)73?U}WV?2Af<}tcTf^ zP`-qCFT8tJmSx{+V7{y0ZhA7Fe5i5@%@#GDfTin_I{$vmN}#?NVFe6*Sz!Gd*q&fpz3Kwm?+s<2ftX+dj{8BJ-v&7qpk<}h|Mk&eFes6Br$K+UurQOewnj)a%*)s_hRiw|Pn5_rz z9Wc^kcC#}twEoMNImZuru*g9Oqt{`&O><=Myke!mJ7|V*^pg!^+nrFL-c8IGz1Q+J z8ucUzS;~2>Yf0twtD5r=g$|%xJpxDu7!JZ;eyZ57%L%m;AiBc;S_^?7k*g|zH3Jz( zYk_VReJU22!U1fx<*k2=fPkSsumUD@V-QC3vLXB7gZ6TZ^6bh6f!I9!#rY5V$RYEr z5+O61W{sY{_M9SwM$;#R_J2U8lUKAYz@wDJ;o2@KMrdFRcZl?nL^024(eIHv3^(s5 zk-kU5>!fv)I_VzsBgDExSv)S%W6iGBk)}iCpBnetqynunQ%YvF%Gs4dgU$nAkd`lu z*egws((@0|$3VrTxFE2W zgSR-GiA;@KZivs>Pat;r*YSbSn{}c1R*4K<%HED%mNAqz&Q%XB?pLIT7!EunU#&^) zY#a~t7o|3I`A0@J1co^?Nl?t+3Dom|>%A+-%_XPM{m^1`r7s2;ipHj~eZ z{yi$;g6kN5z!u(WS(12(utVDM?6&x2X+q;zHjO^X?;h*|hI{WOPw&>yD-| zz5k6f5eg!@r&r`Po*DJ-du(7cCsr>x~}OJc8Sp^RAQ^Cll_oi(#c!jNCp=6qW5lPJvAun zCwcyf_7`|??Q%`J zjx(Fp4cw!AeJq8k=<1f*)ElU|8;{V(*1AtCeAy4PLf2gr#4U)#@c(b{+WsAYs4Tq* z+RBt~q-<~ss?N{Smah37v|-R8*AM?&RDr%GUGl@)!6055Fi3Wi-}`{9ZVT{h$bJt2 zv;Cf5Y#UCasziDc>(Q=2XcSwn-~ibBxNhpGCR2VsEkwDdZJ1yOyRLIJZsP8-N`|xd z@shMFJjaH0GsQp+90R@9ObJXt5gsBh$Pd64|3j4>;7jNRAJ|nSuu-eWxMB@QT6$|p zB&1EZ>AHiu%(4!^1JRxQ%Y$Vb^ssVO`gS2F{}QQtD_fM8LP|)t^^v95cL%SP*3PPb zO7{e5){lCVZWGgp_@XPtaH;`l=M$-vZvpsmD^xq27?}cgV7YXB& zS4-U|I+4^reNtACmY&t}`J_{yEZ39jk+{^Xp~>cCIRLc{nS)TE8ZJ+Q0ia%kdIpM* z?771vKx?jo;AgmUT1SRU`9-LHb|5G;{*cNYoFzaF$r8MVWM%iy>f1l7fB!5ylPzrV zhDr@yoe@Cfg7#tBYWgta8|b*P@D*Loe;6PIZkys@p$`k=DZ`d19*LP*1d)wIQ*(;U ztOD`hnN{e>VtzW}UZ+McJ;b0YI6LNz)-V!fIo?ic&~og6wHI#c0vFGer0H4BT&=D= zNZCz##eKrTtD4K1HRTOQ52l~iO5qOWZ{|m0f~JEqx9O1~kC~a7p&89KnMmZd)fuOR zqiR8ci7GHVC@?N4;HHc49X|$Hs3opK#|4Fk+xEi2$QG(`R+!_jwLWtt8Cr49ko5-G zZ{sJqhYPN6qnhPB6va1g`=8Myyw=~jA{uIHy*v)qZ+K_-Gq8G>|4&Q>+KQNh+mm2p zGv5_8HUYCLiOaE&fvpd^To+_d z*?OCqc9TB05^etjQm}4C@u;6F9;&qUtfqy#Uh5^U17KAU-`43bA25oR8Ff2#VG^W5 znQ2`-FjqO1CIc~U$ZjNoOUmrA_blnFNI{JCRUrle_VZvTL1 z%OQl5#o7rzEHmzuEmcNyLW}rs2+SwiqTre)8E}fP4SF0g5zr{;898rgDdAD zK6dbYxD)3PFo2=RBHfF?WZVT{j8aixfs()l?H@tS;;tTm#wOAqjNX5r%~v-C8LrPb zqXXB~97HLE1XhV75YRsf*8;mT0QaSQ9|GU->RYNuJf>5yQXhtU#pH=sarF>7ibb)@ z6)5)FbeLv+9d)U|984wibDcdF=${WXS^jBMX86sA!d3Ib5R>kZ-#;Hv+k5NF7U;JI z{=6;T;f5D(PT-#(=vVtegF=#m2Em6_yjBhqTEXa%bxQ1uO!?P#hlt@HhMP%n-jM7+ z=zc&53`11jM7aRj)onNGN0phGwpTx4;}zU>QqXu#a`flhXj;^K`XQquyPwCt<#IbZ zVreupFLa!mnkw)+Y+Rh@N1zF!ebpz|e0w%&QN`+$Sc}+c2*Z6Nyv+=c1!jg^#diWEVVd}CZu4qTS$_0(wKmCIkGjTcn2)d)b;?3i= z&JfmxmXL8cj`^&qKWf;r(-VWCvu5}pP);u${$8W}O!*^}OQdJi2ljz{QGUm$(W+17 z)5~RrH&8yyvRut~@dc+Vs(iC9sTLa{ADXrjI?Q&}%(~mEwa5P_Y4~zl>2SS)3f^XP z*~nohAF}MWu!ji2STAJXX^aKgoB6+%)%h3x|C#@fqBz;Ye{Nc=Ck_{PYv958i2ksU z>mN5SLNW7>(~9)-c_*LA@r7#>bi3w+)llsU7NENas?~Z<=Z<_^7-Eas0gJ6v`ld{Y z#~Y04x+(PfE}^2?B*I!cz76S+johum#&hDSJ1hH`o_P8~n}NUl&G7FnK8&XiC2B}T zBArqNz^s9C$*xH9g}qJ1iF8ecnCJlnT>*WdW2_N~cR-LP;&q3$2Bxl>OHJ^vRj*F4 zT%ToOiKigkfY?-;Fwz27G0kdyhd306*iPL=Wg|>8E zxi$#<^6x_8%R?YBt%1+;>m{E4paaHt3>Y^!V01_DqYr^0qtv1B_`ARuI|LY^^dsxn zgLzj7C6Me|$BJgk2bf^PMKJ~l|4&;OXc9dZ`q>RLz;R$nV6Si%q_``8iqFHU-K;$B zaLMZ2B4`#|p){mgftDLDVBDIi>X&?|*j1Ouj&U@^wXL4x zlZJ=K3q!2SA(C7yx2a&J_0g|}d=$!g`E^!p0D~ap*4e}A{D(3p5dbBUI*8Y>>{{MK zRvD_mr4V?$dvuSEyqX}@z$~Eldkn+l3)D!UQ}2w^3&E>ljkbh9)HvJ zMs0wwi}T&#Hy;FnZ?xY1UsHw?MgJC+4YmvWV7d0r+(x=cBq}p%%A4v3`Y#ocql^DJ z?sccD;U>U=aryN-M~0FF>ms)STx*n`;a(o;2VuGR5BfiT3)3%toRW9iDkYD}fFx@# zP;5Ny2J&gFe~PcR1S`XKgZ0`Cc#|Xg7SA{+v4-J|cXkjle7-zK3h%d0 zUzr6(#KCdvJ=b*+B=Q+Di0FOI3Fsb^m(3^rp~hngFPcc-(gBN=U3Nr7Sk4*meCFSb z9RAEc!HKN%@1{IT!djwwa#OYU#()fC&>h`3Qwx_D2LsoVlVAW*^^J#f{k3SY(tCiN zHq3K?@HzcFoYM)XN|VVc=pI)r`MBMo_VhqUzj_GuORcb+XB-ys0cOJ$%*gYiE4+T1 zng1O#Pu3=7^$k2_;hZK8x^frw=X@uQ=HmBTwVVmvuCC!~^-uSK20u%K?gGw%r+U8| z*rN>A7fmsmbi^k=BM4tw4=cl6Y2Yu~AKCwEigm=E$Q=DiDq|xW=+KFlxFMYLj(j!( zqe3W}=yJF&F;K@*ir_$U7UQ@u;FsnXi-lSybq%vXpw;n@GtHTjwSC4=Y|E}Wl4E&& zhLDrYFKvSaOx>Z`e>cV#>a6T`;iw4m1p^y$( z6c##TVG9`efyq6>VBP!3kW3#Sa17Q5fNj~^v0pSaJClf-oR)IlugiY9n7}E)N(#tZAxzmv|Krt8x8Yte91AbRyT#Q47m7OTJ0 zp0!8Qr;Gd|87$~k0lWEa9B`0ia0Xc>B$_k{{OiaF3}KEz8oi){_*k)FO&O6m%}%(2df84H3)^-bRl4Z+QRI&GMoaWCl6!Tw)bJ1HhARRx*3ezHoifm zQ1mNPe(DYpkEg}n&DPE^E8r#Rfjf+_?lF15NBvL{bs+oftJ;PR3OQJj(SxYVaV!R( z{Adk65LhP3^g8%f<2Oleo zyyD7&VXsMA0a(>Y|c&CY7s-bL+v^r0as}|a@ zO_KQ9!t;akUn?rQVvqiM?O!2Z{ey~cd`*0k8<^vg^#Y5#%&1H4Re|CuEXPO&HmMji z{~NFHeW)^o;QyzdgZe_6KZiU=^Q}?VSRBni9|@Y$LCn(G>U{Z3GlSz=D_h7W5zgSa za0bVPGdM1s!ExaXa=G3%_m!JLbmu~iaGeApjiHZ%xYwShtg~!nMax3HHuX}i=-xw> z^?VlH_);v@72Wt^s!M(vvw`(&*%ZX08($W88?T+Tl`}#)Ox1E;giAbTFISALORXiI z_d0^0)FnGd9<}qRo@ivx!E0mOn;v=QD8DxH(!pz^shYpdtX|!;nUCw^Xs^^B^F4T` z|D90g!F0AwVmn9!6v_d!8hT#zV9WmuFUrI}kn9}c)vfK?Gu)ymIsIQ#S$fWx^w-A9 z=)h}x7S7+WB-GEQy1+H>*2fp`+SSeb-wb^pO?6Tr=H1%8_-{44R#8OW-%jx*N~Ngd z=t8_(S1taV|GRwG9;`S`W*{~G58%Z$x9X>VBn6fW>3+By9?_v0sM;Vz$dN0y`z1#k zK1tp(jx{LC8<&ruCYlvX-&T2z<|ny5;$1TrG=3}QEh(vIH)X3Xo92;#haR^rPk)%Y z1}ugxBy+u&IUD{o6PpsDhcSqk1cuqHtr|5GP=5#NHezMlWy@acJidVPM{&_T(kW~r*|KM*Z3#B z`+E54?#h;V_eoyZ#D9zPx)Hj&US{xrhVajmQZC$oq8oy9?%a3)aN+a5j5l zu{wh-<=v@EKBkv$HwD&{wgUI@FNFK4!gIduwT)ulgaK|I+I|F%S(Ok(C})ef74Pbl zsB@JjkQiUoAa{}OgFd3>5Qkej^X z{NzmA|LdP{7>Aw^r0o>aW-p#7 zq}`wu5+Z9irLrKaFJyg8MZst8el>)jyPkz)Yl@|ULVG-IXc5ihfBk04=<64U)^972 z`v0QE5Z3>i>VHZ_`4+DpsV%*^8(Eju8|vRi{ciQ;7ab~-aanz|Mg8x+_%q?6Luo(f z71gg7<2C}S?w*4vNRKFuM{0vU#ZY_h%9-goEVzT15$WA2Il*)M z9B2vt>e(Sn@M0#v4$?h%jn>F6TD06r)TCL~3$Clut9`gHh8Q4Pw-|psVg-@e_3C_YB6@Ic1=a&Z)V? zHAu}R%n8+8$`;|y|i9xRa8 z%4&;P50rpWyPIyp16J_aCHC2Ql~Xu$92b>lR}?NieGJC4O#6JV^$#{_Xm8+z($mZM zX-H46dJIwrc`l?~LN>!nM4e(Shqtfs!0JammL3Rc_Z% zT<1*r#ZTu52Di&aUSYJ+>b*_B*ESoMOMvSJnwBe`b7a2!R(1-FdX%;dB}#s-1Y1I# z`>8V>VXKdZ@+9L11F=Zm( zJb%p6a6Q^Dy2+@3P_EZ*+U4C>OsN7^h)gK5*r0md9xWcGNA#7g<=CAUPY#LkIuT;M zAuA^;CYk z&-_^3@DcQCWLe#UGsluBR-!_`pfD?ty)MAry(ca~de7nRi`0p^W5DOEGGOm*YEQ5v z)elTAL%j8uikETnmII&EWddVz+XznAvGKSDD0}V4iVI!PPiUa-r~Dcs>)n_3m2b-L*MC zc8BUMCu&wSeuwHOY3z;D!$l&br}|N+P(4ULegoXh8e#uNkQ|nTvwGN&SgP}29q5bs zhgUgvZOog|+2c2zBJ33f09YVb_cI_@2+sjow2Fk}VG2M+4=#8roNq8VgoG}hjJ#C+ zkO9tX`!|3CG750mS{%<;=TmvmRM18|eUpO_b3aRfX{J8FB|5uMHsK5NfEIWY(3?eq z5ZIVEU9dZOFzl{^NEX0u$;JD_?btv6 zL%1zd^f$22;D)!`%ZMw$u8PVB!wyLKYj{~O1OB(bOz1WTEZ zxRIPoNl->DI7D+D_C*9cI>P&-&svn8UeVUsTyo;{$|Z+R+M3#e?hpqsl)c~CM!!?t zF>r*yE`({#UP4$FZewIe=AbAuD{{;k71;&kDVS(wyb9gqidfZ(6B{ZQd8hLS9o=tr z3Gld6GGh+HNzCkNh)K9EyM$PEtBWTV0~EKyl%4gla$&;#4-EhwGm=2z`0;C&0)~L;i!2t z?}{2fEIvagl#*_?iouVwe~s_y)q&Z%|)3y;|2X(jd_$RAl?Lzve zv^u4KO5f;`mhKGF$vq?V>gIx1YYWo12Wju>%3}OE>2(pESQp>;;;!zb*LnzctXZV~ zvesg?WU#XVIe5%l)q9KHazvvawk}n;PH89#&7A!RwQyO5visihmVA0W`w$hpLnMlw z{Jx@y6cm|!i_3q4^t5*ERfPh*HygFmv3(a$6$gf_ZsPn4YNh-;DhoR%fuG<-$i+KN zE`ClN*)xm^nOK$xbFo#E{Q)7Hn^km&zINM%+hi!VQXO7N;t{(Z`fSr-@rfh1`bsD9 zXDcG_I7DuEM6ztU`bf=|w14cI7e^hNXiKNooAdgc38qha%6HVee(T*DwLa}}wkdT} zPfRaW9|u#>YFk@rdwNQby?EMcQF{s30Ny~V zf?7qZ_8H>^Z41F$e(%rT&s;*~oc{IWrJ23=v#)Efz4qE`ueJ6wZeyIE2Z4fwA_i~x zWycc~8KZ`nmjzN!)yIZu7|ulxsx{?%3$A#-xZ(S|QC#a;OM7gJp*XADS*iyru>^*!z{%<}7 zNk1Y94cv`=x98d)B%i>(Tk75=-u36pSUeaOF##Dq8U z&!f35t?TE+>~+0M1=<*EGV#(T56|vznwKm46S|Y#fEPOd+czA=ZQzK{G%a`{Uix;T z^c8zIvhVQof`2j7#ndfsd4v&p6ZBZW(?H5722_M zM#MdDth)p6_!DTWw(S-Q)l=w36><`rBJR}sYzORu?6=*iHL8X3kM{lX%I>D#snztL zqz`%`d%lQ!!Pvfg3j7Gm>jLP0>vucJ1U@J-+C;LW>0USJejZ6x*W2&&kU!2fp5Tom zccazUN}6%!u8gBi#_Z!*8`$=W^RoQ}XdjkCJIc6$ z?pCn6$@|kj5+m#RQ_}Tx#EI{TgzgmJv3iO)Gffadko%Os65mczk*Gu6ZmU1P>nK=k zcKdNo`ae}e*$tYf_<{o)M>A_WFa}to!5^m@YOg{$k3Cwc6TI4lZjJ6U1EYVKl&+(QIHofXnt^ zO0Y!yBSM%jIO$I@L#h7%=cNCeDpUQ}1lO@Vc#J1!XZ1Exx$^OMbL?BN>%OBDO}%{- zX0jN3?6B(bxAizTZ>Zbm{IN$8L|JDyg|4c0((+wQACLt8hT=whKd0G_}K z_~(2Mz*9?20#Bz(NLmVvt|MFoBVz?z6V*G#Wh9D@Zr)F{`Rr=Oyx?ornap_*B zglHYi?&*)JO4b<)qn{d?R_lIQ`R>VH4BQ{S-#N%c$G z-y}W6O*wbr=7FKR){-O1>j3D>kcBg9PT(vQD4!wd}Mp)q;YMKiol% z%rQgCI0YBtD5M&dAX2J?6Wk$iZnJrG>3}1K_0(g$P9O3Y&`&lE6fgfDhfd|9M1r^0 zL0&zLfK7_Du2@P^Wk5d*z3iR3Qg1QlCeJa+L7_m;#Px%k5B*9tJ6)p-^$v1q9jw>K z^%C-hgX%DbJzYGQ=7t>iY1&h$X1DdGgjZta3@vQm-RT+(M;e3ybDknQWIQ7B(5K}p@d$4`1 zbJMZr-d&IijAXNAq;#7q%vF5%9%>w1YWXMinG#0F)avSIAJTPU-k%bnoYKx7MsE*h zb?0nt7Jr(Pf5+ju$TMafc_0XQm*r2qN`L29ipn5A5@;bhy0YcWIPZFqDB?Oxepj>% z8q`A_*J~0&D5qkk%@T4HQA75Z!a4gQOe zC*QReI#p%frlU7|sMyE^`2Ai$IJ10DiRd$pI|A7d!9KF@0cz*Y>DmJIODfE<+{;{d!vN-+^{>1ix9sJq>(MV_~ z=eZW5q%IVW+;j|GOl0mbvO6YkUflg>+~pvTT4cg~TDP`g@?~XN74?1~8D*r7SCHB& zS&Ljmy@Agkgn-;k_yi6_N_!ICSCEU~dMe3jp2d1df~kj*9`L*r4W6*A1gcG3GcFaGqkAd7Q{%|G=Hu{-`mie zf1wJwwd;BPv=>m693jas=o+}du$JjdSTbi1QX}haCk4!UyHBb*1v1)oBb#Klo<9+9 z%_=f!B?t;~ISnsqR)=0Q7qkvvL>6@ZFQ7bnR|6XgC;c$>do#mAQG;DNU1%UlVgssl zp|lnRa>Sf=6LYzDG^B}}h8@V;z=x{41n1Iix^h)-cJ&J{`y+K5gNal0t!U{k!}5ZR z+oGjHp=U{-%Z@qspF|Km8u|O&ZKSsDCB@u+f>qpZ)N&BU>&^&|V0qUD&5a9ck55)K1jsRQfu~EbV+YKk~{OPfn^QRvF?9)*%o_3)o zW}!Imj4;5yo6xL@8q4*bmIukf9zjf6B@ih~5b`VLj`i;jWdDIAEI981hOn8jU~fS` zFo&9XEIi`2GV6C><>zSJn-kSm?Ja2#mG=LJs|+m?gi`93I+E)^u0sqlKzcuP{`&*j z&zUZTO9KDR-Z$4$2)`|HneJ`HHS?$bM%?4!9Ft7KX*S{Re8Om(u$~0}B0R9NG`5+K z?Ed#C;H}Zp5y#QRcZyX4KSOTDew32gA~kL zSF8vpgJApik;|dPYRn0F83xEZ@@p!K>0hSedn%q8qaQ2Z8Ps%MpD-Tm;PNpY_o|$( zwN!+V_LjFtnZ?jaRAxx+MsC{O&L|Ol{Xej^ooBd`Uov9R%*YD0J6L7U^c0mn#HN{% z6V#hrKXY!Rw+^JzuP-qe2-mH9uxS2KI0G<0q^)#$ymh&PnyukJ4ov*9B0aJoK0qP!il zo4?766#nwzL+~%mXRcZF%2?Oy8WkESNNSQpJyR;RqnxZ1@XseVA{i(^fhu^T{PRZU zsY1dH-s2F#;L|6}r)FsMT_PGNFZu8Ch9qxdHqfHKpRiXFnKTrAMANYGWNgU|rQhUD z3?9Ya$9Sl~P#AjA_!Y_X#{Bjm3*LRxO-W9l@Pks0Vhv4`5M zwyL4gA8_2T@>jEd`W`N<_g>Q>O4CGD#T3(lHwOA{3idZ(EQ9-tb1Q@MvKoNjYe!rW z__4l*V31$D`zpS7J~Eu;y%+>3$-Zqq>m(t_+wb?6HNjwWxFLDbBMUEcZgLOXe&jB42XT1AFhj1O>OQ`s@#FvF9laA^T!lryBdKKS>kn|cU9#jTGYR-u&(3{e7)jtx~nt%ze zD+KQ@1lI?_-c(N^aa$p1W|}B7EtfXLWHz@J9apAUJ?XVZ;FWtmquoE;b*c`3wzZiuab7F0_%s!YLG9&NA-OFZ zvy03GRT{=3VfO0EVfrjxv>Id`o36C_YPE78NWQaXnm(Rr+N+OuJeL4)eJ0C zHw{70cGIdxUZ~%II?%>aYG^~DZkwIpO_RqbPo8`^d#_RY>)RB$Ps_9LJ#xPgv+pkM zGg#|MoD@HuTpupEhF3`<_p`=J`nq%a3~{d%C>8h(9h~_8MMii^10dz#wL(ja0}+R+ z@eesG?>DhlL>g5UA0~&{W#W4xliB8^80~%T(_5 zKbmqIuMGpRjRI-ymF^H2P)bytxzm2lE;)v~c64~DwX|=YogeaVxH3Zgb{m(dzV?2T z%dKK0CVrpki(5&Y9_;R0Sr{Mj2l1Yi-!F>C8>d~3S5)PL$2;EkY}=9#81Fy+m+`*; zhyQK7`|Q{MU&fm|pPk3a24?seJiq$wyxRr&I04uXg(FDC!5+|lXs|GHq)Cee_)^k4 zCVSlX%DFxc!(y6=j(P@5;$Bl_^h2S1y0?euxSAl-EVH@J>tZvVqc`&P5xX^bW}?Yw_s;MUhWcT*z!B z6CCx}(5(8US1R|0=gSP;ngxB>iFR8gKkEpm98>vhSII|8vscv>jbQO_>pYAi@@RmD!DFQj4|MmG zGnBx^@=welm%`5WO*qgurU<__Pb|=y=z3#@@HO(BCGW0<+Ju1n?-<4@$inPb|RaAstR&@qIVH%{5HaE#ZO8`MofVae9xSCS$4!e)_ z4LDwJa%MiHhQO97V<=-ZLQrQpNfXC`HNY=?OH~>lN?CsetpU{GazD8+p1B72oWxGs z_Kcw1b*$?5hKZm|Hu`p$&FOqB`QL3c!=5)87uzK0di)->=tOrl;k&r+sHWbSzM$O= z362lCw4q8^qwDS^JMy1m35SL&qeRo_$R*@ZN{(}6UcY1t!IskA7YG-r+4S9(TmOdG z_pO51*!ch&!-A^Z*Zom&s(GLZVp>g7ok^ZB;Q&+YbUnjiCtF_FUxDCWwX1JEd~0&s z7*=+y$q^N_E1tQBt8vJKcN~u19!nx&8d8w24O$;zz8mj0yEU!`fk>{Y(t115@KzQT zQvSHfpK?|{Pb%(tF7YKfN=P9Gi#qefLcMXXudb@Jj zQF069&8*~$Ra8QN4}ZqvJr@2pal&h^4=RKUr~q~CRFm=hg}-uJ9><4-lR6r}!gsFc z2f`$E+o%27e~R0ma{k{&fqiat>_lhvhs@`_{+4+VxqfZ8Hr+b;8uM|oYTX|*Z~@L# zD1o>)?oNZ8JcZ1opF&DR({`v)ggWw=7<|3_ORru_9}NI%l_aqX)v>$r3NOzrEc=Sy zv6o!%grJ6q1FN;y!D4;wKF&pS^Fl(vJQAgNpSG@f`EiCB~ zI5Q(x|Atw>N0^u?+kCpTM=4N75=qvb06JU>&>n$!o1OR{oI$d z-OgY=7`~&i!JFN1SeBD)mT)c$1TcPBmi`w_EiE<+vb;`uBb2Z3r#wo?GcR)5gmE@O z1F{JxnS?bO7M*ST4C1)8LHMJDH87U?o2pFQOqYpQn|QUp^Tlx#CmEB=5~1rw*`0J3QNE)g@lR8O&Rv{$S}R`vA2w3&TN)$>m>vei zHtLmuE$fdX&FRv$R)jtJvE=xe7pduu94CB=x{-wuxMScQov<-#D8};TJa00)a@F~Z zM%I+nmt49jXg%uPEHSLpbscyc@y>71Wx)AWSQ6}{)^fVu(CitUq9bdm+}u2M5)h7r z=;fF=z0`S(zC{q0g39js4eO6Xr3oC?i84Evx|`SmoqLa=1Ln>H84^OmjoC4L()mrT zR&&zZWnS{x8Sx^}e$#%O_BHRcuUS?5UB*I_=^bwBkn0=vysoE_bD;M|jh9+3vcNA4 z+7DWc>M*l&)=%!ni{@0l5Ptb$CT5)=ZPi)mA0oU?HJFLlqSIm?^@)dWvr~38a5g$E z;s=D0k%(7H$&NX=Pc`3$IIC|n0jQXiRGK+)#JyRS5X_n=MsUy>f92cnz~LZp*7c2C zING;sTK<(@bC8G}d?wZ3?_|D4Wli4IJiv6;z0Z#-Ik+byB#|TpU_6V986)Ds9$<@q z0QThSJ6)Ka)!v+YK{dUh~fL0|2|R+A|g^Tf2}H)b3A~^VDKI zK3F9(^?)H+PWop|sfDPM5yj2E!yi>r1*y>kN?p1Dwv{wc$y#~~!oYE{;XSZQop;h# z6jkyCRdO$X?D}@P#B8u6t{xs~xVn;+$ET*$hRSTK@^nW!zg{`c9(kPfUVY14U729Jx=NHqKp@tKvv9{6!#>j1Wfqy+x< znE#LTzmpe3iql}}g)IweViw+<(4DmSSNh&|zjJS-a`L$3uhpDH_F=Xev)to{qXhSi zIh2^pgyp*L+%Sb$-_P>+1y+b$QGPHssCn>Kp(9D=K@6w*MXl$i*h!OG1$40#4#ujbQ70oEPK(6vW zo>lB9idn1sm`ZTDoRP18B~7#yLlG=wRDl&2SM@0|P0>Mh=vZElt)cH8bW0n&C^taH_U9 zhh_g?yhG#QPp6oet;4oxo{X0+G!5{8ikYQD{)m*hXhn_s<7Rb~#qoezPq){JK%s6c zrN*{Pr3=)+Y!2)+9)17M$)oW%7`^Si258;)wqV7R+Pttp_9K^LOmrxy)i_WAB?=By z0IVIfMG0!n2&Q@C?#DGAq(Au)=`i8ne!a#Nc5dC;_f1G?Gu!POJzgx1)!&8+5#!Q5Oaq-*GaJn7P5pZO7PHthC1n zilTKJ*cyegLdS!9v`JdD^QZf||6prfw$vh5^G^+OA)XnU$SeVit@D(3OOxXx5c&5L znJb10gKL#f7`)YD@F6gmci#gHe%WGhX3SrL>cBet&Ae*pF)lNEnD5nRm)cnI(0)rX zi`jjTn4w@|lbs4!i_Q;`i`TDnSQ`0fmHiz9!%O0Io29ke!WUzQ&M#I`Y0M%_0CfTz zKwFA{%tmB)Y8=B={D@Z3o2nY~Lo>MFj;*RPLIz0Ielp97Vhi5`F*gAtS|tTj4gPF{ z5#}-&g{rsE3Txfvto~X#Tq|syRn@MPl}V3t!{3=A*u1UI4OxXq-0s})tb#DsJDeMK z6J$%P0ym{Ci62LdOx5emRIuTV$Bf-L*n7%j{{`EV>M2F?zD|^q-?h3s=$otk1in=2 z+*n7;_1$DRcgb9mALLTR+y;>Hev*_bs;FwR{k!&J_3hg8O~0-^Pj@Ks)P^e4 zw`(U+;TBid5gV_)lkld#@8|K8=%9+*ej0ktDlypoB{O1qrd;}4B~$i6P@L6Mjd57T zKb{Np6**@$0K8r^x2Grj-19zs3)^TCz~>hUa4%G$4K;qIbPVD+Lui?7|OhT zwEPM!zeH-E5`4NKEk3-(jo-!N<~Y~A_{j)YXM7xe+*s-#(!Ahl;MhjxSA4Q+MrP4d zmAT%j%Tc$FPAWHhprJ5i{wxQm^H`yI8~j-bS0>iU^7>}?ZTC5hkg{@sn8z1x3Z1TD zB9#tGvsCuA%9y+10Wn=P@~Bdd(x>cSE&nIUgUD`fSu|xXz}O#uzQOX)(xAOle*a^0 z7d2=_-~v_eG&N_UL#q4Evh$~f0BEH2$V80ac%?h-{Uzs+%Bta@$xKjtIjQe9g?1(< zQ1yBJ{24+SlrYBcxb}~P9_;&lPToXpQ{UzSe#R$pi+~ekui}`;1JQiFQTS*PE!iWD z^Z8oUvLRn=13Bu14S6>ysGf_$4cZe6^-p*@+YMw2%Z0U*-Htj0AFelA5r(RbNrrz`PunoAqr`5JP?qp+ z?qoWWUv7r&yfW&2S4?J1K5N$y@V<;9SvAR9v{EiJ?bXtrBtx6z5@r0se44XH zLiF04ywtFpMfyh|&UuT4Slm!oVR6OZE6md{J3OQ5p!ERRk@o!Nt{&Evw1-I zwl6!LZtA`plBitcHdu8D?|OqdJ?1;*PUnBUyfLoFHD9tHg&K46xix$0?#@)RiI7` zAQ2qvB;uWrIZrRoL|kY2aU7IsG>*;Sz|AErB1Q;b>vVM!rc_K1&(beFZ~M<5$VK24 z`F@D6RA)7gy9>sD%FJDiEW&dPp-RW;T+va7GPpvvrh6Y)iLu;!V!{FL-w<(g{Ni@V zxoNWKrP|CH?ww(_mNb)X_7wwfP;G9-2~a2ynA1Rh66W=1mytccf8{=r|L}Zs$k%R=9qTn$uJD@aOqqTgm7kvy=L@_2U8X)WQcJ$#~hTEf(raM=kiXwfC>NkNMo*qC9N zQf5C*l7S~X{k|~T{MmjuiPkhI|NKIL}+s6z(cSE2;`-<(A|nYKx$wB+0`Gl zxuyonk`*Z7w(-Q8*9jaGq0fb#^iGA`7yLhGrH_v;wob!4DcTJw%3pOB?*ABv{9lQ} z&W@6q-x*~sn1{A<5Gti*~*yCah>Sll)=Hfd@ySw|!4qhEcuT)>#t;WC`GB$j;h z_x*xm2f>P1=)Cr}U6Ih#j_S)grysbT2EjNgv<)i zZ&U9Es+T#*AT0JjD(nNs;Y$bUd*$wnat-)>drj?~s>@BXcjXqwCZ?UrFE2z3^BAjjY4?JvS+W0V%GjP6#EH{o(7 zc(4tJ7H55Y$EXr5!SG_K3L0Aq*4%XVMF~oBN%BQff1k*Y(h-Sp#T&feAjx@d6ENzC z!PV`ioPEVvo3`idD}MGJZF7_@@|h8o#b*Y(jZ-?6gDoXDsa!qJGf9|S0JDn~&WzEI zy>m9a;h<*o^j_x-ZQFVK3ZW5dCll#T&bCK(mjZ~CJM4Q!s5#t)P)&)lvfw>|^092T zzq(yLFMhHj*!P0(+w?ux>713tkCcel0^Fh~gj*DT0xJvqXp-$Ab`^=tti{Hxg5C5j ze+3AmZTZ8XcWxNuU{Vk<;spV-ipxwE)H}Kkf$mbw;X3fXzat^Ombm!a{QP53x4x6{ z@Bq5ub_$jg*(XFzjOB#U{8U#f47g=EvCfn!vYc3J612|ut(4`2(^YNw216&}p+io( zS#jj;({hNdtpo>t)O!kR+21xv?@58*r2FqY3pQ&+hy1%=RPc~reKTvy(j8b6++A>F zKZQCIUL>3dZB5o3Sb2a>4B>$$_pQF+2d=lVQ{&zRVNQK*uOC=pQq(5uDxpW5t}b=j zJL}wDo$1bRWiDsmrnx*K7J_n@DTl?v8j6c7T%;uAW8corpt&&`y#9krFp+fjCz~O) zIhRT$C!(H^gN#4oocv-o%FbiXpb7uwzbMu0KNbQ5$x~C;wU)J=7!O?=*0_?N4uE#u zU%BfRl#I5AKKbi;a?T_bnk}pc;Jdzim?_ftAooRu_kdW?N79#P^i92;oq_`Yw3di! zb?9HDx6?4j1mmu`*mlytRm7`!WXqAY#;-T|;cf?MjVG`f<-P}z(wlzEpM}%bhN#5< zHP)RuXcn~ln*JSq@q-+!wWOiWg_3rDiuA?5$~p`5#jh|+uEL@FpvuBqg(_BGJinfJ zxlRg?-USUDH_*?DdzUQM{dfI=so~Cq_qnPz^a?8;-VB+MW(g}^`tsK86*@FhGc&CH zZaP(Ok0cy$$joMpHAXY9{F(Qp@w#5f5a@R^Q&Srbgu|WEc<^r5M6{hwYnRhn6ciXI zM_%05)#TfiQp-4_%554(b4ohn0K@35745&lekHBC2c7gCW*SR%I!J4dqu$goOk5jHI3~ZTkpAx^a_OF1;6Y^M44X1V>p|nWm7u zneCP~Xy?2{48KnqDYQhr@9kH2LwlVYTZwzW`3KQR=uPLwCVehzZI9u)Ei;)&+2W1} z>Hs&MLpZBP<031zo6f7FbWy#dUs2aInVmgTk|O#~l$(8u8C030a?mecXMcp1N!VTzBIJ7?Cak+*ZthIh?J;Jjs^zlZDYXZig* z$KNd*1Qkxc>!9PLp(e}@l1~w5QIqE^bYnKqt+kHijh-<^adC#8(oRJ^?a=D}C8tr7 zIqdb_k>hvxepZ$F{zeaa@aFuH)yfX|qau1&8(+X0Eva!viXF_Cht~3llkIAbyX7C2(pDnW*YZ)!x&B=Z-NG}YZUSa^I4JZ8C7zBi>l9zjGtHqFj)z=bF`1A z8fbD;a=2a6%q}@TzJ^WYP4S7Dksl_EfrrT+s|B2??7Z?GYh#5X$W#Y8w(!>RlX0(VQ#gaK;D^?1jfOkhnw zlPOn~{5pTD+sfHPrV*+!@rLAHYO%e{e!*ZEGZzodjwjFIFO5mILa5$Jiya}C8;Dr?PKk4!`1|%4C(K{fSUd+goU+ zNV+&e(^xtbqR&5smnu27ACEUr;1FnN5|V_sP) zY39ab>Q7l95!l6b6F_kRK`f2e{ zRdPGS!3FcS%D$t_%2wJv_U3C_+gpX!lhbIqZ)11deTPP>COq9cts3;9KSiwxzn~vp zYfaWMAPw{Vxwv;}W%iVOd|9Dzwk1d{(31duUSuMd=3?k{(ifAGQ%H5^a@7#AB|6{O4jG6^XOndU_MV8G@oMQ!Iy7qJ~uF*dlK$6 zi#S13-1J157h66AIL%O;E@^U^v(BpugyvS-H^8&+YY7zkH*~^wYRHmk&Uc5|4`4qW zG5QSgKbCwPHzt6j>GvNIWJ*eEjDX8J*l5PJ2ZH8D^)%Nq?Cp z2U@TXpI#NigVP1!&Vkd=QiEr6Zjwt*;v=2(S>$q7pUPk2VB5!R=p#hZoIINJE2v*jcUX97MA}ng?(~|37pqRV<-4+)30wVMHFuM!3-OOT>FqXzd9r!! za>4YPSl4S!-o;fwF5=FriD$|;a&#{j9$!=&cY#(8@cj@MKT6F~;XqMG^owyabD9hW zP?AmBDQCTBrXQSK>fBJF(TOu4V^)Id96q?aU{nNbqi~16VS17qP@ywkGjl&;qY9sB zhjdx;C<~ptXb=W%?0WbMu#%g}k*hqNcgpgTj-4ip?S4+okDbG6Wh+QKl9J7geCwMk zYx8o}eMQmC82uEPU$83kqEGX5W`RBlx@{Nz%XEF*>3R>uIO23wndzDWsiuPA9mnza zC};JfcC6r=bzpJIxxXun@|=Hfl(FJb8m(V}xOk@Vh9KY?1rLr{lUe*nP3TGEwdFX$ z(>rC`y@giG|Gid+3~KdGGvS?J1`zmQOp~hwFfD8_t+64z3N48i7^GlL%MF1RG*7h* z$+SGz`SuiN;&=M|JkYN{44yb^d@&cQQwll%VfwI=%q6 zSkMHXSURTj?RjlHQHt6_4@r$A4e5OQv^Go)XTWH^rtTxf))8-VM{-8Me>Ay|Wm@)h zqO-oTlpK?xO@{>5%mt;Zrm9J9sOb$AE@k(b0R;qPrJ4A1ork7e`@1IR#}8feds;sy zo`cg3dzhR8{$iE#zLVOl3A?u){$yiTTEIo$y^CNjssaZOVZoqY@xK_DnYj7>H#6no z5?cJTlhUD;iOOC^DhPG$Zwm$(c4&~Wi7z~BH!1k*yYt2?<6XSr2YawfPI}e zb7Cx$965w-vCLU5{UNsAYkobdWNK!F3@?yOE|Qp@eYcjpFdjx8?UuRQ3KqJ&Ewe>= zo9cRIX3DqpgHhri;9ogz>+P!Ov2aVTa4y)`_DX!g23g{}$xWOnZd1P{iKsz76+=GKT?=+*@tIu|0X5h2M#O|7)Owb*`{qHIRi7aPe(wSZzRItb^|4>R8?4&?)I{X5=ys z$Nu)Va;n8J3+qKL2GuH(BFiiq@f^3t`TL~&d70jy`PI7x0(ryVY%p_IAY}9=qBFWl z>JLbyVkP%UZUAoFcLl#qE>{`cKlO&=YO6OKR;scYiN`cVO*+x^v>|t*Xe}T4&>OB+ zZc0_zU;R~7@)9$dz2TE>a9Z5I{9{Lzgr&@;2Fsvd%+L`5%*~^U%lJ9x)j|-o~RQ z!WX84E}UGh7TwEgd#BYCqH)+;*5eQUAui2H{}*XF*>g@XU2Pb9REa@2 z?jnto@&*L&ym?SNymY-%?(;TNiSC`?0>c*W1{b zEhd)xHhs`HchI*7)NsDsS4=Ed?sC(Rt+Uq{GSHU#M^BG7J?&g?`pF?NSZQ`V?t`AY zhpepH%RKKz8@iBQzW4J{CEl86Of9lx_Bv~TSsTtO_mRfYuQ#QSX1+6Heg()7(dOI; zS$BR$1YC1z_GXm0vFFn|FS;+b<*7oI!8tD~uA=XOBL6dAqbr<`-6xSeb6Z{@Iq1F` z%e=V3Sarn?fqn#I`jF1mnK82Xq!m<$M5qq$CGtZgGmTNCNuTgilI*)1Q#*#ND|Oc> z(q=0e`3|~{P}{@B@)DovJ_Fga8r467>ZJY^-mA&`OOQB%%~d{{+CBlK*W3l9u@+{G zw@Xk*1N`NRa{>nOMkQIPTb3pmX*fcY8T2DbSscoAEvL?3aM`PxaHvz_R%;t!1bKTo4D(`rzs=Sj_sx3t2D)Aug<5bo5LA+<-xTH0sxjNaQ`<716n7aC8S(Xnv} z{B7Qyi{GidJ>>mZ2B|X2HoOrp|D@8P)>8_t525Tl?yvfjMgBj|s0TtU znePAmnXs8z-o`8^ylZOA1pzMc+NSk=HWs=ny!5PC=*l>#Nd8D@T6F2h2#q6@SawpA zHw}Tq{)DcPaq!R*vQGyun|ft;v$v#@T9PM5P`8up@AVXhT)#{`&;t&awf&^;SsMQj zH7=F5+?AQ^mCO}-cbtpy8a#1Ox8DL&-1kdS<)Zz#SpKr&)oq}YEEzh@ul2KHEE(34 zK){+&aZU8wb)fehW5qaXF@g*nn(K+-?IGrF7J}&7yP1_~H+4|bKb4cX@!-emP4K+# zg58n(v;ikFlMNy>fX5jK(+7cjuLGZD0E_P?jnjF>BiF<2$~>tXvM2EaGKvq;XcVLL zDF+5N8^0AV-8Qg~sR~O0A#6HZ>96mT+!<9q$+_yH?&GY1W(@Y( z0?*`NQJl5;6|qJ=ZGVZluSB_#q#gz<47C!g=B#*uz?w}R5IUTXsZ%vNj` za0e|3=*xtj)H_2Gyk>oCPpYRp8rtV{)iJZYH!egv&%1C+rHs~cy>~bH_oITKJzYAz zURj`Lc#%s(>O#;-MGVme^68P zhd1><Dji$ofA;u*oNL!w?`^Y{FyNTPVT#EBhyqG&di`6Zh2D z^&jp61L5E_)1tza>} zXOC93nM*5Tp}#se)&Y~59+Mu=;5x@50hjceg%%OPu-|@<=g&ClrGO*hzU0LWeLNQW=onkK zNXjTSmbER5dtYHxueCjsJ)gWEJjDypI?@zBNRHx}^WY+K#KKJRC}l{sx0E>PGLyG3 zg^YJgwgGr(Rj9w&mrRaWg8<1_^Qg5`)xq6!>`U^0{RF?##FbBN-dddZq_(Mkwy3ws ziqa%m@h9I(wt3k0%-c&C-S~OW@ynAz#Xk6fL2~=+Z5rFDI7u=)5Xt<*i^Aq)X;O%$@*np_D^-bGR_* z=M!vCGAx+aqv0Em+pP?h!@&4|(BaL_^%uTP;bv0SCG5&zD z3HLRFv}nO5+~@4#GWadsZ066O0r|{+8eJUWESv>EwCKp#Jub z8|l(Ebu#X(Y%_>FRO|*S1-0AQb2^qtDs;Ox-Xd*x-1`JHbPtP5h*twh3^L?t%PaeB zlNZorG2$Kbl1020=mt8xsHxGaF*PW@PaMRbt$4MTRj&QJO0*Wf+I_U z)VpgRKZ(%GAZqedZ)nP|Fp{2?q(;{FFs+;#(cAI29FMas?>AzUBL}yZ@Y(5-Xy3DL zYptq9Pg&|h(om+@=B1>dQkH5Zo_auSRT@4l%*P(XWyPH?c7HL^>YM&S(r~X^Ni4GB zrIJ(CuP2=JFKLpi2q(SKEOAt``_zd8Tf)XfIS(g1<7QNfcny&Q;f1Bi2~A!Y5%^Q=6Jj{jJyDz* zewou5RXEzjvx!;}i}2m21y9~>LfP2DOs=eM83UVbUP@>I1xkuv>g6GuC9k4%BR0Xz z%ZklvV-P0*b8OGgz2^A>RpCu5cT;1@h`_~7sRWV@*yB{a4Z;y)`)pEcfNGqe{*f9c z=uNA4Q!OSi(KXWqkLjBE@up37Q}fKHu$!7sz`BeDWGa1y`I6{OEheCUZfcQ9;`QGo zf$WRmVZOgClHk?d+P!8%uc?8kh|ug1{dtGw0Y^UXDQ1eajY>l|Tu=Ut!{G29s+T7r z`1dys^euuPicXpt?zkj6X<2;vg_D*=J7!IqmRNosFFin0;NWp61cpk3h{MZXmTY}w zV76HIm!;4TCx7`qdgN8pPpO1Xgw~)KH2$H4)A)qp5Ac}}bvuwe+ndws?n*uX9=d?Z zSL7MH%UdI!I`zVPTqHYP*BE+YGPmt6@KeE}0P8fB*-5~{;^v2;O~Tu*(@8Jn53n?c zp2LOXUE?Wb0u3q-9tWSZO(y^SD9LpNDXb&vlVZmAL z{l&=VziT)Yvo-=8j;wfDbdW;J>#3GcI& zGcqHFB_^Hdq$S^&m5C1PZ{jAo@3`*f%=v7-8=6u+lGhWH9avvbht4Q38F-^dFF++i zk0o4Ix32vmO4(1dFWT=!-ljV_{FhvjMRwL65yNQ>hIQMoMVMciaNoJb$-<<5EzGP# zg)=f2K3d8BM_q4Xfj#^l7_Gyv$&tEhVrejW|I2%JT19d1M8jGr}iB*R5|NTTj-zsB>d5p3l9dF z+MbT^rY*02wTCu38To~dc^4&PUaTXggncHVxi#YbVLuZW@iHRQQ#0e7vg_JonUjZ? z&FF~MJsPds9(u)TekB%qD&{mlg(>jNesm;xBXwKMeKz!71gF!PTc}G4iK{&V9B^Zq zSs!-$-5rt4j2G(sXx&p{9x|~PB6YaY&AdxH(aiJ@YunewU8IiFT30`*_}{3Bdq?{h z9C&v?dwzrmaxqb%aO@28_$5W^14E9eyFYS<(XpWNnr1IHUnTut$&HSM*TSrvn-ta? zlq0(AlF(K0j*Ft9C5et%!Lj*l!?T{K{!UrootDq$WjHQ5Qb7sCB?iTljcu z;QVaq#YAsfIMm;<7U@dEfvMrrDu1~7wgGiWxU&wER0Kjj3?2KCt?C3{rOWd#JyFm zww;0jv6j&X?{D04ef@U1ZfUEM98=arS~X4HFMP_#C(;O$9;~J&5Z9y+1nHbZl%MVh ztWDlULTbS>=6yk))LUX+SHBQ+YP)wqN3aZ^YfAk=)srbxLLUL>g%R)8cS$11>bO-p z76j)xX$ea+$CXA)@jSSQ_hIT@@Na({Dl9DBYDB~P%#oSC!_8+S>!E0D?(1!$jS9E$ z5xGc*)Zl|T#IIMxibDz+(ZMrstw!)J$%6yjqJW0;bM@9D=uk7p9uo3F1w5-@PyG@1 z_~n8Yb=zYR+fvoJe&^~k0T8~0J{H5}=5>U~mIZw*g zt=!Gkl;Xqe1^+unja`eB@&n!Z;nT(k4_`(HnKAc%dC>4-_17Ifd}Y+|AE)9Y4`0m$ zcB6LqKW=OQ031PTPh?Z0Dggj?AE10706-xFfB-NGXXBu9z#q)6ZStDq{w9>+ zxMu><_5dUVMF>{Srxt&mJ}Dw*gpHTwskOpT{O@0sUy#{d=IqyKvuRh;Y1riSmyj*{ zGrmVse=vePr|SzyOtP!_Ggv;ClP{y;8@W{?M()|rOMB2R199->T!>uDYtv(zzQhrv zV9aazNpBkcQsZt)n}Poj$J}6#eg1jvv2v)$HGqLgDld`F^LOYH`jwSDet2$qP|p^s zw3Q{N`roIHd=nFVH}}cEf_5fc747>0?Zx8KS_JwF! zi?+mN^Xyf?fz3mb7f+hKczKySdoharNu$`Gj7py$HU1gx-i(eAd{@UX7DS6Xqhp;_ z=l{bRNm`}Oze!GVCGfqQC0S7C=Q2bkIv*OMirvPfDuWXjeVNhGw>~n*-T*^|dvU^D zMLOd`W(uYLP}JSPIeXV3j1E`LX0}QnDc%2_$ie=)Cp_;sa-x)Z5)J{#gEIiV;nzr} zXz8P+{ogrwsP0KG)ycSX_kGxZR#FC*<#ztEETTLLgN=g-VAN~HLL9?^%yFNL;SQnn z@3FeQk<#~J3C@X@tr0bhp7A}=$5`E4XRHxHb=)_pM*D%e9X|LJvk>J$W_A216mZqg zNZqbz=_B&S;7VgS#yHG%f8^lPvC!_AGjlg17><~f?nde!i)cN?BGYzFM= z`ch*#jbFJg4{?7v>t9ArWx8Y3sNIj50A49hHbtH?oYl;y?C|%P;qQ*tJ(ra?G)_GQ z{>9j1;88c#Kf<2ht$uK-f3%bCWR$7?I&IQC1%@)qjlB^-)sd-qqqI zb84v5WNK5ItcPoEpazLU;Y1KOzC}vCQh<}#YXu9eH5cjj^z((Amn4?$cAQ zmTFC|Vbd9Zx}oGOAafM3C|kf!i)_1uY%}Rs-yNxCV}}^YdGhxB;Id_ZH8X8je|?eS zM*`A*a_bspr5hg)gH}4+6XMXUu%yV(HYow?Z(zx zoFn%!%NFZChPyzRRg`G_)y?)Ts${i!H;7xn6`NI&n1!%y7%p1qv?`taUH z;I1qBvPR*k5J*SZ|5PIXIQ%uZjjjIFC*Nc3AANrX8$CCW2%E((xBBPYDXo^-^TnT7 zRhJo+{#idREeZWb-A=d*<|i+Y>qd@a{~Szb4`mFn?RZnmS_j(BE;?#L+>1|}h4mn) zk1~o$5(x!hw=3j+5Yd~xklsZ(VMJk@${H8>=l_I`+AC}1%Dc@_)`%n{tr11lKZ2si zCJ5a~f7UGDv*yr6o%`eJi-sCyVsmdBI9<}G#4TPFMTpg^gh|KT^YfBG+6Inbn#|?S zOyz>@%8iRj96Fz*%ozRTTwt?AJ@wQm84;l;3i3ct(An(C0ev)hF4X@hV#e%AP&;|+ zk0&yohN$l2ts~);_{ZWPhYOG&=RRw5$$!Qa`0wlW-RW9hRE0oO$W!G%8sxdOD38&O z&NUOR_U{VvoNe;t`<}yZCWK1Yl_x)sra~~7bv4OFJW~|J?DA$v!E*PT`pu?ONU=FA zB{_{<)b3MTwXQhZ`b}^K*;1X2DwE^984C*@NY|*vzV3D5>W7LrzZ!K01iz1S3yTok zNxy9f@{}?URrl1psKpO+R^Lk+TrPenWz-415l^ENPLF@a)fg{}*}_lzqo(Mv`}Wg4 zX;*P6yIruD(;9cR{Qsoyy675;J#gIpa#h?s83apd_G?ZWRmu_Q2qNR_ku;r5n2$Bu z?WWOgK)sD-Ya%&p)&X!wnA`cA-Jay+*b(th2Z`|u)h%05k>#BkP1P`$AZ-AAZVq) zl{Twn?7?@Pg@a&!A(*Eih4o1bRRKN|tSJO*3&HwA(D-DbV)BM_sop4J)w$S$IaMr? zLYw9|trG4|`8bQ$?ZjwPV2NkE`4p1PX7Na%@M$adkowvaJs@k?8Wm2hITtf+Z*!@PgQHhy&AOTs_*EL17Y zp?KiQ!?Fham#K;iEz>(XbK^Wi&+X0jzZ3}rkG)W%ci~Gce__gJ+dzIBKkWWUGpPF` zEem@fp4YwJoKJ%{4#6D^?!F*?=$v6ycNpt-bu#91vQ#q&jk?lgJlqqFclIck+d zVw6R3aU6lN2huhXj~}rU^qDoBL3-mj?8R{YwIn8Jhz)+eQ3R50 zr`am)G9KgXI~bUb+2$fh0JiTh_GoY`HVg8Hi_GAQnBr$H8G(Amemmpt^M=M6{)Ay%mc7Q6ATq+h zJ9$d=+%f|8@jaaC&oKe~8gC_Fnhf3yv7etm(M%nE-NF*It(hmyiu!6^WQE^;ubehu z@46W;-NY#A4Cow1&$UHOIeJ@M^mfB+bdsC)hG7r;pI+<_(PnRCCzbQ&x*`0~KXKrwf=SC(kGqU~2MWg^`Iy{{KC7Ux> z@)mB#R<6N8;zZ^*qTHDCjtww<)?@Z+`e**ic$XXNmrHyEFa?)S75p7RSdXXY#9dF#6 zYuZV_tW>caulPs*Q47wzwT{M_9*Ta&KVgU-d5tyLEIRBOMz$FaCYDp6$8SG6kQZ@2 zcynOQTH1OJu3JIASdP0pEfk2s&d5slXRV7ZOS<$wLi_?imxgD=0%=l}b~ zgX*_r!Yg{s|Jz5-|96g)0X`0KR!$z3YvPL#k0UJ6 z9*PJbyQ+`Q<-YvL0J>S{Rg)d7%>bT17(Cu$qOqXRA8c8^2jQ|)@Wzpg)Ket4pbq87 ze9hni6vK1?tq!zDP}#ZyG>k~iQm;cpVbOr{Yt9)M5MAx%?JJ{O70}k~He$hk&Ugy+ zkhM_abRAu8=;1lG*&IDAZg$n6@=n)fd3gNgq9X!(HiZKG8lA_--whsHG5kIn;~q~iJ)nEaX8yM{jQ&QE9f$W7E!#30yk6fkUu*4PFh;--zL3l8d%JzGv*BzKvM z-Xo(l239`KC>ZiTEr>p-OFKCk=J4zL`8j)Ua1+H7eJ2Ifq4a-1l?soW7En`SvcuSKFs7TMN6r^{$66%JI{spQM? zA7sp(XY2vFJUg7vdH#g&xuZ|+`!hnce0g_vZT7bX{BBBZu51qdjr$SOvNyrF!)1dZ1{khT1Ms+mdzL$Wlj`v~vm8Mr3=`Rd-4FelulPd|Ib52{IHr%it zXrH-%xP&%Ona9~>Z;N7L-$Sr0L+O~sns+7KH3F!w)23&e;#5XIR4RR)0T#TGbSVtL zM*iabJP{#{Lx5ROA7Q^yMc%RAjNCm%@E{m|nA)x888R6id?TgYtv^+_qjZD+&hJEm zpXc&z;PLENgU;mYu)?8r(#pffQip{wbx8OWK}_d9X6pD|aUEw+2QaTTX8V?lGsaNo z7}v4l?LY?mb~OA+JJ(mu-n1Iig{N{Xw%_$laZY-LG(C?T7F4?k6=suzCxvpSq$1X^ z4hGJ@aEf6Ke?XC37F!@MxwCxayBrSu-bp6&)nv9)@%k6Mu}UvhZkeEs5#oP;o&WHowg1V){byp#Z4xATnIC~r#N zZ?0VwXna*%$}vw`UpGmdYxAScI$JVaA+aZOj~3 z8A##SRs9|nx{*R$0jXL3m!DC)vbfxm3*CQwj)$ef?WK>^p%-hMJj?f!vY9665jwKt zcJ{6FjDXViUQ&m;ZD-8**WQ1h>Xg59NA?={JujtexZr*gNodOTRAZKr6PcVlAWQ3^qMZtt{Y{JvH@OX@1%X*pzV-}5#N4Pe_m5Y0aF$aJF zavw~%|7nydW9~x%1wu2PS0i7S1~Am>Mw8Wl1#yb#?tP|Vo!G1IXW)>X)B7&$4()bk zan;z1XZ8Nj!%iX_32lx#iGB7=@XPfkCt}u?uosVqb}ao{)C==pg2&L8K8-#^+aFnk z?!)G`mA<>X`?l!G!f416D(9vz0~zw+2Hs^Sx80AqFSBe~5}qA^lRg0*U4X*62jim> z&{zb|r`aS!NekJyf3!v*`E2nFKK23GeQdhSK;WHHL@)3qityU3K&aW169%$(zCq_E zzyd%&U$PSu&sgUacJE^|jIu(t85+A8vz}S4tlS|iWwM$#8`A0RrVZ_%tJDGulpRJbfVGC%LJBw&*z2j%XeRc){{Tda4e}-I zQth;vv-5SeW)*3kn%sW0{6){Me{Hyq|Mv%3(=~avL?R_C&3XuVlB8Kq*BV*6nv-z< zy$0)@u2J^fr`;;RAc(vCsM`$+vVRJYFk7QR43J7on;9ZmDH;PqfNiZPnHHc6i11D< zPv}oEokM2RsVxtQrs*Rb$xaz`&HSzmx_UJ%-BPL3{)bGDxyc|uqk9I`XJZ*6G}PQR z^IDS3T)06L2V+5Jwm<)?i0UZvGl~qVQZACUn*xOk3^-{j)qXNsx+{bs3((KDQs>|# zuZcXE->$iVGOO!w*z`^RSJ-IY$zBgVw=e`)Pm?bIR;_?#`U=DzRr$=AN1_1hNrPkA zH?S-l)bo+1=T3T@1;(R%&jUlKSpEobodxiRWpYRaE#%C}F?l%Eu>gUuMUzq7~Ny*;~~8c=3ilsT^=ly%a_ zz|eI)W~m4BwG8Aov&GadC7f_#I}Bk9sLvVnAC3-$&bgU>9#+f$%}MrZ+vzH0GcaPB zej#5V%GC4(41suxGNUPgNC{!HrPuVf2ZFzfd~xr;#gY1-$__6XxOrVMtbds`2*k-G zSWOQhR|wWWpMv%OYeJgp-nNsnZ!rlr`G^0LOLo%FklN%;=Sr}BaY^#Icxrv8dYF7% zq`K=KxHmDa#%NFY;J@^G|;Y>75@-wc@I_7TkriYDl>b`40mo+=ZgAhy^ zggO|vWJu%jzx2~!7zjj6T>*&#=FOb7)K@bL-WQ_+dCdE2JOcRrUsEn}VERJDhhJyh zf^h)un2Y)1K7YfLIvE=Dewn=4+2k5D*u{ua?Akh;&e|c|VTaK6q3nq)QT!Xw+r|F0 zUm6hb6aa~FuZ4B>4b~O<*qRVF^Nm_WYyT@(-`}v^66SLL|6ttRN(N0&JY(;gEb(u` zAbv)N1;=zthR_~mzQtYm6M`>i8Up+OarQ3oQC7$Qe*y^vA#PL3=(T4ku4PU{*h1C~4n= zb&SrgpgAEvC!j<0?0ktUbqyf9)%e@_g2|dWVW~GScBSs1Em!JrO3~_}{OQ;0@z$$! zj@|g=;Gg$<1JVdQA*X20`x8nP6C%C)HMRWBT&JCegH8g`(bk$*{QK zaKa0=nx)AjTSVp!&OwnGaaOK0jrvV=6ms0|MI48@0mmt5Jnm0@CeL#}p>&|TU;AP8 zv-=(X|Lh3s(N_k1|7ZC9Jcxr?`32v_TKlQ7vslPOW3*F^hHCWTub3KrzKR;RuD>&! zCAOtb=WW#c;i2ibO6MG#ocXUr*K31&cP+$Q@;;G%vx3dE)FBD4xpoR+@5#o-*4L+G zPpqy$QH_4w(>%EO(5W*!EuF@#FAQT+e|TtVFE<&9ZpZ#_uCvzbgLhumaE=}0wB!1# zOgj!<0PgJ&?6>C#6`98)9WS6{2ed7&d?P0Z*lbLMlhn?3$ zc_M_(J8F!2q(ged=#WOWQ=NIO9wKmzj8Poz3yU@tisqDI6@R7HieG8Ph57f2V7Y*| zh8;6x_MZzm3gYLKJD33@eLb0O zYi)0u4RP{6v=&5o4%g7J=Cd7Zeq0PlxoabLbw%!4=XrAA5`s#o@mkUDFm_RczrU25 z)Cmr3WOStcF}>AUh3EZAw68r&&NAXgd4oTM`I8I;jR8rZGI;`fzZ8 zH81Dn7g>V49I>sng9f}0uS4UeTC;;)v+3&vOYl8@hj)GKLKl!wJlG-M*B4n<-P`Z$ zscrkZqNuNqLSMJNC}hNm6b)zWI(uwg&Q{O$LDokzj1xY(4P9`BDq?^Xf0crgHT2liyg2 zy}!fH^!0o{H>1NaUi6=Rd6(CJR92j`qZKs$XAb&L`XM<^7?AA_Ark(nHpPA8`}`l% zWAFlRl8q1DLMg2fKWIIOBM7(i6txX9&-Gm|3(pTrtFIZP1wW>>}n^1|is zYa51amwn!q zJAhep>#R)<-nUwo*9x{R!Y z)!Qu1DxMv$Ry&r#ohHfGaU>p4_hC$qmzJtBnj_6?_x$+bpGz;hnGQe_9?dIj+Gspv zo|+#!Of}eIY1?p%_^P_(zv9+s+LCcJrtn>?=f2k$zHeqDO9nfK#GP6cx#FLI7U_7_ z0f-N6e#3|oBaYBVTTB!}NVf7KO3-q#JME8ODG1Tu@jDcve|_HB%^gZr_n*iA3gb7P z>w*|U`sARsBhPJVGeygw>xcYdF2>l7-MOE`fgj^dbEMHJ#UR5e7mQz=X}voYEVu7! zbzxsoI{-%+@g1#GBZE>K^8{*o=p#2ewC_)uyisiQ=`7=OLbEvL&In)_n@ZfzK$gVJ z5M7NlAj4v;<}_4IG)-()|3#XYNtYVI*VAstwEGrx8Jc!>SD@IvMRnu;%WDL)fi>i3 z4D?`%CcUPXU?X#?LzGQ;>is8Rsl3+15KS|Jhzbf2`l~WLbbympWYaZ*Arxp!-|_W9 zFHc}~^m_YK<^BxgPfnjJlIK^S=Wz2fGBS7UC}3kHE(lNt}nQk zqWsBzEE)H4a4U~A@N@p;MPA=c8gWkKZB&>En2^lV9t@+X4Z}^2q!E#(#U2LZ?P=*P z;vO9`xaSl5D!)od(s#oxBH(b_p_Wd`m^gvKYnJdQ-c4QYQ!nFhFpSSQ(5*d_^b2p` zMNvS2|Ez%S3oge?#2DuD$Dl#MTPD?zU2+73qOG1o9<+{gA0<a<@F2P`J9 zy|fki&j)9;U2a8AL>szzPXeY^09M2xCBv?;{s75v{lNvva1Fmh$?&JY zGw7`68}nJ1GfFcX^$9Odz*(Hz8TOEfCW(!w`25z_lNp5fQSo>;V+WbtN5%CwP!@jU zt)O$WDF0>RRXI45;Zjw;p2O6es1w~@Oq|YcpAJwyPQ{*a%Ey-lku7Hnr8|Vm#|XW3 ztJRY0RG>)taGn~|LfUBG^1jsaNcJKAb@J6-LaH;uMvk#YiuBrlz_4`Id$pa%Dmvd# z%lU>q@5POk$UMo$4IL!CgT|dgWHRRx?ulSflLOHu?(`1&kQXQbsfh`1Vof~L%Plq$ z#pA&M@yv^<{o>q}N!&Fu=d!;IV+QTsFVOmuP6@adke{I}qYI@fA(|5vLb=15mC<3K^_;7Rd&3I8oSn4Zs$ zW?XvN6-&Aoyo-xW|GD<_=gCBV9R8m>UGp{SyGMy_$YYA|otjz68M5(fNLh^ih`$Sq z%N>7Lp5O44c8i&oI=(LA28GybIKFHZ<*m+i=YDhUdlse1X}e&hdJPYsx%tTFAFk#I z91cLl6H7-V+D8~jb-95Ms@Wc2#@B9i*!VhWen!j5#vzpvksFkEgqw#e9 ziXHYM>Q=>PzC&{N_~2dQGdDGle=Xkl(fN_y=#u!%^DD4kdHl(t+#$-5@kHr|{@YKA z=4h+#qeNzTqV#<=`b-Stv(T!8*HSmG^BxQHMf6n|pKgI#u-W{T zO%<8vl9|WZh>v@-VZ8VJOKGoh^SpiPHpeora?+3leV{gS?E3i3PuZaKALsk3*bxxb z`hK12ey){m$`|Ynig#aDg6XXP;HK`&aud(u&L{P(|GXtV{Oh0iB^}Ecb?G#w9~nln zR)cKkzH5}ufdF1TFUTkYVo=-Q5`X33t@wJN;PBIfiqT-rRw|+rf7(83&Fc79?9Xk0 z>19-heMjWpu3S?_oW^?IYN6NR4fM2^kd0vhJK}-e-a`q0;o9vK{_<7{()2SFu)?{P zPoc1;|IIet%vvm;lHPYJ66uF)G!*Fg?~(Qm`aw*T@Wjd4`6n@Ygwol?{B^phFtuO) zd@cI;a0^$)VF4y(xqPZ;Vi{iHb|YMT*VbrU2^cZ!b%0A?|Iaw`vd)GYMg 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 z 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

-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%0Dq1Q`DgJ^293IeV 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þ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

j-=!`XLRUH@j=>e`A7$}wDy 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 USxi`YLRIJXJb`5sTgqSm4-s_AxBvhE literal 0 HcmV?d00001 diff --git a/src/tclkit86bi.vfs/boot.tcl b/src/tclkit86bi.vfs/boot.tcl new file mode 100644 index 00000000..db47f301 --- /dev/null +++ b/src/tclkit86bi.vfs/boot.tcl @@ -0,0 +1,127 @@ +proc tclInit {} { + rename tclInit {} + + global auto_path tcl_library tcl_libPath tcl_version tclkit_system_encoding + + # find the file to mount. + set noe $::tcl::kitpath + # resolve symlinks + set noe [file dirname [file normalize [file join $noe __dummy__]]] + set tcl_library [file join $noe lib tcl$tcl_version] + set tcl_libPath [list $tcl_library [file join $noe lib]] + + # get rid of a build residue + unset -nocomplain ::tclDefaultLibrary + + # The following code only gets executed if we don't have our exe + # already mounted. This should only happen once per thread. + # We could use [vfs::filesystem info], but that would require + # loading vfs into every interp. + if {![file isdirectory $noe]} { + load {} vfs + + # lookup and emulate "source" of lib/vfs1*/{vfs*.tcl,mk4vfs.tcl} + if {[llength [info command mk::file]]} { + set driver mk4 + + # must use raw Metakit calls because VFS is not yet in place + set d [mk::select exe.dirs parent 0 name lib] + set d [mk::select exe.dirs parent $d -glob name vfs1*] + + foreach x {vfsUtils vfslib mk4vfs} { + set n [mk::select exe.dirs!$d.files name $x.tcl] + if {[llength $n] != 1} { error "$x: cannot find startup script"} + + set s [mk::get exe.dirs!$d.files!$n contents] + catch {set s [zlib decompress $s]} + uplevel #0 $s + } + + # use on-the-fly decompression, if mk4vfs understands that + # Note: 8.6 core zlib does not support this for mk4vfs + if {![package vsatisfies [package require Tcl] 8.6]} { + set mk4vfs::zstreamed 1 + } + } else { + set driver mkcl + + # use raw Vlerq calls if Mk4tcl is not available + # $::vlerq::starkit_root is set in the init script in kitInit.c + set rootv [vlerq get $::vlerq::starkit_root 0 dirs] + set dname [vlerq get $rootv * name] + set prows [vlerq get $rootv * parent] + foreach r [lsearch -int -all $prows 0] { + if {[lindex $dname $r] eq "lib"} break + } + + # glob for a subdir in "lib", then source the specified file inside it + foreach {d f} { + vfs1* vfsUtils.tcl vfs1* vfslib.tcl vqtcl4* mkclvfs.tcl + } { + foreach z [lsearch -int -all $prows $r] { + if {[string match $d [lindex $dname $z]]} break + } + + set files [vlerq get $rootv $z files] + set names [vlerq get $files * name] + + set n [lsearch $names $f] + if {$n < 0} { error "$d/$f: cannot find startup script"} + + set s [vlerq get $files $n contents] + catch {set s [zlib decompress $s]} + uplevel #0 $s + } + + # hack the mkcl info so it will know this mount point as "exe" + set vfs::mkcl::v::rootv(exe) $rootv + set vfs::mkcl::v::dname(exe) $dname + set vfs::mkcl::v::prows(exe) $prows + } + + # mount the executable, i.e. make all runtime files available + vfs::filesystem mount $noe [list ::vfs::${driver}::handler exe] + + # alter path to find encodings + if {[info tclversion] eq "8.4"} { + load {} pwb + librarypath [info library] + } else { + encoding dirs [list [file join [info library] encoding]] ;# TIP 258 + } + # if the C code passed us a system encoding, apply it here. + if {[info exists tclkit_system_encoding]} { + # It is possible the chosen encoding is unavailable in which case + # we will be left with 'identity' to be handled below. + catch {encoding system $tclkit_system_encoding} + unset tclkit_system_encoding + } + # fix system encoding, if it wasn't properly set up (200207.004 bug) + if {[encoding system] eq "identity"} { + switch $::tcl_platform(platform) { + windows { encoding system cp1252 } + macintosh { encoding system macRoman } + default { encoding system iso8859-1 } + } + } + + # now remount the executable with the correct encoding + vfs::filesystem unmount $noe + set noe $::tcl::kitpath + # resolve symlinks + set noe [file dirname [file normalize [file join $noe __dummy__]]] + + set tcl_library [file join $noe lib tcl$tcl_version] + set tcl_libPath [list $tcl_library [file join $noe lib]] + vfs::filesystem mount $noe [list ::vfs::${driver}::handler exe] + } + + # load config settings file if present + namespace eval ::vfs { variable tclkit_version 1 } + catch { uplevel #0 [list source [file join $noe config.tcl]] } + + uplevel #0 [list source [file join $tcl_library init.tcl]] + + # reset auto_path, so that init.tcl's search outside of tclkit is cancelled + set auto_path $tcl_libPath +} diff --git a/src/tclkit86bi.vfs/lib/Ffidl0.9.0/Ffidl090.dll b/src/tclkit86bi.vfs/lib/Ffidl0.9.0/Ffidl090.dll new file mode 100644 index 0000000000000000000000000000000000000000..4eca6ca8f319b54f3c9acefbf0f7f4230faca6ed GIT binary patch literal 64512 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 literal 0 HcmV?d00001 diff --git a/src/tclkit86bi.vfs/lib/Ffidl0.9.0/ffidlrt.tcl b/src/tclkit86bi.vfs/lib/Ffidl0.9.0/ffidlrt.tcl new file mode 100644 index 00000000..f87f1138 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/Ffidl0.9.0/ffidlrt.tcl @@ -0,0 +1,333 @@ +# +# Ffidl interface to Tcl8.2 +# +# Run time support for Ffidl. +# +# NOTE: Remember to update FFIDLRT_VERSION in configure.ac when changing this +# version number. +package provide Ffidlrt 0.4 +package require Ffidl + +namespace eval ::ffidl:: {} + +proc ::ffidl::find-pkg-lib {pkg} { + package require $pkg + foreach i [::info loaded {}] { + foreach {l p} $i {} + if {$p eq "$pkg"} { + return $l + } + } + # ignore errors when running under pkg_mkIndex: + if {![llength [info commands __package_orig]] } { + return -code error "Library for package $pkg not found" + } +} + +namespace eval ::ffidl:: { + set ffidl_lib [find-pkg-lib Ffidl] + array set libs [list ffidl [list $ffidl_lib] ffidl_test [list $ffidl_lib]] + unset ffidl_lib + + # 'libs' array is used by the ::ffidl::find-lib + # abstraction to store the resolved lib paths + # + # 'types' and 'typedefs' arrays are used by the ::ffidl::find-type + # abstraction to store resolved system types + # and whether they have already been defined + # with ::ffidl::typedef + array set typedefs {} + switch -exact $tcl_platform(platform) { + unix { + switch -glob $tcl_platform(os) { + Darwin { + array set libs { + c System.framework/System + m System.framework/System + gdbm {} + gmp {} + mathswig libmathswig0.5.dylib + } + array set types { + size_t {{unsigned long}} + clock_t {{unsigned long}} + time_t long + timeval {uint32 uint32} + } + } + Linux { + if {$tcl_platform(wordSize) == 8} { + if {$tcl_platform(machine) eq "alpha"} { + array set libs { + c /lib/libc.so.6.1 + m /lib/libm.so.6.1 + gdbm /usr/lib/libgdbm.so + gmp {/usr/local/lib/libgmp.so /usr/lib/libgmp.so.2} + mathswig libmathswig0.5.so + } + array set types { + size_t long + clock_t long + time_t long + timeval {time_t time_t} + } + } else { + array set libs { + c { + /lib64/libc.so.6 + /lib/x86_64-linux-gnu/libc.so.6 + } + m { + /lib64/libm.so.6 + /lib/x86_64-linux-gnu/libm.so.6 + } + gdbm { + /usr/lib64/libgdbm.so + /usr/lib/x86_64-linux-gnu/libgdbm.so + } + gmp { + /usr/lib/x86_64-linux-gnu/libgmp.so + /usr/local/lib64/libgmp.so + /usr/lib64/libgmp.so.2 + } + mathswig libmathswig0.5.so + } + array set types { + size_t long + clock_t long + time_t long + timeval {time_t time_t} + } + } + } else { + array set libs { + c { + /lib/libc.so.6 + /lib/i386-linux-gnu/libc.so.6 + } + m { + /lib/libm.so.6 + /lib/i386-linux-gnu/libm.so.6 + } + gdbm { + /usr/lib/libgdbm.so + /usr/lib/i386-linux-gnu/libgdbm.so.3 + } + gmp { + /usr/lib/i386-linux-gnu/libgmp.so.2 + /usr/local/lib/libgmp.so + /usr/lib/libgmp.so.2 + } + mathswig libmathswig0.5.so + } + array set types { + size_t int + clock_t long + time_t long + timeval {time_t time_t} + } + } + } + *BSD { + array set libs { + c {/usr/lib/libc.so /usr/lib/libc.so.30.1} + m {/usr/lib/libm.so /usr/lib/libm.so.1.0} + gdbm libgdbm.so + gmp libgmp.so + mathswig libmathswig0.5.so + } + array set types { + size_t int + clock_t long + time_t long + timeval {time_t time_t} + } + } + default { + array set libs { + c /lib/libc.so + m /lib/libm.so + gdbm libgdbm.so + gmp libgmp.so + mathswig libmathswig0.5.so + } + array set types { + size_t int + clock_t long + time_t long + timeval {time_t time_t} + } + } + } + } + windows { + # + # found libraries + # this array is used by the ::ffidl::find-lib + # abstraction to store the resolved lib paths + # + # CHANGE - put your resolved lib paths here + # + array set libs { + c msvcrt.dll + m msvcrt.dll + gdbm {} + gmp gmp202.dll + mathswig mathswig05.dll + } + # + # found types + # these arrays are used by the ::ffidl::find-type + # abstraction to store resolved system types + # and whether they have already been defined + # with ::ffidl::typedef + # + # CHANGE - put your resolved system types here + # + array set types { + size_t int + clock_t long + time_t long + timeval {time_t time_t} + } + array set typedefs { + } + } + } +} + +# +# find a shared library given a root name +# this is an abstraction in search of a +# solution. +# +# currently wired for my linux box +# +proc ::ffidl::find-lib {root} { + upvar \#0 ::ffidl::libs libs + if { ! [::info exists libs($root)] || [llength libs($root)] == 0} { + error "::ffidl::find-lib $root - no mapping defined for $root" + } + if {[llength $libs($root)] > 1} { + foreach l $libs($root) { + if {[file exists $l]} { + set libs($root) $l + break + } + } + } + lindex $libs($root) 0 +} + +# +# find a typedef for a standard type +# and define it with ::ffidl::typedef +# if not already done +# +# currently wired for my linux box +# +proc ::ffidl::find-type {type} { + upvar \#0 ::ffidl::types types + upvar \#0 ::ffidl::typedefs typedefs + if { ! [::info exists types($type)]} { + error "::ffidl::find-type $type - no mapping defined for $type" + } + if { ! [::info exists typedefs($type)]} { + eval ::ffidl::typedef $type $types($type) + set typedefs($type) 1 + } +} + +# +# get the address of the string rep of a Tcl_Obj +# get the address of the unicode rep of a Tcl_Obj +# get the address of the bytearray rep of a Tcl_Obj +# +# CAUTION - anything which alters the Tcl_Obj may +# invalidate the results of this function. Use +# only in circumstances where the Tcl_Obj will not +# be modified in any way. +# +# CAUTION - the memory pointed to by the addresses +# returned by ::ffidl::get-string and ::ffidl::get-unicode +# is managed by Tcl, the contents should never be +# modified. +# +# The memory pointed to by ::ffidl::get-bytearray may +# be modified if care is taken to respect its size, +# and if shared references to the bytearray object +# are known to be compatible with the modification. +# + +::ffidl::callout ::ffidl::get-string {pointer-obj} pointer [::ffidl::stubsymbol tcl stubs 340]; #Tcl_GetString +::ffidl::callout ::ffidl::get-unicode {pointer-obj} pointer [::ffidl::stubsymbol tcl stubs 382]; #Tcl_GetUnicode +::ffidl::callout ::ffidl::get-bytearray-from-obj {pointer-obj pointer-var} pointer [::ffidl::stubsymbol tcl stubs 33]; #Tcl_GetByteArrayFromObj + +proc ::ffidl::get-bytearray {obj} { + set len [binary format [::ffidl::info format int] 0] + ::ffidl::get-bytearray-from-obj $obj len +} + +# +# create a new string Tcl_Obj +# create a new unicode Tcl_Obj +# create a new bytearray Tcl_Obj +# +# I'm not sure if these are actually useful +# + +::ffidl::callout ::ffidl::new-string {pointer int} pointer-obj [::ffidl::stubsymbol tcl stubs 56]; #Tcl_NewStringObj +::ffidl::callout ::ffidl::new-unicode {pointer int} pointer-obj [::ffidl::stubsymbol tcl stubs 378]; #Tcl_NewUnicodeObj +::ffidl::callout ::ffidl::new-bytearray {pointer int} pointer-obj [::ffidl::stubsymbol tcl stubs 50]; #Tcl_NewByteArrayObj + +::ffidl::find-type size_t +if {1} { + # Tcl's allocator: malloc, free, realloc. + ::ffidl::callout ::ffidl::malloc {unsigned} pointer [::ffidl::stubsymbol tcl stubs 3]; #Tcl_Alloc + ::ffidl::callout ::ffidl::realloc {pointer unsigned} pointer [::ffidl::stubsymbol tcl stubs 5]; #Tcl_Realloc + ::ffidl::callout ::ffidl::free {pointer} void [::ffidl::stubsymbol tcl stubs 4]; #Tcl_Free +} else { + # access the standard allocator: malloc, free, realloc. + ::ffidl::callout ::ffidl::malloc {size_t} pointer [::ffidl::symbol [::ffidl::find-lib c] malloc] + ::ffidl::callout ::ffidl::realloc {pointer size_t} pointer [::ffidl::symbol [::ffidl::find-lib c] realloc] + ::ffidl::callout ::ffidl::free {pointer} void [::ffidl::symbol [::ffidl::find-lib c] free] +} + +# +# Copy some memory at some location into a Tcl bytearray. +# +# Needless to say, this can be very hazardous to your +# program's health if things aren't sized correctly. +# +::ffidl::callout ::ffidl::memcpy {pointer-var pointer size_t} pointer [::ffidl::symbol [::ffidl::find-lib ffidl] ffidl_copy_bytes]; + +# +# Regular memcpy working on pointers. ::ffidl::memcpy kept as is for compatibilitiy. +# +::ffidl::callout ::ffidl::memcpy2 {pointer pointer size_t} pointer [::ffidl::symbol [::ffidl::find-lib ffidl] ffidl_copy_bytes]; + +# +# Create a Tcl bytearray with a copy of the contents some memory location. +# +proc ::ffidl::peek {address nbytes} { + set dst [binary format x$nbytes] + ::ffidl::memcpy dst $address $nbytes + set dst +} + +# +# Copy the contents of a Tcl bytearray to some memory location. +# +proc ::ffidl::poke {dst src} { + set n [string length $bytes]; + set src [::ffidl::get-bytearray $bytes]; + ::ffidl::memcpy2 $dst $src $n; +} + +# +# convert raw pointers, as integers, into Tcl_Obj's +# +::ffidl::callout ::ffidl::pointer-into-string {pointer} pointer-utf8 [::ffidl::symbol [::ffidl::find-lib ffidl] ffidl_pointer_pun] +::ffidl::callout ::ffidl::pointer-into-unicode {pointer} pointer-utf16 [::ffidl::symbol [::ffidl::find-lib ffidl] ffidl_pointer_pun] +# ::ffidl::pointer-into-bytearray is deprecated. Use ::ffidl::peek instead. +interp alias {} ::ffidl::pointer-into-bytearray {} ::ffidl::peek; diff --git a/src/tclkit86bi.vfs/lib/Ffidl0.9.0/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/Ffidl0.9.0/pkgIndex.tcl new file mode 100644 index 00000000..6e6aab19 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/Ffidl0.9.0/pkgIndex.tcl @@ -0,0 +1,12 @@ +# Tcl package index file, version 1.1 +# This file is generated by the "pkg_mkIndex" command +# and sourced either when an application starts up or +# by a "package unknown" script. It invokes the +# "package ifneeded" command to set up package-related +# information so that packages will be loaded automatically +# in response to "package require" commands. When this +# script is sourced, the variable $dir must contain the +# full path name of this file's directory. + +package ifneeded Ffidl 0.9.0 [list load [file join $dir Ffidl090.dll]] +package ifneeded Ffidlrt 0.4 [list source [file join $dir ffidlrt.tcl]] diff --git a/src/tclkit86bi.vfs/lib/Memchan2.3/Memchan23.dll b/src/tclkit86bi.vfs/lib/Memchan2.3/Memchan23.dll new file mode 100644 index 0000000000000000000000000000000000000000..cfc4603b6bb065686dd25ee5ef14223929bde840 GIT binary patch literal 37376 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 literal 0 HcmV?d00001 diff --git a/src/tclkit86bi.vfs/lib/Memchan2.3/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/Memchan2.3/pkgIndex.tcl new file mode 100644 index 00000000..ac83c2b5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/Memchan2.3/pkgIndex.tcl @@ -0,0 +1,2 @@ +package ifneeded Memchan 2.3 \ + [list load [file join $dir Memchan23.dll]] diff --git a/src/tclkit86bi.vfs/lib/Trf2.1.4/Trf214.dll b/src/tclkit86bi.vfs/lib/Trf2.1.4/Trf214.dll new file mode 100644 index 0000000000000000000000000000000000000000..34d56cbebcd69509bfcad760e161d641a0f2635d GIT binary patch literal 143872 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

s?) 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±V*>068=W`JK?Ls-wQ{Ce-yqW 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 literal 0 HcmV?d00001 diff --git a/src/tclkit86bi.vfs/lib/Trf2.1.4/libTrfstub214.a b/src/tclkit86bi.vfs/lib/Trf2.1.4/libTrfstub214.a new file mode 100644 index 0000000000000000000000000000000000000000..60c236ab123302f79051708a7d553ca22db1da95 GIT binary patch literal 1668 zcmb7FUr!T35TEPSij9AW35o>cN_aqHj}}TP4bh88I1)%2A@X1X{da{kZLhgoNF_!| z5R;~9!jp;LrbgdaSLe{oiS$CD2AIVl;ouH@_}6kBs&W3ScysMw!tbkoxgScF;KJ@FAlmEeAjO zeWUfV&uHB?n$ooYJ^gz9+pPy5=?GBB_COzM^NEhpJU%(hUIjo^!Va?CKT~@O>bGPet+d(NhR2%~(qC%t)iYqy}{~!ghSiWLy){1tu zni;{y^)>6rlgabmZd;=Z&o9i)W!P9Fo!UqxV|ClL8Zp=0iaF*^;t6}cZB;lcyk*N) zZDB38mP)d^W52;4?-85UCbYPhfKO0&-@z4zVdQs(Hin#fCJdQV+cIi{!bUZbUQ~d3 zT@?c>HLB)KVM7M@a4DdbtxC6f{+37r>9HpjoSx9RzV2euotYRjG&-#pTjr7BdfAo*wU3c6H@?h2YGn zr^mt6YHP3B+Kbv7wH5`fCfpHG1aD|t5v@IAKtWpyv^u}fTKk-tNdWtOp7*bp=h2)w z`?mJl>%Q0Cr~Rv4p@E@LsEYrJ#Zc%8{>s0o{{Pee*Gci-2QAz?^w^Nq2R{)`u0D9; z^ee85%((WN%dfrU>yas!Tz&O5smP_5MXpU>9l7G_NPNQCk*{Af^|GUCYxipKyY6TU zg{Iy%w9i0WLPvdm=zswShMK|v#D9B*Li0vYrB15d@pY{%&jSqH^1E7o$iF7@a&*H0 zomVIn(buM}JZdMUKczPt!lBdU$Chwt3FDRiJrEAfv`W9|Za^p^2;0NINZo)?<8I2j zKMaQ^`5^A5ICNC%vY9Cgo;aHM3WzdyS(J)@lS3VokD7W(>JoV;Wl_J*ar~|L7Y$AB zKI&Ri@ww9|=%75w-ggPrtB#%RU#}^8)J#+FWPxoS<-_@V&u;2ndfj!D zgt~_Czcqc!<-Ppt6!|K;P^ zc4kv#L5PWYJ%@)ww$o!fi@oa);L)u=8bYvhZ`jTNejFn|oB@i1)DU~QGC^~KIp>`#-8SadCYd+=07;u~pXuC6N80nLZj5N|ZC>pX` zms!~wz}U^OZ#Neicz=K3u$BEX_1r#=rhZ*|F`NduZtADb&-^Exp6`95USV3Om;tPC zP{GQjfuIC?;foa$d9L!uGyg3X3kkvXQ2{^EwUs-TSH0^E{xh3w+pS&-rj~=%PzYjA z?Zxcu!XE^mNhjXW;!JEf&UTUwjo!y2Sp@IEa46~W-j(+*@3sCMseg{`{N2vi*3;94 zg*QipLpn-%d?~+haaZY|$_v|BWxI(+JGV0RSvQ>T5L7z*%&r5llK~9!FLsGYv6qii zUC7^vz{=lI`d4L!nNPlYfy$jzM%ivGVmqfm2r;_uP7Tb2!u)PrJgut?kC80U%DPS& zXpn+3L?HQ$yH7lSN)dd-o$%}-J_OWoqfNH6-be_$xIwtS+@CM2!0CZ=w8w#VKGgsm zFWAn9#jg9RfErjnAFPM%+M~Q1grMAkwzIX^H40XuM*3ZOk-ugV1X=8wi3rmQAHsv> zUXB(1u$kz}d3fbg^P^eX;9_Y5{nVoj-k2^V-tS1ZZ=1B=gm;Kq_?nLTi|n ztr<*R=QTix0K($F_$kyQ zQ2O6?z9Ve6K6~wm-o_HXGX-9~nEFiTjl~nwTRU(3aud)ud zv#7YvS4O~8USIT3OA=O?l+4TjlqqI5fS=5g7C;aA>)#^lKTFUC`kxPo`vyBdvEhhf z*Ce53XDKXnMBYA(I$$vAo)G~v&$om_3x&wRFq84_6w+|kd&kKb&U+%E?^{+i@FF{( z92k}k;`wN}eM+}?Iu+!%?OarokGF)KQ|kmKUDV~gm&q+SOghdVIh{dzUFDa6|GbZe z$^h%VC&$Rx>%Da zNcl4UV&}!qt<>qs)L+#8Vk{s0b)@Z18YPVz?AE`f_J{YR-`_8ie$zuUAB59S%92Mz zXag(;k4cpDee9x`P+^vWP{`009@#k@mU`4^M=7tlUc8 zKKux(&dPp|$IMPFmGgksn#=0(v&zbz&x4&GyW@CN&CVLc?mz&ta*t9yfFDNQaT6p3 z86jc@6}!ZSHou%5Ho`qpdMm^kS-^lm8AqmzsGBED2LH-H!n})$uQYcTK2K*pzd#P( zr+=9F5ugxxK{b)r9W>NQ75)jc1AXeES>u2@^)(=_Ev`Qf zhq`%F_fDz1#MG5`RCMK)>O-+Z+nQH0(dM-DGTYlLCpFS@R^ zzv3mrruYhVdS9;?za*RHZ1R*7(AzJ!J4@P})!v5fB8!p1BAJUFQI_6DYF%Qx(?_*C z8bdN6f|4=;rRW+~(A9_naDWAm$2J;;T64)Yx;DNZ%rw)xSXOw*il_ME@fI z_NyQ!L^J`hh+?4j!^g-Bw|dv?C>Gmu?^xN}1XQ=$nkln-OIJ)3qMg5>VMapaBJ{Oz zs%gBJ!H0JYjT5L{=!kXWrPs8(p`8MaPxfBgCi0{Hw>Rj>wmZCd_Y8~@P=0dZ2$rxU zZ}Qc90bOs_mk&yhvYt<~p0a$HdRBZ*I|Q1q-p~xZR(u7ZPo!g6?(*ukK{cvhZOqR| zu*70)=4)rtnXE1bXhheLDcmaqAbiX^{}azxnEeb^~6l z4BnrvFN4>q#PG>}(lIRhd7_FM)YPQSW;teH-}7$o;T^ISIy{)k$}6+j%uLgDzvmZ<`MH zMnSf_-8%wk1+Z{emt>NE?CulllZC&W&jIlNY4 zLLy1c-j@RXkgtwX)_aftJHYqfiA(ii@3Yf}K7;@ah8yU&gSG*Nzpg|37#_*E{`!vN zz3{T)_tk#*mGPPk-KCBNx0_N@Sp*!6@eocj zr5i(&^^4?pg|he@GOMqD;IGG=O?6_TsI!lw-|jq@O2Y!5Tr2HaXbc~v`F!m+rAy>u zH0exjXj-@ebbzz3n}KZSDj@`K2GI7-4rtu#5`8ddiHz)HAAbz_ z$5a{nR>n>^J-v5>^|JkI@ZqdWI4cuV)-dv4kI*T44}L^vz86&CZ>asbq_a&F`U^>C z@r@(kUnwhqtG_-;4dZ#ZJ{Qxc;xaT~$nNNP zqJv4tt#KE%w=Dzo#ysfEqkdgt#>UuHH< zvfZ)yZ^+zFfU{%H>V)%>kh9Hb@Z4f6`+I%p@h<<2&KVa7w*BrJ@RuXFv@AU>k@;`9 z&GC}XMrkOKHr9$B_FEaS1-93mw?Yt^uF{;IBBB0b{rk^L>}2+(612+KOU#>I)SYe= z;l`vgOD2`{tvzLP=go%~BWb+n!7*djpd|D47ab-3Xcwavu7${j(u&_*p|?QleR;pIZ@#_=Se0Bb3SAuNTSHIofg@*7Ctv$lsfs_@)ge&l zYhTo+)pH-|`+AXieNDgDe>AT<`n`V8yl$?1?fb?!{MFyTMmi5UEA8R~9c*p%p?At} zH06}m0aQQvT(Y;6evWL{y5ikocfEq$l@!@o?6T<>k8p8%rtO|O%08+3sfUqTm-6sy zdH4zsKahtG9vpcXZ{s5-^H+%xjqkUE&}p%&b078pPPa2RBV>`IEi=c76dnhZZ(l8n zp&-(yBUmoEM+6di4w?_`wfdS)oVzW9P5bpJ1hLUxQ6wI3<;RY5M@a{`~=91$-d@?APZX z4Y~|`(;OebJ;DcoL4Ui#ce&}yz*p+)Q{gKXX9xX(KW5+A555tV@CD%Q8Go_>{(9^R z-*OX>Ht?1D`u_&sb*4{)zfzxj#^0yG_r?D^d?kBoGTLLpl_E(7OTx zH6Uif6O)P>(iPP0Df{?Pg= zQurflpMe0?bpGOiNqLm^9oP~35`HvsO8|~w-2jI7!h6izt)5BWyMRVd9p^7r`6J^` z>_5Jd_~{x!J|>y)GsATiZhC)r@d9TJM1vC`z_YRlQXF(?dISb^t?f)2r3wofx!6Q+ zSQ|uij9GeL*{bU!Wz)KhKSmD(Pqee*nKo{c^pqN!TbmxN0e5Gp?aUa(pejfgSJ*>> zj|f;So*6YUaZK#J@$3mj(lm}J)<0N^Trug6i=_6}aKPD(=_6ph^cS1ElMZ%4Fh-z%gZTv`tMcpd z?k#8xW{~vMixE+M!50Khw)eIMT@=18nCKIYh7f<$Am*Psbg#12EJD1I7bpungEr^+ z-jU5KiKr;fcY2>wMV30z&MbyduiFlS(r+@_`-jSCJH-V%oKc_w(a^q+7P~NZQ7OLM z21{2Lh`WBS$)ibZExzX~Dj z^CQ@@m`;x`PQ?$e1Do0vTZY9{EHfBFZ}Cm8@P2DE&xW0j8rx|b)x3?!Tk0-WStQ+` z@Rrm{6i=gae0#a9QmFT-ARa=j(01EdiXC`o&Q9-uM?}u1zU1E1&`CwNtpUzW&Sn@E!o0&ay%cM94G;M16Q zh`u-Np5li$-LzXnIf3I%Ezo#`p+nv^yaE1}3jZ@G7b^26>{@QN(c+Cz%MgA*=lTLSJ|lkP(^=->MsQ6ij4A<^y_IUv$Kd!NA` z>(7!zZA;Qp`4TQHY)5zm^2Oi(G3I#^$rT6$Rg>O<8tY9TuUx9Eh_FiS3rUn1(|cHD z5gwvY)UfQzRG`xWnNX=ez_%@i-*n-!>82Akz~z4}Ub}?b*sCqckN*MREqDMh`Dlet zKs(xq8KK#I6s~lwfVB%q!TceteLpV*wBCyu<`wEL?-%rim(DAIeZaUMcIEs^`c9Oj z(!Rd4~@cmp^T(+=`U+U4pHWNklVL zK=1JW`fr{8Uor#3pe?9Yp|4B&$$8ZaDIAdE;?#M-(Syp9=(zikY%-R|XHQ$U7hYCj zv^aHy*@7SRDO>OoMJjelygZPyh(F_x_0d03@0Jaq!aeX*hHhTlyi&|qxQ5B&(u=CI z^X+UpZSP8Sf>WL0n!S#g4*0ilI>NPr z-b?(4tuyw`3uPAAcZ4IKlYL5<2j>S`oy6LAwwws*Sy@L>f|)WnEeI@j)uAL!;+u&V zqjk*oUfi0$uWmOjj&<%lF})9#NP=99Hf#Pq@*?$NTXt>gLOO~)VYZpqOLXhNAn2x` z2xj8qgqc8`u`2_OI<1Rn^@&#Q>!6@-Nig5U=&gy&j_~Y1_TIOvKI&i_AAODyvo7u| zN1D%$qW9NdAc5K~#$0DBKVN$dAnEE>?&WtF8KWdurtfz5k{YPG4QZ5UjW>*fIkELv z+;y0;{$@Ys>oc}{ZjDf~t+Y+*!c?-U-Xz8h0sIWztW3S$yHGT&Q_$Eui4jY@n>&R{ zm&V+x29p;Rb4E7kcJAi^o8>4`p;(L8C*3i7@qU5WtO*2YM`O&{5n%guI+S>poj{3= zqK33jI7c+d?}+?Ppk!)dLiFuK!s}!cI^rcx(25kD>}@7HM3@OOIID@SPA*88D(Rle zofF~z&xKZ!tp7oYFb-^)sWi&+t(+r_R8NXpJzLMI07xO>{e z28cZYA%HN+IHC>YN0e1ak6g@Pf1*2V&94*c`zORVxgYV}dVmn0wABLBn~-4eQas*3 zZHPVDc}p0s@T}Z48Mv~{A8#}k;P&wBdA;{4{gH=cJ1bJKLKzNJOy$S6_#z{??NMQeSJ>;)tE4IV_cYB_CL{>eWaU+ z80_wY6f*o5)D4#5Yea~_mx-ks{M*aPedzbL%>NbgG+%$$etrtfDlh&InutQV3EG0^ zVR4bs>%BKTzu;0KI$oUUi4bs>S-EriRh<`9J)vL0_kx1Y^(&Ya6jW0{*6%0hAq(yU zj|t=l!eGI%%)|#}X>)gMLFbnQhz~xpe{DM#VqN5kK!ijZ2<|;=ol%uHAg!ebK~V=v zy#A3u;tN+5^ybUoG?ltv2O< zR2wa3WxhV~KdLR-S9?41e^mSROkn zHeqkA_M87vZN)WO?c4vO+BYU?wVD5;+Ft7wy%+SUX0%r2nofB|tDVxPn)0|PfPcM; zcZ5X_hz2#R6RzIc< z0BuzTYRm{s{&-fKfm9zB_PdIN&pYKSq_(e#8s*!xpkW?KKHks@D-TD;~x z`8wAAw@Ucb@>w;Kybz%{NvODko|9N=LWLiXfC?vFA)Q-U5#oNTY#EKt&SpX)Bp3RK zn`EhO<>dAH-DOB-^ZN2XV=Tv0tm64 z;@u(Uh5AmqpD{HYt6YHvFISL!vc1z^2pa2Al;Yj5kzp^*3kN}%`mS&^Phjs=BGi(_ zl&}92PhJ#BnCp&O_bk^OR^w0f&0n4b3sxnZ=dqZCFOtp*D|;B=Ay01YPIsqCcLol#x zqqZmAs!`q+f|!tacMN0)xNi^5M!I}Pg&f*Hz&&ooa>WPq>z~&+Cp4Q_0&~KQk`;<; zRA5pcUXlC>A2uU$dY?(MDI(a3+Rn3p+KD*(6k`Nd4GFw?A9}MK{W1!Jt$LmUR+2`G}RgaM(pY@llTOn=Cvl?;cGB4 zN`z}T(6*E~oV%~HG_MCloI(E7@q?8(NBHjt`tNZk0qoF6~F+^gVK|K{jNIByFCO@@LK0LjwOlmK)7}hrn+*vc(1Ms@E7g@Kf z#YnugQ~|TVyUrB;6kl-^h3%z6?<=O{b`^M@D8GFDu@rkz16A&8tWeUOHktR4QZu{} z?;yWILMuGorOZ$tuBfx!`;YELTe(BE&hNIEI&WJ6@Fa$KuljYu)By@!87P)h%UkFd zzQbS&BF=(<_?Q&_*e_h(ukZmW?DPvIZ9VDE7fjR6sTg{TcY$B$wtgL4DII*-FTBDO zYG6)=K3fVu?-wTf6@FO?tNp^G`xPE8g`TpQl^fo#uwDvR`GxYbiEe2Ent)=ifzfdryX!LRXCuw=EUnm&UmOhSuB89Df;gq1z zZ+V*(e%3EMH7N93UMqz~jm}%S(Ltf#@_Z@W=ob#_S7=M2@V9t1AJDx5w82bej1)fP z7p@Ho{caDELf0>p9U+9%aNf~@XR%-3e zLSt|Dj__Lx#_0a8a)o^T9sKZyQo(kW&P(H_C=ed}V5gbYe$v?erB9F-miiE$TIJXI z7yU3mv{VQooFoH0LIq*sQtwB~+k5`ZP2(xYV!r6~8oN zN`=k0a*XQu>#2>4ARfcrCrnmjH{)75+=cs4V0cs6dYzO%=Evri%Bb zUpRz9-u>7#15;)F!oqn^m}>XRDUZTNM#N|aH8(K@*|zE@Dhtj!RX#?(GhLa`*z$D0 z<_{_uqf{nzXt^}$mtIdP@Fv}0PJ*z))d(nwN|fOvFjH4}oJQq%@WYZx>Kof*FX@+$ z=f_8E6BUU|%va5k^-0;A!xRLZ7KZZHnN8?}?J1Ne2qNMgXpkhCAK6L7a|D%6DNbB7 ziur5w#vJN2{(>Gqv9cJA5Hm;ih@e+{VR50|)9ZE@Pd{foxGcxhPbcwt*R!BaeJh>K z7VTOxmu1J}4rD%FOowm}CJdQT^#i0fxv{}f1%{4DueAV7ihky0#f<)_*zYv{NEGx4 zW;N&bd9m1@FSrd%@tdZFlAF+fZZBe+K(0htN$!jfnoI;diY6&|7ZNo zgtIp3Jlp1;))f19&-~)RaQeKMd&GB{DJL=|I?;a{m>4-R@{(qhcnzV8O|NzUBqxqM|@5n9#ej-XF`n6}7StQYavHr{-!MoE?_byWp<` zsc%%a()Lo}^B7@E;u4Xdl6Zqcn2k)S&>;o_>)Og8xH!+#x(K3W{!?q^!~AOlC>=qtEv%v9q2%n#EH_Z-&xIc2J$!)7j=5OgBw|i9K5B%f4bt~osYA5&8{!dv2<_aA)BD3|UE)2o*!gqnV#cn9#~w!eib|4ALIb>Lky22J z8iQAgOPKy~TXQi$)htpUW=CX<1%k1pd&4Lq3$`;#wt}7MHL_=ubY|4WNX=@`ksKS1 zP>mDv(MI{3bY_l9RY^L_^6?Ux2x%`85ufCJV~wtkm3@Hs>bBd?c!CRvoO5jOv3?b= zahF)19&aj@MRMIi-F6`w#0Fv{!k>Sp2zM`%bg(Gd5zv7 zFt(f_wsJGUGbfluNc%P84e{c4Ch?m*@OUVNH$IasV&Qy~?xHCI9ySqOYej zws*+8GT-zb_4PO^?M7eslLs@C?!nHh3AY2)cc&2m&Rgxya&O65vhEz>$jwqbj(PCQ zA|R6u9r)b|_dI;~xI{b2*_cTMQt}wF#5G5$BjyOz#U&bf!}?j8V9W`BegL z-F1b|xD32zK*;?1(bpvCE1<3iz&st3W$8`p2uS92U5>GBV-0ml%#84zQrF2Ek||S{ zM$3{7CuephQR2c71A!>F>KHZPm(>KcGuT-l zcRpOV5pp5|?LJ}1XC9rG$>&uF=j2)A{U92M8QJ9hVuDN{^&nW$;~#s7iRsGq4T<>+ zqH7=vB3Nm6+hi?T2br}HqK^u_H+r|6?XSvb1b(wBsAY-X_x`LuJREx1d zW$%M!LI--JFNn|gS)VzZM6Ba}E;~u=v;9~pHVXzx?p}w;17trZY0)?A*-UMi%toKE zVq7+ci9@qi5S7H1BgL)<;5fvQuuk00-`p?>?2PT5O#BZbxw)amcMxSQO58zeGllQL zhD17mx7hU%y-+1i1_i168eU%SwVt84{u4*<1l&G+pndzKytB#|tyu+Js9M$xQyfet z-0`SR{2lKwm2BxlM2PW%Vs3L7lo=3~0Vko)1i8|#cP{53zolBJY;TqJW1e9&ZaE0H zW3nfTQDyhvjsa)gYX5nM7=dcGW6q_v3?RehcSw*s9X~7{p`k z@!&-wmFnp@j8u{j6z)f%*^dDqLkeG$;*!1*59z>)J9v;-)lakvbRiB9ND#AcK0@Fx zxz%_3wVYLWmFi9UAxoK4{_M#j|C<;Zm^pm~bV4YAbM`>ASA9G0OMXoSJih;dLQWwXCR(h-wPn+BmG0fSu zG^ES%D(Mp!?*Po&+_n_Cqx;gSxA2Hx$#{gp~U;p#~W^(wVVo}tYOh>BBCtdp5ao@dh>Lr>;`=&}vApG&rK zz%5Otqp~1&*i#CK?XZtZrsF)S=?weoJ>&_?!U$3xcmi^=V_cZExW60okW9G>{Fm%0 zckElo%e>jJSmnITN*G~>cLe|eSgAU2YN8t@|5E&A(rtu;FxCI7#(erU)$>X~nU8hR zno?h6(eh?VRd~VN%w?z%C^{F@vnZ0_;pgHj4&)jPvzdzBl+{^r{@rQm{fp19YBRX4ieSSv-mL`fL? ziNEFZj)qL&9dDtcmZPJu!8DtXlQkD#MhtHMb{nw{r8;}_uT=E4yZt`l7rkFZ@?tq4 zvP=RmfuU?zha05So)s^QO|tBtz&TVZtO0v*p#nUGinCq689XJtB}z6bY=u*YITrAi zm0Kw52Y<=E{3&eYGPeZWpUvms}@_mypE?FP|ZTqnyUf`Ucb4O^Dwojce!g+3$JEuFK6DOyBD zWbd-ze90u}`pjcxZCVWKD}Q&HPC->9d0Bc)ECvN zKmx7(SoT0Ar_sCpH5Kd!`mxk4dcr=LA0~0sUsDagY=y*8HLO?8O_8UHe7#1w-C%W_ z^W3bdY%kjRs%RoVsmAWvP?gBv9BS#U6?p*{HrcKJNyRwUQHsmU}0?o?}tAJ3``jLN3oL^0?Gvag%pAJ_8+)v6?Aw0haY$>L-${D94nq zT2!O)tbL`2p{56KGY+|(Syq#5eLww9;Tn`sKYNK}NC{E7Hb;b_SVxi*B1tO=yYSXC z65r{&zYf3M2xW)uDeS+lR+aQwl3eTTp0}&)@S92Zavb*oZ5-s}Fb!66n|oD54ROes zq%wZIPwE?OZVHB4KE4i84aK%C8R+-_k?L_!qt@O+c_TC?k7 z3*;VGH6|L_SxqWy<+{mLpnc}!k=E@~t0>Rc|MU~oj?+tc^9Oc#O>sjP_Vxl+RK!A$ zH~UG!#*)4&3n;2moXb29JyQKA>gwR$+0^Y_%Xt@;*}CIUHe#)8k`3ON^?USvd;Ss0 z%p)*XEnp)k3RZRtmAspNW8jM#u^o5Eqnr^nq+FB@E~Gj?B7%gZ^P)HS$6`TSxyh^# z!n!8uaFx=@TMExGX&-5vxxk9Mw?kn@SS<7j?$6v3%mwcR+kVqSU|5_y!FUe93p@nJjs zH-ZCU61At!#zy_fcC|zDiy45Kw=S~oItHvtrw9(zbz6;M<`*DeDcMJlWII~f-|#k( z|CX#w&qib$IUZgw=ebzo0VHWyxxWdOxYait^*^!kGNB~;X56W*i$DZean^{+?xu^j zX70>YwegRn^L~=t@u*D-R8->Mpl&)z&!pXhf#hfp1PlP_-ggL}%FJ)3W4u{mO8nNT zv!9PiBRaETnkWkpZ(ToYbpFg@`;^6}=i^I5@zJj*!;3ga^Rn{yav>VTN;lWSE=q5S z&3U&=spx1c+rvYC|s(rigmCu1UXd zJL78#b0`EmUpZ2k4x*NDBm{$0hD=6*R5=Gggqk9P?pAJ%@T8xO%fi46q~2F;;qa0( zJHom~P)7E^3mcoeGp8RBF5HS~)+PL)jmOg%;6tHK77hte*^?}>oSTdT{)9$6pjVRa zWr&@&P$K-7q}vz+j>dM7HY$$gMnst=tdjzIp95r>^&RN+Pqq z;}eF?%zGI_O_^6FLxa>EaYhnn(Ak-A_wsUg>uP0XgRig>%O>#8m2VIf@9vQPy(1r| z{Nde{|HYJl{ZY!DigF=EE4K{t*Pe*#VmV;mdDmqPeOy3gDs@@ehqMy*FiZ0zo)sS| zEu*0nMqTy1!_7hwy_0n*iA`4PK1?WCqP^)Y4lU@a+1y%VW$&RYUxwT&oFWLZN%K#N zymmWAdJBG~98)bSI||#Vv?XjyUE#lAna%BoN$2Q7y#fdP`~!62i?8s63=sJcG4o60 zbugq}qf|rciGXTK!Zx;d`?p1A@+2Ui&rT~cz3v8yJ0A)fOTs+By}ey=zt11Q?UB0u zi}4MCKpD`7(nXAQZS;x5^L|;TjP&`?T1@U6;R?7eco8RH88P2NmS^;*PbG4qEewr7 z8ifcYCHupt_rh0Il}1C}0n|da7vcgon1+aYm~w)RMv2kOsYvgJoLP-djG@8-bk}Ao z8fv4$ckeP4E|v;A;S+zDq|;bf$j=1R!Qn=zf^KiQf-)>!V(k?rnLaPfEL24 z9itavFvhLlFKS*ZSCT&T0vlU@08Zpr;cg|${{H85>JckAJ^$ILQR(ZF?oFd&+s1>g z9L=GCaMF!%L|K-KG;$Fbjibd-gz8oZiHMDew2r~(aAZ};$_)`Y;T{>L8tUChM%z8V zPEM`E(`;i0%COkgG>E#mrCeq!CF^kteh_HPp;8%^5^CcOYc~Rem>C zmcuuU&FhL7%3jjan7wK%_uX}hxf5zKJ4RZ!aqJQ2toq$;LT&WwMgOQ~<7%0jh-{nr zH6guZD>0FoUB}~IJjUGfFs+Z&`=hxYu`OiX@ki~71We(H4~1Rhf#QvcUdkzyZHxn` z6p1wsB3Z*Yc%Ey^Pa2_n(YX@(Y6|3068e(JlJjBnO71uk*FajuGE3Q(TUHZmU25go zX#fYrpe28S)~696H7GF7KDu8Qa-wV=?C@4{N>7#m=L0i9BC~CwGc+{I#RoD#?~lv= zgu(4Tetun8-3aThUqO!SR*6~PQp!x=FZ$%oa40=y z+p-5+*QOXTtj7!odcHEKLpkmz6(zXRc;jn?f&6;5 z)Eh@V#Z2qc)Oqe8-wWDzcCAcLeJpW_PKbiZIPJxi;MMZ zGHl>=>yNHt{jFKJYYGi1E9a+Up=(Y?wf8LqYLLcJ?HzHd{)$N4@X!jH-w!_RJXHCV z`}}mO8PYDeCzy`)@(UxsOZo5Lfs$#Hls3YKj8Sp7a4A07=R9cyvOhov5tP2FL8~Qt zf=m+N-Sf!IUCJi{uC((PcW`f+g}gO^ik8+Js%A}e$4LgmW^t6faAy0E8#cP*nlc-P zkUpM%RhLPkHF|HH9BEnPJu405u5jp{~6Ogy-Mgd>W-_)YzXs&2N<=oPf`0&k&DdAS&>;&Y~5nb9YjwO zk8P2@iTA&92*K-~0eCIJZrnnF*(M1-lG*HB=BlmZu6{W ziQ7#^G{*96u+mks5vTicA_~S6vM}}iNJQ($=?(7LRa9Y>j}=)Z(3*qggkVKpnt z(oCQ-Yz^$*@ed2}net`vh6(0cXrbxJZdiBpef~9<(*H_M#ESwFy6(K0`YE|L2q7l7 zLtoI)B0e(yx%lS9dj>XD$S-JH-0b6K0C4L^=?~P%@Y;T=*}-#`2toAO(dfT+cg95k zv38Sm?aGVDYNFW?sG^l7i9W`IK|Fa2uo#e3OVjtry=QVqx=Fu)yf#Q5{By^Vi;->c z%r8hI+pxlaw(bQV@?wqu0tJ!fGL_Ik8GxZW@*|f@5o68pHse`BhzU8{kBx}^H#a*R za>c*kQZW8CcVneY<`jC|`AtIyghC<=SN^R|=EqIyZJgG{HzgKJZ}<;rs<_-rnc?{Q zBD70)O9KBads;2j<=Tz^?ol`X`B>{Kvu;eXctUpelxO+M1tIxii+dMIJOqWh&z3-; ze(-C_=O}y!3SfJGGA} zTXi+ub7E!V7L@S!PAhj35A6(Jh%#Hr|G=(vwkuJwR^oB%>P?qP;yy%c(g(#dvm$lY z?PItvFebtJeC^YKY)={aZ9DvIaig6NLTzRdGB-u)ZfKJT4woBi#j0C1_)xh@y@=2# zv5|AJ9BSlV@i{#rH@xJJWCo_A-ajQ=3j}TWK<(QXAMtlClJ0MmQ#es<<=!}erCnOs z7xlDlToi}Pge|S?aMsm3@_k{P$4n?NfA%Q&DM<~{FvK*yGj0$g$q*Jr@Z<)WHh0i+ zAmrf9w9Rd^vXAc%Ozzo)t_=suP6O)p8y8695-6!^J(w)yCt(RL4v-Tlv#>pbM2+p5 zsG*0Ws}B-ag&?cXq=K4x3@!f(r_rYGT<+S3xm+Uf0PJhjftC3#3`_Z;RmXq(WE((q z=-=a_A>LWJb@kxrulnwbuDP(ez1OM+84A2%ikAGhxP_&%E|TXAKBIs_b7_({OO~- z$5XljLZ`B5R_++~EKyTO9~fpQ^Mme>tgo7p5bJC%LD#HTsdn}qUXXkSmNPfu58U-* zMhF&y7Upb>*@g*T7kHbKmYWS=0`(1cqI)ixa0N;21(9G`U ze+5Lahxr$R`RCqe5HSH1W?AUxukE{Zxx{C5Hm7ndUkKPtjy2XTnu;~feU>#XE$~zH z+t$3fAm>5)QtY1r*SiA<`b?sVw_I4-ZwYJnIE5QHqHUNuHzf zYCx8SffP*Z>I>c#0$zdM`+#@Z(A|OeqdkK68dpvD;OTYTQz|fg)i?TK_#cQa=;a-b zs#hYoyB`zfo&=|bAMAqA9I$yO^oRJ5Vs7t((8u=(@fXSvzfOFh5}{Ad=m+re2H<1+ z0lW)E>?Hsfc46Zd0r)n?>x1F}y9M}YSbq0JoF==@N3kA1uSD^X{t#zjEKodWR9_U& z>yP3|ghUD_>;mygz~;TgfPEnDKu=inLwEEe+68dw?m=Ee7OoHS^#p3H`4v=g?lt|8 z{Nf1dJz%&o%jBH4$ktt8{yEE4$bf2pKfEtJKMIiEe*Hnew`RAXH$(ip2YqlE^e1KW z&3d{5_8(l`5B7S2{b>Vx;mg=pePQ~(z?74elN*d7B4uRzCrV7rWjqus%_ZI1|hg-d>X*uKR@ zNw)P&1#nkDmjQ4KP> zUpJDV?B4`={}*J8c`y``rIc>PUgX<+(&4YGf#3Z)uIP1q5yY#ohKcET(W}ZB+{GFm zu@N~qE|S@9S=mEa=*;#yEBijeE3183uku zyYo-H>QU?*NXLo;)}vcn5PVwJn=J1?IG$?{BM|b{b~pa7kTao9;#$sN@9Yf{oVIdH z@c=>G1{&wj#aUn4!d9b%X_{KsSaZM6YuP=kaz1QbcJrgo*3r-t-z)HABg7C|dhgea z+1`a3uXH6kz`{sqpl~T3SxmB2{=+OLB^~1j#ho>6&bz^?#fNMWdsiH!fXA)uZ_%u6 zcrZ11P=%MEbL?s>H%~w5Fs4ukr~i{fa?an{r5`9Fw~Zk?fi>tg=+eq2MAYOTQ|w@4 ziVd1-m}$*zmiNw&{8r}L*Z|M6tvo$IwrtnV5VpCG{@a~@i#sPMXN}|!!QZO5vsnY@ zq|}E_%U3D4u$61)k6Rpf&mG20tlS*xYI2j=cAMmVh-uCO+z}VI^*%d4%rIYmWYiwr zlgJNyK}anb-k7;@GT#_mLUT8Pj6CqY4Uo^2VQwDm0p}}-98K%L)`s? zn8Q{QX@lJInsAQyzV(0{@2BdRB1{-y+xxK^|1)?Ft`NCQIcWC&p`nP)%N3eZ`W ztuyKhp9tj)FWjunhZj=(wH_Z{xJrIo&kQe2kr(ra7tYrgPY*AgB@cil+&2MYJTUs2$j zi-qSC$UA@%^>H6l6QXbk ztLzP`s4gN$r`IhL-}FX#;-!wRma*4TLiEMpq!fZF%#?^z-$;}Az0#xi`&)zpjohtN zu*--zd5^ws#6b2M<7IghF z#IUEXH{bjzGuX1;pTQ!*fjcI`4E7KX3C8;Vr;Ih{)5gjMV-10F80#?(zXb+u*)s@+ zIp$M_+5gjqIWQRJWV0yk46}<{8jSMXr!4(rT;sLJrGK3KJJA5yUqS6m<{z9`3p|Eh zCv(}S4AcH;!*m409Bd}j$uO0ZF?pswffYq;?}5Pn@y$<}%zLl;lQ{_Sz-0E9$&_5T zz-J3^cHgHA)A?z`WP)L$(nCPV?f3H|==-=&>AT_6`u<|j_rq$EjX94U<4Q!S*BOlR zio_fDfT*W${1im>yy7Ejqe0Zx8W82XJ-e>@HJ>ufd7n1SSA$`yHC8s}TMVOeOGJ{6 z^N^Yf{<;rloWN7TMUd@zl+R_8kvW#esm3Je0L4R7Hd=6qGS6~hQ-NDC#Rmwm(k(s> z;Xe^p{|b=#AE~^IIcpY*C$-FoPdZ<(Dy&%lE=kKc z63@tCFxgXj%Rjv;;dJpRN{Vf!j@2zwIOTh~x$+2rA%cISlV^8`z~fAIaDq*uY(pm{ z-qMVyZ`qt%rYI6^OEQ9NVX~_Y5m&rmPrUR>0=l{tW6k}GjxZ>Z=c3Y>>~i9h+(gZD zYU1u`jj?S#)u|KXStl8ax5I}FZ+JS%gRVY8sV2nra!)e8BI2)q)2u&b;wEb zIY2)ddr+L~oHI)?sg~%$=9A8@vhF-yEgcSC)m}nslirtE%EMkGs3HSkr);{)#-{#| zM2pho1_k?}U!e8>p`i~aL?@1w47>GZhGlAfTUVxk4^pZtWtAr}d1ug;tamv^pgH3U zp%igfe@$n>6-zV-;3l7_GA(_IA(~wGtkHrn;T|?!E0YL^?ZdtvM{pL^WWr%dBizJ! zW>$k^1-|*2a84F_5+iZ4^Ezoc#C~#b5bT~i0zLpmGZXm>mep{(b49Ac5L%d!f_Rrn zHf7%|yrU6LoK@YmoE?xqwkIbUmU*{*8&+Dyh0bV|^i@gsN_N?xbuP{t>AlwpCCYVF z@{KsMHN2H^iMU(Y{fI#o9?)P`QWHBvi*j}Dh&d>zhXs}c)o`c%*%aV5?&FO zJLoPoSqnBgI>?6d#moZ|VXfE$`96aOT#M59JBO|cTL{!4C<;FZrjo#rk1iB`g9`l6 z?z1OzNMAV9KckoX>18*fu5vah#weT(HiPps{`a#ZZEOOnjqMe1Fzk$eK0De!KMZt_ zZDka)=JZo2a?x5cPp&<;hI6<`&Vxh)*Iy1N9|v==%yKtcHpVljcCEWwco4@pimNV} zZA5KC-m!*p5kOYVZgeN^<$t}glO1z;ZRPMAd2F;9-)?tLZr~IL z$0$S`HR2YmP;T*0)Z%H_{Du%XRwA454TtEq3n0F(^(fc-dO4u46=gU%&;Oogn32od zBAJlRWOh_%01MS)99kX~W=#`LTb*~@&vkt{G|kTlt=Xeax)0P1406|q2t6QHx5EdJ z*u5r)9MaJQC;4hHR~pd5oc|~tm(!yUrK30|e~3nfwM<*||L%YyRG$Vo*fP0o#Dhbs4*CWMxenHnMU;i_TVQs*d#d_si zGOm7>v+wbUzUKwzYkkkoF3xLbtSj|(VVJN$)Ckt0CC zS2U13$0?D~l4ui$@KOzv$(kozBIAi7YB?j{@G;N)m{-H-r@6zp&tEc|kezZ4Mvgwg zw(h{x=cqmzHOH~{Qj5%(QtWF$`{S0g^z)4lJBXsiEgS`B(n=$4?aL`T;5KqLeec4+)Y2>LqPhZrub$ zFQe%9rROH_!!@1NM-xM^IZV)!B1>?*B+Tmdob_K^gNgI`J5;RoJ^aySzNT|FV?n+?yXW&!XR)^a`KZeu)I`_a zo{u`5YM*jGO3w$A;W#QIH~X)eJpr<<5whiEkt~OplI#x!35)e^DRq>x*+cxT1Th)N zHk8~fIrK!9Vh~Rvlgo+8*(_em$!GukDC}DO)Bj4paI##`s0rbu zhD1%Jzo_$Vfp!_t%0gLK>VpKF(s6m2S&adtmkwBJXfG$LZFWa(Peg{av7sY7eHN5}us7o+!OMPA|QA zjUV%^WG)!%PIEs(b?854fr<~T065d$+)`FnBD$V)HW?FPzqs=PIB{N<wgq>de6Dq{2{7wMqF(g?hE>EHNVbL@@U5ulkkch|-g|5W&ibN*l9o2lc{>{4Xkqn9&=6;2+s} z_B&mfGRE?BeKm+~AxsQkB&Jvq0f7Osd>;oYljELiut`Y4{?N#4;8p{QBqe`>6|;LE zJe zT`HLiR?hjW#Ht3}-pULnt7KUUzI=XXTA zACN^C%0aDjX~n&j_L?LZ?vcE{?idV8o+22R#kJG-g0maZT<3}jc`UOLupYb>EVWWi zuvG5<|Aem=@bxynOMov#m*A^|YoEc_f|dUZUxSJI(^m1-Qh_f{F|PN%sZ&V5DDcWm zqbe&57a5ZCZbvoK{&&qQGapya9%ap+*l>d2u_eiY!>G6AM?$cA6yF&80j2h3#hCVD z<;3(T;p&fqtKTs;*^Je4kC%XS!yIrmmTJ=~zc)B%Qx|+_yQ5=r-+TufYs+I#5bps8 z7;vZ+POf+tsPmW_g&dLEWn0MqeiZk&?Z<%;zWIb#%WYHc^hWQsQ`lWX+`pW3CvZ(? zH!&umn-SWV zQ^>rhY5w#9zJEDq^&WiK>z&@t^ zL&3&qKg39a{B#y2EcAK41e z$wdyJ1?2U)AC(Dp%6!cIL0rNhwr;Ll`p3#$g#xASoh~K<@7FUcgeJ(lfp5VYXoX#J(Z{-B%?d?ss_men~C) zM}^Zl8j_UeEGrXd^29GS#6DCQ-*eB>st0rPZ1)F>U+^-NYxZO%Dx^HNiCj~AviG&I zCgfHLX?cD7&!5xMeB*0zF#m~W{vt!r4VCjpR_|f{Xx4bcM4dl2$S(7TekZub=dUH@=lq4%B>VH2bDv0fW z|Hq<|e|!5q0%!V=;QkMKBp;}g2*PivWaq2aIIqWDJ5uDjwM^ezKzw@&5BFp{e{F=Q z6WH^==6G$y&fHWJN}oiKbmaR&N2Txa^*N`-O&=!e{;F|FGQOXw{s2OI5`GP0ocyCV zZTHF=dkUlh+P34sdXIfaF-Jbd#IZm+3@32xLz{IhJZo%z=5>4TuS)b+`W{v!k&&ZD zgxwa)-ECv9(?(~EDxz;BMu=9LfnyLr6!C?t&hwixPk)l%M3C1KqTRmJ*OPS=l&9@hDvi&KYo{^!ILyjOiA!U5EvNmwi&?!rAc7)uxkzE7hPJ|r2+ zntxF-`$p;@YyPU@tKh3wx_g)I(tjuyr{BU*EA>~B$9>{eb2f<*i0OwJ<&Yq_l}n&z z@{+x6A!9P*XGMMl5xn^V*mh3Pc!uWk~ivS%c z8olKy)~R1{JOddQjAynPy+12QbFP^t@?F}uLbUkQLU$T1RPs6w1>1vNg zocowE+-AAnxwNdQRZ#8d_lOvRI$}D;qg*3>6N)us@FnkpIKZGp<|m5|0sOPT&Tu1* z^le!_m+TKiTbLlvQWK31ZJCp(67_D;R1Zc(+k{Om-?!FUta7$XvKSth=&ho z#CsB`{Xvi{Tr~%@-!srQdQZ<1XsbW-4_Pjs8CYqBRmK2TJ}9ZP?6diFu7OagNI#zG zrRb?oGv9tx`_z`tfiWS!tMa!Efn{h#SKd(up4;Co!!r|j*rhR%e7IZe3B+TFjOy_BD6s--nVWxEz_3^BiXb@K^*$h-vuZ_kz!0o#TlPk6kse+oRUh$6fEfrWK14+d-b|a|qORcd( zi$j8t;Ix8X6h0IoLZvxciRcJ@NTtF@uy+|g?;8q-0c?=~HUl7>#pR)_yLz-m^$Gok zD?H45Bj0t!F0QlYu2U&=9+xz5AwS+YdQztC4P_KDu5F!tY0AsJO9`4+j;7~kSHCS& zFHeko^W4b>h)1;ul<0cYMFnywTU~p1hq%ew>V7N{*zgP z!@~Z-JA(j0QPf*x%0Bt8U%#^KHdD5dGJ{X)nTsrdPR}g>8^Z;}r&sa>W17y-L8{`R zeQqOM%QYlm6#v(D7itv#?mp+GWtdNbOF;Gv{(W_s7E1(tKiAQ#Hu$!%eOR864 zEY-^P0_Za##jV~SSPNE6*|@Nitx&U*UrYVW_JKDK=gWB3T)6->vwg6Y-6ngbiu>x< zo}hoQKlv(!<1boLeHL&iP3U(7yazF;1!72I9oGjvE|r{T3qRy9KjjllDl>!oL+pH_ z#(VQ9>0+pag$}9MT*l$3{^tgNPQr=ya%2vF#N1Y?T%Mna7vPzF^rVDS%HP-gBOUDe zea-JM71<~i>TL8Ta4rm?Z0>Zvl?H-u_R7ka^y)63#0Ua^#K7-XPt@9=rT_Oebp*D{ z9y9|f%!T<3Ways~hZ5nD{I>-dxux=Z6#MjV_Fp5iW0+6Wd8=6t4jizR%r{hS=#YEm zwwl}FTJ(D}CtX~1^Cs>%UCLGz0w2N7eWI{xv?(=2tSQuk?33ew{klp?|C^#ArilGi&F5W~5=^~Z^@|GYi*RQrS zFZ_aeOk9?rf4amHEB8xTZz5$RrEx#dasu@j5e+F-St!b}wZiCbvS)koZrKT6P$f8& z59wLC2WUzRm;2M?dp7X=ae&SG^1%0Gq+jWBY0u_^!b@NL_{z;KnWY^PeQqQ>YYJ!I z*gNd;9z>4CovVi>^JkFDvojWa`QE$r2yvcKq6`>^P8#IX9ZBcfqHV~Zq@*q>`CE#+GBDOu7N;TYN(yLg?Bl*^?qC1VO6Q4 z+*6|uOPY$6dzE+YtVsSmzOOmNx?NQIwk4c9o4`Y@RB=v?3h8olQ~a>)syW-XyQfy+ zD>T0qrM+=_1{{a^scLAcs)X-k|mgX65Z?4*%lGV(BPjy7>*3Fv+2aGh@U zd_*_bt8bU<(5MGSP4cEgBIE|hs_%Wk=yMngi#!W$bN^j_ikjoS>jM5MuYUD-5i3&N z8$8|A`mKC#(zL(XwBLNWDfv#&K66G**uM~@6L3T>8F;)!$gu()NseD?Ivg|A&R;aO zckdX9nq1++WT#cl>LBH&JH09CjvFTCy^j8s$3+U<_^N*L$Dit*W~z>+Cdz!47JnG!;DISHae-uL{eQns0tw(J{+!E_Q;E2d44~eJY2{SZDf` z*pUUfJ@Q}MMPZ!1YYw8f|oQGU`a`4Nyqv4U+lB}voc-^Y8C)Mg)sXj=S|A;*^h@! z$2#Uh*f_y`#vz(X#+-_W2>NT1j5Y$pkkP&%ywArw!q*=vA1=d#j1kz%S06_mb;t_A zM^W@vHiG*SpW=!<|NCd}O8*^%3P+hNT)ZU}LLAj((d*<##FMYjF&3A)N+1P)S&bak>dVl`+^-*#6 zvXSmBpkZEQxU71+zYP-?_p6O<7-xH&LvT!GksKcd<+XojhQ(LnZX4Y#(|b+0%$cd* z65*b4_t5XYCO?iG0zL}p)r$S%m08>F?*2Fj;=ypFuyo~?FmWZ8UN{eF zMxtFeRJL%4RN)m|A<3UV`hTpw3w%`7wfKJm2}C7MP@?#%qXiqR&>)}*O39E3OmqSW zK>;5S@{lMbG?@{wioqn6>2xr)-rl}ztMy{*t+us_k7@uRs8s>AqTW`k)t)g{k+z7| zI=}B)d!KnkytViL=fmWjv)_B|wbov1?X~w#C-vP2$`P?NleWO7U2f7|ot^f0NxLeO zc9>1O#-y!Fr)7)794MrFOsAxfb_f|uzy<>1vrYsfHmVm;Vl^vxC~gt)+a3SUdxU<* z9z{Xq(w<_`5zjx{wb^M8P}?)o~Ne6+Zo(oo7ccSmc zbCg7=joldci}1oyuc|Eu7I8arD))=cNru?7IoYd-v-k)28LEi~aDHI%FkUDYnsRp* zL#Y`MEfj`8-(WUBviMtG6aP}7xy~iJiYaXjeR7mlVc_3H zNxr*gkCG(@mSM4#iu5lADA9(tyPH-?^~7=;mns0VFfUzHLRM2>TK>oU=3V{{k()Sg zA#{xU1H=_N@)-RX)AQJMUCfT3{gur8B2k^P1kUmELGAbC{dmC;T4`o%F%`xki_Ia_ z9?J)`vAP;jq^uW;OGQ9Q`$K_K<9~$7LG%iH!RKfz zzbv9AaS`BlOtgy^qHJXH$rv1yrIBTwh^k1x?i`M2ES-2j7r@7=()k``VGAFGc+EyMJ4-|_y^*NbD1I4hm7xzdv#CT{+ z&{HZs`NtJw&cNObf0q3ViGnBbk$Iqz^2K_%P{tp}77;yHtf4dp5?E^eS@v~70j2Aj)AP8cuRAZq(%!_Eh^!@YV1&`gDl3+pxQ^9?Y8r-9t+H&SCeI6|rHO)LX*HbRJ)1ru3F!jb9~th`2!D{Ul>3*(^mfxH z>thHuWAE54e0Gug8!`UsEfeCni~exzNv}!_ZLH7rxw426YS^d33L7vt`~Vol?NI}e zD*Oev_#?P_sTj`J{dHp9)7up1SIZgjm8f3@>n0Fy9I@0C^u915zjft$2%#2G)Nq!k z?=E;#P2LW+eGl^l(%SeOzhvUOoWfD!CM|^XOe!Tn7k)`EH&%hq$b9ci)4^Mq!*1M) z7Omn9ZBVToB+xAIi|3C4bno6}ly9+@i@8L5I`BXazDQkCxqFvDLy#jQ&%(dTC0_W8 zE4LgDiqDzvy53qIgrV*tElOhS8Lm$Acm>B0;}iU3ZTv7_w<~46wo+P+--oXUQ?S$Z zk9^;aH_BuapW;3ZA_Dy&%ttO)W03?GZsKfuQ6>q?J{*{ZK!g}Q9GJ5&nOB)dL0A^r zb)mdG(_glL$z{QNG38Tqs<%_?RKC64DvPk+Fg;$B6GFvVf9tb;+ZYshgP5F#g)z778@IV==flctc z(6@xoZFvQ*H)1%LF&s<)SAy}t!thX;>%cV@-quRNYWL{sNGg-~pp)X&4dPL+w86OPx1?tp2a_fzH`PW&cOX|<8x(he9rh(GV6Z+x1N;Cyb$9yhi7pXgZrijNY*Wc zxUOemD%7yo4A4t!=7MSJUWEvVmg#f18n#xB&)6^lPFbXiBiJESb1eAD3$0uh&cnv@ zVg7Yjy1OvGkeL|>ldR|@l{v8PWIREg1^nm6%GdoRSyDnTl*!yI{|J)|dz-JKW1(|#H9aD>wd>V9wo8;pK8q-D=1<9{ zt3~dO3v_IA8C7iSmN!q%+qL_k;H>O!9tyg5_4~!QP%VYxpD2zNYga)*bz{PT{+TBV zC{e^VRw?&{>T43~NGxa1Fn;g|zLy3b5%F2hnc2)!JOznC4mC$QVu33+PGGY7?Dr0V zat|M^-R-%HqH7av2U(2wb^nJH02@lxBwGDKkD;LyHE=lk-}cH-#XFJJD)f7n0I_WX zjfLzZgI}V?7`_f~*y7&QrewM!5TA*7MSBsqd>dtBCSw+eNgz3~icG{BDd?0axqXwK zJX7jEbpd+k15iNLd_v-Y*&D6J`RP}ws3vklW9-7sRf$npPG_FT2f7m5(!#zQ^K=4G z#|Hx&YLo@bjTNR9y31YD*Ctxag!{+du1#DsjAMHKB4=S?U%dtoGsLL51LMeB7h7<~ zj6}FJRk6bt-uK>K0m>;mW7TdjamJ9Eig$e7*8o56IT4{}FHGNUD$%i=+q37oM+6A) z_<|OCDMR?K+mGi<@);O0=L07Sw)~e2;;Rxdd%pBvBE0#5IndpJ1uQ97cnC;Ecx|wd zRN78{mGrT{izP-5p)TjZq(E2xn7qJyFV@CRtLdL9Na7@d1t}1#Sl$DtY@OKG9Ei1! z=Fd!=d%MlyQn3q1g=1y7kCaoQRP3W-Q^#q9DAWeNC$mmQe#xP?^>2j$Fju?=x#bBG z>*b4c*|F1iy)q=oJ$n$4ulxH-XXBUk6N!GiRB%8v26Zkm!u-3~AyU2jP*>#qs-*{J z9nWGL@vMhKqyCg!W3I3;FHqzxNn~LCrmQr zBv&q=nux`yV)cpFtrtqBf!DAUi}&hhmHebOPQGR)cfYqn+7And+blKyDRN83dz8=Z z7oX3IoDg8A-r=i9VJE^Jt>n?$N$;&k*2aA_SXB>S&v_ub04Ta1nwp}?5NSoMpC=z6 zHv-CVzkAahWC%Pz1F>zg7J3^s3D<+kBCJ#+W8r|2)tVsZVo6WdU9Qb+IA9VWTccH< z4Lix&;VT-Ra0D4d!wD4Qi~jHv>F^)3&BK^pUn5k-Dw_B(@2O|BuApi&f#T@d)}286W;TYe*t)OVM=i;BiO_xWw8P%fLar=)ud^0{N~oq67>Xt&ax>0&a)qRsV$p=q zjL>W%bKJ#7LzyzMk7=|ZvQD5;N=8t7=IFrvAT`i<(RWwXs1O3D8fbtn+Q^TPjx&?2 zwST!kyF_QvH$>PibE0=3=#GArA`&Id2vmx;X8Ar_p0N`(_I7VqjG3QvRH-j9doe$M zO_+#owf5x8v}~CII7W6!-^Y-nzlb~Ap!l@@iyXvUymFgBOl{97EJ!V!n1CKEr*GT> z#DzVAM@-bX6^&pXEcXUx-qk0;O{b~6wwy8d1?h( z#p_<#qE!q^X7D42pJ7{qgzw)9c)@KPE|G|(&F7uy-M#7U!Nz?<_UNkpPShu6lQGyc z#C}&kpobNzh#MzPF~!I|FSYP-M>q3x z#n&rigoGnM%6N=;w~L^RN)MHH53t~3uGIAIYE*k_mLiqS&n*CFV#&lYwWNrYO$*6){`$dPUq;u|Vpa#f=L9C=@i?`ZA zpVh5=kO;5(w}KA=*u)Ho-aD&r_)~BAxjnBe&aA(T3eIC9KQ~3t~rkaS^WB z(-D~xuO0=ZO$Lw-d&g-MXrjX0xAUfWb*60s=pmF3{1a(;I^Qagl{*}*h|a;V*I zVB!Q=zPZU^3|33C2xV==I=v){ihzsgAG=);%&9c_!sz2Q_a4;+cT;Whk zv$~sFnY}QqT?a6(-6Qu2G3l2Jbuf*68H*bu@FOXnZw0?+EgtxecR%WKaA_hf$E+YG zSMf*OF2n9m^~zBN6ws_uFQ_Z6G2v?q-j_j0lob7tUQ2(rxnBj-vj7kC%^<1{Fze~yV-DZut_{&`c4v1Ad_?#Mb+||( zhMw6saFbG1*8G}#|0jwVzWH2ws_RH%u*zEJ-A7IC=Mi8;M)*60gStUX7=;+Tdbo5j ze~j_2P%BI^qVN3(l(c|7>WP9=$V_Wb($=Da{qC=~$EUR-f3Xa57=gjWoV;MH=n_K0 zzUn?T_r*H}7iB?@D}&@9mj2CBVvs9!65kNqj*q}0A2uFJO!*xWs$?<}(f!z)nD8Y^ z_M>gXy`;N`pg{cC#0ewL{4v)Rabk=i0#oDNvTh)*dx@g2Q(~%DsX@)aso#0S zm20q+vknlR(Q0Ke8`Qm6xn$CHE)&_NYP4;7KJ_On!EQlE?1$WOm2@B4C*b5(<*Cv% z-6|P~`FuCtMq=4wDb2e{XV1L@J<3lC^1drAOuAp6iTu<`c{0YK=C083dD4gbMd!fL zrrjlqZ&Y8ajP=6UA>cHVl24hHHws#6JO-X#8cXdYghpN7-65`-j*5>i^AKq(Bj*B|`SU ziT%oksJEOnSeUwz&p3iQ1i4(dTio%3H1BHs_j@p9fpwj`fP7Fe#q&=iA4@^m{gd?| z_)o!~HtU!fe-^BbW6m(H%_0owG{`c`J~OqK;ir<3cTwi%#D~Q4;xqDNfqZ-1M2Mv% zy~?9&D$>@BLiTGzcXGD}F@^CNqd7x_;ibJ2K47pu9g$qkENuB>)_N7^SUeUPleKDA zOuNr8?KUhT)L*4Y+jS1Lo?jT5a;O|1+^0QF=TLOdc7T*j@3^-iJy4RpQF(dtELV7?nfG@-zYDUjfz$Q@k9BQ6@jm@hVK zbglU3E+I)xVlh5?$Zle5m?`2CbnX`hI!nku1V*30RO^2K5{hFw!uU0Wdz{Hhk7nf2 zr48&37OG$m@kn08_#GOz zw||xZTym(hydZukHcKX@BnXnFubz9cSr4LbE15sK>4!?JiAz4i^u~Vf&T|~!#t!m7 zaItN|3%rQyAq%*DH8F17lB2FU896ZS4+^oK3;3>vHsxeU=3{#4Zbui>{?dvG*D_`BP7#fAIAV|3z zU2I{hCrl$@Cx2m@bq|wgvVsyat#NV&Ori>5JM7@spgSI!UXmiQKD)`{@IRu?%(MJ z8)&ylE@WpdU3L}B73&7JE#Zaz!;9!Omx_Zd$)~89Qnj3<`ynPs&BL*CJK-1c3-USa zsb|lcp!zy`!4aeM9QTT>7@#&_4=*vU+wrJi|8 z=WBZ%b#8DL{jq02uDr)PJ;LD}L)i30C5%Bh293?YkiC^N>MKi=x3OBI`YHxZ{`FU? z){wjuJ&9gt=AX>`aG3Dz!EWwF(ks!1MMU%5+!N;)>cpS?p;p2ylqoOA-m(6z4b;uV zzvCBz2Po@9gR$;0uMj9$w6sP{HY^L?tan}r*TZ6t(FHaoB--=eJjIoHskktAi$zp~ zyj1~pss>F&_KO$0g_o%u##QG&y+R$cc3~jiS_-9HLi$UvY%N7;Q2}YhZ6HQ)7aLrz zginioa?QgsM?FH}2v!f7drDwr>UX(9?_ify%jLEJR~tV5PWS_KN9)D@MT2Ox*n?T_ z6qc>G(;~oly%>i=CH!xNUSE9zU%&xWsiPQKpXI0wBk|RZStIrNCq9;z`Vs~IfP1Qo zoDui1&q@I}p)R*QdQlP}^7$T~JMx^mF)MsM6;ff(su8~Kqv=)Gn!?e(8^r$`Evcp< z*n_d!O})Zy$yewOv&j!hZol#oWiwx#_H-m)?`>!1a3UuuDBUC3i*eOR7|E&Mah%En z+Y7lzo4Et)e<^Et>mQX7_b^)Bt3r4f>{Y-OoCk9RR_=XM(co~o26Ji?GYf0_hY?TA z7FHBW<<suTaf<6Rwct0 zj8}5+0sfJ30_DmCGnNH+ehYT^O~S0a#Qxw{NIrxEcx}#5S2>erBS`?nJ`(mUj962mJp~Qw&AYgC2xa)&dWMt2q zks<~#KiI?kn4o;QPa{;ZGy1YX-^q)Ntm*oq%uSR3Q(EvkS&69Ry?YWJ=bgFH*Zny& z3HV5q+(H_`Pt*TU*Bb73?lEg6oLejO*C_sUaw8AOYA#$CkgxIeY$B`b)bXz=oJ1Uj z$4Ezuo#b)MN@;yankPa2Cc#og8 zwB980lSt-xnh1VolAfBC^g@#qVL5q(31$t**E8J&7ZUt8hF&+gV@T>Cp(kZ5=T&}ywZf+ z?d$oGhEygO4a#5X>-maC`IBEHs_V(Zk=oRaq975BRC!4Z{MHh8FnU@^N zR~o6cYM9mzDA4X;O|bDumO4tNzIRbjc{+4YH?$t6N7%vfqD`ayH6= zm&t2Cu!-G~!g?Qs1+w|4;0RI(KYNihF?XzUqvK37wTIIg;MGHXUpbd=G8|5Z z>fsyTAnaSYVRHV3l9RTD&H!$*KOvo2Nm4rL40WPh(N0s>)O0<0Sn@?lVtHzEkxj#) zb)x{%kjOCp_C^Z@uYO_5x=(;`id35@xK+w6;hh7&FNwKbJM+3yBO^0cpWKxyik?E& z!sw||CFj^3Px414`5O$M0`02xTqS!6g~r~DZI{bNJ4N{Jxr~tH75rKMWF8rlOL(>X z-Sfv)IZ95B5my|HNKZ#DM0|>Ek<;0W9XtvAPJ}(`h(xNBdn@tS0^W5u;|`1fR4&t; z$xkv4h@4j}`^}TC+oqFMfm{WIS*l>?CeTkLP^=LwO(RXoz4fuJio_iI_$y&*NWR0> z3C0xbt=G%?0fJdgY*z#yvQipW>|n8pUw}5hCo)lFrqYRzX?vqbyRGUeEaz)Ufi!WO z8%H-87)bLQQ-v5mxs8>o~g>V zvzK@=|4U1L^zrCs&z_AL6caY)f~}$Wmvzk)cyhS+`|cCuLULeu*g6@n;$)^hk>fX2 zGQYF8ItSp|9w6E2L|+5bP6yLuv=2WM0PgkRrN`L3>y8a-skj+Y>cBl2`8Vw^J!KE8 zb3Ue8Q!2mU>S$rKNPm5WBqapV4 zK$>KwljTG1ZePoC1BQ~iG0WYH!@}!$!^AC8bDX3y*{>17YeKCwTMjnAlwe85Tsp0k zmImZpZFF z@O##E@Y0i9Iqj+>Jw->xlo8E(i}X$8XbH}3oIoIYIwTSaCMvm-ZdXtm80b9r7$*dx`sZyJ~OXUwV2GNvI0y*|Z6kJYrJ1X{K8i4M%L73P!^*)f{$`OXK z4>J_fq=|cy>*0DL$_Th?8~SiAai2VoIq1f$^(KQ)m2i>kZ<7(Dhb-5~i68=-bM-`! zh2$3n0}saiAQS5{OopA*p(bwnQtJL1jtS{i(iqgtPuACvhEY>dG0mJIaJizz7nRMAO=l3-~#cCb43XYQA)j=jyI=D=sF^SF5H1Fsw=e)sCJ<^68lGr@|3zC=ACLeSR*9+AJvi}>3M>$!wh z1;;&(mD#rub09;F*xfxwWVsnT@_qaX`s4sXbEyZ5>Y$f770Ccka12Iu=$$L+Y@j3? z_SruS)KWJ|9uRz~G(8gADvIfH4+ieRFTm06f`tbG8W)*wpi%NKDXN5|lJO4aeE@XD z)(aA}e|?kaV8i&GligAgG!yFGejxB*woS49ZCbCxMwc&E@MbL;v? z{nVHtH?^mv?K$3gL?=z9b*MZ{dFH$u{A@Vx#w?%7%03=5Y4)^0W?5rHBa5(6COQ_1 zjJZqBYi431hKa^IOL9M+0|4K|7(Rh|CF4OlFb&RxDb$$L(&yle&T9BJv+8~5IOQM8 z(ztT2iy_eUhpwv&i)&(gd^daq9k5)0)%c+V6?*<%aF5_Eig-HVoF5;tQ^gRSbQJqz zLv$)+X@az)NvrWYY1Y6Wz}IkW_xZkuM-?*5x>ulzV=Wc(ER8Y&79=rH`yS>bDG2>; z$#JL2QRTbW)}FE;thCI5X{`NhHB&bPMyhEW@&`gJ+kcPn`myblqJUxV## zu74@{tKuh;8C&*l_lr6Czi#s1uZs-U$pk?#xmK(1mgd{`pKt5`2y17i`xlt}Ycuut z0q*2fg46Pt?SI^~|KXhcBT2}Tz_%wL9T#Ywl~UjN@e_9@@dg0|`YnS^5M6NB<>cQj zlL!TTYZ3)K$_Ml>|aLE=mYF>%oXP&KNp=$b4Sx$cwaz{IzR*|*-U}jCvkxb>LOz93VD3S2>ATxkjUh& zqJq7cxw7-$ot=N+;rKkiSetj@*7P{wug%-ZJwI#?Jj&Po3Kd>;Zr2A#8*69R2cvvF zZ%QNL1zi*>9v)jbr$HNY3#|*mW_L<_Y`9);+1!hL+SkJx89fpQecy&xNyfTaP)%>F zA#)N8KFRGkJ*ov=H%SVo5yJjy z>>W}Hw|D9iy84`9_FpAU8_F3t6>mrTWUiAoas^HD5wI@I1Y^F{W9VYEQwmFpLl+|@ zo4VwP`RaJoPqP!4(^)oM-kH6k|7)Kz_#~QA z8J;clP&aU!1vvL7v`RY}z3g9g@Hffhm39pMGEy&K7*#%-HCTqzW(G@^hjji8c+Pf# z*s;DFg3D9I{{BE9w+!ZA8fGXq}d)`2F9^o1NC|(etU0{xC zN=Qmii2%vcG@hl*p|=z;4)Ys+Sm zoFgswCP~vD?i3$^&j2{PL68__sFP>Fch{ECx41iOsQY;aJGKKRa0qcDhzY2w)N#s? zmOH3LSX!mh&WmoBaTeJTeN>KzuY`!Xpv=_qkk+wb)Npo6+WgT+McAmMCGH2OtMs!Y z8Xwr+?8W=Ky9Sm2SzA8VED6~ny1vutA<`D)eJlwFex2^o zyNFrYJ^IDlUc$GbUBrk(bSgILhU6|{KUUwp>G~F@>-#Sf4&0ZH_yva_Fcox*mzA>O zN$niF53Y%XX6m|xQA&?*B z=INp6f0P^O`r{Bb7yG(f_;7FjtB_r?TXX-fBwFRlRm`MaNZK^L^vs}VY1}z$oCm5& zBuZ8iXZeSR?L9|jr@t_reyF4`{&@QCTLEA;b$nyMt74a0sSimWI>L7o|1tW=qQ`XI zH;{1P*Koim)(Z!8SDmc=T$P zcqa@_-|#svy(8)6RJNS*ZcW$s3iDF(%QnA<8X4;3%4$%A`>OMANdB6n^yi}MwLiCf zMytMsK##^Sz#%4ays07@;$Tg~b`L=e)<5xtX1dapRBcMS(3EtcmSkuoQRfUnwXbx) zgUBtjjWAbnGFVn2I6Ms0{2a+aYN@NXfs-=#gOg8&(AI|Y!{x&6Mo*bOfQek+t`b{@s63cC&>P>LXk8;qf+ zu7gOMw-CY^0pqAxFqb`aY)z95|7Pu)ORhJQLL1q0HTV%^<5?Yad$*MI%8)?C0pCVp z%%BkwffyGe%e|>mLbdO%_k_DH74C{CiMNQdTAUU<9xGdfFjt{X3y+0u)QQ%w77J7! z-^TYS3R9<4CYMRR{?CD9kPoX9v)L21BQIDH9#iMrxQAHbXdLxU704j(b6XqIi|)Wj z?j%|aJ$}KJGWX^81cxIJBGQVTBqXYMWy(9(Ig}LVAr-dBhQ*!IJOiQ(n6yOepeUdq zP!@K*Ow>~^oi{Zj(Z9>IDp3Qy->qWp)4sR+_1xadiNVQnI_9gWo>3io&sty)_NR0sv>=UNb&_t?`{AS6h+x^QB@e? zm>85|b}J6&q+O(Kv6%o(-AW+ty1&0xD2>Cmp6&Xlvkw3N;cNud)3XvK+lW&S-gmj4 zMYV3fVSwA6~}P}g)PGA97~F)GoSYIH5ycnyPx!Gf$( znaFQ`YbV#LSVl25*&gQBARw15FskdN_jWb+>Kb$8q;UKJX_eRZbgLBcyiik368$A3 z-(+cLJ82vKby#7c-%tXs%1V#!bd-#Vl6pGees7|R9jqnwkQ`25hNb0HE|bFVJzmfn z7jmry5Eijiq!q4j&9T@nWKS@HYf^5%x(wR|8=hr50_(?RL-fYIaTEfvGdhmokRBoI z>;5cKtFdRwqL^+CqJSs&B5lb1J<@n@I%W-+T~Q&f%#vx8>vAxmxW9T{*Qm>IqS_?j zkB{Gi8Ay-Xf_(g6mLQpFWo)ROg*F_?OwiquK2elMngx(A89Q7x4lhr+(20j4F>edBjhLSt5 z=OBpdfz!W~?Md!?CuJ482SLm$xY9|luNSmSHZf<({YU@id1R--T67LdpGP)oq)dP5 z^T-5)0o9zx*dLg48;l%p+z@ef?MV8Mde&iCGo?c8$kL|Nc=EN3i|-7N8UL0Z(fG+CJiegFRPZVc8isQaP7t5c)2D-z zxG*nPvR2>iRyVm5U1FP0;UgSLz#=zN&v%~F~iEYnCNJf=2w28P~E z#i$D2>|P{lIO~JzGi%J0koR}tP+V20>`w>=L#p6Z)~0O^>nxaJir0BVWH)%a1+H%K z&fvec5@WtJuoxBC+-ZPyY-0crO6=(5*}QqDq{bdg9`|`1FVp-B>EMXuX(kAM0d?>< zQ+}>L5+lGyOkekR0BKW^1XP4HD>kG$c z7bXJ3nLcZ_Y&keISkZUgg2dutPV-Ie2E38wz|;aWE*DP1xn==?KH&NaaGf=p_M3`p zE4HlunS_L6bIQ`8X?P^^M+Ra$1H0W|#a7>}ory*1I--+>J`c>yM?w(c8?5{x)(c2z zIV42=s)it}kIsfK`?E`7xEyd4lS`JQT{wE#cI9zMI8BSSl_f=7mGUkBmb*W;ayz#B zJ(-eZ>3d6rhV504kuC0Jr6P*461UUzAY*UW{Q<0mHfHh_%V})b-?zBOW@po*@4fos zUqU9k5R_u7n2BNq-c{`MU5`HD#Lq8H%||Whi_DMDFHJ-F!cyr?8gtpokeC6o&R_&* zG63y@mKGfs)A1RE$<2b9xxtM8fhv%NOT`N2uUA-}$ZRjw7+})sOomQH?ut;M?|QT| z<}o3G8KnaoC+-=z-NUDBeW(RZ{I{X_wSJDM^oJ_mk5tv*)KbV8g} z1FE~WG*t0)#MkRZex#9bCEC7Ru*cJ7veLgFd07h_cs#=&E|LKNG{BKMV=uc`Dyme` zh7fQ>nNz{%uc4pm$ccAP4u7%pWrmz42s!z>d+9t-8V?Y_xC5)@D@{_;HfvvEtIO!b zV&OcA`IXekhMP(T?eUt5T^++}D&`h;TuRSeSx#n1u?0s?0(A)y!zv-syM=S!OEe@w z%LL!K2s2*rD^bJ~Mb}Vs2G=cIvi3)YV*yS?6-kA|H4}kZhW@?;6a!FPfba_#wb>p- zw`KXGbiIWVU(fcw$QTgiX|6Kzbw5eBWk;#s@Q4sz!l8<%B8zksBm#7+DGZIdIe+jF0WCt;DX@FZAwSVAqP3-SA;#V~A67#*3u`3i` zPMO=g{!*Mc@$~io5YD#x!LDtvg49Jq37pmy`B^xzyf~D{1)Z+h$%5iyQ~LEQ5{Ka+uh-Ey0S%R}Zflw+oP$u}dn0pYy{Mz=641 zz`3;)U?5uyHw{iaph_XRay=j(hRqWE~hG{3$SQPk7ujHL*pw zp2&A?d~spzxMu=g1I59L7q5C#6N{zH>eK5hWZv@i{8aH*tL5$lKD6yP(^e*NF3!xq z;fk&8D-b;k<>e@Drej~$W097ct}Qh0@#xZUMP=FQaX68K2U{Z(g+IU%M7iYJRY7%% ze9+{tEW7IY&Dgn8+cpE;l%cemimeY|`AvyR9ggBeA29kk4{6$_# z4Z1L1s9UGNQ2ab#h+kp+f-?M$_oy>&={EO-b2Ix-OSkpr_=6&|1r7vC;XvQhgA$o8 zW3sP0S`&x|a7kEuN}y|P;Yi;Naup0gNCqW;jzD*w0Zh*e8%GHIJWKwOeLKnaA>au7 zt6-6enL~B5RlzcC4gkN2|F#!D@CQw=^K*>!15fF9OFI5x{f?!-f3Dw$rN4jB+*=!m z%LboNO+@8X?tzmt^dwPo4mURL%9^f63j-DX z*UnTEb}fh3$6Vdc?j8V>AXto61y^c~VnC2;%Zw%~$59dYg>*{;8h}RzevbXj+S1e2 zOdjFbq@?VCP2;Qjli^Fou^6Zh0ZgYy`fm6y(g(1g0v$ilscFdX4CnQwUeWPCOmrf= z!{H5k-0$zwh8+g%l%N5IxKqZCHUWA+!)vUAsK>=#cfwIvrk|muKVh0iPa#IS(OU|> z8hagaF;Uo25|~vpv7pCy#p7tdZ!s~fCJh~k3;!Sut(@I1W9ZJwM?C!!1Dt{HAo^J@ z>mQUa=Q-l@dN&<~5b+r0!adAVSotLcF|p@pbY_HG`3?-7na_|57|%l=kPBA-pPqTlaiEsixB z%8A}?yFkMrsf~J>4WL~pOU}C}M=tOQvM@qeoxD{JT)3$)KBq8xSl9bU_`Whh_{h-9 zI9~{VM`@H-Tf<9K_p+&OkyhvHxkci;winXxvS7t++Rk9?HD7lbIi-g<_A|AG#8anI zTvsz&CJ&Gm16>_g0VVpNP<{hgEJ=;`p8dAVAO2Y_N21c?EqbG8E|oBf+*Zch95H zRK*{n?<6lHy~p1V%qXOW?KIM$LKz1nhWK)lPeY^4YD{)Q&%AQSX9{KcULBwk1rM(> zP5C(|OD5T~k)c0<18uFg2@;avZAuCpm|4gb5?~UD6J;5+PZqB@3U&k@u{h1TM-<3H zT=aakDb&PfhLUn}uP!vw8c75FkfS$ndHY$Liv3j%(3_n&18dwKw8`hsON^2scfy<=k{GqC>*}S&z8mB`$@sjb zH4UTwGmLN6t41D-oAb594ZmXrjmK{x5LYS#J}5hsWK6oM%knUm#E(ezmSHUJIl%sfee1??EGQ(< zk9^_FIyU4mGT05_UBp#<6n(jCWm%qV!e69hh-F>ISq_Y^1S`YPs|+=ADN7fs0wv~- zc5jlU^SCd@PJW8pi-A{4IMxz!xlZ{*g)&hzufnw@DU%-Zh=C`&toMiGM{$ZkbU7oG zGa&i94s>2mg`K|cX%rWZFI*m4zeSKjz`QUJpU-v~&SG_ML=q1Jg1Iuh(l#(86vjEH z`BxIbE)#BehiDc?Ly|(5@@iwd%pgH3e!xy24s&mRj`qo#FYS~0=d_i;evkV!$JGm` zsZiqRq)GHq4ulOx&h*xYz~5k=%OWzAd`KV%SV|34{5~ostwIl$;du3EbtFe)9_?}p zDfL7#Y=O{~eqo54Ej=2N&}BH}WC15ua2XvW%nD-~(?fN2z_=AaHYF#&oN2G=&x94) zpVWsRrIL*d19D_DLDKJ-4_rv@Lsf>}BbnCZB8LSe3OvdDs5u#ILzr!Y@-ri69wDu*&a}nY; zvmKs+&&%eIav2>xlSurH)}QnA1Gj!?w@JZ|INp+Vw_SoDetP%bm9z)*gAA_BiJb7T zEaN*#fW?N1oGIZKa!(o-azPN=D;l%=O{{* z>h0x4;%qC6qhHUeMF|LuEDyy>=KhR4@p(wad*ocZ!$Yy6DH?Phl#2Z>R`eP9jFtH0 zVWn74KkY9lAXNT^`V01p8f9Kz_Fi+-2d5TBnF7&(-ybNXKf$R(Sd*YfbQg(cYhHDC zU-V7i!$;9kz5MMWA&F1uP~Q~_HYE3EQkn7Q{&PY@{pMI+0-M0bSLF9Y^k|2PH6CvNh%@ep#7RGskx|_ zulRcIm+T^8kTO`|Mo%=!Vg>u|AVMv}X`yQyx8_Wh_DUN#R!Z2GyeEpLlmK%( zPpse;3790w)759r!-D?xJ`ouvJ!4Fc$9@#e*Zfm!SiGR=1Zk8mA)O@mNEXydKti@! z%29wN)$$2Te9h#|z|ULHDr&e=N*KxM3v8{eKxmy_9t~U<82^%bi6dEQtUpx}k&j8ZN68%+56~U{5i)UK?CsFR9dMqB z`$DH+1KArHD^&j;5?;YVsWetnKd5d)zYqNOQvaT2c7hFcc5dAc-K0^$Yhj+3wI zeY|#=*Mpp+C1tR3-YhNs8Xu{WH(?=sM`@Pc zVmou}eH=cNlOSy$pBrkJ@{ON@>avr@oZ05v*bKOV?RA7R92{wae1xIxnf6iG)(We| zEQfKm;u+udG3nzLW|Y3tig&qs1%V+jg3MwZebm=I&lGeP1%(om@8wFKp`pBeVoT{K zBf}9a0_zdgMkr?rY%U{EuYo8SB6(urveBuMr%9~%^#-wU{9t14hh4A!Bf{+um0hnq z5?$6+@bn!}XIHAQV_fBd{(N6gFDW^;sn~aKHD_V;57{u(*MsM{5TU&pWLxZD*E@*f zbp;2>2QCgh*#5_^KOdaf2Se$DA%#nv3TE^XN4LK{fXCaEFHuEcbEOnQgZ*M5DaSbl zD>k_=EKZe3pG1ah72+(peg_E?MNc$B&0F0MK|56ESSmI&9-Q`JEO^d`szBm_x)Z4_ zhUb59+DFZVf0SHEcA%d}eH1W{0s_>93>hpN?fy#eH&JvVp?LebxAEBvKU?4#NX)_k zTY>Hz(@9g~C;f60t$HakGL&fA4EynnfR}FTFZc#gLRjvRATy$DBEOU0_RkQ6y?&oN zi^0L=-f6}PR&WK0eO?TDD={ z#xq>;hOcWa9SbL}D#SpBU)lJ*QcU97O||3xRZxjw3ZsbYqXod0F`PMOn zjU6~v9SG+ohvvnqH@R}&No~a&(HG(c&kM^qKr4T|U7^1b_Yh%LB3Dt$e# z@WNyk*j&g$EEgW`dsS^ZDq}rjcQ?lX3R{kIKty^8Xrk=G5#I)0V!*IHM=aR zb6W5_OhS5ZGyBsDqfH=+^ZLko9xR=w^SlB9OcPNInupFV%y0 zZ}6Ux58`>#zV0}Es~e^zcyxSu8c<im|U-#eSwLs!}w(&Y~&;6jU z<5ma~t8gwOqWnV4OB$KlWfc%lUYd5ZmM!w+>a(X|qNXB|>8G(i-xqD8Oc@gQ^}|h> zkv3t?3pFrZ*0ld1ZKP!yyDa*m=aMB~vi#C!@pW(DQ=1{RXk&z=o5WU$GHs}*K=;nW=xCqLH9CKL4Gem<^<2zgsOn{MeVzzJ^5KMvJY-_Dfg?@K zU%>dxd~f0vj_+z!$tQ{5EE$s9cuUV0e)sFc=@y4}7j)hx6c-&U2j%%0(ltwkPc#z> z*d6x{hDe|`%IlrCbgK5=#7T>O0#tciOie0=2RP-<*k(P7$#=yp~S zWBa+=N5K&!Fj4dZHKKOFx3|zq(SIJ0DhK`~?KAptd}JJ_mnY<5g1^o(z z8&q9xQ1u#%s&^CNyFu~Opz04LrJ!o`WDiYm0YI2Wwz+^=lgnnBQ z+ShXhkseb2UdCK$>sO|1U-$V$Tcp+^27X|0`nQVHzMjt$Kk#D@pS?!j>=iT^U%yO* zmZK7SuccZOA}%}Nve<*Y^0F{JKu-5-40LiL39=Bml!&gKsU&t|8=Oz$-H|p}R)IWm z&-3p?rz@%lFH$AneOSiiq{)0>Zx9`Hd>P}8E_(+ty_nokWq0V!nMZIq{JdFGj}6nU-&-K(EFNp93 z{xT@>qNTjclI=*0NyY9AWm9@Z={q#6K_dGL%6Z7Y{(`gYTdJhAFtk}K!2oco7oKN_gl$_-c;Q439o^p2&1p-|M3s+x>6WHWSz}WRu zYZpiH7uoGr(*ZhtL8#$8n!npre~DBd7)E%7YU25wp~N-YN(W%p+e$+f|A?Gw1RQhB zjoU)`OdGEnD}wP^=@qk!7!33ic}w)KF!xPgO!a~F<+Y1LvB#qq(G^z?5T>g0YZ@wX ziQXL^x1}bpkL?w6hw-P9YpZJ#L1%R2^IdPs*`YT9iCydm5m`BO@F23AuTQP*1v%K z#B9iWv^InV|Ij~>&Q$U8LYwM`^dFTky;d*jJWH0*wuX~+$>eWW4r<2~7UdvIpdoP$9 zn#K+iSYLR|==S46>y!G`b(j+xuWuT=`p>v9g$P`@C^x%VkIV{FUX%5mL~gaBv^F9& z_Im82Vqb5!&t>*`o_$WW&(rPmc>6ruK0g3$B>$WC`J#P3Zl4d>=TGhPJNEfi`@Gsd zudvU>_IaLtPPNa|?elp1JlsCzyn3zQK3~+Qhfiv6DQDiRVm6mkwJ=^JO5T7yg(`Nz z+12NsF~M0iBq#p|v2~sSQ~uKeVajjcDLM*I0Vte)lv7hfp z!~KIyzg}TVKi1w8dm<>4*6&=5vmz&ONWJ*0-MqDMH|I@(bf2RDtYK<$E!aSP?mSX* zI9?wX%;@oH`b(7@MgRJpV~E`>e*~Y@$Yba;c|>~Zu;csH9C$z<<+@4+zw_>(-eig? z7c@z}1o39^`!xJMD_#57@Y6Lk;P-5uD5~iFsggTTYXIV2LKKKU;#>F15txvHFn3w` zb0B$-%(fmRv)Yq3gj*6yjeU{gWc(ku&j;-Dr}p_B`~0eXUTvRO*ym#VJkLI-+UM!^ zdAxldZl53AWAV*CU$oE1?ehWq{Hc9@$3DMmpI6)G752Htk#S(y-xYT`1-f+AmlH<|b5*^g`tlruMq}WhGyJ{ z;>K2L8CI4z#uc}|s(&%q%_qVpSj+X{s z-d?}LA6dJq$=|W6siCF0rKxcO>F7x-5l!vwZS7P2ny{(eq+8w67+FsKh`%GcYE@f% zq^Z&0Oo@@@Egk+O+SGKmTZZ+jhaH{9cn|pbTY8g8Il-Adr*6s2ISXb7ojJ>{XljT!B-7^BuV`lW`5m#Q(Zc@RMXrRZPgKIX{~Q)XzJ)_0b#s?(g`%6&D1?- zRa1L?q@}GD!1$Z%TUO8){m?|2*pElet)91JW}qfq9ZU~B2w*|4xjl@~U=uR?!a%qt zxP-q8s-3Z`E^}rt2#3@8R~a;y5eL8%q-*snRlIe~C^PF0|;X3lKKZ^2+j zb!^Aj31^lWn76e0+v{5|r~kFlj);F5c+dhKwfZj}yJAJ-8S>}S3C_I0>{*Jz^CRso zV9AQ6*2_Ub#_e)OgTV!Z>RU4i>|a^Gre$SxrGHtpxtZ9GmaCg|%e3>f0}Gilpli2s#(Fv^KV_?l5HHrvXj=u`3## zi)v;Yih=$d$gT;xbe6TXt!S!mbsF2E!fBSZT;3Y>gdCyU%W2KZ`pa8eB2kKow6*zH zNR7OK;j7x4I&7b$owJ)RXWXu8^6T(3lI=}O3f{0NT}N9xs6*%nF3~}IYtEV+b!OME zY)aFS@{g4*9ZGTlED(t_ty~o`bsGBfw?TM=VfR(%JAgG zN;eK&POJZ8i9w}IQHLmKrXemsWpTPm_|tO63{W#M{2_3EF_IGb|HC!FQfHmzLI(%hzec4t!!&wYd@rQ_O(ec&}3nHsqe7wcChW&@}?E5?CXk_ zl`Ro3RR_IT*0#o(IN{6*TV^ebrWJ1XvK6>0x^OI5sqrQFZ8Gewv zL%2dFj}EFPoZwVBOJ+cpN}G;wnwdCrVQb=A&AbLIt|VCL@u6cyL|Rq~3|m^;_}kXp%-_bQtN7~) z6fiO!3fP1htd1r)bpxES-C-CS*E&pMf%)WOj4fAooKg)8R?nR8zs9fcem-hu*T^(A zj>IdPB5<`p9rQUH?CXd))9u%EXGL3mqbYTMb)BMJ`p0TdH-kbJ& zRc&s0QqI5guL>3;G;LU@PBAJ5K{+G?-y=zkXhfMH6QjWWqn_|pYnGJ>E!nz zzc1LQyzkxrQEEERf9Dq>{Q&voDZgq2o3+R&I{jv3PUiLW^qj_O0hfw^Iso;ES?w(< zN-$wALr!aJ&cF%;VXj-!u%fLa+HN^k%^*E24SW?v;CwmCh@CF&$bg5cz4^yBI;~Bs zb%f^5n^QMO^rqQ?+G>AQZE)^9*xy3`bQLp~7=}OHX>M<7a;gyEX9TLwmwDut%M5=L zUNn^7Ci{KM1-X3TX&dhGw`c8l-|XCU7F|B|!@~~|G}5BBA8|y0m?2>lOd|`+BQrE+ z=0|i98bD7tYqGz21)AbAgpdi&>6*zatX0HX&2CFq{PrdmJDXI`UQp|=t*)I>Jx^ws zoJm7U?r=24%y3|q0DAu5nZy)rQaPqZDN!{p|8!=g0Q2s2C#_Rt)u-k8r_Zko%p-+q z+@R>J5?0oCTxr^3S{p_ub)v1AV5acuS;(UQ;@=;a2JiiT>Zb+G9?f1ULx#_-O!@YXXw%>Cv z$xU~z4fpUpV83saoUnI1`W=OSDQ)M5#AY0i$M2225Wq?Gv1f(#E@wH_U0 zE|t3NSlnlhNu{10ol2GSJDc~fa2nRLxcg4wx9Vtq_{esROr=DGmcDo(90zn9TfQ=`d1K6~_5G|MWRCXQGVL5mKJwMA~foz4T(V z$RzTjC86z*moU?#?BpiVDUNg7awDIJ+#vJvf7|c7Z^@l+H)o}jw7;?6Ww+&~+n$w9 z%G>3oyEQl6?+2xG?RW8ybJKlb!##QBBm3?DVQ#vT7Sj)r;bkrLIQw0Edv3bP|013A zP5xEbbY8vFyz+jMTi(2Xkn?q8(y$`crVnt$G`X}GcS%L!sXt`>_l1q_z2+M8I06T7}< zusSF@Hv&`JimTu|m=uIzv|~n-)eFz`;jI8VMrG36r#h#8Owk^OJtHGg7Hi;>$_5SAKkdVW#;V!}A5aHh;nIKlrWX zw}4-LVMCb@VW~$Ov2B)#515VpS0ueHumGxIP zIe}mhO?kd$b7I%`3eF1BW#IV>W>ATL{sI=_ctQ1&)EXt9-bcq^cn`S>BdUneMSqneNF?nQqUgO!wlaO!w-iOqa|`Cp_(K`<)Ft zdH--wy1Z61K7-TwY`ByqztNwNuGEIhn8|O_C!{-jPS@} zh?s-khZb-s1yL9M#VjR@Bdm{Jg$9^eP?_C^5Vi(>lVvKkOOT>=80CUBZBK5@Hswf1 z(k)UO;^5@D)-}(vssg%|qv|kuo(hX23?`Pb0IL`!x(_@Nj|EY%SWwSch}v33aJ1Il z90QX9?gX}_&qdn^<% zuc^6X+E{b}!~M8zI1~8E^Ww3Mmzp5HBtWC( z1!J)22$I{D?aZeRS;I6HI5X9>Xi9eGXlf^zUc;2Wm~{zN84jT-SOlBknJi`fg!vaI z8N7bbjX+5xUKWP4@pLRWrd4_it|BaW>)u9hG-9%+B{o^DMoYqytulz!mD1^@5;PTW zRaNal8RA#9NZVxdX#=z%Wd!wJJH1XuTU&6y__*Ja?T+o9;a`R!35;yV(yhqqe|qKD zm^si44PdmSjOMEh4-XR2eHDa`xIEO;(u`MybfJ0?`ubw?>*OiF`GbB-`IeuIV_myQ z3L++%9taq%DbCs-Bo+FpSzVwRwx=v_+XW^~XY@37iVLdhU_1WlCUm;fpx!#poEhgS zi#kLKE&bzvidSdkADKr-+3&$AKWD=wjqs@npO9{FzEAp2>&(+t-<%HRbTqWLENhaN zNPF8_6i+C}D(`72aAr+)IA~-+f0jaPuwrnkjKXW;RVg;FT6kJ&^=q+q0bp=0lN6O% zmTo>#qbIs;<)CJG4a`KH;;6Moq<@E47RQZVuR8mn+@`B`kDAMJNvUoL-7W~GyiyRR~M)B9j08gVJ4QzkB<0>s|W^=~fL&_f?zD zn@4Z7->U|}?>`5n`?39Yp3ANGj;wUj=X>n;E6?Vpd-N01^$kk5%d3a7)9&OIUO$-98>0f;VX7tuVbwgL{jbj_eHn7T-wttkF)hw+UDbf71-c4s< zs97bBt?DPt?B2XW1QMhSO`awHXP}`FI@N$!8kD2&h^m7?fakY>*6YTC*7l}`HatbI zrlLV58-ND}2M==B&bTp{`Ns~E^YMJv!jx%*c%wAdM~to7%ZD^8-Z2@RkO^4q54U5gN>rkkH$?@cen9YP)U(8!sC{!Winq0gokVKpANFia*#&u2kd zJwDUrSonVuhoFjF29eP%(nMxdp1}h>!5Ktv9FBZ>D)lvf*YG=+-voXq^2_7*PID^t zKl~oz_dR~s@T=!{F29ld-fF^L%I|ypuHknHzYiNzsU`f*;P+MoVU+VpcG?-nPhLO* zQm@Kh&2Pi`7H#C?YpDXHwe1|!!|ylz4)QDSNTt^B+syAEzjBTMSk7+^zfJre=T{zO z6CcmfJZs4#m^;``tk&0QWgbGIQ^|_qY}KkRlno4ZZS2eVxW1ROHm+7}#B|&X{PUNm zSJs7!3|CQoNVw|%c|XAn*)d=yf&X(E(tp@?n!5{GW+pL@@!7dEi|0u`=Bocw)@9cK z_cf_hCBLQo?&i0LpPw_UdO5VQkKaCim86?NSUta+`T4KLp3ZL@KPh7@X&NN`>O+rX z*8FIB!^ekmCMpSosiP$vNjw_N%BGoJ1kYsjtHe-08yAyyoFBxBC9`8ITG2{lw` z%6YakmAYp=Yv}xL=GV=yj^FUC=d-*&%CC`Mgx>^Xm$`Us$E9d?ItMvw|8tBn&Zv3m zX`d+MrIl>c0ENUxgWm=_GcuMM<}vG8?#w{6(ln}5sXY#t;(7C{Yv%;3(WoT5`ZFlb z%b*_O-c8XuUwdZ*9o1Rp@pqCT1WI8Ls%e+DV+(C)p-vGnBFYdbO*O0|&=xD2 zfe;MakX-Z8#Bu_MC{gW@}wmXsnv*Jtn51d z5M#@3_xId+-{j6^Qqi-=qg}#z`2XK$p8I}0?|a|-^*;CNwAXZn%TCTgS50EK_8jfJ z`A?SK*{GN|l(P^>T*hHuIY-6u=P0>_r{j-P^kWt7TeLYbP)gSKDEiW1qmE2rm3VG6 zD5jytCe^_66X%GgSPh>et^*P~(!?<@m&hIMl&l;iR;G2AtccS`6_r~zBzqs{rA|+@ z$f=*=mKguH)DzpL+H%0XGiT{OtH2vStlFIa<-duf!*;MvfTilW(41Vpv_NjWkzei^ z`uILeb!2gsa?UnoSI!aVh~jbdckasdzg&B`|GuT;Ca0j3{+{*fLr%!-cU^k9#xVM) zU3$6Z5xxBWtkz4stdwE&C$wH{r3}%_@6TzyaM{M_f9cXojIGgUwO;a&7+a%1t@Wal z7+cW`e^u*6Co#50KW%T$50a0>*v?XapR2FdOI;+!R`in38(n&drJcn)2juTkt(Q8^ zL|#qi>=(G~CC2uG&Y>hqioc{D0R3<11k&&DF;|~|)hM=B{Sl80R=`s;N&h5VK4GrAa(~m}* zcBqZ-UtdXRiMg|-&f$52F=-iJq~okGl{GgE_uR7vjj#EP^O1cM^PBkT37t+|nA004 z9MyW0KBm)wnfZ24YrTwHk$=}TWwP_O9!l`MkgpVcS<7HU%3lj=UOLtXH)a- zTbnrtFaa4RO369Nr+Vg^!%0hhUFUHN`8w$){Xa=PTi-{ekboa>u;ytU*Md7XB&`YEx~#!Z|MI@h_A zn3(IKiIdZDPr06QP2yKh&5bn|%QrYnAzeDDK<5FjdpdqU8T(Yez4WVd0-@LH(524x z^-gE5=aNVQOj}ypwsD`Tj#CIO33jPXwYi0JvN3<=Ih&a2U{-ThQfD>s08o!>?3@r@ z&f)a(>a9c%%L<|9x;u6{F_^8j4J%f(%0f=&_+YshI@ef19i$o5o{$BTa!sQat_Z3{ z60+4sob|X-u3qN<*weZB$4=)kdrkiQyPllxTzn^i8(fM?Y@ibc&r`7#&Ko$?>fHLC z-~!9JLDkq4+(`&@-Qt$q^}GrOZ`s)_6?k7;oh%H^h55>8S+HHtB3rri7|+GjYkWI- z%1&NpO9@hEA11z<_dK*K@;9U2YN>16E|J#bA@NQSZEe#;+ZSxVE?4W<-cA;E$~h@j z9Je?1y3Ue2Q6@$Isup#Js#VRZm4}nW&GOH=s&sa+nid}CO&G%p+uzY*aT(gW1AEV( zwOEb}6MwcR9x&pGcgT9;5P}Et?`sD-^V7-8^ZPsNS&tYV&bN;~oSzPl=BLxs^7D&& zj;r>X{NFoP<)@F{lb;TG(veT)|E^Si`O%m1e?RCcZ|@KDe~)?6mM7irNh`I_g#0_5 zQtC+uJn5h(9o6TXrbn|cfr%!8)CsNaL$$Z0UiX` zA^YJG@aM=ucotl>Kq(s@2J4ag;TD)h9u*s~_$s9yhX=qnBO~w-c=grzL^wEvWZ+5g z6(kE+P6#PlSiTyOA<@2ly-!glE8OuOT~l2)yE2 z-Yh2^>_Ea|4|X9{@FbW;s^NlfS;V~%u?K6AE$}EyaRj^NyF3NwIQXB!$aWk^-7%*d+-~` z8LfP3G@z60+7KZA6_ZSd|2+ADf+?h4uq4}urGgZjY(;6@}3 zkAj`ZF}Mx>^-9_fkAWwUEIbPy3NtqDr#|3yt7#)V1m1$ogGa$9kooX5IJJ^701tpy zArVBxNjY8gm-}DH?m)dJ-BT>?Sxz4M-dwy13!)Q!fo&sq#v&S zQmF@#Bk&aX#CvHkJPjUvANzvXgO}f|)F?a%u0yi$2$(>|;7M@CX2$;m)F14BKjR#p z1poau+5*pln?67v!K2`3ku7i=d=S|VPk}#0>ct*hvxPYj9sxgvw2M9Xh7Zz@@F4hk zq(k)Jr$0nL3J0rea6dc(MxyNR!ohDN$Kh%4E!%i4Ej$E%6HyPM2Y-qL;90P;mN5a3 zfU~#LE_e`Jg)D`K!Al!xqv*kXO_T?h&(uDN)Wg$Yxy3kyhrnBqc6byFeuVuIE_m?) z{4N|^i44NS;MRk*1#W@&{3HDWx4}Rsb2VIW8*)Z$z#k)}4>3-_wf{u@;Sum-_b}ez zF|Z3+3QvMZ@1_3mH2A{j8Dntu&q`hP1?FUU5FD~;i`awHyQwog0LnKN4#Gp=RlW4R zaPX7Jqwo&U--rLj9xOS;ek2_H6_SBF-!MDOxPnK(-ymn;s-JxgnZb*~ZLn&9eFq)^ zyAqTQPlCq>X(v1buKpr*78~$QL(~}_1iyvc1y6(XhBT4B z!&6}S1DpcDL*QQ_kBSZWN#t>O2lzZP0#^@GE^-VW1eYPB@Gv;?73vC4gG(P)>Lt;G zw;*TWQE>Moj6=Sc(E)z2Y3hg17yGG!D;`BAK(G-3FKaQ8l3tBZ5KUw6*2-3f$NYoJOVa+ zlQzOFa37L|cYtwZ44wq1d`mg+gbsk$Aai*?bO?MmG7laBKk#kFCp-$uM+Gb3G4RB9 z*dO3o@ToNO2s{HGeTuT-Y4ADZF0lbizQ_Ck4}cFN`{60@zV9<13J1S>jCoHu_#Ds1BeEZEfyF;%4ul85 zjYzN9fL%yGJPF=(ihhJgz%gV5uKrW0Tai(*2S1Bs;5K;Ke=#@0gWw?~3r~W-Mbx8g z`zy{Xvh16}pQl`8K0FG3{zb+o+y+;^#C{78gTY_ZM!4XbG1>x;fU91i@5Bat1UU## zfeX*j7I+B!A}?1?!js_Q5}z6oJ-CaPC}-dnSY7HX_!$aUQqyioWcOfg`7TAoeg~z}zBUSJeIAf+yZGs2D1|%x>;7Y!I)Bq2I??LW@ zN5BstF?ba05BSs`coKXF>4c}ir;vN$8Svz6dP0B61X-1l#BO z)G^V6r;!X?UF1{OBUyMD480LQzy)u6lTVd?jrxEGk$G?%oK{Akzysj-kaBnioOQ8J zEfPKW;lJ>yrEm*eHxFOKBjDiW_ynE=`>(_g!omMQ_Q12?o96q}ez6CCyMVIc>MHWS z+NXNqA@Dimh}eVE%4sh=0N#L%z$4&;NE)63e}Wu`XGFgc6g_z48uAbh{t8iFCk@tK zOWWZV*n-T3$G|;E8N35Lh|GiA;I75gPwc^KL-Yqc1g5X2y>P)tm-y5ccnUncl(xf@ z;3dm^sudmtzkuw4+hBM(Wxxe5c^myMHsHIEUeSXakbZbnbjTn)3BI!e6dUk<y~n16I8gf2P$;4&lx53KU3k03$v zjDh=*rRe`u{(QV}eaaGF$TwrEno(IAni?&!rbPUyB91-2=_P9Vl9JGrsNX7%6s6?l z=KkI2{Y6v!#lFZmnmlNfucTO&R2GGNQF!STRl3_BDvlOez6j~5el>MTai}Qjv+}s) zyG`3~bJ@G|4NT*@VMgeJ=yYpZq%>8M_GgNio1J_%=sYE#$^zxO>tym2-8Nm%S*2>0 z?^5M%z0(f!d!cQlZIuP;Dz+Q&r}%Dz$9GaUlh=h))rGz*)P#lWH}TU8x=qqA-R_#X z>`Y$bcacK2Qctf>o2j2{`-h;k>%NIvJNev4ep0?^yWjy`#s>YH+uv?(+93HhyYiL% zygv4(XO^m&8>WY*MN6%zk&=`@U6eU%{JGm+s83|vneiuON}kQ0JVh^k;vQ$aC(%h6 z?tP|EoxS-NYKN5Rt*_V}@YKy)o@{6KQyCAtJ!8i^9=v5pI}hlwXZog4e;J<`TiHJ! zE3kixzPo_lTaU^1Zz)Ga>~|N~-=x0Hy1wpuPF5e&CU1UXf1*G=C#(OQ>1vK|w(@RK zaNaO&n5?euvE}BI)u~Y3cYAAs&(1ZkZkJz8zZ#zwIxdLKWOWmLp>bg5X5)W@GNzY! z#l3I#=FhzX==9b z4JyB-_)+|O!n2PSIyQ*iHjkb7Q08#=xOeI`XQE!-w7bnxM|V5DbBQH|XwD?>-}aYR-X7|4!D2lBd+W(zBn7-fZjm zw!m@6JI;(Byy&%a*WJl`@!9?6o--yJ@6P--|Lpm#(A;2rGMOI=)p3K~wu++;r-EasGZMb#m|brvGJM5-#PK+tl0S@AZ@H6OVcJ z2~(EY#-M3mRM*+N&rhE+W%~C@ik;CE!Dh1UjQ=G+a~&voxsOR@(?4ETJU)U_Q`1v2 z#aX#7)_(H(-n7%(hu*ZYGid4}=_6W~~L6Cb0I9M1p!xp`oF zR{AveSN3b}x4uC7`3YUc%RaUFMV}gV>5iZay)dI?jj(Q(;IT{5A|MQl^@ya}C&jZ&9R z==k~@A8f-P%q27qU)NyYSrLd=X}U>J+DV5V(M1blK5_{ zYhBYu)MH~SVNddfQk6bichh!t%%$B_FP|bpsoqe;_SJ;xI}vd_o0s(ZrtNJFbyd#S zJ}6_e=p=I;xWx(u(QN!E!Tq~75#P1CWgRc?7p4x&FPnDO-ky8Of_kM$&Xf3PC$Ul9 z=BzKSuH#czUbXsQaWz4s4eR9PcwaAeg1{nm&BTB43B}qvCu0KiOZ*#J8>rDb{W{uB z&WoC-igwLbiw|&N>AZ4C%@kdAQ`7BjmNCY?@+$6&5864++(c?;)3zE3&ty%7s@b}$<-;}3PwFXEL);iI zTTs=$8VSgyn!8wPRKxysyV_nHs8g6r#Rlil;<=>_4_xK6#t+nv($A#_U zl{D%T!sH7Bs@pH0C*_3`D&cS8lP8VL55s;!cx&sK6_O6y#dZ1v!kl4~PGiYrmYlBtTM+7#1 zcBvh(%j}?CZinqEJ7RCPV|It#Y4_Vl?3As#%DO^bRbA1p_O6bu{;pKlXjitYv^&^c z(H-fo?~ZkMb|x-;El-GQF+o^VgBC)tzgN%xR z+v9uV9dSFJj30@Q#7EKQ8U(3Bm|AS^s_(M8 zV$`IQx*VZ4>8?!I$*wVK6rfHaYE{*}xjWizQM0|>nSt!U*gz?z2jd}1uZnM`bSoaC z^v-xcrKjR)NiC`j>s7O>LHYcJ9D-lcVO>`#u6Ujs>kxq;zPA0|@YA`Su z94sG<4p~EchdPInL#d(Bp_4;uI51p3TrnIOjt;jE?;W;>lfxs!qr+M8wZ*zM@dJJq zFGuWpyWP%oXS+*#%6dZhtg2^oPkoPt?>c%qd!mP}!+Q^R9*z!J1MLHQ2RaArf#g7H zU}Ru);3O?N7k_5sDp8s!OO(^1a3VsB>J#m>s3T$1q9chBT9ip-X;JB587&G8h6k$# zHxJeiT7xRa+Bd2jJ!Bo)d#LkJ@=)qfw7c5)GkTQ zGWa<_ABW@TURr7}J$Q0(Y*2OhR6XTM4@bJP-Kr4|Eu*m_iDda^yLH_#jG z4fTe5BfZgHt2fr$(QEf6dsDsX-b`<{SM>$@f_ +# +# \ + exec tclkit $0 ${1+"$@"} + +# # ## ### ##### ######## ############# ##################### +## Requirements + +package require Tcl 8.6 +package provide critcl::app [package require critcl] +package require cmdline + +# It is expected here that critcl already imported platform, or an +# equivalent package, i.e. the critcl::platform fallback. No need to +# do it again. +#package require platform + +# Note: We can assume here that the commands lassign and dict are +# available. The critcl package has made sure of that. + +namespace eval ::critcl::app {} + +# # ## ### ##### ######## ############# ##################### +## https://github.com/andreas-kupries/critcl/issues/112 +## Ensure that we have maximal 'info frame' data, if supported +# +## ATTENTION: This slows the Tcl core down by about 10%, sometimes +## more, due to the need to track location information in some +## critical paths of Tcl_Obj management. +# +## I am willing to pay that price here, because this is isolated to +## the operation of the critcl application itself. While some more +## time is spent in the ahead-of-time compilation the result is not +## affected. And I want the more precise location information for when +## compilation fails. + +catch { interp debug {} -frame 1 } + +# # ## ### ##### ######## ############# ##################### +## Intercept 'package' calls. +# +# This code is present to handle the possibility of building multiple +# different versions of the same package, or of different packages +# having dependencies on different versions of a 3rd party +# package. Each will 'package provide' its version to our Tcl, and +# thus normally be reported as a conflict. To prevent that the +# intercepted command checks for this situation, and forces Tcl to +# forget the previously registered package. + +rename package ::critcl::app::__package +proc package {option args} { + if {$option eq "provide"} { + if {![catch { + set v [::critcl::app::__package present [lindex $args 0]] + }] && + ([llength $args] > 1) && + ($v ne [lindex $args 1]) + } { + # A package is provided which is already present in + # memory, the number of arguments is ok, and the version + # of the new package is different from what is + # known. Force Tcl to forget the previous package, this is + # not truly a conflict. + ::critcl::app::__package forget [lindex $args 0] + } + } + + return [eval [linsert $args 0 ::critcl::app::__package $option]] +} + +# # ## ### ##### ######## ############# ##################### +## Override the default of the critcl package for errors and +## message. Write them to the terminal (and, for errors, abort the +## application instead of throwing them up the stack to an uncertain +## catch). + +proc ::critcl::error {msg} { + global argv0 + puts stderr "$argv0 error: $msg" + flush stderr + exit 1 +} + +proc ::critcl::msg {args} { + switch -exact -- [llength $args] { + 1 { + puts stdout [lindex $args 0] + flush stdout + } + 2 { + lassign $args o m + if {$o ne "-nonewline"} { + return -code error "wrong\#args, expected: ?-nonewline? msg" + } + puts -nonewline stdout $m + flush stdout + } + default { + return -code error "wrong\#args, expected: ?-nonewline? msg" + } + } + return +} + +# # ## ### ##### ######## ############# ##################### +## +# Rewrite the hook handling declarations found after the build. +# The default of clearing state for a new build is not the right +# thing to do in mode "precompile". Here we want to see an ERROR. + +proc ::critcl::HandleDeclAfterBuild {} { + if {![done]} return + set cloc {} + if {![catch { + array set loc [info frame -2] + } msg]} { + if {$loc(type) eq "source"} { + set cloc "@$loc(file):$loc(line)" + } else { + set cloc " ([array get loc])" + } + } ;#else { set cloc " ($msg)" } + + append err [lindex [info level -1] 0] + append err $cloc + append err ": Illegal attempt to define C code in [This] after it was built." + append err \n [at::SHOWFRAMES] + error $err +} + +# # ## ### ##### ######## ############# ##################### + +proc ::critcl::app::main {argv} { + Cmdline $argv + + # When creating a package use a transient cache which is not in + # conflict with "compile & run", or other instances of the critcl + # application. + + if {$v::mode eq "pkg"} { + set pkgcache [PackageCache] + critcl::cache $pkgcache + critcl::fastuuid + } + + ProcessInput + StopOnFailed + + # All input files have been processed and their data saved. Now + # generate the boilerplate bracketing all the sub-ordinate + # Foo_Init() functions, i.e. the code which provides a single + # initialization function for the whole set of input files. + + if {$v::mode eq "pkg"} { + # Create a merged shared library and put a proper Tcl package + # around it. + + BuildBracket + StopOnFailed + AssemblePackage + + if {!$v::keep} { + file delete -force $pkgcache + } + } elseif {$v::mode eq "tea"} { + AssembleTEA + } + + StopOnFailed + + if {$v::keep} { + ::critcl::print stderr "Files left in [critcl::cache]" + } + + ::critcl::print "Done\n" + return +} + +proc ::critcl::app::PackageCache {} { + if {$v::cache ne {}} { + return $v::cache + } + return [file join ~ .critcl pkg[pid].[clock seconds]] +} + +proc ::critcl::app::StopOnFailed {} { + if {!$v::failed} return + ::critcl::print stderr "Files left in [critcl::cache]" + ::critcl::print stderr "FAILURES $v::failed" + ::critcl::print stderr "FAILED: [join $v::borken "\nFAILED: "]" + ::critcl::print stderr "FAILED [join [split [join $v::log \n\n] \n] "\nFAILED "]" + exit 1 ; #return -code return +} + +proc ::critcl::app::Cmdline {argv} { + variable options + + # Rationalized application name. Direct user is the intercepted + # '::critcl::error' command. + set ::argv0 [cmdline::getArgv0] + + # Semi-global application configuration. + set v::verbose 0 ; # Default, no logging. + set v::src {} ; # No files to process. + set v::mode cache ; # Fill cache. Alternatively build a + # package, or TEA hierarchy. + set v::shlname "" ; # Name of shlib to build. + set v::outname "" ; # Name of shlib dir to create. + set v::libdir lib ; # Directory to put the -pkg or -tea + # directory into. + set v::incdir include ; # Directory to put the -pkg include files into (stubs export), + # and search in (stubs import) + set v::keep 0 ; # Default: Do not keep generated .c files. + + # Local actions. + set selftest 0 ;# Invoke the application selftest, which simply + # runs whatever test/*.tst files are found in the + # starkit or starpack. IOW, this functionality is + # usable only for a wrapped critcl application. + set cleaning 0 ;# Clean the critcl cache. Default: no. + set showall 0 ;# Show all configurations in full. Default: no. + set show 0 ;# Show the chosen build configuration. Default: no. + set showtarget 0 ;# Show the chosen build target only. Default: no. + set targets 0 ;# Show the available targets. + set help 0 ;# Show the application's help text. + + # Local configuration. Seen outside of this procedure only + # directly, through the chosen build configuration. + + set target "" ;# The user-specified build target, if any. + set configfile "" ;# The user-specified custom configuration file, + # if any + + # Process the command line... + + while {[set result [cmdline::getopt argv $options opt arg]] != 0} { + if {$result == -1} { + switch -glob -- $opt { + with-* { + set argv [lassign $argv opt arg] + regsub {^-with-} $opt {} opt + lappend v::uc $opt $arg + continue + } + default { + Usage "Unknown option \"$opt\"" + } + } + } + switch -exact -- $opt { + v - -version { + ::critcl::print [package present critcl] + ::exit 0 + } + I { AddIncludePath $arg } + L { AddLibraryPath $arg } + cache { set v::cache $arg } + clean { incr cleaning } + config { set configfile $arg } + debug { + lappend v::debug $arg + #critcl::config lines 0 + } + force { + critcl::config force 1 + ::critcl::print stderr "Compilation forced" + } + keep { + critcl::config keepsrc 1 + #critcl::config lines 0 + set v::keep 1 + } + trace-commands { + critcl::config trace 1 + } + trace { + critcl::cflags -DCRITCL_TRACER + } + help { incr help } + libdir { + set v::libdir $arg + + # In case critcl is wrapped Tcl must be told about the + # outside location for packages. + + lappend ::auto_path $arg + lappend ::auto_path [file dirname $arg] + AddLibraryPath $arg + } + includedir { + set v::incdir $arg + AddIncludePath $arg + } + enable { lappend v::uc $arg 1 } + disable { lappend v::uc $arg 0 } + pkg { set v::mode pkg ; incr v::verbose } + tea { set v::mode tea ; incr v::verbose } + show { incr show } + showall { incr showall } + showtarget { incr showtarget } + target { set target $arg } + targets { incr targets } + test { set selftest 1 } + default { + Usage "Unknown option \"$opt\"" + } + } + } + + # ... validate the settings, and act on them. + + if {$help} { + Help + exit + } + + # Parse the user-specified configuration file, if any. This + # overrides the default configuration file read by the critcl + # package when it was loaded. It does keep the default platform + # from that active. + + if {$configfile ne ""} { + if {$argv eq "" && [file extension $configfile] eq ".tcl"} { + # probably means the user has omitted the config file and we've + # picked up the source file name + Usage "-config is missing file argument" + } + if {![file exists $configfile]} { + Usate "Can't read configuration file $configfile" + } + critcl::readconfig $configfile + } + + # And switch to the user-provided target platform. + + if {$target ne ""} { + if {($argv eq "") && [file extension $target] eq ".tcl"} { + # probably means the user has omitted the config file and we've + # picked up the source file name + Usage "-target is missing file argument" + } + + set match [critcl::chooseconfig $target 1] + + if {[llength $match] == 1} { + critcl::setconfig [lindex $match 0] + } else { + Usage "multiple targets matched : $match" + } + } + + if {($v::mode eq "pkg") || $show} { + critcl::crosscheck + } + + if {$cleaning} { + critcl::clean_cache + } + + if {$show} { + if {$v::mode eq "pkg"} { + critcl::cache [PackageCache] + } + critcl::showconfig stdout + } + + if {$showall} { + critcl::showallconfig stdout + } + + if {$showtarget} { + ::critcl::print [critcl::targetplatform] + } + + if {$targets} { + ::critcl::print [critcl::knowntargets] + } + + if {$show || $showall || $targets || $showtarget} { + exit + } + + if {$selftest} { + Selftest + exit + } + + # Invoking the application without input files is an error, except + # if it was to just clean the local critcl cache. + + if {[llength $argv] < 1} { + if {!$cleaning} Usage + exit + } + + # The remainder of the arguments are the files to process, except + # for lib and pkg modes where they can be prefixed with the name + # of the output file, i.e. shared library. If however no such + # output file is present the name of the first input file will be + # used as name of the library. + + set v::src $argv + + # (%) Determine the name of the shared library to generate from + # the input files. This location is referenced by (=). + + if {$v::mode ne "cache"} { + set name [lindex $argv 0] + set addext 0 + + # Split a version number off the package name. + set ver {} + if {[regexp {^([^0-9]+)([0-9][.0-9]*)$} $name -> base ver]} { + set name $base + } + + switch [file extension $name] { + .dll - + .dylib - + .sl - + .so { + # The name of the result shlib is prefixed, take it as + # package name, and strip it off the list of input + # files. + set v::outname [file rootname $name] + set v::src [lrange $v::src 1 end] + set addext 1 + } + .tcl { + # We have no discernible result shlib, take + # the stem of the first input file as package + # name + + set v::outname [file rootname $name] + set addext 1 + } + "" { + # See above for .tcl, except that there is no stem to + # take. And if this is the only argument we also have + # to derive the full name of the expected input file + # from it. + set v::outname $name + if {[llength $argv] == 1} { + set v::src [list $v::outname.tcl] + } else { + set v::src [lrange $v::src 1 end] + } + } + default { + Usage "Not sure how to handle \"$name\"" + } + } + + # Put the version number back. We have to distinguish package + # library file name and package directory name. Only the + # latter should have the version number. + set v::shlname $v::outname + if {$ver ne {}} { + append v::outname $ver + } + + if {$addext || ([file extension $v::shlname] eq "")} { + append v::shlname [critcl::sharedlibext] + } + + critcl::config combine dynamic + + if {![llength $v::src]} { + Usage "No input files" + } + } + + # Determine the platform to use by the build backend, based on + # actual platform we are on and the user's chosen target, if any. + + set v::actualplatform [::critcl::actualtarget] + return +} + +proc ::critcl::app::AddIncludePath {path} { + set dirs [critcl::config I] + lappend dirs [file normalize $path] + critcl::config I $dirs + return +} + +proc ::critcl::app::AddLibraryPath {path} { + set dirs [critcl::config L] + lappend dirs [file normalize $path] + critcl::config L $dirs + return +} + +proc ::critcl::app::Log {text} { + if {!$v::verbose} return + ::critcl::print -nonewline $text + flush stdout + return +} + +proc ::critcl::app::LogLn {text} { + if {!$v::verbose} return + ::critcl::print $text + flush stdout + return +} + +proc ::critcl::app::Usage {args} { + global argv0 + if {[llength $args]} { + ::critcl::print stderr "$argv0 error: [join $args]" + } + + ::critcl::print stderr [string map [list @ $argv0] {To compile and run a tcl script + @ [-force] [-keep] [-cache dir] file[.tcl] + +To compile and build a package + @ options -pkg ?name? [files...] + +To repackage for TEA + @ options -tea ?name? [files...] + +Options include: + -debug [symbols|memory|all] enable debugging + -force force compilation of C files + -show show the configuration options being used + -target target generate binary for specified target platform/architecture + +Other options that may be useful: + -I dir adds dir to the include search path when compiling. + -L dir adds dir to the library search path when linking. + -cache dir sets the Critcl cache directory to dir. + -keep keep intermediate C files in the Critcl cache + -config file read the Critcl configuration options from file + -libdir dir location of generated library/package + -includedir dir location of generated package headers (stubs) + -showall show configuration for all supported platforms + -targets show all available target platforms + +You can display the built-in help wiki on most platforms using: + @ -help }] + exit 1 + return +} + +proc ::critcl::app::Help {} { + if {[catch {package require Mk4tcl} msg] || + [catch {package require Wikit} msg]} { + ::critcl::print $msg + set txt "Couldn't load the Critcl help Wiki\n" + append txt "To display the Critcl help wiki run \"critcl\" " + append txt "without any options.\n" + ::critcl::print $txt + exit + } else { + Wikit::init [file join $::starkit::topdir doc critcl.tkd] + } +} + +proc ::critcl::app::Selftest {} { + foreach t [glob -directory [file join $starkit::topdir test] *.tst] { + source $t + } + return +} + +proc ::critcl::app::ProcessInput {} { + # Main loop. This processes the input files, one by one. + + set v::debug [lsort -unique $v::debug] + + # NOTE that this effectively executes them (source!) in the + # context of this application. The files are trusted to not + # contain malicious side-effects, etc. + + # Initialize the accumulator variables for various per-file + # information which will be needed later when building the + # over-arching initialization code. + + set v::clibraries {} ;# External libraries used. To link the final shlib against. + set v::ldflags {} ;# Linker flags. + set v::objects {} ;# The object files to link. + set v::edecls {} ;# Initialization function decls for the pieces. + set v::initnames {} ;# Initialization function calls for the pieces. + set v::tsources {} ;# Tcl companion sources. + set v::mintcl 8.4 ;# Minimum version of Tcl required to run the package. + set v::tk 0 ;# Boolean flag. Set if any sub-package needs Tk, forcing it on the collection as well. + set v::preload {} ;# List of libraries declared for preload. + set v::license {} ;# Accumulated licenses, if any. + set v::failed 0 ;# Number of build failures encountered. + set v::borken {} ;# List of files which failed to build. + set v::log {} ;# List of log messages for the failed files + set v::headers {} ;# List of header directories (in the result cache) + # to export. + set v::pkgs {} ;# List of package names for the pieces. + set v::inits {} ;# Init function names for the pieces, list. + set v::meta {} ;# All meta data declared by the input files. + + # Other loop status information. + + set first 1 ;# Flag, reset after first round, helps with output formatting. + set missing 0 + + if {$v::mode eq "tea"} { + LogLn "Config: TEA Generation" + Log "Source: " + + # Initialize the accumulator variables for various per-file + # information. + + set v::org {} ; # Organization the package is licensed by. + set v::ver {} ; # Version of the package. + set v::cfiles {} ; # Companion files (.tcl, .c, .h, etc). + set v::teasrc {} ; # Input file(s) transformed for use in the Makefile.in. + set v::imported {} ; # List of stubs APIs imported from elsewhere. + set v::config {} ; # List of user-specified configuration settings. + + } elseif {[llength $v::src]} { + LogLn "Config: [::critcl::targetconfig]" + LogLn "Build: [::critcl::buildplatform]" + + set t [::critcl::targetplatform] + if {$v::actualplatform ne $t} { + LogLn "Target: $v::actualplatform (by $t)" + } else { + LogLn "Target: $v::actualplatform" + } + Log "Source: " + } + + foreach f $v::src { + # Avoid reloading itself. + if {[file rootname [file tail $f]] eq "critcl"} continue + + if {$v::mode eq "tea"} { + lappend v::teasrc "\${srcdir}/src/[file tail $f]" + } + + # Canonicalize input argument, and search in a few places. + set fn [file normalize $f] + + set found [file exists $fn] + if {!$found} { + if {[file extension $fn] ne ".tcl"} { + append fn .tcl + set found [file exists $fn] + } + if {!$found} { + if {!$first} { ::critcl::print stderr "" } + ::critcl::print stderr "$f doesn't exist" + incr missing + continue + } + } + + set first 0 + LogLn "[file tail $fn]" + set dir [file dirname $fn] + + if {$v::mode eq "tea"} { + # In TEA mode we are not building anything at all. We only + # wish to know and scan for the declarations of companion + # files, so that we know what to put these into the TEA + # directory hierarchy. This also provides us with the + # version number to use. + + LogLn "" + array set r [critcl::scan $fn] + lappend v::cfiles $f $r(files) + if {$r(org) ne {}} { + lappend v::org $r(org) + } + if {$r(version) ne {}} { + lappend v::ver $r(version) + } + if {$r(imported) ne {}} { + critcl::lappendlist v::imported $r(imported) + } + if {$r(config) ne {}} { + critcl::lappendlist v::config $r(config) + } + if {$r(meta) ne {}} { + lappend v::meta $r(meta) + } + continue + } + + # Execute the input file and collect all the crit(i)c(a)l :) + # information. Depending on the use of 'critcl::failed' this + # may or may not have generated the internal object file. + + if {$v::mode eq "pkg"} { + critcl::buildforpackage + } + + if {[llength $v::debug]} { + # As the debug settings are stored per file we now take + # the information from the application's commandline and + # force things here, faking the proper path information. + + set save [info script] + info script $fn + eval [linsert $v::debug 0 critcl::debug] + info script $save + } + + #puts ||$v::uc|| + if {[llength $v::uc]} { + # As the user-config settings are stored per file we now + # take the information from the application's commandline + # and force things here, faking the proper path information. + # Full checking of the data happens only if the setting is + # actually used by the file. + + set save [info script] + info script $fn + + foreach {k v} $v::uc { + #puts UC($k)=|$v| + critcl::userconfig set $k $v + } + info script $save + } + + # Ensure that critcl's namespace introspection is done + # correctly, and not thinking that 'critcl::app' is the + # namespace to use for the user's commands. + + uplevel #0 [list source $fn] + + if {[critcl::cnothingtodo $fn]} { + ::critcl::print stderr "nothing to build for $f" + continue + } + + # Force build. Our 'buildforpackage' call above disabled + # 'critcl::failed' and 'critcl::load' (Causing them to return + # OK, and bypassing anything conditional on their failure). If + # there is a failure we want to know it correctly, here. + # + # Regardless, we have to force (and later restore) the proper + # script location, something the 'source' comand above did + # automatically. + + set save [info script] + info script $fn + set failed [critcl::cbuild $fn 0] + incr v::failed $failed + info script $save + + # We can skip the part where we collect the build results for + # use by the overarching code if either no overall shlib is + # generated from the input, or any of the builds made so far + # failed. + + # NOTE that we were NOT skipping the build step for any of the + # packages, even if previous packages failed. We want the + # maximum information about problems from a single run, not + # fix things one by one. + + set results [critcl::cresults $fn] + if {$failed} { + lappend v::borken $f + lappend v::log [dict get $results log] + Log "(FAILED) " + } elseif {[dict exists $results warnings]} { + # There might be warnings to print even if the build did + # not fail. + set warnings [dict get $results warnings] + if {[llength $warnings]} { + ::critcl::print stderr "\n\nWarning [join $warnings "\nWarning "]" + } + } + if {$v::failed || ($v::mode ne "pkg")} continue + + array set r $results + + append v::edecls "extern Tcl_AppInitProc $r(initname)_Init;\n" + append v::initnames " if ($r(initname)_Init(interp) != TCL_OK) return TCL_ERROR;\n" + append v::license [License $f $r(license)] + + lappend v::pkgs $r(pkgname) + lappend v::inits $r(initname) + lappend v::meta $r(meta) + + # The overall minimum version of Tcl required by the combined + # packages is the maximum over all of their minima. + set v::mintcl [Vmax $v::mintcl $r(mintcl)] + set v::tk [Max $v::tk $r(tk)] + critcl::lappendlist v::objects $r(objects) + critcl::lappendlist v::tsources $r(tsources) + critcl::lappendlist v::clibraries $r(clibraries) + critcl::lappendlist v::ldflags $r(ldflags) + critcl::lappendlist v::preload $r(preload) + + if {[info exists r(apiheader)]} { + critcl::lappendlist v::headers $r(apiheader) + } + } + + if {$missing} { + critcl::error "Missing files: $missing, aborting" + } + + # Reduce package and init function to the first pieces. Easier to + # do it this way than having a conditional set in the loop. + + set v::pkgs [lindex $v::pkgs 0] + set v::inits [lindex $v::inits 0] + # Strip the prefix used by the foundation package. Keep in sync. + regsub {^ns_} $v::inits {} v::inits + + return +} + +proc ::critcl::app::Vmax {a b} { + if {[package vcompare $a $b] >= 0} { + return $a + } else { + return $b + } +} + +proc ::critcl::app::Max {a b} { + if {$a >= $b} { + return $a + } else { + return $b + } +} + +proc ::critcl::app::License {file text} { + if {$text eq "<>"} { return {} } + return "\n\[\[ [file tail $file] \]\] __________________\n$text" +} + +proc ::critcl::app::BuildBracket {} { + ::critcl::print "\nLibrary: [file tail $v::shlname]" + + # The overarching initialization code, the bracket, has no real + # file behind it. Fake it based on the destination shlib, this + # ensures that the generated _Init function has the proper name + # without having to redefine things through C macros, as was done + # before. + info script $v::shlname + + critcl::config combine "" + + # Inject the information collected from the input files, making + # them part of the final result. + critcl::tcl $v::mintcl + if {$v::tk} { critcl::tk } + + set lib critcl::cobjects + critcl::lappendlist lib $v::objects + eval $lib + + set lib critcl::clibraries + critcl::lappendlist lib $v::clibraries + eval $lib + + eval [linsert [lsort -unique $v::ldflags] 0 critcl::ldflags] + eval [linsert [lsort -unique $v::preload] 0 critcl::preload] + + critcl::cinit $v::initnames $v::edecls + + # And build everything. + critcl::buildforpackage 0 + set failed [critcl::cbuild "" 0] + + incr v::failed $failed + if {$failed} { + lappend v::borken <> + Log "(FAILED) " + } + return +} + +proc ::critcl::app::PlaceShlib {} { + # Copy the generated shlib from the cache to its final resting + # place. For -pkg this was set be inside the directory hierarchy + # of the newly-minted package. To prevent hassle a previously + # existing file gets deleted. + + if {[file exists $v::shlname]} { + file delete -force $v::shlname + } + + # NOTE that the fake 'info script location' set by 'BuildBracket' + # is still in effect, making access to the build results easy. + set shlib [dict get [critcl::cresults] shlib] + file copy $shlib $v::shlname + + # For MSVC debug builds we get a separate debug info file. + set pdb [file root $shlib].pdb + if {[file exists $pdb]} { + file copy -force $pdb [file root $v::shlname].pdb + } + + # Record shlib in the meta data, list of package files. + set d [file tail [file dirname $v::shlname]] + set f [file tail $v::shlname] + lappend v::meta [list included [file join $d $f]] + return +} + +proc ::critcl::app::ExportHeaders {} { + set incdir [CreateIncludeDirectory] + + foreach dir $v::headers { + set stem [file tail $dir] + set dst [file join $incdir $stem] + + ::critcl::print "Headers Placed Into: $v::incdir/$stem" + + file mkdir $dst + foreach f [glob -nocomplain -directory $dir *] { + file copy -force $f $dst + } + } + return +} + +proc ::critcl::app::AssemblePackage {} { + # Validate and/or create the main destination directory L. The + # package will become a subdirectory of L. See (x). And a platform + # specific directory inside of that will hold the shared + # library. This allows us to later merge the packages for + # different platforms into a single multi-platform package. + + if {![llength $v::pkgs]} { + ::critcl::print stderr "ERROR: `package provide` missing in package sources" + exit 1 + } + + set libdir [CreateLibDirectory] + + set libname [file tail $v::outname] + set pkgdir [file join $libdir $libname] + set shlibdir [file join $pkgdir $v::actualplatform] + + # XXX fileutil::stripPwd ... + if {[string first [pwd] $pkgdir] != -1} { + set first [string length [pwd]] + set dir [string range $pkgdir [incr first] end] + } else { + set dir $pkgdir + } + ::critcl::print "\nPackage Placed Into: $dir" + + file mkdir $pkgdir + file mkdir $shlibdir + + set shl [file tail $v::shlname] + + CreatePackageIndex $shlibdir [file rootname $shl] \ + [PlaceTclCompanionFiles $pkgdir] + CreateLicenseTerms $pkgdir + CreateRuntimeSupport $pkgdir + + # Place the shlib generated by BuildBracket into its final resting + # place, in the directory hierarchy of the just-assembled package. + + set v::shlname [file join $shlibdir $shl] + PlaceShlib + + # At last we can generate and write the meta data. Many of the + # commands before added application-level information (like + # included files, entrytclcommand, ...) to the information + # collected from the input files + + CreateTeapotMetadata $pkgdir + ExportHeaders + return +} + +proc ::critcl::app::CreatePackageIndex {shlibdir libname tsources} { + # Build pkgIndex.tcl + + set version [package present $v::pkgs] + + # (=) The 'package present' works because (a) 'ProcessInput' + # sources the package files in its own context, this process, and + # (b) the package files (are expected to) contain the proper + # 'package provide' commands (for compile & run mode), and we + # expect that at least one of the input files specifies the + # overall package built from all the inputs. See also (%) in + # Cmdline, where the application determines shlib name and package + # name, often from the first input file, and/or working backwards + # from package name to input file. + + set index [open [file join [file dirname $shlibdir] pkgIndex.tcl] w] + puts $index [PackageGuard $v::mintcl] + puts $index [IndexCommand $version $libname $tsources $shlibdir] + close $index + return +} + +proc ::critcl::app::Mapping {} { + # Create the platform mapping for each of the platforms listed on + # the Config platform line + + set map [critcl::getconfigvalue platform] + set minver [lindex $map 1] + + set plats [list] + foreach plat [lrange $map 2 end] { + set mapping($plat) [list [critcl::actualtarget] $minver] + lappend plats $plat + } + + if {[llength $plats]} { + ::critcl::print "Platform: [join $plats {, }] $minver and later" + } + + set map {} + foreach plat [lsort [array names mapping]] { + lappend map $plat $mapping($plat) + } + return $map +} + +proc ::critcl::app::Preload {shlibdir} { + if {![llength $v::preload]} { return {} } + + # Locate the external libraries declared for preloading and put + # them into the package. Put the shared library of the internal + # preload support pseudo-package into it as well. This will all be + # picked up by the 'package ifneeded' script. + + # First handle the declared libraries. Any problem there throws an + # error, or aborts. + + set preload {} + foreach shlib $v::preload { + file copy -force [PreloadLocation $shlib] $shlibdir + lappend preload [file tail $shlib] + } + + # Everything was ok, now place the supporting shlib into the + # package as well. + + file copy -force \ + [file join [critcl::cache] preload[critcl::sharedlibext]] \ + $shlibdir + + ::critcl::print "Preload: [join $preload {, }]" + return $preload +} + +proc ::critcl::app::PreloadLocation {shlib} { + set searchpath [PreloadSearchPath $shlib] + + foreach path $searchpath { + if {![file exists $path]} continue + return $path + } + + set msg "can't find preload library $shlib" + append msg " for target platform \"$v::actualplatform\";" + append msg " searched for " + append msg [linsert [join $searchpath {, }] end-1 and] + critcl::error $msg + return +} + +proc ::critcl::app::PreloadSearchPath {shlib} { + + # Look for lib FOO as follows: + # (1) FOO.so + # (2) FOO/FOO.so + # (3) FOO//FOO.so + # + # Look for lib BAR/FOO as follows: + # (1) FOO.so + # + # Then, if BAR/FOO doesn't exist as directory: + # (2) BAR/FOO.so + # (3) BAR//FOO.so + # + # Conversely, if BAR/FOO does exist as directory: + # (2) BAR/FOO/FOO.so + # (3) BAR/FOO//FOO.so + + # - lib.so + # - dir/lib.so + # - dir/plat/lib.so + + set tail [file tail $shlib] + + if {[file isdirectory $shlib]} { + set dir $shlib + } else { + set dir [file dirname $shlib] + if {$dir eq "."} { + set dir $tail + } + } + + set ext [critcl::sharedlibext] + return [list \ + $tail$ext \ + [file join $dir $tail$ext] \ + [file join $dir $v::actualplatform $tail$ext]] +} + +proc ::critcl::app::PackageGuard {v} { + return [string map [list @ $v] \ + {if {![package vsatisfies [package provide Tcl] @]} {return}}] +} + +proc ::critcl::app::IndexCommand {version libname tsources shlibdir} { + # We precompute as much as possible instead of wholesale defering + # to the runtime and dynamic code. See ticket (38bf01b26e). That + # makes it easier to debug the index command, as it is immediately + # visible in the pkgIndex.tcl file. And supports placement into + # the meta data. + + set loadcmd [LoadCommand $version $libname $tsources $shlibdir] + return "package ifneeded [list $v::pkgs $version] $loadcmd" +} + +proc ::critcl::app::LoadCommand {version libname tsources shlibdir} { + # New style. Precompute as much as possible. + + set map [Mapping] + if {$map ne {}} { set map " [list $map]" } + set platform "\[::critcl::runtime::MapPlatform$map\]" + + set loadcmd {} + lappend loadcmd {source [file join $dir critcl-rt.tcl]} + lappend loadcmd "set path \[file join \$dir $platform\]" + lappend loadcmd "set ext \[info sharedlibextension\]" + lappend loadcmd "set lib \[file join \$path \"$libname\$ext\"\]" + + foreach p [Preload $shlibdir] { + lappend loadcmd "::critcl::runtime::preFetch \$path \$ext [list $p]" + } + + lappend loadcmd "load \$lib [list $v::inits]" + + foreach t $tsources { + lappend loadcmd "::critcl::runtime::Fetch \$dir [list $t]" + } + + lappend loadcmd [list package provide $v::pkgs $version] + + # Wrap the load command for use by the index command. + # First make it a proper script, indented, i.e. proc body. + + set loadcmd "\n [join $loadcmd "\n "]" + + if {[package vsatisfies $v::mintcl 8.5]} { + # 8.5+: Put the load command into an ::apply, i.e. make it + # an anonymous procedure. + + set loadcmd "\[list ::apply \{dir \{$loadcmd\n\}\} \$dir\]" + } else { + # 8.4: Use a named, transient procedure. Name is chosen + # for low probability of collision with anything else. + # NOTE: We have to catch the auto-delete command because + # the procedure may have been redefined and destroyed by + # recursive calls to 'package require' of more critcl-based + # packages. + set n __critcl_load__ + append loadcmd "\n catch \{rename $n {}\}";# auto delete + set loadcmd "\"\[list proc $n \{dir\} \{[string map [list \n { ; }] $loadcmd]\}\] ; \[list $n \$dir\]\"" + } + + lappend v::meta [list entrytclcommand [list "eval $loadcmd"]] + + return $loadcmd +} + +proc ::critcl::app::IndexCommandXXXXX {version libname tsources shlibdir} { + # Old style critcl. Ifneeded and loading is entirely and + # dynamically handled in the runtime support code. + + set map [Mapping] + set preload [Preload $shlibdir] + set arguments [list $v::pkgs $version $libname $v::inits $tsources $map] + return "source \[file join \$dir critcl-rt.tcl\]\n::critcl::runtime::loadlib \$dir $arguments $preload" +} + +proc ::critcl::app::CreateLicenseTerms {pkgdir} { + # Create a license.terms file. + + if {$v::license eq ""} { + set v::license <> + } else { + set v::license [string trimleft $v::license] + } + set license [open [file join $pkgdir license.terms] w] + puts $license $v::license + close $license + return +} + +proc ::critcl::app::CreateTeapotMetadata {pkgdir} { + if {![llength $v::meta]} { + critcl::error "Meta data missing" + return + } + + # Merge the data from all input files, creating a list of words + # per key. Note: Data from later input files does not replace + # previous words, they get added instead. + + set umd {} + foreach md $v::meta { + foreach {k vlist} $md { + foreach v $vlist { + dict lappend umd $k $v + } + } + } + + # Check the identifying keys, i.e. package name, version, and + # platform for existence. + + foreach k {name version platform} { + if {![dict exists $umd $k]} { + critcl::error "Package $k missing in meta data" + } + } + + + # Collapse the data of various keys which must have only one, + # unique, element. + + foreach k {name version platform build::date generated::date} { + if {![dict exists $umd $k]} continue + dict set umd $k [lindex [dict get $umd $k] 0] + } + + # Add the entity information, and format the data for writing, + # using the "external" format for TEApot meta data. This writer + # limits lines to 72 characters, roughly. Beyond that nothing is + # done to make the output look pretty. + + set md {} + lappend md "Package [dict get $umd name] [dict get $umd version]" + dict unset umd name + dict unset umd version + + dict for {k vlist} $umd { + set init 1 + foreach v $vlist { + if {$init} { + # The first element of the value list is always added, + # regardless of length, to avoid infinite looping + # without progress. + set line {} + lappend line Meta $k $v + set init 0 + continue + } + if {[string length [linsert $line end $v]] > 72} { + # If the next element brings us beyond the limit we + # flush the current state and re-initialize. + lappend md $line + set line {} + lappend line Meta $k $v + set init 0 + continue + } + # Add the current element, extending the line. + lappend line $v + } + + # Flush the last line. + lappend md $line + } + + # Last step, write the formatted meta data to the associated file. + + set teapot [open [file join $pkgdir teapot.txt] w] + puts $teapot [join $md \n] + close $teapot + return +} + +proc ::critcl::app::PlaceTclCompanionFiles {pkgdir} { + # Arrange for the companion Tcl source files (as specified by + # critcl::tsources) to be copied into the Tcl subdirectory (in + # accordance with TIP 55) + + if {![llength $v::tsources]} { return {} } + + set tcldir [file join $pkgdir tcl] + file mkdir $tcldir + set files {} + set id 0 + foreach t $v::tsources { + set dst [file tail $t] + set dst [file rootname $dst]_[incr id][file extension $dst] + + file copy -force $t $tcldir/$dst + lappend files $dst + + # Metadata management + lappend v::meta [list included tcl/$dst] + } + return $files +} + +proc ::critcl::app::CreateRuntimeSupport {pkgdir} { + # Create the critcl-rt.tcl file in the generated package. This + # provides the code which dynamically assembles at runtime the + # package loading code, i.e. the 'package ifneeded' command + # expected by Tcl package management. + + variable mydir + set runtime [file join $mydir runtime.tcl] + + if {![file exists $runtime]} { + critcl::error "can't find Critcl's package runtime support file \"runtime.tcl\"" + } + + set fd [open $runtime] + set txt [read $fd] + close $fd + + append txt [DummyCritclPackage] + append txt [PlatformGeneric] + + set fd [open [file join $pkgdir critcl-rt.tcl] w] + puts $fd $txt + close $fd + + lappend v::meta [list included critcl-rt.tcl] + return +} + +proc ::critcl::app::DummyCritclPackage {} { + # This command provides conditional no-ops for any of the critcl + # procedures exported by the regular package, so that a .tcl file + # with embedded C can also be its own companion file declaring Tcl + # procedures etc. These dummy procedures are defined if and only + # if their regular counterpart is not present. + + # Note: We are generating code checking each and every relevant + # command individually to avoid trouble with different versions of + # critcl which may export a differing set of procedures. This way + # we will not miss anything just because we assumed that the + # presence of critcl::FOO also implies having critcl::BAR, or not. + + # Append dummy Critcl procs + # XXX This should be made conditional on the .tcl actually using itself as companion. + append txt "\n\# Dummy implementation of the critcl package, if not present\n" + + foreach name [lsort [namespace eval ::critcl {namespace export}]] { + switch $name { + compiled { set result 1 } + compiling { set result 0 } + done { set result 1 } + check { set result 0 } + failed { set result 0 } + load { set result 1 } + Ignore { append txt [DummyCritclCommand $name { + namespace eval ::critcl::v {} + set ::critcl::v::ignore([file normalize [lindex $args 0]]) . + }] + continue + } + default { + append txt [DummyCritclCommand $name {}] + continue + } + } + append txt [DummyCritclCommand $name "return $result"] + } + + return $txt +} + +proc ::critcl::app::DummyCritclCommand {name result} { + append txt "if \{!\[llength \[info commands ::critcl::$name\]\]\} \{\n" + append txt " namespace eval ::critcl \{\}\n" + append txt " proc ::critcl::$name \{args\} \{$result\}\n" + append txt "\}\n" + return $txt +} + +proc ::critcl::app::PlatformGeneric {} { + # Return a clone of the platform::generic command, from the + # currently loaded platform package. The generated package cannot + # assume that the deployment environment contains this package. To + # avoid trouble if the DP has the package the definition is made + # conditional, i.e. the clone is skipped if the command is already + # present. + + set body [info body ::platform::generic] + + append txt "\n# Define a clone of platform::generic, if needed\n" + append txt "if \{!\[llength \[info commands ::platform::generic\]\]\} \{\n" + append txt " namespace eval ::platform \{\}\n" + append txt " proc ::platform::generic \{\} \{" + append txt [join [split $body \n] "\n "] + append txt "\}\n" + append txt "\}\n\n" + + return $txt +} + +proc ::critcl::app::AssembleTEA {} { + LogLn {Assembling TEA hierarchy...} + + set libdir [CreateLibDirectory] + set libname [file rootname [file tail $v::outname]] + set pkgdir [file join $libdir $libname] + + LogLn "\tPackage: $pkgdir" + + file mkdir $pkgdir + + # Get a proper version number + set ver 0.0 + if {[llength $v::ver]} { + set ver [lindex $v::ver 0] + } + # Get a proper organization this is licensed by + set org Unknown + if {[llength $v::org]} { + set org [lindex $v::org 0] + } + + PlaceTEASupport $pkgdir $libname $ver $org + PlaceCritclSupport $pkgdir + PlaceInputFiles $pkgdir + + # Last, meta data for the TEA setup. + CreateTeapotMetadata $pkgdir + return +} + +proc ::critcl::app::CreateLibDirectory {} { + set libdir [file normalize $v::libdir] + if {[file isfile $libdir]} { + critcl::error "can't package $v::shlname - $libdir is not a directory" + } elseif {![file isdirectory $libdir]} { + file mkdir $libdir + } + + return $libdir +} + +proc ::critcl::app::CreateIncludeDirectory {} { + set incdir [file normalize $v::incdir] + if {[file isfile $incdir]} { + ::critcl::error "can't package $v::shlname headers - $incdir is not a directory" + } elseif {![file isdirectory $incdir]} { + file mkdir $incdir + } + + return $incdir +} + +proc ::critcl::app::PlaceTEASupport {pkgdir pkgname pversion porg} { + # Create the configure.in file in the generated TEA + # hierarchy. + + LogLn "\tPlacing TEA support..." + + foreach {pmajor pminor} [split $pversion .] break + if {$pminor eq {}} { set pminor 0 } + if {$pmajor eq {}} { set pmajor 0 } + + variable mydir + set tea [file join $mydir tea] + + if {![file exists $tea]} { + critcl::error "can't find Critcl's TEA support files" + } + + # Copy the raw support files over. + foreach f [glob -directory $tea *] { + file copy $f $pkgdir + + if {[file tail $f] eq "tclconfig"} { + foreach f [glob -directory $tea/tclconfig *] { + lappend v::meta [list included tclconfig/[file tail $f]] + } + } else { + lappend v::meta [list included [file tail $f]] + } + } + + # Basic map for the placeholders in the templates + + set now [clock seconds] + set year [clock format $now -format {%Y}] + set now [clock format $now] + set map [list \ + @@CRITCL@@ "\"$::argv0 $::argv\"" \ + @@PNAME@@ $pkgname \ + @@PMAJORV@@ $pmajor \ + @@PMINORV@@ $pminor \ + @@PFILES@@ "\\\n\t[join $v::teasrc " \\\n\t"]" \ + @@PORG@@ $porg \ + @@YEAR@@ $year \ + @@NOW@@ $now] + set cmap $map + set mmap $map + + # Extend map with stubs API data + + if {![llength $v::imported]} { + lappend cmap @@API@@ {} + lappend mmap @@API@@ {} @@APIUSE@@ {} + } else { + set macros {} + # Creating the --with-foo-include options for imported APIs. + + lappend macros "#-----------------------------------------------------------------------" + lappend macros "## TEA stubs header setup" + lappend macros "" + foreach api $v::imported { + set capi [string map {:: _} $api] + + lappend macros "CRITCL_TEA_PUBLIC_PACKAGE_HEADERS(\[$capi\])" + lappend mvardef "CRITCL_API_${capi}_INCLUDE = @CRITCL_API_${capi}_INCLUDE@" + lappend mvaruse "-I \$(CRITCL_API_${capi}_INCLUDE)" + } + lappend cmap @@API@@ \n[join $macros \n]\n + lappend mmap @@API@@ \n[join $mvardef \n]\n + lappend mmap @@APIUSE@@ " \\\n\t\t[join $mvaruse " \\\n\t\t"]" + } + + # Extend map with custom user configuration data. + + if {![llength $v::config]} { + lappend cmap @@UCONFIG@@ {} + lappend mmap @@UCONFIG@@ {} @@UCONFIGUSE@@ {} + } else { + + # Note: While we could assume that the user-specified + # configuration options of a single file are consistent with + # each other here we have a union of options from multiple + # files. No such assumption can be made. Thus, we unique the + # list, and then check that each option name left has a unique + # definition as well. + + set ok 1 + array set udef {} + set uclist [lsort -unique $v::config] + foreach uc $uclist { + set oname [lindex $uc 0] + if {[info exists udef($oname)]} { + LogLn "\t Inconsistent definition for $oname" + LogLn "\t (1) $uc" + LogLn "\t (2) $udef($oname)" + set ok 0 + continue + } + set udef($oname) $uc + } + if {!$ok} { + ::critcl::error "Conflicting user-specified configuration settings." + } + + # Creating the --(with,enable,disable)-foo options for + # user-specified configuration options. + + lappend macros "#-----------------------------------------------------------------------" + lappend macros "## TEA user option setup" + lappend macros "" + foreach uc $uclist { + lassign $uc oname odesc otype odefault + + if {$otype eq "bool"} { + set odefault [expr {$odefault ? "yes" : "no"}] + if {$odesc eq {}} { + set odesc "--enable-$oname" + } + append odesc " (default: $odefault)" + + lappend macros "CRITCL_TEA_BOOL_CONFIG(\[$oname\],\n\t\[$odefault\],\n\t\[$odesc\])" + } else { + if {$odesc eq {}} { + set odesc "--with-$oname" + } + append odesc " (default: $odefault, of [join $otype {, }])" + + lappend macros "CRITCL_TEA_WITH_CONFIG(\[$oname\],\n\t\[[join $otype { }]\],\n\t\[$odefault\],\n\t\[$odesc\])" + } + + lappend mvardef "CRITCL_UCONFIG_${oname} = @CRITCL_UCONFIG_${oname}@" + lappend mvaruse "\$(CRITCL_UCONFIG_${oname})" + } + lappend cmap @@UCONFIG@@ \n[join $macros \n]\n + lappend mmap @@UCONFIG@@ \n[join $mvardef \n]\n + lappend mmap @@UCONFIGUSE@@ " \\\n\t\t[join $mvaruse " \\\n\t\t"]" + } + + # Postprocess a few files (configure.in, Makefile.in). + + Map [file join $pkgdir configure.in] $cmap + Map [file join $pkgdir Makefile.in] $mmap + Map [file join $pkgdir Config.in] $map + + # At last locate a suitable autoconf (2.59+), and generate + # configure from the configure.in. + + set here [pwd] + cd $pkgdir + if {$::tcl_platform(platform) eq "windows"} { + # msys/mingw, cygwin, or other unix emulation on windows. + exec sh [LocateAutoconf 1] + } else { + exec [LocateAutoconf 0] + } + file delete -force autom4te.cache + + lappend v::meta [list included configure] + + cd $here + + return +} + +proc ::critcl::app::Map {path map} { + set fd [open $path r] + set txt [read $fd] + close $fd + + set txt [string map $map $txt] + + set fd [open $path w] + puts -nonewline $fd $txt + close $fd + + return +} + +proc ::critcl::app::PlaceCritclSupport {pkgdir} { + LogLn "\tPlacing Critcl support..." + + set c [file join $pkgdir critcl] + set l [file join $c lib] + file mkdir $l + + # Locate the critcl packages, and their forward compatibility + # support packages, and copy them into the TEA hierarchy for use + # by the generated Makefile. + foreach {pkg dir} { + critcl critcl + critcl::app app-critcl + critcl::util critcl-util + critcl::class critcl-class + critcl::iassoc critcl-iassoc + critcl::bitmap critcl-bitmap + critcl::cutil critcl-cutil + critcl::emap critcl-emap + critcl::enum critcl-enum + critcl::literals critcl-literals + critcl::platform critcl-platform + stubs::container stubs_container + stubs::gen stubs_genframe + stubs::gen::decl stubs_gen_decl + stubs::gen::lib stubs_gen_lib + stubs::gen::macro stubs_gen_macro + stubs::gen::slot stubs_gen_slot + stubs::gen::header stubs_gen_header + stubs::gen::init stubs_gen_init + stubs::reader stubs_reader + stubs::writer stubs_writer + } { + set cmd [package ifneeded $pkg [package require $pkg]] + set location [file dirname [lindex $cmd end]] + + # Squash any soft-links, which Tcl would copy as links. + set location [file dirname [file normalize $location/__]] + file copy $location $l/$dir + } + + # Generate a suitable main.tcl. Note that this main file sources + # the critcl packages directly, to ensure that the build uses the + # code put into the generated TEA hierarchy, and is not influenced + # by whatever is installed outside. + + set pfiles {} + lappend pfiles stubs_container/container stubs_reader/reader + lappend pfiles stubs_genframe/genframe stubs_gen_decl/gen_decl + lappend pfiles stubs_gen_macro/gen_macro stubs_gen_slot/gen_slot + lappend pfiles stubs_gen_header/gen_header stubs_gen_init/gen_init + lappend pfiles stubs_gen_lib/gen_lib stubs_writer/writer + lappend pfiles critcl/critcl app-critcl/critcl critcl-util/util + lappend pfiles critcl-class/class critcl-iassoc/iassoc + lappend pfiles critcl-bitmap/bitmap critcl-cutil/cutil + lappend pfiles critcl-literals/literals critcl-platform/platform + lappend pfiles critcl-emap/emap critcl-enum/enum + + set fd [open [file join $pkgdir critcl main.tcl] w] + puts $fd [join \ + [list \ + "# Required packages: cmdline, md5" \ + "# Optional: tcllibc, Trf, md5c, cryptkit (md5 acceleration)" \ + "# Enforce usage of the local critcl packages." \ + "foreach p \{\n\t[join $pfiles \n\t]\n\} \{" \ + { source [file dirname [info script]]/lib/$p.tcl} \ + "\}" \ + {critcl::app::main $argv}] \n] + close $fd + + # Add to set of included files. + lappend v::meta [list included critcl/main.tcl] + foreach p $pfiles { + lappend v::meta [list included critcl/lib/$p.tcl] + } + return +} + +proc ::critcl::app::PlaceInputFiles {pkgdir} { + LogLn "\tPlacing input files..." + + # Main critcl source file(s), plus companions + + foreach f $v::src { + #LogLn "\tB $f" + + set dst [file join src [file tail $f]] + lappend v::meta [list included $dst] + + set dst [file join $pkgdir $dst] + file mkdir [file dirname $dst] + file copy $f $dst + } + + foreach {f cf} $v::cfiles { + set base [file dirname $f] + foreach f [lsort -unique $cf] { + set fs [file join $base $f] + + #LogLn "\tC $fs" + + set dst [file join src $f] + lappend v::meta [list included $dst] + + set dst [file join $pkgdir $dst] + + file mkdir [file dirname $dst] + file copy $fs $dst + } + } + return +} + +proc ::critcl::app::LocateAutoconf {iswin} { + set ac [auto_execok autoconf] + + if {$ac eq {}} { + return -code error "autoconf 2.59 or higher required, not found" + } + + if {$iswin} { + # msys/mingw, cygwin, or other unix emulation on windows. + set cmd [linsert $ac 0 exec sh] + } else { + set cmd [linsert $ac 0 exec] + } + + set v [lindex [split [eval [linsert $cmd end --version]] \n] 0 end] + + if {![package vsatisfies $v 2.59]} { + return -code error "$ac $v is not 2.59 or higher, as required" + } + + return $ac +} + +# # ## ### ##### ######## ############# ##################### + +namespace eval ::critcl::app { + # Path of the application package directory. + variable myself [file normalize [info script]] + variable mydir [file dirname $myself] + + variable options { + I.arg L.arg cache.arg clean config.arg debug.arg force help + keep libdir.arg pkg show showall target.arg targets + test tea showtarget includedir.arg enable.arg disable.arg + v -version + } + + # Application state + namespace eval v { + # - -- --- ----- -------- ------------- --------------------- + # Data collected from the command line. + + variable verbose 0 ;# Level of chattering written during a run. + variable src {} ;# List of files to process. + + variable actualplatform {} ;# Target platform, with x-compile information resolved. + + variable shlname "" ;# Name of the shlib to generate (-pkg, -tea). + variable outname "" ;# Name of the shlib dir to use (-pkg, -tea). + variable libdir lib ;# Place for the package (-pkg, -tea). + variable incdir include ; # Directory to put the -pkg include files into (stubs export), + # and search in (stubs import) + variable keep 0 ;# Boolean flag. Default: Do not keep generated .c files. + variable debug {} ;# List of debug modes to activate. + variable cache {} ;# User specified path to the directory for the result cache. + variable uc {} ;# List. User specified configuration data. + + # Build mode. Default is to fill the result + # cache. Alternatives are building a package (-pkg), or + # assembling/repackaging for TEWA (-tea). + + variable mode cache ;# pkg, tea + + # - -- --- ----- -------- ------------- --------------------- + # Data accumulated while processing the input files. + + variable failed 0 ;# Number of build failures encountered. + variable clibraries {} ;# External libraries used. To link the final shlib against. + variable ldflags {} ;# Linker flags. + variable objects {} ;# The object files to link. + variable edecls {} ;# Initialization function decls for the pieces (C code block). + variable initnames {} ;# Initialization function calls for the pieces (C code block). + variable tsources {} ;# Tcl companion sources. + variable mintcl 8.4 ;# Minimum version of Tcl required to run the package. + variable preload {} ;# List of libraries declared for preload. + variable license {} ;# Accumulated licenses, if any. + variable pkgs {} ;# List of package names for the pieces. + variable inits {} ;# Init function names for the pieces, list. + variable meta {} ;# All meta data declared by the input files. + + # critcl::scan results + variable org {} ;# Organization package is licensed by + variable ver {} ;# Version of the package. + variable cfiles {} ;# Companion files (.tcl, .c, .h, etc). + variable teasrc {} ;# Input file(s) transformed for use in the Makefile.in. + variable imported {} ;# List of stubs APIs imported from elsewhere. + variable config {} ;# List of user-specified configuration settings. + # variable meta ;# See above. + } +} + +# # ## ### ##### ######## ############# ##################### +return diff --git a/src/tclkit86bi.vfs/lib/critcl-app3.2/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl-app3.2/pkgIndex.tcl new file mode 100644 index 00000000..29bbac37 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-app3.2/pkgIndex.tcl @@ -0,0 +1,2 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl::app 3.2 [list source [file join $dir critcl.tcl]] diff --git a/src/tclkit86bi.vfs/lib/critcl-app3.2/runtime.tcl b/src/tclkit86bi.vfs/lib/critcl-app3.2/runtime.tcl new file mode 100644 index 00000000..467d3664 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-app3.2/runtime.tcl @@ -0,0 +1,134 @@ +# +# Critcl - build C extensions on-the-fly +# +# Copyright (c) 2001-2007 Jean-Claude Wippler +# Copyright (c) 2002-2007 Steve Landers +# +# See http://wiki.tcl.tk/critcl +# +# This is the Critcl runtime that loads the appropriate +# shared library when a package is requested +# + +namespace eval ::critcl::runtime {} + +proc ::critcl::runtime::loadlib {dir package version libname initfun tsrc mapping args} { + # XXX At least parts of this can be done by the package generator, + # XXX like listing the Tcl files to source. The glob here allows + # XXX code-injection after-the-fact, by simply adding a .tcl in + # XXX the proper place. + set path [file join $dir [MapPlatform $mapping]] + set ext [info sharedlibextension] + set lib [file join $path $libname$ext] + set provide [list] + + # Now the runtime equivalent of a series of 'preFetch' commands. + if {[llength $args]} { + set preload [file join $path preload$ext] + foreach p $args { + set prelib [file join $path $p$ext] + if {[file readable $preload] && [file readable $prelib]} { + lappend provide [list load $preload];# XXX Move this out of the loop, do only once. + lappend provide [list ::critcl::runtime::preload $prelib] + } + } + } + + lappend provide [list load $lib $initfun] + foreach t $tsrc { + lappend loadcmd "::critcl::runtime::Fetch \$dir [list $t]" + } + lappend provide "package provide $package $version" + package ifneeded $package $version [join $provide "\n"] + return +} + +proc ::critcl::runtime::preFetch {path ext dll} { + set preload [file join $path preload$ext] + if {![file readable $preload]} return + + set prelib [file join $path $dll$ext] + if {![file readable $prelib]} return + + load $preload ; # Defines next command. + ::critcl::runtime::preload $prelib + return +} + +proc ::critcl::runtime::Fetch {dir t} { + # The 'Ignore' disables compile & run functionality. + + # Background: If the regular critcl package is already loaded, and + # this prebuilt package uses its defining .tcl file also as a + # 'tsources' then critcl might try to collect data and build it + # because of the calls to its API, despite the necessary binaries + # already being present, just not in the critcl cache. That is + # redundant in the best case, and fails in the worst case (no + # compiler), preventing the use o a perfectly fine package. The + # 'ignore' call now tells critcl that it should ignore any calls + # made to it by the sourced files, and thus avoids that trouble. + + # The other case, the regular critcl package getting loaded after + # this prebuilt package is irrelevant. At that point the tsources + # were already run, and used the dummy procedures defined in the + # critcl-rt.tcl, which ignore the calls by definition. + + set t [file join $dir tcl $t] + ::critcl::Ignore $t + uplevel #0 [list source $t] + return +} + +proc ::critcl::runtime::precopy {dll} { + # This command is only used on Windows when preloading out of a + # VFS that doesn't support direct loading (usually, a Starkit) + # - we preserve the dll name so that dependencies are satisfied + # - The critcl::runtime::preload command is defined in the supporting + # "preload" package, implemented in "critcl/lib/critcl/critcl_c/preload.c" + + global env + if {[info exists env(TEMP)]} { + set dir $env(TEMP) + } elseif {[info exists env(TMP)]} { + set dir $env(TMP) + } elseif {[info exists ~]} { + set dir ~ + } else { + set dir . + } + set dir [file join $dir TCL[pid]] + set i 0 + while {[file exists $dir]} { + append dir [incr i] + } + set new [file join $dir [file tail $dll]] + file mkdir $dir + file copy $dll $new + return $new +} + +proc ::critcl::runtime::MapPlatform {{mapping {}}} { + # A sibling of critcl::platform that applies the platform mapping + + set platform [::platform::generic] + set version $::tcl_platform(osVersion) + if {[string match "macosx-*" $platform]} { + # "normalize" the osVersion to match OSX release numbers + set v [split $version .] + set v1 [lindex $v 0] + set v2 [lindex $v 1] + incr v1 -4 + set version 10.$v1.$v2 + } else { + # Strip trailing non-version info + regsub -- {-.*$} $version {} version + } + foreach {config map} $mapping { + if {![string match $config $platform]} continue + set minver [lindex $map 1] + if {[package vcompare $version $minver] < 0} continue + set platform [lindex $map 0] + break + } + return $platform +} diff --git a/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/Config.in b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/Config.in new file mode 100644 index 00000000..f71888e4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/Config.in @@ -0,0 +1,188 @@ +## -*- tcl -*- Critcl configuration file +# # ## ### ##### ######## ############# ##################### +## For +# @@PNAME@@ @@PMAJORV@@.@@PMINORV@@ +# +# Copyright (c) @@YEAR@@ @@PORG@@ +# +# Generated by @@CRITCL@@ +# At @@NOW@@ + +# This specific file gets filled by the TEA configure(.in) with the +# compiler information it found when run, and the accompanying +# Makefile(.in) uses it to overide critcl's default configuration +# settings. In this way we manage to get a proper TEA setup of flags +# and such, bypassing all of critcl's own selection logic. critcl is +# essentially 'just' used as a custom compiler driver, whereas a +# standard TEA Makefile would have all the relevant commands listed +# explicitly in its rules. + +# # ## ### ##### ######## ############# ##################### +## First, keep the GCC specific defaults. + +compile gcc -c -fPIC +version gcc -v +link gcc -shared +include -I +preproc_define gcc -E -dM +preproc_enum gcc -E +tclstubs -DUSE_TCL_STUBS +tkstubs -DUSE_TK_STUBS +debug_memory -DTCL_MEM_DEBUG +debug_symbols -g +object .o +output -o [list $outfile] +ldoutput +link_debug +link_release +link_preload --unresolved-symbols=ignore-in-shared-libs +strip -Wl,-s +optimize -O2 +noassert -DNDEBUG +threadflags -DUSE_THREAD_ALLOC=1 -D_REENTRANT=1 -D_THREAD_SAFE=1 \ + -DHAVE_PTHREAD_ATTR_SETSTACKSIZE=1 -DHAVE_READDIR_R=1 \ + -DTCL_THREADS=1 + + +# # ## ### ##### ######## ############# ##################### +## Second, define settings based on the system information found by +## configure(.in), converted into something usable by critcl. See the +## section below for the raw settings. + +TEA platform @CRITCL_PLATFORM@ +TEA compile @CRITCL_CC@ +TEA version @CRITCL_VERSION@ +TEA link @CRITCL_LINK@ +TEA preproc_define @CRITCL_CPP_DEFINE@ +TEA preproc_enum @CRITCL_CPP_ENUM@ +TEA debug_symbols @CFLAGS_DEBUG@ +TEA object .@OBJEXT@ +TEA output @CRITCL_CC_OUTPUT@ +TEA ldoutput @CRITCL_LD_OUTPUT@ +TEA link_debug @CRITCL_LD_DBG@ +TEA link_release @CRITCL_LD_REL@ +TEA link_preload --unresolved-symbols=ignore-in-shared-libs +TEA strip +TEA optimize @CFLAGS_OPTIMIZE@ + + +# # ## ### ##### ######## ############# ##################### +## Third, the exact raw settings generated by configure(.in), +## as found in build_dir/config.status. To help debugging the +## munging, when its wrong. +## +## The lines marked with ** are those which are of especially high +## interest. + +#** CC = (@CC@) +#** CFLAGS = (@CFLAGS@) +#** CFLAGS_DEBUG = (@CFLAGS_DEBUG@) +#** CFLAGS_OPTIMIZE = (@CFLAGS_OPTIMIZE@) +#** CFLAGS_WARNING = (@CFLAGS_WARNING@) +#** CPP = (@CPP@) +#** CPPFLAGS = (@CPPFLAGS@) +#** DEFS = (@DEFS@) +#** LDFLAGS = (@LDFLAGS@) +#** LDFLAGS_DEFAULT = (@LDFLAGS_DEFAULT@) +#** LIBS = (@LIBS@) +#** MAKE_LIB = (@MAKE_LIB@) +#** MAKE_SHARED_LIB = (@MAKE_SHARED_LIB@) +#** MAKE_STATIC_LIB = (@MAKE_STATIC_LIB@) +#** MAKE_STUB_LIB = (@MAKE_STUB_LIB@) +#** MATH_LIBS = (@MATH_LIBS@) +#** OBJEXT = (@OBJEXT@) +#** SHLIB_CFLAGS = (@SHLIB_CFLAGS@) +#** SHLIB_LD = (@SHLIB_LD@) +#** SHLIB_LD_LIBS = (@SHLIB_LD_LIBS@) +#** SHLIB_SUFFIX = (@SHLIB_SUFFIX@) +#** STLIB_LD = (@STLIB_LD@) +#** TCL_EXTRA_CFLAGS = (@TCL_EXTRA_CFLAGS@) +#** TCL_INCLUDES = (@TCL_INCLUDES@) +#** TCL_LD_FLAGS = (@TCL_LD_FLAGS@) +#** TCL_LIBS = (@TCL_LIBS@) +#** TCL_SHLIB_LD_LIBS = (@TCL_SHLIB_LD_LIBS@) +#** TCL_THREADS = (@TCL_THREADS@) + +# AR = (@AR@) +# CELIB_DIR = (@CELIB_DIR@) +# CFLAGS_DEFAULT = (@CFLAGS_DEFAULT@) +# CLEANFILES = (@CLEANFILES@) +# CYGPATH = (@CYGPATH@) +# ECHO_C = (@ECHO_C@) +# ECHO_N = (@ECHO_N@) +# ECHO_T = (@ECHO_T@) +# EGREP = (@EGREP@) +# EXEEXT = (@EXEEXT@) +# GREP = (@GREP@) +# INSTALL_DATA = (@INSTALL_DATA@) +# INSTALL_PROGRAM = (@INSTALL_PROGRAM@) +# INSTALL_SCRIPT = (@INSTALL_SCRIPT@) +# LD_LIBRARY_PATH_VAR = (@LD_LIBRARY_PATH_VAR@) +# LIBOBJS = (@LIBOBJS@) +# LTLIBOBJS = (@LTLIBOBJS@) +# PACKAGE_BUGREPORT = (@PACKAGE_BUGREPORT@) +# PACKAGE_NAME = (@PACKAGE_NAME@) +# PACKAGE_STRING = (@PACKAGE_STRING@) +# PACKAGE_TARNAME = (@PACKAGE_TARNAME@) +# PACKAGE_VERSION = (@PACKAGE_VERSION@) +# PATH_SEPARATOR = (@PATH_SEPARATOR@) +# PKG_CFLAGS = (@PKG_CFLAGS@) +# PKG_HEADERS = (@PKG_HEADERS@) +# PKG_INCLUDES = (@PKG_INCLUDES@) +# PKG_LIBS = (@PKG_LIBS@) +# PKG_LIB_FILE = (@PKG_LIB_FILE@) +# PKG_OBJECTS = (@PKG_OBJECTS@) +# PKG_SOURCES = (@PKG_SOURCES@) +# PKG_STUB_LIB_FILE = (@PKG_STUB_LIB_FILE@) +# PKG_STUB_OBJECTS = (@PKG_STUB_OBJECTS@) +# PKG_STUB_SOURCES = (@PKG_STUB_SOURCES@) +# PKG_TCL_SOURCES = (@PKG_TCL_SOURCES@) +# RANLIB = (@RANLIB@) +# RANLIB_STUB = (@RANLIB_STUB@) +# SET_MAKE = (@SET_MAKE@) +# SHARED_BUILD = (@SHARED_BUILD@) +# SHELL = (@SHELL@) +# TCLSH_PROG = (@TCLSH_PROG@) +# TCL_BIN_DIR = (@TCL_BIN_DIR@) +# TCL_DBGX = (@TCL_DBGX@) +# TCL_DEFS = (@TCL_DEFS@) +# TCL_LIB_FILE = (@TCL_LIB_FILE@) +# TCL_LIB_FLAG = (@TCL_LIB_FLAG@) +# TCL_LIB_SPEC = (@TCL_LIB_SPEC@) +# TCL_PATCH_LEVEL = (@TCL_PATCH_LEVEL@) +# TCL_SRC_DIR = (@TCL_SRC_DIR@) +# TCL_STUB_LIB_FILE = (@TCL_STUB_LIB_FILE@) +# TCL_STUB_LIB_FLAG = (@TCL_STUB_LIB_FLAG@) +# TCL_STUB_LIB_SPEC = (@TCL_STUB_LIB_SPEC@) +# TCL_VERSION = (@TCL_VERSION@) +# VC_MANIFEST_EMBED_DLL = (@VC_MANIFEST_EMBED_DLL@) +# VC_MANIFEST_EMBED_EXE = (@VC_MANIFEST_EMBED_EXE@) + +# ac_ct_CC = (@ac_ct_CC@) +# bindir = (@bindir@) +# build_alias = (@build_alias@) +# datadir = (@datadir@) +# datarootdir = (@datarootdir@) +# docdir = (@docdir@) +# dvidir = (@dvidir@) +# exec_prefix = (@exec_prefix@) +# host_alias = (@host_alias@) +# htmldir = (@htmldir@) +# includedir = (@includedir@) +# infodir = (@infodir@) +# libdir = (@libdir@) +# libexecdir = (@libexecdir@) +# localedir = (@localedir@) +# localstatedir = (@localstatedir@) +# mandir = (@mandir@) +# oldincludedir = (@oldincludedir@) +# pdfdir = (@pdfdir@) +# prefix = (@prefix@) +# program_transform_name = (@program_transform_name@) +# psdir = (@psdir@) +# sbindir = (@sbindir@) +# sharedstatedir = (@sharedstatedir@) +# sysconfdir = (@sysconfdir@) +# target_alias = (@target_alias@) + +# # ## ### ##### ######## ############# ##################### diff --git a/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/Makefile.in b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/Makefile.in new file mode 100644 index 00000000..3173aa50 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/Makefile.in @@ -0,0 +1,145 @@ +# Makefile.in -- +# +# This file is a Makefile for "@@PNAME@@ @@PMAJORV@@.@@PMINORV@@". If this +# is "Makefile.in" then it is a template for a Makefile; to generate +# the actual Makefile, run "./configure", which is a configuration script +# generated by the "autoconf" program (constructs like "@foo@" will get +# replaced in the actual Makefile. +# +# Copyright (c) @@YEAR@@ @@PORG@@ +# +# Generated by @@CRITCL@@ +# At @@NOW@@ +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +#======================================================================== +# Nothing of the variables below this line need to be changed. Please +# check the TARGETS section below to make sure the make targets are +# correct. +#======================================================================== + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +libdir = @libdir@ +mandir = @mandir@ +bindir = @bindir@ + +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedir = @sharedstatedir@ +statedir = @localstatedir@ +includedir = @includedir@ +oldincludedir = @oldincludedir@ + +DESTDIR = +pkglibdir = $(libdir)/@PACKAGE_NAME@@PACKAGE_VERSION@ +top_builddir = . + +PACKAGE = @PACKAGE_NAME@ +VERSION = @PACKAGE_VERSION@ +CYGPATH = @CYGPATH@ + +TCLSH_PROG = @TCLSH_PROG@ +CRITCL = `$(CYGPATH) $(srcdir)/critcl/main.tcl` + +CONFIG_CLEAN_FILES = +@@API@@ +@@UCONFIG@@ +#======================================================================== +# PKG_TCL_SOURCES identifies Tcl runtime files that are associated with +# this package that need to be installed, if any. +#======================================================================== + +PKG_TCL_SOURCES = @@PFILES@@ + +#======================================================================== +# Start of user-definable TARGETS section +#======================================================================== + +all: + @echo %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + @echo Please run '"make install"' to build and install the package. + @echo Critcl has no separate build-step. + +doc: + @echo No documentation to build. + +install: + @echo %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; \ + cat $(top_builddir)/Config | grep -v '^#' ; \ + echo %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; \ + rm -rf $(top_builddir)/results-tea ; \ + $(TCLSH_PROG) $(CRITCL) \ + -I $(prefix)/include \ + -I $(exec_prefix)/include \ + -I $(includedir)@@APIUSE@@ \ + @@UCONFIGUSE@@ \ + -keep -cache $(top_builddir)/results-tea \ + -target TEA -config $(top_builddir)/Config \ + -libdir $(DESTDIR)$(libdir) \ + -includedir $(DESTDIR)$(includedir) \ + -pkg $(PACKAGE)$(VERSION) \ + $(PKG_TCL_SOURCES) ; \ + echo %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; \ + cat $(top_builddir)/results-tea/*.log + echo %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; \ + +install-auto: show-auto + @rm -rf $(top_builddir)/results-auto ; \ + $(TCLSH_PROG) $(CRITCL) \ + -I $(prefix)/include \ + -I $(exec_prefix)/include \ + -I $(includedir)@@APIUSE@@ \ + @@UCONFIGUSE@@ \ + -keep -cache $(top_builddir)/results-auto \ + -libdir $(DESTDIR)$(libdir) \ + -includedir $(DESTDIR)$(includedir) \ + -pkg $(PACKAGE)$(VERSION) \ + $(PKG_TCL_SOURCES) ; \ + echo %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; \ + cat $(top_builddir)/results-auto/*.log + echo %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; \ + +install-doc: + @echo No documentation to install. + +show: + @$(TCLSH_PROG) $(CRITCL) \ + -keep -cache $(top_builddir)/results-tea \ + -target TEA -config $(top_builddir)/Config \ + -libdir $(DESTDIR)$(libdir) \ + -pkg -show + +show-auto: + @$(TCLSH_PROG) $(CRITCL) \ + -keep -cache $(top_builddir)/results-auto \ + -libdir $(DESTDIR)$(libdir) \ + -pkg -show + +clean: + rm -rf doc *-doc + +distclean: clean + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + -rm -f config.status + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +.PHONY: all binaries clean depend distclean doc install installdirs libraries test + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/aclocal.m4 b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/aclocal.m4 new file mode 100644 index 00000000..e4db369f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/aclocal.m4 @@ -0,0 +1,180 @@ +# +# Include the TEA standard macro set +# + +builtin(include,tclconfig/tcl.m4) + +# +# Add here whatever m4 macros you want to define for your package +# + +#------------------------------------------------------------------------ +# CRITCL_TEA_PUBLIC_PACKAGE_HEADERS -- +# +# Locate the installed public FOO header files +# +# Arguments: +# Name of the package to search headers for. +# +# Requires: +# CYGPATH must be set +# +# Results: +# +# Adds a --with-[$1]-include switch to configure. +# Result is cached. +# +# Substs the following vars: +# CRITCL_API_$1_INCLUDE +#------------------------------------------------------------------------ + +AC_DEFUN([CRITCL_TEA_PUBLIC_PACKAGE_HEADERS],[ + # CRITCL_TEA_PUBLIC_PACKAGE_HEADERS: $1 + AC_MSG_CHECKING([for $1 public headers]) + AC_ARG_WITH([$1-include], [ --with-$1-include directory containing the public $1 header files], [with_$1_include=${withval}]) + AC_CACHE_VAL(ac_cv_c_$1_header, [ + # Use the value from --with-$1-include, if it was given + + if test x"[$]{with_$1_include}" != x ; then + if test -f "[$]{with_$1_include}/$1Decls.h" ; then + ac_cv_c_$1_header=[$]{with_$1_include} + else + AC_MSG_ERROR([[$]{with_$1_include} directory does not contain $1Decls.h]) + fi + else + list="" + if test "`uname -s`" = "Darwin"; then + # If $1 was built as a framework, attempt to use + # the framework's Headers directory + case [$]{$1_DEFS} in + *$1_FRAMEWORK*) + list="`ls -d [$]{$1_BIN_DIR}/Headers 2>/dev/null`" + ;; + esac + fi + + # Check order: pkg --prefix location, Tcl's --prefix location, + # relative to directory of $1Config.sh. + + eval "temp_includedir=[$]{includedir}" + list="[$]list \ + `ls -d [$]{temp_includedir} 2>/dev/null` \ + `ls -d [$]{$1_PREFIX}/include 2>/dev/null` \ + `ls -d [$]{$1_BIN_DIR}/../include 2>/dev/null` \ + `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ + `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" + + if test "[$]{TEA_PLATFORM}" != "windows" -o "[$]GCC" = "yes"; then + list="[$]list /usr/local/include /usr/include" + if test x"[$]{$1_INCLUDE_SPEC}" != x ; then + d=`echo "[$]{$1_INCLUDE_SPEC}" | sed -e 's/^-I//'` + list="[$]list `ls -d ${d} 2>/dev/null`" + fi + fi + for i in [$]list ; do + if test -f "[$]i/$1/$1Decls.h" ; then + ac_cv_c_$1_header=[$]i + break + fi + done + fi + ]) + + # Print a message based on how we determined the include path + if test x"[$]{ac_cv_c_$1_header}" = x ; then + AC_MSG_ERROR([$1Decls.h not found. Please specify its location with --with-$1-include]) + else + AC_MSG_RESULT([[$]{ac_cv_c_$1_header}]) + fi + + # Convert to a native path and substitute into the transfer variable. + # NOTE: Anything going into actual TEA would have to use A TEA_xx + # transfer variable, instead of critcl. + INCLUDE_DIR_NATIVE=`[$]{CYGPATH} [$]{ac_cv_c_$1_header}` + CRITCL_API_$1_INCLUDE="\"[$]{INCLUDE_DIR_NATIVE}\"" + AC_SUBST([CRITCL_API_$1_INCLUDE]) +]) + +#------------------------------------------------------------------------ +# CRITCL_TEA_WITH_CONFIG -- +# +# Declare a --with-FOO option, with default and legal values. +# +# Arguments: +# Name of the option. +# List of legal values. +# Default value. +# Option description. +# +# Requires: +# Results: +# Adds a --with-[$1] switch to configure. +# +# Substs the following vars: +# CRITCL_UCONFIG_$1 +#------------------------------------------------------------------------ + +AC_DEFUN([CRITCL_TEA_WITH_CONFIG],[ + # CRITCL_TEA_WITH_CONFIG: $1 + AC_ARG_WITH([$1], + AC_HELP_STRING([--with-$1], + [$4]), + [with_uc_$1=${withval}]) + + # Use default if user did not specify anything. + if test x"[$]{with_uc_$1}" = x ; then + with_uc_$1="$3" + fi + + AC_MSG_CHECKING([Validating $1]) + tcl_ok=no + for x in $2 + do + if test "[$]x" = "[$]with_uc_$1" ; then + tcl_ok=yes + break + fi + done + if test "[$]tcl_ok" = "no" ; then + AC_MSG_ERROR([Illegal value [$]with_uc_$1, expected one of: $2]) + else + AC_MSG_RESULT([[$]with_uc_$1]) + fi + + CRITCL_UCONFIG_$1="-with-$1 \"[$]with_uc_$1\"" + AC_SUBST([CRITCL_UCONFIG_$1]) +]) + +#------------------------------------------------------------------------ +# CRITCL_TEA_BOOL_CONFIG -- +# +# Declare a --disable/enable-FOO option, with default. +# +# Arguments: +# Name of the option. +# Default value. +# Option description. +# +# Requires: +# Results: +# Adds a --enable-[$1] switch to configure. +# +# Substs the following vars: +# CRITCL_UCONFIG_$1 +#------------------------------------------------------------------------ + +AC_DEFUN([CRITCL_TEA_BOOL_CONFIG],[ + # CRITCL_TEA_BOOL_CONFIG: $1 + AC_ARG_ENABLE([$1], + AC_HELP_STRING([--enable-$1],[$3]), + [bool_uc_$1=${enableval}] + [bool_uc_$1="$2"]) + + if test "bool_uc_$1" = "yes" ; then + CRITCL_UCONFIG_$1="-enable $1" + else + CRITCL_UCONFIG_$1="-disable $1" + fi + + AC_SUBST([CRITCL_UCONFIG_$1]) +]) diff --git a/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/configure.in b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/configure.in new file mode 100644 index 00000000..331b523d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/configure.in @@ -0,0 +1,151 @@ +# Configure for +# @@PNAME@@ @@PMAJORV@@.@@PMINORV@@ +# +# Copyright (c) @@YEAR@@ @@PORG@@ +# +# Generated by @@CRITCL@@ +# At @@NOW@@ + +AC_INIT([@@PNAME@@],[@@PMAJORV@@.@@PMINORV@@]) + +TEA_INIT([3.9]) + +AC_CONFIG_AUX_DIR(tclconfig) + +#-------------------------------------------------------------------- +# Configure script for package '@@PNAME@@'. +# TEA compliant. +#-------------------------------------------------------------------- + +#-------------------------------------------------------------------- +# Load the tclConfig.sh file +#-------------------------------------------------------------------- + +TEA_PATH_TCLCONFIG +TEA_LOAD_TCLCONFIG + +#----------------------------------------------------------------------- +## Std TEA setup + +TEA_PREFIX +TEA_SETUP_COMPILER +TEA_PUBLIC_TCL_HEADERS +#TEA_PRIVATE_TCL_HEADERS +TEA_ENABLE_THREADS +TEA_ENABLE_SHARED +TEA_CONFIG_CFLAGS +TEA_ENABLE_SYMBOLS +AC_DEFINE(USE_TCL_STUBS) +TEA_MAKE_LIB +TEA_PROG_TCLSH +@@API@@ +@@UCONFIG@@ +#----------------------------------------------------------------------- +## Convert the TEA settings determined by the macros in the last +## section into something critcl can use throughts configuration. + +AC_MSG_RESULT([critcl config: derived from core TEA]) + +#AC_MSG_RESULT([critcl config: CC............. ${CC}]) +#AC_MSG_RESULT([critcl config: CFLAGS......... ${CFLAGS}]) +#AC_MSG_RESULT([critcl config: SHLIB_LD....... ${SHLIB_LD}]) +#AC_MSG_RESULT([critcl config: LIBS........... ${LIBS}| +#AC_MSG_RESULT([critcl config: MATH_LIBS...... ${MATH_LIBS}]) +#AC_MSG_RESULT([critcl config: CFLAGS_DEFAULT. ${CFLAGS_DEFAULT}]) +#AC_MSG_RESULT([critcl config: CFLAGS_WARNING. ${CFLAGS_WARNING}]) +#AC_MSG_RESULT([critcl config: SHLIB_CFLAGS... ${SHLIB_CFLAGS}]) +#AC_MSG_RESULT([critcl config: LDFLAGS_DEFAULT ${LDFLAGS_DEFAULT}]) + +#----------------------------------------------------------------------- +## 1. Basic/foundational translation. + +CRITCL_CC="$(eval echo ${CC} -c ${CFLAGS})" +CRITCL_VERSION="${CC} -v" +CRITCL_LINK="$(eval echo $(eval echo ${SHLIB_LD} ${LIBS} ${MATH_LIBS}))" +CRITCL_PLATFORM="$(${TCLSH_PROG} ${srcdir}/critcl/main.tcl -showtarget)" +CRITCL_LD_DBG="" +CRITCL_LD_REL="" +CRITCL_CC_OUTPUT="-o [[list \$outfile]]" +CRITCL_LD_OUTPUT="" + +if test "${GCC}" = "yes" +then + CRITCL_CPP_DEFINE="${CPP} -dM" +else + CRITCL_CPP_DEFINE="${CPP}" + + if test "${TEA_PLATFORM}" = "windows" + then + # windows, no gcc => msvc + CRITCL_CC_OUTPUT="[[list -Fo\$outfile]]" + CRITCL_LD_OUTPUT="-dll [[list -out:\$outfile]]" + CRITCL_LD_DBG="-debug:full -debugtype:cv -verbose:lib" + CRITCL_LD_REL="-release -opt:ref -opt:icf,3 -ws:aggressive -verbose:lib" + if test "$do64bit" = "no" ; then + # 32bit + CRITCL_LD_DBG="$CRITCL_LD_DBG -nodefaultlib:libc" + fi + fi +fi +CRITCL_CPP_ENUM="${CPP}" + +#----------------------------------------------------------------------- +## 2. Fine tuning the commands, this now is platform specific. + +case $(uname -s) in +Darwin*) + AC_MSG_RESULT([critcl config: darwin specific tune-up]) + + # - Critcl, due to essentially generating its private + # lib{tcl,tk}stub.a does generate common symbols for the + # stubs tables. Use of -fno-common then prevents linking the + # object files. + # + # - A version 0.0 as pulled from TEA package version is not + # liked by the Darwin gcc either (Example: crimp). + + CRITCL_CC="$(echo "$CRITCL_CC" |sed -e 's,-fno-common,,g')" + CRITCL_LINK="$(echo "$CRITCL_LINK"|sed -e 's,-fno-common,,g')" + CRITCL_LINK="$(echo "$CRITCL_LINK"|sed -e 's,-current_version 0\.0,,g')" + CRITCL_LINK="$(echo "$CRITCL_LINK"|sed -e 's,-compatibility_version 0\.0,,g')" + ;; +*) + ;; +esac + +#----------------------------------------------------------------------- +## Conversion results + +AC_MSG_RESULT([critcl config: platform.......... $CRITCL_PLATFORM]) +AC_MSG_RESULT([critcl config: compile........... $CRITCL_CC]) +AC_MSG_RESULT([critcl config: link.............. $CRITCL_LINK]) +AC_MSG_RESULT([critcl config: cpp define........ $CRITCL_CPP_DEFINE]) +AC_MSG_RESULT([critcl config: cpp enum.......... $CRITCL_CPP_ENUM]) +AC_MSG_RESULT([critcl config: version inquiry... $CRITCL_VERSION]) +AC_MSG_RESULT([critcl config: cc output......... $CRITCL_CC_OUTPUT]) +AC_MSG_RESULT([critcl config: ld output......... $CRITCL_LD_OUTPUT]) +AC_MSG_RESULT([critcl config: ld debug.......... $CRITCL_LD_DBG]) +AC_MSG_RESULT([critcl config: ld release........ $CRITCL_LD_REL]) + +#----------------------------------------------------------------------- + +AC_SUBST(CRITCL_CC) +AC_SUBST(CRITCL_VERSION) +AC_SUBST(CRITCL_LINK) +AC_SUBST(CRITCL_PLATFORM) +AC_SUBST(CRITCL_CPP_DEFINE) +AC_SUBST(CRITCL_CPP_ENUM) +AC_SUBST(CRITCL_CC_OUTPUT) +AC_SUBST(CRITCL_LD_OUTPUT) +AC_SUBST(CRITCL_LD_DBG) +AC_SUBST(CRITCL_LD_REL) +#AC_SUBST(CRITCL_) +#AC_SUBST() + +#-------------------------------------------------------------------- +# Finally, substitute all of the various values into the Makefile. +# You may alternatively have a special pkgIndex.tcl.in or other files +# which require substituting th AC variables in. Include these here. +#-------------------------------------------------------------------- + +AC_OUTPUT([Makefile Config]) diff --git a/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/tclconfig/README.txt b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/tclconfig/README.txt new file mode 100644 index 00000000..59b5a3e8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/tclconfig/README.txt @@ -0,0 +1,26 @@ +These files comprise the basic building blocks for a Tcl Extension +Architecture (TEA) extension. For more information on TEA see: + + http://www.tcl.tk/doc/tea/ + +This package is part of the Tcl project at SourceForge, and latest +sources should be available there: + + http://tcl.sourceforge.net/ + +This package is a freely available open source package. You can do +virtually anything you like with it, such as modifying it, redistributing +it, and selling it either in whole or in part. + +CONTENTS +======== +The following is a short description of the files you will find in +the sample extension. + +README.txt This file + +install-sh Program used for copying binaries and script files + to their install locations. + +tcl.m4 Collection of Tcl autoconf macros. Included by a package's + aclocal.m4 to define TEA_* macros. diff --git a/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/tclconfig/install-sh b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/tclconfig/install-sh new file mode 100644 index 00000000..0ff4b6a0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/tclconfig/install-sh @@ -0,0 +1,119 @@ +#!/bin/sh + +# +# install - install a program, script, or datafile +# This comes from X11R5; it is not part of GNU. +# +# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $ +# +# This script is compatible with the BSD install script, but was written +# from scratch. +# + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" + +instcmd="$mvprog" +chmodcmd="" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +fi + +if [ x"$dst" = x ] +then + echo "install: no destination specified" + exit 1 +fi + + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + +if [ -d $dst ] +then + dst="$dst"/`basename $src` +fi + +# Make a temp file name in the proper directory. + +dstdir=`dirname $dst` +dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + +$doit $instcmd $src $dsttmp + +# and set any options; do chmod last to preserve setuid bits + +if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; fi +if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; fi +if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; fi +if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; fi + +# Now rename the file to the real destination. + +$doit $rmcmd $dst +$doit $mvcmd $dsttmp $dst + + +exit 0 diff --git a/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/tclconfig/tcl.m4 b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/tclconfig/tcl.m4 new file mode 100644 index 00000000..1d7a7980 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-app3.2/tea/tclconfig/tcl.m4 @@ -0,0 +1,4033 @@ +# tcl.m4 -- +# +# This file provides a set of autoconf macros to help TEA-enable +# a Tcl extension. +# +# Copyright (c) 1999-2000 Ajuba Solutions. +# Copyright (c) 2002-2005 ActiveState Corporation. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# RCS: @(#) $Id: tcl.m4,v 1.10 2010/12/08 21:44:56 andreas_kupries Exp $ + +AC_PREREQ(2.57) + +dnl TEA extensions pass us the version of TEA they think they +dnl are compatible with (must be set in TEA_INIT below) +dnl TEA_VERSION="3.9" + +# Possible values for key variables defined: +# +# TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') +# TEA_PLATFORM - windows unix +# + +#------------------------------------------------------------------------ +# TEA_PATH_TCLCONFIG -- +# +# Locate the tclConfig.sh file and perform a sanity check on +# the Tcl compile flags +# +# Arguments: +# none +# +# Results: +# +# Adds the following arguments to configure: +# --with-tcl=... +# +# Defines the following vars: +# TCL_BIN_DIR Full path to the directory containing +# the tclConfig.sh file +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_PATH_TCLCONFIG], [ + dnl TEA specific: Make sure we are initialized + AC_REQUIRE([TEA_INIT]) + # + # Ok, lets find the tcl configuration + # First, look for one uninstalled. + # the alternative search directory is invoked by --with-tcl + # + + if test x"${no_tcl}" = x ; then + # we reset no_tcl in case something fails here + no_tcl=true + AC_ARG_WITH(tcl, + AC_HELP_STRING([--with-tcl], + [directory containing tcl configuration (tclConfig.sh)]), + with_tclconfig="${withval}") + AC_MSG_CHECKING([for Tcl configuration]) + AC_CACHE_VAL(ac_cv_c_tclconfig,[ + + # First check to see if --with-tcl was specified. + if test x"${with_tclconfig}" != x ; then + case "${with_tclconfig}" in + */tclConfig.sh ) + if test -f "${with_tclconfig}"; then + AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) + with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" + fi ;; + esac + if test -f "${with_tclconfig}/tclConfig.sh" ; then + ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" + else + AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) + fi + fi + + # then check for a private Tcl installation + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in \ + ../tcl \ + `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../tcl \ + `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../../tcl \ + `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do + if test "${TEA_PLATFORM}" = "windows" \ + -a -f "$i/win/tclConfig.sh" ; then + ac_cv_c_tclconfig="`(cd $i/win; pwd)`" + break + fi + if test -f "$i/unix/tclConfig.sh" ; then + ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" + break + fi + done + fi + + # on Darwin, check in Framework installation locations + if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then + for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ + `ls -d /Library/Frameworks 2>/dev/null` \ + `ls -d /Network/Library/Frameworks 2>/dev/null` \ + `ls -d /System/Library/Frameworks 2>/dev/null` \ + ; do + if test -f "$i/Tcl.framework/tclConfig.sh" ; then + ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" + break + fi + done + fi + + # TEA specific: on Windows, check in common installation locations + if test "${TEA_PLATFORM}" = "windows" \ + -a x"${ac_cv_c_tclconfig}" = x ; then + for i in `ls -d C:/Tcl/lib 2>/dev/null` \ + `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ + ; do + if test -f "$i/tclConfig.sh" ; then + ac_cv_c_tclconfig="`(cd $i; pwd)`" + break + fi + done + fi + + # check in a few common install locations + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in `ls -d ${libdir} 2>/dev/null` \ + `ls -d ${exec_prefix}/lib 2>/dev/null` \ + `ls -d ${prefix}/lib 2>/dev/null` \ + `ls -d /usr/local/lib 2>/dev/null` \ + `ls -d /usr/contrib/lib 2>/dev/null` \ + `ls -d /usr/lib 2>/dev/null` \ + `ls -d /usr/lib64 2>/dev/null` \ + ; do + if test -f "$i/tclConfig.sh" ; then + ac_cv_c_tclconfig="`(cd $i; pwd)`" + break + fi + done + fi + + # check in a few other private locations + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in \ + ${srcdir}/../tcl \ + `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do + if test "${TEA_PLATFORM}" = "windows" \ + -a -f "$i/win/tclConfig.sh" ; then + ac_cv_c_tclconfig="`(cd $i/win; pwd)`" + break + fi + if test -f "$i/unix/tclConfig.sh" ; then + ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" + break + fi + done + fi + ]) + + if test x"${ac_cv_c_tclconfig}" = x ; then + TCL_BIN_DIR="# no Tcl configs found" + AC_MSG_ERROR([Can't find Tcl configuration definitions]) + else + no_tcl= + TCL_BIN_DIR="${ac_cv_c_tclconfig}" + AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) + fi + fi +]) + +#------------------------------------------------------------------------ +# TEA_PATH_TKCONFIG -- +# +# Locate the tkConfig.sh file +# +# Arguments: +# none +# +# Results: +# +# Adds the following arguments to configure: +# --with-tk=... +# +# Defines the following vars: +# TK_BIN_DIR Full path to the directory containing +# the tkConfig.sh file +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_PATH_TKCONFIG], [ + # + # Ok, lets find the tk configuration + # First, look for one uninstalled. + # the alternative search directory is invoked by --with-tk + # + + if test x"${no_tk}" = x ; then + # we reset no_tk in case something fails here + no_tk=true + AC_ARG_WITH(tk, + AC_HELP_STRING([--with-tk], + [directory containing tk configuration (tkConfig.sh)]), + with_tkconfig="${withval}") + AC_MSG_CHECKING([for Tk configuration]) + AC_CACHE_VAL(ac_cv_c_tkconfig,[ + + # First check to see if --with-tkconfig was specified. + if test x"${with_tkconfig}" != x ; then + case "${with_tkconfig}" in + */tkConfig.sh ) + if test -f "${with_tkconfig}"; then + AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) + with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" + fi ;; + esac + if test -f "${with_tkconfig}/tkConfig.sh" ; then + ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" + else + AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) + fi + fi + + # then check for a private Tk library + if test x"${ac_cv_c_tkconfig}" = x ; then + for i in \ + ../tk \ + `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../tk \ + `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../../tk \ + `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do + if test "${TEA_PLATFORM}" = "windows" \ + -a -f "$i/win/tkConfig.sh" ; then + ac_cv_c_tkconfig="`(cd $i/win; pwd)`" + break + fi + if test -f "$i/unix/tkConfig.sh" ; then + ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" + break + fi + done + fi + + # on Darwin, check in Framework installation locations + if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then + for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ + `ls -d /Library/Frameworks 2>/dev/null` \ + `ls -d /Network/Library/Frameworks 2>/dev/null` \ + `ls -d /System/Library/Frameworks 2>/dev/null` \ + ; do + if test -f "$i/Tk.framework/tkConfig.sh" ; then + ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" + break + fi + done + fi + + # check in a few common install locations + if test x"${ac_cv_c_tkconfig}" = x ; then + for i in `ls -d ${libdir} 2>/dev/null` \ + `ls -d ${exec_prefix}/lib 2>/dev/null` \ + `ls -d ${prefix}/lib 2>/dev/null` \ + `ls -d /usr/local/lib 2>/dev/null` \ + `ls -d /usr/contrib/lib 2>/dev/null` \ + `ls -d /usr/lib 2>/dev/null` \ + `ls -d /usr/lib64 2>/dev/null` \ + ; do + if test -f "$i/tkConfig.sh" ; then + ac_cv_c_tkconfig="`(cd $i; pwd)`" + break + fi + done + fi + + # TEA specific: on Windows, check in common installation locations + if test "${TEA_PLATFORM}" = "windows" \ + -a x"${ac_cv_c_tkconfig}" = x ; then + for i in `ls -d C:/Tcl/lib 2>/dev/null` \ + `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ + ; do + if test -f "$i/tkConfig.sh" ; then + ac_cv_c_tkconfig="`(cd $i; pwd)`" + break + fi + done + fi + + # check in a few other private locations + if test x"${ac_cv_c_tkconfig}" = x ; then + for i in \ + ${srcdir}/../tk \ + `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do + if test "${TEA_PLATFORM}" = "windows" \ + -a -f "$i/win/tkConfig.sh" ; then + ac_cv_c_tkconfig="`(cd $i/win; pwd)`" + break + fi + if test -f "$i/unix/tkConfig.sh" ; then + ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" + break + fi + done + fi + ]) + + if test x"${ac_cv_c_tkconfig}" = x ; then + TK_BIN_DIR="# no Tk configs found" + AC_MSG_ERROR([Can't find Tk configuration definitions]) + else + no_tk= + TK_BIN_DIR="${ac_cv_c_tkconfig}" + AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) + fi + fi +]) + +#------------------------------------------------------------------------ +# TEA_LOAD_TCLCONFIG -- +# +# Load the tclConfig.sh file +# +# Arguments: +# +# Requires the following vars to be set: +# TCL_BIN_DIR +# +# Results: +# +# Subst the following vars: +# TCL_BIN_DIR +# TCL_SRC_DIR +# TCL_LIB_FILE +# +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_LOAD_TCLCONFIG], [ + AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) + + if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then + AC_MSG_RESULT([loading]) + . "${TCL_BIN_DIR}/tclConfig.sh" + else + AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) + fi + + # eval is required to do the TCL_DBGX substitution + eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" + eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" + + # If the TCL_BIN_DIR is the build directory (not the install directory), + # then set the common variable name to the value of the build variables. + # For example, the variable TCL_LIB_SPEC will be set to the value + # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC + # instead of TCL_BUILD_LIB_SPEC since it will work with both an + # installed and uninstalled version of Tcl. + if test -f "${TCL_BIN_DIR}/Makefile" ; then + TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" + TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" + TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" + elif test "`uname -s`" = "Darwin"; then + # If Tcl was built as a framework, attempt to use the libraries + # from the framework at the given location so that linking works + # against Tcl.framework installed in an arbitrary location. + case ${TCL_DEFS} in + *TCL_FRAMEWORK*) + if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then + for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ + "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do + if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then + TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" + break + fi + done + fi + if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then + TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" + TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" + fi + ;; + esac + fi + + # eval is required to do the TCL_DBGX substitution + eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" + eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" + eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" + eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" + + AC_SUBST(TCL_VERSION) + AC_SUBST(TCL_PATCH_LEVEL) + AC_SUBST(TCL_BIN_DIR) + AC_SUBST(TCL_SRC_DIR) + + AC_SUBST(TCL_LIB_FILE) + AC_SUBST(TCL_LIB_FLAG) + AC_SUBST(TCL_LIB_SPEC) + + AC_SUBST(TCL_STUB_LIB_FILE) + AC_SUBST(TCL_STUB_LIB_FLAG) + AC_SUBST(TCL_STUB_LIB_SPEC) + + case "`uname -s`" in + *CYGWIN_*) + AC_MSG_CHECKING([for cygwin variant]) + case ${TCL_EXTRA_CFLAGS} in + *-mwin32*|*-mno-cygwin*) + TEA_PLATFORM="windows" + CFLAGS="$CFLAGS -mwin32" + AC_MSG_RESULT([win32]) + ;; + *) + TEA_PLATFORM="unix" + AC_MSG_RESULT([unix]) + ;; + esac + EXEEXT=".exe" + ;; + *) + ;; + esac + + # The BUILD_$pkg is to define the correct extern storage class + # handling when making this package + AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], + [Building extension source?]) + # Do this here as we have fully defined TEA_PLATFORM now + if test "${TEA_PLATFORM}" = "windows" ; then + CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" + fi + + # TEA specific: + AC_SUBST(CLEANFILES) + AC_SUBST(TCL_LIBS) + AC_SUBST(TCL_DEFS) + AC_SUBST(TCL_EXTRA_CFLAGS) + AC_SUBST(TCL_LD_FLAGS) + AC_SUBST(TCL_SHLIB_LD_LIBS) +]) + +#------------------------------------------------------------------------ +# TEA_LOAD_TKCONFIG -- +# +# Load the tkConfig.sh file +# +# Arguments: +# +# Requires the following vars to be set: +# TK_BIN_DIR +# +# Results: +# +# Sets the following vars that should be in tkConfig.sh: +# TK_BIN_DIR +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_LOAD_TKCONFIG], [ + AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) + + if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then + AC_MSG_RESULT([loading]) + . "${TK_BIN_DIR}/tkConfig.sh" + else + AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) + fi + + # eval is required to do the TK_DBGX substitution + eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" + eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" + + # If the TK_BIN_DIR is the build directory (not the install directory), + # then set the common variable name to the value of the build variables. + # For example, the variable TK_LIB_SPEC will be set to the value + # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC + # instead of TK_BUILD_LIB_SPEC since it will work with both an + # installed and uninstalled version of Tcl. + if test -f "${TK_BIN_DIR}/Makefile" ; then + TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" + TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" + TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" + elif test "`uname -s`" = "Darwin"; then + # If Tk was built as a framework, attempt to use the libraries + # from the framework at the given location so that linking works + # against Tk.framework installed in an arbitrary location. + case ${TK_DEFS} in + *TK_FRAMEWORK*) + if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then + for i in "`cd "${TK_BIN_DIR}"; pwd`" \ + "`cd "${TK_BIN_DIR}"/../..; pwd`"; do + if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then + TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" + break + fi + done + fi + if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then + TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" + TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" + fi + ;; + esac + fi + + # eval is required to do the TK_DBGX substitution + eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" + eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" + eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" + eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" + + # TEA specific: Ensure windowingsystem is defined + if test "${TEA_PLATFORM}" = "unix" ; then + case ${TK_DEFS} in + *MAC_OSX_TK*) + AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) + TEA_WINDOWINGSYSTEM="aqua" + ;; + *) + TEA_WINDOWINGSYSTEM="x11" + ;; + esac + elif test "${TEA_PLATFORM}" = "windows" ; then + TEA_WINDOWINGSYSTEM="win32" + fi + + AC_SUBST(TK_VERSION) + AC_SUBST(TK_BIN_DIR) + AC_SUBST(TK_SRC_DIR) + + AC_SUBST(TK_LIB_FILE) + AC_SUBST(TK_LIB_FLAG) + AC_SUBST(TK_LIB_SPEC) + + AC_SUBST(TK_STUB_LIB_FILE) + AC_SUBST(TK_STUB_LIB_FLAG) + AC_SUBST(TK_STUB_LIB_SPEC) + + # TEA specific: + AC_SUBST(TK_LIBS) + AC_SUBST(TK_XINCLUDES) +]) + +#------------------------------------------------------------------------ +# TEA_PROG_TCLSH +# Determine the fully qualified path name of the tclsh executable +# in the Tcl build directory or the tclsh installed in a bin +# directory. This macro will correctly determine the name +# of the tclsh executable even if tclsh has not yet been +# built in the build directory. The tclsh found is always +# associated with a tclConfig.sh file. This tclsh should be used +# only for running extension test cases. It should never be +# or generation of files (like pkgIndex.tcl) at build time. +# +# Arguments +# none +# +# Results +# Subst's the following values: +# TCLSH_PROG +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_PROG_TCLSH], [ + AC_MSG_CHECKING([for tclsh]) + if test -f "${TCL_BIN_DIR}/Makefile" ; then + # tclConfig.sh is in Tcl build directory + if test "${TEA_PLATFORM}" = "windows"; then + TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" + else + TCLSH_PROG="${TCL_BIN_DIR}/tclsh" + fi + else + # tclConfig.sh is in install location + if test "${TEA_PLATFORM}" = "windows"; then + TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" + else + TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" + fi + list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ + `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ + `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" + for i in $list ; do + if test -f "$i/${TCLSH_PROG}" ; then + REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" + break + fi + done + TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" + fi + AC_MSG_RESULT([${TCLSH_PROG}]) + AC_SUBST(TCLSH_PROG) +]) + +#------------------------------------------------------------------------ +# TEA_PROG_WISH +# Determine the fully qualified path name of the wish executable +# in the Tk build directory or the wish installed in a bin +# directory. This macro will correctly determine the name +# of the wish executable even if wish has not yet been +# built in the build directory. The wish found is always +# associated with a tkConfig.sh file. This wish should be used +# only for running extension test cases. It should never be +# or generation of files (like pkgIndex.tcl) at build time. +# +# Arguments +# none +# +# Results +# Subst's the following values: +# WISH_PROG +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_PROG_WISH], [ + AC_MSG_CHECKING([for wish]) + if test -f "${TK_BIN_DIR}/Makefile" ; then + # tkConfig.sh is in Tk build directory + if test "${TEA_PLATFORM}" = "windows"; then + WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" + else + WISH_PROG="${TK_BIN_DIR}/wish" + fi + else + # tkConfig.sh is in install location + if test "${TEA_PLATFORM}" = "windows"; then + WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" + else + WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" + fi + list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ + `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ + `ls -d ${TK_PREFIX}/bin 2>/dev/null`" + for i in $list ; do + if test -f "$i/${WISH_PROG}" ; then + REAL_TK_BIN_DIR="`cd "$i"; pwd`/" + break + fi + done + WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" + fi + AC_MSG_RESULT([${WISH_PROG}]) + AC_SUBST(WISH_PROG) +]) + +#------------------------------------------------------------------------ +# TEA_ENABLE_SHARED -- +# +# Allows the building of shared libraries +# +# Arguments: +# none +# +# Results: +# +# Adds the following arguments to configure: +# --enable-shared=yes|no +# +# Defines the following vars: +# STATIC_BUILD Used for building import/export libraries +# on Windows. +# +# Sets the following vars: +# SHARED_BUILD Value of 1 or 0 +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_ENABLE_SHARED], [ + AC_MSG_CHECKING([how to build libraries]) + AC_ARG_ENABLE(shared, + AC_HELP_STRING([--enable-shared], + [build and link with shared libraries (default: on)]), + [tcl_ok=$enableval], [tcl_ok=yes]) + + if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + tcl_ok=$enableval + else + tcl_ok=yes + fi + + if test "$tcl_ok" = "yes" ; then + AC_MSG_RESULT([shared]) + SHARED_BUILD=1 + else + AC_MSG_RESULT([static]) + SHARED_BUILD=0 + AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) + fi + AC_SUBST(SHARED_BUILD) +]) + +#------------------------------------------------------------------------ +# TEA_ENABLE_THREADS -- +# +# Specify if thread support should be enabled. If "yes" is specified +# as an arg (optional), threads are enabled by default, "no" means +# threads are disabled. "yes" is the default. +# +# TCL_THREADS is checked so that if you are compiling an extension +# against a threaded core, your extension must be compiled threaded +# as well. +# +# Note that it is legal to have a thread enabled extension run in a +# threaded or non-threaded Tcl core, but a non-threaded extension may +# only run in a non-threaded Tcl core. +# +# Arguments: +# none +# +# Results: +# +# Adds the following arguments to configure: +# --enable-threads +# +# Sets the following vars: +# THREADS_LIBS Thread library(s) +# +# Defines the following vars: +# TCL_THREADS +# _REENTRANT +# _THREAD_SAFE +# +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_ENABLE_THREADS], [ + AC_ARG_ENABLE(threads, + AC_HELP_STRING([--enable-threads], + [build with threads]), + [tcl_ok=$enableval], [tcl_ok=yes]) + + if test "${enable_threads+set}" = set; then + enableval="$enable_threads" + tcl_ok=$enableval + else + tcl_ok=yes + fi + + if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then + TCL_THREADS=1 + + if test "${TEA_PLATFORM}" != "windows" ; then + # We are always OK on Windows, so check what this platform wants: + + # USE_THREAD_ALLOC tells us to try the special thread-based + # allocator that significantly reduces lock contention + AC_DEFINE(USE_THREAD_ALLOC, 1, + [Do we want to use the threaded memory allocator?]) + AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) + if test "`uname -s`" = "SunOS" ; then + AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, + [Do we really want to follow the standard? Yes we do!]) + fi + AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) + AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) + if test "$tcl_ok" = "no"; then + # Check a little harder for __pthread_mutex_init in the same + # library, as some systems hide it there until pthread.h is + # defined. We could alternatively do an AC_TRY_COMPILE with + # pthread.h, but that will work with libpthread really doesn't + # exist, like AIX 4.2. [Bug: 4359] + AC_CHECK_LIB(pthread, __pthread_mutex_init, + tcl_ok=yes, tcl_ok=no) + fi + + if test "$tcl_ok" = "yes"; then + # The space is needed + THREADS_LIBS=" -lpthread" + else + AC_CHECK_LIB(pthreads, pthread_mutex_init, + tcl_ok=yes, tcl_ok=no) + if test "$tcl_ok" = "yes"; then + # The space is needed + THREADS_LIBS=" -lpthreads" + else + AC_CHECK_LIB(c, pthread_mutex_init, + tcl_ok=yes, tcl_ok=no) + if test "$tcl_ok" = "no"; then + AC_CHECK_LIB(c_r, pthread_mutex_init, + tcl_ok=yes, tcl_ok=no) + if test "$tcl_ok" = "yes"; then + # The space is needed + THREADS_LIBS=" -pthread" + else + TCL_THREADS=0 + AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) + fi + fi + fi + fi + fi + else + TCL_THREADS=0 + fi + # Do checking message here to not mess up interleaved configure output + AC_MSG_CHECKING([for building with threads]) + if test "${TCL_THREADS}" = 1; then + AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) + AC_MSG_RESULT([yes (default)]) + else + AC_MSG_RESULT([no]) + fi + # TCL_THREADS sanity checking. See if our request for building with + # threads is the same as the way Tcl was built. If not, warn the user. + case ${TCL_DEFS} in + *THREADS=1*) + if test "${TCL_THREADS}" = "0"; then + AC_MSG_WARN([ + Building ${PACKAGE_NAME} without threads enabled, but building against Tcl + that IS thread-enabled. It is recommended to use --enable-threads.]) + fi + ;; + *) + if test "${TCL_THREADS}" = "1"; then + AC_MSG_WARN([ + --enable-threads requested, but building against a Tcl that is NOT + thread-enabled. This is an OK configuration that will also run in + a thread-enabled core.]) + fi + ;; + esac + AC_SUBST(TCL_THREADS) +]) + +#------------------------------------------------------------------------ +# TEA_ENABLE_SYMBOLS -- +# +# Specify if debugging symbols should be used. +# Memory (TCL_MEM_DEBUG) debugging can also be enabled. +# +# Arguments: +# none +# +# TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives +# the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. +# Requires the following vars to be set in the Makefile: +# CFLAGS_DEFAULT +# LDFLAGS_DEFAULT +# +# Results: +# +# Adds the following arguments to configure: +# --enable-symbols +# +# Defines the following vars: +# CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true +# Sets to $(CFLAGS_OPTIMIZE) if false +# LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true +# Sets to $(LDFLAGS_OPTIMIZE) if false +# DBGX Formerly used as debug library extension; +# always blank now. +# +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_ENABLE_SYMBOLS], [ + dnl TEA specific: Make sure we are initialized + AC_REQUIRE([TEA_CONFIG_CFLAGS]) + AC_MSG_CHECKING([for build with symbols]) + AC_ARG_ENABLE(symbols, + AC_HELP_STRING([--enable-symbols], + [build with debugging symbols (default: off)]), + [tcl_ok=$enableval], [tcl_ok=no]) + DBGX="" + if test "$tcl_ok" = "no"; then + CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE}" + LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" + AC_MSG_RESULT([no]) + else + CFLAGS_DEFAULT="${CFLAGS_DEBUG}" + LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" + if test "$tcl_ok" = "yes"; then + AC_MSG_RESULT([yes (standard debugging)]) + fi + fi + # TEA specific: + if test "${TEA_PLATFORM}" != "windows" ; then + LDFLAGS_DEFAULT="${LDFLAGS}" + fi + AC_SUBST(CFLAGS_DEFAULT) + AC_SUBST(LDFLAGS_DEFAULT) + AC_SUBST(TCL_DBGX) + + if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then + AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) + fi + + if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then + if test "$tcl_ok" = "all"; then + AC_MSG_RESULT([enabled symbols mem debugging]) + else + AC_MSG_RESULT([enabled $tcl_ok debugging]) + fi + fi +]) + +#------------------------------------------------------------------------ +# TEA_ENABLE_LANGINFO -- +# +# Allows use of modern nl_langinfo check for better l10n. +# This is only relevant for Unix. +# +# Arguments: +# none +# +# Results: +# +# Adds the following arguments to configure: +# --enable-langinfo=yes|no (default is yes) +# +# Defines the following vars: +# HAVE_LANGINFO Triggers use of nl_langinfo if defined. +# +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_ENABLE_LANGINFO], [ + AC_ARG_ENABLE(langinfo, + AC_HELP_STRING([--enable-langinfo], + [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), + [langinfo_ok=$enableval], [langinfo_ok=yes]) + + HAVE_LANGINFO=0 + if test "$langinfo_ok" = "yes"; then + AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) + fi + AC_MSG_CHECKING([whether to use nl_langinfo]) + if test "$langinfo_ok" = "yes"; then + AC_CACHE_VAL(tcl_cv_langinfo_h, [ + AC_TRY_COMPILE([#include ], [nl_langinfo(CODESET);], + [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) + AC_MSG_RESULT([$tcl_cv_langinfo_h]) + if test $tcl_cv_langinfo_h = yes; then + AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) + fi + else + AC_MSG_RESULT([$langinfo_ok]) + fi +]) + +#-------------------------------------------------------------------- +# TEA_CONFIG_SYSTEM +# +# Determine what the system is (some things cannot be easily checked +# on a feature-driven basis, alas). This can usually be done via the +# "uname" command. +# +# Arguments: +# none +# +# Results: +# Defines the following var: +# +# system - System/platform/version identification code. +# +#-------------------------------------------------------------------- + +AC_DEFUN([TEA_CONFIG_SYSTEM], [ + AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ + # TEA specific: + if test "${TEA_PLATFORM}" = "windows" ; then + tcl_cv_sys_version=windows + else + tcl_cv_sys_version=`uname -s`-`uname -r` + if test "$?" -ne 0 ; then + AC_MSG_WARN([can't find uname command]) + tcl_cv_sys_version=unknown + else + if test "`uname -s`" = "AIX" ; then + tcl_cv_sys_version=AIX-`uname -v`.`uname -r` + fi + fi + fi + ]) + system=$tcl_cv_sys_version +]) + +#-------------------------------------------------------------------- +# TEA_CONFIG_CFLAGS +# +# Try to determine the proper flags to pass to the compiler +# for building shared libraries and other such nonsense. +# +# Arguments: +# none +# +# Results: +# +# Defines and substitutes the following vars: +# +# DL_OBJS, DL_LIBS - removed for TEA, only needed by core. +# LDFLAGS - Flags to pass to the compiler when linking object +# files into an executable application binary such +# as tclsh. +# LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", +# that tell the run-time dynamic linker where to look +# for shared libraries such as libtcl.so. Depends on +# the variable LIB_RUNTIME_DIR in the Makefile. Could +# be the same as CC_SEARCH_FLAGS if ${CC} is used to link. +# CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", +# that tell the run-time dynamic linker where to look +# for shared libraries such as libtcl.so. Depends on +# the variable LIB_RUNTIME_DIR in the Makefile. +# SHLIB_CFLAGS - Flags to pass to cc when compiling the components +# of a shared library (may request position-independent +# code, among other things). +# SHLIB_LD - Base command to use for combining object files +# into a shared library. +# SHLIB_LD_LIBS - Dependent libraries for the linker to scan when +# creating shared libraries. This symbol typically +# goes at the end of the "ld" commands that build +# shared libraries. The value of the symbol defaults to +# "${LIBS}" if all of the dependent libraries should +# be specified when creating a shared library. If +# dependent libraries should not be specified (as on +# SunOS 4.x, where they cause the link to fail, or in +# general if Tcl and Tk aren't themselves shared +# libraries), then this symbol has an empty string +# as its value. +# SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable +# extensions. An empty string means we don't know how +# to use shared libraries on this platform. +# LIB_SUFFIX - Specifies everything that comes after the "libfoo" +# in a static or shared library name, using the $VERSION variable +# to put the version in the right place. This is used +# by platforms that need non-standard library names. +# Examples: ${VERSION}.so.1.1 on NetBSD, since it needs +# to have a version after the .so, and ${VERSION}.a +# on AIX, since a shared library needs to have +# a .a extension whereas shared objects for loadable +# extensions have a .so extension. Defaults to +# ${VERSION}${SHLIB_SUFFIX}. +# CFLAGS_DEBUG - +# Flags used when running the compiler in debug mode +# CFLAGS_OPTIMIZE - +# Flags used when running the compiler in optimize mode +# CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) +# +#-------------------------------------------------------------------- + +AC_DEFUN([TEA_CONFIG_CFLAGS], [ + dnl TEA specific: Make sure we are initialized + AC_REQUIRE([TEA_INIT]) + + # Step 0.a: Enable 64 bit support? + + AC_MSG_CHECKING([if 64bit support is requested]) + AC_ARG_ENABLE(64bit, + AC_HELP_STRING([--enable-64bit], + [enable 64bit support (default: off)]), + [do64bit=$enableval], [do64bit=no]) + AC_MSG_RESULT([$do64bit]) + + # Step 0.b: Enable Solaris 64 bit VIS support? + + AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) + AC_ARG_ENABLE(64bit-vis, + AC_HELP_STRING([--enable-64bit-vis], + [enable 64bit Sparc VIS support (default: off)]), + [do64bitVIS=$enableval], [do64bitVIS=no]) + AC_MSG_RESULT([$do64bitVIS]) + # Force 64bit on with VIS + AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) + + # Step 0.c: Check if visibility support is available. Do this here so + # that platform specific alternatives can be used below if this fails. + + AC_CACHE_CHECK([if compiler supports visibility "hidden"], + tcl_cv_cc_visibility_hidden, [ + hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" + AC_TRY_LINK([ + extern __attribute__((__visibility__("hidden"))) void f(void); + void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, + tcl_cv_cc_visibility_hidden=no) + CFLAGS=$hold_cflags]) + AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ + AC_DEFINE(MODULE_SCOPE, + [extern __attribute__((__visibility__("hidden")))], + [Compiler support for module scope symbols]) + ]) + + # Step 0.d: Disable -rpath support? + + AC_MSG_CHECKING([if rpath support is requested]) + AC_ARG_ENABLE(rpath, + AC_HELP_STRING([--disable-rpath], + [disable rpath support (default: on)]), + [doRpath=$enableval], [doRpath=yes]) + AC_MSG_RESULT([$doRpath]) + + # TEA specific: Cross-compiling options for Windows/CE builds? + + AS_IF([test "${TEA_PLATFORM}" = windows], [ + AC_MSG_CHECKING([if Windows/CE build is requested]) + AC_ARG_ENABLE(wince, + AC_HELP_STRING([--enable-wince], + [enable Win/CE support (where applicable)]), + [doWince=$enableval], [doWince=no]) + AC_MSG_RESULT([$doWince]) + ]) + + # Set the variable "system" to hold the name and version number + # for the system. + + TEA_CONFIG_SYSTEM + + # Require ranlib early so we can override it in special cases below. + + AC_REQUIRE([AC_PROG_RANLIB]) + + # Set configuration options based on system name and version. + # This is similar to Tcl's unix/tcl.m4 except that we've added a + # "windows" case and removed some core-only vars. + + do64bit_ok=no + # default to '{$LIBS}' and set to "" on per-platform necessary basis + SHLIB_LD_LIBS='${LIBS}' + # When ld needs options to work in 64-bit mode, put them in + # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] + # is disabled by the user. [Bug 1016796] + LDFLAGS_ARCH="" + UNSHARED_LIB_SUFFIX="" + # TEA specific: use PACKAGE_VERSION instead of VERSION + TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' + ECHO_VERSION='`echo ${PACKAGE_VERSION}`' + TCL_LIB_VERSIONS_OK=ok + CFLAGS_DEBUG=-g + CFLAGS_OPTIMIZE=-O + AS_IF([test "$GCC" = yes], [ + # TEA specific: + CFLAGS_OPTIMIZE=-O2 + CFLAGS_WARNING="-Wall" + ], [CFLAGS_WARNING=""]) +dnl FIXME: Replace AC_CHECK_PROG with AC_CHECK_TOOL once cross compiling is fixed. +dnl AC_CHECK_TOOL(AR, ar) + AC_CHECK_PROG(AR, ar, ar) + STLIB_LD='${AR} cr' + LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" + AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) + case $system in + # TEA specific: + windows) + # This is a 2-stage check to make sure we have the 64-bit SDK + # We have to know where the SDK is installed. + # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs + # MACHINE is IX86 for LINK, but this is used by the manifest, + # which requires x86|amd64|ia64. + MACHINE="X86" + if test "$do64bit" != "no" ; then + if test "x${MSSDK}x" = "xx" ; then + MSSDK="C:/Progra~1/Microsoft Platform SDK" + fi + MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` + PATH64="" + case "$do64bit" in + amd64|x64|yes) + MACHINE="AMD64" ; # default to AMD64 64-bit build + PATH64="${MSSDK}/Bin/Win64/x86/AMD64" + ;; + ia64) + MACHINE="IA64" + PATH64="${MSSDK}/Bin/Win64" + ;; + esac + if test ! -d "${PATH64}" ; then + AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) + AC_MSG_WARN([Ensure latest Platform SDK is installed]) + do64bit="no" + else + AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) + do64bit_ok="yes" + fi + fi + + if test "$doWince" != "no" ; then + if test "$do64bit" != "no" ; then + AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) + fi + if test "$GCC" = "yes" ; then + AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) + fi + TEA_PATH_CELIB + # Set defaults for common evc4/PPC2003 setup + # Currently Tcl requires 300+, possibly 420+ for sockets + CEVERSION=420; # could be 211 300 301 400 420 ... + TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... + ARCH=ARM; # could be ARM MIPS X86EM ... + PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" + if test "$doWince" != "yes"; then + # If !yes then the user specified something + # Reset ARCH to allow user to skip specifying it + ARCH= + eval `echo $doWince | awk -F, '{ \ + if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ + if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ + if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ + if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ + if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ + }'` + if test "x${ARCH}" = "x" ; then + ARCH=$TARGETCPU; + fi + fi + OSVERSION=WCE$CEVERSION; + if test "x${WCEROOT}" = "x" ; then + WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" + if test ! -d "${WCEROOT}" ; then + WCEROOT="C:/Program Files/Microsoft eMbedded Tools" + fi + fi + if test "x${SDKROOT}" = "x" ; then + SDKROOT="C:/Program Files/Windows CE Tools" + if test ! -d "${SDKROOT}" ; then + SDKROOT="C:/Windows CE Tools" + fi + fi + WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` + SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` + if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ + -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then + AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) + doWince="no" + else + # We could PATH_NOSPACE these, but that's not important, + # as long as we quote them when used. + CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" + if test -d "${CEINCLUDE}/${TARGETCPU}" ; then + CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" + fi + CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" + fi + fi + + if test "$GCC" != "yes" ; then + if test "${SHARED_BUILD}" = "0" ; then + runtime=-MT + else + runtime=-MD + fi + + if test "$do64bit" != "no" ; then + # All this magic is necessary for the Win64 SDK RC1 - hobbs + CC="\"${PATH64}/cl.exe\"" + CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" + RC="\"${MSSDK}/bin/rc.exe\"" + lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" + LINKBIN="\"${PATH64}/link.exe\"" + CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" + CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" + # Avoid 'unresolved external symbol __security_cookie' + # errors, c.f. http://support.microsoft.com/?id=894573 + TEA_ADD_LIBS([bufferoverflowU.lib]) + elif test "$doWince" != "no" ; then + CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" + if test "${TARGETCPU}" = "X86"; then + CC="\"${CEBINROOT}/cl.exe\"" + else + CC="\"${CEBINROOT}/cl${ARCH}.exe\"" + fi + CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" + RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" + arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` + defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" + if test "${SHARED_BUILD}" = "1" ; then + # Static CE builds require static celib as well + defs="${defs} _DLL" + fi + for i in $defs ; do + AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) + done + AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) + AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) + CFLAGS_DEBUG="-nologo -Zi -Od" + CFLAGS_OPTIMIZE="-nologo -Ox" + lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` + lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" + LINKBIN="\"${CEBINROOT}/link.exe\"" + AC_SUBST(CELIB_DIR) + else + RC="rc" + lflags="-nologo" + LINKBIN="link" + CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" + CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" + fi + fi + + if test "$GCC" = "yes"; then + # mingw gcc mode + RC="windres" + CFLAGS_DEBUG="-g" + CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" + SHLIB_LD="$CC -shared" + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' + LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" + LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" + else + SHLIB_LD="${LINKBIN} -dll ${lflags}" + # link -lib only works when -lib is the first arg + STLIB_LD="${LINKBIN} -lib ${lflags}" + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' + PATHTYPE=-w + # For information on what debugtype is most useful, see: + # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp + # and also + # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx + # This essentially turns it all on. + LDFLAGS_DEBUG="-debug -debugtype:cv" + LDFLAGS_OPTIMIZE="-release" + if test "$doWince" != "no" ; then + LDFLAGS_CONSOLE="-link ${lflags}" + LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} + else + LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" + LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" + fi + fi + + SHLIB_SUFFIX=".dll" + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' + + TCL_LIB_VERSIONS_OK=nodots + ;; + AIX-*) + AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ + # AIX requires the _r compiler when gcc isn't being used + case "${CC}" in + *_r|*_r\ *) + # ok ... + ;; + *) + # Make sure only first arg gets _r + CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` + ;; + esac + AC_MSG_RESULT([Using $CC for compiling with threads]) + ]) + LIBS="$LIBS -lc" + SHLIB_CFLAGS="" + SHLIB_SUFFIX=".so" + + LD_LIBRARY_PATH_VAR="LIBPATH" + + # Check to enable 64-bit flags for compiler/linker + AS_IF([test "$do64bit" = yes], [ + AS_IF([test "$GCC" = yes], [ + AC_MSG_WARN([64bit mode not supported with GCC on $system]) + ], [ + do64bit_ok=yes + CFLAGS="$CFLAGS -q64" + LDFLAGS_ARCH="-q64" + RANLIB="${RANLIB} -X64" + AR="${AR} -X64" + SHLIB_LD_FLAGS="-b64" + ]) + ]) + + AS_IF([test "`uname -m`" = ia64], [ + # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC + SHLIB_LD="/usr/ccs/bin/ld -G -z text" + AS_IF([test "$GCC" = yes], [ + CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + ], [ + CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' + ]) + LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + ], [ + AS_IF([test "$GCC" = yes], [ + SHLIB_LD='${CC} -shared -Wl,-bexpall' + ], [ + SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" + LDFLAGS="$LDFLAGS -brtl" + ]) + SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" + CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + ]) + ;; + BeOS*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD='${CC} -nostart' + SHLIB_SUFFIX=".so" + + #----------------------------------------------------------- + # Check for inet_ntoa in -lbind, for BeOS (which also needs + # -lsocket, even if the network functions are in -lnet which + # is always linked to, for compatibility. + #----------------------------------------------------------- + AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) + ;; + BSD/OS-4.*) + SHLIB_CFLAGS="-export-dynamic -fPIC" + SHLIB_LD='${CC} -shared' + SHLIB_SUFFIX=".so" + LDFLAGS="$LDFLAGS -export-dynamic" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + CYGWIN_*) + SHLIB_CFLAGS="" + SHLIB_LD='${CC} -shared' + SHLIB_SUFFIX=".dll" + EXE_SUFFIX=".exe" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + Haiku*) + LDFLAGS="$LDFLAGS -Wl,--export-dynamic" + SHLIB_CFLAGS="-fPIC" + SHLIB_SUFFIX=".so" + SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' + AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) + ;; + HP-UX-*.11.*) + # Use updated header definitions where possible + AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) + # TEA specific: Needed by Tcl, but not most extensions + #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) + #LIBS="$LIBS -lxnet" # Use the XOPEN network library + + AS_IF([test "`uname -m`" = ia64], [ + SHLIB_SUFFIX=".so" + # Use newer C++ library for C++ extensions + #if test "$GCC" != "yes" ; then + # CPPFLAGS="-AA" + #fi + ], [ + SHLIB_SUFFIX=".sl" + ]) + AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) + AS_IF([test "$tcl_ok" = yes], [ + LDFLAGS="$LDFLAGS -E" + CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' + LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' + LD_LIBRARY_PATH_VAR="SHLIB_PATH" + ]) + AS_IF([test "$GCC" = yes], [ + SHLIB_LD='${CC} -shared' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + ], [ + CFLAGS="$CFLAGS -z" + # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc + #CFLAGS="$CFLAGS +DAportable" + SHLIB_CFLAGS="+z" + SHLIB_LD="ld -b" + ]) + + # Check to enable 64-bit flags for compiler/linker + AS_IF([test "$do64bit" = "yes"], [ + AS_IF([test "$GCC" = yes], [ + case `${CC} -dumpmachine` in + hppa64*) + # 64-bit gcc in use. Fix flags for GNU ld. + do64bit_ok=yes + SHLIB_LD='${CC} -shared' + AS_IF([test $doRpath = yes], [ + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + ;; + *) + AC_MSG_WARN([64bit mode not supported with GCC on $system]) + ;; + esac + ], [ + do64bit_ok=yes + CFLAGS="$CFLAGS +DD64" + LDFLAGS_ARCH="+DD64" + ]) + ]) ;; + IRIX-6.*) + SHLIB_CFLAGS="" + SHLIB_LD="ld -n32 -shared -rdata_shared" + SHLIB_SUFFIX=".so" + AS_IF([test $doRpath = yes], [ + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) + AS_IF([test "$GCC" = yes], [ + CFLAGS="$CFLAGS -mabi=n32" + LDFLAGS="$LDFLAGS -mabi=n32" + ], [ + case $system in + IRIX-6.3) + # Use to build 6.2 compatible binaries on 6.3. + CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" + ;; + *) + CFLAGS="$CFLAGS -n32" + ;; + esac + LDFLAGS="$LDFLAGS -n32" + ]) + ;; + IRIX64-6.*) + SHLIB_CFLAGS="" + SHLIB_LD="ld -n32 -shared -rdata_shared" + SHLIB_SUFFIX=".so" + AS_IF([test $doRpath = yes], [ + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) + + # Check to enable 64-bit flags for compiler/linker + + AS_IF([test "$do64bit" = yes], [ + AS_IF([test "$GCC" = yes], [ + AC_MSG_WARN([64bit mode not supported by gcc]) + ], [ + do64bit_ok=yes + SHLIB_LD="ld -64 -shared -rdata_shared" + CFLAGS="$CFLAGS -64" + LDFLAGS_ARCH="-64" + ]) + ]) + ;; + Linux*) + SHLIB_CFLAGS="-fPIC" + SHLIB_SUFFIX=".so" + + # TEA specific: + CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" + + # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS + SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' + LDFLAGS="$LDFLAGS -Wl,--export-dynamic" + AS_IF([test $doRpath = yes], [ + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) + AS_IF([test $do64bit = yes], [ + AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ + hold_cflags=$CFLAGS + CFLAGS="$CFLAGS -m64" + AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) + CFLAGS=$hold_cflags]) + AS_IF([test $tcl_cv_cc_m64 = yes], [ + CFLAGS="$CFLAGS -m64" + do64bit_ok=yes + ]) + ]) + + # The combo of gcc + glibc has a bug related to inlining of + # functions like strtod(). The -fno-builtin flag should address + # this problem but it does not work. The -fno-inline flag is kind + # of overkill but it works. Disable inlining only when one of the + # files in compat/*.c is being linked in. + + AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) + + ;; + GNU*) + SHLIB_CFLAGS="-fPIC" + SHLIB_SUFFIX=".so" + + SHLIB_LD='${CC} -shared' + LDFLAGS="$LDFLAGS -Wl,--export-dynamic" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) + ;; + Lynx*) + SHLIB_CFLAGS="-fPIC" + SHLIB_SUFFIX=".so" + CFLAGS_OPTIMIZE=-02 + SHLIB_LD='${CC} -shared' + LD_FLAGS="-Wl,--export-dynamic" + AS_IF([test $doRpath = yes], [ + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) + ;; + OpenBSD-*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' + SHLIB_SUFFIX=".so" + AS_IF([test $doRpath = yes], [ + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' + AC_CACHE_CHECK([for ELF], tcl_cv_ld_elf, [ + AC_EGREP_CPP(yes, [ +#ifdef __ELF__ + yes +#endif + ], tcl_cv_ld_elf=yes, tcl_cv_ld_elf=no)]) + AS_IF([test $tcl_cv_ld_elf = yes], [ + LDFLAGS=-Wl,-export-dynamic + ], [LDFLAGS=""]) + AS_IF([test "${TCL_THREADS}" = "1"], [ + # OpenBSD builds and links with -pthread, never -lpthread. + LIBS=`echo $LIBS | sed s/-lpthread//` + CFLAGS="$CFLAGS -pthread" + #SHLIB_CFLAGS="$SHLIB_CFLAGS -pthread" + ]) + # OpenBSD doesn't do version numbers with dots. + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' + TCL_LIB_VERSIONS_OK=nodots + ;; + NetBSD-*|FreeBSD-[[3-4]].*) + # FreeBSD 3.* and greater have ELF. + # NetBSD 2.* has ELF and can use 'cc -shared' to build shared libs + SHLIB_CFLAGS="-fPIC" + SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' + SHLIB_SUFFIX=".so" + LDFLAGS="$LDFLAGS -export-dynamic" + AS_IF([test $doRpath = yes], [ + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + AS_IF([test "${TCL_THREADS}" = "1"], [ + # The -pthread needs to go in the CFLAGS, not LIBS + LIBS=`echo $LIBS | sed s/-pthread//` + CFLAGS="$CFLAGS -pthread" + LDFLAGS="$LDFLAGS -pthread" + ]) + case $system in + FreeBSD-3.*) + # FreeBSD-3 doesn't handle version numbers with dots. + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' + TCL_LIB_VERSIONS_OK=nodots + ;; + esac + ;; + FreeBSD-*) + # This configuration from FreeBSD Ports. + SHLIB_CFLAGS="-fPIC" + SHLIB_LD="${CC} -shared" + TCL_SHLIB_LD_EXTRAS="-soname \$[@]" + SHLIB_SUFFIX=".so" + LDFLAGS="" + AS_IF([test $doRpath = yes], [ + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) + AS_IF([test "${TCL_THREADS}" = "1"], [ + # The -pthread needs to go in the LDFLAGS, not LIBS + LIBS=`echo $LIBS | sed s/-pthread//` + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) + # Version numbers are dot-stripped by system policy. + TCL_TRIM_DOTS=`echo ${VERSION} | tr -d .` + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' + TCL_LIB_VERSIONS_OK=nodots + ;; + Darwin-*) + CFLAGS_OPTIMIZE="-Os" + SHLIB_CFLAGS="-fno-common" + # To avoid discrepancies between what headers configure sees during + # preprocessing tests and compiling tests, move any -isysroot and + # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: + CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ + awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ + if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" + CFLAGS="`echo " ${CFLAGS}" | \ + awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ + if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" + AS_IF([test $do64bit = yes], [ + case `arch` in + ppc) + AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], + tcl_cv_cc_arch_ppc64, [ + hold_cflags=$CFLAGS + CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" + AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, + tcl_cv_cc_arch_ppc64=no) + CFLAGS=$hold_cflags]) + AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ + CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" + do64bit_ok=yes + ]);; + i386) + AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], + tcl_cv_cc_arch_x86_64, [ + hold_cflags=$CFLAGS + CFLAGS="$CFLAGS -arch x86_64" + AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, + tcl_cv_cc_arch_x86_64=no) + CFLAGS=$hold_cflags]) + AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ + CFLAGS="$CFLAGS -arch x86_64" + do64bit_ok=yes + ]);; + *) + AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; + esac + ], [ + # Check for combined 32-bit and 64-bit fat build + AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ + && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ + fat_32_64=yes]) + ]) + # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS + SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' + AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ + hold_ldflags=$LDFLAGS + LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" + AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) + LDFLAGS=$hold_ldflags]) + AS_IF([test $tcl_cv_ld_single_module = yes], [ + SHLIB_LD="${SHLIB_LD} -Wl,-single_module" + ]) + # TEA specific: link shlib with current and compatiblity version flags + vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` + SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" + SHLIB_SUFFIX=".dylib" + # Don't use -prebind when building for Mac OS X 10.4 or later only: + AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ + "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ + LDFLAGS="$LDFLAGS -prebind"]) + LDFLAGS="$LDFLAGS -headerpad_max_install_names" + AC_CACHE_CHECK([if ld accepts -search_paths_first flag], + tcl_cv_ld_search_paths_first, [ + hold_ldflags=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, + tcl_cv_ld_search_paths_first=no) + LDFLAGS=$hold_ldflags]) + AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + ]) + AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ + AC_DEFINE(MODULE_SCOPE, [__private_extern__], + [Compiler support for module scope symbols]) + tcl_cv_cc_visibility_hidden=yes + ]) + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" + # TEA specific: for combined 32 & 64 bit fat builds of Tk + # extensions, verify that 64-bit build is possible. + AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ + AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ + AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ + for v in CFLAGS CPPFLAGS LDFLAGS; do + eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' + done + CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" + LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" + AC_TRY_LINK([#include ], [XrmInitialize();], + tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) + for v in CFLAGS CPPFLAGS LDFLAGS; do + eval $v'="$hold_'$v'"' + done]) + ]) + AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ + AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ + for v in CFLAGS CPPFLAGS LDFLAGS; do + eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' + done + CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" + LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" + AC_TRY_LINK([#include ], [Tk_InitStubs(NULL, "", 0);], + tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) + for v in CFLAGS CPPFLAGS LDFLAGS; do + eval $v'="$hold_'$v'"' + done]) + ]) + # remove 64-bit arch flags from CFLAGS et al. if configuration + # does not support 64-bit. + AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ + AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) + for v in CFLAGS CPPFLAGS LDFLAGS; do + eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' + done]) + ]) + ;; + OS/390-*) + CFLAGS_OPTIMIZE="" # Optimizer is buggy + AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h + [Should OS/390 do the right thing with sockets?]) + ;; + OSF1-V*) + # Digital OSF/1 + SHLIB_CFLAGS="" + AS_IF([test "$SHARED_BUILD" = 1], [ + SHLIB_LD='ld -shared -expect_unresolved "*"' + ], [ + SHLIB_LD='ld -non_shared -expect_unresolved "*"' + ]) + SHLIB_SUFFIX=".so" + AS_IF([test $doRpath = yes], [ + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) + AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ + CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) + # see pthread_intro(3) for pthread support on osf1, k.furukawa + AS_IF([test "${TCL_THREADS}" = 1], [ + CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" + CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" + LIBS=`echo $LIBS | sed s/-lpthreads//` + AS_IF([test "$GCC" = yes], [ + LIBS="$LIBS -lpthread -lmach -lexc" + ], [ + CFLAGS="$CFLAGS -pthread" + LDFLAGS="$LDFLAGS -pthread" + ]) + ]) + ;; + QNX-6*) + # QNX RTP + # This may work for all QNX, but it was only reported for v6. + SHLIB_CFLAGS="-fPIC" + SHLIB_LD="ld -Bshareable -x" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + SCO_SV-3.2*) + AS_IF([test "$GCC" = yes], [ + SHLIB_CFLAGS="-fPIC -melf" + LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" + ], [ + SHLIB_CFLAGS="-Kpic -belf" + LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" + ]) + SHLIB_LD="ld -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + SunOS-5.[[0-6]]) + # Careful to not let 5.10+ fall into this case + + # Note: If _REENTRANT isn't defined, then Solaris + # won't define thread-safe library routines. + + AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) + AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, + [Do we really want to follow the standard? Yes we do!]) + + SHLIB_CFLAGS="-KPIC" + SHLIB_SUFFIX=".so" + AS_IF([test "$GCC" = yes], [ + SHLIB_LD='${CC} -shared' + CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + ], [ + SHLIB_LD="/usr/ccs/bin/ld -G -z text" + CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + ]) + ;; + SunOS-5*) + # Note: If _REENTRANT isn't defined, then Solaris + # won't define thread-safe library routines. + + AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) + AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, + [Do we really want to follow the standard? Yes we do!]) + + SHLIB_CFLAGS="-KPIC" + + # Check to enable 64-bit flags for compiler/linker + AS_IF([test "$do64bit" = yes], [ + arch=`isainfo` + AS_IF([test "$arch" = "sparcv9 sparc"], [ + AS_IF([test "$GCC" = yes], [ + AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ + AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) + ], [ + do64bit_ok=yes + CFLAGS="$CFLAGS -m64 -mcpu=v9" + LDFLAGS="$LDFLAGS -m64 -mcpu=v9" + SHLIB_CFLAGS="-fPIC" + ]) + ], [ + do64bit_ok=yes + AS_IF([test "$do64bitVIS" = yes], [ + CFLAGS="$CFLAGS -xarch=v9a" + LDFLAGS_ARCH="-xarch=v9a" + ], [ + CFLAGS="$CFLAGS -xarch=v9" + LDFLAGS_ARCH="-xarch=v9" + ]) + # Solaris 64 uses this as well + #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" + ]) + ], [AS_IF([test "$arch" = "amd64 i386"], [ + AS_IF([test "$GCC" = yes], [ + case $system in + SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) + do64bit_ok=yes + CFLAGS="$CFLAGS -m64" + LDFLAGS="$LDFLAGS -m64";; + *) + AC_MSG_WARN([64bit mode not supported with GCC on $system]);; + esac + ], [ + do64bit_ok=yes + case $system in + SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) + CFLAGS="$CFLAGS -m64" + LDFLAGS="$LDFLAGS -m64";; + *) + CFLAGS="$CFLAGS -xarch=amd64" + LDFLAGS="$LDFLAGS -xarch=amd64";; + esac + ]) + ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) + ]) + + SHLIB_SUFFIX=".so" + AS_IF([test "$GCC" = yes], [ + SHLIB_LD='${CC} -shared' + CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + AS_IF([test "$do64bit_ok" = yes], [ + AS_IF([test "$arch" = "sparcv9 sparc"], [ + # We need to specify -static-libgcc or we need to + # add the path to the sparv9 libgcc. + # JH: static-libgcc is necessary for core Tcl, but may + # not be necessary for extensions. + SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" + # for finding sparcv9 libgcc, get the regular libgcc + # path, remove so name and append 'sparcv9' + #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." + #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" + ], [AS_IF([test "$arch" = "amd64 i386"], [ + # JH: static-libgcc is necessary for core Tcl, but may + # not be necessary for extensions. + SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" + ])]) + ]) + ], [ + case $system in + SunOS-5.[[1-9]][[0-9]]*) + # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS + SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; + *) + SHLIB_LD='/usr/ccs/bin/ld -G -z text';; + esac + CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + ]) + ;; + esac + + AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ + AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) + ]) + +dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so +dnl # until the end of configure, as configure's compile and link tests use +dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's +dnl # preprocessing tests use only CPPFLAGS. + AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) + + # Add in the arch flags late to ensure it wasn't removed. + # Not necessary in TEA, but this is aligned with core + LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" + + # If we're running gcc, then change the C flags for compiling shared + # libraries to the right flags for gcc, instead of those for the + # standard manufacturer compiler. + + AS_IF([test "$GCC" = yes], [ + case $system in + AIX-*) ;; + BSD/OS*) ;; + CYGWIN_*) ;; + IRIX*) ;; + NetBSD-*|FreeBSD-*|OpenBSD-*) ;; + Darwin-*) ;; + SCO_SV-3.2*) ;; + windows) ;; + *) SHLIB_CFLAGS="-fPIC" ;; + esac]) + + AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ + AC_DEFINE(MODULE_SCOPE, [extern], + [No Compiler support for module scope symbols]) + AC_DEFINE(NO_VIZ, [], [No visibility hidden passed to zlib?]) + ]) + + AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ + # TEA specific: use PACKAGE_VERSION instead of VERSION + SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) + AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ + # TEA specific: use PACKAGE_VERSION instead of VERSION + UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) + + AC_SUBST(CFLAGS_DEBUG) + AC_SUBST(CFLAGS_OPTIMIZE) + AC_SUBST(CFLAGS_WARNING) + + AC_SUBST(STLIB_LD) + AC_SUBST(SHLIB_LD) + + AC_SUBST(SHLIB_LD_LIBS) + AC_SUBST(SHLIB_CFLAGS) + + AC_SUBST(LD_LIBRARY_PATH_VAR) + + # These must be called after we do the basic CFLAGS checks and + # verify any possible 64-bit or similar switches are necessary + TEA_TCL_EARLY_FLAGS + TEA_TCL_64BIT_FLAGS +]) + +#-------------------------------------------------------------------- +# TEA_SERIAL_PORT +# +# Determine which interface to use to talk to the serial port. +# Note that #include lines must begin in leftmost column for +# some compilers to recognize them as preprocessor directives, +# and some build environments have stdin not pointing at a +# pseudo-terminal (usually /dev/null instead.) +# +# Arguments: +# none +# +# Results: +# +# Defines only one of the following vars: +# HAVE_SYS_MODEM_H +# USE_TERMIOS +# USE_TERMIO +# USE_SGTTY +# +#-------------------------------------------------------------------- + +AC_DEFUN([TEA_SERIAL_PORT], [ + AC_CHECK_HEADERS(sys/modem.h) + AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ + AC_TRY_RUN([ +#include + +int main() { + struct termios t; + if (tcgetattr(0, &t) == 0) { + cfsetospeed(&t, 0); + t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; + return 0; + } + return 1; +}], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) + if test $tcl_cv_api_serial = no ; then + AC_TRY_RUN([ +#include + +int main() { + struct termio t; + if (ioctl(0, TCGETA, &t) == 0) { + t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; + return 0; + } + return 1; +}], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) + fi + if test $tcl_cv_api_serial = no ; then + AC_TRY_RUN([ +#include + +int main() { + struct sgttyb t; + if (ioctl(0, TIOCGETP, &t) == 0) { + t.sg_ospeed = 0; + t.sg_flags |= ODDP | EVENP | RAW; + return 0; + } + return 1; +}], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) + fi + if test $tcl_cv_api_serial = no ; then + AC_TRY_RUN([ +#include +#include + +int main() { + struct termios t; + if (tcgetattr(0, &t) == 0 + || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { + cfsetospeed(&t, 0); + t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; + return 0; + } + return 1; +}], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) + fi + if test $tcl_cv_api_serial = no; then + AC_TRY_RUN([ +#include +#include + +int main() { + struct termio t; + if (ioctl(0, TCGETA, &t) == 0 + || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { + t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; + return 0; + } + return 1; + }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) + fi + if test $tcl_cv_api_serial = no; then + AC_TRY_RUN([ +#include +#include + +int main() { + struct sgttyb t; + if (ioctl(0, TIOCGETP, &t) == 0 + || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { + t.sg_ospeed = 0; + t.sg_flags |= ODDP | EVENP | RAW; + return 0; + } + return 1; +}], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) + fi]) + case $tcl_cv_api_serial in + termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; + termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; + sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; + esac +]) + +#-------------------------------------------------------------------- +# TEA_MISSING_POSIX_HEADERS +# +# Supply substitutes for missing POSIX header files. Special +# notes: +# - stdlib.h doesn't define strtol, strtoul, or +# strtod in some versions of SunOS +# - some versions of string.h don't declare procedures such +# as strstr +# +# Arguments: +# none +# +# Results: +# +# Defines some of the following vars: +# NO_DIRENT_H +# NO_ERRNO_H +# NO_VALUES_H +# HAVE_LIMITS_H or NO_LIMITS_H +# NO_STDLIB_H +# NO_STRING_H +# NO_SYS_WAIT_H +# NO_DLFCN_H +# HAVE_SYS_PARAM_H +# +# HAVE_STRING_H ? +# +# tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and +# CHECK on limits.h +#-------------------------------------------------------------------- + +AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ + AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ + AC_TRY_LINK([#include +#include ], [ +#ifndef _POSIX_SOURCE +# ifdef __Lynx__ + /* + * Generate compilation error to make the test fail: Lynx headers + * are only valid if really in the POSIX environment. + */ + + missing_procedure(); +# endif +#endif +DIR *d; +struct dirent *entryPtr; +char *p; +d = opendir("foobar"); +entryPtr = readdir(d); +p = entryPtr->d_name; +closedir(d); +], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) + + if test $tcl_cv_dirent_h = no; then + AC_DEFINE(NO_DIRENT_H, 1, [Do we have ?]) + fi + + # TEA specific: + AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have ?])]) + AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have ?])]) + AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have ?])]) + AC_CHECK_HEADER(limits.h, + [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have ?])], + [AC_DEFINE(NO_LIMITS_H, 1, [Do we have ?])]) + AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) + AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) + AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) + AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) + if test $tcl_ok = 0; then + AC_DEFINE(NO_STDLIB_H, 1, [Do we have ?]) + fi + AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) + AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) + AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) + + # See also memmove check below for a place where NO_STRING_H can be + # set and why. + + if test $tcl_ok = 0; then + AC_DEFINE(NO_STRING_H, 1, [Do we have ?]) + fi + + AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have ?])]) + AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have ?])]) + + # OS/390 lacks sys/param.h (and doesn't need it, by chance). + AC_HAVE_HEADERS(sys/param.h) +]) + +#-------------------------------------------------------------------- +# TEA_PATH_X +# +# Locate the X11 header files and the X11 library archive. Try +# the ac_path_x macro first, but if it doesn't find the X stuff +# (e.g. because there's no xmkmf program) then check through +# a list of possible directories. Under some conditions the +# autoconf macro will return an include directory that contains +# no include files, so double-check its result just to be safe. +# +# This should be called after TEA_CONFIG_CFLAGS as setting the +# LIBS line can confuse some configure macro magic. +# +# Arguments: +# none +# +# Results: +# +# Sets the following vars: +# XINCLUDES +# XLIBSW +# PKG_LIBS (appends to) +# +#-------------------------------------------------------------------- + +AC_DEFUN([TEA_PATH_X], [ + if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then + TEA_PATH_UNIX_X + fi +]) + +AC_DEFUN([TEA_PATH_UNIX_X], [ + AC_PATH_X + not_really_there="" + if test "$no_x" = ""; then + if test "$x_includes" = ""; then + AC_TRY_CPP([#include ], , not_really_there="yes") + else + if test ! -r $x_includes/X11/Intrinsic.h; then + not_really_there="yes" + fi + fi + fi + if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then + AC_MSG_CHECKING([for X11 header files]) + found_xincludes="no" + AC_TRY_CPP([#include ], found_xincludes="yes", found_xincludes="no") + if test "$found_xincludes" = "no"; then + dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" + for i in $dirs ; do + if test -r $i/X11/Intrinsic.h; then + AC_MSG_RESULT([$i]) + XINCLUDES=" -I$i" + found_xincludes="yes" + break + fi + done + fi + else + if test "$x_includes" != ""; then + XINCLUDES="-I$x_includes" + found_xincludes="yes" + fi + fi + if test "$found_xincludes" = "no"; then + AC_MSG_RESULT([couldn't find any!]) + fi + + if test "$no_x" = yes; then + AC_MSG_CHECKING([for X11 libraries]) + XLIBSW=nope + dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" + for i in $dirs ; do + if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then + AC_MSG_RESULT([$i]) + XLIBSW="-L$i -lX11" + x_libraries="$i" + break + fi + done + else + if test "$x_libraries" = ""; then + XLIBSW=-lX11 + else + XLIBSW="-L$x_libraries -lX11" + fi + fi + if test "$XLIBSW" = nope ; then + AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) + fi + if test "$XLIBSW" = nope ; then + AC_MSG_RESULT([could not find any! Using -lX11.]) + XLIBSW=-lX11 + fi + # TEA specific: + if test x"${XLIBSW}" != x ; then + PKG_LIBS="${PKG_LIBS} ${XLIBSW}" + fi +]) + +#-------------------------------------------------------------------- +# TEA_BLOCKING_STYLE +# +# The statements below check for systems where POSIX-style +# non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. +# On these systems (mostly older ones), use the old BSD-style +# FIONBIO approach instead. +# +# Arguments: +# none +# +# Results: +# +# Defines some of the following vars: +# HAVE_SYS_IOCTL_H +# HAVE_SYS_FILIO_H +# USE_FIONBIO +# O_NONBLOCK +# +#-------------------------------------------------------------------- + +AC_DEFUN([TEA_BLOCKING_STYLE], [ + AC_CHECK_HEADERS(sys/ioctl.h) + AC_CHECK_HEADERS(sys/filio.h) + TEA_CONFIG_SYSTEM + AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) + case $system in + OSF*) + AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) + AC_MSG_RESULT([FIONBIO]) + ;; + *) + AC_MSG_RESULT([O_NONBLOCK]) + ;; + esac +]) + +#-------------------------------------------------------------------- +# TEA_TIME_HANDLER +# +# Checks how the system deals with time.h, what time structures +# are used on the system, and what fields the structures have. +# +# Arguments: +# none +# +# Results: +# +# Defines some of the following vars: +# USE_DELTA_FOR_TZ +# HAVE_TM_GMTOFF +# HAVE_TM_TZADJ +# HAVE_TIMEZONE_VAR +# +#-------------------------------------------------------------------- + +AC_DEFUN([TEA_TIME_HANDLER], [ + AC_CHECK_HEADERS(sys/time.h) + AC_HEADER_TIME + AC_STRUCT_TIMEZONE + + AC_CHECK_FUNCS(gmtime_r localtime_r) + + AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ + AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_tzadj;], + tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) + if test $tcl_cv_member_tm_tzadj = yes ; then + AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) + fi + + AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ + AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_gmtoff;], + tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) + if test $tcl_cv_member_tm_gmtoff = yes ; then + AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) + fi + + # + # Its important to include time.h in this check, as some systems + # (like convex) have timezone functions, etc. + # + AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ + AC_TRY_COMPILE([#include ], + [extern long timezone; + timezone += 1; + exit (0);], + tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) + if test $tcl_cv_timezone_long = yes ; then + AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) + else + # + # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. + # + AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ + AC_TRY_COMPILE([#include ], + [extern time_t timezone; + timezone += 1; + exit (0);], + tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) + if test $tcl_cv_timezone_time = yes ; then + AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) + fi + fi +]) + +#-------------------------------------------------------------------- +# TEA_BUGGY_STRTOD +# +# Under Solaris 2.4, strtod returns the wrong value for the +# terminating character under some conditions. Check for this +# and if the problem exists use a substitute procedure +# "fixstrtod" (provided by Tcl) that corrects the error. +# Also, on Compaq's Tru64 Unix 5.0, +# strtod(" ") returns 0.0 instead of a failure to convert. +# +# Arguments: +# none +# +# Results: +# +# Might defines some of the following vars: +# strtod (=fixstrtod) +# +#-------------------------------------------------------------------- + +AC_DEFUN([TEA_BUGGY_STRTOD], [ + AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) + if test "$tcl_strtod" = 1; then + AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ + AC_TRY_RUN([ + extern double strtod(); + int main() { + char *infString="Inf", *nanString="NaN", *spaceString=" "; + char *term; + double value; + value = strtod(infString, &term); + if ((term != infString) && (term[-1] == 0)) { + exit(1); + } + value = strtod(nanString, &term); + if ((term != nanString) && (term[-1] == 0)) { + exit(1); + } + value = strtod(spaceString, &term); + if (term == (spaceString+1)) { + exit(1); + } + exit(0); + }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, + tcl_cv_strtod_buggy=buggy)]) + if test "$tcl_cv_strtod_buggy" = buggy; then + AC_LIBOBJ([fixstrtod]) + USE_COMPAT=1 + AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) + fi + fi +]) + +#-------------------------------------------------------------------- +# TEA_TCL_LINK_LIBS +# +# Search for the libraries needed to link the Tcl shell. +# Things like the math library (-lm) and socket stuff (-lsocket vs. +# -lnsl) are dealt with here. +# +# Arguments: +# Requires the following vars to be set in the Makefile: +# DL_LIBS (not in TEA, only needed in core) +# LIBS +# MATH_LIBS +# +# Results: +# +# Subst's the following var: +# TCL_LIBS +# MATH_LIBS +# +# Might append to the following vars: +# LIBS +# +# Might define the following vars: +# HAVE_NET_ERRNO_H +# +#-------------------------------------------------------------------- + +AC_DEFUN([TEA_TCL_LINK_LIBS], [ + #-------------------------------------------------------------------- + # On a few very rare systems, all of the libm.a stuff is + # already in libc.a. Set compiler flags accordingly. + # Also, Linux requires the "ieee" library for math to work + # right (and it must appear before "-lm"). + #-------------------------------------------------------------------- + + AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") + AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) + + #-------------------------------------------------------------------- + # Interactive UNIX requires -linet instead of -lsocket, plus it + # needs net/errno.h to define the socket-related error codes. + #-------------------------------------------------------------------- + + AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) + AC_CHECK_HEADER(net/errno.h, [ + AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have ?])]) + + #-------------------------------------------------------------------- + # Check for the existence of the -lsocket and -lnsl libraries. + # The order here is important, so that they end up in the right + # order in the command line generated by make. Here are some + # special considerations: + # 1. Use "connect" and "accept" to check for -lsocket, and + # "gethostbyname" to check for -lnsl. + # 2. Use each function name only once: can't redo a check because + # autoconf caches the results of the last check and won't redo it. + # 3. Use -lnsl and -lsocket only if they supply procedures that + # aren't already present in the normal libraries. This is because + # IRIX 5.2 has libraries, but they aren't needed and they're + # bogus: they goof up name resolution if used. + # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. + # To get around this problem, check for both libraries together + # if -lsocket doesn't work by itself. + #-------------------------------------------------------------------- + + tcl_checkBoth=0 + AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) + if test "$tcl_checkSocket" = 1; then + AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, + LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) + fi + if test "$tcl_checkBoth" = 1; then + tk_oldLibs=$LIBS + LIBS="$LIBS -lsocket -lnsl" + AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) + fi + AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, + [LIBS="$LIBS -lnsl"])]) + + # TEA specific: Don't perform the eval of the libraries here because + # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS + + TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' + AC_SUBST(TCL_LIBS) + AC_SUBST(MATH_LIBS) +]) + +#-------------------------------------------------------------------- +# TEA_TCL_EARLY_FLAGS +# +# Check for what flags are needed to be passed so the correct OS +# features are available. +# +# Arguments: +# None +# +# Results: +# +# Might define the following vars: +# _ISOC99_SOURCE +# _LARGEFILE64_SOURCE +# _LARGEFILE_SOURCE64 +# +#-------------------------------------------------------------------- + +AC_DEFUN([TEA_TCL_EARLY_FLAG],[ + AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), + AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, + AC_TRY_COMPILE([[#define ]$1[ 1 +]$2], $3, + [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, + [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) + if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then + AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) + tcl_flags="$tcl_flags $1" + fi +]) + +AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ + AC_MSG_CHECKING([for required early compiler flags]) + tcl_flags="" + TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include ], + [char *p = (char *)strtoll; char *q = (char *)strtoull;]) + TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include ], + [struct stat64 buf; int i = stat64("/", &buf);]) + TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include ], + [char *p = (char *)open64;]) + if test "x${tcl_flags}" = "x" ; then + AC_MSG_RESULT([none]) + else + AC_MSG_RESULT([${tcl_flags}]) + fi +]) + +#-------------------------------------------------------------------- +# TEA_TCL_64BIT_FLAGS +# +# Check for what is defined in the way of 64-bit features. +# +# Arguments: +# None +# +# Results: +# +# Might define the following vars: +# TCL_WIDE_INT_IS_LONG +# TCL_WIDE_INT_TYPE +# HAVE_STRUCT_DIRENT64 +# HAVE_STRUCT_STAT64 +# HAVE_TYPE_OFF64_T +# +#-------------------------------------------------------------------- + +AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ + AC_MSG_CHECKING([for 64-bit integer type]) + AC_CACHE_VAL(tcl_cv_type_64bit,[ + tcl_cv_type_64bit=none + # See if the compiler knows natively about __int64 + AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], + tcl_type_64bit=__int64, tcl_type_64bit="long long") + # See if we should use long anyway Note that we substitute in the + # type that is our current guess for a 64-bit type inside this check + # program, so it should be modified only carefully... + AC_TRY_COMPILE(,[switch (0) { + case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; + }],tcl_cv_type_64bit=${tcl_type_64bit})]) + if test "${tcl_cv_type_64bit}" = none ; then + AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) + AC_MSG_RESULT([using long]) + elif test "${tcl_cv_type_64bit}" = "__int64" \ + -a "${TEA_PLATFORM}" = "windows" ; then + # TEA specific: We actually want to use the default tcl.h checks in + # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* + AC_MSG_RESULT([using Tcl header defaults]) + else + AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, + [What type should be used to define wide integers?]) + AC_MSG_RESULT([${tcl_cv_type_64bit}]) + + # Now check for auxiliary declarations + AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ + AC_TRY_COMPILE([#include +#include ],[struct dirent64 p;], + tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) + if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then + AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in ?]) + fi + + AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ + AC_TRY_COMPILE([#include ],[struct stat64 p; +], + tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) + if test "x${tcl_cv_struct_stat64}" = "xyes" ; then + AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in ?]) + fi + + AC_CHECK_FUNCS(open64 lseek64) + AC_MSG_CHECKING([for off64_t]) + AC_CACHE_VAL(tcl_cv_type_off64_t,[ + AC_TRY_COMPILE([#include ],[off64_t offset; +], + tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) + dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the + dnl functions lseek64 and open64 are defined. + if test "x${tcl_cv_type_off64_t}" = "xyes" && \ + test "x${ac_cv_func_lseek64}" = "xyes" && \ + test "x${ac_cv_func_open64}" = "xyes" ; then + AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in ?]) + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + fi +]) + +## +## Here ends the standard Tcl configuration bits and starts the +## TEA specific functions +## + +#------------------------------------------------------------------------ +# TEA_INIT -- +# +# Init various Tcl Extension Architecture (TEA) variables. +# This should be the first called TEA_* macro. +# +# Arguments: +# none +# +# Results: +# +# Defines and substs the following vars: +# CYGPATH +# EXEEXT +# Defines only: +# TEA_VERSION +# TEA_INITED +# TEA_PLATFORM (windows or unix) +# +# "cygpath" is used on windows to generate native path names for include +# files. These variables should only be used with the compiler and linker +# since they generate native path names. +# +# EXEEXT +# Select the executable extension based on the host type. This +# is a lightweight replacement for AC_EXEEXT that doesn't require +# a compiler. +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_INIT], [ + # TEA extensions pass this us the version of TEA they think they + # are compatible with. + TEA_VERSION="3.9" + + AC_MSG_CHECKING([for correct TEA configuration]) + if test x"${PACKAGE_NAME}" = x ; then + AC_MSG_ERROR([ +The PACKAGE_NAME variable must be defined by your TEA configure.in]) + fi + if test x"$1" = x ; then + AC_MSG_ERROR([ +TEA version not specified.]) + elif test "$1" != "${TEA_VERSION}" ; then + AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) + else + AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) + fi + case "`uname -s`" in + *win32*|*WIN32*|*MINGW32_*) + AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) + EXEEXT=".exe" + TEA_PLATFORM="windows" + ;; + *CYGWIN_*) + CYGPATH=echo + EXEEXT=".exe" + # TEA_PLATFORM is determined later in LOAD_TCLCONFIG + ;; + *) + CYGPATH=echo + EXEEXT="" + TEA_PLATFORM="unix" + ;; + esac + + # Check if exec_prefix is set. If not use fall back to prefix. + # Note when adjusted, so that TEA_PREFIX can correct for this. + # This is needed for recursive configures, since autoconf propagates + # $prefix, but not $exec_prefix (doh!). + if test x$exec_prefix = xNONE ; then + exec_prefix_default=yes + exec_prefix=$prefix + fi + + AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) + + AC_SUBST(EXEEXT) + AC_SUBST(CYGPATH) + + # This package name must be replaced statically for AC_SUBST to work + AC_SUBST(PKG_LIB_FILE) + # Substitute STUB_LIB_FILE in case package creates a stub library too. + AC_SUBST(PKG_STUB_LIB_FILE) + + # We AC_SUBST these here to ensure they are subst'ed, + # in case the user doesn't call TEA_ADD_... + AC_SUBST(PKG_STUB_SOURCES) + AC_SUBST(PKG_STUB_OBJECTS) + AC_SUBST(PKG_TCL_SOURCES) + AC_SUBST(PKG_HEADERS) + AC_SUBST(PKG_INCLUDES) + AC_SUBST(PKG_LIBS) + AC_SUBST(PKG_CFLAGS) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_SOURCES -- +# +# Specify one or more source files. Users should check for +# the right platform before adding to their list. +# It is not important to specify the directory, as long as it is +# in the generic, win or unix subdirectory of $(srcdir). +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_SOURCES +# PKG_OBJECTS +#------------------------------------------------------------------------ +AC_DEFUN([TEA_ADD_SOURCES], [ + vars="$@" + for i in $vars; do + case $i in + [\$]*) + # allow $-var names + PKG_SOURCES="$PKG_SOURCES $i" + PKG_OBJECTS="$PKG_OBJECTS $i" + ;; + *) + # check for existence - allows for generic/win/unix VPATH + # To add more dirs here (like 'src'), you have to update VPATH + # in Makefile.in as well + if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ + -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ + -a ! -f "${srcdir}/macosx/$i" \ + ; then + AC_MSG_ERROR([could not find source file '$i']) + fi + PKG_SOURCES="$PKG_SOURCES $i" + # this assumes it is in a VPATH dir + i=`basename $i` + # handle user calling this before or after TEA_SETUP_COMPILER + if test x"${OBJEXT}" != x ; then + j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" + else + j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" + fi + PKG_OBJECTS="$PKG_OBJECTS $j" + ;; + esac + done + AC_SUBST(PKG_SOURCES) + AC_SUBST(PKG_OBJECTS) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_STUB_SOURCES -- +# +# Specify one or more source files. Users should check for +# the right platform before adding to their list. +# It is not important to specify the directory, as long as it is +# in the generic, win or unix subdirectory of $(srcdir). +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_STUB_SOURCES +# PKG_STUB_OBJECTS +#------------------------------------------------------------------------ +AC_DEFUN([TEA_ADD_STUB_SOURCES], [ + vars="$@" + for i in $vars; do + # check for existence - allows for generic/win/unix VPATH + if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ + -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ + -a ! -f "${srcdir}/macosx/$i" \ + ; then + AC_MSG_ERROR([could not find stub source file '$i']) + fi + PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" + # this assumes it is in a VPATH dir + i=`basename $i` + # handle user calling this before or after TEA_SETUP_COMPILER + if test x"${OBJEXT}" != x ; then + j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" + else + j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" + fi + PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" + done + AC_SUBST(PKG_STUB_SOURCES) + AC_SUBST(PKG_STUB_OBJECTS) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_TCL_SOURCES -- +# +# Specify one or more Tcl source files. These should be platform +# independent runtime files. +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_TCL_SOURCES +#------------------------------------------------------------------------ +AC_DEFUN([TEA_ADD_TCL_SOURCES], [ + vars="$@" + for i in $vars; do + # check for existence, be strict because it is installed + if test ! -f "${srcdir}/$i" ; then + AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) + fi + PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" + done + AC_SUBST(PKG_TCL_SOURCES) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_HEADERS -- +# +# Specify one or more source headers. Users should check for +# the right platform before adding to their list. +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_HEADERS +#------------------------------------------------------------------------ +AC_DEFUN([TEA_ADD_HEADERS], [ + vars="$@" + for i in $vars; do + # check for existence, be strict because it is installed + if test ! -f "${srcdir}/$i" ; then + AC_MSG_ERROR([could not find header file '${srcdir}/$i']) + fi + PKG_HEADERS="$PKG_HEADERS $i" + done + AC_SUBST(PKG_HEADERS) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_INCLUDES -- +# +# Specify one or more include dirs. Users should check for +# the right platform before adding to their list. +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_INCLUDES +#------------------------------------------------------------------------ +AC_DEFUN([TEA_ADD_INCLUDES], [ + vars="$@" + for i in $vars; do + PKG_INCLUDES="$PKG_INCLUDES $i" + done + AC_SUBST(PKG_INCLUDES) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_LIBS -- +# +# Specify one or more libraries. Users should check for +# the right platform before adding to their list. For Windows, +# libraries provided in "foo.lib" format will be converted to +# "-lfoo" when using GCC (mingw). +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_LIBS +#------------------------------------------------------------------------ +AC_DEFUN([TEA_ADD_LIBS], [ + vars="$@" + for i in $vars; do + if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then + # Convert foo.lib to -lfoo for GCC. No-op if not *.lib + i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` + fi + PKG_LIBS="$PKG_LIBS $i" + done + AC_SUBST(PKG_LIBS) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_CFLAGS -- +# +# Specify one or more CFLAGS. Users should check for +# the right platform before adding to their list. +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_CFLAGS +#------------------------------------------------------------------------ +AC_DEFUN([TEA_ADD_CFLAGS], [ + PKG_CFLAGS="$PKG_CFLAGS $@" + AC_SUBST(PKG_CFLAGS) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_CLEANFILES -- +# +# Specify one or more CLEANFILES. +# +# Arguments: +# one or more file names to clean target +# +# Results: +# +# Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG +#------------------------------------------------------------------------ +AC_DEFUN([TEA_ADD_CLEANFILES], [ + CLEANFILES="$CLEANFILES $@" +]) + +#------------------------------------------------------------------------ +# TEA_PREFIX -- +# +# Handle the --prefix=... option by defaulting to what Tcl gave +# +# Arguments: +# none +# +# Results: +# +# If --prefix or --exec-prefix was not specified, $prefix and +# $exec_prefix will be set to the values given to Tcl when it was +# configured. +#------------------------------------------------------------------------ +AC_DEFUN([TEA_PREFIX], [ + if test "${prefix}" = "NONE"; then + prefix_default=yes + if test x"${TCL_PREFIX}" != x; then + AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) + prefix=${TCL_PREFIX} + else + AC_MSG_NOTICE([--prefix defaulting to /usr/local]) + prefix=/usr/local + fi + fi + if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ + -o x"${exec_prefix_default}" = x"yes" ; then + if test x"${TCL_EXEC_PREFIX}" != x; then + AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) + exec_prefix=${TCL_EXEC_PREFIX} + else + AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) + exec_prefix=$prefix + fi + fi +]) + +#------------------------------------------------------------------------ +# TEA_SETUP_COMPILER_CC -- +# +# Do compiler checks the way we want. This is just a replacement +# for AC_PROG_CC in TEA configure.in files to make them cleaner. +# +# Arguments: +# none +# +# Results: +# +# Sets up CC var and other standard bits we need to make executables. +#------------------------------------------------------------------------ +AC_DEFUN([TEA_SETUP_COMPILER_CC], [ + # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) + # in this macro, they need to go into TEA_SETUP_COMPILER instead. + + # If the user did not set CFLAGS, set it now to keep + # the AC_PROG_CC macro from adding "-g -O2". + if test "${CFLAGS+set}" != "set" ; then + CFLAGS="" + fi + + AC_PROG_CC + AC_PROG_CPP + + AC_PROG_INSTALL + + #-------------------------------------------------------------------- + # Checks to see if the make program sets the $MAKE variable. + #-------------------------------------------------------------------- + + AC_PROG_MAKE_SET + + #-------------------------------------------------------------------- + # Find ranlib + #-------------------------------------------------------------------- + + AC_PROG_RANLIB + + #-------------------------------------------------------------------- + # Determines the correct binary file extension (.o, .obj, .exe etc.) + #-------------------------------------------------------------------- + + AC_OBJEXT + AC_EXEEXT +]) + +#------------------------------------------------------------------------ +# TEA_SETUP_COMPILER -- +# +# Do compiler checks that use the compiler. This must go after +# TEA_SETUP_COMPILER_CC, which does the actual compiler check. +# +# Arguments: +# none +# +# Results: +# +# Sets up CC var and other standard bits we need to make executables. +#------------------------------------------------------------------------ +AC_DEFUN([TEA_SETUP_COMPILER], [ + # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. + AC_REQUIRE([TEA_SETUP_COMPILER_CC]) + + #------------------------------------------------------------------------ + # If we're using GCC, see if the compiler understands -pipe. If so, use it. + # It makes compiling go faster. (This is only a performance feature.) + #------------------------------------------------------------------------ + + if test -z "$no_pipe" -a -n "$GCC"; then + AC_CACHE_CHECK([if the compiler understands -pipe], + tcl_cv_cc_pipe, [ + hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" + AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) + CFLAGS=$hold_cflags]) + if test $tcl_cv_cc_pipe = yes; then + CFLAGS="$CFLAGS -pipe" + fi + fi + + #-------------------------------------------------------------------- + # Common compiler flag setup + #-------------------------------------------------------------------- + + AC_C_BIGENDIAN + if test "${TEA_PLATFORM}" = "unix" ; then + TEA_TCL_LINK_LIBS + TEA_MISSING_POSIX_HEADERS + # Let the user call this, because if it triggers, they will + # need a compat/strtod.c that is correct. Users can also + # use Tcl_GetDouble(FromObj) instead. + #TEA_BUGGY_STRTOD + fi +]) + +#------------------------------------------------------------------------ +# TEA_MAKE_LIB -- +# +# Generate a line that can be used to build a shared/unshared library +# in a platform independent manner. +# +# Arguments: +# none +# +# Requires: +# +# Results: +# +# Defines the following vars: +# CFLAGS - Done late here to note disturb other AC macros +# MAKE_LIB - Command to execute to build the Tcl library; +# differs depending on whether or not Tcl is being +# compiled as a shared library. +# MAKE_SHARED_LIB Makefile rule for building a shared library +# MAKE_STATIC_LIB Makefile rule for building a static library +# MAKE_STUB_LIB Makefile rule for building a stub library +# VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL +# VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_MAKE_LIB], [ + if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then + MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" + MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" + AC_EGREP_CPP([manifest needed], [ +#if defined(_MSC_VER) && _MSC_VER >= 1400 +print("manifest needed") +#endif + ], [ + # Could do a CHECK_PROG for mt, but should always be with MSVC8+ + VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" + VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" + MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" + TEA_ADD_CLEANFILES([*.manifest]) + ]) + MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" + else + MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" + MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" + MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" + fi + + if test "${SHARED_BUILD}" = "1" ; then + MAKE_LIB="${MAKE_SHARED_LIB} " + else + MAKE_LIB="${MAKE_STATIC_LIB} " + fi + + #-------------------------------------------------------------------- + # Shared libraries and static libraries have different names. + # Use the double eval to make sure any variables in the suffix is + # substituted. (@@@ Might not be necessary anymore) + #-------------------------------------------------------------------- + + if test "${TEA_PLATFORM}" = "windows" ; then + if test "${SHARED_BUILD}" = "1" ; then + # We force the unresolved linking of symbols that are really in + # the private libraries of Tcl and Tk. + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" + if test x"${TK_BIN_DIR}" != x ; then + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" + fi + eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" + else + eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" + fi + # Some packages build their own stubs libraries + eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" + if test "$GCC" = "yes"; then + PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} + fi + # These aren't needed on Windows (either MSVC or gcc) + RANLIB=: + RANLIB_STUB=: + else + RANLIB_STUB="${RANLIB}" + if test "${SHARED_BUILD}" = "1" ; then + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" + if test x"${TK_BIN_DIR}" != x ; then + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" + fi + eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" + RANLIB=: + else + eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" + fi + # Some packages build their own stubs libraries + eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" + fi + + # These are escaped so that only CFLAGS is picked up at configure time. + # The other values will be substituted at make time. + CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" + if test "${SHARED_BUILD}" = "1" ; then + CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" + fi + + AC_SUBST(MAKE_LIB) + AC_SUBST(MAKE_SHARED_LIB) + AC_SUBST(MAKE_STATIC_LIB) + AC_SUBST(MAKE_STUB_LIB) + AC_SUBST(RANLIB_STUB) + AC_SUBST(VC_MANIFEST_EMBED_DLL) + AC_SUBST(VC_MANIFEST_EMBED_EXE) +]) + +#------------------------------------------------------------------------ +# TEA_LIB_SPEC -- +# +# Compute the name of an existing object library located in libdir +# from the given base name and produce the appropriate linker flags. +# +# Arguments: +# basename The base name of the library without version +# numbers, extensions, or "lib" prefixes. +# extra_dir Extra directory in which to search for the +# library. This location is used first, then +# $prefix/$exec-prefix, then some defaults. +# +# Requires: +# TEA_INIT and TEA_PREFIX must be called first. +# +# Results: +# +# Defines the following vars: +# ${basename}_LIB_NAME The computed library name. +# ${basename}_LIB_SPEC The computed linker flags. +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_LIB_SPEC], [ + AC_MSG_CHECKING([for $1 library]) + + # Look in exec-prefix for the library (defined by TEA_PREFIX). + + tea_lib_name_dir="${exec_prefix}/lib" + + # Or in a user-specified location. + + if test x"$2" != x ; then + tea_extra_lib_dir=$2 + else + tea_extra_lib_dir=NONE + fi + + for i in \ + `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ + `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ + `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ + `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ + `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ + `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ + `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ + `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ + `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ + `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do + if test -f "$i" ; then + tea_lib_name_dir=`dirname $i` + $1_LIB_NAME=`basename $i` + $1_LIB_PATH_NAME=$i + break + fi + done + + if test "${TEA_PLATFORM}" = "windows"; then + $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" + else + # Strip off the leading "lib" and trailing ".a" or ".so" + + tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` + $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" + fi + + if test "x${$1_LIB_NAME}" = x ; then + AC_MSG_ERROR([not found]) + else + AC_MSG_RESULT([${$1_LIB_SPEC}]) + fi +]) + +#------------------------------------------------------------------------ +# TEA_PRIVATE_TCL_HEADERS -- +# +# Locate the private Tcl include files +# +# Arguments: +# +# Requires: +# TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has +# already been called. +# +# Results: +# +# Substs the following vars: +# TCL_TOP_DIR_NATIVE +# TCL_INCLUDES +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ + # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} + AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) + AC_MSG_CHECKING([for Tcl private include files]) + + TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` + TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" + + # Check to see if tclPort.h isn't already with the public headers + # Don't look for tclInt.h because that resides with tcl.h in the core + # sources, but the Port headers are in a different directory + if test "${TEA_PLATFORM}" = "windows" -a \ + -f "${ac_cv_c_tclh}/tclWinPort.h"; then + result="private headers found with public headers" + elif test "${TEA_PLATFORM}" = "unix" -a \ + -f "${ac_cv_c_tclh}/tclUnixPort.h"; then + result="private headers found with public headers" + else + TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" + if test "${TEA_PLATFORM}" = "windows"; then + TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" + else + TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" + fi + # Overwrite the previous TCL_INCLUDES as this should capture both + # public and private headers in the same set. + # We want to ensure these are substituted so as not to require + # any *_NATIVE vars be defined in the Makefile + TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" + if test "`uname -s`" = "Darwin"; then + # If Tcl was built as a framework, attempt to use + # the framework's Headers and PrivateHeaders directories + case ${TCL_DEFS} in + *TCL_FRAMEWORK*) + if test -d "${TCL_BIN_DIR}/Headers" -a \ + -d "${TCL_BIN_DIR}/PrivateHeaders"; then + TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" + else + TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" + fi + ;; + esac + result="Using ${TCL_INCLUDES}" + else + if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then + AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) + fi + result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" + fi + fi + + AC_SUBST(TCL_TOP_DIR_NATIVE) + + AC_SUBST(TCL_INCLUDES) + AC_MSG_RESULT([${result}]) +]) + +#------------------------------------------------------------------------ +# TEA_PUBLIC_TCL_HEADERS -- +# +# Locate the installed public Tcl header files +# +# Arguments: +# None. +# +# Requires: +# CYGPATH must be set +# +# Results: +# +# Adds a --with-tclinclude switch to configure. +# Result is cached. +# +# Substs the following vars: +# TCL_INCLUDES +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ + AC_MSG_CHECKING([for Tcl public headers]) + + AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) + + AC_CACHE_VAL(ac_cv_c_tclh, [ + # Use the value from --with-tclinclude, if it was given + + if test x"${with_tclinclude}" != x ; then + if test -f "${with_tclinclude}/tcl.h" ; then + ac_cv_c_tclh=${with_tclinclude} + else + AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) + fi + else + list="" + if test "`uname -s`" = "Darwin"; then + # If Tcl was built as a framework, attempt to use + # the framework's Headers directory + case ${TCL_DEFS} in + *TCL_FRAMEWORK*) + list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" + ;; + esac + fi + + # Look in the source dir only if Tcl is not installed, + # and in that situation, look there before installed locations. + if test -f "${TCL_BIN_DIR}/Makefile" ; then + list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" + fi + + # Check order: pkg --prefix location, Tcl's --prefix location, + # relative to directory of tclConfig.sh. + + eval "temp_includedir=${includedir}" + list="$list \ + `ls -d ${temp_includedir} 2>/dev/null` \ + `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ + `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" + if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then + list="$list /usr/local/include /usr/include" + if test x"${TCL_INCLUDE_SPEC}" != x ; then + d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` + list="$list `ls -d ${d} 2>/dev/null`" + fi + fi + for i in $list ; do + if test -f "$i/tcl.h" ; then + ac_cv_c_tclh=$i + break + fi + done + fi + ]) + + # Print a message based on how we determined the include path + + if test x"${ac_cv_c_tclh}" = x ; then + AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) + else + AC_MSG_RESULT([${ac_cv_c_tclh}]) + fi + + # Convert to a native path and substitute into the output files. + + INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` + + TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" + + AC_SUBST(TCL_INCLUDES) +]) + +#------------------------------------------------------------------------ +# TEA_PRIVATE_TK_HEADERS -- +# +# Locate the private Tk include files +# +# Arguments: +# +# Requires: +# TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has +# already been called. +# +# Results: +# +# Substs the following vars: +# TK_INCLUDES +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ + # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} + AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) + AC_MSG_CHECKING([for Tk private include files]) + + TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` + TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" + + # Check to see if tkPort.h isn't already with the public headers + # Don't look for tkInt.h because that resides with tk.h in the core + # sources, but the Port headers are in a different directory + if test "${TEA_PLATFORM}" = "windows" -a \ + -f "${ac_cv_c_tkh}/tkWinPort.h"; then + result="private headers found with public headers" + elif test "${TEA_PLATFORM}" = "unix" -a \ + -f "${ac_cv_c_tkh}/tkUnixPort.h"; then + result="private headers found with public headers" + else + TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" + TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" + if test "${TEA_PLATFORM}" = "windows"; then + TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" + else + TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" + fi + # Overwrite the previous TK_INCLUDES as this should capture both + # public and private headers in the same set. + # We want to ensure these are substituted so as not to require + # any *_NATIVE vars be defined in the Makefile + TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" + # Detect and add ttk subdir + if test -d "${TK_SRC_DIR}/generic/ttk"; then + TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" + fi + if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then + TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" + fi + if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then + TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" + fi + if test "`uname -s`" = "Darwin"; then + # If Tk was built as a framework, attempt to use + # the framework's Headers and PrivateHeaders directories + case ${TK_DEFS} in + *TK_FRAMEWORK*) + if test -d "${TK_BIN_DIR}/Headers" -a \ + -d "${TK_BIN_DIR}/PrivateHeaders"; then + TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" + else + TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" + fi + ;; + esac + result="Using ${TK_INCLUDES}" + else + if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then + AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) + fi + result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" + fi + fi + + AC_SUBST(TK_TOP_DIR_NATIVE) + AC_SUBST(TK_XLIB_DIR_NATIVE) + + AC_SUBST(TK_INCLUDES) + AC_MSG_RESULT([${result}]) +]) + +#------------------------------------------------------------------------ +# TEA_PUBLIC_TK_HEADERS -- +# +# Locate the installed public Tk header files +# +# Arguments: +# None. +# +# Requires: +# CYGPATH must be set +# +# Results: +# +# Adds a --with-tkinclude switch to configure. +# Result is cached. +# +# Substs the following vars: +# TK_INCLUDES +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ + AC_MSG_CHECKING([for Tk public headers]) + + AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) + + AC_CACHE_VAL(ac_cv_c_tkh, [ + # Use the value from --with-tkinclude, if it was given + + if test x"${with_tkinclude}" != x ; then + if test -f "${with_tkinclude}/tk.h" ; then + ac_cv_c_tkh=${with_tkinclude} + else + AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) + fi + else + list="" + if test "`uname -s`" = "Darwin"; then + # If Tk was built as a framework, attempt to use + # the framework's Headers directory. + case ${TK_DEFS} in + *TK_FRAMEWORK*) + list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" + ;; + esac + fi + + # Look in the source dir only if Tk is not installed, + # and in that situation, look there before installed locations. + if test -f "${TK_BIN_DIR}/Makefile" ; then + list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" + fi + + # Check order: pkg --prefix location, Tk's --prefix location, + # relative to directory of tkConfig.sh, Tcl's --prefix location, + # relative to directory of tclConfig.sh. + + eval "temp_includedir=${includedir}" + list="$list \ + `ls -d ${temp_includedir} 2>/dev/null` \ + `ls -d ${TK_PREFIX}/include 2>/dev/null` \ + `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ + `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ + `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" + if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then + list="$list /usr/local/include /usr/include" + if test x"${TK_INCLUDE_SPEC}" != x ; then + d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` + list="$list `ls -d ${d} 2>/dev/null`" + fi + fi + for i in $list ; do + if test -f "$i/tk.h" ; then + ac_cv_c_tkh=$i + break + fi + done + fi + ]) + + # Print a message based on how we determined the include path + + if test x"${ac_cv_c_tkh}" = x ; then + AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) + else + AC_MSG_RESULT([${ac_cv_c_tkh}]) + fi + + # Convert to a native path and substitute into the output files. + + INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` + + TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" + + AC_SUBST(TK_INCLUDES) + + if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then + # On Windows and Aqua, we need the X compat headers + AC_MSG_CHECKING([for X11 header files]) + if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then + INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" + TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" + AC_SUBST(TK_XINCLUDES) + fi + AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) + fi +]) + +#------------------------------------------------------------------------ +# TEA_PATH_CONFIG -- +# +# Locate the ${1}Config.sh file and perform a sanity check on +# the ${1} compile flags. These are used by packages like +# [incr Tk] that load *Config.sh files from more than Tcl and Tk. +# +# Arguments: +# none +# +# Results: +# +# Adds the following arguments to configure: +# --with-$1=... +# +# Defines the following vars: +# $1_BIN_DIR Full path to the directory containing +# the $1Config.sh file +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_PATH_CONFIG], [ + # + # Ok, lets find the $1 configuration + # First, look for one uninstalled. + # the alternative search directory is invoked by --with-$1 + # + + if test x"${no_$1}" = x ; then + # we reset no_$1 in case something fails here + no_$1=true + AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) + AC_MSG_CHECKING([for $1 configuration]) + AC_CACHE_VAL(ac_cv_c_$1config,[ + + # First check to see if --with-$1 was specified. + if test x"${with_$1config}" != x ; then + case ${with_$1config} in + */$1Config.sh ) + if test -f ${with_$1config}; then + AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) + with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` + fi;; + esac + if test -f "${with_$1config}/$1Config.sh" ; then + ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` + else + AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) + fi + fi + + # then check for a private $1 installation + if test x"${ac_cv_c_$1config}" = x ; then + for i in \ + ../$1 \ + `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ + `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ + `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ + ../../$1 \ + `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ + `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ + `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ + ../../../$1 \ + `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ + `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ + `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ + ${srcdir}/../$1 \ + `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ + `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ + `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ + ; do + if test -f "$i/$1Config.sh" ; then + ac_cv_c_$1config=`(cd $i; pwd)` + break + fi + if test -f "$i/unix/$1Config.sh" ; then + ac_cv_c_$1config=`(cd $i/unix; pwd)` + break + fi + done + fi + + # check in a few common install locations + if test x"${ac_cv_c_$1config}" = x ; then + for i in `ls -d ${libdir} 2>/dev/null` \ + `ls -d ${exec_prefix}/lib 2>/dev/null` \ + `ls -d ${prefix}/lib 2>/dev/null` \ + `ls -d /usr/local/lib 2>/dev/null` \ + `ls -d /usr/contrib/lib 2>/dev/null` \ + `ls -d /usr/lib 2>/dev/null` \ + `ls -d /usr/lib64 2>/dev/null` \ + ; do + if test -f "$i/$1Config.sh" ; then + ac_cv_c_$1config=`(cd $i; pwd)` + break + fi + done + fi + ]) + + if test x"${ac_cv_c_$1config}" = x ; then + $1_BIN_DIR="# no $1 configs found" + AC_MSG_WARN([Cannot find $1 configuration definitions]) + exit 0 + else + no_$1= + $1_BIN_DIR=${ac_cv_c_$1config} + AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) + fi + fi +]) + +#------------------------------------------------------------------------ +# TEA_LOAD_CONFIG -- +# +# Load the $1Config.sh file +# +# Arguments: +# +# Requires the following vars to be set: +# $1_BIN_DIR +# +# Results: +# +# Subst the following vars: +# $1_SRC_DIR +# $1_LIB_FILE +# $1_LIB_SPEC +# +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_LOAD_CONFIG], [ + AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) + + if test -f "${$1_BIN_DIR}/$1Config.sh" ; then + AC_MSG_RESULT([loading]) + . "${$1_BIN_DIR}/$1Config.sh" + else + AC_MSG_RESULT([file not found]) + fi + + # + # If the $1_BIN_DIR is the build directory (not the install directory), + # then set the common variable name to the value of the build variables. + # For example, the variable $1_LIB_SPEC will be set to the value + # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC + # instead of $1_BUILD_LIB_SPEC since it will work with both an + # installed and uninstalled version of Tcl. + # + + if test -f "${$1_BIN_DIR}/Makefile" ; then + AC_MSG_WARN([Found Makefile - using build library specs for $1]) + $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} + $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} + $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} + $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} + $1_LIBRARY_PATH=${$1_LIBRARY_PATH} + fi + + AC_SUBST($1_VERSION) + AC_SUBST($1_BIN_DIR) + AC_SUBST($1_SRC_DIR) + + AC_SUBST($1_LIB_FILE) + AC_SUBST($1_LIB_SPEC) + + AC_SUBST($1_STUB_LIB_FILE) + AC_SUBST($1_STUB_LIB_SPEC) + AC_SUBST($1_STUB_LIB_PATH) + + # Allow the caller to prevent this auto-check by specifying any 2nd arg + AS_IF([test "x$2" = x], [ + # Check both upper and lower-case variants + # If a dev wanted non-stubs libs, this function could take an option + # to not use _STUB in the paths below + AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], + [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], + [TEA_LOAD_CONFIG_LIB($1_STUB)]) + ]) +]) + +#------------------------------------------------------------------------ +# TEA_LOAD_CONFIG_LIB -- +# +# Helper function to load correct library from another extension's +# ${PACKAGE}Config.sh. +# +# Results: +# Adds to LIBS the appropriate extension library +# +#------------------------------------------------------------------------ +AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ + AC_MSG_CHECKING([For $1 library for LIBS]) + # This simplifies the use of stub libraries by automatically adding + # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, + # but this is called before CONFIG_CFLAGS. More importantly, this adds + # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. + if test "x${$1_LIB_SPEC}" != "x" ; then + if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then + TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) + AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) + else + TEA_ADD_LIBS([${$1_LIB_SPEC}]) + AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) + fi + else + AC_MSG_RESULT([file not found]) + fi +]) + +#------------------------------------------------------------------------ +# TEA_EXPORT_CONFIG -- +# +# Define the data to insert into the ${PACKAGE}Config.sh file +# +# Arguments: +# +# Requires the following vars to be set: +# $1 +# +# Results: +# Subst the following vars: +# +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_EXPORT_CONFIG], [ + #-------------------------------------------------------------------- + # These are for $1Config.sh + #-------------------------------------------------------------------- + + # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) + eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" + if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then + eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" + eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" + else + eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" + eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" + fi + $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" + $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" + $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" + $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" + $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" + $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" + + AC_SUBST($1_BUILD_LIB_SPEC) + AC_SUBST($1_LIB_SPEC) + AC_SUBST($1_BUILD_STUB_LIB_SPEC) + AC_SUBST($1_STUB_LIB_SPEC) + AC_SUBST($1_BUILD_STUB_LIB_PATH) + AC_SUBST($1_STUB_LIB_PATH) + + AC_SUBST(MAJOR_VERSION) + AC_SUBST(MINOR_VERSION) + AC_SUBST(PATCHLEVEL) +]) + + +#------------------------------------------------------------------------ +# TEA_PATH_CELIB -- +# +# Locate Keuchel's celib emulation layer for targeting Win/CE +# +# Arguments: +# none +# +# Results: +# +# Adds the following arguments to configure: +# --with-celib=... +# +# Defines the following vars: +# CELIB_DIR Full path to the directory containing +# the include and platform lib files +#------------------------------------------------------------------------ + +AC_DEFUN([TEA_PATH_CELIB], [ + # First, look for one uninstalled. + # the alternative search directory is invoked by --with-celib + + if test x"${no_celib}" = x ; then + # we reset no_celib in case something fails here + no_celib=true + AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) + AC_MSG_CHECKING([for Windows/CE celib directory]) + AC_CACHE_VAL(ac_cv_c_celibconfig,[ + # First check to see if --with-celibconfig was specified. + if test x"${with_celibconfig}" != x ; then + if test -d "${with_celibconfig}/inc" ; then + ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` + else + AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) + fi + fi + + # then check for a celib library + if test x"${ac_cv_c_celibconfig}" = x ; then + for i in \ + ../celib-palm-3.0 \ + ../celib \ + ../../celib-palm-3.0 \ + ../../celib \ + `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ + ${srcdir}/../celib-palm-3.0 \ + ${srcdir}/../celib \ + `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ + ; do + if test -d "$i/inc" ; then + ac_cv_c_celibconfig=`(cd $i; pwd)` + break + fi + done + fi + ]) + if test x"${ac_cv_c_celibconfig}" = x ; then + AC_MSG_ERROR([Cannot find celib support library directory]) + else + no_celib= + CELIB_DIR=${ac_cv_c_celibconfig} + CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` + AC_MSG_RESULT([found $CELIB_DIR]) + fi + fi +]) + + +# Local Variables: +# mode: autoconf +# End: diff --git a/src/tclkit86bi.vfs/lib/critcl-bitmap1.1/bitmap.tcl b/src/tclkit86bi.vfs/lib/critcl-bitmap1.1/bitmap.tcl new file mode 100644 index 00000000..45d19224 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-bitmap1.1/bitmap.tcl @@ -0,0 +1,227 @@ +## -*- tcl -*- +# # ## ### ##### ######## ############# ##################### +# Pragmas for MetaData Scanner. +# n/a + +# CriTcl Utility Package for bitmap en- and decoder. +# Based on i-assoc. + +package provide critcl::bitmap 1.1 + +# # ## ### ##### ######## ############# ##################### +## Requirements. + +package require Tcl 8.6 ; # Min supported version. +package require critcl 3.2 +package require critcl::iassoc + +namespace eval ::critcl::bitmap {} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Embed C Code + +proc critcl::bitmap::def {name dict {exclusions {}}} { + # dict: Tcl symbolic name -> (C bit-mask (1)) + # + # (Ad 1) Can be numeric, or symbolic, as long as it is a C int + # expression in the end. + # + # (Ad exclusions) + # Excluded bit-masks cannot be converted back to Tcl + # symbols. These are usually masks with multiple bits + # set. Conversion back delivers the individual elements + # instead of the combined mask. + # + # If no exclusions are specified the generated code is + # simpler, i.e. not containing anything for dealing with + # exclusions at runtime. + + # For the C level opt array we want the elements sorted alphabetically. + set symbols [lsort -dict [dict keys $dict]] + set i 0 + foreach s $symbols { + set id($s) $i + incr i + } + set last $i + + set hasexcl [llength $exclusions] + set excl {} + foreach e $exclusions { + dict set excl $e . + } + + dict for {sym mask} $dict { + set receivable [expr {![dict exists $excl $mask]}] + + set map [list @ID@ $id($sym) @SYM@ $sym @MASK@ $mask @RECV@ $receivable] + + if {$hasexcl} { + append init \n[critcl::at::here!][string map $map { + data->c [@ID@] = "@SYM@"; + data->mask [@ID@] = @MASK@; + data->recv [@ID@] = @RECV@; + data->tcl [@ID@] = Tcl_NewStringObj ("@SYM@", -1); + Tcl_IncrRefCount (data->tcl [@ID@]); + }] + } else { + append init \n[critcl::at::here!][string map $map { + data->c [@ID@] = "@SYM@"; + data->mask [@ID@] = @MASK@; + data->tcl [@ID@] = Tcl_NewStringObj ("@SYM@", -1); + Tcl_IncrRefCount (data->tcl [@ID@]); + }] + } + + append final \n[critcl::at::here!][string map $map { + Tcl_DecrRefCount (data->tcl [@ID@]); + }] + } + append init \n " data->c \[$last\] = NULL;" + + lappend map @NAME@ $name + lappend map @UNAME@ [string toupper $name] + lappend map @LAST@ $last + + # I. Generate a header file for inclusion by other parts of the + # package, i.e. csources. Include the header here as well, for + # the following blocks of code. + # + # Declaration of the en- and decoder functions. + + critcl::include [critcl::make ${name}.h \n[critcl::at::here!][string map $map { + #ifndef @NAME@_HEADER + #define @NAME@_HEADER + + /* Encode a flag list into the corresponding bitset */ + extern int + @NAME@_encode (Tcl_Interp* interp, + Tcl_Obj* flags, + int* result); + + /* Decode a bitset into the corresponding flag list */ + extern Tcl_Obj* + @NAME@_decode (Tcl_Interp* interp, + int mask); + + #endif + }]] + + # II: Generate the interp association holding the various + # conversion maps. + + if {$hasexcl} { + critcl::iassoc def ${name}_iassoc {} \n[critcl::at::here!][string map $map { + const char* c [@LAST@+1]; /* Bit name, C string */ + Tcl_Obj* tcl [@LAST@]; /* Bit name, Tcl_Obj*, sharable */ + int mask [@LAST@]; /* Bit mask */ + int recv [@LAST@]; /* Flag, true for receivable event */ + }] $init $final + } else { + critcl::iassoc def ${name}_iassoc {} \n[critcl::at::here!][string map $map { + const char* c [@LAST@+1]; /* Bit name, C string */ + Tcl_Obj* tcl [@LAST@]; /* Bit name, Tcl_Obj*, sharable */ + int mask [@LAST@]; /* Bit mask */ + }] $init $final + } + + # III: Generate encoder function: Conversion of list of flag names + # into corresponding bitset. + + critcl::ccode \n[critcl::at::here!][string map $map { + int + @NAME@_encode (Tcl_Interp* interp, + Tcl_Obj* flags, + int* result) + { + @NAME@_iassoc_data context = @NAME@_iassoc (interp); + int mask, lc, i, id; + Tcl_Obj** lv; + + if (Tcl_ListObjGetElements (interp, flags, &lc, &lv) != TCL_OK) { + return TCL_ERROR; + } + + mask = 0; + for (i = 0; i < lc; i++) { + if (Tcl_GetIndexFromObj (interp, lv[i], context->c, "@NAME@", 0, + &id) != TCL_OK) { + Tcl_SetErrorCode (interp, "@UNAME@", "FLAG", NULL); + return TCL_ERROR; + } + mask |= context->mask [id]; + } + + *result = mask; + return TCL_OK; + } + }] + + # IV: Generate decoder function: Convert bitset into the + # corresponding list of flag names. + + if {$hasexcl} { + critcl::ccode \n[critcl::at::here!][string map $map { + Tcl_Obj* + @NAME@_decode (Tcl_Interp* interp, int mask) + { + int i; + @NAME@_iassoc_data context = @NAME@_iassoc (interp); + Tcl_Obj* res = Tcl_NewListObj (0, NULL); + + for (i = 0; i < @LAST@; i++) { + if (!context->recv[i]) continue; + if (!(mask & context->mask[i])) continue; + (void) Tcl_ListObjAppendElement (interp, res, context->tcl [i]); + } + return res; + } + }] + } else { + critcl::ccode \n[critcl::at::here!][string map $map { + Tcl_Obj* + @NAME@_decode (Tcl_Interp* interp, int mask) + { + int i; + @NAME@_iassoc_data context = @NAME@_iassoc (interp); + Tcl_Obj* res = Tcl_NewListObj (0, NULL); + + for (i = 0; i < @LAST@; i++) { + if (!(mask & context->mask[i])) continue; + (void) Tcl_ListObjAppendElement (interp, res, context->tcl [i]); + } + return res; + } + }] + } + + # V. Define convenient argument- and result-type definitions + # wrapping the de- and encoder functions for use by cprocs. + + critcl::argtype $name \n[critcl::at::here!][string map $map { + if (@NAME@_encode (interp, @@, &@A) != TCL_OK) return TCL_ERROR; + }] int int + + critcl::resulttype $name \n[critcl::at::here!][string map $map { + /* @NAME@_decode result is 0-refcount */ + Tcl_SetObjResult (interp, @NAME@_decode (interp, rv)); + return TCL_OK; + }] int +} + +# # ## ### ##### ######## ############# ##################### +## Export API + +namespace eval ::critcl::bitmap { + namespace export def + catch { namespace ensemble create } +} + +namespace eval ::critcl { + namespace export bitmap + catch { namespace ensemble create } +} + +# # ## ### ##### ######## ############# ##################### +## Ready +return diff --git a/src/tclkit86bi.vfs/lib/critcl-bitmap1.1/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl-bitmap1.1/pkgIndex.tcl new file mode 100644 index 00000000..3aba7f9e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-bitmap1.1/pkgIndex.tcl @@ -0,0 +1,2 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl::bitmap 1.1 [list source [file join $dir bitmap.tcl]] diff --git a/src/tclkit86bi.vfs/lib/critcl-class1.2/class.h b/src/tclkit86bi.vfs/lib/critcl-class1.2/class.h new file mode 100644 index 00000000..d80dab67 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-class1.2/class.h @@ -0,0 +1,468 @@ +/* + * For package "@package@". + * Implementation of Tcl Class "@class@". + * + * Flags: @buildflags@ + */ + +#ifndef @stem@_IMPLEMENTATION +#define @stem@_IMPLEMENTATION (1) +/* # # ## ### ##### ######## ############# ##################### */ + +@includes@ +#line 14 "class.h" +/* + * Instance method names and enumeration. + */ + +static CONST char* @stem@_methodnames [] = { +@method_names@ +#line 21 "class.h" + NULL +}; + +typedef enum @stem@_methods { +@method_enumeration@ +#line 27 "class.h" +} @stem@_methods; + +/* + * Class method names and enumeration. + */ + +static CONST char* @stem@_class_methodnames [] = { + "create", + "new",@class_method_names@ +#line 37 "class.h" + NULL +}; + +typedef enum @stem@_classmethods { + @stem@_CM_create, + @stem@_CM_new@class_method_enumeration@ +#line 44 "class.h" +} @stem@_classmethods; + +/* + * Class structures I. Class variables. + */ + +typedef struct @classtype@__ { +@ctypedecl@ +#line 53 "class.h" +} @classtype@__; +typedef struct @classtype@__* @classtype@; + +/* + * Class structures II. Creation management. + */ + +typedef struct @classtype@_mgr_ { +@classmgrstruct@ +#line 63 "class.h" + @classtype@__ user; /* User-specified class variables */ +} @classtype@_mgr_; +typedef struct @classtype@_mgr_* @classtype@_mgr; + +/* + * Instance structure. + */ + +@itypedecl@ +#line 73 "class.h" + +/* # # ## ### ##### ######## User: General support */ +@support@ +#line 77 "class.h" +/* # # ## ### ##### ######## */ + +/* + * Class support functions. + */ + +static void +@stem@_ClassRelease (ClientData cd, Tcl_Interp* interp) +{ + @classtype@_mgr classmgr = (@classtype@_mgr) cd; + @classtype@ class = &classmgr->user; + @classdestructor@ +#line 90 "class.h" + ckfree((char*) cd); +} + +static @classtype@_mgr +@stem@_Class (Tcl_Interp* interp) +{ +#define KEY "@package@/@class@" + + Tcl_InterpDeleteProc* proc = @stem@_ClassRelease; + @classtype@_mgr classmgr; + @classtype@ class; + + classmgr = Tcl_GetAssocData (interp, KEY, &proc); + if (classmgr) { + return classmgr; + } + + classmgr = (@classtype@_mgr) ckalloc (sizeof (@classtype@_mgr_)); +@classmgrsetup@ +#line 110 "class.h" + class = &classmgr->user; + + @classconstructor@ +#line 114 "class.h" + + Tcl_SetAssocData (interp, KEY, proc, (ClientData) classmgr); + return classmgr; + error: + ckfree ((char*) classmgr); + return NULL; +#undef KEY +} +@classmgrnin@ +#line 124 "class.h" +/* # # ## ### ##### ######## */ + +static @instancetype@ +@stem@_Constructor (Tcl_Interp* interp, + @classtype@ class, + int objcskip, + int objc, + Tcl_Obj*const* objv) +{ +@ivardecl@; + /* # # ## ### ##### ######## User: Constructor */ + @constructor@ +#line 137 "class.h" + /* # # ## ### ##### ######## */ + return instance; +@ivarerror@; +#line 141 "class.h" +} + +static void +@stem@_PostConstructor (Tcl_Interp* interp, + @instancetype@ instance, + Tcl_Command cmd, + Tcl_Obj* fqn) +{ + /* # # ## ### ##### ######## User: Post Constructor */ + @postconstructor@ +#line 152 "class.h" + /* # # ## ### ##### ######## */ +} + +static void +@stem@_Destructor (ClientData clientData) +{ + @instancetype@ instance = (@instancetype@) clientData; + /* # # ## ### ##### ######## User: Destructor */ + @destructor@ +#line 162 "class.h" + /* # # ## ### ##### ######## */ +@ivarrelease@; +#line 165 "class.h" +} + +/* # # ## ### ##### ######## User: Methods */ +@method_implementations@ +#line 170 "class.h" +/* # # ## ### ##### ######## */ + +/* + * Instance command, method dispatch + */ + +static int +@stem@_InstanceCommand (ClientData clientData, + Tcl_Interp* interp, + int objc, + Tcl_Obj* CONST* objv) +{ + @instancetype@ instance = (@instancetype@) clientData; + int mcode; + + if (objc < 2) { + Tcl_WrongNumArgs (interp, objc, objv, "option ?arg arg ...?"); + return TCL_ERROR; + } else if (Tcl_GetIndexFromObj (interp, objv [1], + (const char**) @stem@_methodnames, + "option", 0, &mcode) != TCL_OK) { + return TCL_ERROR; + } + + /* + * Dispatch to methods. They check the #args in detail before performing + * the requested functionality + */ + + switch ((@stem@_methods) mcode) { +@method_dispatch@ +#line 202 "class.h" + } + /* Not coming to this place */ + return TCL_ERROR; +} + +@cconscmd@ +#line 209 "class.h" +@capiclassvaraccess@ +#line 211 "class.h" +@tclconscmd@ +#line 213 "class.h" +/* # # ## ### ##### ######## User: Class Methods */ +@class_method_implementations@ +#line 216 "class.h" +@classcommand@ +#line 218 "class.h" +/* # # ## ### ##### ######## ############# ##################### */ +#endif /* @stem@_IMPLEMENTATION */ + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ + +#line 230 "class.h" + const char* name; /* Class name, for debugging */ + long int counter; /* Id generation counter */ + char buf [sizeof("@class@")+20]; /* Stash for the auto-generated object names. */ + + classmgr->name = "@stem@"; + classmgr->counter = 0; + +#line 238 "class.h" +static CONST char* +@stem@_NewInstanceName (@classtype@_mgr classmgr) +{ + classmgr->counter ++; + sprintf (classmgr->buf, "@class@%ld", classmgr->counter); + return classmgr->buf; +} + +#line 247 "class.h" +/* # # ## ### ##### ######## */ +/* + * Tcl API :: Class command, class method, especially instance construction. + */ + +int +@stem@_ClassCommand (ClientData clientData, + Tcl_Interp* interp, + int objc, + Tcl_Obj* CONST* objv) +{ + @classtype@_mgr classmgr; + @classtype@ class; + int mcode; + + if (objc < 2) { + Tcl_WrongNumArgs (interp, 0, objv, "method ?args...?"); + return TCL_ERROR; + } + + if (Tcl_GetIndexFromObj (interp, objv [1], + (const char**) @stem@_class_methodnames, + "option", 0, &mcode) != TCL_OK) { + return TCL_ERROR; + } + + classmgr = @stem@_Class (interp); + if (!classmgr) { + return TCL_ERROR; + } + class = &classmgr->user; + + /* + * Dispatch to methods. They check the #args in detail before performing + * the requested functionality + */ + + switch ((@stem@_classmethods) mcode) { + case @stem@_CM_create: return @stem@_CM_createCmd (classmgr, interp, objc, objv); break; + case @stem@_CM_new: return @stem@_CM_newCmd (classmgr, interp, objc, objv); break;@class_method_dispatch@ +#line 288 "class.h" + } + /* Not coming to this place */ + return TCL_ERROR; +} + +#line 294 "class.h" +/* # # ## ### ##### ########: Predefined class methods */ +static int +@stem@_NewInstance (const char* name, + @classtype@_mgr classmgr, + Tcl_Interp* interp, + int objcskip, + int objc, + Tcl_Obj* CONST* objv) +{ + @instancetype@ instance; + Tcl_Obj* fqn; + Tcl_CmdInfo ci; + Tcl_Command cmd; + + /* + * Compute the fully qualified command name to use, putting + * the command into the current namespace if necessary. + */ + + if (!Tcl_StringMatch (name, "::*")) { + /* Relative name. Prefix with current namespace */ + + Tcl_Eval (interp, "namespace current"); + fqn = Tcl_GetObjResult (interp); + fqn = Tcl_DuplicateObj (fqn); + Tcl_IncrRefCount (fqn); + + if (!Tcl_StringMatch (Tcl_GetString (fqn), "::")) { + Tcl_AppendToObj (fqn, "::", -1); + } + Tcl_AppendToObj (fqn, name, -1); + } else { + fqn = Tcl_NewStringObj (name, -1); + Tcl_IncrRefCount (fqn); + } + Tcl_ResetResult (interp); + + /* + * Check if the commands exists already, and bail out if so. + * We will not overwrite an existing command. + */ + + if (Tcl_GetCommandInfo (interp, Tcl_GetString (fqn), &ci)) { + Tcl_Obj* err; + + err = Tcl_NewObj (); + Tcl_AppendToObj (err, "command \"", -1); + Tcl_AppendObjToObj (err, fqn); + Tcl_AppendToObj (err, "\" already exists, unable to create @class@ instance", -1); + + Tcl_DecrRefCount (fqn); + Tcl_SetObjResult (interp, err); + return TCL_ERROR; + } + + /* + * Construct instance state, and command. + */ + + instance = @stem@_Constructor (interp, &classmgr->user, objcskip, objc, objv); + if (!instance) { + return TCL_ERROR; + } + + cmd = Tcl_CreateObjCommand (interp, Tcl_GetString (fqn), + @stem@_InstanceCommand, + (ClientData) instance, + @stem@_Destructor); + + @stem@_PostConstructor (interp, instance, cmd, fqn); + + Tcl_SetObjResult (interp, fqn); + Tcl_DecrRefCount (fqn); + return TCL_OK; +} + +static int +@stem@_CM_createCmd (@classtype@_mgr classmgr, + Tcl_Interp* interp, + int objc, + Tcl_Obj* CONST* objv) +{ + /* create ... */ + char* name; + + if (objc < 3) { + Tcl_WrongNumArgs (interp, 1, objv, "name ?args...?"); + return TCL_ERROR; + } + + name = Tcl_GetString (objv [2]); + + objc -= 3; + objv += 3; + + return @stem@_NewInstance (name, classmgr, interp, 3, objc, objv); +} + +static int +@stem@_CM_newCmd (@classtype@_mgr classmgr, + Tcl_Interp* interp, + int objc, + Tcl_Obj* CONST* objv) +{ + /* new ... */ + const char* name; + + if (objc < 2) { + Tcl_WrongNumArgs (interp, 1, objv, "?args...?"); + return TCL_ERROR; + } + + objc -= 2; + objv += 2; + + name = @stem@_NewInstanceName (classmgr); + return @stem@_NewInstance (name, classmgr, interp, 2, objc, objv); +} + +#line 414 "class.h" +/* # # ## ### ##### ######## */ +/* + * C API :: Instance (de)construction, dispatch + */ + +typedef struct @instancetype@__ @capiprefix@; +typedef struct @capiprefix@* @capiprefix@_p; + +@capiprefix@_p +@capiprefix@_new (Tcl_Interp* interp, + int objc, + Tcl_Obj* CONST* objv) +{ + @classtype@_mgr classmgr = @stem@_Class (interp); + @instancetype@ instance; + + /* + * Construct instance state + */ + + instance = @stem@_Constructor (interp, &classmgr->user, 0, objc, objv); + if (!instance) { + return NULL; + } + + @stem@_PostConstructor (interp, instance, 0, 0); + + return (@capiprefix@_p) instance; +} + +void +@capiprefix@_destroy (@capiprefix@_p instance) +{ + @stem@_Destructor (instance); +} + +int +@capiprefix@_invoke (@capiprefix@_p instance, + Tcl_Interp* interp, + int objc, + Tcl_Obj* CONST* objv) +{ + Tcl_Obj** v = (Tcl_Obj**) ckalloc ((objc+1)*sizeof (Tcl_Obj*)); + Tcl_Obj* i = Tcl_NewStringObj ("@capiprefix@", sizeof ("@capiprefix@")-1); + Tcl_IncrRefCount (i); + + v[0] = i; + memcpy (v+1, objv, objc * sizeof (Tcl_Obj*)); + + int r = @stem@_InstanceCommand (instance, interp, objc+1, v); + + Tcl_DecrRefCount (i); + ckfree ((char*) v); + return r; +} diff --git a/src/tclkit86bi.vfs/lib/critcl-class1.2/class.tcl b/src/tclkit86bi.vfs/lib/critcl-class1.2/class.tcl new file mode 100644 index 00000000..eeca9a37 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-class1.2/class.tcl @@ -0,0 +1,1171 @@ +## -*- tcl -*- +# # ## ### ##### ######## ############# ##################### +# Pragmas for MetaData Scanner. +# @mdgen OWNER: class.h + +# CriTcl Utility Commands. Specification of a command representing a +# class made easy, with code for object command and method dispatch +# generated. + +package provide critcl::class 1.2 + +# # ## ### ##### ######## ############# ##################### +## Requirements. + +package require Tcl 8.6 ; # Min supported version. +package require critcl 3.1.17 ; # Need 'meta?' to get the package name. + # Need 'name2c' returning 4 values. + # Need 'Deline' helper. + # Need cproc -tracename +package require critcl::util ; # Use the package's Get/Put commands. + +namespace eval ::critcl::class {} + +# # ## ### ##### ######## ############# ##################### +## API: Generate the declaration and implementation files for the class. + +proc ::critcl::class::define {classname script} { + variable state + + # Structure of the specification database + # + # TODO: Separate the spec::Process results from the template placeholders. + # TODO: Explain the various keys + # + # NOTE: All toplevel keys go into the map + # used to configure the template file (class.h). + # See `GenerateCode` and `MakeMap`. + # + # The various `Process*` procedures are responsible + # for converting the base specification delivered by + # `spec::Process` into the placeholders expected by + # template + ## + # state = dict << + # tcl-api -> bool + # c-api -> bool + # capiprefix -> string + # buildflags -> string + # classmgrstruct -> string + # classmgrsetup -> string + # classmgrnin -> string + # classcommand -> string + # tclconscmd -> string + # package -> string + # class -> string + # stem -> string + # classtype -> string (C type class structure) + # (class)method -> dict << + # names -> list (string) + # def -> (name) -> << + # enum + # case + # code + # syntax + # >> + # typedef -> ^instancetype + # menum -> + # typekey -> + # prefix -> ''|'class_' (see *1*) + # startn -> + # starte -> + # >> + # (class)variable -> dict << + # names -> list (string) + # def -> (name) -> << + # ctype -> + # loc -> + # comment -> + # >> + # >> + # stop -> bool|presence + # includes -> string (C code fragment) + # include -> + # instancetype -> + # ivardecl -> string (C code fragment) + # ivarrelease -> string (C code fragment) + # ivarerror -> string (C code fragment) + # itypedecl -> string (C code fragment, instance type) + # ctypedecl -> string (C code fragment, class type) + # *1*, (class_)method.prefix use + # (class_)method_names + # (class_)method_enumeration + # (class_)method_dispatch + # (class_)method_implementations + # >> + + catch { unset state } + + # Arguments: + # - name of the Tcl command representing the class. + # May contain namespace qualifiers. Represented by a ccommand. + # - script specifying the state structure and methods. + + #puts "=== |$classname|" + #puts "--- $script" + + # Pull the package we are working on out of the system. + + set package [critcl::meta? name] + set qpackage [expr {[string match ::* $package] + ? "$package" + : "::$package"}] + lassign [uplevel 1 [list ::critcl::name2c $classname]] ns cns classname cclassname + lassign [uplevel 1 [list ::critcl::name2c $qpackage]] pns pcns package cpackage + + #puts "%%% pNS |$pns|" + #puts "%%% Pkg |$package|" + #puts "%%% pCNS |$pcns|" + #puts "%%% cPkg |$cpackage|" + + #puts "%%% NS |$ns|" + #puts "%%% CName |$classname|" + #puts "%%% CNS |$cns|" + #puts "%%% CCName|$cclassname|" + + set stem ${pcns}${cpackage}_$cns$cclassname + + dict set state tcl-api 1 + dict set state c-api 0 + dict set state capiprefix $cns$cclassname + dict set state package $pns$package + dict set state class $ns$classname + dict set state stem $stem + dict set state classtype ${stem}_CLASS + dict set state method names {} + dict set state classmethod names {} + + # Check if the 'info frame' information for 'script' passes through properly. + spec::Process $script + + #puts "@@@ <<$state>>" + + ProcessFlags + ProcessIncludes + ProcessExternalType + ProcessInstanceVariables + ProcessClassVariables + + ProcessMethods method + ProcessMethods classmethod + + ProcessFragment classconstructor "\{\n" " " "\}" + ProcessFragment classdestructor "\{\n" " " "\}" + ProcessFragment constructor "\{\n" " " "\}" + ProcessFragment postconstructor "\{\n" " " "\}" + ProcessFragment destructor "\{\n" " " "\}" + ProcessFragment support "" \n "" + + GenerateCode + + unset state + return +} + +proc ::critcl::class::ProcessFlags {} { + variable state + set flags {} + foreach key {tcl-api c-api} { + if {![dict get $state $key]} continue + lappend flags $key + } + if {![llength $flags]} { + return -code error "No APIs to generate found. Please activate at least one API." + } + + dict set state buildflags [join $flags {, }] + critcl::msg "\n\tClass flags: $flags" + return +} + +proc ::critcl::class::ProcessIncludes {} { + variable state + if {[dict exists $state include]} { + ProcessFragment include "#include <" "\n" ">" + dict set state includes [dict get $state include] + dict unset state include + } else { + dict set state includes {/* No inclusions */} + } + return +} + +proc ::critcl::class::ProcessExternalType {} { + variable state + if {![dict exists $state instancetype]} return + + # Handle external C type for instances. + set itype [dict get $state instancetype] + dict set state ivardecl " $itype instance" + dict set state ivarrelease "" + dict set state ivarerror "error:\n return NULL;" + dict set state itypedecl "/* External type for instance state: $itype */" + + # For ProcessMethods + dict set state method typedef $itype + return +} + +proc ::critcl::class::ProcessInstanceVariables {} { + variable state + + if {![dict exists $state variable]} { + if {![dict exists $state instancetype]} { + # We have neither external type, nor instance variables. + # Fake ourselves out, recurse. + dict set state variable names {} + ProcessInstanceVariables itype + return + } + + # For ProcessMethods + dict set state method menum M_EMPTY + dict set state method typekey @instancetype@ + dict set state method prefix {} + dict set state method startn {} + dict set state method starte {} + return + } + + # Convert the set of instance variables (which can be empty) into + # a C instance structure type declaration, plus variable name. + + set itype [dict get $state stem]_INSTANCE + + set decl {} + lappend decl "typedef struct ${itype}__ \{" + + foreach fname [dict get $state variable names] { + set ctype [dict get $state variable def $fname ctype] + set vloc [dict get $state variable def $fname loc] + set comment [dict get $state variable def $fname comment] + + set field "$vloc $ctype $fname;" + if {$comment ne {}} { + append field " /* $comment */" + } + lappend decl $field + } + + lappend decl "\} ${itype}__;" + lappend decl "typedef struct ${itype}__* $itype;" + + dict set state instancetype $itype + dict set state ivardecl " $itype instance = ($itype) ckalloc (sizeof (${itype}__))" + dict set state ivarerror "error:\n ckfree ((char*) instance);\n return NULL;" + dict set state ivarrelease " ckfree ((char*) instance)" + dict set state itypedecl [join $decl \n] + + # For ProcessMethods + dict set state method typedef $itype + dict set state method menum M_EMPTY + dict set state method typekey @instancetype@ + dict set state method prefix {} + dict set state method startn {} + dict set state method starte {} + return +} + +proc ::critcl::class::ProcessClassVariables {} { + variable state + + # For ProcessMethods + dict set state classmethod typedef [dict get $state classtype] + dict set state classmethod menum {} + dict set state classmethod typekey @classtype@ + dict set state classmethod prefix class_ + dict set state classmethod startn "\n" + dict set state classmethod starte ",\n" + dict set state ctypedecl {} + + dict set state capiclassvaraccess {} + + if {![dict exists $state classvariable]} { + # Some compilers are unable to handle a structure without + # members (notably ANSI C89 Solaris, AIX). Taking the easy way + # out here, adding a dummy element. A more complex solution + # would be to ifdef the empty structure out of the system. + + dict set state ctypedecl {int __dummy__;} + return + } + + # Convert class variables into class type field declarations. + + set decl {} + lappend decl "/* # # ## ### ##### ######## User: Class variables */" + + if {[dict get $state c-api]} { + lappend acc "/* # # ## ### ##### ######## User: C-API :: Class variable accessors */\n" + } + + foreach fname [dict get $state classvariable names] { + set ctype [dict get $state classvariable def $fname ctype] + set vloc [dict get $state classvariable def $fname loc] + set comment [dict get $state classvariable def $fname comment] + + set field "$vloc$ctype $fname;" + if {$comment ne {}} { + append field " /* $comment */" + } + lappend decl $field + + # If needed, generate accessor functions for all class variables, + # i.e setters and getters. + + if {[dict get $state c-api]} { + lappend acc "$ctype @capiprefix@_${fname}_get (Tcl_Interp* interp) \{" + lappend acc " return @stem@_Class (interp)->user.$fname;" + lappend acc "\}" + lappend acc "" + lappend acc "void @capiprefix@_${fname}_set (Tcl_Interp* interp, $ctype v) \{" + lappend acc " @stem@_Class (interp)->user.$fname = v;" + lappend acc "\}" + } + } + + lappend decl "/* # # ## ### ##### ######## */" + + dict set state ctypedecl " [join $decl "\n "]\n" + + if {[dict get $state c-api]} { + dict set state capiclassvaraccess [join $acc \n] + } + return +} + +proc ::critcl::class::Max {v s} { + upvar 1 $v max + set l [string length $s] + if {$l < $max} return + set max $l + return +} + +proc ::critcl::class::ProcessMethods {key} { + variable state + # Process method declarations. Ensure that the names are listed in + # alphabetical order, to be nice. + + # From Process(Instance|Class)Variables + set pfx [dict get $state $key prefix] + set stn [dict get $state $key startn] + set ste [dict get $state $key starte] + + if {[dict exists $state $key names] && + [llength [dict get $state $key names]]} { + set map [list @stem@ [dict get $state stem] \ + [dict get $state $key typekey] \ + [dict get $state $key typedef]] + + set maxe 0 + set maxn 0 + foreach name [lsort -dict [dict get $state $key names]] { + Max maxn $name + Max maxe [dict get $state $key def $name enum] + } + incr maxn 3 + + foreach name [lsort -dict [dict get $state $key names]] { + set enum [string map $map [dict get $state $key def $name enum]] + set case [string map $map [dict get $state $key def $name case]] + set code [string map $map [dict get $state $key def $name code]] + set syntax [string map $map [dict get $state $key def $name syntax]] + + lappend names "[format %-${maxn}s \"$name\",] $syntax" + lappend enums "[format %-${maxe}s $enum] $syntax" + regexp {(:.*)$} $case tail + set case "case [format %-${maxe}s $enum]$tail" + lappend cases $case + lappend codes $code + } + + dict set state ${pfx}method_names "${stn} [join $names "\n "]" + dict set state ${pfx}method_enumeration "${ste} [join $enums ",\n "]" + dict set state ${pfx}method_dispatch "${stn}\t[join $cases \n\t]" + dict set state ${pfx}method_implementations [join $codes \n\n] + } else { + set enums [dict get $state $key menum] + if {[llength $enums]} { + set enums "${ste} [join $enums ",\n "]" + } + + dict set state ${pfx}method_names {} + dict set state ${pfx}method_enumeration $enums + dict set state ${pfx}method_dispatch {} + dict set state ${pfx}method_implementations {} + } + + + dict unset state $key + return +} + +proc ::critcl::class::ProcessFragment {key prefix sep suffix} { + # Process code fragments into a single block, if any. + # Ensure it exists, even if empty. Required by template. + # Optional in specification. + + variable state + if {![dict exists $state $key]} { + set new {} + } else { + set new ${prefix}[join [dict get $state $key] $suffix$sep$prefix]$suffix + } + dict set state $key $new + return +} + +proc ::critcl::class::GenerateCode {} { + variable state + + set stem [dict get $state stem] + set class [dict get $state class] + set hdr ${stem}_class.h + set header [file join [critcl::cache] $hdr] + + file mkdir [critcl::cache] + set template [critcl::Deline [Template class.h]] + #puts T=[string length $template] + + # Note, the template file is many files/parts, separated by ^Z + lassign [split $template \x1a] \ + template mgrstruct mgrsetup newinsname classcmd tclconscmd \ + cconscmd + + # Configure the flag-dependent parts of the template + + if {[dict get $state tcl-api]} { + dict set state classmgrstruct $mgrstruct + dict set state classmgrsetup $mgrsetup + dict set state classmgrnin $newinsname + dict set state classcommand $classcmd + dict set state tclconscmd $tclconscmd + } else { + dict set state classmgrstruct {} + dict set state classmgrsetup {} + dict set state classmgrnin {} + dict set state classcommand {} + dict set state tclconscmd {} + } + + if {[dict get $state c-api]} { + dict set state cconscmd $cconscmd + } else { + dict set state cconscmd {} + } + + critcl::util::Put $header [string map [MakeMap] $template] + + critcl::ccode "#include <$hdr>" + if {[dict get $state tcl-api]} { + uplevel 2 [list critcl::ccommand $class ${stem}_ClassCommand] + } + return +} + +proc ::critcl::class::MakeMap {} { + variable state + + # First set of substitutions. + set premap {} + dict for {k v} $state { + lappend premap @${k}@ $v + } + + # Resolve the substitutions used in the fragments of code to + # generate the final map. + set map {} + foreach {k v} $premap { + lappend map $k [string map $premap $v] + } + + return $map +} + +proc ::critcl::class::Template {path} { + variable selfdir + set path $selfdir/$path + critcl::msg "\tClass templates: $path" + return [Get $path] +} + +proc ::critcl::class::Get {path} { + if {[catch { + set c [open $path r] + fconfigure $c -eofchar {} + set d [read $c] + close $c + }]} { + set d {} + } + return $d +} + +proc ::critcl::class::Dedent {pfx text} { + set result {} + foreach l [split $text \n] { + lappend result [regsub ^$pfx $l {}] + } + join $result \n +} + +# # ## ### ##### ######## ############# ##################### +## +# Internal: All the helper commands providing access to the system +# state to the specification commands (see next section) +## +# # ## ### ##### ######## ############# ##################### + +proc ::critcl::class::CAPIPrefix {name} { + variable state + dict set state capiprefix $name + return +} + +proc ::critcl::class::Flag {key flag} { + critcl::msg " ($key = $flag)" + variable state + dict set state $key $flag + return +} + +proc ::critcl::class::Include {header} { + # Name of an API to include in the generated code. + variable state + dict lappend state include $header + return +} + +proc ::critcl::class::ExternalType {name} { + # Declaration of the C type to use for the object state. This + # type is expected to be declared externally. It allows us to use + # a 3rd party structure directly. Cannot be specified if instance + # and/or class variables for our own structures have been declared + # already. + + variable state + + if {[dict exists $state variable]} { + return -code error "Invalid external instance type. Instance variables already declared." + } + if {[dict exists $state classvariable]} { + return -code error "Invalid external instance type. Class variables already declared." + } + + dict set state instancetype $name + return +} + +proc ::critcl::class::Variable {ctype name comment vloc} { + # Declaration of an instance variable. In other words, a field in + # the C structure for instances. Cannot be specified if an + # external "type" has been specified already. + + variable state + + if {[dict exists $state instancetype]} { + return -code error \ + "Invalid instance variable. External instance type already declared." + } + + if {[dict exists $state variable def $name]} { + return -code error "Duplicate definition of instance variable \"$name\"" + } + + # Create the automatic instance variable to hold the instance + # command token. + + if {![dict exists $state stop] && + (![dict exists $state variable] || + ![llength [dict get $state variable names]]) + } { + # To make it easier on us we reuse the existing definition + # commands to set everything up. To avoid infinite recursion + # we set a flag stopping us from re-entering this block. + + dict set state stop 1 + critcl::at::here ; Variable Tcl_Command cmd { + Automatically generated. Holds the token for the instance command, + for use by the automatically created destroy method. + } [critcl::at::get] + dict unset state stop + + PostConstructor "[critcl::at::here!]\tinstance->cmd = cmd;\n" + + # And the destroy method using the above instance variable. + critcl::at::here ; MethodExplicit destroy proc {} void { + Tcl_DeleteCommandFromToken(interp, instance->cmd); + } + } + + dict update state variable f { + dict lappend f names $name + } + dict set state variable def $name ctype $ctype + dict set state variable def $name loc $vloc + dict set state variable def $name comment [string trim $comment] + return +} + +proc ::critcl::class::ClassVariable {ctype name comment vloc} { + # Declaration of a class variable. In other words, a field in the + # C structure for the class. Cannot be specified if a an external + # "type" has been specified already. + + variable state + + if {[dict exists $state instancetype]} { + return -code error \ + "Invalid class variable. External instance type already declared." + } + + if {[dict exists $state classvariable def $name]} { + return -code error "Duplicate definition of class variable \"$name\"" + } + + dict update state classvariable c { + dict lappend c names $name + } + dict set state classvariable def $name ctype $ctype + dict set state classvariable def $name loc $vloc + dict set state classvariable def $name comment [string trim $comment] + + if {[llength [dict get $state classvariable names]] == 1} { + # On declaration of the first class variable we declare an + # instance variable which provides the instances with a + # reference to their class (structure). + critcl::at::here ; Variable @classtype@ class { + Automatically generated. Reference to the class (variables) + from the instance. + } [critcl::at::get] + Constructor "[critcl::at::here!]\tinstance->class = class;\n" + } + return +} + +proc ::critcl::class::Constructor {code} { + CodeFragment constructor $code + return +} + +proc ::critcl::class::PostConstructor {code} { + CodeFragment postconstructor $code + return +} + +proc ::critcl::class::Destructor {code} { + CodeFragment destructor $code + return +} + +proc ::critcl::class::ClassConstructor {code} { + CodeFragment classconstructor $code + return +} + +proc ::critcl::class::ClassDestructor {code} { + CodeFragment classdestructor $code + return + } + +proc ::critcl::class::Support {code} { + CodeFragment support $code + return +} + +proc ::critcl::class::MethodExternal {name function details} { + MethodCheck method instance $name + + set map {} + if {[llength $details]} { + set details [join $details {, }] + lappend map objv "objv, $details" + set details " ($details)" + } + + MethodDef method instance $name [MethodEnum method $name] {} $function $map \ + "/* $name : External function @function@$details */" + return +} + +proc ::critcl::class::MethodExplicit {name mtype arguments args} { + # mtype in {proc, command} + MethodCheck method instance $name + variable state + + set bloc [critcl::at::get] + set enum [MethodEnum method $name] + set function ${enum}_Cmd + set cdimport "[critcl::at::here!] @instancetype@ instance = (@instancetype@) clientdata;" + set tname "[dict get $state class] M $name" + + if {$mtype eq "proc"} { + # Method is cproc. + # |args| == 2, args => rtype, body + # arguments is (argtype argname...) + # (See critcl::cproc for full details) + + # Force availability of the interp in methods. + if {[lindex $arguments 0] ne "Tcl_Interp*"} { + set arguments [linsert $arguments 0 Tcl_Interp* interp] + } + + lassign $args rtype body + + set body $bloc[string trimright $body] + set cargs [critcl::argnames $arguments] + if {[llength $cargs]} { set cargs " $cargs" } + set syntax "/* Syntax: $name$cargs */" + set body "\n $syntax\n$cdimport\n $body" + + set code [critcl::collect { + critcl::cproc $function $arguments $rtype $body \ + -cname 1 -pass-cdata 1 -arg-offset 1 -tracename $tname + }] + + } else { + # Method is ccommand. + # |args| == 1, args => body + lassign $args body + + if {$arguments ne {}} {set arguments " cmd<<$arguments>>"} + set body $bloc[string trimright $body] + set syntax "/* Syntax: $name$arguments */" + set body "\n $syntax\n$cdimport\n $body" + + set code [critcl::collect { + critcl::ccommand $function {} $body \ + -cname 1 -tracename $tname + }] + } + + MethodDef method instance $name $enum $syntax $function {} $code + return +} + +proc ::critcl::class::ClassMethodExternal {name function details} { + MethodCheck classmethod class $name + + set map {} + if {[llength $details]} { + lappend map objv "objv, [join $details {, }]" + } + + MethodDef classmethod "&classmgr->user" $name [MethodEnum classmethod $name] {} $function $map \ + "/* $name : External function @function@ */" + return +} + +proc ::critcl::class::ClassMethodExplicit {name mtype arguments args} { + # mtype in {proc, command} + MethodCheck classmethod class $name + variable state + + set bloc [critcl::at::get] + set enum [MethodEnum classmethod $name] + set function ${enum}_Cmd + set cdimport "[critcl::at::here!] @classtype@ class = (@classtype@) clientdata;" + set tname "[dict get $state class] CM $name" + + if {$mtype eq "proc"} { + # Method is cproc. + # |args| == 2, args => rtype, body + # arguments is (argtype argname...) + # (See critcl::cproc for full details) + + # Force availability of the interp in methods. + if {[lindex $arguments 0] ne "Tcl_Interp*"} { + set arguments [linsert $arguments 0 Tcl_Interp* interp] + } + + lassign $args rtype body + + set body $bloc[string trimright $body] + set cargs [critcl::argnames $arguments] + if {[llength $cargs]} { set cargs " $cargs" } + set syntax "/* Syntax: $name$cargs */" + set body "\n $syntax\n$cdimport\n $body" + + set code [critcl::collect { + critcl::cproc $function $arguments $rtype $body \ + -cname 1 -pass-cdata 1 -arg-offset 1 \ + -tracename $tname + }] + + } else { + # Method is ccommand. + # |args| == 1, args => body + lassign $args body + + if {$arguments ne {}} {set arguments " cmd<<$arguments>>"} + set body $bloc[string trimright $body] + set syntax "/* Syntax: $name$arguments */" + set body "\n $syntax\n$cdimport\n $body" + + set code [critcl::collect { + critcl::ccommand $function {} $body \ + -cname 1 -tracename $tname + }] + } + + MethodDef classmethod class $name $enum $syntax $function {} $code + return +} + +proc ::critcl::class::MethodCheck {section label name} { + variable state + if {[dict exists $state $section def $name]} { + return -code error "Duplicate definition of $label method \"$name\"" + } + return +} + +proc ::critcl::class::MethodEnum {section name} { + variable state + # Compute a C enum identifier from the (class) method name. + + # To avoid trouble we have to remove any non-alphabetic + # characters. A serial number is required to distinguish methods + # which would, despite having different names, transform to the + # same C enum identifier. + + regsub -all -- {[^a-zA-Z0-9_]} $name _ name + regsub -all -- {_+} $name _ name + + set serial [llength [dict get $state $section names]] + set M [expr {$section eq "method" ? "M" : "CM"}] + + return @stem@_${M}_${serial}_[string toupper $name] +} + +proc ::critcl::class::MethodDef {section var name enum syntax function xmap code} { + variable state + + set case "case $enum: return @function@ ($var, interp, objc, objv); break;" + set case [string map $xmap $case] + + set map [list @function@ $function] + + dict update state $section m { + dict lappend m names $name + } + dict set state $section def $name enum $enum + dict set state $section def $name case [string map $map $case] + dict set state $section def $name code [string map $map $code] + dict set state $section def $name syntax [string map $map $syntax] + return +} + +proc ::critcl::class::CodeFragment {section code} { + variable state + set code [string trim $code \n] + if {$code ne {}} { + dict lappend state $section $code + } + return +} + +# # ## ### ##### ######## ############# ##################### +## +# Internal: Namespace holding the class specification commands. The +# associated state resides in the outer namespace, as do all the +# procedures actually accessing that state (see above). Treat it like +# a sub-package, with a proper API. +## +# # ## ### ##### ######## ############# ##################### + +namespace eval ::critcl::class::spec {} + +proc ::critcl::class::spec::Process {script} { + # Note how this script is evaluated within the 'spec' namespace, + # providing it with access to the specification methods. + + # Point the global namespace resolution into the spec namespace, + # to ensure that the commands are properly found even if the + # script moved through helper commands and other namespaces. + + # Note that even this will not override the builtin 'variable' + # command with ours, which is why ours is now called + # 'insvariable'. + + namespace eval :: [list namespace path [list [namespace current] ::]] + + eval $script + + namespace eval :: {namespace path {}} + return +} + +proc ::critcl::class::spec::tcl-api {flag} { + ::critcl::class::Flag tcl-api $flag +} + +proc ::critcl::class::spec::c-api {flag {name {}}} { + ::critcl::class::Flag c-api $flag + if {$name eq {}} return + ::critcl::class::CAPIPrefix $name +} + +proc ::critcl::class::spec::include {header} { + ::critcl::class::Include $header +} + +proc ::critcl::class::spec::type {name} { + ::critcl::class::ExternalType $name +} + +proc ::critcl::class::spec::insvariable {ctype name {comment {}} {constructor {}} {destructor {}}} { + ::critcl::at::caller + set vloc [critcl::at::get*] + ::critcl::at::incrt $comment ; set cloc [::critcl::at::get*] + ::critcl::at::incrt $constructor ; set dloc [::critcl::at::get] + + + ::critcl::class::Variable $ctype $name $comment $vloc + + if {$constructor ne {}} { + ::critcl::class::Constructor $cloc$constructor + } + if {$destructor ne {}} { + ::critcl::class::Destructor $dloc$destructor + } + + return +} + +proc ::critcl::class::spec::constructor {code {postcode {}}} { + ::critcl::at::caller ; set cloc [::critcl::at::get*] + ::critcl::at::incrt $code ; set ploc [::critcl::at::get] + + if {$code ne {}} { + ::critcl::class::Constructor $cloc$code + } + if {$postcode ne {}} { + ::critcl::class::PostConstructor $ploc$postcode + } + return +} + +proc ::critcl::class::spec::destructor {code} { + ::critcl::class::Destructor [::critcl::at::caller!]$code + return +} + +proc ::critcl::class::spec::method {name op detail args} { + # Syntax + # (1) method as ... + # (2) method proc + # (3) method command + # name op detail args__________ + + # op = as|proc|cmd|command + + # op == proc + # detail = argument list, syntax as per cproc. + # args[0] = r(esult)type + # args[1] = body + + # op == command + # detail = argument syntax. not used in code, purely descriptive. + # args[0] = body + + switch -exact -- $op { + as { + # The instance method is an external C function matching + # an ObjCmd in signature, possibly with additional + # parameters at the end. + # + # detail = name of that function + # args = values for the additional parameters, if any. + + ::critcl::class::MethodExternal $name $detail $args + return + } + proc { + if {[llength $args] != 2} { + return -code error "wrong#args" + } + } + cmd - command { + set op command + if {[llength $args] != 1} { + return -code error "wrong#args" + } + } + default { + return -code error "Illegal method type \"$op\", expected one of cmd, command, or proc" + } + } + + ::critcl::at::caller + ::critcl::at::incrt $detail + + eval [linsert $args 0 ::critcl::class::MethodExplicit $name $op [string trim $detail]] + #::critcl::class::MethodExplicit $name $op [string trim $detail] {*}$args + return +} + +proc ::critcl::class::spec::classvariable {ctype name {comment {}} {constructor {}} {destructor {}}} { + ::critcl::at::caller + set vloc [critcl::at::get*] + ::critcl::at::incrt $comment ; set cloc [::critcl::at::get*] + ::critcl::at::incrt $constructor ; set dloc [::critcl::at::get] + + ::critcl::class::ClassVariable $ctype $name $comment $vloc + + if {$constructor ne {}} { + ::critcl::class::ClassConstructor $cloc$constructor + } + if {$destructor ne {}} { + ::critcl::class::ClassDestructor $dloc$destructor + } + return +} + +proc ::critcl::class::spec::classconstructor {code} { + ::critcl::class::ClassConstructor [::critcl::at::caller!]$code + return +} + +proc ::critcl::class::spec::classdestructor {code} { + ::critcl::class::ClassDestructor [::critcl::at::caller!]$code + return +} + +proc ::critcl::class::spec::classmethod {name op detail args} { + # Syntax + # (1) classmethod as ... + # (2) classmethod proc + # (3) classmethod command + # name op detail args__________ + + # op = as|proc|cmd|command + + # op == proc + # detail = argument syntax per cproc. + # args[0] = r(esult)type + # args[1] = body + + # op == command + # detail = argument syntax. not used in code, purely descriptive. + # args[0] = body + + switch -exact -- $op { + as { + # The class method is an external C function matching an + # ObjCmd in signature, possibly with additional parameters + # at the end. + # + # detail = name of that function + # args = values for the additional parameters, if any. + + ::critcl::class::ClassMethodExternal $name $detail $args + return + } + proc { + if {[llength $args] != 2} { + return -code error "wrong#args" + } + } + cmd - command { + set op command + if {[llength $args] != 1} { + return -code error "wrong#args" + } + } + default { + return -code error "Illegal method type \"$op\", expected one of cmd, command, or proc" + } + } + + ::critcl::at::caller + ::critcl::at::incrt $detail + eval [linsert $args 0 ::critcl::class::ClassMethodExplicit $name $op [string trim $detail]] + # ::critcl::class::ClassMethodExplicit $name $op [string trim $detail] {*}$args + return +} + +proc ::critcl::class::spec::support {code} { + ::critcl::class::Support [::critcl::at::caller!]$code + return +} + +proc ::critcl::class::spec::method_introspection {} { + ::critcl::class::spec::classvariable Tcl_Obj* methods { + Cache for the list of method names. + } { + class->methods = ComputeMethodList (@stem@_methodnames); + Tcl_IncrRefCount (class->methods); + } { + Tcl_DecrRefCount (class->methods); + class->methods = NULL; + } + + # The ifdef/define/endif block below ensures that the supporting + # code will be defined only once, even if multiple classes + # activate method-introspection. Note that what we cannot prevent + # is the appearance of multiple copies of the code below in the + # generated output, only that it is compiled multiple times. + + ::critcl::class::spec::support { +#ifndef CRITCL_CLASS__HAVE_COMPUTE_METHOD_LIST +#define CRITCL_CLASS__HAVE_COMPUTE_METHOD_LIST +static Tcl_Obj* +ComputeMethodList (CONST char** table) +{ + int n, i; + char** item; + Tcl_Obj** lv; + Tcl_Obj* result; + + item = (char**) table; + n = 0; + while (*item) { + n ++; + item ++; + } + + lv = (Tcl_Obj**) ckalloc (n * sizeof (Tcl_Obj*)); + i = 0; + while (table [i]) { + lv [i] = Tcl_NewStringObj (table [i], -1); + i ++; + } + + result = Tcl_NewListObj (n, lv); + ckfree ((char*) lv); + + return result; +} +#endif /* CRITCL_CLASS__HAVE_COMPUTE_METHOD_LIST */ + } + + ::critcl::class::spec::method methods proc {} void { + Tcl_SetObjResult (interp, instance->class->methods); + } + + ::critcl::class::spec::classmethod methods proc {} void { + Tcl_SetObjResult (interp, class->methods); + } + return +} + +# # ## ### ##### ######## ############# ##################### +## State + +namespace eval ::critcl::class { + variable selfdir [file dirname [file normalize [info script]]] +} + +# # ## ### ##### ######## ############# ##################### +## Export API + +namespace eval ::critcl::class { + namespace export define + catch { namespace ensemble create } ; # 8.5+ +} + +# # ## ### ##### ######## ############# ##################### +## Ready +return diff --git a/src/tclkit86bi.vfs/lib/critcl-class1.2/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl-class1.2/pkgIndex.tcl new file mode 100644 index 00000000..3e3083dd --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-class1.2/pkgIndex.tcl @@ -0,0 +1,2 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl::class 1.2 [list source [file join $dir class.tcl]] diff --git a/src/tclkit86bi.vfs/lib/critcl-cutil0.3/allocs/critcl_alloc.h b/src/tclkit86bi.vfs/lib/critcl-cutil0.3/allocs/critcl_alloc.h new file mode 100644 index 00000000..684eafe5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-cutil0.3/allocs/critcl_alloc.h @@ -0,0 +1,57 @@ +#ifndef __CRITCL_UTIL_ALLOC_H +#define __CRITCL_UTIL_ALLOC_H 1 + +/* + * Copyright (c) 2017-2020 Andreas Kupries + * = = == === ===== ======== ============= ===================== + */ + +#include /* memcpy - See STREP */ +#include + +/* + * Helper macros for easy allocation of structures and arrays. + */ + +#define ALLOC(type) (type *) ckalloc (sizeof (type)) +#define ALLOC_PLUS(type,n) (type *) ckalloc (sizeof (type) + (n)) +#define NALLOC(type,n) (type *) ckalloc (sizeof (type) * (n)) +#define REALLOC(x,type,n) (type *) ckrealloc ((char*) x, sizeof (type) * (n)) + +#define FREE(p) ckfree ((char*)(p)) + +/* + * Macros to properly set a string rep from a string or DString. The main + * point is adding the terminating \0 character. The Tcl core checks for that. + */ + +#define STREP(o,str,len) \ + (o)->length = (len); \ + (o)->bytes = ckalloc((len)+1); \ + memcpy ((o)->bytes, (str), (len)); \ + (o)->bytes[(len)] = '\0' + +#define STREP_DS(o,ds) { \ + int length = Tcl_DStringLength (ds); \ + STREP(o, Tcl_DStringValue (ds), length); \ + } + +#define STRDUP(v,s) { \ + char* str = ckalloc (1+strlen (s)); \ + strcpy (str, s); \ + v = str; \ + } + +/* + * = = == === ===== ======== ============= ===================== + */ + +#endif /* __CRITCL_UTIL_ALLOC_H */ + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/src/tclkit86bi.vfs/lib/critcl-cutil0.3/asserts/critcl_assert.h b/src/tclkit86bi.vfs/lib/critcl-cutil0.3/asserts/critcl_assert.h new file mode 100644 index 00000000..32ff0755 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-cutil0.3/asserts/critcl_assert.h @@ -0,0 +1,68 @@ +#ifndef __CRITCL_CUTIL_ASSERT_H +#define __CRITCL_CUTIL_ASSERT_H 1 + +/* + * Copyright (c) 2017-2020 Andreas Kupries + * = = == === ===== ======== ============= ===================== + */ + +#include + +/* + * Macros for assertions, controlled via CRITCL_ASSERT. + * Especially a helper to check array bounds, and counted + * abort. + */ + +#ifdef CRITCL_ASSERT + +#define CRITCL_CUTIL_XSTR(x) #x +#define CRITCL_CUTIL_STR(x) CRITCL_CUTIL_XSTR(x) +#define CRITCL_CUTIL_RANGEOK(i,n) ((0 <= (i)) && ((i) < (n))) + +#define ASSERT(x,msg) if (!(x)) { \ + Tcl_Panic (msg " (" #x "), in file %s @line %d", \ + __FILE__, __LINE__); \ + } + +#define ASSERT_VA(x,msg,format,...) if (!(x)) { \ + Tcl_Panic (msg " (" #x "), in file %s @line %d, " format, \ + __FILE__, __LINE__, __VA_ARGS__); \ + } + +#define ASSERT_BOUNDS(i,n) \ + ASSERT_VA (CRITCL_CUTIL_RANGEOK(i,n), \ + "array index out of bounds", \ + CRITCL_CUTIL_STR(i) \ + " = (%d) >= (%d) = " \ + CRITCL_CUTIL_STR(n), \ + i, n) + +#define STOPAFTER(x) { \ + static int count = (x); \ + count --; \ + if (!count) { Tcl_Panic ("stop"); } \ + } + +#else /* ! CRITCL_ASSERT */ + +#define ASSERT(x,msg) +#define ASSERT_VA(x,msg,format,...) +#define ASSERT_BOUNDS(i,n) +#define STOPAFTER(x) + +#endif + +/* + * = = == === ===== ======== ============= ===================== + */ + +#endif /* __CRITCL_CUTIL_H */ + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/src/tclkit86bi.vfs/lib/critcl-cutil0.3/cutil.tcl b/src/tclkit86bi.vfs/lib/critcl-cutil0.3/cutil.tcl new file mode 100644 index 00000000..5907e5c7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-cutil0.3/cutil.tcl @@ -0,0 +1,69 @@ +## -*- tcl -*- +# # ## ### ##### ######## ############# ##################### +# Pragmas for MetaData Scanner. +# n/a + +# CriTcl Utility Commands To Provide Common C-level utility functions. +# +# Copyright (c) 2017-2022 Andreas Kupries + +package provide critcl::cutil 0.3 + +# # ## ### ##### ######## ############# ##################### +## Requirements. + +package require Tcl 8.6 ; # Min supported version. +package require critcl 3.2 + +namespace eval ::critcl::cutil {} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Embed C Code + +# # ## ### ##### ######## ############# ##################### + +proc critcl::cutil::alloc {} { + variable selfdir + critcl::cheaders -I$selfdir/allocs + critcl::include critcl_alloc.h + return +} + +proc critcl::cutil::assertions {{enable 0}} { + variable selfdir + critcl::cheaders -I$selfdir/asserts + critcl::include critcl_assert.h + if {!$enable} return + critcl::cflags -DCRITCL_ASSERT + return +} + +proc critcl::cutil::tracer {{enable 0}} { + variable selfdir + alloc ;# Tracer uses the allocation utilities in its implementation + critcl::cheaders -I$selfdir/trace + critcl::include critcl_trace.h + critcl::csources $selfdir/trace/trace.c + if {!$enable} return + critcl::cflags -DCRITCL_TRACER + return +} + +# # ## ### ##### ######## ############# ##################### +## State + +namespace eval ::critcl::cutil { + variable selfdir [file dirname [file normalize [info script]]] +} + +# # ## ### ##### ######## ############# ##################### +## Export API + +namespace eval ::critcl::cutil { + namespace export alloc assert tracer + catch { namespace ensemble create } +} + +# # ## ### ##### ######## ############# ##################### +## Ready +return diff --git a/src/tclkit86bi.vfs/lib/critcl-cutil0.3/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl-cutil0.3/pkgIndex.tcl new file mode 100644 index 00000000..1adf9e3d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-cutil0.3/pkgIndex.tcl @@ -0,0 +1,2 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl::cutil 0.3 [list source [file join $dir cutil.tcl]] diff --git a/src/tclkit86bi.vfs/lib/critcl-cutil0.3/trace/critcl_trace.h b/src/tclkit86bi.vfs/lib/critcl-cutil0.3/trace/critcl_trace.h new file mode 100644 index 00000000..0e5aeb25 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-cutil0.3/trace/critcl_trace.h @@ -0,0 +1,149 @@ +#ifndef __CRITCL_UTIL_TRACE_H +#define __CRITCL_UTIL_TRACE_H 1 + +/* + * Copyright (c) 2017-2018 Andreas Kupries + * + * Narrative tracing support, controlled by CRITCL_TRACER + * = = == === ===== ======== ============= ===================== + * + * Further control of the active logical sub-streams is done via the + * declarators + * - TRACE_ON + * - TRACE_OFF + * - TRACE_TAG_ON + * - TRACE_TAG_OFF + * + * The macros make use of the standard macros __FILE__ and __LINE__ + * to identify traced locations (physically). + * + * ATTENTION: The trace facility assumes a C99 compiler to have + * access to the __func__ string which holds the name + * of the current function. + */ + +#include + +/* + * Main (convenience) commands: + * + * - TRACE_FUNC :: Function entry, formatted parameters + * - TRACE_FUNC_VOID :: Function entry, no parameters + * - TRACE_RETURN :: Function exit, formatted result + * - TRACE_RETURN_VOID :: Function exit, no result + * - TRACE :: Additional trace line. + * + * The above commands are composed from the lower level commands below. + * + * Scoping + * - TRACE_PUSH_SCOPE :: Start a named scope, no output + * - TRACE_PUSH_FUNC :: Start a scope, named by the current function, no output + * - TRACE_POP :: End a scope, no output + + * Tracing + * - TRACE_HEADER :: Start of trace line (location, indentation, scope) + * - TRACE_ADD :: Extend trace line, formatted information + * - TRACE_CLOSER :: End of trace line + * + * All of the tracing command also come in TRACE_TAG_ forms which take an + * additional 1st argument, the tag of the stream. The scoping commands do not + * take tags. They manage indentation without generating output on their own. + */ + +#ifndef CRITCL_TRACER +/* Tracing disabled. All macros vanish */ +#define TRACE_PUSH_SCOPE(string) +#define TRACE_PUSH_FUNC +#define TRACE_POP +#define TRACE_ON +#define TRACE_OFF +#define TRACE_HEADER(indent) +#define TRACE_ADD(format, ...) +#define TRACE_CLOSER +#define TRACE_TAG_ON(tag) +#define TRACE_TAG_OFF(tag) +#define TRACE_TAG_HEADER(tag,indent) +#define TRACE_TAG_ADD(tag, format, ...) +#define TRACE_TAG_CLOSER(tag) +#define TRACE_FUNC(format, ...) +#define TRACE_FUNC_VOID +#define TRACE_RETURN(format,x) return (x); +#define TRACE_RETURN_VOID return; +#define TRACE(format, ...) +#define TRACE_TAG_FUNC(tag, format, ...) +#define TRACE_TAG_FUNC_VOID(tag) +#define TRACE_TAG_RETURN(tag, format, x) return (x); +#define TRACE_TAG_RETURN_VOID(tag) return; +#define TRACE_TAG(tag, format, ...) +#define TRACE_RUN(code) +#define TRACE_DO(code) +#define TRACE_TAG_DO(tag, code) +#define TRACE_TAG_VAR(tag) 0 +#endif + +#ifdef CRITCL_TRACER +/* Tracing active. Macros expand to content. + */ +#define TRACE_PUSH_SCOPE(string) critcl_trace_push (string) +#define TRACE_PUSH_FUNC TRACE_PUSH_SCOPE (__func__) +#define TRACE_POP critcl_trace_pop() + +#define TRACE_ON TRACE_TAG_ON (THIS_FILE) +#define TRACE_OFF TRACE_TAG_OFF (THIS_FILE) + +#define TRACE_HEADER(indent) TRACE_TAG_HEADER (THIS_FILE, indent) +#define TRACE_ADD(format, ...) TRACE_TAG_ADD (THIS_FILE, format, __VA_ARGS__) +#define TRACE_CLOSER TRACE_TAG_CLOSER (THIS_FILE) + +#define TRACE_TAG_ON(tag) static int TRACE_TAG_VAR (tag) = 1 +#define TRACE_TAG_OFF(tag) static int TRACE_TAG_VAR (tag) = 0 +#define TRACE_TAG_VAR(tag) __critcl_tag_ ## tag ## _status + +#define TRACE_TAG_HEADER(tag, indent) critcl_trace_header (TRACE_TAG_VAR (tag), (indent), __FILE__, __LINE__) +#define TRACE_TAG_ADD(tag, format, ...) critcl_trace_printf (TRACE_TAG_VAR (tag), format, __VA_ARGS__) +#define TRACE_TAG_CLOSER(tag) critcl_trace_closer (TRACE_TAG_VAR (tag)) + +/* Highlevel (convenience) tracing. + */ + +#define TRACE_FUNC(format, ...) TRACE_TAG_FUNC (THIS_FILE, format, __VA_ARGS__) +#define TRACE_FUNC_VOID TRACE_TAG_FUNC_VOID (THIS_FILE) +#define TRACE_RETURN(format,x) TRACE_TAG_RETURN (THIS_FILE, format, x) +#define TRACE_RETURN_VOID TRACE_TAG_RETURN_VOID (THIS_FILE) +#define TRACE(format, ...) TRACE_TAG (THIS_FILE, format, __VA_ARGS__) + +#define TRACE_TAG_FUNC(tag, format, ...) TRACE_PUSH_FUNC; TRACE_TAG_HEADER (tag,1); TRACE_TAG_ADD (tag, format, __VA_ARGS__); TRACE_TAG_CLOSER (tag) +#define TRACE_TAG_FUNC_VOID(tag) TRACE_PUSH_FUNC; TRACE_TAG_HEADER (tag,1); TRACE_TAG_ADD (tag, "(%s)", "void"); TRACE_TAG_CLOSER (tag) +#define TRACE_TAG_RETURN(tag, format, x) TRACE_TAG_HEADER (tag,1); TRACE_TAG_ADD (tag, "%s", "RETURN = ") ; TRACE_TAG_ADD (tag, format, x) ; TRACE_TAG_CLOSER (tag) ; TRACE_POP ; return (x) +#define TRACE_TAG_RETURN_VOID(tag) TRACE_TAG_HEADER (tag,1); TRACE_TAG_ADD (tag, "RETURN %s", "(void)") ; TRACE_TAG_CLOSER (tag) ; TRACE_POP ; return +#define TRACE_TAG(tag, format, ...) TRACE_TAG_HEADER (tag,1); TRACE_TAG_ADD (tag, format, __VA_ARGS__) ; TRACE_TAG_CLOSER (tag) + +#define TRACE_RUN(code) code +#define TRACE_DO(code) TRACE_TAG_DO (THIS_FILE, code) +#define TRACE_TAG_DO(tag, code) if (TRACE_TAG_VAR (tag)) { code ; } + +/* Support functions used in the macros. + */ + +extern void critcl_trace_push (const char* scope); +extern void critcl_trace_pop (void); +extern void critcl_trace_header (int on, int indent, const char *filename, int line); +extern void critcl_trace_printf (int on, const char *pat, ...); +extern void critcl_trace_closer (int on); + +/* Support functions used by the implementation of "critcl::cproc". + */ + +extern void critcl_trace_cmd_args (const char* scope, int oc, Tcl_Obj*const* ov); +extern int critcl_trace_cmd_result (int status, Tcl_Interp* ip); + +#endif +#endif /* __CRITCL_UTIL_TRACE_H */ + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/src/tclkit86bi.vfs/lib/critcl-cutil0.3/trace/trace.c b/src/tclkit86bi.vfs/lib/critcl-cutil0.3/trace/trace.c new file mode 100644 index 00000000..ceb42196 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-cutil0.3/trace/trace.c @@ -0,0 +1,213 @@ +/* + * Copyright (c) 2017-2018 Andreas Kupries + * = = == === ===== ======== ============= ===================== + */ + +#include +#include + +/* + * = = == === ===== ======== ============= ===================== + */ + +#ifdef CRITCL_TRACER + +/* Tracking the stack of scopes, + * single-linked list, + * top to bottom. + */ + +typedef struct scope_stack { + const char* scope; + struct scope_stack* down; +} scope_stack; + +/* + * = = == === ===== ======== ============= ===================== + * Tracing state (stack of scopes, associated indentation level) + * + * API regexp for trace output: + * (header printf* closer)* + * + * - closed == 1 :: post (closer) + * - closed == 0 :: post (header) + * + * [1] in (header) && !closed + * => starting a new line in the middle of an incomplete line + * => force closer + * [2] in (printf) && closed + * => continuing a line which was interrupted by another (see [1]) + * => force header + */ + +static scope_stack* top = 0; +static int level = 0; +static int closed = 1; + +/* + * = = == === ===== ======== ============= ===================== + * Internals + */ + +static void +indent (void) +{ + int i; + for (i = 0; i < level; i++) { fwrite(" ", 1, 1, stdout); } + fflush (stdout); +} + +static void +scope (void) +{ + if (!top) return; + fwrite (top->scope, 1, strlen(top->scope), stdout); + fflush (stdout); +} + +static void +separator (void) +{ + fwrite(" | ", 1, 3, stdout); + fflush (stdout); +} + +/* + * = = == === ===== ======== ============= ===================== + * API + */ + +void +critcl_trace_push (const char* scope) +{ + scope_stack* new = ALLOC (scope_stack); + new->scope = scope; + new->down = top; + top = new; + level += 4; +} + +void +critcl_trace_pop (void) +{ + scope_stack* next = top->down; + level -= 4; + ckfree ((char*)top); + top = next; +} + +void +critcl_trace_closer (int on) +{ + if (!on) return; + fwrite ("\n", 1, 1, stdout); + fflush (stdout); + closed = 1; +} + +void +critcl_trace_header (int on, int ind, const char* filename, int line) +{ + if (!on) return; + if (!closed) critcl_trace_closer (1); + // location prefix +#if 0 /* varying path length breaks indenting by call level :( */ + if (filename) { + fprintf (stdout, "%s:%6d", filename, line); + fflush (stdout); + } +#endif + // indentation, scope, separator + if (ind) { indent (); } + scope (); + separator(); + closed = 0; +} + +void +critcl_trace_printf (int on, const char *format, ...) +{ + /* + * 1MB output-buffer. We may trace large data structures. This is also a + * reason why the implementation can be compiled out entirely. + */ +#define MSGMAX (1024*1024) + static char msg [MSGMAX]; + int len; + va_list args; + if (!on) return; + if (closed) critcl_trace_header (1, 1, 0, 0); + + va_start(args, format); + len = vsnprintf(msg, MSGMAX, format, args); + va_end(args); + fwrite(msg, 1, len, stdout); + fflush (stdout); +} + +void +critcl_trace_cmd_args (const char* scopename, int argc, Tcl_Obj*const* argv) +{ + int i; + critcl_trace_push (scopename); + for (i=0; i < argc; i++) { + // No location information + indent(); + scope(); + separator(); + critcl_trace_printf (1, "ARG [%3d] = %p (^%d:%s) '%s'\n", + i, argv[i], argv[i]->refCount, + argv[i]->typePtr ? argv[i]->typePtr->name : "", + Tcl_GetString((Tcl_Obj*) argv[i])); + } +} + +int +critcl_trace_cmd_result (int status, Tcl_Interp* ip) +{ + Tcl_Obj* robj = Tcl_GetObjResult (ip); + const char* rstr = Tcl_GetString (robj); + const char* rstate; + const char* rtype; + static const char* state_str[] = { + /* 0 */ "OK", + /* 1 */ "ERROR", + /* 2 */ "RETURN", + /* 3 */ "BREAK", + /* 4 */ "CONTINUE", + }; + char buf [TCL_INTEGER_SPACE]; + if (status <= TCL_CONTINUE) { + rstate = state_str [status]; + } else { + sprintf (buf, "%d", status); + rstate = (const char*) buf; + } + if (robj->typePtr) { + rtype = robj->typePtr->name; + } else { + rtype = ""; + } + + // No location information + indent(); + scope(); + separator(); + critcl_trace_printf (1, "RESULT = %s %p (^%d:%s) '%s'\n", + rstate, robj, robj->refCount, rtype, rstr); + critcl_trace_pop (); + return status; +} + +#endif /* CRITCL_TRACER */ +/* + * = = == === ===== ======== ============= ===================== + */ + +/* + * local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/src/tclkit86bi.vfs/lib/critcl-emap1.3/emap.tcl b/src/tclkit86bi.vfs/lib/critcl-emap1.3/emap.tcl new file mode 100644 index 00000000..eeb185e9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-emap1.3/emap.tcl @@ -0,0 +1,696 @@ +## -*- tcl -*- +# # ## ### ##### ######## ############# ##################### +# Pragmas for MetaData Scanner. +# n/a + +# CriTcl Utility Package for en- and decoding an external enum. +# Based on i-assoc. +# +# Copyright (c) 2014-2022 Andreas Kupries + +package provide critcl::emap 1.3 + +# # ## ### ##### ######## ############# ##################### +## Requirements. + +package require Tcl 8.6 ; # Min supported version. +package require critcl 3.1.11 ; # make, include -- dict portability +package require critcl::iassoc + +namespace eval ::critcl::emap {} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Embed C Code + +proc critcl::emap::def {name dict args} { + # dict: Tcl symbolic name -> (C int value (1)) + # + # (Ad 1) Can be numeric, or symbolic, as long as it is a C int + # expression in the end. + + # args = options. Currently supported: + # * -nocase : case-insensitive strings on encoding. + # * -mode : list of use cases, access case: tcl, c (default: tcl) + + Options $args + Index $dict id symbols last + # symbols :: list of words, lexicographically sorted + # id :: symbol -> index (sorted) + # last :: number of symbols + + Header $name + ConstStringTable $name $symbols $dict $nocase $last + set isdirect [DecideIfDirect $dict min max direct] + if {$isdirect} { + DecodeDirect $name $min $max id direct + } + Tcl Iassoc $name $symbols $dict $nocase $last + Tcl EncoderTcl $name $nocase + Tcl DecoderTcl $name $isdirect $last + List Decoder+List $name + Tcl ArgType $name + Tcl ResultType $name + C EncoderC $name $nocase $last + C DecoderC $name $isdirect $last + return +} + +# # ## ### ##### ######## ############# ##################### +## Internals + +proc critcl::emap::DecoderTcl {name isdirect last} { + if {$isdirect} { + DecoderTclDirect $name + } else { + DecoderTclSearch $name $last + } + return +} + +proc critcl::emap::DecoderTclSearch {name last} { + # Decoder based on linear search. Because we either + # - see some symbolic values (= do not know actual value) + # - the direct mapping table would be too large (> 50 entries). + lappend map @NAME@ $name + lappend map @UNAME@ [string toupper $name] + lappend map @LAST@ $last + + critcl::ccode \n[critcl::at::here!][string map $map { + Tcl_Obj* + @NAME@_decode (Tcl_Interp* interp, int state) + { + /* Decode via linear search */ + char buf [20]; + int i; + @NAME@_iassoc_data context = @NAME@_iassoc (interp); + + for (i = 0; i < @LAST@; i++) { + if (@NAME@_emap_state [i] != state) continue; + return context->tcl [i]; + } + + sprintf (buf, "%d", state); + Tcl_AppendResult (interp, "Invalid @NAME@ state code ", buf, NULL); + Tcl_SetErrorCode (interp, "@UNAME@", "STATE", NULL); + return NULL; + } + }] + return +} + +proc critcl::emap::DecodeDirect {name min max iv dv} { + upvar 1 $iv id $dv direct + # Decoder based on a direct mapping table. We can do this because + # we found that all the values are pure integers, i.e. we know + # them in detail, and that the table is not too big (< 50 entries). + + lassign [DirectTable $min $max id direct] table size + + lappend map @NAME@ $name + lappend map @DIRECT@ $table + lappend map @SIZE@ $size + lappend map @MIN@ $min + lappend map @MAX@ $max + lappend map @OFFSET@ [Offset $min] + + critcl::ccode \n[critcl::at::here!][string map $map { + static int @NAME@_direct (int state) + { + static const int direct [@SIZE@] = {@DIRECT@ + }; + /* Check limits first */ + if (state < @MIN@) { return -1; } + if (state > @MAX@) { return -1; } + /* Map to string index */ + return direct [state@OFFSET@]; + } + }] +} + +proc critcl::emap::DecoderTclDirect {name} { + lappend map @NAME@ $name + lappend map @UNAME@ [string toupper $name] + + critcl::ccode \n[critcl::at::here!][string map $map { + Tcl_Obj* + @NAME@_decode (Tcl_Interp* interp, int state) + { + /* Decode via direct mapping */ + char buf [20]; + int i; + @NAME@_iassoc_data context = @NAME@_iassoc (interp); + + i = @NAME@_direct (state); + if (i < 0) { goto error; } + + /* Return the chosen string */ + return context->tcl [i]; + + error: + sprintf (buf, "%d", state); + Tcl_AppendResult (interp, "Invalid @NAME@ state code ", buf, NULL); + Tcl_SetErrorCode (interp, "@UNAME@", "STATE", NULL); + return NULL; + } + }] + return +} + +proc critcl::emap::Decoder+List {name} { + lappend map @NAME@ $name + lappend map @UNAME@ [string toupper $name] + + # Note on perf: O(mc), for m states in the definition, and c + # states to convert. As the number of declared states is however + # fixed, and small, we can say O(c) for some larger constant + # factor. + + critcl::ccode \n[critcl::at::here!][string map $map { + Tcl_Obj* + @NAME@_decode_list (Tcl_Interp* interp, int c, int* state) + { + int k; + Tcl_Obj* result = Tcl_NewListObj (0, 0); + /* Failed to create, abort immediately */ + if (!result) { + return result; + } + for (k=0; k < c; k++) { + Tcl_Obj* lit = @NAME@_decode (interp, state[k]); + if (lit && (TCL_OK == Tcl_ListObjAppendElement (interp, result, lit))) { + continue; + } + /* Failed to translate or append; release and abort */ + Tcl_DecrRefCount (result); + return NULL; + } + return result; + } + }] + return +} + +proc critcl::emap::DirectTable {min max iv dv} { + upvar 1 $iv id $dv direct + + set table {} + set fmt %[string length $max]d + + for {set i $min} {$i <= $max} {incr i} { + if {[info exists direct($i)]} { + set sym [lindex $direct($i) 0] + set code $id($sym) + lappend table "$code,\t/* [format $fmt $i] <=> \"$sym\" */" + } else { + lappend table "-1," + } + } + + return [list "\n\t\t [join $table "\n\t\t "]" [llength $table]] +} + +proc critcl::emap::Offset {min} { + if {$min == 0} { + return "" + } elseif {$min < 0} { + return "+[expr {0-$min}]" + } else { + # Note: The 0+... ensures that we get a decimal number. + return "-[expr {0+$min}]" + } +} + +proc critcl::emap::DecideIfDirect {dict minv maxv dv} { + upvar 1 $minv min $maxv max $dv direct + + set min {} + set max {} + + dict for {sym value} $dict { + # Manage a direct mapping table from stati to strings, if we + # can see the numeric value of all stati. + if {[string is integer -strict $value]} { + if {($min eq {}) || ($value < $min)} { set min $value } + if {($max eq {}) || ($value > $max)} { set max $value } + lappend direct($value) $sym + } else { + return 0 + } + } + + if {$min eq {}} { return 0 } + if {$max eq {}} { return 0 } + if {($max-$min) >= 50} { return 0 } + return 1 +} + +proc critcl::emap::EncoderTcl {name nocase} { + if {$nocase} { + EncoderTclNocase $name + } else { + EncoderTclPlain $name + } + return +} + +proc critcl::emap::EncoderTclPlain {name} { + lappend map @NAME@ $name + lappend map @UNAME@ [string toupper $name] + + critcl::ccode \n[critcl::at::here!][string map $map { + int + @NAME@_encode (Tcl_Interp* interp, + Tcl_Obj* state, + int* result) + { + int id, res; + res = Tcl_GetIndexFromObj (interp, state, @NAME@_emap_cstr, "@NAME@", 0, &id); + if (res != TCL_OK) { + Tcl_SetErrorCode (interp, "@UNAME@", "STATE", NULL); + return TCL_ERROR; + } + + *result = @NAME@_emap_state [id]; + return TCL_OK; + } + }] + return +} + +proc critcl::emap::EncoderTclNocase {name} { + lappend map @NAME@ $name + lappend map @UNAME@ [string toupper $name] + + critcl::ccode \n[critcl::at::here!][string map $map { + int + @NAME@_encode (Tcl_Interp* interp, + Tcl_Obj* state, + int* result) + { + int id, res; + /* -nocase :: We duplicate the state string, making it unshared, + * allowing us to convert in place. As the string may change + * length (shrinking) we have to reset the length after + * conversion. + */ + state = Tcl_DuplicateObj (state); + Tcl_SetObjLength(state, Tcl_UtfToLower (Tcl_GetString (state))); + res = Tcl_GetIndexFromObj (interp, state, @NAME@_emap_cstr, "@NAME@", 0, &id); + Tcl_DecrRefCount (state); + if (res != TCL_OK) { + Tcl_SetErrorCode (interp, "@UNAME@", "STATE", NULL); + return TCL_ERROR; + } + + *result = @NAME@_emap_state [id]; + return TCL_OK; + } + }] + return +} + +proc critcl::emap::EncoderC {name nocase last} { + if {$nocase} { + EncoderCNocase $name $last + } else { + EncoderCPlain $name $last + } + return +} + +proc critcl::emap::EncoderCPlain {name last} { + lappend map @NAME@ $name + lappend map @UNAME@ [string toupper $name] + lappend map @LAST@ $last + + # case-sensitive search + critcl::ccode \n[critcl::at::here!][string map $map { + #include + + int + @NAME@_encode_cstr (const char* state) + { + int id; + /* explicit linear search */ + for (id = 0; id < @LAST@; id++) { + if (strcmp (state, @NAME@_emap_cstr [id]) != 0) continue; + return @NAME@_emap_state [id]; + } + return -1; + } + }] + return +} + +proc critcl::emap::EncoderCNocase {name last} { + lappend map @NAME@ $name + lappend map @UNAME@ [string toupper $name] + lappend map @LAST@ $last + + # case-insensitive search + critcl::ccode \n[critcl::at::here!][string map $map { + #include + + int + @NAME@_encode_cstr (const char* state) + { + /* -nocase :: We duplicate the state string, allowing us to + * convert in place. As the string may change length (shrink) + * we have to re-terminate it after conversion. + */ + int id, slen = 1 + strlen (state); + char* lower = ckalloc (slen); + + memcpy (lower, state, slen); + lower [Tcl_UtfToLower (lower)] = '\0'; + + /* explicit linear search */ + for (id = 0; id < @LAST@; id++) { + if (strcmp (lower, @NAME@_emap_cstr [id]) != 0) continue; + ckfree ((char*) lower); + return @NAME@_emap_state [id]; + } + ckfree ((char*) lower); + return -1; + } + }] + return +} + +proc critcl::emap::DecoderC {name isdirect last} { + if {$isdirect} { + DecoderCDirect $name + } else { + DecoderCSearch $name $last + } + return +} + +proc critcl::emap::DecoderCSearch {name last} { + # Decoder based on linear search. Because we either + # - see some symbolic values (= do not know actual value) + # - the direct mapping table would be too large (> 50 entries). + lappend map @NAME@ $name + lappend map @UNAME@ [string toupper $name] + lappend map @LAST@ $last + + critcl::ccode \n[critcl::at::here!][string map $map { + const char* + @NAME@_decode_cstr (int state) + { + /* Decode via linear search */ + int id; + for (id = 0; id < @LAST@; id++) { + if (@NAME@_emap_state [id] != state) continue; + return @NAME@_emap_cstr [id]; + } + return NULL; + } + }] + return +} + +proc critcl::emap::DecoderCDirect {name} { + lappend map @NAME@ $name + lappend map @UNAME@ [string toupper $name] + + critcl::ccode \n[critcl::at::here!][string map $map { + const char* + @NAME@_decode_cstr (int state) + { + /* Decode via direct mapping */ + int i = @NAME@_direct (state); + if (i < 0) { return NULL; } + /* Return the chosen string */ + return @NAME@_emap_cstr [i]; + } + }] + return +} + +proc critcl::emap::ResultType {name} { + lappend map @NAME@ $name + critcl::resulttype $name \n[critcl::at::here!][string map $map { + /* @NAME@_decode result is 0-refcount */ + { Tcl_Obj* ro = @NAME@_decode (interp, rv); + if (ro == NULL) { return TCL_ERROR; } + Tcl_SetObjResult (interp, ro); + return TCL_OK; } + }] int + return +} + +proc critcl::emap::ArgType {name} { + lappend map @NAME@ $name + critcl::argtype $name \n[critcl::at::here!][string map $map { + if (@NAME@_encode (interp, @@, &@A) != TCL_OK) return TCL_ERROR; + }] int int + return +} + +proc critcl::emap::Header {name} { + # I. Generate a header file for inclusion by other parts of the + # package, i.e. csources. Include the header here as well, for + # the following blocks of code. + # + # Declaration of the en- and decoder functions. + upvar 1 mode mode + append h [HeaderIntro $name] + append h [Tcl HeaderTcl $name] + append h [List Header+List $name] + append h [C HeaderC $name] + append h [HeaderEnd $name] + critcl::include [critcl::make ${name}.h $h] + return +} + +proc critcl::emap::HeaderIntro {name} { + lappend map @NAME@ $name + return \n[critcl::at::here!][string map $map { + #ifndef @NAME@_EMAP_HEADER + #define @NAME@_EMAP_HEADER + + #include + }] +} + +proc critcl::emap::HeaderEnd {name} { + lappend map @NAME@ $name + return [string map $map { + #endif /* @NAME@_EMAP_HEADER */ + }] +} + +proc critcl::emap::HeaderTcl {name} { + lappend map @NAME@ $name + return \n[critcl::at::here!][string map $map { + /* "tcl" + * Encode a Tcl string into the corresponding state code + * Decode a state into the corresponding Tcl string + */ + extern int @NAME@_encode (Tcl_Interp* interp, Tcl_Obj* state, int* result); + extern Tcl_Obj* @NAME@_decode (Tcl_Interp* interp, int state); + }] +} + +proc critcl::emap::Header+List {name} { + lappend map @NAME@ $name + return \n[critcl::at::here!][string map $map { + /* "+list" + * Decode a set of states into a list of the corresponding Tcl strings + */ + extern Tcl_Obj* @NAME@_decode_list (Tcl_Interp* interp, int c, int* state); + }] +} + +proc critcl::emap::HeaderC {name} { + lappend map @NAME@ $name + return \n[critcl::at::here!][string map $map { + /* "c" + * Encode a C string into the corresponding state code + * Decode a state into the corresponding C string + */ + extern int @NAME@_encode_cstr (const char* state); + extern const char* @NAME@_decode_cstr (int state); + }] +} + +proc critcl::emap::Iassoc {name symbols dict nocase last} { + upvar 1 mode mode + critcl::iassoc def ${name}_iassoc {} \ + [IassocStructure $last] \ + [IassocInit $name $symbols $dict $nocase $last] \ + [IassocFinal $symbols $dict] + return +} + +proc critcl::emap::IassocStructure {last} { + lappend map @LAST@ $last + return \n[critcl::at::here!][string map $map { + Tcl_Obj* tcl [@LAST@]; /* State name, Tcl_Obj*, sharable */ + }] +} + +proc critcl::emap::IassocInit {name symbols dict nocase last} { + set id -1 + foreach sym $symbols { + set value [dict get $dict $sym] + incr id + if {$nocase} { set sym [string tolower $sym] } + set map [list @ID@ $id @SYM@ $sym @VALUE@ $value @NAME@ $name] + + # iassoc initialization, direct from string, no C level + append init \n[critcl::at::here!][string map $map { + data->tcl [@ID@] = Tcl_NewStringObj (@NAME@_emap_cstr[@ID@], -1); + Tcl_IncrRefCount (data->tcl [@ID@]); + }] + } + return $init +} + +proc critcl::emap::IassocFinal {symbols dict} { + set id -1 + foreach sym $symbols { + incr id + set map [list @ID@ $id] + append final \n[critcl::at::here!][string map $map { + Tcl_DecrRefCount (data->tcl [@ID@]); + }] + } + return $final +} + +proc critcl::emap::ConstStringTable {name symbols dict nocase last} { + # C level table initialization (constant data) + foreach sym $symbols { + set value [dict get $dict $sym] + if {$nocase} { set sym [string tolower $sym] } + append ctable "\n\t \"${sym}\"," + append stable "\n\t ${value}," + } + append ctable "\n\t 0" + set stable [string trimright $stable ,] + + lappend map @NAME@ $name + lappend map @STRINGS@ $ctable + lappend map @STATES@ $stable + lappend map @LAST@ $last + + critcl::ccode [critcl::at::here!][string map $map { + /* State names, C string */ + static const char* @NAME@_emap_cstr [@LAST@+1] = {@STRINGS@ + }; + + /* State codes */ + static int @NAME@_emap_state [@LAST@] = {@STATES@ + }; + }] + return +} + +proc critcl::emap::C {args} { + upvar 1 mode mode + if {!$mode(c)} return + return [uplevel 1 $args] +} + +proc critcl::emap::!C {args} { + upvar 1 mode mode + if {$mode(c)} return + return [uplevel 1 $args] +} + +proc critcl::emap::Tcl {args} { + upvar 1 mode mode + if {!$mode(tcl)} return + return [uplevel 1 $args] +} + +proc critcl::emap::!Tcl {args} { + upvar 1 mode mode + if {$mode(tcl)} return + return [uplevel 1 $args] +} + +proc critcl::emap::List {args} { + upvar 1 mode mode + if {!$mode(+list)} return + return [uplevel 1 $args] +} + +proc critcl::emap::!List {args} { + upvar 1 mode mode + if {$mode(+list)} return + return [uplevel 1 $args] +} + +proc critcl::emap::Index {dict iv sv lv} { + upvar 1 $iv id $sv symbols $lv last + # For the C level search we want lexicographically sorted elements + set symbols [lsort -dict [dict keys $dict]] + set i 0 + foreach s $symbols { + set id($s) $i + incr i + } + set last $i + # id :: symbol -> index (sorted) + return +} + +proc critcl::emap::Options {options} { + upvar 1 nocase nocase mode mode + set nocase 0 + set use tcl + + while {[llength $options]} { + set options [lassign $options o] + switch -glob -- $o { + -nocase - + -nocas - + -noca - + -noc - + -no - + -n { set nocase 1 } + -mode - + -mod - + -mo - + -m { set options [lassign $options use] } + -* - + default { + return -code error -errorcode {CRITCL EMAP INVALID-OPTION} \ + "Expected option -nocase, or -use, got \"$o\"" + } + } + } + Use $use + return +} + +proc critcl::emap::Use {use} { + # Use cases: tcl, c, both + upvar 1 mode mode + set uses 0 + foreach u {c tcl +list} { set mode($u) 0 } + foreach u $use { set mode($u) 1 ; incr uses } + if {$mode(+list)} { set mode(tcl) 1 } + if {$uses} return + return -code error "Need at least one use case (c, tcl, or +list)" +} + +# # ## ### ##### ######## ############# ##################### +## Export API + +namespace eval ::critcl::emap { + namespace export def + catch { namespace ensemble create } +} + +namespace eval ::critcl { + namespace export emap + catch { namespace ensemble create } +} + +# # ## ### ##### ######## ############# ##################### +## Ready +return diff --git a/src/tclkit86bi.vfs/lib/critcl-emap1.3/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl-emap1.3/pkgIndex.tcl new file mode 100644 index 00000000..da70b48a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-emap1.3/pkgIndex.tcl @@ -0,0 +1,2 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl::emap 1.3 [list source [file join $dir emap.tcl]] diff --git a/src/tclkit86bi.vfs/lib/critcl-enum1.2/enum.tcl b/src/tclkit86bi.vfs/lib/critcl-enum1.2/enum.tcl new file mode 100644 index 00000000..4d77bf19 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-enum1.2/enum.tcl @@ -0,0 +1,151 @@ +## -*- tcl -*- +# # ## ### ##### ######## ############# ##################### +# Pragmas for MetaData Scanner. +# n/a + +# CriTcl Utility Commands. Generation of functions handling conversion +# from and to a C enum. Not a full Tcl_ObjType. Based on +# Tcl_GetIndexFromObj() instead. + +package provide critcl::enum 1.2 + +# # ## ### ##### ######## ############# ##################### +## Requirements. + +package require Tcl 8.6 ; # Min supported version. +package require critcl 3.1.11 ; # make, include -- dict portability +package require critcl::literals 1.1 ; # String pool for conversion to Tcl. + +namespace eval ::critcl::enum {} + +# # ## ### ##### ######## ############# ##################### +## API: Generate the declaration and implementation files for the enum. + +proc ::critcl::enum::def {name dict {use tcl}} { + # Arguments are + # - the C name of the enumeration, and + # - dict of strings to convert. Key is the symbolic C name, value + # is the string. Numeric C value is in the order of the strings in + # the dict, treating it as list for that case. + # + # dict: C symbolic name -> Tcl string (Tcl symbolic name). + + if {![dict size $dict]} { + return -code error -errorcode {CRITCL ENUM DEF INVALID} \ + "Expected an enum definition, got empty string" + } + + set plist 0 + foreach m $use { + switch $m { + tcl {} + +list { set plist 1 } + default { + return -code error -errorcode {CRITCL ENUM DEF MODE INVALID} \ + "Unknown mode $m, expected one of \"+list\", or \"tcl\"" + } + } + } + + critcl::literals::def ${name}_pool $dict $use + + # _pool_names = C enum of symbolic names, and implied numeric values. + # _pool.h = Header + # _pool ( interp, code ) => Tcl_Obj* :: up-conversion C to Tcl. + + # Exporting: + # Header .h + # Function _ToObj (interp, code) -> obj + # Function _ToObjList (interp, count, code*) -> obj (**) + # Function _GetFromObj (interp, obj, flags, &code) -> Tcl code + # Enum type _names + # + # (**) Mode +list only. + + dict for {sym str} $dict { + lappend table "\t\t\"$str\"," + } + + lappend map @NAME@ $name + lappend map @TABLE@ \n[join $table \n] + lappend map @TSIZE@ [llength $table] + lappend map @TSIZE1@ [expr {1 + [llength $table]}] + + if {$plist} { + lappend map @PLIST@ \ + "\n #define ${name}_ToObjList(i,c,l) (${name}_pool_list(i,c,l))" + } else { + lappend map @PLIST@ "" + } + + critcl::include [critcl::make ${name}.h \n[critcl::at::here!][string map $map { + #ifndef @NAME@_HEADER + #define @NAME@_HEADER + #include <@NAME@_pool.h> + #include + + typedef @NAME@_pool_names @NAME@; + #define @NAME@_LAST @NAME@_pool_name_LAST + + extern int + @NAME@_GetFromObj (Tcl_Interp* interp, + Tcl_Obj* obj, + int flags, + int* literal); + + #define @NAME@_ToObj(i,l) (@NAME@_pool(i,l))@PLIST@ + #endif + }]] + + # Create second function, down-conversion Tcl to C. + + critcl::ccode [critcl::at::here!][string map $map { + extern int + @NAME@_GetFromObj (Tcl_Interp* interp, + Tcl_Obj* obj, + int flags, + int* literal ) + { + static const char* strings[@TSIZE1@] = {@TABLE@ + NULL + }; + + return Tcl_GetIndexFromObj (interp, obj, strings, + "@NAME@", + flags, literal); + } + }] + + + # V. Define convenient argument- and result-type definitions + # wrapping the de- and encoder functions for use by cprocs. + + critcl::argtype $name \n[critcl::at::here!][string map $map { + if (@NAME@_GetFromObj (interp, @@, TCL_EXACT, &@A) != TCL_OK) return TCL_ERROR; + }] int int + + critcl::argtype ${name}-prefix \n[critcl::at::here!][string map $map { + if (@NAME@_GetFromObj (interp, @@, 0, &@A) != TCL_OK) return TCL_ERROR; + }] int int + + # Use the underlying literal pool directly. + critcl::resulttype $name = ${name}_pool + return +} + +# # ## ### ##### ######## ############# ##################### +## Export API + +namespace eval ::critcl::enum { + namespace export def + catch { namespace ensemble create } +} + +namespace eval ::critcl { + namespace export enum + catch { namespace ensemble create } +} + +# # ## ### ##### ######## ############# ##################### +## Ready +return diff --git a/src/tclkit86bi.vfs/lib/critcl-enum1.2/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl-enum1.2/pkgIndex.tcl new file mode 100644 index 00000000..310a54f6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-enum1.2/pkgIndex.tcl @@ -0,0 +1,2 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl::enum 1.2 [list source [file join $dir enum.tcl]] diff --git a/src/tclkit86bi.vfs/lib/critcl-iassoc1.2/iassoc.tcl b/src/tclkit86bi.vfs/lib/critcl-iassoc1.2/iassoc.tcl new file mode 100644 index 00000000..42de85de --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-iassoc1.2/iassoc.tcl @@ -0,0 +1,182 @@ +## -*- tcl -*- +# # ## ### ##### ######## ############# ##################### +# Pragmas for MetaData Scanner. +# @mdgen OWNER: iassoc.h + +# CriTcl Utility Commands. Specification of a C function and structure +# associated with an interpreter made easy. + +package provide critcl::iassoc 1.2 + +# # ## ### ##### ######## ############# ##################### +## Requirements. + +package require Tcl 8.6 ; # Min supported version. +package require critcl 3.1.13 ; # Need 'meta?' to get the package name. + # Need 'Deline' helper. +package require critcl::util ; # Use the package's Get/Put commands. + +namespace eval ::critcl::iassoc {} + +# # ## ### ##### ######## ############# ##################### +## API: Generate the declaration and implementation files for the iassoc. + +proc ::critcl::iassoc::def {name arguments struct constructor destructor} { + critcl::at::caller + critcl::at::incrt $arguments ; set sloc [critcl::at::get*] + critcl::at::incrt $struct ; set cloc [critcl::at::get*] + critcl::at::incrt $constructor ; set dloc [critcl::at::get] + + set struct $sloc$struct + set constructor $cloc$constructor + set destructor $dloc$destructor + + # Arguments: + # - name of the C function which will provide access to the + # structure. This name, with a fixed prefix is also used to + # identify the association within the interpreter, and for + # the structure's type. + # + # - C code declaring the structure's contents. + # - C code executed to initialize the structure. + # - C code executed to destroy the structure. + + # Note that this is, essentially, a singleton object, without + # methods. + + # Pull the package we are working on out of the system. + + set package [critcl::meta? name] + set qpackage [expr {[string match ::* $package] + ? "$package" + : "::$package"}] + lassign [uplevel 1 [list ::critcl::name2c $qpackage]] pns pcns package cpackage + + #puts "%%% pNS |$pns|" + #puts "%%% Pkg |$package|" + #puts "%%% pCNS |$pcns|" + #puts "%%% cPkg |$cpackage|" + #puts "%%% Name |$name|" + #puts "@@@ <<$data>>" + + set stem ${pcns}${cpackage}_iassoc_${name} + set type ${name}_data + set label critcl::iassoc/p=$package/a=$name + + set anames {} + if {[llength $arguments]} { + foreach {t v} $arguments { + lappend alist "$t $v" + lappend anames $v + } + set arguments ", [join $alist {, }]" + set anames ", [join $anames {, }]" + } + + lappend map "\t" {} + lappend map @package@ $package + lappend map @name@ $name + lappend map @stem@ $stem + lappend map @label@ $label + lappend map @type@ $type + lappend map @struct@ $struct + lappend map @argdecls@ $arguments + lappend map @argnames@ $anames + lappend map @constructor@ $constructor + lappend map @destructor@ $destructor + + #puts T=[string length $template] + + critcl::include [critcl::make ${name}.h \n[critcl::at::here!][string map $map { + #ifndef @name@_HEADER + #define @name@_HEADER + + #include + + typedef struct @type@__ { + @struct@ + } @type@__; + typedef struct @type@__* @type@; + + extern @type@ + @name@ (Tcl_Interp* interp@argdecls@); + + #endif + }]] + + # Note: Making the .c code a `csources` instead of including it + # directly is a backward incompatible API change (The C code does + # not see any preceding includes. Which may define things used + # in/by the user's constructor. Breaks the users of iassoc, like + # bitmap, emap, etc. -- change defered -- + critcl::include [critcl::make ${name}.c \n[critcl::at::here!][string map $map { + /* + * For package "@package@". + * Implementation of Tcl Interpreter Association "@name@". + * + * Support functions for structure creation and destruction. + */ + + static void + @stem@_Release (@type@ data, Tcl_Interp* interp) + { + @destructor@ + ckfree((char*) data); + } + + static @type@ + @stem@_Init (Tcl_Interp* interp@argdecls@) + { + @type@ data = (@type@) ckalloc (sizeof (@type@__)); + + @constructor@ + return data; + + error: + ckfree ((char*) data); + return NULL; + } + + /* + * Structure accessor, automatically creating it if the + * interpreter does not have it already, setting it up for + * destruction on interpreter shutdown. + */ + + @type@ + @name@ (Tcl_Interp* interp@argdecls@) + { + #define KEY "@label@" + + Tcl_InterpDeleteProc* proc = (Tcl_InterpDeleteProc*) @stem@_Release; + @type@ data; + + data = Tcl_GetAssocData (interp, KEY, &proc); + if (data) { + return data; + } + + data = @stem@_Init (interp@argnames@); + + if (data) { + Tcl_SetAssocData (interp, KEY, proc, (ClientData) data); + } + + return data; + #undef KEY + } + }]] + return +} + +# # ## ### ##### ######## ############# ##################### +## Export API + +namespace eval ::critcl::iassoc { + namespace export def + catch { namespace ensemble create } +} + +# # ## ### ##### ######## ############# ##################### +## Ready +return diff --git a/src/tclkit86bi.vfs/lib/critcl-iassoc1.2/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl-iassoc1.2/pkgIndex.tcl new file mode 100644 index 00000000..3c38194b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-iassoc1.2/pkgIndex.tcl @@ -0,0 +1,2 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl::iassoc 1.2 [list source [file join $dir iassoc.tcl]] diff --git a/src/tclkit86bi.vfs/lib/critcl-literals1.4/literals.tcl b/src/tclkit86bi.vfs/lib/critcl-literals1.4/literals.tcl new file mode 100644 index 00000000..24f68bb4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-literals1.4/literals.tcl @@ -0,0 +1,330 @@ +## -*- tcl -*- +# # ## ### ##### ######## ############# ##################### +# Pragmas for MetaData Scanner. +# n/a + +# CriTcl Utility Package for Shared Tcl_Obj* literals of a package. +# Based on critcl::iassoc. +# +# Copyright (c) 20??-2022 Andreas Kupries + +package provide critcl::literals 1.4 + +# # ## ### ##### ######## ############# ##################### +## Requirements. + +package require Tcl 8.6 ; # Min supported version. +package require critcl 3.1.11 ; # make, include -- dict portability +package require critcl::iassoc + +namespace eval ::critcl::literals {} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Embed C Code + +proc critcl::literals::def {name dict {use tcl}} { + # dict :: map (C symbolic name -> string) + Use $use + Header $name $dict + + C ConstStringTable $name $dict + C AccessorC $name + + Tcl Iassoc $name $dict + Tcl AccessorTcl $name + Tcl ResultType $name + + +List AccessorTcl+List $name + return +} + +# # ## ### ##### ######## ############# ##################### +## Internals + +proc critcl::literals::Use {use} { + # Use cases: tcl, c, both, +list-mode + upvar 1 mode mode + set uses 0 + foreach u {c tcl +list} { set mode($u) 0 } + foreach u $use { set mode($u) 1 ; incr uses } + # +list-mode is an extension of tcl mode, thus implies it + if {$mode(+list)} { set mode(tcl) 1 } + if {$uses} return + return -code error "Need at least one use case (c, +list, or tcl)" +} + +proc critcl::literals::ConstStringTable {name dict} { + # C level table initialization (constant data) + dict for {sym string} $dict { + append ctable "\n\t\"${string}\"," + } + append ctable "\n\t0" + + lappend map @NAME@ $name + lappend map @STRINGS@ $ctable + critcl::ccode [critcl::at::here!][string map $map { + static const char* @NAME@_literal[] = { + @STRINGS@ + }; + }] + return +} + +proc critcl::literals::Iassoc {name dict} { + upvar 1 mode mode + lappend map @NAME@ $name + critcl::iassoc def ${name}_iassoc {} \n[critcl::at::here!][string map $map { + /* Array of the string literals, indexed by the symbolic names */ + Tcl_Obj* literal [@NAME@_name_LAST]; + }] [IassocInit $name $dict] [IassocFinal $dict] + return +} + +proc critcl::literals::IassocFinal {dict} { + # Finalization code for iassoc structures + dict for {sym string} $dict { + append final "\n[critcl::at::here!]\n\tTcl_DecrRefCount (data->literal \[$sym\]);" + } + return $final +} + +proc critcl::literals::IassocInit {name dict} { + # Initialization code for iassoc structures. + # Details dependent on if C is supported together with Tcl, or not. + upvar 1 mode mode + return [C IassocInitWithC $name $dict][!C IassocInitTcl $dict] +} + +proc critcl::literals::IassocInitWithC {name dict} { + dict for {sym string} $dict { + set map [list @SYM@ $sym @NAME@ $name] + append init \n[critcl::at::here!][string map $map { + data->literal [@SYM@] = Tcl_NewStringObj (@NAME@_literal[@SYM@], -1); + Tcl_IncrRefCount (data->literal [@SYM@]); + }] + } + return $init +} + +proc critcl::literals::IassocInitTcl {dict} { + dict for {sym string} $dict { + set map [list @SYM@ $sym @STR@ $string] + append init \n[critcl::at::here!][string map $map { + data->literal [@SYM@] = Tcl_NewStringObj ("@STR@", -1); + Tcl_IncrRefCount (data->literal [@SYM@]); + }] + } + return $init +} + +proc critcl::literals::Header {name dict} { + # I. Generate a header file for inclusion by other parts of the + # package, i.e. csources. Include the header here as well, for + # the following blocks of code. + # + # Declarations of an enum of the symbolic names, plus the + # accessor function. + upvar 1 mode mode + append h [HeaderIntro $name $dict] + append h [Tcl HeaderTcl $name] + append h [+List HeaderTcl+List $name] + append h [C HeaderC $name] + append h [HeaderEnd $name] + critcl::include [critcl::make ${name}.h $h] + return +} + +proc critcl::literals::HeaderIntro {name dict} { + lappend map @NAME@ $name + lappend map @CODES@ [join [dict keys $dict] {, }] + return \n[critcl::at::here!][string map $map { + #ifndef @NAME@_LITERALS_HEADER + #define @NAME@_LITERALS_HEADER + + #include + + /* Symbolic names for the literals */ + typedef enum @NAME@_names { + @CODES@ + , @NAME@_name_LAST + } @NAME@_names; + }] +} + +proc critcl::literals::HeaderEnd {name} { + lappend map @NAME@ $name + return [string map $map { + #endif /* @NAME@_LITERALS_HEADER */ + }] +} + +proc critcl::literals::HeaderTcl {name} { + lappend map @NAME@ $name + return \n[critcl::at::here!][string map $map { + /* Tcl Accessor function for the literals */ + extern Tcl_Obj* + @NAME@ (Tcl_Interp* interp, @NAME@_names literal); + }] +} + +proc critcl::literals::HeaderTcl+List {name} { + lappend map @NAME@ $name + return \n[critcl::at::here!][string map $map { + /* Tcl "+list" Accessor function for the literals */ + extern Tcl_Obj* + @NAME@_list (Tcl_Interp* interp, int c, @NAME@_names* literal); + }] +} + +proc critcl::literals::HeaderC {name} { + lappend map @NAME@ $name + return \n[critcl::at::here!][string map $map { + /* C Accessor function for the literals */ + extern const char* @NAME@_cstr (@NAME@_names literal); + }] +} + +proc critcl::literals::ResultType {name} { + lappend map @NAME@ $name + critcl::resulttype $name \n[critcl::at::here!][string map $map { + /* @NAME@ result is effectively 0-refcount */ + Tcl_SetObjResult (interp, @NAME@ (interp, rv)); + return TCL_OK; + }] int +} + +proc critcl::literals::AccessorTcl {name} { + lappend map @NAME@ $name + critcl::ccode [critcl::at::here!][string map $map { + Tcl_Obj* + @NAME@ (Tcl_Interp* interp, @NAME@_names literal) + { + if ((literal < 0) || (literal >= @NAME@_name_LAST)) { + Tcl_Panic ("Bad @NAME@ literal index %d outside [0...%d]", + literal, @NAME@_name_LAST-1); + } + return @NAME@_iassoc (interp)->literal [literal]; + } + }] + return +} + +proc critcl::literals::AccessorTcl+List {name} { + lappend map @NAME@ $name + critcl::ccode [critcl::at::here!][string map $map { + Tcl_Obj* + @NAME@_list (Tcl_Interp* interp, int c, @NAME@_names* literal) + { + int k; + for (k=0; k < c; k++) { + if ((literal[k] < 0) || (literal[k] >= @NAME@_name_LAST)) { + Tcl_Panic ("Bad @NAME@ literal index %d outside [0...%d]", + literal[k], @NAME@_name_LAST-1); + } + } + + Tcl_Obj* result = Tcl_NewListObj (0, 0); + if (!result) return result; + + for (k=0; k < c; k++) { + if (TCL_OK == Tcl_ListObjAppendElement (interp, result, @NAME@_iassoc (interp)->literal [literal [k]])) + continue; + /* Failed to append, release and abort */ + Tcl_DecrRefCount (result); + return 0; + } + + return result; + } + }] + return +} + +proc critcl::literals::AccessorC {name} { + upvar 1 mode mode + return [Tcl AccessorCWithTcl $name][!Tcl AccessorCRaw $name] +} + +proc critcl::literals::AccessorCWithTcl {name} { + # C accessor can use Tcl API + lappend map @NAME@ $name + critcl::ccode [critcl::at::here!][string map $map { + const char* + @NAME@_cstr (@NAME@_names literal) + { + if ((literal < 0) || (literal >= @NAME@_name_LAST)) { + Tcl_Panic ("Bad @NAME@ literal"); + } + return @NAME@_literal [literal]; + } + }] + return +} + +proc critcl::literals::AccessorCRaw {name} { + # C accessor has only basics + lappend map @NAME@ $name + critcl::ccode [critcl::at::here!][string map $map { + #include + const char* + @NAME@_cstr (@NAME@_names literal) + { + assert ((0 <= literal) && (literal < @NAME@_name_LAST)); + return @NAME@_literal [literal]; + } + }] + return +} + +proc critcl::literals::C {args} { + upvar 1 mode mode + if {!$mode(c)} return + return [uplevel 1 $args] +} + +proc critcl::literals::!C {args} { + upvar 1 mode mode + if {$mode(c)} return + return [uplevel 1 $args] +} + +proc critcl::literals::Tcl {args} { + upvar 1 mode mode + if {!$mode(tcl)} return + return [uplevel 1 $args] +} + +proc critcl::literals::!Tcl {args} { + upvar 1 mode mode + if {$mode(tcl)} return + return [uplevel 1 $args] +} + +proc critcl::literals::+List {args} { + upvar 1 mode mode + if {!$mode(+list)} return + return [uplevel 1 $args] +} + +proc critcl::literals::!+List {args} { + upvar 1 mode mode + if {$mode(+list)} return + return [uplevel 1 $args] +} + +# # ## ### ##### ######## ############# ##################### +## Export API + +namespace eval ::critcl::literals { + namespace export def + catch { namespace ensemble create } +} + +namespace eval ::critcl { + namespace export literals + catch { namespace ensemble create } +} + +# # ## ### ##### ######## ############# ##################### +## Ready +return diff --git a/src/tclkit86bi.vfs/lib/critcl-literals1.4/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl-literals1.4/pkgIndex.tcl new file mode 100644 index 00000000..ffb5dbde --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-literals1.4/pkgIndex.tcl @@ -0,0 +1,2 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl::literals 1.4 [list source [file join $dir literals.tcl]] diff --git a/src/tclkit86bi.vfs/lib/critcl-platform1.1/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl-platform1.1/pkgIndex.tcl new file mode 100644 index 00000000..4f12190a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-platform1.1/pkgIndex.tcl @@ -0,0 +1,2 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl::platform 1.1 [list source [file join $dir platform.tcl]] diff --git a/src/tclkit86bi.vfs/lib/critcl-platform1.1/platform.tcl b/src/tclkit86bi.vfs/lib/critcl-platform1.1/platform.tcl new file mode 100644 index 00000000..97481943 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-platform1.1/platform.tcl @@ -0,0 +1,404 @@ +# -*- tcl -*- +# ### ### ### ######### ######### ######### +## Overview + +# Heuristics to assemble a platform identifier from publicly available +# information. The identifier describes the platform of the currently +# running tcl shell. This is a mixture of the runtime environment and +# of build-time properties of the executable itself. +# +# Examples: +# <1> A tcl shell executing on a x86_64 processor, but having a +# wordsize of 4 was compiled for the x86 environment, i.e. 32 +# bit, and loaded packages have to match that, and not the +# actual cpu. +# +# <2> The hp/solaris 32/64 bit builds of the core cannot be +# distinguished by looking at tcl_platform. As packages have to +# match the 32/64 information we have to look in more places. In +# this case we inspect the executable itself (magic numbers, +# i.e. fileutil::magic::filetype). +# +# The basic information used comes out of the 'os' and 'machine' +# entries of the 'tcl_platform' array. A number of general and +# os/machine specific transformation are applied to get a canonical +# result. +# +# General +# Only the first element of 'os' is used - we don't care whether we +# are on "Windows NT" or "Windows XP" or whatever. +# +# Machine specific +# % arm* -> arm +# % sun4* -> sparc +# % intel -> ix86 +# % i*86* -> ix86 +# % Power* -> powerpc +# % x86_64 + wordSize 4 => x86 code +# +# OS specific +# % AIX are always powerpc machines +# % HP-UX 9000/800 etc means parisc +# % linux has to take glibc version into account +# % sunos -> solaris, and keep version number +# +# NOTE: A platform like linux glibc 2.3, which can use glibc 2.2 stuff +# has to provide all possible allowed platform identifiers when +# searching search. Ditto a solaris 2.8 platform can use solaris 2.6 +# packages. Etc. This is handled by the other procedure, see below. + +package require Tcl 8.6 + +# ### ### ### ######### ######### ######### +## Requirements + +namespace eval ::platform {} + +# ### ### ### ######### ######### ######### +## Implementation + +# -- platform::generic +# +# Assembles an identifier for the generic platform. It leaves out +# details like kernel version, libc version, etc. + +proc ::platform::generic {} { + global tcl_platform + + set plat [string tolower [lindex $tcl_platform(os) 0]] + set cpu $tcl_platform(machine) + + switch -glob -- $cpu { + sun4* { + set cpu sparc + } + intel - + i*86* { + set cpu ix86 + } + x86_64 { + if {$tcl_platform(wordSize) == 4} { + # See Example <1> at the top of this file. + set cpu ix86 + } + } + "Power*" { + set cpu powerpc + } + "arm*" { + set cpu arm + } + ia64 { + if {$tcl_platform(wordSize) == 4} { + append cpu _32 + } + } + } + + switch -glob -- $plat { + cygwin* { + set plat cygwin + } + windows { + if {$tcl_platform(platform) == "unix"} { + set plat cygwin + } else { + set plat win32 + } + if {$cpu eq "amd64"} { + # Do not check wordSize, win32-x64 is an IL32P64 platform. + set cpu x86_64 + } + } + sunos { + set plat solaris + if {[string match "ix86" $cpu]} { + if {$tcl_platform(wordSize) == 8} { + set cpu x86_64 + } + } elseif {![string match "ia64*" $cpu]} { + # sparc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + } + darwin { + set plat macosx + # Correctly identify the cpu when running as a 64bit + # process on a machine with a 32bit kernel + if {$cpu eq "ix86"} { + if {$tcl_platform(wordSize) == 8} { + set cpu x86_64 + } + } + } + aix { + set cpu powerpc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + hp-ux { + set plat hpux + if {![string match "ia64*" $cpu]} { + set cpu parisc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + } + osf1 { + set plat tru64 + } + } + + return "${plat}-${cpu}" +} + +# -- platform::identify +# +# Assembles an identifier for the exact platform, by extending the +# generic identifier. I.e. it adds in details like kernel version, +# libc version, etc., if they are relevant for the loading of +# packages on the platform. + +proc ::platform::identify {} { + global tcl_platform + + set id [generic] + regexp {^([^-]+)-([^-]+)$} $id -> plat cpu + + switch -- $plat { + freebsd { + set abi [lindex [split $tcl_platform(osVersion) .] 0] + append plat $abi + return "${plat}-${cpu}" + } + solaris { + regsub {^5} $tcl_platform(osVersion) 2 text + append plat $text + return "${plat}-${cpu}" + } + macosx { + set major [lindex [split $tcl_platform(osVersion) .] 0] + if {$major > 8} { + incr major -4 + append plat 10.$major + return "${plat}-${cpu}" + } + } + linux { + # Look for the libc*.so and determine its version + # (libc5/6, libc6 further glibc 2.X) + + set v unknown + + # Determine in which directory to look. /lib, or /lib64. + # For that we use the tcl_platform(wordSize). + # + # We could use the 'cpu' info, per the equivalence below, + # that however would be restricted to intel. And this may + # be a arm, mips, etc. system. The wordsize is more + # fundamental. + # + # ix86 <=> (wordSize == 4) <=> 32 bit ==> /lib + # x86_64 <=> (wordSize == 8) <=> 64 bit ==> /lib64 + # + # Do not look into /lib64 even if present, if the cpu + # doesn't fit. + + # TODO: Determine the prefixes (i386, x86_64, ...) for + # other cpus. The path after the generic one is utterly + # specific to intel right now. Ok, on Ubuntu, possibly + # other Debian systems we may apparently be able to query + # the necessary CPU code. If we can't we simply use the + # hardwired fallback. + + switch -exact -- $tcl_platform(wordSize) { + 4 { + lappend bases /lib + if {[catch { + exec dpkg-architecture -qDEB_HOST_MULTIARCH + } res]} { + lappend bases /lib/i386-linux-gnu + } else { + # dpkg-arch returns the full tripled, not just cpu. + lappend bases /lib/$res + } + } + 8 { + lappend bases /lib64 + if {[catch { + exec dpkg-architecture -qDEB_HOST_MULTIARCH + } res]} { + lappend bases /lib/x86_64-linux-gnu + } else { + # dpkg-arch returns the full tripled, not just cpu. + lappend bases /lib/$res + } + } + default { + return -code error "Bad wordSize $tcl_platform(wordSize), expected 4 or 8" + } + } + + foreach base $bases { + if {[LibcVersion $base -> v]} break + } + + append plat -$v + return "${plat}-${cpu}" + } + } + + return $id +} + +proc ::platform::LibcVersion {base _->_ vv} { + upvar 1 $vv v + set libclist [lsort [glob -nocomplain -directory $base libc*]] + + if {![llength $libclist]} { return 0 } + + set libc [lindex $libclist 0] + + # Try executing the library first. This should suceed + # for a glibc library, and return the version + # information. + + if {![catch { + set vdata [lindex [split [exec $libc] \n] 0] + }]} { + regexp {version ([0-9]+(\.[0-9]+)*)} $vdata -> v + foreach {major minor} [split $v .] break + set v glibc${major}.${minor} + return 1 + } else { + # We had trouble executing the library. We are now + # inspecting its name to determine the version + # number. This code by Larry McVoy. + + if {[regexp -- {libc-([0-9]+)\.([0-9]+)} $libc -> major minor]} { + set v glibc${major}.${minor} + return 1 + } + } + return 0 +} + +# -- platform::patterns +# +# Given an exact platform identifier, i.e. _not_ the generic +# identifier it assembles a list of exact platform identifier +# describing platform which should be compatible with the +# input. +# +# I.e. packages for all platforms in the result list should be +# loadable on the specified platform. + +# << Should we add the generic identifier to the list as well ? In +# general it is not compatible I believe. So better not. In many +# cases the exact identifier is identical to the generic one +# anyway. +# >> + +proc ::platform::patterns {id} { + set res [list $id] + if {$id eq "tcl"} {return $res} + + switch -glob -- $id { + solaris*-* { + if {[regexp {solaris([^-]*)-(.*)} $id -> v cpu]} { + if {$v eq ""} {return $id} + foreach {major minor} [split $v .] break + incr minor -1 + for {set j $minor} {$j >= 6} {incr j -1} { + lappend res solaris${major}.${j}-${cpu} + } + } + } + linux*-* { + if {[regexp {linux-glibc([^-]*)-(.*)} $id -> v cpu]} { + foreach {major minor} [split $v .] break + incr minor -1 + for {set j $minor} {$j >= 0} {incr j -1} { + lappend res linux-glibc${major}.${j}-${cpu} + } + } + } + macosx-powerpc { + lappend res macosx-universal + } + macosx-x86_64 { + lappend res macosx-i386-x86_64 + } + macosx-ix86 { + lappend res macosx-universal macosx-i386-x86_64 + } + macosx*-* { + # 10.5+ + if {[regexp {macosx([^-]*)-(.*)} $id -> v cpu]} { + + switch -exact -- $cpu { + ix86 { + lappend alt i386-x86_64 + lappend alt universal + } + x86_64 { lappend alt i386-x86_64 } + default { set alt {} } + } + + if {$v ne ""} { + foreach {major minor} [split $v .] break + + # Add 10.5 to 10.minor to patterns. + set res {} + for {set j $minor} {$j >= 5} {incr j -1} { + lappend res macosx${major}.${j}-${cpu} + foreach a $alt { + lappend res macosx${major}.${j}-$a + } + } + + # Add unversioned patterns for 10.3/10.4 builds. + lappend res macosx-${cpu} + foreach a $alt { + lappend res macosx-$a + } + } else { + # No version, just do unversioned patterns. + foreach a $alt { + lappend res macosx-$a + } + } + } else { + # no v, no cpu ... nothing + } + } + } + lappend res tcl ; # Pure tcl packages are always compatible. + return $res +} + + +# ### ### ### ######### ######### ######### +## Ready + +package provide critcl::platform 1.1 + +# ### ### ### ######### ######### ######### +## Demo application + +if {[info exists argv0] && ($argv0 eq [info script])} { + puts ==================================== + parray tcl_platform + puts ==================================== + puts Generic\ identification:\ [::platform::generic] + puts Exact\ identification:\ \ \ [::platform::identify] + puts ==================================== + puts Search\ patterns: + puts *\ [join [::platform::patterns [::platform::identify]] \n*\ ] + puts ==================================== + exit 0 +} diff --git a/src/tclkit86bi.vfs/lib/critcl-util1.2/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl-util1.2/pkgIndex.tcl new file mode 100644 index 00000000..221bb819 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-util1.2/pkgIndex.tcl @@ -0,0 +1,2 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl::util 1.2 [list source [file join $dir util.tcl]] diff --git a/src/tclkit86bi.vfs/lib/critcl-util1.2/util.tcl b/src/tclkit86bi.vfs/lib/critcl-util1.2/util.tcl new file mode 100644 index 00000000..954d5bca --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl-util1.2/util.tcl @@ -0,0 +1,149 @@ +## -*- tcl -*- +# # ## ### ##### ######## ############# ##################### +# Pragmas for MetaData Scanner. +# n/a + +# CriTcl Utility Commands. + +package provide critcl::util 1.2 + +# # ## ### ##### ######## ############# ##################### +## Requirements. + +package require Tcl 8.6 ; # Min supported version. +package require critcl 3.2 + +namespace eval ::critcl::util {} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Embed C Code + +proc ::critcl::util::locate {label paths {cmd {}}} { + # Locate a file across set of paths. + # Relative paths are to "::critcl::Here". + # Paths are run through subst for dynamic construction. + # A command prefix can be specified, to further check/process each found path. + # Result is the found path, as coming from the paths argument. + # Should go into cheader or similar command. + # Failure to find is reported via critcl::error + + foreach path $paths { + if {[file pathtype $path] eq "relative"} { + set fullpath [file normalize [file join [critcl::Here] $path]] + } else { + set fullpath $path + } + if {![file exists $fullpath]} continue + if {[llength $cmd] && ![uplevel 1 [linsert $cmd end $fullpath]]} continue + critcl::msg "${label}: $path" + return $path + } + critcl::error "${label}: not found, searched [linsert [join $paths {, }] end-1 and]" + return +} + +proc ::critcl::util::checkfun {name {label {}}} { + variable cftemplate + if {$label eq {}} { set label "Checking for function '$name'" } + return [critcl::checklink $label [string map [list @@@ $name] $cftemplate]] +} + +proc ::critcl::util::def {configfile define {value 1}} { + set result [file join [critcl::cache] [file tail $configfile]] + + Put $result "[Get $result]\n\#define $define $value\n" + return +} + +proc ::critcl::util::undef {configfile define} { + set result [file join [critcl::cache] [file tail $configfile]] + + Put $result "[Get $result]\n\#undef $define\n" + return +} + +# # ## ### ##### ######## ############# ##################### + +proc ::critcl::util::Get {path} { + if {[catch { + set c [open $path r] + set d [read $c] + close $c + }]} { + set d {} + } + return $d +} + +proc ::critcl::util::Put {path data} { + # Write changes back, via temp file. Commit via atomic rename. + set c [open $path.[pid] w] + puts -nonewline $c $data + close $c + file rename -force $path.[pid] $path + return +} + +# # ## ### ##### ######## ############# ##################### +## State + +namespace eval ::critcl::util { + variable cftemplate { + /* The header may declare @@@. To avoid a clash + * redefine it to something aside. As an example, gettimeofday() + * is declared in the provided by HP-UX 11i. Regardless, + * we pull in a system header defining the __stub macros, and a + * few prototypes only possibly in conflict with @@@, we hope. + * As exists even on free-standing compilers its use + * is preferred when __STDC__ is active. + */ + + #define @@@ innocuous_@@@ + #ifdef __STDC__ + # include + #else + # include + #endif + #undef @@@ + + /* Next up a declaration to override whatever internal prototype + * was declared by GCC, to prevent an error. As the return type + * 'int' might match such a GCC builtin, and thus causing the application + * of the argument prototype despite this we use 'char' instead. + */ + + #ifdef __cplusplus + extern "C" + #endif + char @@@ (); + + /* Lastly the GNU libc defines a few special names for its functions, + * these will always fail with ENONSYS. Further, some functions + * actually start with __, with the normal name (we are looking for) + * an alias of it. Regardless, for these we bail. + */ + + #if defined __stub_@@@ || defined __stub___@@@ + choke me + #endif + + int main () + { + return @@@ (); + ; + return 0; + } + } +} + +# # ## ### ##### ######## ############# ##################### +## Export API + +namespace eval ::critcl::util { + namespace export checkfun def undef locate + catch { namespace ensemble create } +} + +# # ## ### ##### ######## ############# ##################### +## Ready +return diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/Config b/src/tclkit86bi.vfs/lib/critcl3.2/Config new file mode 100644 index 00000000..185b968e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/Config @@ -0,0 +1,537 @@ +# -*- tcl -*- Critcl configuration file + +# some defaults - you can override these in the platform specific section +# but shouldn't need to for typical *nix toolchains using gcc +# +# platform sets the platform (defaults to platform::generic) +# target indicates that this is a cross-compile target, the value is the actual platform code. +# compile compile a C source file to an object file +# version print the compiler version number +# ldout See below +# link Command to link one or more object files and create a shared library +# embed_manifest Command to embed a manifest into a DLL. (Win-specific) +# link_debug See below +# link_preload Linker flags to use when dependent libraries are pre-loaded. +# link_release See below +# preproc_define preprocess C source file (for critcl::cdefines) +# preproc_enum ditto +# tclstubs cflag to set USE_TCL_STUBS +# tkstubs cflag to set USE_TK_STUBS +# debug_memory cflag to enable memory debugging +# debug_symbols cflag to add symbols to resulting library +# object file extension for object files +# output flags to set output file +# strip cflag to tell linker to strip symbols +# optimize cflag to specify optimization level +# include cflag to add an include directory +# noassert cflag to turn off assertions in Tcl code +# threadflags cflags to enable threaded build +# sharedlibext the platform's file extension for shared libraries +# +# (Support for Fortran) +# fcompile compile a Fortran source file to an object file +# fversion print the Fortran compiler version number +# flink link one or more object files and create a shared library, +# if at least one object file comes from Fortran +# foutput Fortran flag(s) to set output file +# finclude Fortran flag to add an include directory +# fextra_cflags Extra C flags for indicating type of Fortran compiler +# +# Any other config options are assumed to refer to Tcl variables and +# these are set when building so they can be used in the Critcl script. +# Typically this is used when defining cross-compile environments to set +# various tcl_platform() values. +# +# You can also set Tcl variables to use in "when" options (see the MacOSX +# section for an example - "set universal ..."). These commands and the +# "when" commands are run in a separate interpreter. +# +# You can also base a build configuration on an existing one by using +# the "copy" option and then specifically setting the config bits that +# you want to change. See win32-x86_64-cl for an example. + +compile gcc -c -fPIC +version gcc -v +link gcc -shared +include -I +libinclude -L +preproc_define gcc -E -dM +preproc_enum gcc -E +tclstubs -DUSE_TCL_STUBS +tkstubs -DUSE_TK_STUBS +debug_memory -DTCL_MEM_DEBUG +debug_symbols -g +object .o +output -o [list $outfile] +embed_manifest +ldoutput +link_debug +link_release +link_preload --unresolved-symbols=ignore-in-shared-libs +link_rpath -Wl,-rpath,@ +strip -Wl,-s +optimize -O2 +noassert -DNDEBUG +threadflags -DUSE_THREAD_ALLOC=1 -D_REENTRANT=1 -D_THREAD_SAFE=1 \ + -DHAVE_PTHREAD_ATTR_SETSTACKSIZE=1 -DHAVE_READDIR_R=1 \ + -DTCL_THREADS=1 + +# platform specific stuff follows + +# OSX - check if universal binaries supported by the installed toolchain + +if {[string match macosx-* $platform]} { + if {[info exists ::env(SDKROOT)] && $::env(SDKROOT) ne ""} { + set SDKROOT $::env(SDKROOT) + } else { + # look for an SDK supporting universal binaries + set pos [string length MacOSX] + set sdklist {} + set base /Developer + catch {set base [exec xcode-select -print-path]} + foreach dir [glob -nocomplain -tails \ + -directory $base/SDKs MacOSX*] { + set ver [string trimright \ + [file rootname [string range $dir $pos end]] u] + if {"$ver" != "" && [package vcompare $ver 10.4] >= 0} { + # 10.4 is earliest supporting universal that we support + set path($ver) $dir + lappend sdklist $ver + } + } + if {[llength $sdklist]} { + set ver [lindex [lsort -command "package vcompare" $sdklist] 0] + set SDKROOT $base/SDKs/$path($ver) + } else { + set SDKROOT "" + } + } + if {$SDKROOT ne ""} { + # get the SDKsettings for the min OSX value supported + set info "" + if [catch { + set info [exec defaults read $SDKROOT/SDKSettings buildSettings] + }] { + catch { + set info [exec defaults read $SDKROOT/SDKSettings DefaultProperties \ + -dict MACOSX_DEPLOYMENT_TARGET] + } + } + if {$info eq ""} { + puts stderr "SDKROOT isn't configured correctly on this host" + puts stderr "current setting $SDKROOT needs updating" + exit 1 + } + set info [string trim $info] + regsub -all {[\n"\;=\{\}]+} $info "" info ;#" help emacs hilighting + regsub -all {\s+} $info " " info + set osxmin [lindex $info 1] + } else { + # use the current platform + foreach {v1 v2 v3} [split $::tcl_platform(osVersion) .] break + incr v1 -4 + set osxmin 10.$v1.$v2 + # do we actually need to check if universal is supported, given the + # gcc check below will do it for us? + # set info [exec lipo -info /usr/lib/libSystem.dylib] + # set plats [split [string trim [lindex [split $info :] 2]]] + } + if {[info exists ::env(osxmin)] && $::env(osxmin) ne ""} { + set osxmin $::env(osxmin) + } + set universal 0 + catch { + set ppc [expr {[exec gcc -v -arch ppc > /dev/null 2>@stdout] eq ""}] + set ppc64 [expr {[exec gcc -v -arch ppc64 > /dev/null 2>@stdout] eq ""}] + set i386 [expr {[exec gcc -v -arch i386 > /dev/null 2>@stdout] eq ""}] + set x86_64 [expr {[exec gcc -v -arch x86_64 > /dev/null 2>@stdout] eq ""}] + } +} + +# Note: The result of 'platform::generic' is used to restrict which of +# the following blocks will be considered. + +# Note 2: The platform declarations are required to set up a proper +# mapping in pkgIndex.tcl of a -pkg. + +# default on OSX ppc is universal containing ppc and x86 32 bit +macosx-powerpc when $ppc +macosx-powerpc compile gcc -c -arch ppc \ + -isysroot $SDKROOT \ + -mmacosx-version-min=$osxmin +macosx-powerpc link gcc -bundle -arch ppc \ + -isysroot $SDKROOT \ + -mmacosx-version-min=$osxmin +macosx-powerpc link_preload -undefined dynamic_lookup -mmacosx-version-min=10.3 +macosx-powerpc strip + +# default on OSX intel is universal containing x86 32 and 64 bit +macosx-ix86 when $i386 && $x86_64 +macosx-ix86 compile gcc -c -arch i386 -arch x86_64 \ + -isysroot $SDKROOT \ + -mmacosx-version-min=$osxmin +macosx-ix86 link gcc -bundle -arch i386 -arch x86_64 \ + -isysroot $SDKROOT \ + -mmacosx-version-min=$osxmin +macosx-ix86 link_preload -undefined dynamic_lookup -mmacosx-version-min=10.3 +macosx-ix86 strip +macosx-ix86 platform macosx-ix86 $osxmin \ + macosx-ix86 \ + macosx-x86_64 + +# target for most common architectures +macosx-most when $ppc && $i386 && $x86_64 +macosx-most compile gcc -c -arch i386 -arch x86_64 -arch ppc \ + -isysroot $SDKROOT \ + -mmacosx-version-min=$osxmin +macosx-most link gcc -bundle -arch i386 -arch x86_64 -arch ppc \ + -isysroot $SDKROOT \ + -mmacosx-version-min=$osxmin +macosx-most link_preload -undefined dynamic_lookup -mmacosx-version-min=10.3 +macosx-most strip +macosx-most platform macosx-most $osxmin \ + macosx-powerpc \ + macosx-ix86 \ + macosx-x86_64 + +# target for old universal, ppc and x86 32. +macosx-universal when $ppc && $i386 +macosx-universal compile gcc -c -arch i386 -arch ppc \ + -isysroot $SDKROOT \ + -mmacosx-version-min=$osxmin +macosx-universal link gcc -bundle -arch i386 -arch ppc \ + -isysroot $SDKROOT \ + -mmacosx-version-min=$osxmin +macosx-universal link_preload -undefined dynamic_lookup -mmacosx-version-min=10.3 +macosx-universal strip +macosx-universal platform macosx-universal $osxmin \ + macosx-powerpc \ + macosx-ix86 + +# target for all architectures +macosx-all when $ppc && $ppc64 && $i386 && $x86_64 +macosx-all compile gcc -c -arch i386 -arch x86_64 -arch ppc -arch ppc64 \ + -isysroot $SDKROOT \ + -mmacosx-version-min=$osxmin +macosx-all link gcc -bundle -arch i386 -arch x86_64 -arch ppc -arch ppc64 \ + -isysroot $SDKROOT \ + -mmacosx-version-min=$osxmin +macosx-all link_preload -undefined dynamic_lookup -mmacosx-version-min=10.3 +macosx-all strip +macosx-all platform macosx-all $osxmin \ + macosx-powerpc \ + macosx-powerpc64 \ + macosx-ix86 \ + macosx-x86_64 + +# OSX ppc 32 bit +macosx-ppc32 when $ppc +macosx-ppc32 compile gcc -c -arch ppc +macosx-ppc32 link gcc -bundle -arch ppc +macosx-ppc32 link_preload -undefined dynamic_lookup +macosx-ppc32 strip +macosx-ppc32 platform macosx-powerpc + +# OSX ppc 64 bit +macosx-ppc64 when $ppc64 +macosx-ppc64 compile gcc -c -arch ppc64 +macosx-ppc64 link gcc -bundle -arch ppc64 +macosx-ppc64 link_preload -undefined dynamic_lookup +macosx-ppc64 strip +macosx-ppc64 platform macosx-powerpc64 + +# OSX x86 32 bit +macosx-x86_32 when $i386 +macosx-x86_32 compile gcc -c -arch i386 +macosx-x86_32 link gcc -bundle -arch i386 +macosx-x86_32 link_preload -undefined dynamic_lookup +macosx-x86_32 strip +macosx-x86_32 platform macosx-ix86 + +# OSX x86 64 bit +macosx-x86_64 when $x86_64 +macosx-x86_64 compile gcc -c -arch x86_64 +macosx-x86_64 link gcc -bundle -arch x86_64 +macosx-x86_64 link_preload -undefined dynamic_lookup +macosx-x86_64 strip +macosx-x86_64 platform macosx-x86_64 + +# Linux - 32 bit or 64 bit build - select using "-target" if you don't +# want the platform default (32 on 32, 64 on 64). This requires +# some work to detect the cpu class in use and then set a platform +# with the proper variant name. + +if {[string match linux-* $platform]} { + # platform = os-cpu(-compiler) + set cpu [lindex [split $platform -] 1] + + switch -- $cpu { + x86_64 - ix86 { + set cpu32 ix86 + set cpu64 x86_64 + } + * { + #error "Unknown architecture" + set cpu32 unknown32fixme_$cpu + set cpu64 unknown64fixme_$cpu + } + } +} + +linux-32-* compile gcc -c -m32 +linux-32-* link gcc -shared -m32 +linux-32-* platform linux-$cpu32 + +linux-64-* compile gcc -c -m64 +linux-64-* link gcc -shared -m64 +linux-64-* platform linux-$cpu64 + +# Windows - Check if bufferoverflowU.lib is required, or not. We +# assume that "requiredness" coincides with "presence". IOW, if the +# library is present in the LIB search paths, then it is required. +# This should be ok, for linking to it when it is present but not +# required, should do no harm. + +set msvc 0 +if {[string match win32-* $platform]} { + set cl [file nativename [lindex [auto_execok cl] 0]] + if {$cl ne ""} { + set msvc 1 + + set msvcbufferoverflowlib "" + foreach p [split $::env(LIB) \;] { + if {[llength [glob -nocomplain -directory $p bufferoverflowu.lib]]} { + set msvcbufferoverflowlib bufferoverflowU.lib + break + } + } + + set tmpfile $::env(TMP)/[pid].txt + catch { exec $cl 2> $tmpfile > NUL: } msg + #puts "M $msg" + set chan [open $tmpfile r] + set output [read $chan] + #puts "O $output" + close $chan + file delete $tmpfile + + regexp {Version ([0-9.]*)} $output -> msvcversion + #puts V=$msvcversion + if {[package vcompare $msvcversion 15.00.30729.01] >= 0} { + # VC9 or higher. -debug:full is not supported anymore. + # VC9 - warning, VC10 - error + set msvclinkdebug -debug + # Enable local stack checks for buffer overflow + set msvcstackchecks -GS + # -GZ deprecated in favor of -RTC1 + set msvcdebugchecks -RTC1 + set msvclinkglobaloptimize -ltcg + } else { + set msvclinkdebug -debug:full + set msvcdebugchecks -GZ + set msvcstackchecks "" + set msvclinkglobaloptimize "" + } + + if {[package vcompare $msvcversion 14] >= 0} { + # -Op not supported or needed. Use -fp instead to match Tcl + set msvcfpopt -fp:strict + set msvclinkworkingset "" + } else { + # -Op -> floating point consistency + set msvcfpopt -Op + # Working set optimization + set msvclinkworkingset -ws:aggressive + } + } +} + +# Windows - using 32-bit MS VC++ +# +# Note: the language option for cl is -TC for c and -TP for c++ or +# it can treat single files -Tc +# +win32-ix86-cl when $msvc +win32-ix86-cl compile cl -nologo -c +win32-ix86-cl link link -nologo +win32-ix86-cl embed_manifest mt -manifest [list $outfile].manifest -outputresource:[list $outfile]\;2 +win32-ix86-cl preproc_define cl -nologo -E +win32-ix86-cl preproc_enum cl -nologo -E +win32-ix86-cl libinclude /LIBPATH: +win32-ix86-cl object .obj +win32-ix86-cl debug_symbols -W3 -Od -Zi $msvcstackchecks $msvcdebugchecks -MDd -D_DEBUG $msvcfpopt +win32-ix86-cl optimize -W3 -O2 -MD $msvcstackchecks $msvcfpopt +win32-ix86-cl output [list -Fo$outfile] +win32-ix86-cl ldoutput -dll [list -out:$outfile] +win32-ix86-cl link_debug $msvclinkdebug -debugtype:cv -verbose:lib -nodefaultlib:libc +win32-ix86-cl link_release -release -opt:ref -opt:icf,3 $msvclinkworkingset -verbose:lib $msvclinkglobaloptimize +win32-ix86-cl link_preload +win32-ix86-cl link_rpath +win32-ix86-cl strip +win32-ix86-cl version cl +win32-ix86-cl platform win32-ix86 + +# Windows - using 64-bit MS VC++ +# +# Note: the language option for cl is -TC for c and -TP for c++ or +# it can treat single files -Tc +# + +win32-x86_64-cl when $msvc +win32-x86_64-cl copy win32-ix86-cl +win32-x86_64-cl link_debug $msvclinkdebug -debugtype:cv -verbose:lib $msvcbufferoverflowlib +win32-x86_64-cl link_release -release -opt:ref -opt:icf,3 $msvclinkworkingset -verbose:lib $msvclinkglobaloptimize $msvcbufferoverflowlib +win32-x86_64-cl platform win32-x86_64 + +# Cross-compile for Windows using Xmingwin +mingw32 target win32-ix86 +mingw32 compile gcc -c -nostdlib +mingw32 link gcc -shared +mingw32 link_preload +mingw32 sharedlibext .dll +mingw32 tcl_platform(byteOrder) littleEndian +mingw32 tcl_platform(machine) intel +mingw32 tcl_platform(os) Windows NT +mingw32 tcl_platform(osVersion) 5.0 +mingw32 tcl_platform(platform) windows +mingw32 tcl_platform(wordSize) 4 + +# Cross-compile for ARM (n770/Zaurus/etc) using Scratchbox et al +linux-arm target +linux-arm sharedlibext .so +linux-arm tcl_platform(byteOrder) littleEndian +linux-arm tcl_platform(machine) arm +linux-arm tcl_platform(os) Linux +linux-arm tcl_platform(osVersion) 2.6 +linux-arm tcl_platform(platform) unix +linux-arm tcl_platform(wordSize) 4 + +# hpux itanium, native cc, 32 and 64bit builds. +# +z <=> -fPIC on hpux. +# +DD64 invokes the 64bit mode. + +hpux-ia64_32-cc compile cc -c +z +hpux-ia64_32-cc link ld -b +hpux-ia64_32-cc preproc_define cc -E +hpux-ia64_32-cc preproc_enum cc -E +hpux-ia64_32-cc link_preload +hpux-ia64_32-cc strip + +hpux-ia64-cc compile cc -c +z +DD64 +hpux-ia64-cc link ld -b +hpux-ia64-cc preproc_define cc -E +hpux-ia64-cc preproc_enum cc -E +hpux-ia64-cc link_preload +hpux-ia64-cc strip + +# hpux, itanium, gcc +# This works only if the -lgcc for 64bit is somewhere reachable. +# hpux-ia64 gcc -c -fPIC -mlp64 + +hpux-parisc-cc compile cc -c +z +DAportable +hpux-parisc-cc link ld -b +hpux-parisc-cc preproc_define cc -E +hpux-parisc-cc preproc_enum cc -E +hpux-parisc-cc link_preload +hpux-parisc-cc strip + +hpux-parisc64-cc compile cc -c +z +DA2.0W +hpux-parisc64-cc link ld -b +hpux-parisc64-cc preproc_define cc -E +hpux-parisc64-cc preproc_enum cc -E +hpux-parisc64-cc link_preload +hpux-parisc64-cc strip + +# hpux-parisc, 64bit, gcc +# +# For this architecture gcc does not have compiler switches for change +# between 32/64 results. Rather, gcc has to be built specifically to +# produce either 32 or 64 bit binaries. And if both results are +# wanted, it has to be built and installed twice (in different +# directories). +# +# HP provides precompiled binaries of these two variants at +# http://www.hp.com/go/gcc. Install the desired compiler(s). In case +# of having both ensure that the desired one is first in the PATH. + +# aix, rs6000/powerpc, native cc, 32bit build +# The link line is pretty much copied from Tcl. + +# NOTE: ldAix was copied from Tcl into a directory in the PATH. + +# It might make sense to stuff this file into critcl and then copy it +# out when needed, either into a fixed place, or tempdir. In the +# latter case the link line needs some way of getting the value +# substituted into it. I have no idea of the critcl config allows +# that, and if yes, nor how. + +# cc_r = something with thread-enabled. better use it than cc and have +# things fail. + +aix-powerpc-cc compile cc_r -c -O +aix-powerpc-cc link ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry -lm -lc +aix-powerpc-cc preproc_define cc -E +aix-powerpc-cc preproc_enum cc -E +aix-powerpc-cc link_preload +aix-powerpc-cc strip + +aix-powerpc64-cc compile cc_r -c -O -q64 +aix-powerpc64-cc link ldAix /bin/ld -b64 -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry -lm -lc +aix-powerpc64-cc preproc_define cc -E +aix-powerpc64-cc preproc_enum cc -E +aix-powerpc64-cc link_preload +aix-powerpc64-cc strip + +aix-powerpc-xlc compile xlc_r -c -O +aix-powerpc-xlc link ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry -lm -lc +aix-powerpc-xlc preproc_define xlc -E +aix-powerpc-xlc preproc_enum xlc -E +aix-powerpc-xlc link_preload +aix-powerpc-xlc strip + +aix-powerpc64-xlc compile xlc_r -c -O -q64 +aix-powerpc64-xlc link ldAix /bin/ld -b64 -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry -lm -lc +aix-powerpc64-xlc preproc_define xlc -E +aix-powerpc64-xlc preproc_enum xlc -E +aix-powerpc64-xlc link_preload +aix-powerpc64-xlc strip + +# Solaris, Sparc and Intel platforms, 32 and 64 bit + +solaris-x86_64-cc compile cc -m64 -c -KPIC +solaris-x86_64-cc link /usr/ccs/bin/ld -L/lib/64 -G -lc -lnsl +solaris-x86_64-cc preproc_define cc -E +solaris-x86_64-cc preproc_enum cc -E +solaris-x86_64-cc version cc -V +solaris-x86_64-cc link_preload +solaris-x86_64-cc strip + +solaris-x86_64-gcc compile gcc -m64 -c -fPIC +solaris-x86_64-gcc link gcc -m64 -shared + +solaris-ix86-cc compile cc -m32 -c -KPIC +solaris-ix86-cc link /usr/ccs/bin/ld -G -lc -lnsl +solaris-ix86-cc preproc_define cc -E +solaris-ix86-cc preproc_enum cc -E +solaris-ix86-cc version cc -V +solaris-ix86-cc link_preload +solaris-ix86-cc strip + +solaris-sparc-cc compile cc -KPIC -c +solaris-sparc-cc link /usr/ccs/bin/ld -G -lc -lnsl +solaris-sparc-cc preproc_define cc -E +solaris-sparc-cc preproc_enum cc -E +solaris-sparc-cc version cc -V +solaris-sparc-cc link_preload +solaris-sparc-cc strip + +solaris-sparc64-cc compile cc -KPIC -xarch=v9 -c +solaris-sparc64-cc link /usr/ccs/bin/ld -G -lc -lnsl +solaris-sparc64-cc preproc_define cc -E +solaris-sparc64-cc preproc_enum cc -E +solaris-sparc64-cc version cc -V +solaris-sparc64-cc link_preload +solaris-sparc64-cc strip + +solaris-sparc64-gcc compile gcc -m64 -c -fPIC -mcpu=v9 +solaris-sparc64-gcc link gcc -m64 -shared -mcpu=v9 diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl.tcl b/src/tclkit86bi.vfs/lib/critcl3.2/critcl.tcl new file mode 100644 index 00000000..b562fe8b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl.tcl @@ -0,0 +1,6547 @@ +## -*- tcl -*- +# # ## ### ##### ######## ############# ##################### +# Pragmas for MetaData Scanner. +# @mdgen OWNER: Config +# @mdgen OWNER: critcl_c +# +# Copyright (c) 2001-20?? Jean-Claude Wippler +# Copyright (c) 2002-20?? Steve Landers +# Copyright (c) 20??-2022 Andreas Kupries + +# # ## ### ##### ######## ############# ##################### +# CriTcl Core. + +package provide critcl 3.2 + +namespace eval ::critcl {} + +# # ## ### ##### ######## ############# ##################### +## Requirements. + +package require Tcl 8.6 ; # Minimal supported Tcl runtime. +if {[catch { + package require platform 1.0.2 ; # Determine current platform. +}]} { + # Fall back to our internal copy (currently equivalent to platform + # 1.0.14(+)) if the environment does not have the official + # package. + package require critcl::platform +} elseif { + [string match freebsd* [platform::generic]] && + ([platform::generic] eq [platform::identify]) +} { + # Again fall back to the internal package if we are on FreeBSD and + # the official package does not properly identify the OS ABI + # version. + package require critcl::platform +} + +# # ## ### ##### ######## ############# ##################### +## https://github.com/andreas-kupries/critcl/issues/112 +# +## Removed the code ensuring that we have maximal 'info frame' data, +## if supported. This code was moved into the app-critcl package +## instead. +# +## The issue with having it here is that this changes a global setting +## of the core, i.e. this will not only affect critcl itself when +## building binaries, but also the larger environment, i.e. the +## application using critcl. Given that this feature being active +## slows the Tcl core down by about 10%, sometimes more this is not a +## good decision to make on behalf of the user. +# +## In the critcl application itself I am willing to pay the price for +## the more precise location information in case of compilation +## failures, and the isolation to that application. For the +## dynamically `compile & run` in arbitrary environments OTOH not. + +# # ## ### ##### ######## ############# ##################### +# This is the md5 package bundled with critcl. +# No need to look for fallbacks. + +proc ::critcl::md5_hex {s} { + if {$v::uuidcounter} { + return [format %032d [incr v::uuidcounter]] + } + package require critcl_md5c + binary scan [md5c $s] H* md; return $md +} + +# # ## ### ##### ######## ############# ##################### + +if {[package vsatisfies [package present Tcl] 8.5]} { + # 8.5+ + proc ::critcl::lappendlist {lvar list} { + if {![llength $list]} return + upvar $lvar dest + lappend dest {*}$list + return + } +} else { + # 8.4 + proc ::critcl::lappendlist {lvar list} { + if {![llength $list]} return + upvar $lvar dest + set dest [eval [linsert $list 0 linsert $dest end]] + #set dest [concat $dest $list] + return + } +} + +# # ## ### ##### ######## ############# ##################### +## + +proc ::critcl::buildrequirement {script} { + # In regular code this does nothing. It is a marker for + # the static scanner to change under what key to record + # the 'package require' found in the script. + uplevel 1 $script +} + +proc ::critcl::TeapotPlatform {} { + # Platform identifier HACK. Most of the data in critcl is based on + # 'platform::generic'. The TEApot MD however uses + # 'platform::identify' with its detail information (solaris kernel + # version, linux glibc version). But, if a cross-compile is + # running we are SOL, because we have no place to pull the + # necessary detail from, 'identify' is a purely local operation :( + + set platform [actualtarget] + if {[platform::generic] eq $platform} { + set platform [platform::identify] + } + + return $platform +} + +proc ::critcl::TeapotRequire {dspec} { + # Syntax of dspec: (a) pname + # ...: (b) pname req-version... + # ...: (c) pname -exact req-version + # + # We can assume that the syntax is generally ok, because otherwise + # the 'package require' itself will fail in a moment, blocking the + # further execution of the .critcl file. So we only have to + # distinguish the cases. + + if {([llength $dspec] == 3) && + ([lindex $dspec 1] eq "-exact")} { + # (c) + lassign $dspec pn _ pv + set spec [list $pn ${pv}-$pv] + } else { + # (a, b) + set spec $dspec + } + + return $spec +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Embed C Code + +proc ::critcl::HeaderLines {text} { + if {![regexp {^[\t\n ]+} $text header]} { + return [list 0 $text] + } + set lines [regexp -all {\n} $header] + # => The C code begins $lines lines after location of the c** + # command. This goes as offset into the generated #line pragma, + # because now (see next line) we throw away this leading + # whitespace. + set text [string trim $text] + return [list $lines $text] +} + +proc ::critcl::Lines {text} { + set n [regexp -all {\n} $text] + return $n +} + +proc ::critcl::ccode {text} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + CCodeCore $file $text + return +} + +proc ::critcl::CCodeCore {file text} { + set digest [UUID.extend $file .ccode $text] + + set block {} + lassign [HeaderLines $text] leadoffset text + if {$v::options(lines)} { + append block [at::CPragma $leadoffset -3 $file] + } + append block $text \n + dict update v::code($file) config c { + dict lappend c fragments $digest + dict set c block $digest $block + dict lappend c defs $digest + } + return +} + +proc ::critcl::ccommand {name anames args} { + SkipIgnored [set file [This]] + HandleDeclAfterBuild + + # Basic key for the clientdata and delproc arrays. + set cname $name[UUID.serial $file] + + if {[llength $args]} { + set body [lindex $args 0] + set args [lrange $args 1 end] + } else { + set body {} + } + + set clientdata NULL ;# Default: ClientData expression + set delproc NULL ;# Default: Function pointer expression + set acname 0 + set tname "" + while {[string match "-*" $args]} { + switch -- [set opt [lindex $args 0]] { + -clientdata { set clientdata [lindex $args 1] } + -delproc { set delproc [lindex $args 1] } + -cname { set acname [lindex $args 1] } + -tracename { set tname [lindex $args 1] } + default { + error "Unknown option $opt, expected one of -clientdata, -cname, -delproc" + } + } + set args [lrange $args 2 end] + } + + # Put body back into args for integration into the MD5 uuid + # generated for mode compile&run. Bug and fix reported by Peter + # Spjuth. + lappend args $body + + if {$acname} { + BeginCommand static $name $anames $args + set ns {} + set cns {} + set key $cname + set wname $name + if {$tname ne {}} { + set traceref \"$tname\" + } else { + set traceref \"$name\" + } + } else { + lassign [BeginCommand public $name $anames $args] ns cns name cname + set key [string map {:: _} $ns$cname] + set wname tcl_$cns$cname + set traceref ns_$cns$cname + } + + # XXX clientdata/delproc, either note clashes, or keep information per-file. + + set v::clientdata($key) $clientdata + set v::delproc($key) $delproc + + #set body [join $args] + if {$body != ""} { + lappend anames "" + foreach {cd ip oc ov} $anames break + if {$cd eq ""} { set cd clientdata } + if {$ip eq ""} { set ip interp } + if {$oc eq ""} { set oc objc } + if {$ov eq ""} { set ov objv } + + set ca "(ClientData $cd, Tcl_Interp *$ip, int $oc, Tcl_Obj *CONST $ov\[])" + + if {$v::options(trace)} { + # For ccommand tracing we will emit a shim after the implementation. + # Give the implementation a different name. + Emitln "static int\n${wname}_actual$ca" + } else { + Emitln "static int\n$wname$ca" + } + + Emit \{\n + lassign [HeaderLines $body] leadoffset body + if {$v::options(lines)} { + Emit [at::CPragma $leadoffset -2 $file] + } + Emit $body + Emitln \n\} + + # Now emit the call to the ccommand tracing shim. It simply + # calls the regular implementation and places the tracing + # around that. + if {$v::options(trace)} { + Emitln "\nstatic int\n$wname$ca" + Emitln \{ + Emitln " int _rv;" + Emitln " critcl_trace_cmd_args ($traceref, $oc, $ov);" + Emitln " _rv = ${wname}_actual ($cd, $ip, $oc, $ov);" + Emitln " return critcl_trace_cmd_result (_rv, $ip);" + Emitln \} + } + } else { + # if no body is specified, then $anames is alias for the real cmd proc + Emitln "#define $wname $anames" + Emitln "int $anames\(\);" + } + EndCommand + return +} + +proc ::critcl::cdata {name data} { + SkipIgnored [This] + HandleDeclAfterBuild + binary scan $data c* bytes ;# split as bytes, not (unicode) chars + + set inittext "" + set line "" + foreach x $bytes { + if {[string length $line] > 70} { + append inittext " " $line \n + set line "" + } + append line $x , + } + append inittext " " $line + + set count [llength $bytes] + + set body [subst [Cat [Template cdata.c]]] + # ^=> count, inittext + + # NOTE: The uplevel is needed because otherwise 'ccommand' will + # not properly determine the caller's namespace. + uplevel 1 [list critcl::ccommand $name {dummy ip objc objv} [at::caller!]$body] + return $name +} + +proc ::critcl::cdefines {defines {namespace "::"}} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + set digest [UUID.extend $file .cdefines [list $defines $namespace]] + + dict update v::code($file) config c { + foreach def $defines { + dict set c const $def $namespace + } + } + return +} + +proc ::critcl::MakeDerivedType {type ev} { + upvar 1 $ev errmsg + foreach synth { + MakeScalarLimited + MakeList + } { + set ltype [$synth $type errmsg] + if {$ltype eq {}} continue + return $ltype + } + return +} + +# Dynamically create an arg-type for "(length-limited) list (of T)". +proc ::critcl::MakeList {type ev} { + # Check for basic syntax. + # Accept the list indicator syntax as either prefix or suffix of the base type. + + if {![regexp {^\[(\d*|\*)\](.*)$} $type -> limit base]} { + if {![regexp {^(.*)\[(\d*|\*)\]$} $type -> base limit]} { + return + } + } + + # This looks like a list type, start recording errors + + if {($base ne {}) && ![has-argtype $base]} { + # XXX TODO: Recurse into the base for possible further synthesis. + set err "list: Unknown base type '$base'" + return + } + if {($limit ne {}) && ($limit == 0)} { + set err "list: Bad size 0, i.e. would be empty" + return + } + + # (LIST) Note: The '[]' and '[*]', i.e. unlimited lists of any type cannot appear here, because + # they exist as standard builtins. This means that at least one of base or limit is __not__ empty. + + set ntype list + + if {$base eq {}} { + append ntype _obj + } else { + append ntype _$base + } + + # Save the type-specific list type, without length restrictions factored in. + # This is what we need for the data structures and conversion, nothing more. + # IOW we do not wish to create multiple different types and functions for the + # same list type, just different length restrictions. + set nctype $ntype + + if {$limit in {{} *}} { + set limit {} + append ntype _any + } else { + append ntype _$limit + } + + # Check if this list type was seen before + if {[has-argtype $ntype]} { return $ntype } + + # Generate the validator for this kind of list. + + if {$base eq {}} { + # Without a base type simply start from `list`. + + set ctype [ArgumentCType list] + set code [ArgumentConversion list] + set new $code + } else { + # With a base type the start is not quite `list`. Because the C type is different, and we + # need a proper place for the list of Tcl_Obj* to get the element from. + + set new { + int k; + Tcl_Obj** el; + if (Tcl_ListObjGetElements (interp, @@, &(@A.c), &el) != TCL_OK) return TCL_ERROR; + @A.o = @@; + } + } + + if {$limit ne {}} { + # Check that the list conforms to the expected size + append new \ + "\n\t/* Size check, assert (length (list) == $limit) */" \ + "\n\tif (@A.c != $limit) \{" \ + "\n\t Tcl_AppendResult (interp, \"Expected a list of $limit\", NULL);" \ + "\n\t return TCL_ERROR;" \ + "\n\t\}" + } + + if {$base eq {}} { + # Without a base type we have a length-limited plain list, and there nothing more to do. + + argtype $ntype $new $ctype $ctype + argtypesupport $ntype [ArgumentSupport list] + + return $ntype + } + + # With a base type it is now time to synthesize something more complex to validate the list + # elements against the base type. `el` is the array of Tcl_Obj* holding the unconverted raw + # values. See `MakeVariadicTypeFor` too. It uses the same general schema, applied to the list of + # remaining cproc 'args'. + + lappend one @@ src + lappend one &@A dst + lappend one @A *dst + lappend one @A. dst-> + + lappend map @1conv@ [Deline [string map $one [ArgumentConversion $base]]] + lappend map @type@ [ArgumentCType $base] + lappend map @ntype@ $ntype + lappend map @nctype@ $nctype + + append new [string map $map { + @A.v = (@type@*) ((!@A.c) ? 0 : ckalloc (@A.c * sizeof (@type@))); + for (k = 0; k < @A.c; k++) { + if (_critcl_@nctype@_item (interp, el[k], &(@A.v[k])) != TCL_OK) { + ckfree ((char*) @A.v); /* Cleanup partial work */ + return TCL_ERROR; + } + } + }] + + argtype $ntype $new critcl_$nctype critcl_$nctype + + argtypesupport $ntype [string map $map { + /* NOTE: Array 'v' is allocated on the heap. The argument + // release code is used to free it after the worker + // function returned. Depending on type and what is done + // by the worker it may have to make copies of the data. + */ + + typedef struct critcl_@nctype@ { + Tcl_Obj* o; /* Original list object, for pass-through cases */ + int c; /* Element count */ + @type@* v; /* Allocated array of the elements */ + } critcl_@nctype@; + + static int + _critcl_@nctype@_item (Tcl_Interp* interp, Tcl_Obj* src, @type@* dst) { + @1conv@ + return TCL_OK; + } + }] $nctype + + argtyperelease $ntype [string map $map { + if (@A.c) { ckfree ((char*) @A.v); } + }] + + return $ntype +} + +proc ::critcl::MakeScalarLimited {type ev} { + upvar 1 $ev errmsg + if {[catch {llength $type}]} return + + if {[lindex $type 0] ni { + int long wideint double float + }} return + + # At this point we assume that it can be a restricted scalar type and we record errors. + + set limits [lassign $type base] + set n [llength $type] + if {($n < 3) || (($n % 2) == 0)} { set err "$type: Incomplete restriction" ; return } + + foreach {op _} $limits { + if {$op in {> < >= <=}} continue + set err "$type: Bad relation '$op'" + return + } + + if {$base in {int long wideint}} { + foreach {_ v} $limits { + if {[string is integer -strict $v]} continue + set err "$base: Expected integer, have '$v'" + return + } + } else { + # double or float + foreach {_ v} $limits { + if {[string is double -strict $v]} continue + set err "$base: Expected float, have '$v'" + return + } + } + + # This looks mostly good. Condense the set of restrictions into a simple min/max range + lassign {} mingt minge maxlt maxle + + # Phase 1. Fuse identical kind of restrictions into a single of their type + foreach {op v} $limits { + switch -exact -- $op { + > { if {($mingt eq {}) || ($v > $mingt)} { set mingt $v } } + >= { if {($minge eq {}) || ($v > $minge)} { set minge $v } } + < { if {($maxlt eq {}) || ($v < $maxlt)} { set maxlt $v } } + <= { if {($maxle eq {}) || ($v < $maxle)} { set maxle $v } } + } + } + + # Phase 2. Fuse similar (lt/le, gt/ge) into a single + + if {($mingt ne {}) && ($minge ne {})} { + # We have both x > a && + # x >= b + # ... Determine the stricter form. + + # a > b => "> a" + # a < b => ">= b" + # a == b => "> a" + + if {$mingt >= $minge} { + set min $mingt + set minop > + } else { + set min $minge + set minop >= + } + } elseif {$mingt ne {}} { + # x > a only + set min $mingt + set minop > + } elseif {$minge ne {}} { + # x >= a only + set min $minge + set minop >= + } else { + # No limit + lassign {} min minop + } + + if {($maxlt ne {}) && ($maxle ne {})} { + # We have both x < a && + # x <= b + # ... Determine the stricter form. + + # a > b => "<= b" + # a < b => "< a" + # a == b => "< a" + + if {$maxlt <= $maxle} { + set max $maxlt + set maxop < + } else { + set max $maxle + set maxop <= + } + } elseif {$maxlt ne {}} { + # x > a only + set max $maxlt + set maxop < + } elseif {$maxle ne {}} { + # x >= a only + set max $maxle + set maxop <= + } else { + # No limit + lassign {} max maxop + } + + if {($min ne {}) && ($max ne {})} { + # With both limits they may specify an empty range, or a range allowing only single value. + # That is not sensible. + + # a < x < b -- a >= b is empty + # a <= x < b -- a >= b is empty + # a < x <= b -- a >= b is empty + # a <= x <= b -- a > b is empty, a == b is singular, + + # Reduced checks: + # - a > b is empty + # - a == b is singular if both <=, else empty + + if {($min > $max)} { + set err "$base: Limits do not allow any value as valid" + return + } + if {$min == $max} { + if {$minop$maxop eq ">=<=")} { + set err "$base: Limits only allow a single value as valid: $min" + } else { + set err "$base: Limits do not allow any value as valid" + } + return + } + } + + # Compute canonical type from the fused ranges. + + set ntype $base + if {$min ne {}} { lappend ntype $minop $min } + if {$max ne {}} { lappend ntype $maxop $max } + + # Check if we saw this canonical type before. + + if {[has-argtype $ntype]} { return $ntype } + + # Generate the new type + + set ctype [ArgumentCType $base] + set code [ArgumentConversion $base] + + set head "expected $ntype, but got \\\"" + set tail "\\\"" + set msg "\"$head\", Tcl_GetString (@@), \"$tail\"" + set new $code + + if {$min ne {}} { + append new \ + "\n\t/* Range check, assert (x $minop $min) */" \ + "\n\tif (!(@A $minop $min)) \{" \ + "\n\t Tcl_AppendResult (interp, $msg, NULL);" \ + "\n\t return TCL_ERROR;" \ + "\n\t\}" + } + if {$max ne {}} { + append new \ + "\n\t/* Range check, assert (x $maxop $max) */" \ + "\n\tif (!(@A $maxop $max)) \{" \ + "\n\t Tcl_AppendResult (interp, $msg, NULL);" \ + "\n\t return TCL_ERROR;" \ + "\n\t\}" + } + + argtype $ntype $new $ctype $ctype + + return $ntype +} + +proc ::critcl::MakeVariadicTypeFor {type} { + # Note: The type "Tcl_Obj*" required special treatment and is + # directly defined as a builtin, see 'Initialize'. The has-argtype + # check below will prevent us from trying to create something + # generic, and wrong. + + set ltype variadic_$type + if {![has-argtype $ltype]} { + # Generate a type representing a list/array of + # elements, plus conversion code. Similar to the 'list' type, + # except for custom C types, and conversion assumes variadic, + # not single argument. + + lappend one @@ src + lappend one &@A dst + lappend one @A *dst + lappend one @A. dst-> + lappend map @1conv@ [Deline [string map $one [ArgumentConversion $type]]] + + lappend map @type@ [ArgumentCType $type] + lappend map @ltype@ $ltype + + argtype $ltype [string map $map { + int src, dst, leftovers = @C; + @A.c = leftovers; + @A.v = (@type@*) ((!leftovers) ? 0 : ckalloc (leftovers * sizeof (@type@))); + @A.o = (Tcl_Obj**) &ov[@I]; + for (src = @I, dst = 0; leftovers > 0; dst++, src++, leftovers--) { + if (_critcl_variadic_@type@_item (interp, ov[src], &(@A.v[dst])) != TCL_OK) { + ckfree ((char*) @A.v); /* Cleanup partial work */ + return TCL_ERROR; + } + } + }] critcl_$ltype critcl_$ltype + + argtypesupport $ltype [string map $map { + /* NOTE: Array 'v' is allocated on the heap. The argument + // release code is used to free it after the worker + // function returned. Depending on type and what is done + // by the worker it may have to make copies of the data. + */ + + typedef struct critcl_@ltype@ { + Tcl_Obj** o; /* Original object array */ + int c; /* Element count */ + @type@* v; /* Allocated array of the elements */ + } critcl_@ltype@; + + static int + _critcl_variadic_@type@_item (Tcl_Interp* interp, Tcl_Obj* src, @type@* dst) { + @1conv@ + return TCL_OK; + } + }] + + argtyperelease $ltype [string map $map { + if (@A.c) { ckfree ((char*) @A.v); } + }] + } + return $ltype +} + +proc ::critcl::ArgsInprocess {adefs skip} { + # Convert the regular arg spec from the API into a dictionary + # containing all the derived data we need in the various places of + # the cproc implementation. + + set db {} + + set names {} ; # list of raw argument names + set cnames {} ; # list of C var names for the arguments. + set optional {} ; # list of flags signaling optional args. + set variadic {} ; # list of flags signaling variadic args. + set islast {} ; # list of flags signaling the last arg. + set varargs no ; # flag signaling 'args' collector. + set defaults {} ; # list of default values. + set csig {} ; # C signature of worker function. + set tsig {} ; # Tcl signature for frontend/shim command. + set vardecls {} ; # C variables for arg conversion in the shim. + set support {} ; # Conversion support code for arguments. + set has {} ; # Types for which we have emitted the support + # code already. (dict: type -> '.' (presence)) + set hasopt no ; # Overall flag - Have optionals ... + set min 0 ; # Count required args - minimal needed. + set max 0 ; # Count all args - maximal allowed. + set aconv {} ; # list of the basic argument conversions. + set achdr {} ; # list of arg conversion annotations. + set arel {} ; # List of arg release code fragments, for those which have them. + + # Normalization, and typo fixing: + # - Remove singular commas from the list. + # - Strip argument names of trailing commas. + # - Strip type names of leading commas. + # Reason: Handle mistakenly entered C syntax for a function/command. + # + # Newly accepted syntax: + # = int x , int y ... + # = int x, int y ... + # = int x ,int y ... + + # TODO: lmap. + set adefnew {} + set mode type + foreach word $adefs { + if {$word eq ","} continue + switch -exact -- $mode { + type { lappend adefnew [string trimleft $word ,] ; set mode args } + args { lappend adefnew [string trimright $word ,] ; set mode type } + } + } + set adefs $adefnew ; unset adefnew mode + + # A 1st argument matching "Tcl_Interp*" does not count as a user + # visible command argument. But appears in both signature and + # actual list of arguments. + if {[lindex $adefs 0] eq "Tcl_Interp*"} { + lappend csig [lrange $adefs 0 1] + lappend cnames interp;#Fixed name for cproc[lindex $adefs 1] + set adefs [lrange $adefs 2 end] + } + + set last [expr {[llength $adefs]/2-1}] + set current 0 + + foreach {t a} $adefs { + # t = type + # a = name | {name default} + + # Check for a special case of list syntax, where the list indicator is written as suffix of + # the argument name, instead of attached to the base type. When found normalize to the + # expected form. I.e. transform a spec of the form `type a[...]` into `[...]type a`. + # + # Note that the argument name may be packaged with a default value. Ensure that we deail + # with only the name itself. + + set hasdefault [expr {[llength $a] == 2}] + lassign $a name defaultvalue + + if {[regexp {^(.+)(\[(\d*|\*)\])$} $name -> abase limit _]} { + set name $abase + set t $limit$t + } + + # Check type validity + + if {![has-argtype $t]} { + # XXXA Attempt to compute a derived type on the fly. + set err "Argument type '$t' is not known" + set ltype [MakeDerivedType $t err] + if {$ltype eq {}} { + return -code error $err + } + + set t $ltype + } + + # Base type support + if {![dict exists $has $t]} { + dict set has $t . + lappend support "[ArgumentSupport $t]" + } + + lappend islast [expr {$current == $last}] + + # Cases to consider: + # 1. 'args' as the last argument, without a default. + # 2. Any argument with a default value. + # 3. Any argument. + + if {($current == $last) && ($name eq "args") && !$hasdefault} { + set hdr " /* ($t $name, ...) - - -- --- ----- -------- */" + lappend optional 0 + lappend variadic 1 + lappend defaults n/a + lappend tsig ?${name}...? + set varargs yes + set max Inf ; # No limit on the number of args. + + # Dynamically create an arg-type for "variadic list of T". + set t [MakeVariadicTypeFor $t] + # List support. + if {![dict exists $has $t]} { + dict set has $t . + lappend support "[ArgumentSupport $t]" + } + + } elseif {$hasdefault} { + incr max + set hasopt yes + set hdr " /* ($t $name, optional, default $defaultvalue) - - -- --- ----- -------- */" + lappend tsig ?${name}? + lappend optional 1 + lappend variadic 0 + lappend defaults $defaultvalue + lappend cnames _has_$name + # Argument to signal if the optional argument was set + # (true) or is the default (false). + lappend csig "int has_$name" + lappend vardecls "int _has_$name = 0;" + + } else { + set hdr " /* ($t $name) - - -- --- ----- -------- */" + lappend tsig $name + incr max + incr min + lappend optional 0 + lappend variadic 0 + lappend defaults n/a + } + + lappend achdr $hdr + lappend csig "[ArgumentCTypeB $t] $name" + lappend vardecls "[ArgumentCType $t] _$name;" + + lappend names $name + lappend cnames _$name + lappend aconv [TraceReturns "\"$t\" argument" [ArgumentConversion $t]] + + set rel [ArgumentRelease $t] + if {$rel ne {}} { + set rel [string map [list @A _$name] $rel] + set hdr [string map {( {(Release: }} $hdr] + lappend arel "$hdr$rel" + } + + incr current + } + + set thresholds {} + if {$hasopt} { + # Compute thresholds for optional arguments. The threshold T + # of an optional argument A is the number of required + # arguments _after_ A. If during arg processing more than T + # arguments are left then A can take the current word, + # otherwise A is left to its default. We compute them from the + # end. + set t 0 + foreach o [lreverse $optional] { + if {$o} { + lappend thresholds $t + } else { + lappend thresholds - + incr t + } + } + set thresholds [lreverse $thresholds] + } + + set tsig [join $tsig { }] + if {$tsig eq {}} { + set tsig NULL + } else { + set tsig \"$tsig\" + } + + # Generate code for wrong#args checking, based on the collected + # min/max information. Cases to consider: + # + # a. max == Inf && min == 0 <=> All argc allowed. + # b. max == Inf && min > 0 <=> Fail argc < min. + # c. max < Inf && min == max <=> Fail argc != min. + # d. max < Inf && min < max <=> Fail argc < min || max < argc + + if {$max == Inf} { + # a, b + if {!$min} { + # a: nothing to check. + set wacondition {} + } else { + # b: argc < min + set wacondition {oc < MIN_ARGS} + } + } else { + # c, d + if {$min == $max} { + # c: argc != min + set wacondition {oc != MIN_ARGS} + } else { + # d: argc < min || max < argc + set wacondition {(oc < MIN_ARGS) || (MAX_ARGS < oc)} + } + } + + # Generate conversion code for arguments. Use the threshold + # information to handle optional arguments at all positions. + # The code is executed after the wrong#args check. + # That means we have at least 'min' arguments, enough to fill + # all the required parameters. + + set map {} + set conv {} + set opt no + set idx $skip + set prefix " idx_ = $idx;" ; # Start at skip offset! + append prefix "\n argc_ = oc - $idx;" + foreach \ + name $names \ + t $thresholds \ + o $optional \ + v $variadic \ + l $islast \ + h $achdr \ + c $aconv \ + d $defaults { + + # Things to consider: + # 1. Required variables at the beginning. + # We can access these using fixed indices. + # 2. Any other variable require access using a dynamic index + # (idx_). During (1) we maintain the code initializing + # this. + + set useindex [expr {!$l}] ;# last arg => no need for idx/argc updates + + if {$v} { + # Variadic argument. Can only be last. + # opt => dynamic access at idx_..., collect argc_ + # !opt => static access at $idx ..., collect oc-$idx + + unset map + lappend map @A _$name + if {$opt} { + lappend map @I idx_ @C argc_ + } else { + lappend map @I $idx @C (oc-$idx) + } + + set c [string map $map $c] + + lappend conv $h + lappend conv $c + lappend conv {} + lappend conv {} + break + } + + if {$o} { + # Optional argument. Anywhere. Check threshold. + + unset map + lappend map @@ "ov\[idx_\]" + lappend map @A _$name + + set c [string map $map $c] + + if {$prefix ne {}} { lappend conv $prefix\n } + lappend conv $h + lappend conv " if (argc_ > $t) \{" + lappend conv $c + if {$useindex} { + lappend conv " idx_++;" + lappend conv " argc_--;" + } + lappend conv " _has_$name = 1;" + lappend conv " \} else \{" + lappend conv " _$name = $d;" + lappend conv " \}" + lappend conv {} + lappend conv {} + + set prefix {} + set opt yes + continue + } + + if {$opt} { + # Required argument, after one or more optional arguments + # were processed. Access to current word is dynamic. + + unset map + lappend map @@ "ov\[idx_\]" + lappend map @A _$name + + set c [string map $map $c] + + lappend conv $h + lappend conv $c + lappend conv {} + if {$useindex} { + lappend conv " idx_++;" + lappend conv " argc_--;" + } + lappend conv {} + lappend conv {} + continue + } + + # Required argument. No optionals processed yet. Access to + # current word is via static index. + + unset map + lappend map @@ "ov\[$idx\]" + lappend map @A _$name + + set c [string map $map $c] + + lappend conv $h + lappend conv $c + lappend conv {} + lappend conv {} + + incr idx + set prefix " idx_ = $idx;" + append prefix "\n argc_ = oc - $idx;" + } + set conv [Deline [join $conv \n]] + + # Save results ... + + dict set db skip $skip + dict set db aconv $conv + dict set db arelease $arel + dict set db thresholds $thresholds + dict set db wacondition $wacondition + dict set db min $min + dict set db max $max + dict set db tsignature $tsig + dict set db names $names + dict set db cnames $cnames + dict set db optional $optional + dict set db variadic $variadic + dict set db islast $islast + dict set db defaults $defaults + dict set db varargs $varargs + dict set db csignature $csig + dict set db vardecls $vardecls + dict set db support $support + dict set db hasoptional $hasopt + + #puts ___________________________________________________________|$adefs + #array set __ $db ; parray __ + #puts _______________________________________________________________\n + return $db +} + +proc ::critcl::argoptional {adefs} { + set optional {} + + # A 1st argument matching "Tcl_Interp*" does not count as a user + # visible command argument. + if {[lindex $adefs 0] eq "Tcl_Interp*"} { + set adefs [lrange $adefs 2 end] + } + + foreach {t a} $adefs { + if {[llength $a] == 2} { + lappend optional 1 + } else { + lappend optional 0 + } + } + + return $optional +} + +proc ::critcl::argdefaults {adefs} { + set defaults {} + + # A 1st argument matching "Tcl_Interp*" does not count as a user + # visible command argument. + if {[lindex $adefs 0] eq "Tcl_Interp*"} { + set adefs [lrange $adefs 2 end] + } + + foreach {t a} $adefs { + if {[llength $a] == 2} { + lappend defaults [lindex $a 1] + } + } + + return $defaults +} + +proc ::critcl::argnames {adefs} { + set names {} + + # A 1st argument matching "Tcl_Interp*" does not count as a user + # visible command argument. + if {[lindex $adefs 0] eq "Tcl_Interp*"} { + set adefs [lrange $adefs 2 end] + } + + foreach {t a} $adefs { + if {[llength $a] == 2} { + set a [lindex $a 0] + } + lappend names $a + } + + return $names +} + +proc ::critcl::argcnames {adefs {interp ip}} { + set cnames {} + + if {[lindex $adefs 0] eq "Tcl_Interp*"} { + lappend cnames interp + set adefs [lrange $adefs 2 end] + } + + foreach {t a} $adefs { + if {[llength $a] == 2} { + set a [lindex $a 0] + lappend cnames _has_$a + } + lappend cnames _$a + } + + return $cnames +} + +proc ::critcl::argcsignature {adefs} { + # Construct the signature of the low-level C function. + + set cargs {} + + # If the 1st argument is "Tcl_Interp*", we pass it without + # counting it as a command argument. + + if {[lindex $adefs 0] eq "Tcl_Interp*"} { + lappend cargs [lrange $adefs 0 1] + set adefs [lrange $adefs 2 end] + } + + foreach {t a} $adefs { + if {[llength $a] == 2} { + set a [lindex $a 0] + # Argument to signal if the optional argument was set + # (true) or is the default (false). + lappend cargs "int has_$a" + } + lappend cargs "[ArgumentCTypeB $t] $a" + } + + return $cargs +} + +proc ::critcl::argvardecls {adefs} { + # Argument variables, destinations for the Tcl -> C conversion. + + # A 1st argument matching "Tcl_Interp*" does not count as a user + # visible command argument. + if {[lindex $adefs 0] eq "Tcl_Interp*"} { + set adefs [lrange $adefs 2 end] + } + + set result {} + foreach {t a} $adefs { + if {[llength $a] == 2} { + set a [lindex $a 0] + lappend result "[ArgumentCType $t] _$a;\n int _has_$a = 0;" + } else { + lappend result "[ArgumentCType $t] _$a;" + } + } + + return $result +} + +proc ::critcl::argsupport {adefs} { + # Argument global support, outside/before function. + + # A 1st argument matching "Tcl_Interp*" does not count as a user + # visible command argument. + if {[lindex $adefs 0] eq "Tcl_Interp*"} { + set adefs [lrange $adefs 2 end] + } + + set has {} + + set result {} + foreach {t a} $adefs { + if {[lsearch -exact $has $t] >= 0} continue + lappend has $t + lappend result "[ArgumentSupport $t]" + } + + return $result +} + +proc ::critcl::argconversion {adefs {n 1}} { + # A 1st argument matching "Tcl_Interp*" does not count as a user + # visible command argument. + if {[lindex $adefs 0] eq "Tcl_Interp*"} { + set adefs [lrange $adefs 2 end] + } + + set min $n ; # count all non-optional arguments. min required. + foreach {t a} $adefs { + if {[llength $a] == 2} continue + incr min + } + + set result {} + set opt 0 + set prefix " idx_ = $n;\n" + + foreach {t a} $adefs { + if {[llength $a] == 2} { + # Optional argument. Can be first, or later. + # For the first the prefix gives us the code to initialize idx_. + + lassign $a a default + + set map [list @@ "ov\[idx_\]" @A _$a] + set code [string map $map [ArgumentConversion $t]] + + set code "${prefix} if (oc > $min) \{\n$code\n idx_++;\n _has_$a = 1;\n \} else \{\n _$a = $default;\n \}" + incr min + + lappend result " /* ($t $a, optional, default $default) - - -- --- ----- -------- */" + lappend result $code + lappend result {} + set opt 1 + set prefix "" + } elseif {$opt} { + # Fixed argument, after the optionals. + # Main issue: Use idx_ to access the array. + # We know that no optionals can follow, only the same. + + set map [list @@ "ov\[idx_\]" @A _$a] + lappend result " /* ($t $a) - - -- --- ----- -------- */" + lappend result [string map $map [ArgumentConversion $t]] + lappend result " idx_++;" + lappend result {} + + } else { + # Fixed argument, before any optionals. + set map [list @@ "ov\[$n\]" @A _$a] + lappend result " /* ($t $a) - - -- --- ----- -------- */" + lappend result [string map $map [ArgumentConversion $t]] + lappend result {} + incr n + set prefix " idx_ = $n;\n" + } + } + + return [Deline $result] +} + +proc ::critcl::has-argtype {name} { + variable v::aconv + return [info exists aconv($name)] +} + +proc ::critcl::argtype-def {name} { + lappend def [ArgumentCType $name] + lappend def [ArgumentCTypeB $name] + lappend def [ArgumentConversion $name] + lappend def [ArgumentRelease $name] + lappend def [ArgumentSupport $name] + return $def +} + +proc ::critcl::argtype {name conversion {ctype {}} {ctypeb {}}} { + variable v::actype + variable v::actypeb + variable v::aconv + variable v::acrel + variable v::acsup + + # ctype Type of variable holding the argument. + # ctypeb Type of formal C function argument. + + # Handle aliases by copying the original definition. + if {$conversion eq "="} { + # XXXA auto-create derived type from known base types. + + if {![info exists aconv($ctype)]} { + return -code error "Unable to alias unknown type '$ctype'." + } + + # Do not forget to copy support and release code, if present. + if {[info exists acsup($ctype)]} { + #puts COPY/S:$ctype + set acsup($name) $acsup($ctype) + } + if {[info exists acrel($ctype)]} { + #puts COPY/R:$ctype + set acrel($name) $acrel($ctype) + } + + set conversion $aconv($ctype) + set ctypeb $actypeb($ctype) + set ctype $actype($ctype) + } else { + lassign [HeaderLines $conversion] leadoffset conversion + set conversion "\t\{\n[at::caller! $leadoffset]\t[string trim $conversion] \}" + } + if {$ctype eq {}} { + set ctype $name + } + if {$ctypeb eq {}} { + set ctypeb $name + } + + if {[info exists aconv($name)] && + (($aconv($name) ne $conversion) || + ($actype($name) ne $ctype) || + ($actypeb($name) ne $ctypeb)) + } { + return -code error "Illegal duplicate definition of '$name'." + } + + set aconv($name) $conversion + set actype($name) $ctype + set actypeb($name) $ctypeb + return +} + +proc ::critcl::argtypesupport {name code {guard {}}} { + variable v::aconv + variable v::acsup + if {![info exists aconv($name)]} { + return -code error "No definition for '$name'." + } + if {$guard eq {}} { + set guard $name ; # Handle non-identifier chars! + } + lappend lines "#ifndef CRITCL_$guard" + lappend lines "#define CRITCL_$guard" + lappend lines $code + lappend lines "#endif /* CRITCL_$guard _________ */" + set support [join $lines \n]\n + + if {[info exists acsup($name)] && + ($acsup($name) ne $support) + } { + return -code error "Illegal duplicate support of '$name'." + } + + set acsup($name) $support + return +} + +proc ::critcl::argtyperelease {name code} { + variable v::aconv + variable v::acrel + if {![info exists aconv($name)]} { + return -code error "No definition for '$name'." + } + if {[info exists acrel($name)] && + ($acrel($name) ne $code) + } { + return -code error "Illegal duplicate release of '$name'." + } + + set acrel($name) $code + return +} + +proc ::critcl::has-resulttype {name} { + variable v::rconv + return [info exists rconv($name)] +} + +proc ::critcl::resulttype {name conversion {ctype {}}} { + variable v::rctype + variable v::rconv + + # Handle aliases by copying the original definition. + if {$conversion eq "="} { + if {![info exists rconv($ctype)]} { + return -code error "Unable to alias unknown type '$ctype'." + } + set conversion $rconv($ctype) + set ctype $rctype($ctype) + } else { + lassign [HeaderLines $conversion] leadoffset conversion + set conversion [at::caller! $leadoffset]\t[string trimright $conversion] + } + if {$ctype eq {}} { + set ctype $name + } + + if {[info exists rconv($name)] && + (($rconv($name) ne $conversion) || + ($rctype($name) ne $ctype)) + } { + return -code error "Illegal duplicate definition of '$name'." + } + + set rconv($name) $conversion + set rctype($name) $ctype + return +} + +proc ::critcl::cconst {name rtype rvalue} { + # The semantics are equivalent to + # + # cproc $name {} $rtype { return $rvalue ; } + # + # The main feature of this new command is the knowledge of a + # constant return value, which allows the optimization of the + # generated code. Only the shim is emitted, with the return value + # in place. No need for a lower-level C function containing a + # function body. + + SkipIgnored [set file [This]] + HandleDeclAfterBuild + + # A void result does not make sense for constants. + if {$rtype eq "void"} { + error "Constants cannot be of type \"void\"" + } + + lassign [BeginCommand public $name $rtype $rvalue] ns cns name cname + set traceref ns_$cns$cname + set wname tcl_$cns$cname + set cname c_$cns$cname + + # Construct the shim handling the conversion between Tcl and C + # realms. + + set adb [ArgsInprocess {} 1] + + EmitShimHeader $wname + EmitShimVariables $adb $rtype + EmitArgTracing $traceref + EmitWrongArgsCheck $adb + EmitConst $rtype $rvalue + EmitShimFooter $adb $rtype + EndCommand + return +} + +proc ::critcl::CheckForTracing {} { + if {!$v::options(trace)} return + if {[info exists ::critcl::v::__trace__]} return + + package require critcl::cutil + ::critcl::cutil::tracer on + set ::critcl::v::__trace__ marker ;# See above + return +} + +proc ::critcl::cproc {name adefs rtype {body "#"} args} { + SkipIgnored [set file [This]] + HandleDeclAfterBuild + CheckForTracing + + set acname 0 + set passcd 0 + set aoffset 0 + set tname "" + while {[string match "-*" $args]} { + switch -- [set opt [lindex $args 0]] { + -cname { set acname [lindex $args 1] } + -pass-cdata { set passcd [lindex $args 1] } + -arg-offset { set aoffset [lindex $args 1] } + -tracename { set tname [lindex $args 1] } + default { + error "Unknown option $opt, expected one of -cname, or -pass-cdata" + } + } + set args [lrange $args 2 end] + } + + incr aoffset ; # always include the command name. + set adb [ArgsInprocess $adefs $aoffset] + + if {$acname} { + BeginCommand static $name $adefs $rtype $body + set ns {} + set cns {} + set wname $name + set cname c_$name + if {$tname ne {}} { + set traceref \"$tname\" + } else { + set traceref \"$name\" + } + } else { + lassign [BeginCommand public $name $adefs $rtype $body] ns cns name cname + set traceref ns_$cns$cname + set wname tcl_$cns$cname + set cname c_$cns$cname + } + + set names [dict get $adb names] + set cargs [dict get $adb csignature] + set cnames [dict get $adb cnames] + + if {$passcd} { + set cargs [linsert $cargs 0 {ClientData clientdata}] + set cnames [linsert $cnames 0 cd] + } + + # Support code for argument conversions (i.e. structures, helper + # functions, etc. ...) + EmitSupport $adb + + # Emit either the low-level function, or, if it wasn't defined + # here, a reference to the shim we can use. + + if {$body ne "#"} { + Emit "static [ResultCType $rtype] " + Emitln "${cname}([join $cargs {, }])" + Emit \{\n + lassign [HeaderLines $body] leadoffset body + if {$v::options(lines)} { + Emit [at::CPragma $leadoffset -2 $file] + } + Emit $body + Emitln \n\} + } else { + Emitln "#define $cname $name" + } + + # Construct the shim handling the conversion between Tcl and C + # realms. + + EmitShimHeader $wname + EmitShimVariables $adb $rtype + EmitArgTracing $traceref + EmitWrongArgsCheck $adb + Emit [dict get $adb aconv] + EmitCall $cname $cnames $rtype + EmitShimFooter $adb $rtype + EndCommand + return +} + +proc ::critcl::cinit {text edecls} { + set file [SkipIgnored [set file [This]]] + HandleDeclAfterBuild + CInitCore $file $text $edecls + return +} + +proc ::critcl::CInitCore {file text edecls} { + set digesta [UUID.extend $file .cinit.f $text] + set digestb [UUID.extend $file .cinit.e $edecls] + + set initc {} + set skip [Lines $text] + lassign [HeaderLines $text] leadoffset text + if {$v::options(lines)} { + append initc [at::CPragma $leadoffset -2 $file] + } + append initc $text \n + + set edec {} + lassign [HeaderLines $edecls] leadoffset edecls + if {$v::options(lines)} { + incr leadoffset $skip + append edec [at::CPragma $leadoffset -2 $file] + } + append edec $edecls \n + + dict update v::code($file) config c { + dict append c initc $initc \n + dict append c edecls $edec \n + } + return +} + +# # ## ### ##### ######## ############# ##################### +## Public API to code origin handling. + +namespace eval ::critcl::at { + namespace export caller caller! here here! get get* incr incrt = + catch { namespace ensemble create } +} + +# caller - stash caller location, possibly modified (level change, line offset) +# caller! - format & return caller location, clears stash +# here - stash current location +# here! - return format & return current location, clears stash +# incr* - modify stashed location (only line number, not file). +# get - format, return, and clear stash +# get* - format & return stash + +proc ::critcl::at::caller {{off 0} {level 0}} { + ::incr level -3 + Where $off $level [::critcl::This] + return +} + +proc ::critcl::at::caller! {{off 0} {level 0}} { + ::incr level -3 + Where $off $level [::critcl::This] + return [get] +} + +proc ::critcl::at::here {} { + Where 0 -2 [::critcl::This] + return +} + +proc ::critcl::at::here! {} { + Where 0 -2 [::critcl::This] + return [get] +} + +proc ::critcl::at::get {} { + variable where + if {!$::critcl::v::options(lines)} { + return {} + } + if {![info exists where]} { + return -code error "No location defined" + } + set result [Format $where] + unset where + return $result +} + +proc ::critcl::at::get* {} { + variable where + if {!$::critcl::v::options(lines)} { + return {} + } + if {![info exists where]} { + return -code error "No location defined" + } + return [Format $where] +} + +proc ::critcl::at::= {file line} { + variable where + set where [list $file $line] + return +} + +proc ::critcl::at::incr {args} { + variable where + lassign $where file line + foreach offset $args { + ::incr line $offset + } + set where [list $file $line] + return +} + +proc ::critcl::at::incrt {args} { + variable where + if {$where eq {}} { + # Ignore problem when we have no precise locations. + if {![interp debug {} -frame]} return + return -code error "No location to change" + } + lassign $where file line + foreach text $args { + ::incr line [::critcl::Lines $text] + } + set where [list $file $line] + return +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Input and Output control + +proc ::critcl::collect {script {slot {}}} { + collect_begin $slot + uplevel 1 $script + return [collect_end] +} + +proc ::critcl::collect_begin {{slot {}}} { + # Divert the collection of code fragments to slot + # (output control). Stack on any previous diversion. + variable v::this + # See critcl::This for where this information is injected into the + # code generation system. + + if {$slot eq {}} { + set slot MEMORY[expr { [info exists this] + ? [llength $this] + : 0 }] + } + # Prefix prevents collision of slot names and file paths. + lappend this critcl://$slot + return +} + +proc ::critcl::collect_end {} { + # Stop last diversion, and return the collected information as + # single string of C code. + variable v::this + # See critcl::This for where this information is injected into the + # code generation system. + + # Ensure that a diversion is actually open. + if {![info exists this] || ![llength $this]} { + return -code error "collect_end mismatch, no diversions active" + } + + set slot [Dpop] + set block {} + + foreach digest [dict get $v::code($slot) config fragments] { + append block "[Separator]\n\n" + append block [dict get $v::code($slot) config block $digest]\n + } + + # Drop all the collected data. Note how anything other than the C + # code fragments is lost, and how cbuild results are removed + # also. These do not belong anyway. + unset v::code($slot) + + return $block +} + + +proc ::critcl::Dpop {} { + variable v::this + + # Get current slot, and pop from the diversion stack. + # Remove stack when it becomes empty. + set slot [lindex $this end] + set v::this [lrange $this 0 end-1] + if {![llength $this]} { + unset this + } + return $slot +} + +proc ::critcl::include {path args} { + # Include headers or other C files into the current code. + set args [linsert $args 0 $path] + msg " (include <[join $args ">)\n (include <"]>)" + ccode "#include <[join $args ">\n#include <"]>" +} + +proc ::critcl::make {path contents} { + # Generate a header or other C file for pickup by other parts of + # the current package. Stored in the cache dir, making it local. + file mkdir [cache] + set cname [file join [cache] $path] + + set c [open $cname.[pid] w] + puts -nonewline $c $contents\n\n + close $c + file rename -force $cname.[pid] $cname + + return $path +} + +proc ::critcl::source {path} { + # Source a critcl file in the context of the current file, + # i.e. [This]. Enables the factorization of a large critcl + # file into smaller, easier to read pieces. + SkipIgnored [set file [This]] + HandleDeclAfterBuild + + msg " (importing $path)" + + set undivert 0 + variable v::this + if {![info exists this] || ![llength $this]} { + # critcl::source is recording the critcl commands in the + # context of the toplevel file which started the chain the + # critcl::source. So why are we twiddling with the diversion + # state? + # + # The condition above tells us that we are in the first + # non-diverted critcl::source called by the context. [This] + # returns that context. Due to our use of regular 'source' (*) + # during its execution [This] would return the sourced file as + # context. Wrong. Our fix for this is to perform, essentially, + # an anti-diversion. Saving [This] as diversion, forces it to + # return the proper value during the whole sourcing. + # + # And if the critcl::source is run in an already diverted + # context then the changes to [info script] by 'source' do not + # matter, making an anti-diversion unnecessary. + # + # Diversions inside of 'source' will work as usual, given + # their nesting nature. + # + # (Ad *) And we use 'source' as only this ensures proper + # collection of [info frame] location information. + + lappend this [This] + set undivert 1 + } + + foreach f [Expand $file $path] { + set v::source $f + # The source file information is used by critcl::at::Where + #uplevel 1 [Cat $f] + uplevel #0 [list ::source $f] + unset -nocomplain v::source + } + + if {$undivert} Dpop + return +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Control & Interface + +proc ::critcl::owns {args} {} + +proc ::critcl::cheaders {args} { + SkipIgnored [This] + HandleDeclAfterBuild + return [SetParam cheaders [ResolveRelative -I $args]] +} + +proc ::critcl::csources {args} { + SkipIgnored [This] + HandleDeclAfterBuild + return [SetParam csources $args 1 1 1] +} + +proc ::critcl::clibraries {args} { + SkipIgnored [This] + HandleDeclAfterBuild + return [SetParam clibraries [ResolveRelative { + -L --library-directory + } $args]] +} + +proc ::critcl::cobjects {args} { + SkipIgnored [This] + HandleDeclAfterBuild + return [SetParam cobjects $args] +} + +proc ::critcl::tsources {args} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + # Here, 'license', 'meta?' and 'meta' are the only places where we + # are not extending the UUID. Because the companion Tcl sources + # (count, order, and content) have no bearing on the binary at + # all. + InitializeFile $file + + set dfiles {} + dict update v::code($file) config c { + foreach f $args { + foreach e [Expand $file $f] { + dict lappend c tsources $e + lappend dfiles $e + } + } + } + # Attention: The actual scanning is done outside of the `dict + # update`, because it makes changes to the dictionary which would + # be revert on exiting the update. + foreach e $dfiles { + ScanDependencies $file $e + } + return +} + +proc ::critcl::cflags {args} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + if {![llength $args]} return + CFlagsCore $file $args + return +} + +proc ::critcl::CFlagsCore {file flags} { + UUID.extend $file .cflags $flags + dict update v::code($file) config c { + foreach flag $flags { + dict lappend c cflags $flag + } + } + return +} + +proc ::critcl::ldflags {args} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + if {![llength $args]} return + + UUID.extend $file .ldflags $args + dict update v::code($file) config c { + foreach flag $args { + # Drop any -Wl prefix which will be added back a moment + # later, otherwise it would be doubled, breaking the command. + regsub -all {^-Wl,} $flag {} flag + dict lappend c ldflags -Wl,$flag + } + } + return +} + +proc ::critcl::framework {args} { + SkipIgnored [This] + HandleDeclAfterBuild + + # Check if we are building for OSX and ignore the command if we + # are not. Our usage of "actualtarget" means that we allow for a + # cross-compilation environment to OS X as well. + if {![string match "macosx*" [actualtarget]]} return + + foreach arg $args { + # if an arg contains a slash it must be a framework path + if {[string first / $arg] == -1} { + ldflags -framework $arg + } else { + cflags -F$arg + ldflags -F$arg + } + } + return +} + +proc ::critcl::tcl {version} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + + msg " (tcl $version)" + + UUID.extend $file .mintcl $version + dict set v::code($file) config mintcl $version + + # This is also a dependency to record in the meta data. A 'package + # require' is not needed. This can be inside of the generated and + # loaded C code. + + ImetaAdd $file require [list [list Tcl $version]] + return +} + +proc ::critcl::tk {} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + + msg " (+tk)" + + UUID.extend $file .tk 1 + dict set v::code($file) config tk 1 + + # This is also a dependency to record in the meta data. A 'package + # require' is not needed. This can be inside of the generated and + # loaded C code. + + ImetaAdd $file require Tk + return +} + +# Register a shared library for pre-loading - this will eventually be +# redundant when TIP #239 is widely available +proc ::critcl::preload {args} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + if {![llength $args]} return + + UUID.extend $file .preload $args + dict update v::code($file) config c { + foreach lib $args { + dict lappend c preload $lib + } + } + return +} + +proc ::critcl::license {who args} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + + set who [string trim $who] + if {$who ne ""} { + set license "This software is copyrighted by $who.\n" + } else { + set license "" + } + + set elicense [LicenseText $args] + + append license $elicense + + # This, 'tsources', 'meta?', and 'meta' are the only places where + # we are not extending the UUID. Because the license text has no + # bearing on the binary at all. + InitializeFile $file + + ImetaSet $file license [Text2Words $elicense] + ImetaSet $file author [Text2Authors $who] + return +} + +proc ::critcl::LicenseText {words} { + if {[llength $words]} { + # Use the supplied license details as our suffix. + return [join $words] + } else { + # No details were supplied, fall back to the critcl license as + # template for the generated package. This is found in a + # sibling of this file. + + # We strip the first 2 lines from the file, this gets rid of + # the author information for critcl itself, allowing us to + # replace it by the user-supplied author. + + variable mydir + set f [file join $mydir license.terms] + return [join [lrange [split [Cat $f] \n] 2 end] \n] + } +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: meta data (teapot) + +proc ::critcl::description {text} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + InitializeFile $file + + ImetaSet $file description [Text2Words $text] + return +} + +proc ::critcl::summary {text} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + InitializeFile $file + + ImetaSet $file summary [Text2Words $text] + return +} + +proc ::critcl::subject {args} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + InitializeFile $file + + ImetaAdd $file subject $args + return +} + +proc ::critcl::meta {key args} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + + # This, 'meta?', 'license', and 'tsources' are the only places + # where we are not extending the UUID. Because the meta data has + # no bearing on the binary at all. + InitializeFile $file + + dict update v::code($file) config c { + dict update c meta m { + foreach v $args { dict lappend m $key $v } + } + } + return +} + +proc ::critcl::meta? {key} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + + # This, 'meta', 'license', and 'tsources' are the only places + # where we are not extending the UUID. Because the meta data has + # no bearing on the binary at all. + InitializeFile $file + + if {[dict exists $v::code($file) config package $key]} { + return [dict get $v::code($file) config package $key] + } + if {[dict exists $v::code($file) config meta $key]} { + return [dict get $v::code($file) config meta $key] + } + return -code error "Unknown meta data key \"$key\"" +} + +proc ::critcl::ImetaSet {file key words} { + dict set v::code($file) config package $key $words + #puts |||$key|%|[dict get $v::code($file) config package $key]| + return +} + +proc ::critcl::ImetaAdd {file key words} { + dict update v::code($file) config c { + dict update c package p { + foreach word $words { + dict lappend p $key $word + } + } + } + #puts XXX|$file||$key|+|[dict get $v::code($file) config package $key]| + return +} + +proc ::critcl::Text2Words {text} { + regsub -all {[ \t\n]+} $text { } text + return [split [string trim $text]] +} + +proc ::critcl::Text2Authors {text} { + regsub -all {[ \t\n]+} $text { } text + set authors {} + foreach a [split [string trim $text] ,] { + lappend authors [string trim $a] + } + return $authors +} + +proc ::critcl::GetMeta {file} { + if {![dict exists $v::code($file) config meta]} { + set result {} + } else { + set result [dict get $v::code($file) config meta] + } + + # Merge the package information (= system meta data) with the + # user's meta data. The system information overrides anything the + # user may have declared for the reserved keys (name, version, + # platform, as::author, as::build::date, license, description, + # summary, require). Note that for the internal bracketing code + # the system information may not exist, hence the catch. Might be + # better to indicate the bracket somehow and make it properly + # conditional. + + #puts %$file + + catch { + set result [dict merge $result [dict get $v::code($file) config package]] + } + + # A few keys need a cleanup, i.e. removal of duplicates, and the like + catch { + dict set result require [lsort -dict -unique [dict get $result require]] + } + catch { + dict set result build::require [lsort -dict -unique [dict get $result build::require]] + } + catch { + dict set result platform [lindex [dict get $result platform] 0] + } + catch { + dict set result generated::by [lrange [dict get $result generated::by] 0 1] + } + catch { + dict set result generated::date [lindex [dict get $result generated::by] 0] + } + + #array set ___M $result ; parray ___M ; unset ___M + return $result +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: user configuration options. + +proc ::critcl::userconfig {cmd args} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + InitializeFile $file + + if {![llength [info commands ::critcl::UC$cmd]]} { + return -code error "Unknown method \"$cmd\"" + } + + # Dispatch + return [eval [linsert $args 0 ::critcl::UC$cmd $file]] +} + +proc ::critcl::UCdefine {file oname odesc otype {odefault {}}} { + # When declared without a default determine one of our own. Bool + # flag default to true, whereas enum flags, which is the rest, + # default to their first value. + + # The actual definition ignores the config description. This + # argument is only used by the static code scanner supporting + # TEA. See ::critcl::scan::userconfig. + + if {[llength [info level 0]] < 6} { + set odefault [UcDefault $otype] + } + + # Validate the default against the type too, before saving + # everything. + UcValidate $oname $otype $odefault + + UUID.extend $file .uc-def [list $oname $otype $odefault] + + dict set v::code($file) config userflag $oname type $otype + dict set v::code($file) config userflag $oname default $odefault + return +} + +proc ::critcl::UCset {file oname value} { + # NOTE: We can set any user flag we choose, even if not declared + # yet. Validation of the value happens on query, at which time the + # flag must be declared. + + dict set v::code($file) config userflag $oname value $value + return +} + +proc ::critcl::UCquery {file oname} { + # Prefer cached data. This is known as declared, defaults merged, + # validated. + if {[dict exists $v::code($file) config userflag $oname =]} { + return [dict get $v::code($file) config userflag $oname =] + } + + # Reject use of undeclared user flags. + if {![dict exists $v::code($file) config userflag $oname type]} { + error "Unknown user flag \"$oname\"" + } + + # Check if a value was supplied by the calling app. If not, fall + # back to the declared default. + + if {[dict exists $v::code($file) config userflag $oname value]} { + set value [dict get $v::code($file) config userflag $oname value] + } else { + set value [dict get $v::code($file) config userflag $oname default] + } + + # Validate value against the flag's type. + set otype [dict get $v::code($file) config userflag $oname type] + UcValidate $oname $otype $value + + # Fill cache + dict set v::code($file) config userflag $oname = $value + return $value +} + +proc ::critcl::UcValidate {oname otype value} { + switch -exact -- $otype { + bool { + if {![string is bool -strict $value]} { + error "Expected boolean for user flag \"$oname\", got \"$value\"" + } + } + default { + if {[lsearch -exact $otype $value] < 0} { + error "Expected one of [linsert [join $otype {, }] end-1 or] for user flag \"$oname\", got \"$value\"" + } + } + } +} + +proc ::critcl::UcDefault {otype} { + switch -exact -- $otype { + bool { + return 1 + } + default { + return [lindex $otype 0] + } + } +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: API (stubs) management + +proc ::critcl::api {cmd args} { + set file [SkipIgnored [This]] + HandleDeclAfterBuild + + if {![llength [info commands ::critcl::API$cmd]]} { + return -code error "Unknown method \"$cmd\"" + } + + # Dispatch + return [eval [linsert $args 0 ::critcl::API$cmd $file]] +} + +proc ::critcl::APIscspec {file scspec} { + UUID.extend $file .api-scspec $scspec + dict set v::code($file) config api_scspec $scspec + return +} + +proc ::critcl::APIimport {file name version} { + + # First we request the imported package, giving it a chance to + # generate the headers searched for in a moment (maybe it was + # critcl based as well, and generates things dynamically). + + # Note that this can fail, for example in a cross-compilation + # environment. Such a failure however does not imply that the + # required API headers are not present, so we can continue. + + catch { + package require $name $version + } + + ImetaAdd $file require [list [list $name $version]] + + # Now we check that the relevant headers of the imported package + # can be found in the specified search paths. + + set cname [string map {:: _} $name] + + set at [API_locate $cname searched] + if {$at eq {}} { + error "Headers for API $name not found in \n-\t[join $searched \n-\t]" + } else { + msg " (stubs import $name $version @ $at/$cname)" + } + + set def [list $name $version] + UUID.extend $file .api-import $def + dict update v::code($file) config c { + dict lappend c api_use $def + } + + # At last look for the optional .decls file. Ignore if there is + # none. Decode and return contained stubs table otherwise. + + set decls $at/$cname/$cname.decls + if {[file exists $decls]} { + package require stubs::reader + set T [stubs::container::new] + stubs::reader::file T $decls + return $T + } + return +} + +proc ::critcl::APIexport {file name} { + msg " (stubs export $name)" + + UUID.extend $file .api-self $name + return [dict set v::code($file) config api_self $name] +} + +proc ::critcl::APIheader {file args} { + UUID.extend $file .api-headers $args + return [SetParam api_hdrs $args] +} + +proc ::critcl::APIextheader {file args} { + UUID.extend $file .api-eheaders $args + return [SetParam api_ehdrs $args 0] +} + +proc ::critcl::APIfunction {file rtype name arguments} { + package require stubs::reader + + # Generate a declaration as it would have come straight out of the + # stubs reader. To this end we generate a C code fragment as it + # would be have been written inside of a .decls file. + + # TODO: We should record this as well, and later generate a .decls + # file as part of the export. Or regenerate it from the internal + # representation. + + if {[llength $arguments]} { + foreach {t a} $arguments { + lappend ax "$t $a" + } + } else { + set ax void + } + set decl [stubs::reader::ParseDecl "$rtype $name ([join $ax ,])"] + + UUID.extend $file .api-fun $decl + dict update v::code($file) config c { + dict lappend c api_fun $decl + } + return +} + +proc ::critcl::API_locate {name sv} { + upvar 1 $sv searched + foreach dir [SystemIncludePaths [This]] { + lappend searched $dir + if {[API_at $dir $name]} { return $dir } + } + return {} +} + +proc ::critcl::API_at {dir name} { + foreach suffix { + Decls.h StubLib.h + } { + if {![file exists [file join $dir $name $name$suffix]]} { return 0 } + } + return 1 +} + +proc ::critcl::API_setup {file} { + package require stubs::gen + + lassign [API_setup_import $file] iprefix idefines + dict set v::code($file) result apidefines $idefines + + append prefix $iprefix + append prefix [API_setup_export $file] + + # Save prefix to result dictionary for pickup by Compile. + if {$prefix eq ""} return + + dict set v::code($file) result apiprefix $prefix\n + return +} + +proc ::critcl::API_setup_import {file} { + if {![dict exists $v::code($file) config api_use]} { + return "" + } + + #msg -nonewline " (stubs import)" + + set prefix "" + set defines {} + + foreach def [dict get $v::code($file) config api_use] { + lassign $def iname iversion + + set cname [string map {:: _} $iname] + set upname [string toupper $cname] + set capname [stubs::gen::cap $cname] + + set import [critcl::at::here!][subst -nocommands { + /* Import API: $iname */ + #define USE_${upname}_STUBS 1 + #include <$cname/${cname}Decls.h> + }] + append prefix \n$import + CCodeCore $file $import + + # TODO :: DOCUMENT environment of the cinit code. + CInitCore $file [subst -nocommands { + if (!${capname}_InitStubs (ip, "$iversion", 0)) { + return TCL_ERROR; + } + }] [subst -nocommands { + #include <$cname/${cname}StubLib.h> + }] + + lappend defines -DUSE_${upname}_STUBS=1 + } + + return [list $prefix $defines] +} + +proc ::critcl::API_setup_export {file} { + if {![dict exists $v::code($file) config api_hdrs] && + ![dict exists $v::code($file) config api_ehdrs] && + ![dict exists $v::code($file) config api_fun]} return + + if {[dict exists $v::code($file) config api_self]} { + # API name was declared explicitly + set ename [dict get $v::code($file) config api_self] + } else { + # API name is implicitly defined, is package name. + set ename [dict get $v::code($file) config package name] + } + + set prefix "" + + #msg -nonewline " (stubs export)" + + set cname [string map {:: _} $ename] + set upname [string toupper $cname] + set capname [stubs::gen::cap $cname] + + set import [at::here!][subst -nocommands { + /* Import our own exported API: $ename, mapping disabled */ + #undef USE_${upname}_STUBS + #include <$cname/${cname}Decls.h> + }] + append prefix \n$import + CCodeCore $file $import + + # Generate the necessary header files. + + append sdecls "\#ifndef ${cname}_DECLS_H\n" + append sdecls "\#define ${cname}_DECLS_H\n" + append sdecls "\n" + append sdecls "\#include \n" + + if {[dict exists $v::code($file) config api_ehdrs]} { + append sdecls "\n" + file mkdir [cache]/$cname + foreach hdr [dict get $v::code($file) config api_ehdrs] { + append sdecls "\#include \"[file tail $hdr]\"\n" + } + } + + if {[dict exists $v::code($file) config api_hdrs]} { + append sdecls "\n" + file mkdir [cache]/$cname + foreach hdr [dict get $v::code($file) config api_hdrs] { + Copy $hdr [cache]/$cname + append sdecls "\#include \"[file tail $hdr]\"\n" + } + } + + # Insert code to handle the storage class settings on Windows. + + append sdecls [string map \ + [list @cname@ $cname @up@ $upname] \ + $v::storageclass] + + package require stubs::container + package require stubs::reader + package require stubs::gen + package require stubs::gen::header + package require stubs::gen::init + package require stubs::gen::lib + package require stubs::writer + + # Implied .decls file. Not actually written, only implied in the + # stubs container invocations, as if read from such a file. + + set T [stubs::container::new] + stubs::container::library T $ename + stubs::container::interface T $cname + + if {[dict exists $v::code($file) config api_scspec]} { + stubs::container::scspec T \ + [dict get $v::code($file) config api_scspec] + } + + if {[dict exists $v::code($file) config api_fun]} { + set index 0 + foreach decl [dict get $v::code($file) config api_fun] { + #puts D==|$decl| + stubs::container::declare T $cname $index generic $decl + incr index + } + append sdecls "\n" + append sdecls [stubs::gen::header::gen $T $cname] + } + + append sdecls "\#endif /* ${cname}_DECLS_H */\n" + + set comment "/* Stubs API Export: $ename */" + + set thedecls [stubs::writer::gen $T] + set slib [stubs::gen::lib::gen $T] + set sinitstatic " $comment\n " + append sinitstatic [stubs::gen::init::gen $T] + + set pn [dict get $v::code($file) config package name] + set pv [dict get $v::code($file) config package version] + + set sinitrun $comment\n + append sinitrun "Tcl_PkgProvideEx (ip, \"$pn\", \"$pv\", (ClientData) &${cname}Stubs);" + + # Save the header files to the result cache for pickup (importers + # in mode "compile & run", or by the higher-level code doing a + # "generate package") + + WriteCache $cname/${cname}Decls.h $sdecls + WriteCache $cname/${cname}StubLib.h $slib + WriteCache $cname/${cname}.decls $thedecls + + dict update v::code($file) result r { + dict lappend r apiheader [file join [cache] $cname] + } + + CInitCore $file $sinitrun $sinitstatic + CFlagsCore $file [list -DBUILD_$cname] + + return $prefix +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Introspection + +proc ::critcl::check {args} { + set file [SkipIgnored [This] 0] + HandleDeclAfterBuild + + switch -exact -- [llength $args] { + 1 { + set label Checking + set code [lindex $args 0] + } + 2 { + lassign $args label code + } + default { + return -code error "wrong#args: Expected ?label? code" + } + } + + set src [WriteCache check_[pid].c $code] + set obj [file rootname $src][getconfigvalue object] + + # See also the internal helper 'Compile'. Thre code here is in + # essence a simplified form of that. + + set cmdline [getconfigvalue compile] + lappendlist cmdline [GetParam $file cflags] + lappendlist cmdline [SystemIncludes $file] + lappendlist cmdline [CompileResult $obj] + lappend cmdline $src + + LogOpen $file + Log* "${label}... " + StatusReset + set ok [ExecWithLogging $cmdline OK FAILED] + StatusReset + + LogClose + clean_cache check_[pid].* + return $ok +} + +proc ::critcl::checklink {args} { + set file [SkipIgnored [This] 0] + HandleDeclAfterBuild + + switch -exact -- [llength $args] { + 1 { + set label Checking + set code [lindex $args 0] + } + 2 { + lassign $args label code + } + default { + return -code error "wrong#args: Expected ?label? code" + } + } + + set src [WriteCache check_[pid].c $code] + set obj [file rootname $src][getconfigvalue object] + + # See also the internal helper 'Compile'. Thre code here is in + # essence a simplified form of that. + + set cmdline [getconfigvalue compile] + lappendlist cmdline [GetParam $file cflags] + lappendlist cmdline [SystemIncludes $file] + lappendlist cmdline [CompileResult $obj] + lappend cmdline $src + + LogOpen $file + Log* "${label} (build)... " + StatusReset + set ok [ExecWithLogging $cmdline OK FAILED] + StatusReset + + if {!$ok} { + LogClose + clean_cache check_[pid].* + return 0 + } + + set out [file join [cache] a_[pid].out] + set cmdline [getconfigvalue link] + + if {$option::debug_symbols} { + lappendlist cmdline [getconfigvalue link_debug] + } else { + lappendlist cmdline [getconfigvalue strip] + lappendlist cmdline [getconfigvalue link_release] + } + + lappendlist cmdline [LinkResult $out] + lappendlist cmdline $obj + lappendlist cmdline [SystemLibraries] + lappendlist cmdline [FixLibraries [GetParam $file clibraries]] + lappendlist cmdline [GetParam $file ldflags] + + Log* "${label} (link)... " + StatusReset + set ok [ExecWithLogging $cmdline OK ERR] + + LogClose + clean_cache check_[pid].* a_[pid].* + return $ok +} + +proc ::critcl::compiled {} { + SkipIgnored [This] 1 + HandleDeclAfterBuild + return 0 +} + +proc ::critcl::compiling {} { + SkipIgnored [This] 0 + HandleDeclAfterBuild + # Check that we can indeed run a compiler + # Should only need to do this if we have to compile the code? + if {[auto_execok [lindex [getconfigvalue compile] 0]] eq ""} { + set v::compiling 0 + } else { + set v::compiling 1 + } + return $v::compiling +} + +proc ::critcl::done {} { + set file [SkipIgnored [This] 1] + return [expr {[info exists v::code($file)] && + [dict exists $v::code($file) result closed]}] +} + +proc ::critcl::failed {} { + SkipIgnored [This] 0 + if {$v::buildforpackage} { return 0 } + return [cbuild [This] 0] +} + +proc ::critcl::load {} { + SkipIgnored [This] 1 + if {$v::buildforpackage} { return 1 } + return [expr {![cbuild [This]]}] +} + +# # ## ### ##### ######## ############# ##################### +## Default error behaviour + +proc ::critcl::error {msg} { + return -code error $msg +} + +# # ## ### ##### ######## ############# ##################### +## Default message behaviour + +proc ::critcl::msg {args} { + # ignore message (compile & run) +} + +# # ## ### ##### ######## ############# ##################### +## Default print behaviour + +proc ::critcl::print {args} { + # API same as for builtin ::puts. Use as is. + return [eval [linsert $args 0 ::puts]] +} + +# # ## ### ##### ######## ############# ##################### +## Runtime support to handle the possibility of a prebuilt package using +## the .tcl file with embedded C as its own companon defining regular +## Tcl code for the package as well. If the critcl package is loaded +## already this will cause it to ignore the C definitions, with best +## guesses for failed, done, load, check, compiled, and compiling. + +proc ::critcl::Ignore {f} { + set v::ignore([file normalize $f]) . + return +} + +proc ::critcl::SkipIgnored {f {result {}}} { + if {[info exists v::ignore($f)]} { return -code return $result } + return $f +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Build Management + +proc ::critcl::config {option args} { + if {![info exists v::options($option)] || [llength $args] > 1} { + error "option must be one of: [lsort [array names v::options]]" + } + if {![llength $args]} { + return $v::options($option) + } + set v::options($option) [lindex $args 0] +} + +proc ::critcl::debug {args} { + # Replace 'all' everywhere, and squash duplicates, whether from + # this, or user-specified. + set args [string map {all {memory symbols}} $args] + set args [lsort -unique $args] + + foreach arg $args { + switch -- $arg { + memory { foreach x [getconfigvalue debug_memory] { cflags $x } } + symbols { foreach x [getconfigvalue debug_symbols] { cflags $x } + set option::debug_symbols 1 + } + default { + error "unknown critcl::debug option - $arg" + } + } + } + return +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Result Cache + +proc ::critcl::cache {{dir ""}} { + if {[llength [info level 0]] == 2} { + set v::cache [file normalize $dir] + } + return $v::cache +} + +proc ::critcl::clean_cache {args} { + if {![llength $args]} { lappend args * } + foreach pattern $args { + foreach file [glob -nocomplain -directory $v::cache $pattern] { + file delete -force $file + } + } + return +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Build Configuration +# read toolchain information from config file + +proc ::critcl::readconfig {config} { + variable run + variable configfile $config + + set cfg [open $config] + set knowntargets [list] + set cont "" + set whenplat "" + + interp eval $run set platform $v::buildplatform + + set i 0 + while {[gets $cfg line] >= 0} { + incr i + if {[set line [string trim $line]] ne ""} { + # config lines can be continued using trailing backslash + if {[string index $line end] eq "\\"} { + append cont " [string range $line 0 end-1]" + continue + } + if {$cont ne ""} { + append cont $line + set line [string trim $cont] + set cont "" + } + + # At this point we have a complete line/command in 'line'. + # We expect the following forms of input: + # + # (1.) if {...} {.............} - Tcl command, run in the + # backend interpreter. + # Note that this can EXIT + # the application using + # the critcl package. + # (2.) set VAR VALUE.......... - Ditto. + # (3.) # ..................... - Comment. Skipped + # (4.) PLATFORM VAR VALUE...... - Platform-specific + # configuration variable + # and value. + + # (4a) PLATFORM when ......... - Makes the PLATFORM + # conditional on the + # expression after the + # 'when' keyword. This + # uses variables set by + # (1) and/or (2). The + # expression is run in the + # backend interpreter. If + # and only if PLATFORM is + # a prefix of the current + # build platform, or the + # reverse, then the code + # with an TRUE when is + # chosen as the + # configuration. + + # (4b) PLATFORM target ?actual? - Marks the platform as a + # cross-compile target, + # and actual is the + # platform identifier of + # the result. If not + # specified it defaults to + # PLATFORM. + # (4c) PLATFORM copy PARENT... - Copies the currently defined + # configuration variables and + # values to the settings for + # this platform. + # (5.) VAR VALUE............... - Default configuration + # variable, and value. + + set plat [lindex [split $line] 0] + + # (1), or (2) + if {$plat eq "set" || $plat eq "if"} { + while {![info complete $line] && ![eof $cfg]} { + if {[gets $cfg more] == -1} { + set msg "incomplete command in Critcl Config file " + append msg "starting at line $i" + error $msg + } + append line "\n$more" + + } + interp eval $run $line + continue + } + + # (3) + if {$plat eq "#"} continue + + # (4), or (5). + if {[lsearch -exact $v::configvars $plat] != -1} { + # (5) default config option + set cmd "" + if {![regexp {(\S+)\s+(.*)} $line -> type cmd]} { + # cmd is empty + set type $plat + set cmd "" + } + set plat "" + } else { + # (4) platform config option + if {![regexp {(\S+)\s+(\S+)\s+(.*)} $line -> p type cmd]} { + # cmd is empty + set type [lindex $line 1] + set cmd "" + } + + # (4a) if and only if either build platform or config + # code are a prefix of each other can the 'when' + # condition be evaluated and override the + # standard selection for the configuration. + + if {$type eq "when" && + ( [string match ${v::buildplatform}* $plat] || + [string match ${plat}* $v::buildplatform] )} { + set res "" + catch { + set res [interp eval $run expr $cmd] + } + switch $res { + "" - + 0 { set whenfalse($plat) 1 } + 1 { set whenplat $plat } + } + } + lappend knowntargets $plat + } + + switch -exact -- $type { + target { + # (4b) cross compile target. + # cmd = actual target platform identifier. + if {$cmd eq ""} { + set cmd $plat + } + set v::xtargets($plat) $cmd + } + copy { + # (4c) copy an existing config + # XXX - should we error out if no definitions exist + # for parent platform config + # $cmd contains the parent platform + foreach {key val} [array get v::toolchain "$cmd,*"] { + set key [lindex [split $key ,] 1] + set v::toolchain($plat,$key) $val + } + } + default { + set v::toolchain($plat,$type) $cmd + } + } + } + } + set knowntargets [lsort -unique $knowntargets] + close $cfg + + # Config file processing has completed. + # Now select the platform to configure the + # compiler backend with. + + set v::knowntargets $knowntargets + + # The config file may have selected a configuration based on the + # TRUE when conditions. Which were matched to v::buildplatform, + # making the chosen config a variant of it. If that did not happen + # a platform is chosen from the set of defined targets. + if {$whenplat ne ""} { + set match [list $whenplat] + } else { + set match [critcl::chooseconfig $v::buildplatform] + } + + # Configure the backend. + + setconfig "" ;# defaults + if {[llength $match]} { + setconfig [lindex $match 0] + } else { + setconfig $v::buildplatform + } + return +} + +proc ::critcl::chooseconfig {targetconfig {err 0}} { + # first try to match exactly + set match [lsearch -exact -all -inline $v::knowntargets $targetconfig] + + # on failure, try to match as glob pattern + if {![llength $match]} { + set match [lsearch -glob -all -inline $v::knowntargets $targetconfig] + } + + # on failure, error out if requested + if {![llength $match] && $err} { + error "unknown target $targetconfig - use one of $v::knowntargets" + } + return $match +} + +proc ::critcl::showconfig {{fd ""}} { + variable run + variable configfile + + # XXX replace gen - v::buildplatform + # XXX Do not use v::targetplatform here. Use v::config. + # XXX Similarly in setconfig. + + set gen $v::buildplatform + if {$v::targetplatform eq ""} { + set plat "default" + } else { + set plat $v::targetplatform + } + set out [list] + if {$plat eq $gen} { + lappend out "Config: $plat" + } else { + lappend out "Config: $plat (built on $gen)" + } + lappend out "Origin: $configfile" + lappend out " [format %-15s cache] [cache]" + foreach var [lsort $v::configvars] { + set val [getconfigvalue $var] + set line " [format %-15s $var]" + foreach word [split [string trim $val]] { + if {[set word [string trim $word]] eq ""} continue + if {[string length "$line $word"] > 70} { + lappend out "$line \\" + set line " [format %-15s { }] $word" + } else { + set line "$line $word" + } + } + lappend out $line + } + # Tcl variables - Combined LengthLongestWord (all), and filtering + set vars [list] + set max 0 + foreach idx [array names v::toolchain $v::targetplatform,*] { + set var [lindex [split $idx ,] 1] + if {[set len [string length $var]] > $max} { + set max $len + } + if {$var ne "when" && ![info exists c::$var]} { + lappend vars $idx $var + } + } + if {[llength $vars]} { + lappend out "Tcl variables:" + foreach {idx var} $vars { + set val $v::toolchain($idx) + if {[llength $val] == 1} { + # for when someone inevitably puts quotes around + # values - e.g. "Windows NT" + set val [lindex $val 0] + } + lappend out " [PadRight $max $var] $val" + } + } + set out [join $out \n] + if {$fd ne ""} { + puts $fd $out + } else { + return $out + } +} + +proc ::critcl::showallconfig {{ofd ""}} { + variable configfile + set txt [Cat $configfile] + if {$ofd ne ""} { + puts $ofd $txt + } else { + return $txt + } +} + +proc ::critcl::setconfig {targetconfig} { + set v::targetconfig $targetconfig + + # Strip the compiler information from the configuration to get the + # platform identifier embedded into it. This is a semi-recurrence + # of the original hardwired block handling win32/gcc/cl. We can + # partly emulate this with 'platform' directives in the Config + # file, however this breaks down when trying to handle the default + # settings. I.e. something like FOO-gcc which has no configuration + # block in the file uses the defaults, and thus has no proper + # place for a custom platform directive. So we have to do it here, + # in code. For symmetry the other compilers (-cc, -cl) are handled + # as well. + + set v::targetplatform $targetconfig + foreach p {gcc cc_r xlc xlc_r cc cl clang([[:digit:]])*} { + if {[regsub -- "-$p\$" $v::targetplatform {} v::targetplatform]} break + } + + set c::platform "" + set c::sharedlibext "" + + foreach var $v::configvars { + if {[info exists v::toolchain($targetconfig,$var)]} { + + set c::$var $v::toolchain($targetconfig,$var) + + if {$var eq "platform"} { + set px [getconfigvalue platform] + set v::targetplatform [lindex $px 0] + set v::version [lindex $px 1] + } + } + } + if {[info exists ::env(CFLAGS)]} { + variable c::compile + append c::compile " $::env(CFLAGS)" + } + if {[info exists ::env(LDFLAGS)]} { + variable c::link + append c::link " $::env(LDFLAGS)" + append c::link_preload " $::env(LDFLAGS)" + } + if {[string match $v::targetplatform $v::buildplatform]} { + # expand platform to match host if it contains wildcards + set v::targetplatform $v::buildplatform + } + if {$c::platform eq ""} { + # default config platform (mainly for the "show" command) + set c::platform $v::targetplatform + } + if {$c::sharedlibext eq ""} { + set c::sharedlibext [info sharedlibextension] + } + + # The following definition of the cache directory is only relevant + # for mode "compile & run". The critcl application handling the + # package mode places the cache in a process-specific location + # without care about platforms. For here this means that we can + # ignore both cross-compilation, and the user choosing a target + # for us, as neither happens nor works for "compile & run". We can + # assume that build and target platforms will be the same, be the + # current platform, and we can make a simple choice for the + # directory. + + cache [file join ~ .critcl [platform::identify]] + + # Initialize Tcl variables based on the chosen tooling + foreach idx [array names v::toolchain $v::targetplatform,*] { + set var [lindex [split $idx ,] 1] + if {![info exists c::$var]} { + set val $v::toolchain($idx) + if {[llength $val] == 1} { + # for when someone inevitably puts quotes around + # values - e.g. "Windows NT" + set val [lindex $val 0] + } + set $var $val + } + } + return +} + +proc ::critcl::getconfigvalue {var} { + variable run + if {[catch {set val [interp eval $run [list subst [set c::$var]]]}]} { + set val [set c::$var] + } + return $val +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- API: Application + +# The regular commands used by the application, defined in other +# sections of the package are: +# +# C critcl::cache +# C critcl::ccode +# C critcl::chooseconfig +# C critcl::cinit +# C critcl::clean_cache +# C critcl::clibraries +# C critcl::cobjects +# C critcl::config I, lines, force, keepsrc, combine +# C critcl::debug +# C critcl::error | App overrides our implementation. +# C critcl::getconfigvalue +# C critcl::lappendlist +# C critcl::ldflags +# C critcl::preload +# C critcl::readconfig +# C critcl::setconfig +# C critcl::showallconfig +# C critcl::showconfig + +proc ::critcl::crosscheck {} { + variable run + global tcl_platform + + if {$tcl_platform(platform) eq "windows"} { + set null NUL: + } else { + set null /dev/null + } + + if {![catch { + set cmd [linsert $c::version 0 exec] + lappend cmd 2> $null;#@stdout + set config [interp eval $run $cmd] + } msg]} { + set host "" + set target "" + foreach line $config { + foreach arg [split $line] { + if {[string match "--*" $arg]} { + lassign [split [string trim $arg -] =] cfg val + set $cfg $val + } + } + } + if {$host ne $target && [info exists v::xtargets($target)]} { + setconfig $target + print stderr "Cross compiling using $target" + } + # XXX host != target, but not know as config ? + # XXX Currently ignored. + # XXX Throwing an error better ? + } + return +} + +# See (XX) at the end of the file (package state variable setup) +# for explanations of the exact differences between these. + +proc ::critcl::knowntargets {} { + return $v::knowntargets +} + +proc ::critcl::targetconfig {} { + return $v::targetconfig +} + +proc ::critcl::targetplatform {} { + return $v::targetplatform +} + +proc ::critcl::buildplatform {} { + return $v::buildplatform +} + +proc ::critcl::actualtarget {} { + # Check if the chosen target is a cross-compile target. If yes, + # we return the actual platform identifier of the target. This is + # used to select the proper platform director names in the critcl + # cache, generated packages, when searching for preload libraries, + # etc. Whereas the chosen target provides the proper compile + # configuration which will invoke the proper cross-compiler, etc. + + if {[info exists v::xtargets($v::targetplatform)]} { + return $v::xtargets($v::targetplatform) + } else { + return $v::targetplatform + } +} + +proc ::critcl::sharedlibext {} { + return [getconfigvalue sharedlibext] +} + +proc ::critcl::buildforpackage {{buildforpackage 1}} { + set v::buildforpackage $buildforpackage + return +} + +proc ::critcl::fastuuid {} { + set v::uuidcounter 1 ;# Activates it. + return +} + +proc ::critcl::cbuild {file {load 1}} { + if {[info exists v::code($file,failed)] && !$load} { + set v::buildforpackage 0 + return $v::code($file,failed) + } + + StatusReset + + # Determine if we should place stubs code into the generated file. + set placestubs [expr {!$v::buildforpackage}] + + # Determine the requested mode and reset for next call. + set buildforpackage $v::buildforpackage + set v::buildforpackage 0 + + if {$file eq ""} { + set file [This] + } + + # NOTE: The 4 pieces of data just below has to be copied into the + # result even if the build and link-steps are suppressed. Because + # the load-step must have this information. + + set shlib [DetermineShlibName $file] + set initname [DetermineInitName $file [expr {$buildforpackage ? "ns" : ""}]] + + dict set v::code($file) result tsources [GetParam $file tsources] + dict set v::code($file) result mintcl [MinTclVersion $file] + + set emsg {} + set msgs {} + + if {$v::options(force) || ![file exists $shlib]} { + LogOpen $file + set base [BaseOf $file] + set object [DetermineObjectName $file] + + API_setup $file + + # Generate the main C file + CollectEmbeddedSources $file $base.c $object $initname $placestubs + + # Set the marker for critcl::done and its user, HandleDeclAfterBuild. + dict set v::code($file) result closed mark + + # Compile main file + lappend objects [Compile $file $file $base.c $object] + + # Compile the companion C sources as well, if there are any. + foreach src [GetParam $file csources] { + lappend objects [Compile $file $src $src \ + [CompanionObject $src]] + } + + # NOTE: The data below has to be copied into the result even + # if the link-step is suppressed. Because the application + # (mode 'generate package') must have this information to be + # able to perform the final link. + + lappendlist objects [GetParam $file cobjects] + + dict set v::code($file) result clibraries [set clib [GetParam $file clibraries]] + dict set v::code($file) result libpaths [LibPaths $clib] + dict set v::code($file) result ldflags [GetParam $file ldflags] + dict set v::code($file) result objects $objects + dict set v::code($file) result tk [UsingTk $file] + dict set v::code($file) result preload [GetParam $file preload] + dict set v::code($file) result license [GetParam $file license <>] + dict set v::code($file) result log {} + dict set v::code($file) result meta [GetMeta $file] + + # Link and load steps. + if {$load || !$buildforpackage} { + Link $file + } + + lassign [LogClose] msgs emsg + + dict set v::code($file) result warnings [CheckForWarnings $emsg] + } + + dict set v::code($file) result log $msgs + dict set v::code($file) result exl $emsg + + if {$v::failed} { + if {!$buildforpackage} { + print stderr "$msgs\ncritcl build failed ($file)" + } + } elseif {$load && !$buildforpackage} { + Load $file + } + + # Release the data which was collected for the just-built file, as + # it is not needed any longer. + dict unset v::code($file) config + + return [StatusSave $file] +} + +proc ::critcl::cresults {{file {}}} { + if {$file eq ""} { set file [This] } + return [dict get $v::code($file) result] +} + +proc ::critcl::cnothingtodo {f} { + # No critcl definitions at all ? + if {![info exists v::code($f)]} { return 1 } + + # We have results already, so where had been something to do. + if {[dict exists $v::code($f) result]} { return 0 } + + # No C code collected for compilation ? + if {![dict exists $v::code($f) config fragments]} { return 1 } + + # Ok, something has to be done. + return 0 +} + +proc ::critcl::c++command {tclname class constructors methods} { + # Build the body of the function to define a new tcl command for + # the C++ class + set helpline {} + set classptr ptr_$tclname + set comproc " $class* $classptr;\n" + append comproc " switch (objc) \{\n" + + if {![llength $constructors]} { + set constructors {{}} + } + + foreach adefs $constructors { + array set types {} + set names {} + set cargs {} + set cnames {} + + foreach {t n} $adefs { + set types($n) $t + lappend names $n + lappend cnames _$n + lappend cargs "$t $n" + } + lappend helpline "$tclname pathName [join $names { }]" + set nargs [llength $names] + set ncargs [expr {$nargs + 2}] + append comproc " case $ncargs: \{\n" + + if {!$nargs} { + append comproc " $classptr = new $class\();\n" + } else { + append comproc [ProcessArgs types $names $cnames] + append comproc " $classptr = new $class\([join $cnames {, }]);\n" + } + append comproc " break;\n" + append comproc " \}\n" + + } + append comproc " default: \{\n" + append comproc " Tcl_SetResult(ip, \"wrong # args: should be either [join $helpline { or }]\",TCL_STATIC);\n" + append comproc " return TCL_ERROR;\n" + append comproc " \}\n" + append comproc " \}\n" + + append comproc " if ( $classptr == NULL ) \{\n" + append comproc " Tcl_SetResult(ip, \"Not enough memory to allocate a new $tclname\", TCL_STATIC);\n" + append comproc " return TCL_ERROR;\n" + append comproc " \}\n" + + append comproc " Tcl_CreateObjCommand(ip, Tcl_GetString(objv\[1]), cmdproc_$tclname, (ClientData) $classptr, delproc_$tclname);\n" + append comproc " return TCL_OK;\n" + # + # Build the body of the c function called when the object is deleted + # + set delproc "void delproc_$tclname\(ClientData cd) \{\n" + append delproc " if (cd != NULL)\n" + append delproc " delete ($class*) cd;\n" + append delproc "\}\n" + + # + # Build the body of the function that processes the tcl commands for the class + # + set cmdproc "int cmdproc_$tclname\(ClientData cd, Tcl_Interp* ip, int objc, Tcl_Obj *CONST objv\[]) \{\n" + append cmdproc " int index;\n" + append cmdproc " $class* $classptr = ($class*) cd;\n" + + set rtypes {} + set tnames {} + set mnames {} + set adefs {} + foreach {rt n a} $methods { + lappend rtypes $rt + lappend tnames [lindex $n 0] + set tmp [lindex $n 1] + if {$tmp eq ""} { + lappend mnames [lindex $n 0] + } else { + lappend mnames [lindex $n 1] + } + lappend adefs $a + } + append cmdproc " static const char* cmds\[]=\{\"[join $tnames {","}]\",NULL\};\n" + append cmdproc " if (objc<2) \{\n" + append cmdproc " Tcl_WrongNumArgs(ip, 1, objv, \"expecting pathName option\");\n" + append cmdproc " return TCL_ERROR;\n" + append cmdproc " \}\n\n" + append cmdproc " if (Tcl_GetIndexFromObj(ip, objv\[1], cmds, \"option\", TCL_EXACT, &index) != TCL_OK)\n" + append cmdproc " return TCL_ERROR;\n" + append cmdproc " switch (index) \{\n" + + set ndx 0 + foreach rtype $rtypes tname $tnames mname $mnames adef $adefs { + array set types {} + set names {} + set cargs {} + set cnames {} + + switch -- $rtype { + ok { set rtype2 "int" } + string - + dstring - + vstring { set rtype2 "char*" } + default { set rtype2 $rtype } + } + + foreach {t n} $adef { + set types($n) $t + lappend names $n + lappend cnames _$n + lappend cargs "$t $n" + } + set helpline "$tname [join $names { }]" + set nargs [llength $names] + set ncargs [expr {$nargs + 2}] + + append cmdproc " case $ndx: \{\n" + append cmdproc " if (objc==$ncargs) \{\n" + append cmdproc [ProcessArgs types $names $cnames] + append cmdproc " " + if {$rtype ne "void"} { + append cmdproc "$rtype2 rv = " + } + append cmdproc "$classptr->$mname\([join $cnames {, }]);\n" + append cmdproc " " + switch -- $rtype { + void { } + ok { append cmdproc "return rv;" } + int { append cmdproc "Tcl_SetIntObj(Tcl_GetObjResult(ip), rv);" } + long { append cmdproc " Tcl_SetLongObj(Tcl_GetObjResult(ip), rv);" } + float - + double { append cmdproc "Tcl_SetDoubleObj(Tcl_GetObjResult(ip), rv);" } + char* { append cmdproc "Tcl_SetResult(ip, rv, TCL_STATIC);" } + string - + dstring { append cmdproc "Tcl_SetResult(ip, rv, TCL_DYNAMIC);" } + vstring { append cmdproc "Tcl_SetResult(ip, rv, TCL_VOLATILE);" } + default { append cmdproc "if (rv == NULL) \{ return TCL_ERROR ; \}\n Tcl_SetObjResult(ip, rv); Tcl_DecrRefCount(rv);" } + } + append cmdproc "\n" + append cmdproc " " + if {$rtype ne "ok"} { append cmdproc "return TCL_OK;\n" } + + append cmdproc " \} else \{\n" + append cmdproc " Tcl_WrongNumArgs(ip, 1, objv, \"$helpline\");\n" + append cmdproc " return TCL_ERROR;\n" + append cmdproc " \}\n" + append cmdproc " \}\n" + incr ndx + } + append cmdproc " \}\n\}\n" + + # TODO: line pragma fix ?! + ccode $delproc + ccode $cmdproc + + # Force the new ccommand to be defined in the caller's namespace + # instead of improperly in ::critcl. + namespace eval [uplevel 1 namespace current] \ + [list critcl::ccommand $tclname {dummy ip objc objv} $comproc] + + return +} + +proc ::critcl::ProcessArgs {typesArray names cnames} { + upvar 1 $typesArray types + set body "" + foreach x $names c $cnames { + set t $types($x) + switch -- $t { + int - long - float - double - char* - Tcl_Obj* { + append body " $t $c;\n" + } + default { + append body " void* $c;\n" + } + } + } + set n 1 + foreach x $names c $cnames { + set t $types($x) + incr n + switch -- $t { + int { + append body " if (Tcl_GetIntFromObj(ip, objv\[$n], &$c) != TCL_OK)\n" + append body " return TCL_ERROR;\n" + } + long { + append body " if (Tcl_GetLongFromObj(ip, objv\[$n], &$c) != TCL_OK)\n" + append body " return TCL_ERROR;\n" + } + float { + append body " \{ double tmp;\n" + append body " if (Tcl_GetDoubleFromObj(ip, objv\[$n], &tmp) != TCL_OK)\n" + append body " return TCL_ERROR;\n" + append body " $c = (float) tmp;\n" + append body " \}\n" + } + double { + append body " if (Tcl_GetDoubleFromObj(ip, objv\[$n], &$c) != TCL_OK)\n" + append body " return TCL_ERROR;\n" + } + char* { + append body " $c = Tcl_GetString(objv\[$n]);\n" + } + default { + append body " $c = objv\[$n];\n" + } + } + } + return $body +} + +proc ::critcl::scan {file} { + set lines [split [Cat $file] \n] + + set scan::rkey require + set scan::base [file dirname [file normalize $file]] + set scan::capture { + org {} + version {} + files {} + imported {} + config {} + meta-user {} + meta-system {} + tsources {} + } + + ScanCore $lines { + critcl::api sub + critcl::api/extheader ok + critcl::api/function ok + critcl::api/header warn + critcl::api/import ok + critcl::source warn + critcl::cheaders warn + critcl::csources warn + critcl::license warn + critcl::meta warn + critcl::owns warn + critcl::tcl ok + critcl::tk ok + critcl::tsources warn + critcl::userconfig sub + critcl::userconfig/define ok + critcl::userconfig/query ok + critcl::userconfig/set ok + package warn + } + + set version [dict get $scan::capture version] + print "\tVersion: $version" + + # TODO : Report requirements. + # TODO : tsources - Scan files for dependencies! + + set n [llength [dict get $scan::capture files]] + print -nonewline "\tInput: $file" + if {$n} { + print -nonewline " + $n Companion" + if {$n > 1} { print -nonewline s } + } + print "" + + # Merge the system and user meta data, with system overriding the + # user. See 'GetMeta' for same operation when actually builing the + # package. Plus scan any Tcl companions for more requirements. + + set md {} + lappend md [dict get $scan::capture meta-user] + lappend md [dict get $scan::capture meta-system] + + foreach ts [dict get $scan::capture tsources] { + lappend md [dict get [ScanDependencies $file \ + [file join [file dirname $file] $ts] \ + capture] meta-system] + } + + dict unset scan::capture meta-user + dict unset scan::capture meta-system + dict unset scan::capture tsources + + dict set scan::capture meta \ + [eval [linsert $md 0 dict merge]] + # meta = dict merge {*}$md + + if {[dict exists $scan::capture meta require]} { + foreach r [dict get $scan::capture meta require] { + print "\tRequired: $r" + } + } + + return $scan::capture +} + +proc ::critcl::ScanDependencies {dfile file {mode plain}} { + set lines [split [Cat $file] \n] + + catch { + set saved $scan::capture + } + + set scan::rkey require + set scan::base [file dirname [file normalize $file]] + set scan::capture { + name {} + version {} + meta-system {} + } + + ScanCore $lines { + critcl::buildrequirement warn + package warn + } + + if {$mode eq "capture"} { + set result $scan::capture + set scan::capture $saved + return $result + } + + dict with scan::capture { + if {$mode eq "provide"} { + msg " (provide $name $version)" + + ImetaSet $dfile name $name + ImetaSet $dfile version $version + } + + dict for {k vlist} [dict get $scan::capture meta-system] { + if {$k eq "name"} continue + if {$k eq "version"} continue + + ImetaAdd $dfile $k $vlist + + if {$k ne "require"} continue + # vlist = package list, each element a package name, + # and optional version. + msg " ([file tail $file]: require [join [lsort -dict -unique $vlist] {, }])" + } + + # The above information also goes into the teapot meta data of + # the file in question. This however is defered until the meta + # data is actually pulled for delivery to the tool using the + # package. See 'GetMeta' for where the merging happens. + } + + return +} + +proc ::critcl::ScanCore {lines theconfig} { + # config = dictionary + # - => mode (ok, warn, sub) + # Unlisted commands are ignored. + + variable scan::config $theconfig + + set collect 0 + set buf {} + set lno -1 + foreach line $lines { + #puts |$line| + + incr lno + if {$collect} { + if {![info complete $buf]} { + append buf $line \n + continue + } + set collect 0 + + #puts %%$buf%% + + # Prevent heavily dynamic code from stopping the scan. + # WARN the user. + regexp {^(\S+)} $buf -> cmd + if {[dict exists $config $cmd]} { + set mode [dict get $config $cmd] + + if {[catch { + # Run in the scan namespace, with its special + # command implementations. + namespace eval ::critcl::scan $buf + } msg]} { + if {$mode eq "sub"} { + regexp {^(\S+)\s+(\S+)} $buf -> _ method + append cmd /$method + set mode [dict get $config $cmd] + } + if {$mode eq "warn"} { + msg "Line $lno, $cmd: Failed execution of dynamic command may" + msg "Line $lno, $cmd: cause incorrect TEA results. Please check." + msg "Line $lno, $cmd: $msg" + } + } + } + + set buf "" + # fall through, to handle the line which just got NOT + # added to the buf. + } + + set line [string trimleft $line " \t:"] + if {[string trim $line] eq {}} continue + + regexp {^(\S+)} $line -> cmd + if {[dict exists $config $cmd]} { + append buf $line \n + set collect 1 + } + } +} + +# Handle the extracted commands +namespace eval ::critcl::scan::critcl {} + +proc ::critcl::scan::critcl::buildrequirement {script} { + # Recursive scan of the script, same configuration, except + # switched to record 'package require's under the build::reqire + # key. + + variable ::critcl::scan::config + variable ::critcl::scan::rkey + + set saved $rkey + set rkey build::require + + ::critcl::ScanCore [split $script \n] $config + + set rkey $saved + return +} + +# Meta data. +# Capture specific dependencies +proc ::critcl::scan::critcl::tcl {version} { + variable ::critcl::scan::capture + dict update capture meta-system m { + dict lappend m require [list Tcl $version] + } + return +} + +proc ::critcl::scan::critcl::tk {} { + variable ::critcl::scan::capture + dict update capture meta-system m { + dict lappend m require Tk + } + return +} + +proc ::critcl::scan::critcl::description {text} { + variable ::critcl::scan::capture + dict set capture meta-system description \ + [::critcl::Text2Words $text] + return +} + +proc ::critcl::scan::critcl::summary {text} { + variable ::critcl::scan::capture + dict set capture meta-system summary \ + [::critcl::Text2Words $text] + return +} + +proc ::critcl::scan::critcl::subject {args} { + variable ::critcl::scan::capture + dict update capture meta-system m { + foreach word $args { + dict lappend m subject $word + } + } + return +} + +proc ::critcl::scan::critcl::meta {key args} { + variable ::critcl::scan::capture + dict update capture meta-user m { + foreach word $args { + dict lappend m $key $word + } + } + return +} + +# Capture files +proc ::critcl::scan::critcl::source {path} { + # Recursively scan the imported file. + # Keep the current context. + variable ::critcl::scan::config + + foreach f [Files $path] { + set lines [split [::critcl::Cat $f] \n] + ScanCore $lines $config + } + return +} +proc ::critcl::scan::critcl::owns {args} { eval [linsert $args 0 Files] } +proc ::critcl::scan::critcl::cheaders {args} { eval [linsert $args 0 Files] } +proc ::critcl::scan::critcl::csources {args} { eval [linsert $args 0 Files] } +proc ::critcl::scan::critcl::tsources {args} { + variable ::critcl::scan::capture + foreach ts [eval [linsert $args 0 Files]] { + dict lappend capture tsources $ts + } + return +} + +proc ::critcl::scan::critcl::Files {args} { + variable ::critcl::scan::capture + set res {} + foreach v $args { + if {[string match "-*" $v]} continue + foreach f [Expand $v] { + dict lappend capture files $f + lappend res $f + } + } + return $res +} + +proc ::critcl::scan::critcl::Expand {pattern} { + variable ::critcl::scan::base + + # Note: We cannot use -directory here. The PATTERN may already be + # an absolute path, in which case the join will return the + # unmodified PATTERN to glob on, whereas with -directory the final + # pattern will be BASE/PATTERN which won't find anything, even if + # PATTERN actually exists. + + set prefix [file split $base] + + set files {} + foreach vfile [glob [file join $base $pattern]] { + set xfile [file normalize $vfile] + if {![file exists $xfile]} { + error "$vfile: not found" + } + + # Constrain to be inside of the base directory. + # Snarfed from fileutil::stripPath + + set npath [file split $xfile] + + if {![string match -nocase "${prefix} *" $npath]} { + error "$vfile: Not inside of $base" + } + + set xfile [eval [linsert [lrange $npath [llength $prefix] end] 0 file join ]] + lappend files $xfile + } + return $files +} + +# Capture license (org name) +proc ::critcl::scan::critcl::license {who args} { + variable ::critcl::scan::capture + dict set capture org $who + + ::critcl::print "\tOrganization: $who" + + # Meta data. + set elicense [::critcl::LicenseText $args] + + dict set capture meta-system license \ + [::critcl::Text2Words $elicense] + dict set capture meta-system author \ + [::critcl::Text2Authors $who] + return +} + +# Capture version of the provided package. +proc ::critcl::scan::package {cmd args} { + if {$cmd eq "provide"} { + # Syntax: package provide + + variable capture + lassign $args name version + dict set capture name $name + dict set capture version $version + + # Save as meta data as well. + + dict set capture meta-system name $name + dict set capture meta-system version $version + dict set capture meta-system platform source + dict set capture meta-system generated::by \ + [list \ + [list critcl [::package present critcl]] \ + $::tcl_platform(user)] + dict set capture meta-system generated::date \ + [list [clock format [clock seconds] -format {%Y-%m-%d}]] + return + } elseif {$cmd eq "require"} { + # Syntax: package require ?-exact? + # : package require ... + + # Save dependencies as meta data. + + # Ignore the critcl core + if {[lindex $args 0] eq "critcl"} return + + variable capture + variable rkey + dict update capture meta-system m { + dict lappend m $rkey [::critcl::TeapotRequire $args] + } + return + } + + # ignore anything else. + return +} + +# Capture the APIs imported by the package +proc ::critcl::scan::critcl::api {cmd args} { + variable ::critcl::scan::capture + switch -exact -- $cmd { + header { + eval [linsert $args 0 Files] + } + import { + # Syntax: critcl::api import + lassign $args name _ + dict lappend capture imported $name + print "\tImported: $name" + } + default {} + } + return +} + +# Capture the user config options declared by the package +proc ::critcl::scan::critcl::userconfig {cmd args} { + variable ::critcl::scan::capture + switch -exact -- $cmd { + define { + # Syntax: critcl::userconfig define ?? + lassign $args oname odesc otype odefault + set odesc [string trim $odesc] + if {[llength $args] < 4} { + set odefault [::critcl::UcDefault $otype] + } + dict lappend capture config [list $oname $odesc $otype $odefault] + print "\tUser Config: $oname ([join $otype { }] -> $odefault) $odesc" + } + set - query - + default {} + } + return +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- Internals - cproc conversion helpers. + +proc ::critcl::EmitShimHeader {wname} { + # Function head + set ca "(ClientData cd, Tcl_Interp *interp, int oc, Tcl_Obj *CONST ov\[])" + Emitln + Emitln "static int" + Emitln "$wname$ca" + Emitln \{ + return +} + +proc ::critcl::EmitShimVariables {adb rtype} { + foreach d [dict get $adb vardecls] { + Emitln " $d" + } + if {[dict get $adb hasoptional]} { + Emitln " int idx_;" + Emitln " int argc_;" + } + + # Result variable, source for the C -> Tcl conversion. + if {$rtype ne "void"} { Emit " [ResultCType $rtype] rv;" } + return +} + +proc ::critcl::EmitArgTracing {fun} { + if {!$v::options(trace)} return + Emitln "\n critcl_trace_cmd_args ($fun, oc, ov);" + return +} + +proc ::critcl::EmitWrongArgsCheck {adb} { + # Code checking for the correct count of arguments, and generating + # the proper error if not. + + set wac [dict get $adb wacondition] + if {$wac eq {}} return + + # Have a check, put the pieces together. + + set offset [dict get $adb skip] + set tsig [dict get $adb tsignature] + set min [dict get $adb min] + set max [dict get $adb max] + + incr min $offset + if {$max != Inf} { + incr max $offset + } + + lappend map MIN_ARGS $min + lappend map MAX_ARGS $max + set wac [string map $map $wac] + + Emitln "" + Emitln " if ($wac) \{" + Emitln " Tcl_WrongNumArgs(interp, $offset, ov, $tsig);" + Emitln [TraceReturns "wrong-arg-num check" " return TCL_ERROR;"] + Emitln " \}" + Emitln "" + return +} + +proc ::critcl::EmitSupport {adb} { + set s [dict get $adb support] + if {![llength $s]} return + if {[join $s {}] eq {}} return + Emit [join $s \n]\n + return +} + +proc ::critcl::EmitCall {cname cnames rtype} { + # Invoke the low-level function. + + Emitln " /* Call - - -- --- ----- -------- */" + Emit " " + if {$rtype ne "void"} { Emit "rv = " } + Emitln "${cname}([join $cnames {, }]);" + Emitln + return +} + +proc ::critcl::EmitConst {rtype rvalue} { + # Assign the constant directly to the shim's result variable. + + Emitln " /* Const - - -- --- ----- -------- */" + Emit " " + if {$rtype ne "void"} { Emit "rv = " } + Emitln "${rvalue};" + Emitln + return +} + +proc ::critcl::TraceReturns {label code} { + if {!$v::options(trace)} { + return $code + } + + # Inject tracing into the 'return's. + regsub -all \ + {return[[:space:]]*([^;]*);} $code \ + {return critcl_trace_cmd_result (\1, interp);} newcode + if {[string match {*return *} $code] && ($newcode eq $code)} { + error "Failed to inject tracing code into $label" + } + return $newcode +} + +proc ::critcl::EmitShimFooter {adb rtype} { + # Run release code for arguments which allocated temp memory. + set arelease [dict get $adb arelease] + if {[llength $arelease]} { + Emit "[join $arelease "\n "]\n" + } + + # Convert the returned low-level result from C to Tcl, if required. + # Return a standard status, if required. + + set code [Deline [ResultConversion $rtype]] + if {$code ne {}} { + set code [TraceReturns "\"$rtype\" result" $code] + Emitln " /* ($rtype return) - - -- --- ----- -------- */" + Emitln $code + } else { + if {$v::options(trace)} { + Emitln " critcl_trace_header (1, 0, 0);" + Emitln " critcl_trace_printf (1, \"RETURN (void)\");" + Emitln " critcl_trace_closer (1);" + Emitln " critcl_trace_pop();" + Emitln " return;" + } + } + Emitln \} + return +} + +proc ::critcl::ArgumentSupport {type} { + if {[info exists v::acsup($type)]} { return $v::acsup($type) } + return {} +} + +proc ::critcl::ArgumentRelease {type} { + if {[info exists v::acrel($type)]} { return $v::acrel($type) } + return {} +} + +proc ::critcl::ArgumentCType {type} { + if {[info exists v::actype($type)]} { return $v::actype($type) } + return -code error "Unknown argument type \"$type\"" +} + +proc ::critcl::ArgumentCTypeB {type} { + if {[info exists v::actypeb($type)]} { return $v::actypeb($type) } + return -code error "Unknown argument type \"$type\"" +} + +proc ::critcl::ArgumentConversion {type} { + if {[info exists v::aconv($type)]} { return $v::aconv($type) } + return -code error "Unknown argument type \"$type\"" +} + +proc ::critcl::ResultCType {type} { + if {[info exists v::rctype($type)]} { + return $v::rctype($type) + } + return -code error "Unknown result type \"$type\"" +} + +proc ::critcl::ResultConversion {type} { + if {[info exists v::rconv($type)]} { + return $v::rconv($type) + } + return -code error "Unknown result type \"$type\"" +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- Internals - Manage complex per-file settings. + +proc ::critcl::GetParam {file type {default {}}} { + if {[info exists v::code($file)] && + [dict exists $v::code($file) config $type]} { + return [dict get $v::code($file) config $type] + } else { + return $default + } +} + +proc ::critcl::SetParam {type values {expand 1} {uuid 0} {unique 0}} { + set file [This] + if {![llength $values]} return + + UUID.extend $file .$type $values + + if {$type ne "cobjects"} { + #todo (debug flag): msg "\t$type += $values" + set dtype [string map { + cheaders {headers: } + csources {companions: } + api_hdrs api-headers: + api_ehdrs {api-exthdr: } + clibraries {libraries: } + } $type] + set prefix " ($dtype " + msg "$prefix[join $values ")\n$prefix"])" + } + + # Process the list of flags, treat non-option arguments as glob + # patterns and expand them to a set of files, stored as absolute + # paths. + + set have {} + if {$unique && [dict exists $v::code($file) config $type]} { + foreach v [dict get $v::code($file) config $type] { + dict set have $v . + } + } + + set tmp {} + foreach v $values { + if {[string match "-*" $v]} { + lappend tmp $v + } else { + if {$expand} { + foreach f [Expand $file $v] { + if {$unique && [dict exists $have $f]} continue + lappend tmp $f + if {$unique} { dict set have $f . } + if {$uuid} { UUID.extend $file .$type.$f [Cat $f] } + } + } else { + if {$unique && [dict exists $have $v]} continue + lappend tmp $v + if {$unique} { dict set have $v . } + } + } + } + + # And save into the system state. + dict update v::code($file) config c { + foreach v $tmp { + dict lappend c $type $v + } + } + + return +} + +proc ::critcl::Expand {file pattern} { + set base [file dirname $file] + + # Note: We cannot use -directory here. The PATTERN may already be + # an absolute path, in which case the join will return the + # unmodified PATTERN to glob on, whereas with -directory the final + # pattern will be BASE/PATTERN which won't find anything, even if + # PATTERN actually exists. + + set files {} + foreach vfile [glob [file join $base $pattern]] { + set vfile [file normalize $vfile] + if {![file exists $vfile]} { + error "$vfile: not found" + } + lappend files $vfile + } + return $files +} + +proc ::critcl::InitializeFile {file} { + if {![info exists v::code($file)]} { + set v::code($file) {} + + # Initialize the meta data sections (user (meta) and system + # (package)). + + dict set v::code($file) config meta {} + + dict set v::code($file) config package platform \ + [TeapotPlatform] + dict set v::code($file) config package build::date \ + [list [clock format [clock seconds] -format {%Y-%m-%d}]] + + # May not exist, bracket code. + if {![file exists $file]} return + + ScanDependencies $file $file provide + return + } + + if {![dict exists $v::code($file) config]} { + dict set v::code($file) config {} + } + return +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- Internals - Management of in-memory C source fragment. + +proc ::critcl::name2c {name} { + # Note: A slightly modified copy (different depth in the call-stack) of this + # is inlined into the internal command "BeginCommand". + + # Locate caller, as the data is saved per .tcl file. + set file [This] + + if {![string match ::* $name]} { + # Locate caller's namespace. Two up, skipping the + # ccommand/cproc frame. This is where the new Tcl command will + # be defined in. + + set ns [uplevel 1 namespace current] + if {$ns ne "::"} { append ns :: } + + set name ${ns}$name + } + + # First ensure that any namespace qualifiers found in the name + # itself are shifted over to the namespace information. + + set ns [namespace qualifiers $name] + set name [namespace tail $name] + + # Then ensure that everything is fully qualified, and that the C + # level name doesn't contain bad characters. We have to remove any + # non-alphabetic characters. A serial number is further required + # to distinguish identifiers which would, despite having different + # Tcl names, transform to the same C identifier. + + if {$ns ne "::"} { append ns :: } + set cns [string map {:: _} $ns] + + regsub -all -- {[^a-zA-Z0-9_]} $name _ cname + regsub -all -- {_+} $cname _ cname + + regsub -all -- {[^a-zA-Z0-9_]} $cns _ cns + regsub -all -- {_+} $cns _ cns + + set cname $cname[UUID.serial $file] + + return [list $ns $cns $name $cname] +} + +proc ::critcl::BeginCommand {visibility name args} { + # Locate caller, as the data is saved per .tcl file. + set file [This] + + # Inlined name2c + if {![string match ::* $name]} { + # Locate caller's namespace. Two up, skipping the + # ccommand/cproc frame. This is where the new Tcl command will + # be defined in. + + set ns [uplevel 2 namespace current] + if {$ns ne "::"} { append ns :: } + + set name ${ns}$name + } + + # First ensure that any namespace qualifiers found in the name + # itself are shifted over to the namespace information. + + set ns [namespace qualifiers $name] + set name [namespace tail $name] + + # Then ensure that everything is fully qualified, and that the C + # level identifiers don't contain bad characters. We have to + # remove any non-alphabetic characters. A serial number is further + # required to distinguish identifiers which would, despite having + # different Tcl names, transform to the same C identifier. + + if {$ns ne "::"} { append ns :: } + set cns [string map {:: _} $ns] + + regsub -all -- {[^a-zA-Z0-9_]} $name _ cname + regsub -all -- {_+} $cname _ cname + + regsub -all -- {[^a-zA-Z0-9_]} $cns _ cns + regsub -all -- {_+} $cns _ cns + + set cname $cname[UUID.serial $file] + + # Set the defered build-on-demand used by mode 'comile & run' up. + # Note: Removing the leading :: because it trips Tcl's unknown + # command, i.e. the command will not be found when called in a + # script without leading ::. + set ::auto_index([string trimleft $ns$name :]) [list [namespace current]::cbuild $file] + + set v::curr [UUID.extend $file .function "$ns $name $args"] + + dict update v::code($file) config c { + dict lappend c functions $cns$cname + dict lappend c fragments $v::curr + } + + if {$visibility eq "public"} { + Emitln "#define ns_$cns$cname \"$ns$name\"" + } + return [list $ns $cns $name $cname] +} + +proc ::critcl::EndCommand {} { + set file [This] + + set v::code($v::curr) $v::block + + dict set v::code($file) config block $v::curr $v::block + + unset v::curr + unset v::block + return +} + +proc ::critcl::Emit {s} { + append v::block $s + return +} + +proc ::critcl::Emitln {{s ""}} { + Emit $s\n + return +} + +# # ## ### ##### ######## ############# ##################### +## At internal processing + +proc ::critcl::at::Where {leadoffset level file} { + variable where + + set line 1 + + # If the interpreter running critcl has TIP 280 support use it to + # place more exact line number information into the generated C + # file. + + #puts "XXX-WHERE-($leadoffset $level $file)" + #set ::errorInfo {} + if {[catch { + #::critcl::msg [SHOWFRAMES $level 0] + array set loc [info frame $level] + #puts XXX-TYPE-$loc(type) + }]} { + #puts XXX-NO-DATA-$::errorInfo + set where {} + return + } + + if {$loc(type) eq "source"} { + #parray loc + set file $loc(file) + set fline $loc(line) + + # Adjust for removed leading whitespace. + ::incr fline $leadoffset + + # Keep the limitations of native compilers in mind and stay + # inside their bounds. + + if {$fline > $line} { + set line $fline + } + + set where [list [file tail $file] $line] + return + } + + if {($loc(type) eq "eval") && + [info exists loc(proc)] && + ($loc(proc) eq "::critcl::source") + } { + # A relative location in critcl::source is absolute in the + # sourced file. I.e. we can provide proper line information. + + set fline $loc(line) + # Adjust for removed leading whitespace. + ::incr fline $leadoffset + + # Keep the limitations of native compilers in mind and stay + # inside their bounds. + + if {$fline > $line} { + set line $fline + } + + variable ::critcl::v::source + set where [list [file tail $source] $line] + return + } + + #puts XXX-NO-DATA-$loc(type) + set where {} + return +} + +proc ::critcl::at::CPragma {leadoffset level file} { + # internal variant of 'caller!' + ::incr level -1 + Where $leadoffset $level $file + return [get] +} + +proc ::critcl::at::Format {loc} { + if {![llength $loc]} { + return "" + } + lassign $loc file line + #::critcl::msg "#line $line \"$file\"\n" + return "#line $line \"$file\"\n" +} + +proc ::critcl::at::SHOWFRAMES {level {all 1}} { + set lines {} + set n [info frame] + set i 0 + set id 1 + while {$n} { + lappend lines "[expr {$level == $id ? "**" : " "}] frame [format %3d $id]: [info frame $i]" + ::incr i -1 + ::incr id -1 + ::incr n -1 + if {($level > $id) && !$all} break + } + return [join $lines \n] +} + +# # ## ### ##### ######## ############# ##################### + +proc ::critcl::CollectEmbeddedSources {file destination libfile ininame placestubs} { + set fd [open $destination w] + + if {[dict exists $v::code($file) result apiprefix]} { + set api [dict get $v::code($file) result apiprefix] + } else { + set api "" + } + + # Boilerplate header. + puts $fd [subst [Cat [Template header.c]]] + # ^=> file, libfile, api + + # Make Tk available, if requested + if {[UsingTk $file]} { + puts $fd "\n#include \"tk.h\"" + } + + # Write the collected C fragments, in order of collection. + foreach digest [GetParam $file fragments] { + puts $fd "[Separator]\n" + puts $fd [dict get $v::code($file) config block $digest] + } + + # Boilerplate trailer. + + # Stubs setup, Tcl, and, if requested, Tk as well. + puts $fd [Separator] + set mintcl [MinTclVersion $file] + + if {$placestubs} { + # Put full stubs definitions into the code, which can be + # either the bracket generated for a -pkg, or the package + # itself, build in mode "compile & run". + msg " Stubs:" + set stubs [TclDecls $file] + set platstubs [TclPlatDecls $file] + puts -nonewline $fd [Deline [subst [Cat [Template stubs.c]]]] + # ^=> mintcl, stubs, platstubs + } else { + # Declarations only, for linking, in the sub-packages. + puts -nonewline $fd [Deline [subst [Cat [Template stubs_e.c]]]] + # ^=> mintcl + } + + if {[UsingTk $file]} { + SetupTkStubs $fd $mintcl + } + + # Initialization boilerplate. This ends in the middle of the + # FOO_Init() function, leaving it incomplete. + + set ext [GetParam $file edecls] + puts $fd [subst [Cat [Template pkginit.c]]] + # ^=> ext, ininame + + # From here on we are completing FOO_Init(). + # Tk setup first, if requested. (Tcl is already done). + if {[UsingTk $file]} { + puts $fd [Cat [Template pkginittk.c]] + } + + # User specified initialization code. + puts $fd "[GetParam $file initc] " + + # Setup of the variables serving up defined constants. + if {[dict exists $v::code($file) config const]} { + BuildDefines $fd $file + } + + # Take the names collected earlier and register them as Tcl + # commands. + set names [lsort [GetParam $file functions]] + set max [LengthLongestWord $names] + foreach name $names { + if {[info exists v::clientdata($name)]} { + set cd $v::clientdata($name) + } else { + set cd NULL + } + if {[info exists v::delproc($name)]} { + set dp $v::delproc($name) + } else { + set dp 0 + } + puts $fd " Tcl_CreateObjCommand(interp, [PadRight [expr {$max+4}] ns_$name,] [PadRight [expr {$max+5}] tcl_$name,] $cd, $dp);" + } + + # Complete the trailer and be done. + puts $fd [Cat [Template pkginitend.c]] + close $fd + return +} + +proc ::critcl::MinTclVersion {file} { + set required [GetParam $file mintcl 8.6] + foreach version $v::hdrsavailable { + if {[package vsatisfies $version $required]} { + return $version + } + } + return $required +} + +proc ::critcl::UsingTk {file} { + return [GetParam $file tk 0] +} + +proc ::critcl::TclIncludes {file} { + # Provide access to the Tcl/Tk headers using a -I flag pointing + # into the critcl package directory hierarchy. No copying of files + # required. This also handles the case of the X11 headers on + # windows, for free. + + set hdrs tcl[MinTclVersion $file] + set path [file join $v::hdrdir $hdrs] + + if {[file system $path] ne "native"} { + # The critcl package is wrapped. Copy the relevant headers out + # to disk and change the include path appropriately. + + Copy $path [cache] + set path [file join [cache] $hdrs] + } + + return [list $c::include$path] +} + +proc ::critcl::TclHeader {file {header {}}} { + # Provide access to the Tcl/Tk headers in the critcl package + # directory hierarchy. No copying of files required. + set hdrs tcl[MinTclVersion $file] + return [file join $v::hdrdir $hdrs $header] +} + +proc ::critcl::SystemIncludes {file} { + set includes {} + foreach dir [SystemIncludePaths $file] { + lappend includes $c::include$dir + } + return $includes +} + +proc ::critcl::SystemIncludePaths {file} { + set paths {} + set has {} + + # critcl -I options. + foreach dir $v::options(I) { + if {[dict exists $has $dir]} continue + dict set has $dir yes + lappend paths $dir + } + + # Result cache. + lappend paths [cache] + + # critcl::cheaders + foreach flag [GetParam $file cheaders] { + if {![string match "-*" $flag]} { + # flag = normalized absolute path to a header file. + # Transform into a -I directory reference. + set dir [file dirname $flag] + } else { + # Chop leading -I + set dir [string range $flag 2 end] + } + + if {[dict exists $has $dir]} continue + dict set has $dir yes + lappend paths $dir + } + + return $paths +} + +proc ::critcl::SystemLibraries {} { + set libincludes {} + foreach dir [SystemLibraryPaths] { + lappend libincludes $c::libinclude$dir + } + return $libincludes +} + +proc ::critcl::SystemLibraryPaths {} { + set paths {} + set has {} + + # critcl -L options. + foreach dir $v::options(L) { + if {[dict exists $has $dir]} continue + dict set has $dir yes + lappend paths $dir + } + + return $paths +} + +proc ::critcl::Compile {tclfile origin cfile obj} { + StatusAbort? + + # tclfile = The .tcl file under whose auspices the C is compiled. + # origin = The origin of the C sources, either tclfile, or cfile. + # cfile = The file holding the C sources to compile. + # + # 'origin == cfile' for the companion C files of a critcl file, + # i.e. the csources. For a .tcl critcl file, the 'origin == + # tclfile', and the cfile is the .c derived from tclfile. + # + # obj = Object file to compile to, to generate. + + set cmdline [getconfigvalue compile] + lappendlist cmdline [GetParam $tclfile cflags] + lappendlist cmdline [getconfigvalue threadflags] + if {$v::options(combine) ne "standalone"} { + lappendlist cmdline [getconfigvalue tclstubs] + } + if {$v::options(language) ne "" && [file tail $tclfile] ne "critcl.tcl"} { + # XXX Is this gcc specific ? + # XXX Should this not be configurable via some c::* setting ? + # See also -x none below. + lappend cmdline -x $v::options(language) + } + lappendlist cmdline [TclIncludes $tclfile] + lappendlist cmdline [SystemIncludes $tclfile] + + if {[dict exists $v::code($tclfile) result apidefines]} { + lappendlist cmdline [dict get $v::code($tclfile) result apidefines] + } + + lappendlist cmdline [CompileResult $obj] + lappend cmdline $cfile + + if {$v::options(language) ne ""} { + # Allow the compiler to determine the type of file otherwise + # it will try to compile the libs + # XXX Is this gcc specific ? + # XXX Should this not be configurable via some c::* setting ? + lappend cmdline -x none + } + + # Add the Tk stubs to the command line, if requested and not suppressed + if {[UsingTk $tclfile] && ($v::options(combine) ne "standalone")} { + lappendlist cmdline [getconfigvalue tkstubs] + } + + if {!$option::debug_symbols} { + lappendlist cmdline [getconfigvalue optimize] + lappendlist cmdline [getconfigvalue noassert] + } + + if {[ExecWithLogging $cmdline \ + {$obj: [file size $obj] bytes} \ + {ERROR while compiling code in $origin:}]} { + if {!$v::options(keepsrc) && $cfile ne $origin} { + file delete $cfile + } + } + + return $obj +} + +proc ::critcl::MakePreloadLibrary {file} { + StatusAbort? + + # compile and link the preload support, if necessary, i.e. not yet + # done. + + set shlib [file join [cache] preload[getconfigvalue sharedlibext]] + if {[file exists $shlib]} return + + # Operate like TclIncludes. Use the template file directly, if + # possible, or, if we reside in a virtual filesystem, copy it to + # disk. + + set src [Template preload.c] + if {[file system $src] ne "native"} { + file mkdir [cache] + file copy -force $src [cache] + set src [file join [cache] preload.c] + } + + # Build the object for the helper package, 'preload' ... + + set obj [file join [cache] preload.o] + Compile $file $src $src $obj + + # ... and link it. + # Custom linker command. XXX Can we bent Link to the task? + set cmdline [getconfigvalue link] + lappend cmdline $obj + lappendlist cmdline [getconfigvalue strip] + lappendlist cmdline [LinkResult $shlib] + + ExecWithLogging $cmdline \ + {$shlib: [file size $shlib] bytes} \ + {ERROR while linking $shlib:} + + # Now the critcl application can pick up this helper shlib and + # stuff it into the package it is making. + return +} + +proc ::critcl::Link {file} { + StatusAbort? + + set shlib [dict get $v::code($file) result shlib] + set preload [dict get $v::code($file) result preload] + + # Assemble the link command. + set cmdline [getconfigvalue link] + + if {[llength $preload]} { + lappendlist cmdline [getconfigvalue link_preload] + } + + if {$option::debug_symbols} { + lappendlist cmdline [getconfigvalue link_debug] + } else { + lappendlist cmdline [getconfigvalue strip] + lappendlist cmdline [getconfigvalue link_release] + } + + lappendlist cmdline [LinkResult $shlib] + lappendlist cmdline [GetObjects $file] + lappendlist cmdline [SystemLibraries] + lappendlist cmdline [GetLibraries $file] + lappendlist cmdline [dict get $v::code($file) result ldflags] + # lappend cmdline bufferoverflowU.lib ;# msvc >=1400 && <1500 for amd64 + + # Extend library search paths with user-specified locations. + # (-L, clibraries) + set libpaths [dict get $v::code($file) result libpaths] + if {[llength $libpaths]} { + set opt [getconfigvalue link_rpath] + if {$opt ne {}} { + foreach path $libpaths { + # todo (debug flag) msg "\trpath += $path" + lappend cmdline [string map [list @ $path] $opt] + } + } + } + + # Run the linker + ExecWithLogging $cmdline \ + {$shlib: [file size $shlib] bytes} \ + {ERROR while linking $shlib:} + + # Now, if there is a manifest file around, and the + # 'embed_manifest' command defined we use its command to merge the + # manifest into the shared library. This is pretty much only + # happening on Windows platforms, and with newer dev environments + # actually using manifests. + + set em [getconfigvalue embed_manifest] + + critcl::Log "Manifest Command: $em" + critcl::Log "Manifest File: [expr {[file exists $shlib.manifest] + ? "$shlib.manifest" + : "<>, ignored"}]" + + if {[llength $em] && [file exists $shlib.manifest]} { + set cmdline [ManifestCommand $em $shlib] + + # Run the manifest tool + ExecWithLogging $cmdline \ + {$shlib: [file size $shlib] bytes, with manifest} \ + {ERROR while embedding the manifest into $shlib:} + } + + # At last, build the preload support library, if necessary. + if {[llength $preload]} { + MakePreloadLibrary $file + } + return +} + +proc ::critcl::ManifestCommand {em shlib} { + # Variable used by the subst'able config setting. + set outfile $shlib + return [subst $em] +} + +proc ::critcl::CompanionObject {src} { + set tail [file tail $src] + set srcbase [file rootname $tail] + + if {[cache] ne [file dirname $src]} { + set srcbase [file tail [file dirname $src]]_$srcbase + } + + return [file join [cache] ${srcbase}[getconfigvalue object]] +} + +proc ::critcl::CompileResult {object} { + # Variable used by the subst'able config setting. + set outfile $object + return [subst $c::output] +} + +proc ::critcl::LinkResult {shlib} { + # Variable used by the subst'able config setting. + set outfile $shlib + + set ldout [subst $c::ldoutput] + if {$ldout eq ""} { + set ldout [subst $c::output] + } + + return $ldout +} + +proc ::critcl::GetObjects {file} { + # On windows using the native MSVC compiler put the companion + # object files into a link file to read, instead of separately on + # the command line. + + set objects [dict get $v::code($file) result objects] + + if {![string match "win32-*-cl" $v::buildplatform]} { + return $objects + } + + set rsp [WriteCache link.fil \"[join $objects \"\n\"]\"] + return [list @$rsp] +} + +proc ::critcl::GetLibraries {file} { + # On windows using the native MSVC compiler, transform all -lFOO + # references into FOO.lib. + + return [FixLibraries [dict get $v::code($file) result clibraries]] +} + +proc ::critcl::FixLibraries {libraries} { + if {[string match "win32-*-cl" $v::buildplatform]} { + # On windows using the native MSVC compiler, transform all + # -lFOO references into FOO.lib. + + regsub -all -- {-l(\S+)} $libraries {\1.lib} libraries + } else { + # On unix we look for '-l:' references and rewrite them to the + # full path of the library, doing the search on our own. + # + # GNU ld understands this since at least 2.22 (don't know if + # earlier, 2.15 definitely doesn't), and it helps in + # specifying static libraries (Regular -l prefers .so over .a, + # and -l: overrides that). + + # Search paths specified via -L, -libdir. + set lpath [SystemLibraryPaths] + + set tmp {} + foreach word $libraries { + # Extend search path with -L options from clibraries. + if {[string match -L* $word]} { + lappend lpath [string range $word 2 end] + lappend tmp $word + continue + } + if {![string match -l:* $word]} { + lappend tmp $word + continue + } + # Search named library. + lappend tmp [ResolveColonSpec $lpath [string range $word 3 end]] + } + set libraries $tmp + } + + return $libraries +} + +proc ::critcl::ResolveColonSpec {lpath name} { + foreach path $lpath { + set f [file join $lpath $name] + if {![file exists $f]} continue + return $f + } + return -l:$name +} + +proc ::critcl::SetupTkStubs {fd mintcl} { + if {[package vcompare $mintcl 8.6] != 0} { + # Not 8.6. tkStubsPtr and tkIntXlibStubsPtr are not const yet. + set contents [Cat [Template tkstubs_noconst.c]] + } else { + set contents [Cat [Template tkstubs.c]] + } + + puts -nonewline $fd $contents + return +} + +proc ::critcl::BuildDefines {fd file} { + # we process the cdefines in three steps + # - get the list of defines by preprocessing the source using the + # cpp -dM directive which causes any #defines to be output + # - extract the list of enums using regular expressions (not perfect, + # but will do for now) + # - generate Tcl_ObjSetVar2 commands to initialise Tcl variables + + # Pull the collected ccode blocks together into a transient file + # we then search in. + + set def [WriteCache define_[pid].c {}] + foreach digest [dict get $v::code($file) config defs] { + Append $def [dict get $v::code($file) config block $digest] + } + + # For the command lines to be constructed we need all the include + # information the regular files will get during their compilation. + + set hdrs [SystemIncludes $file] + + # The result of the next two steps, a list of triples (namespace + + # label + value) of the defines to export. + + set defines {} + + # First step - get list of matching defines + set cmd [getconfigvalue preproc_define] + lappendlist cmd $hdrs + lappend cmd $def + + set pipe [open "| $cmd" r] + while {[gets $pipe line] >= 0} { + # Check if the line contains a define. + set fields [split [string trim $line]] + if {[lindex $fields 0] ne "#define"} continue + + # Yes. Get name and value. The latter is the joining of all + # fields after the name, except for any enclosing parentheses, + # which we strip off. + + set var [lindex $fields 1] + set val [string trim [join [lrange $fields 2 end]] {()}] + + # We ignore however any and all defines the user is not + # interested in making public. This is, in essence, a set + # intersection on the names of the defines. + + if {![TakeDefine $file $var namespace]} continue + + # And for those which are kept we integrate the information + # from both sources, i.e. namespace, and definition, under a + # single name. + + lappend defines $namespace $var $val + } + close $pipe + + # Second step - get list of enums + + set cmd [getconfigvalue preproc_enum] + lappendlist cmd $hdrs + lappend cmd $def + + set pipe [open "| $cmd" r] + set code [read $pipe] + close $pipe + + set matches [regexp -all -inline {enum [^\{\(\)]*{([^\}]*)}} $code] + foreach {match submatch} $matches { + foreach line [split $submatch \n] { + foreach sub [split $line ,] { + set enum [lindex [split [string trim $sub]] 0] + + # We ignore however any and all enum values the user + # is not interested in making public. This is, in + # essence, a set intersection on the names of the + # enum values. + + if {![TakeDefine $file $enum namespace]} continue + + # And for those which are kept we integrate the + # information from both sources, i.e. namespace, and + # definition, under a single name. + + lappend defines $namespace $enum $enum + } + } + } + + # Third step - generate Tcl_ObjSetVar2 commands exporting the + # defines and their values as Tcl variables. + + foreach {namespace constname constvalue} $defines { + if {![info exists created($namespace)]} { + # we need to force the creation of the namespace + # because this code will be run before the user code + puts $fd " Tcl_Eval(ip, \"namespace eval $namespace {}\");" + set created($namespace) 1 + } + set var "Tcl_NewStringObj(\"${namespace}::$constname\", -1)" + if {$constname eq $constvalue} { + # enum - assume integer + set constvalue "Tcl_NewIntObj($constvalue)" + } else { + # text or int - force to string + set constvalue "Tcl_NewStringObj(\"$constvalue\", -1)" + } + puts $fd " Tcl_ObjSetVar2(ip, $var, NULL, $constvalue, TCL_GLOBAL_ONLY);" + } + + # Cleanup after ourselves, removing the helper file. + + if {!$v::options(keepsrc)} { file delete $def } + return +} + +proc ::critcl::TakeDefine {file identifier nsvar} { + upvar 1 $nsvar dst + if 0 {if {[dict exists $v::code($file) config const $identifier]} { + set dst [dict get $v::code($file) config const $identifier] + return 1 + }} + foreach {pattern def} [dict get $v::code($file) config const] { + if {[string match $pattern $identifier]} { + set dst $def + return 1 + } + } + return 0 +} + +proc ::critcl::Load {f} { + set shlib [dict get $v::code($f) result shlib] + set init [dict get $v::code($f) result initname] + set tsrc [dict get $v::code($f) result tsources] + set minv [dict get $v::code($f) result mintcl] + + # Using the renamed builtin. While this is a dependency it was + # recorded already. See 'critcl::tcl', and 'critcl::tk'. + #package require Tcl $minv + ::load $shlib $init + + # See the critcl application for equivalent code placing the + # companion tcl sources into the generated package. Here, for + # 'compile & run' we now source the companion files directly. + foreach t $tsrc { + Ignore $t + ::source $t + } + return +} + +proc ::critcl::ResolveRelative {prefixes flags} { + set new {} + set take no + foreach flag $flags { + if {$take} { + set take no + set flag [file normalize [file join [file dirname [This]] $flag]] + lappend new $flag + continue + } + foreach prefix $prefixes { + if {$flag eq $prefix} { + set take yes + lappend new $flag + break + } + set n [string length $prefix] + if {[string match ${prefix}* $flag]} { + set path [string range $flag $n end] + set flag ${prefix}[file normalize [file join [file dirname [This]] $path]] + break + } + if {[string match ${prefix}=* $flag]} { + incr n + set path [string range $flag $n end] + set flag ${prefix}[file normalize [file join [file dirname [This]] $path]] + break + } + } + lappend new $flag + } + return $new +} + +proc ::critcl::LibPaths {clibraries} { + set lpath {} + set take no + + set sa [string length -L] + set sb [string length --library-directory=] + + foreach word $clibraries { + # Get paths from -L..., --library-directory ..., + # --library-directory=... and full library paths. Ignore + # anything else. + + if {$take} { + # path argument separate from preceding option. + set take no + lappend lpath $word + continue + } + if {[string match -L* $word]} { + # path at tail of argument + lappend lpath [string range $word $sa end] + continue + } + if {[string match -l* $word]} { + # ignore + continue + } + if {[string match --library-directory=* $word]} { + # path at tail of argument + lappend lpath [string range $word $sb end] + continue + } + if {[string equal --library-directory $word]} { + # Next argument is the desired path + set take yes + continue + } + if {[file isfile $word]} { + # directory of the file + lappend lpath [file dirname $word] + } + # else ignore + } + return $lpath +} + +proc ::critcl::HandleDeclAfterBuild {} { + # Hook default, mode "compile & run". Clear existing build results + # for the file, make way for new declarations. + + set fx [This] + if {[info exists v::code($fx)] && + [dict exists $v::code($fx) result]} { + dict unset v::code($fx) result + } + return +} + +# XXX Refactor to avoid duplication of the memoization code. +proc ::critcl::DetermineShlibName {file} { + # Return cached information, if present. + if {[info exists v::code($file)] && + [dict exists $v::code($file) result shlib]} { + return [dict get $v::code($file) result shlib] + } + + # The name of the shared library we hope to produce (or use) + set shlib [BaseOf $file][getconfigvalue sharedlibext] + + dict set v::code($file) result shlib $shlib + return $shlib +} + +proc ::critcl::DetermineObjectName {file} { + # Return cached information, if present. + if {[info exists v::code($file)] && + [dict exists $v::code($file) result object]} { + return [dict get $v::code($file) result object] + } + + set object [BaseOf $file] + + # The generated object file will be saved for permanent use if the + # outdir option is set (in which case rebuilds will no longer be + # automatic). + if {$v::options(outdir) ne ""} { + set odir [file join [file dirname $file] $v::options(outdir)] + set oroot [file rootname [file tail $file]] + set object [file normalize [file join $odir $oroot]] + file mkdir $odir + } + + # Modify the output file name if debugging symbols are requested. + if {$option::debug_symbols} { + append object _g + } + + # Choose a distinct suffix so switching between them causes a + # rebuild. + switch -- $v::options(combine) { + "" - + dynamic { append object _pic[getconfigvalue object] } + static { append object _stub[getconfigvalue object] } + standalone { append object [getconfigvalue object] } + } + + dict set v::code($file) result object $object + return $object +} + +proc ::critcl::DetermineInitName {file prefix} { + set ininame [PkgInit $file] + + # Add in the build prefix, if specified. This is done in mode + # 'generate package', for the pieces, ensuring that the overall + # initialization function cannot be in conflict with the + # initialization functions of these same pieces. + + if {$prefix ne ""} { + set ininame "${prefix}_$ininame" + } + + dict set v::code($file) result initname $ininame + + catch { + dict set v::code($file) result pkgname \ + [dict get $v::code($file) config package name] + } + + return $ininame +} + +proc ::critcl::PkgInit {file} { + # The init function name takes a capitalized prefix from the name + # of the input file name (alphanumeric prefix, including + # underscores). This implicitly drops the file extension, as the + # '.' is not an allowed character. + + # While related to the package name, it can be different, + # especially if the package name contains :: separators. + + if {$file eq {}} { + return Stdin + } else { + set ininame [file rootname [file tail $file]] + regsub -all {[^[:alnum:]_]} $ininame {} ininame + return [string totitle $ininame] + } +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- Internals - Access to the log file + +proc ::critcl::LogFile {} { + file mkdir [cache] + return [file join [cache] [pid].log] +} + +proc ::critcl::LogFileExec {} { + file mkdir [cache] + return [file join [cache] [pid]_exec.log] +} + +proc ::critcl::LogOpen {file} { + set v::logfile [LogFile] + set v::log [open $v::logfile w] + puts $v::log "\n[clock format [clock seconds]] - $file" + # Create secondary file as well, leave empty, may not be used. + close [open ${v::logfile}_ w] + return +} + +proc ::critcl::LogCmdline {cmdline} { + set w [join [lassign $cmdline cmd] \n\t] + Log \n$cmd\n\t$w\n + return +} + +proc ::critcl::Log {msg} { + puts $v::log $msg + return +} + +proc ::critcl::Log* {msg} { + puts -nonewline $v::log $msg + return +} + +proc ::critcl::LogClose {} { + # Transfer the log messages for the current file over into the + # global critcl log, and cleanup. + + close $v::log + set msgs [Cat $v::logfile] + set emsg [Cat ${v::logfile}_] + + AppendCache $v::prefix.log $msgs + + file delete -force $v::logfile ${v::logfile}_ + unset v::log v::logfile + + return [list $msgs $emsg] +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- Internals - UUID management, change detection + +proc ::critcl::UUID.extend {file key value} { + set digest [md5_hex /$value] + InitializeFile $file + dict update v::code($file) config c { + dict lappend c uuid $key $digest + } + return $digest +} + +proc ::critcl::UUID.serial {file} { + InitializeFile $file + if {[catch { + set len [llength [dict get $v::code($file) config uuid]] + }]} { + set len 0 + } + return $len +} + +proc ::critcl::UUID {f} { + return [md5_hex "$f [GetParam $f uuid]"] +} + +proc ::critcl::BaseOf {f} { + # Return cached information, if present. + if {[info exists v::code($f)] && + [dict exists $v::code($f) result base]} { + return [dict get $v::code($f) result base] + } + + set base [file normalize \ + [file join [cache] ${v::prefix}_[UUID $f]]] + + dict set v::code($f) result base $base + return $base +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- Internals - Miscellanea + +proc ::critcl::Deline {text} { + if {![config lines]} { + set text [join [GrepV "\#line*" [split $text \n]] \n] + } + return $text +} + +proc ::critcl::Separator {} { + return "/* [string repeat - 70] */" +} + +proc ::critcl::Template {file} { + variable v::hdrdir + return [file join $hdrdir $file] +} + +proc ::critcl::Copy {src dst} { + foreach p [glob -nocomplain $src] { + if {[file isdirectory $p]} { + set stem [file tail $p] + file mkdir $dst/$stem + Copy $p/* $dst/$stem + } else { + file copy -force $p $dst + } + } +} + +proc ::critcl::Cat {path} { + # Easier to write our own copy than requiring fileutil and then + # using fileutil::cat. + + set fd [open $path r] + set data [read $fd] + close $fd + return $data +} + +proc ::critcl::WriteCache {name content} { + set dst [file join [cache] $name] + file mkdir [file dirname $dst] ;# just in case + return [Write [file normalize $dst] $content] +} + +proc ::critcl::Write {path content} { + set chan [open $path w] + puts $chan $content + close $chan + return $path +} + +proc ::critcl::AppendCache {name content} { + file mkdir [cache] ;# just in case + return [Append [file normalize [file join [cache] $name]] $content] +} + +proc ::critcl::Append {path content} { + set chan [open $path a] + puts $chan $content + close $chan + return $path +} + +# # ## ### ##### ######## ############# ##################### +## Implementation -- Internals - Status Operations, and execution +## of external commands. + +proc ::critcl::StatusReset {} { + set v::failed 0 + return +} + +proc ::critcl::StatusAbort? {} { + if {$v::failed} { return -code return } + return +} + +proc ::critcl::StatusSave {file} { + # XXX FUTURE Use '$(file) result failed' later + set result $v::failed + set v::code($file,failed) $v::failed + set v::failed 0 + return $result +} + +proc ::critcl::CheckForWarnings {text} { + set warnings [dict create] + foreach line [split $text \n] { + # Ignore everything not a warning. + if {![string match -nocase *warning* $line]} continue + # Ignore duplicates (which is why we store the lines as dict + # keys for now). + if {[dict exists $warnings $line]} continue + dict set warnings $line . + } + return [dict keys $warnings] +} + +proc ::critcl::Exec {cmdline} { + variable run + + set v::failed [catch { + interp eval $run [linsert $cmdline 0 exec] + } v::err] + + return [expr {!$v::failed}] +} + +proc ::critcl::ExecWithLogging {cmdline okmsg errmsg} { + variable run + + # todo (debug flag) msg "EXEC: $cmdline" + LogCmdline $cmdline + + # Extend the command, redirect all of its output (stdout and + # stderr) into a temp log. + set elogfile [LogFileExec] + set elog [open $elogfile w] + + lappend cmdline >&@ $elog + interp transfer {} $elog $run + + set ok [Exec $cmdline] + + interp transfer $run $elog {} + close $elog + + # Put the command output into the main log ... + set msgs [Cat $elogfile] + Log $msgs + + # ... as well as into a separate execution log. + Append ${v::logfile}_ $msgs + + file delete -force $elogfile + + if {$ok} { + Log [uplevel 1 [list subst $okmsg]] + } else { + Log [uplevel 1 [list subst $errmsg]] + Log $v::err + } + + return $ok +} + +proc ::critcl::BuildPlatform {} { + set platform [::platform::generic] + + # Behave like an autoconf generated configure + # - $CC (user's choice first) + # - gcc, if available. + # - cc/cl otherwise (without further check for availability) + + if {[info exists ::env(CC)]} { + # The compiler may be a gcc, despite being named .../cc. + + set cc $::env(CC) + if {[IsGCC $cc]} { + set cc gcc + } + } elseif {[llength [auto_execok gcc]]} { + set cc gcc + } else { + if {[string match "win32-*" $platform]} { + set cc cl + } else { + set cc cc + } + } + + # The cc may be specified with a full path, through the CC + # environment variable, which cannot be used as is in the platform + # code. Use only the last element of the path, without extensions + # (.exe). And it may be followed by options too, so look for and + # strip these off as well. This last part assumes that the path of + # the compiler itself doesn't contain spaces. + + regsub {( .*)$} [file tail $cc] {} cc + append platform -[file rootname $cc] + + # Memoize + proc ::critcl::BuildPlatform {} [list return $platform] + return $platform +} + +proc ::critcl::IsGCC {path} { + if {[catch { + set lines [exec $path -v |& grep gcc] + }] || ($lines eq {})} { return 0 } + return 1 +} + +proc ::critcl::This {} { + variable v::this + # For management of v::this see critcl::{source,collect*} + # If present, an output redirection is active. + if {[info exists this] && [llength $this]} { + return [lindex $this end] + } + return [file normalize [info script]] +} + +proc ::critcl::Here {} { + return [file dirname [This]] +} + +proc ::critcl::TclDecls {file} { + return [TclDef $file tclDecls.h tclStubsPtr {tclStubsPtr }] +} + +proc ::critcl::TclPlatDecls {file} { + return [TclDef $file tclPlatDecls.h tclPlatStubsPtr tclPlatStubsPtr] +} + +proc ::critcl::TclDef {file hdr var varlabel} { + #puts F|$file + set hdr [TclHeader $file $hdr] + + if {![file exists $hdr]} { error "Header file not found: $hdr" } + if {![file isfile $hdr]} { error "Header not a file: $hdr" } + if {![file readable $hdr]} { error "Header not readable: $hdr (no permission)" } + + #puts H|$hdr + if {[catch { + set hdrcontent [split [Cat $hdr] \n] + } msg]} { + error "Header not readable: $hdr ($msg)" + } + + # Note, Danger: The code below is able to use declarations which + # are commented out in various ways (#if 0, /* ... */, and // + # ...), because it is performing a simple line-oriented search + # without context, and not matching against comment syntax either. + + set ext [Grep *extern* $hdrcontent] + if {![llength $ext]} { + error "No extern declarations found in $hdr" + } + + set vardecl [Grep *${var}* $ext] + if {![llength $vardecl]} { + error "No declarations for $var found in $hdr" + } + + set def [string map {extern {}} [lindex $vardecl 0]] + msg " [join [lrange [file split $hdr] end-3 end] /]:" + msg " ($varlabel => $def)" + return $def +} + +proc ::critcl::Grep {pattern lines} { + set r {} + foreach line $lines { + if {![string match $pattern $line]} continue + lappend r $line + } + return $r +} + +proc ::critcl::GrepV {pattern lines} { + set r {} + foreach line $lines { + if {[string match $pattern $line]} continue + lappend r $line + } + return $r +} + +proc ::critcl::PadRight {len w} { + # <=> Left justified + format %-${len}s $w +} + +proc ::critcl::LengthLongestWord {words} { + set max 0 + foreach w $words { + set n [string length $w] + if {$n <= $max} continue + set max $n + } + return $max +} + +# # ## ### ##### ######## ############# ##################### +## Initialization + +proc ::critcl::Initialize {} { + variable mydir [Here] ; # Path of the critcl package directory. + + variable run [interp create] + variable v::buildplatform [BuildPlatform] + variable v::hdrdir [file join $mydir critcl_c] + variable v::hdrsavailable + variable v::storageclass [Cat [file join $hdrdir storageclass.c]] + + # Scan the directory holding the C fragments and our copies of the + # Tcl header and determine for which versions of Tcl we actually + # have headers. This allows distributions to modify the directory, + # i.e. drop our copies and refer to the system headers instead, as + # much as are installed, and critcl adapts. The tcl versions are + # recorded in ascending order, making upcoming searches easier, + # the first satisfying version is also always the smallest. + + foreach d [lsort -dict [glob -types {d r} -directory $hdrdir -tails tcl*]] { + lappend hdrsavailable [regsub {^tcl} $d {}] + } + + # The prefix is based on the package's version. This allows + # multiple versions of the package to use the same cache without + # interfering with each. Note that we cannot use 'pid' and similar + # information, because this would circumvent the goal of the + # cache, the reuse of binaries whose sources did not change. + + variable v::prefix "v[package require critcl]" + + regsub -all {\.} $prefix {} prefix + + # keep config options in a namespace + foreach var $v::configvars { + set c::$var {} + } + + # read default configuration. This also chooses and sets the + # target platform. + readconfig [file join $mydir Config] + + # Declare the standard argument types for cproc. + + argtype int { + if (Tcl_GetIntFromObj(interp, @@, &@A) != TCL_OK) return TCL_ERROR; + } + argtype boolean { + if (Tcl_GetBooleanFromObj(interp, @@, &@A) != TCL_OK) return TCL_ERROR; + } int int + argtype bool = boolean + + argtype long { + if (Tcl_GetLongFromObj(interp, @@, &@A) != TCL_OK) return TCL_ERROR; + } + + argtype wideint { + if (Tcl_GetWideIntFromObj(interp, @@, &@A) != TCL_OK) return TCL_ERROR; + } Tcl_WideInt Tcl_WideInt + + argtype double { + if (Tcl_GetDoubleFromObj(interp, @@, &@A) != TCL_OK) return TCL_ERROR; + } + argtype float { + double t; + if (Tcl_GetDoubleFromObj(interp, @@, &t) != TCL_OK) return TCL_ERROR; + @A = (float) t; + } + + # Premade scalar type derivations for common range restrictions. + # Look to marker XXXA for the places where auto-creation would + # need fitting in (future). + # + # See also `MakeScalarLimited`, which is able to generate validators for extended forms of this + # kind (multiple relations, arbitrary limit values, ...) + foreach type { + int long wideint double float + } { + set ctype [ArgumentCType $type] + set code [ArgumentConversion $type] + foreach restriction { + {> 0} {>= 0} {> 1} {>= 1} + {< 0} {<= 0} {< 1} {<= 1} + } { + set ntype "$type $restriction" + set head "expected $ntype, but got \\\"" + set tail "\\\"" + set msg "\"$head\", Tcl_GetString (@@), \"$tail\"" + set new $code + append new \ + "\n\t/* Range check, assert (x $restriction) */" \ + "\n\tif (!(@A $restriction)) \{" \ + "\n\t Tcl_AppendResult (interp, $msg, NULL);" \ + "\n\t return TCL_ERROR;" \ + "\n\t\}" + + argtype $ntype $new $ctype $ctype + } + } + + argtype char* { + @A = Tcl_GetString(@@); + } {const char*} {const char*} + + argtype pstring { + @A.s = Tcl_GetStringFromObj(@@, &(@A.len)); + @A.o = @@; + } critcl_pstring critcl_pstring + + argtypesupport pstring { + typedef struct critcl_pstring { + Tcl_Obj* o; + const char* s; + int len; + } critcl_pstring; + } + + argtype list { + if (Tcl_ListObjGetElements (interp, @@, &(@A.c), (Tcl_Obj***) &(@A.v)) != TCL_OK) return TCL_ERROR; + @A.o = @@; + } critcl_list critcl_list + + argtypesupport list { + typedef struct critcl_list { + Tcl_Obj* o; + Tcl_Obj* const* v; + int c; + } critcl_list; + } + + # See also `MakeList` which is able to generate arbitrary length-limited lists, lists over a + # base type, or a combination of both. This here defines the base case of the recognized syntax + # for "unlimited-length list with no base type". This shortcuts the operation of `MakeList`, no + # special types and code needed. + argtype {[]} = list + argtype {[*]} = list + + argtype Tcl_Obj* { + @A = @@; + } + argtype object = Tcl_Obj* + + # Predefined variadic type for the special Tcl_Obj*. + # - No actual conversion, nor allocation, copying, release needed. + # - Just point into and reuse the incoming ov[] array. + # This shortcuts the operation of 'MakeVariadicTypeFor'. + + argtype variadic_object { + @A.c = @C; + @A.v = &ov[@I]; + } critcl_variadic_object critcl_variadic_object + + argtypesupport variadic_object { + typedef struct critcl_variadic_object { + int c; + Tcl_Obj* const* v; + } critcl_variadic_object; + } + + argtype variadic_Tcl_Obj* = variadic_object + + ## The next set of argument types looks to be very broken. We are keeping + ## them for now, but declare them as DEPRECATED. Their documentation was + ## removed with version 3.2. Their implementation will be in 3.3 as well, + ## fully exterminating them. + + argtype int* { + /* Raw pointer in binary Tcl value */ + @A = (int*) Tcl_GetByteArrayFromObj(@@, NULL); + Tcl_InvalidateStringRep(@@); + } + argtype float* { + /* Raw pointer in binary Tcl value */ + @A = (float*) Tcl_GetByteArrayFromObj(@@, NULL); + } + argtype double* { + /* Raw pointer in binary Tcl value */ + @A = (double*) Tcl_GetByteArrayFromObj(@@, NULL); + } + + # OLD Raw binary string. Length information is _NOT_ propagated. Declaring + # it and its aliases as DEPRECATED. Their documentation was removed in + # version 3.2. Their implementation will be in 3.3 as well, fully + # exterminating them. + argtype bytearray { + /* Raw binary string. Length information is _NOT_ propagated */ + @A = (char*) Tcl_GetByteArrayFromObj(@@, NULL); + } char* char* + argtype rawchar = bytearray + argtype rawchar* = bytearray + + # NEW Raw binary string _with_ length information. + + argtype bytes { + /* Raw binary string _with_ length information */ + @A.s = Tcl_GetByteArrayFromObj(@@, &(@A.len)); + @A.o = @@; + } critcl_bytes critcl_bytes + + argtypesupport bytes { + typedef struct critcl_bytes { + Tcl_Obj* o; + const unsigned char* s; + int len; + } critcl_bytes; + } + + argtype channel { + int mode; + @A = Tcl_GetChannel(interp, Tcl_GetString (@@), &mode); + if (@A == NULL) return TCL_ERROR; + } Tcl_Channel Tcl_Channel + + argtype unshared-channel { + int mode; + @A = Tcl_GetChannel(interp, Tcl_GetString (@@), &mode); + if (@A == NULL) return TCL_ERROR; + if (Tcl_IsChannelShared (@A)) { + Tcl_SetObjResult(interp, Tcl_NewStringObj("channel is shared", -1)); + return TCL_ERROR; + } + } Tcl_Channel Tcl_Channel + + # Note, the complementary resulttype is `return-channel`. + argtype take-channel { + int mode; + @A = Tcl_GetChannel(interp, Tcl_GetString (@@), &mode); + if (@A == NULL) return TCL_ERROR; + if (Tcl_IsChannelShared (@A)) { + Tcl_SetObjResult(interp, Tcl_NewStringObj("channel is shared", -1)); + return TCL_ERROR; + } + { + /* Disable event processing for the channel, both by + * removing any registered handler, and forcing interest + * to none. This also disables the processing of pending + * events which are ready to fire for the given + * channel. If we do not do this, events will hit the + * detached channel and potentially wreck havoc on our + * memory and eventually badly hurt us... + */ + Tcl_DriverWatchProc *watchProc; + Tcl_ClearChannelHandlers(@A); + watchProc = Tcl_ChannelWatchProc(Tcl_GetChannelType(@A)); + if (watchProc) { + (*watchProc)(Tcl_GetChannelInstanceData(@A), 0); + } + /* Next some fiddling with the reference count to prevent + * the unregistration from killing it. We basically record + * it as globally known before removing it from the + * current interpreter + */ + Tcl_RegisterChannel((Tcl_Interp *) NULL, @A); + Tcl_UnregisterChannel(interp, @A); + } + } Tcl_Channel Tcl_Channel + + resulttype void { + return TCL_OK; + } + + resulttype ok { + return rv; + } int + + resulttype int { + Tcl_SetObjResult(interp, Tcl_NewIntObj(rv)); + return TCL_OK; + } + resulttype boolean = int + resulttype bool = int + + resulttype long { + Tcl_SetObjResult(interp, Tcl_NewLongObj(rv)); + return TCL_OK; + } + + resulttype wideint { + Tcl_SetObjResult(interp, Tcl_NewWideIntObj(rv)); + return TCL_OK; + } Tcl_WideInt + + resulttype double { + Tcl_SetObjResult(interp, Tcl_NewDoubleObj(rv)); + return TCL_OK; + } + resulttype float { + Tcl_SetObjResult(interp, Tcl_NewDoubleObj(rv)); + return TCL_OK; + } + + # Static and volatile strings. Duplicate. + resulttype char* { + Tcl_SetObjResult(interp, Tcl_NewStringObj(rv,-1)); + return TCL_OK; + } + resulttype {const char*} { + Tcl_SetObjResult(interp, Tcl_NewStringObj(rv,-1)); + return TCL_OK; + } + resulttype vstring = char* + + # Dynamic strings, allocated via Tcl_Alloc. + # + # We are avoiding the Tcl_Obj* API here, as its use requires an + # additional duplicate of the string, churning memory and + # requiring more copying. + # Tcl_SetObjResult(interp, Tcl_NewStringObj(rv,-1)); + # Tcl_Free (rv); + resulttype string { + Tcl_SetResult (interp, rv, TCL_DYNAMIC); + return TCL_OK; + } char* + resulttype dstring = string + + resulttype Tcl_Obj* { + if (rv == NULL) { return TCL_ERROR; } + Tcl_SetObjResult(interp, rv); + Tcl_DecrRefCount(rv); + return TCL_OK; + } + resulttype object = Tcl_Obj* + + critcl::resulttype Tcl_Obj*0 { + if (rv == NULL) { return TCL_ERROR; } + Tcl_SetObjResult(interp, rv); + /* No refcount adjustment */ + return TCL_OK; + } Tcl_Obj* + resulttype object0 = Tcl_Obj*0 + + resulttype new-channel { + if (rv == NULL) { return TCL_ERROR; } + Tcl_RegisterChannel (interp, rv); + Tcl_SetObjResult (interp, Tcl_NewStringObj (Tcl_GetChannelName (rv), -1)); + return TCL_OK; + } Tcl_Channel + + resulttype known-channel { + if (rv == NULL) { return TCL_ERROR; } + Tcl_SetObjResult (interp, Tcl_NewStringObj (Tcl_GetChannelName (rv), -1)); + return TCL_OK; + } Tcl_Channel + + # Note, this is complementary to argtype `take-channel`. + resulttype return-channel { + if (rv == NULL) { return TCL_ERROR; } + Tcl_RegisterChannel (interp, rv); + Tcl_UnregisterChannel(NULL, rv); + Tcl_SetObjResult (interp, Tcl_NewStringObj (Tcl_GetChannelName (rv), -1)); + return TCL_OK; + } Tcl_Channel + + rename ::critcl::Initialize {} + return +} + +# # ## ### ##### ######## ############# ##################### +## State + +namespace eval ::critcl { + variable mydir ;# Path of the critcl package directory. + variable run ;# interpreter to run commands, eval when, etc + + # XXX configfile - See the *config commands, path of last config file run through 'readconfig'. + + # namespace to flag when options set + namespace eval option { + variable debug_symbols 0 + } + + # keep all variables in a sub-namespace for easy access + namespace eval v { + variable cache ;# Path. Cache directory. Platform-dependent + # (target platform). + + # ---------------------------------------------------------------- + + # (XX) To understand the set of variables below and their + # differences some terminology is required. + # + # First we have to distinguish between "target identifiers" + # and "platform identifiers". The first is the name for a + # particular set of configuration settings specifying commands + # and command line arguments to use. The second is the name of + # a machine configuration, identifying both operating system, + # and cpu architecture. + # + # The problem critcl has is that in 99% of the cases found in + # a critcl config file the "target identifier" is also a valid + # "platform identifier". Example: "linux-ix86". That does not + # make them semantically interchangable however. + # + # Especially when we add cross-compilation to the mix, where + # we have to further distinguish between the platform critcl + # itself is running on (build), and the platform for which + # critcl is generating code (target), and the last one sounds + # similar to "target identifier". + + variable targetconfig ;# Target identifier. The chosen configuration. + variable targetplatform ;# Platform identifier. Type of generated binaries. + variable buildplatform ;# Platform identifier. We run here. + + variable knowntargets {} ;# List of all target identifiers found + # in the configuration file last processed by "readconfig". + + variable xtargets ;# Cross-compile targets. This array maps from + array set xtargets {} ;# the target identifier to the actual platform + # identifier of the target platform in question. If a target identifier + # has no entry here, it is assumed to be the platform identifier itself. + # See "critcl::actualtarget". + + # ---------------------------------------------------------------- + + variable version "" ;# String. Min version number on platform + variable hdrdir ;# Path. Directory containing the helper + # files of the package. A sub- + # directory of 'mydir', see above. + variable hdrsavailable ;# List. Of Tcl versions for which we have + # Tcl header files available. For details + # see procedure 'Initialize' above. + variable prefix ;# String. The string to start all file names + # generated by the package with. See + # 'Initialize' for our choice and + # explanation of it. + variable options ;# An array containing options + # controlling the code generator. + # For more details see below. + set options(outdir) "" ;# - Path. If set the place where the generated + # shared library is saved for permanent use. + set options(keepsrc) 0 ;# - Boolean. If set all generated .c files are + # kept after compilation. Helps with debugging + # the critcl package. + set options(combine) "" ;# - XXX standalone/dynamic/static + # XXX Meaning of combine? + set options(force) 0 ;# - Boolean. If set (re)compilation is + # forced, regardless of the state of + # the cache. + set options(I) "" ;# - List. Additional include + # directories, globally specified by + # the user for mode 'generate + # package', for all components put + # into the package's library. + set options(L) "" ;# - List. Additional library search + # directories, globally specified by + # the user for mode 'generate + # package'. + set options(language) "" ;# - String. XXX + set options(lines) 1 ;# - Boolean. If set the generator will + # emit #line-directives to help locating + # C code in the .tcl in case of compile + # warnings and errors. + set options(trace) 0 ;# - Boolean. If set the generator will + # emit code tracing command entry + # and return, for all cprocs and + # ccommands. The latter is done by + # creating a shim function. For + # cprocs their regular shim + # function is used and modified. + # The functionality is based on + # 'critcl::cutil's 'tracer' + # command and C code. + + # XXX clientdata() per-command (See ccommand). per-file+ccommand better? + # XXX delproc() per-command (See ccommand). s.a + + # XXX toolchain() , -> data + # XXX Used only in {read,set,show}config. + # XXX Seems to be a database holding the total contents of the + # XXX config file. + + # knowntargets - See the *config commands, list of all platforms we can compile for. + + # I suspect that this came later + + # Conversion maps, Tcl types for procedure arguments and + # results to C types and code fragments for the conversion + # between the realms. Used by the helper commands + # "ArgumentCType", "ArgumentConversion", and + # "ResultConversion". These commands also supply the default + # values for unknown types. + + variable actype + array set actype {} + + variable actypeb + array set actypeb {} + + # In the code fragments below we have the following environment (placeholders, variables): + # ip - C variable, Tcl_Interp* of the interpreter providing the arguments. + # @@ - Tcl_Obj* valued expression returning the Tcl argument value. + # @A - Name of the C-level argument variable. + # + variable aconv + array set aconv {} + + # Mapping from cproc result to C result type of the function. + # This is also the C type of the helper variable holding the result. + # NOTE: 'void' is special, as it has no result, nor result variable. + variable rctype + array set rctype {} + + # In the code fragments for result conversion: + # 'rv' == variable capturing the return value of the C function. + # 'ip' == variable containing pointer to the interp to set the result into. + variable rconv + array set rconv {} + + variable storageclass {} ;# See Initialize for setup. + + variable code ;# This array collects all code snippets and + # data about them. + + # Keys for 'code' (above) and their contents: + # + # -> Per-file information, nested dictionary. Sub keys: + # + # result - Results needed for 'generate package'. + # initname - String. Foo in Foo_Init(). + # tsources - List. The companion tcl sources for . + # object - String. Name of the object file backing . + # objects - List. All object files, main and companions. + # shlib - String. Name of the shared library backing . + # base - String. Common prefix (file root) of 'object' and 'shlib'. + # clibraries - List. See config. Copy for global linkage. + # ldflags - List. See config. Copy for global linkage. + # mintcl - String. Minimum version of Tcl required by the package. + # preload - List. Names of all libraries to load before the package library. + # license - String. License text. + # <= "critcl::cresults" + # + # config - Collected code and configuration (ccode, etc.). + # tsources - List. The companion tcl sources for . + # => "critcl::tsources". + # cheaders - List. => "critcl::cheaders" + # csources - List. => "critcl::csources" + # clibraries - List. => "critcl::clibraries" + # cflags - List. => "critcl::cflags", "critcl::framework", + # "critcl::debug", "critcl::include" + # ldflags - List. => "critcl::ldflags", "critcl::framework" + # initc - String. Initialization code for Foo_Init(), "critcl::cinit" + # edecls - String. Declarations of externals needed by Foo_Init(), "critcl::cinit" + # functions - List. Collected function names. + # fragments - List. Hashes of the collected C source bodies (functions, and unnamed code). + # block - Dictionary. Maps the hashes to their C sources for fragments. + # defs - List. Hashes of the collected C source bodies (only unnamed code), for extraction of defines. + # const - Dictionary. Maps the names of defines to the namespace their variables will be in. + # uuid - List. Strings used to generate the file's uuid/hash. + # mintcl - String. Minimum version of Tcl required by the package. + # preload - List. Names of all libraries to load + # before the package library. This + # information is used only by mode + # 'generate package'. This means that + # packages with preload can't be used + # in mode 'compile & run'. + # license - String. License text. + # api_self - String. Name of our API. Defaults to package name. + # api_hdrs - List. Exported public headers of the API. + # api_ehdrs - List. Exported external public headers of the API. + # api_fun - List. Exported functions (signatures of result type, name, and arguments (C syntax)) + # meta - Dictionary. Arbitrary keys to values, the user meta-data for the package. + # package - Dictionary. Keys, see below. System meta data for the package. Values are lists. + # name - Name of current package + # version - Version of same. + # description - Long description. + # summary - Short description (one line). + # subject - Keywords and -phrases. + # as::build::date - Date-stamp for the build. + # + # --------------------------------------------------------------------- + # + # ,failed -> Per-file information: Boolean. Build status. Failed or not. + # + # 'ccode' -> Accumulated in-memory storage of code-fragments. + # Extended by 'ccode', used by 'BuildDefines', + # called by 'cbuild'. Apparently tries to extract defines + # and enums, and their values, for comparison with 'cdefine'd + # values. + # + # NOTE: are normalized absolute path names for exact + # identification of the relevant .tcl file. + + # _____________________________________________________________________ + # State used by "cbuild" ______________________________________________ + + variable log "" ;# Log channel, opened to logfile. + variable logfile "" ;# Path of logfile. Accessed by + # "Log*" and "ExecWithLogging". + variable failed 0 ;# Build status. Used by "Status*" + variable err "" ;# and "Exec*". Build error text. + + variable uuidcounter 0 ;# Counter for uuid generation in package mode. + ;# md5 is bypassed when used. + + variable buildforpackage 0 ;# Boolean flag controlling + # cbuild's behaviour. Named after + # the mode 'generate package'. + # Auto-resets to OFF after each + # call of "cbuild". Can be activated + # by "buildforpackage". + + # _____________________________________________________________________ + # State used by "BeginCommand", "EndCommand", "Emit*" _________________ + + variable curr ;# Hash of the last BeginCommand. + variable block ;# C code assembled by Emit* calls + # between Begin- and EndCommand. + + # _____________________________________________________________________ + + variable compiling 0 ;# Boolean. Indicates that a C compiler + # (gcc, native, cl) is available. + + # _____________________________________________________________________ + # config variables + variable configvars { + compile + debug_memory + debug_symbols + include + libinclude + ldoutput + embed_manifest + link + link_debug + link_preload + link_release + link_rpath + noassert + object + optimize + output + platform + preproc_define + preproc_enum + sharedlibext + strip + tclstubs + threadflags + tkstubs + version + } + } + + # namespace holding the compiler configuration (commands and + # options for the various tasks, i.e. compilation, linking, etc.). + namespace eval c { + # See sibling file 'Config' for the detailed and full + # information about the variables in use. configvars above, and + # the code below list only the variables relevant to C. Keep this + # information in sync with the contents of 'Config'. + + # compile Command to compile a C source file to an object file + # debug_memory Compiler flags to enable memory debugging + # debug_symbols Compiler flags to add symbols to resulting library + # include Compiler flag to add an include directory + # libinclude Linker flag to add a library directory + # ldoutput - ? See 'Config' + # link Command to link one or more object files and create a shared library + # embed_manifest Command to embed a manifest into a DLL. (Win-specific) + # link_debug - ? See 'Config' + # link_preload Linker flags to use when dependent libraries are pre-loaded. + # link_release - ? See 'Config' + # noassert Compiler flag to turn off assertions in Tcl code + # object File extension for object files + # optimize Compiler flag to specify optimization level + # output Compiler flag to set output file, with argument $object => Use via [subst]. + # platform Platform identification string (defaults to platform::generic) + # preproc_define Command to preprocess C source file (for critcl::cdefines) + # preproc_enum ditto + # sharedlibext The platform's file extension used for shared library files. + # strip Compiler flag to tell the linker to strip symbols + # target Presence of this key indicates that this is a cross-compile target + # tclstubs Compiler flag to set USE_TCL_STUBS + # threadflags Compiler flags to enable threaded build + # tkstubs Compiler flag to set USE_TK_STUBS + # version Command to print the compiler version number + } +} + +# # ## ### ##### ######## ############# ##################### +## Export API + +namespace eval ::critcl { + namespace export \ + at cache ccode ccommand cdata cdefines cflags cheaders \ + check cinit clibraries compiled compiling config cproc \ + csources debug done failed framework ldflags platform \ + tk tsources preload license load tcl api userconfig meta \ + source include make + # This is exported for critcl::app to pick up when generating the + # dummy commands in the runtime support of a generated package. + namespace export Ignore + catch { namespace ensemble create } +} + +# # ## ### ##### ######## ############# ##################### +## Ready + +::critcl::Initialize +return diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/cdata.c b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/cdata.c new file mode 100644 index 00000000..da92e52b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/cdata.c @@ -0,0 +1,5 @@ + static char script\[$count] = { + $inittext + }; + Tcl_SetByteArrayObj(Tcl_GetObjResult(ip), (unsigned char*) script, $count); + return TCL_OK; diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/header.c b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/header.c new file mode 100644 index 00000000..031282c0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/header.c @@ -0,0 +1,6 @@ +/* Generated by critcl on [clock format [clock seconds]] + * source: $file + * binary: $libfile + */ +$api +#include "tcl.h" diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/pkginit.c b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/pkginit.c new file mode 100644 index 00000000..e4668847 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/pkginit.c @@ -0,0 +1,12 @@ + +#ifdef __cplusplus +extern "C" { +#endif + ${ext} +DLLEXPORT int +${ininame}_Init(Tcl_Interp *interp) +{ +#define ip interp +#if USE_TCL_STUBS + if (!MyInitTclStubs(interp)) return TCL_ERROR; +#endif diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/pkginitend.c b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/pkginitend.c new file mode 100644 index 00000000..57450a19 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/pkginitend.c @@ -0,0 +1,6 @@ + return TCL_OK; +#undef ip +} +#ifdef __cplusplus +} +#endif diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/pkginittk.c b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/pkginittk.c new file mode 100644 index 00000000..29945cf7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/pkginittk.c @@ -0,0 +1,5 @@ + +# line 1 "MyInitTkStubs" +#if USE_TK_STUBS + if (!MyInitTkStubs(interp)) return TCL_ERROR; +#endif diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/preload.c b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/preload.c new file mode 100644 index 00000000..5ebccce7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/preload.c @@ -0,0 +1,169 @@ +/* + * pre-load a shared library + * - for situations where a Tcl package depends on another library + * - will be superceded by the functionality in TIP #239 + * - based on tclLoad.c from Tcl 8.4.13 and MyInitTclStubs from Critcl + */ + +#include "tcl.h" + +TclStubs *tclStubsPtr; +TclPlatStubs *tclPlatStubsPtr; +struct TclIntStubs *tclIntStubsPtr; +struct TclIntPlatStubs *tclIntPlatStubsPtr; + +static int +MyInitTclStubs (Tcl_Interp *ip) +{ + typedef struct { + char *result; + Tcl_FreeProc *freeProc; + int errorLine; + TclStubs *stubTable; + } HeadOfInterp; + + HeadOfInterp *hoi = (HeadOfInterp*) ip; + + if (hoi->stubTable == NULL || hoi->stubTable->magic != TCL_STUB_MAGIC) { + ip->result = "This extension requires stubs-support."; + ip->freeProc = TCL_STATIC; + return 0; + } + + tclStubsPtr = hoi->stubTable; + + if (Tcl_PkgRequire(ip, "Tcl", "8.1", 0) == NULL) { + tclStubsPtr = NULL; + return 0; + } + + if (tclStubsPtr->hooks != NULL) { + tclPlatStubsPtr = tclStubsPtr->hooks->tclPlatStubs; + tclIntStubsPtr = tclStubsPtr->hooks->tclIntStubs; + tclIntPlatStubsPtr = tclStubsPtr->hooks->tclIntPlatStubs; + } + + return 1; +} + +#ifdef WIN32 + +#include + +typedef struct PreloadInfo { + Tcl_Obj *dir; + Tcl_LoadHandle handle; +} PreloadInfo; + +static void +removeDLLCopy(ClientData clientData) { + PreloadInfo *preload = (PreloadInfo *) clientData; + Tcl_Obj *dir = preload->dir; + Tcl_LoadHandle handle = preload->handle; + Tcl_Obj *errorPtr; + + // no idea why, but we have to call FreeLibrary twice for the subsequent + // Tcl_FSRemoveDirectory to work + FreeLibrary((HINSTANCE) handle); + FreeLibrary((HINSTANCE) handle); + + if (Tcl_FSRemoveDirectory(dir, 1, &errorPtr) != TCL_OK) { + fprintf(stderr, "error removing dir = %s\n", Tcl_GetString(errorPtr)); + } +} + +#endif + +TCL_DECLARE_MUTEX(packageMutex) + +static int +Critcl_Preload( + ClientData dummy, + Tcl_Interp *interp, + int objc, + Tcl_Obj *objv[]) +{ + int code; + Tcl_PackageInitProc *proc1, *proc2; + Tcl_LoadHandle loadHandle; + Tcl_FSUnloadFileProc *unLoadProcPtr = NULL; + Tcl_Filesystem *fsPtr; +#ifdef WIN32 + PreloadInfo *preload = NULL; +#endif + + if (objc != 2) { + Tcl_WrongNumArgs(interp, 1, objv, "fileName"); + return TCL_ERROR; + } + if (Tcl_FSConvertToPathType(interp, objv[1]) != TCL_OK) { + return TCL_ERROR; + } + +#ifdef WIN32 + // if the filesystem holding the dll doesn't support direct loading + // we need to copy it to a temporary directory and load it from there + // - The command "critcl::runtime::precopy" is defined by the support + // file "critcl/lib/app-critcl/runtime.tcl". At load time this is + // the file "critcl-rt.tcl", sibling to "pkgIndex.tcl". + + if ((fsPtr = Tcl_FSGetFileSystemForPath(objv[1])) != NULL \ + && fsPtr->loadFileProc == NULL) { + int len; + Tcl_Obj *dirs; + objv[0] = Tcl_NewStringObj("::critcl::runtime::precopy", -1); + if ((code = Tcl_EvalObjv(interp, 2, objv, 0)) != TCL_OK) { + Tcl_SetErrorCode(interp, "could not preload ", + Tcl_GetString(objv[1]), 0); + return TCL_ERROR; + } + objv[1] = Tcl_GetObjResult(interp); + Tcl_IncrRefCount(objv[1]); + dirs = Tcl_FSSplitPath(objv[1], &len); + preload = (PreloadInfo *) ckalloc(sizeof(PreloadInfo)); + preload->dir = Tcl_FSJoinPath(dirs, --len); + Tcl_IncrRefCount(preload->dir); + } +#endif + + Tcl_MutexLock(&packageMutex); + code = Tcl_FSLoadFile(interp, objv[1], NULL, NULL, NULL, NULL, + &loadHandle, &unLoadProcPtr); + Tcl_MutexUnlock(&packageMutex); +#ifdef WIN32 + if (preload) { + preload->handle = loadHandle; + Tcl_CreateExitHandler(removeDLLCopy, (ClientData) preload); + } +#endif + return code; +} + +DLLEXPORT int +Preload_Init(Tcl_Interp *interp) +{ + if (!MyInitTclStubs(interp)) + return TCL_ERROR; + // The Tcl command can't be "preload" because the Tcl source might + // be copied into the target package (so Tcl procs are available) + // and we want critcl::runtime::preload to then be a no-op because + // the preloading is done from the loadlib command when the target + // package is loaded + Tcl_CreateObjCommand(interp, "::critcl::runtime::preload", Critcl_Preload, NULL, 0); + return 0; +} + +DLLEXPORT int +Preload_SafeInit(Tcl_Interp *interp) +{ + if (!MyInitTclStubs(interp)) + return TCL_ERROR; + Tcl_CreateObjCommand(interp, "::critcl::runtime::preload", Critcl_Preload, NULL, 0); + return 0; +} + +DLLEXPORT int +Preload_Unload(Tcl_Interp *interp) {} + +DLLEXPORT int +Preload_SafeUnload(Tcl_Interp *interp) {} diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/storageclass.c b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/storageclass.c new file mode 100644 index 00000000..11e44f00 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/storageclass.c @@ -0,0 +1,26 @@ +/* + * These macros are used to control whether functions are being declared for + * import or export. If a function is being declared while it is being built + * to be included in a shared library, then it should have the DLLEXPORT + * storage class. If is being declared for use by a module that is going to + * link against the shared library, then it should have the DLLIMPORT storage + * class. If the symbol is beind declared for a static build or for use from a + * stub library, then the storage class should be empty. + * + * The convention is that a macro called BUILD_xxxx, where xxxx is the name of + * a library we are building, is set on the compile line for sources that are + * to be placed in the library. When this macro is set, the storage class will + * be set to DLLEXPORT. At the end of the header file, the storage class will + * be reset to DLLIMPORT. + */ + +#undef TCL_STORAGE_CLASS +#ifdef BUILD_@cname@ +# define TCL_STORAGE_CLASS DLLEXPORT +#else +# ifdef USE_@up@_STUBS +# define TCL_STORAGE_CLASS +# else +# define TCL_STORAGE_CLASS DLLIMPORT +# endif +#endif diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/stubs.c b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/stubs.c new file mode 100644 index 00000000..19084328 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/stubs.c @@ -0,0 +1,43 @@ + +#line 1 "MyInitTclStubs" + +#if USE_TCL_STUBS + $stubs + $platstubs + const struct TclIntStubs *tclIntStubsPtr; + const struct TclIntPlatStubs *tclIntPlatStubsPtr; + + static int + MyInitTclStubs (Tcl_Interp *ip) + { + typedef struct { + char *result; + Tcl_FreeProc *freeProc; + int errorLine; + TclStubs *stubTable; + } HeadOfInterp; + + HeadOfInterp *hoi = (HeadOfInterp*) ip; + + if (hoi->stubTable == NULL || hoi->stubTable->magic != TCL_STUB_MAGIC) { + hoi->result = "This extension requires stubs-support."; + hoi->freeProc = TCL_STATIC; + return 0; + } + + tclStubsPtr = hoi->stubTable; + + if (Tcl_PkgRequire(ip, "Tcl", "$mintcl", 0) == NULL) { + tclStubsPtr = NULL; + return 0; + } + + if (tclStubsPtr->hooks != NULL) { + tclPlatStubsPtr = tclStubsPtr->hooks->tclPlatStubs; + tclIntStubsPtr = tclStubsPtr->hooks->tclIntStubs; + tclIntPlatStubsPtr = tclStubsPtr->hooks->tclIntPlatStubs; + } + + return 1; + } +#endif diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/stubs_e.c b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/stubs_e.c new file mode 100644 index 00000000..42c17b61 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/stubs_e.c @@ -0,0 +1,10 @@ + +#line 1 "MyInitTclStubs" + +#if USE_TCL_STUBS + static int + MyInitTclStubs (Tcl_Interp *ip) + { + return 1; + } +#endif diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/X.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/X.h new file mode 100644 index 00000000..bdc4f136 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/X.h @@ -0,0 +1,677 @@ +/* + * $XConsortium: X.h,v 1.66 88/09/06 15:55:56 jim Exp $ + */ + +/* Definitions for the X window system likely to be used by applications */ + +#ifndef X_H +#define X_H + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ +#define X_PROTOCOL 11 /* current protocol version */ +#define X_PROTOCOL_REVISION 0 /* current minor version */ + +#if defined(MAC_OSX_TK) +# define Cursor XCursor +# define Region XRegion +#endif + +/* Resources */ + +#ifdef _WIN64 +typedef __int64 XID; +#else +typedef unsigned long XID; +#endif + +typedef XID Window; +typedef XID Drawable; +typedef XID Font; +typedef XID Pixmap; +typedef XID Cursor; +typedef XID Colormap; +typedef XID GContext; +typedef XID KeySym; + +typedef unsigned long Mask; + +typedef unsigned long Atom; + +typedef unsigned long VisualID; + +typedef unsigned long Time; + +typedef unsigned long KeyCode; /* In order to use IME, the Macintosh needs + * to pack 3 bytes into the keyCode field in + * the XEvent. In the real X.h, a KeyCode is + * defined as a short, which wouldn't be big + * enough. */ + +/***************************************************************** + * RESERVED RESOURCE AND CONSTANT DEFINITIONS + *****************************************************************/ + +#define None 0L /* universal null resource or null atom */ + +#define ParentRelative 1L /* background pixmap in CreateWindow + and ChangeWindowAttributes */ + +#define CopyFromParent 0L /* border pixmap in CreateWindow + and ChangeWindowAttributes + special VisualID and special window + class passed to CreateWindow */ + +#define PointerWindow 0L /* destination window in SendEvent */ +#define InputFocus 1L /* destination window in SendEvent */ + +#define PointerRoot 1L /* focus window in SetInputFocus */ + +#define AnyPropertyType 0L /* special Atom, passed to GetProperty */ + +#define AnyKey 0L /* special Key Code, passed to GrabKey */ + +#define AnyButton 0L /* special Button Code, passed to GrabButton */ + +#define AllTemporary 0L /* special Resource ID passed to KillClient */ + +#define CurrentTime 0L /* special Time */ + +#define NoSymbol 0L /* special KeySym */ + +/***************************************************************** + * EVENT DEFINITIONS + *****************************************************************/ + +/* Input Event Masks. Used as event-mask window attribute and as arguments + to Grab requests. Not to be confused with event names. */ + +#define NoEventMask 0L +#define KeyPressMask (1L<<0) +#define KeyReleaseMask (1L<<1) +#define ButtonPressMask (1L<<2) +#define ButtonReleaseMask (1L<<3) +#define EnterWindowMask (1L<<4) +#define LeaveWindowMask (1L<<5) +#define PointerMotionMask (1L<<6) +#define PointerMotionHintMask (1L<<7) +#define Button1MotionMask (1L<<8) +#define Button2MotionMask (1L<<9) +#define Button3MotionMask (1L<<10) +#define Button4MotionMask (1L<<11) +#define Button5MotionMask (1L<<12) +#define ButtonMotionMask (1L<<13) +#define KeymapStateMask (1L<<14) +#define ExposureMask (1L<<15) +#define VisibilityChangeMask (1L<<16) +#define StructureNotifyMask (1L<<17) +#define ResizeRedirectMask (1L<<18) +#define SubstructureNotifyMask (1L<<19) +#define SubstructureRedirectMask (1L<<20) +#define FocusChangeMask (1L<<21) +#define PropertyChangeMask (1L<<22) +#define ColormapChangeMask (1L<<23) +#define OwnerGrabButtonMask (1L<<24) + +/* Event names. Used in "type" field in XEvent structures. Not to be +confused with event masks above. They start from 2 because 0 and 1 +are reserved in the protocol for errors and replies. */ + +#define KeyPress 2 +#define KeyRelease 3 +#define ButtonPress 4 +#define ButtonRelease 5 +#define MotionNotify 6 +#define EnterNotify 7 +#define LeaveNotify 8 +#define FocusIn 9 +#define FocusOut 10 +#define KeymapNotify 11 +#define Expose 12 +#define GraphicsExpose 13 +#define NoExpose 14 +#define VisibilityNotify 15 +#define CreateNotify 16 +#define DestroyNotify 17 +#define UnmapNotify 18 +#define MapNotify 19 +#define MapRequest 20 +#define ReparentNotify 21 +#define ConfigureNotify 22 +#define ConfigureRequest 23 +#define GravityNotify 24 +#define ResizeRequest 25 +#define CirculateNotify 26 +#define CirculateRequest 27 +#define PropertyNotify 28 +#define SelectionClear 29 +#define SelectionRequest 30 +#define SelectionNotify 31 +#define ColormapNotify 32 +#define ClientMessage 33 +#define MappingNotify 34 +#define LASTEvent 35 /* must be bigger than any event # */ + + +/* Key masks. Used as modifiers to GrabButton and GrabKey, results of QueryPointer, + state in various key-, mouse-, and button-related events. */ + +#define ShiftMask (1<<0) +#define LockMask (1<<1) +#define ControlMask (1<<2) +#define Mod1Mask (1<<3) +#define Mod2Mask (1<<4) +#define Mod3Mask (1<<5) +#define Mod4Mask (1<<6) +#define Mod5Mask (1<<7) + +/* modifier names. Used to build a SetModifierMapping request or + to read a GetModifierMapping request. These correspond to the + masks defined above. */ +#define ShiftMapIndex 0 +#define LockMapIndex 1 +#define ControlMapIndex 2 +#define Mod1MapIndex 3 +#define Mod2MapIndex 4 +#define Mod3MapIndex 5 +#define Mod4MapIndex 6 +#define Mod5MapIndex 7 + + +/* button masks. Used in same manner as Key masks above. Not to be confused + with button names below. */ + +#define Button1Mask (1<<8) +#define Button2Mask (1<<9) +#define Button3Mask (1<<10) +#define Button4Mask (1<<11) +#define Button5Mask (1<<12) + +#define AnyModifier (1<<15) /* used in GrabButton, GrabKey */ + + +/* button names. Used as arguments to GrabButton and as detail in ButtonPress + and ButtonRelease events. Not to be confused with button masks above. + Note that 0 is already defined above as "AnyButton". */ + +#define Button1 1 +#define Button2 2 +#define Button3 3 +#define Button4 4 +#define Button5 5 + +/* Notify modes */ + +#define NotifyNormal 0 +#define NotifyGrab 1 +#define NotifyUngrab 2 +#define NotifyWhileGrabbed 3 + +#define NotifyHint 1 /* for MotionNotify events */ + +/* Notify detail */ + +#define NotifyAncestor 0 +#define NotifyVirtual 1 +#define NotifyInferior 2 +#define NotifyNonlinear 3 +#define NotifyNonlinearVirtual 4 +#define NotifyPointer 5 +#define NotifyPointerRoot 6 +#define NotifyDetailNone 7 + +/* Visibility notify */ + +#define VisibilityUnobscured 0 +#define VisibilityPartiallyObscured 1 +#define VisibilityFullyObscured 2 + +/* Circulation request */ + +#define PlaceOnTop 0 +#define PlaceOnBottom 1 + +/* protocol families */ + +#define FamilyInternet 0 +#define FamilyDECnet 1 +#define FamilyChaos 2 + +/* Property notification */ + +#define PropertyNewValue 0 +#define PropertyDelete 1 + +/* Color Map notification */ + +#define ColormapUninstalled 0 +#define ColormapInstalled 1 + +/* GrabPointer, GrabButton, GrabKeyboard, GrabKey Modes */ + +#define GrabModeSync 0 +#define GrabModeAsync 1 + +/* GrabPointer, GrabKeyboard reply status */ + +#define GrabSuccess 0 +#define AlreadyGrabbed 1 +#define GrabInvalidTime 2 +#define GrabNotViewable 3 +#define GrabFrozen 4 + +/* AllowEvents modes */ + +#define AsyncPointer 0 +#define SyncPointer 1 +#define ReplayPointer 2 +#define AsyncKeyboard 3 +#define SyncKeyboard 4 +#define ReplayKeyboard 5 +#define AsyncBoth 6 +#define SyncBoth 7 + +/* Used in SetInputFocus, GetInputFocus */ + +#define RevertToNone (int)None +#define RevertToPointerRoot (int)PointerRoot +#define RevertToParent 2 + +/***************************************************************** + * ERROR CODES + *****************************************************************/ + +#define Success 0 /* everything's okay */ +#define BadRequest 1 /* bad request code */ +#define BadValue 2 /* int parameter out of range */ +#define BadWindow 3 /* parameter not a Window */ +#define BadPixmap 4 /* parameter not a Pixmap */ +#define BadAtom 5 /* parameter not an Atom */ +#define BadCursor 6 /* parameter not a Cursor */ +#define BadFont 7 /* parameter not a Font */ +#define BadMatch 8 /* parameter mismatch */ +#define BadDrawable 9 /* parameter not a Pixmap or Window */ +#define BadAccess 10 /* depending on context: + - key/button already grabbed + - attempt to free an illegal + cmap entry + - attempt to store into a read-only + color map entry. + - attempt to modify the access control + list from other than the local host. + */ +#define BadAlloc 11 /* insufficient resources */ +#define BadColor 12 /* no such colormap */ +#define BadGC 13 /* parameter not a GC */ +#define BadIDChoice 14 /* choice not in range or already used */ +#define BadName 15 /* font or color name doesn't exist */ +#define BadLength 16 /* Request length incorrect */ +#define BadImplementation 17 /* server is defective */ + +#define FirstExtensionError 128 +#define LastExtensionError 255 + +/***************************************************************** + * WINDOW DEFINITIONS + *****************************************************************/ + +/* Window classes used by CreateWindow */ +/* Note that CopyFromParent is already defined as 0 above */ + +#define InputOutput 1 +#define InputOnly 2 + +/* Window attributes for CreateWindow and ChangeWindowAttributes */ + +#define CWBackPixmap (1L<<0) +#define CWBackPixel (1L<<1) +#define CWBorderPixmap (1L<<2) +#define CWBorderPixel (1L<<3) +#define CWBitGravity (1L<<4) +#define CWWinGravity (1L<<5) +#define CWBackingStore (1L<<6) +#define CWBackingPlanes (1L<<7) +#define CWBackingPixel (1L<<8) +#define CWOverrideRedirect (1L<<9) +#define CWSaveUnder (1L<<10) +#define CWEventMask (1L<<11) +#define CWDontPropagate (1L<<12) +#define CWColormap (1L<<13) +#define CWCursor (1L<<14) + +/* ConfigureWindow structure */ + +#define CWX (1<<0) +#define CWY (1<<1) +#define CWWidth (1<<2) +#define CWHeight (1<<3) +#define CWBorderWidth (1<<4) +#define CWSibling (1<<5) +#define CWStackMode (1<<6) + + +/* Bit Gravity */ + +#define ForgetGravity 0 +#define NorthWestGravity 1 +#define NorthGravity 2 +#define NorthEastGravity 3 +#define WestGravity 4 +#define CenterGravity 5 +#define EastGravity 6 +#define SouthWestGravity 7 +#define SouthGravity 8 +#define SouthEastGravity 9 +#define StaticGravity 10 + +/* Window gravity + bit gravity above */ + +#define UnmapGravity 0 + +/* Used in CreateWindow for backing-store hint */ + +#define NotUseful 0 +#define WhenMapped 1 +#define Always 2 + +/* Used in GetWindowAttributes reply */ + +#define IsUnmapped 0 +#define IsUnviewable 1 +#define IsViewable 2 + +/* Used in ChangeSaveSet */ + +#define SetModeInsert 0 +#define SetModeDelete 1 + +/* Used in ChangeCloseDownMode */ + +#define DestroyAll 0 +#define RetainPermanent 1 +#define RetainTemporary 2 + +/* Window stacking method (in configureWindow) */ + +#define Above 0 +#define Below 1 +#define TopIf 2 +#define BottomIf 3 +#define Opposite 4 + +/* Circulation direction */ + +#define RaiseLowest 0 +#define LowerHighest 1 + +/* Property modes */ + +#define PropModeReplace 0 +#define PropModePrepend 1 +#define PropModeAppend 2 + +/***************************************************************** + * GRAPHICS DEFINITIONS + *****************************************************************/ + +/* graphics functions, as in GC.alu */ + +#define GXclear 0x0 /* 0 */ +#define GXand 0x1 /* src AND dst */ +#define GXandReverse 0x2 /* src AND NOT dst */ +#define GXcopy 0x3 /* src */ +#define GXandInverted 0x4 /* NOT src AND dst */ +#define GXnoop 0x5 /* dst */ +#define GXxor 0x6 /* src XOR dst */ +#define GXor 0x7 /* src OR dst */ +#define GXnor 0x8 /* NOT src AND NOT dst */ +#define GXequiv 0x9 /* NOT src XOR dst */ +#define GXinvert 0xa /* NOT dst */ +#define GXorReverse 0xb /* src OR NOT dst */ +#define GXcopyInverted 0xc /* NOT src */ +#define GXorInverted 0xd /* NOT src OR dst */ +#define GXnand 0xe /* NOT src OR NOT dst */ +#define GXset 0xf /* 1 */ + +/* LineStyle */ + +#define LineSolid 0 +#define LineOnOffDash 1 +#define LineDoubleDash 2 + +/* capStyle */ + +#define CapNotLast 0 +#define CapButt 1 +#define CapRound 2 +#define CapProjecting 3 + +/* joinStyle */ + +#define JoinMiter 0 +#define JoinRound 1 +#define JoinBevel 2 + +/* fillStyle */ + +#define FillSolid 0 +#define FillTiled 1 +#define FillStippled 2 +#define FillOpaqueStippled 3 + +/* fillRule */ + +#define EvenOddRule 0 +#define WindingRule 1 + +/* subwindow mode */ + +#define ClipByChildren 0 +#define IncludeInferiors 1 + +/* SetClipRectangles ordering */ + +#define Unsorted 0 +#define YSorted 1 +#define YXSorted 2 +#define YXBanded 3 + +/* CoordinateMode for drawing routines */ + +#define CoordModeOrigin 0 /* relative to the origin */ +#define CoordModePrevious 1 /* relative to previous point */ + +/* Polygon shapes */ + +#define Complex 0 /* paths may intersect */ +#define Nonconvex 1 /* no paths intersect, but not convex */ +#define Convex 2 /* wholly convex */ + +/* Arc modes for PolyFillArc */ + +#define ArcChord 0 /* join endpoints of arc */ +#define ArcPieSlice 1 /* join endpoints to center of arc */ + +/* GC components: masks used in CreateGC, CopyGC, ChangeGC, OR'ed into + GC.stateChanges */ + +#define GCFunction (1L<<0) +#define GCPlaneMask (1L<<1) +#define GCForeground (1L<<2) +#define GCBackground (1L<<3) +#define GCLineWidth (1L<<4) +#define GCLineStyle (1L<<5) +#define GCCapStyle (1L<<6) +#define GCJoinStyle (1L<<7) +#define GCFillStyle (1L<<8) +#define GCFillRule (1L<<9) +#define GCTile (1L<<10) +#define GCStipple (1L<<11) +#define GCTileStipXOrigin (1L<<12) +#define GCTileStipYOrigin (1L<<13) +#define GCFont (1L<<14) +#define GCSubwindowMode (1L<<15) +#define GCGraphicsExposures (1L<<16) +#define GCClipXOrigin (1L<<17) +#define GCClipYOrigin (1L<<18) +#define GCClipMask (1L<<19) +#define GCDashOffset (1L<<20) +#define GCDashList (1L<<21) +#define GCArcMode (1L<<22) + +#define GCLastBit 22 +/***************************************************************** + * FONTS + *****************************************************************/ + +/* used in QueryFont -- draw direction */ + +#define FontLeftToRight 0 +#define FontRightToLeft 1 + +#define FontChange 255 + +/***************************************************************** + * IMAGING + *****************************************************************/ + +/* ImageFormat -- PutImage, GetImage */ + +#define XYBitmap 0 /* depth 1, XYFormat */ +#define XYPixmap 1 /* depth == drawable depth */ +#define ZPixmap 2 /* depth == drawable depth */ + +/***************************************************************** + * COLOR MAP STUFF + *****************************************************************/ + +/* For CreateColormap */ + +#define AllocNone 0 /* create map with no entries */ +#define AllocAll 1 /* allocate entire map writeable */ + + +/* Flags used in StoreNamedColor, StoreColors */ + +#define DoRed (1<<0) +#define DoGreen (1<<1) +#define DoBlue (1<<2) + +/***************************************************************** + * CURSOR STUFF + *****************************************************************/ + +/* QueryBestSize Class */ + +#define CursorShape 0 /* largest size that can be displayed */ +#define TileShape 1 /* size tiled fastest */ +#define StippleShape 2 /* size stippled fastest */ + +/***************************************************************** + * KEYBOARD/POINTER STUFF + *****************************************************************/ + +#define AutoRepeatModeOff 0 +#define AutoRepeatModeOn 1 +#define AutoRepeatModeDefault 2 + +#define LedModeOff 0 +#define LedModeOn 1 + +/* masks for ChangeKeyboardControl */ + +#define KBKeyClickPercent (1L<<0) +#define KBBellPercent (1L<<1) +#define KBBellPitch (1L<<2) +#define KBBellDuration (1L<<3) +#define KBLed (1L<<4) +#define KBLedMode (1L<<5) +#define KBKey (1L<<6) +#define KBAutoRepeatMode (1L<<7) + +#define MappingSuccess 0 +#define MappingBusy 1 +#define MappingFailed 2 + +#define MappingModifier 0 +#define MappingKeyboard 1 +#define MappingPointer 2 + +/***************************************************************** + * SCREEN SAVER STUFF + *****************************************************************/ + +#define DontPreferBlanking 0 +#define PreferBlanking 1 +#define DefaultBlanking 2 + +#define DisableScreenSaver 0 +#define DisableScreenInterval 0 + +#define DontAllowExposures 0 +#define AllowExposures 1 +#define DefaultExposures 2 + +/* for ForceScreenSaver */ + +#define ScreenSaverReset 0 +#define ScreenSaverActive 1 + +/***************************************************************** + * HOSTS AND CONNECTIONS + *****************************************************************/ + +/* for ChangeHosts */ + +#define HostInsert 0 +#define HostDelete 1 + +/* for ChangeAccessControl */ + +#define EnableAccess 1 +#define DisableAccess 0 + +/* Display classes used in opening the connection + * Note that the statically allocated ones are even numbered and the + * dynamically changeable ones are odd numbered */ + +#define StaticGray 0 +#define GrayScale 1 +#define StaticColor 2 +#define PseudoColor 3 +#define TrueColor 4 +#define DirectColor 5 + + +/* Byte order used in imageByteOrder and bitmapBitOrder */ + +#define LSBFirst 0 +#define MSBFirst 1 + +#if defined(MAC_OSX_TK) +# undef Cursor +# undef Region +#endif + +#endif /* X_H */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xatom.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xatom.h new file mode 100644 index 00000000..485a4236 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xatom.h @@ -0,0 +1,79 @@ +#ifndef XATOM_H +#define XATOM_H 1 + +/* THIS IS A GENERATED FILE + * + * Do not change! Changing this file implies a protocol change! + */ + +#define XA_PRIMARY ((Atom) 1) +#define XA_SECONDARY ((Atom) 2) +#define XA_ARC ((Atom) 3) +#define XA_ATOM ((Atom) 4) +#define XA_BITMAP ((Atom) 5) +#define XA_CARDINAL ((Atom) 6) +#define XA_COLORMAP ((Atom) 7) +#define XA_CURSOR ((Atom) 8) +#define XA_CUT_BUFFER0 ((Atom) 9) +#define XA_CUT_BUFFER1 ((Atom) 10) +#define XA_CUT_BUFFER2 ((Atom) 11) +#define XA_CUT_BUFFER3 ((Atom) 12) +#define XA_CUT_BUFFER4 ((Atom) 13) +#define XA_CUT_BUFFER5 ((Atom) 14) +#define XA_CUT_BUFFER6 ((Atom) 15) +#define XA_CUT_BUFFER7 ((Atom) 16) +#define XA_DRAWABLE ((Atom) 17) +#define XA_FONT ((Atom) 18) +#define XA_INTEGER ((Atom) 19) +#define XA_PIXMAP ((Atom) 20) +#define XA_POINT ((Atom) 21) +#define XA_RECTANGLE ((Atom) 22) +#define XA_RESOURCE_MANAGER ((Atom) 23) +#define XA_RGB_COLOR_MAP ((Atom) 24) +#define XA_RGB_BEST_MAP ((Atom) 25) +#define XA_RGB_BLUE_MAP ((Atom) 26) +#define XA_RGB_DEFAULT_MAP ((Atom) 27) +#define XA_RGB_GRAY_MAP ((Atom) 28) +#define XA_RGB_GREEN_MAP ((Atom) 29) +#define XA_RGB_RED_MAP ((Atom) 30) +#define XA_STRING ((Atom) 31) +#define XA_VISUALID ((Atom) 32) +#define XA_WINDOW ((Atom) 33) +#define XA_WM_COMMAND ((Atom) 34) +#define XA_WM_HINTS ((Atom) 35) +#define XA_WM_CLIENT_MACHINE ((Atom) 36) +#define XA_WM_ICON_NAME ((Atom) 37) +#define XA_WM_ICON_SIZE ((Atom) 38) +#define XA_WM_NAME ((Atom) 39) +#define XA_WM_NORMAL_HINTS ((Atom) 40) +#define XA_WM_SIZE_HINTS ((Atom) 41) +#define XA_WM_ZOOM_HINTS ((Atom) 42) +#define XA_MIN_SPACE ((Atom) 43) +#define XA_NORM_SPACE ((Atom) 44) +#define XA_MAX_SPACE ((Atom) 45) +#define XA_END_SPACE ((Atom) 46) +#define XA_SUPERSCRIPT_X ((Atom) 47) +#define XA_SUPERSCRIPT_Y ((Atom) 48) +#define XA_SUBSCRIPT_X ((Atom) 49) +#define XA_SUBSCRIPT_Y ((Atom) 50) +#define XA_UNDERLINE_POSITION ((Atom) 51) +#define XA_UNDERLINE_THICKNESS ((Atom) 52) +#define XA_STRIKEOUT_ASCENT ((Atom) 53) +#define XA_STRIKEOUT_DESCENT ((Atom) 54) +#define XA_ITALIC_ANGLE ((Atom) 55) +#define XA_X_HEIGHT ((Atom) 56) +#define XA_QUAD_WIDTH ((Atom) 57) +#define XA_WEIGHT ((Atom) 58) +#define XA_POINT_SIZE ((Atom) 59) +#define XA_RESOLUTION ((Atom) 60) +#define XA_COPYRIGHT ((Atom) 61) +#define XA_NOTICE ((Atom) 62) +#define XA_FONT_NAME ((Atom) 63) +#define XA_FAMILY_NAME ((Atom) 64) +#define XA_FULL_NAME ((Atom) 65) +#define XA_CAP_HEIGHT ((Atom) 66) +#define XA_WM_CLASS ((Atom) 67) +#define XA_WM_TRANSIENT_FOR ((Atom) 68) + +#define XA_LAST_PREDEFINED ((Atom) 68) +#endif /* XATOM_H */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xfuncproto.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xfuncproto.h new file mode 100644 index 00000000..a59379b3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xfuncproto.h @@ -0,0 +1,60 @@ +/* $XConsortium: Xfuncproto.h,v 1.7 91/05/13 20:49:21 rws Exp $ */ +/* + * Copyright 1989, 1991 by the Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + */ + +/* Definitions to make function prototypes manageable */ + +#ifndef _XFUNCPROTO_H_ +#define _XFUNCPROTO_H_ + +#ifndef NeedFunctionPrototypes +#define NeedFunctionPrototypes 1 +#endif /* NeedFunctionPrototypes */ + +#ifndef NeedVarargsPrototypes +#define NeedVarargsPrototypes 0 +#endif /* NeedVarargsPrototypes */ + +#if NeedFunctionPrototypes + +#ifndef NeedNestedPrototypes +#define NeedNestedPrototypes 1 +#endif /* NeedNestedPrototypes */ + +#ifndef _Xconst +#define _Xconst const +#endif /* _Xconst */ + +#ifndef NeedWidePrototypes +#ifdef NARROWPROTO +#define NeedWidePrototypes 0 +#else +#define NeedWidePrototypes 1 /* default to make interropt. easier */ +#endif +#endif /* NeedWidePrototypes */ + +#endif /* NeedFunctionPrototypes */ + +#ifdef __cplusplus +#define _XFUNCPROTOBEGIN extern "C" { +#define _XFUNCPROTOEND } +#endif + +#ifndef _XFUNCPROTOBEGIN +#define _XFUNCPROTOBEGIN +#define _XFUNCPROTOEND +#endif /* _XFUNCPROTOBEGIN */ + +#endif /* _XFUNCPROTO_H_ */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xlib.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xlib.h new file mode 100644 index 00000000..3af3682a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xlib.h @@ -0,0 +1,1205 @@ +/* $XConsortium: Xlib.h,v 11.221 93/07/02 14:13:28 gildea Exp $ */ +/* + * Copyright 1985, 1986, 1987, 1991 by the Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * X Window System is a Trademark of MIT. + * + */ + + +/* + * Xlib.h - Header definition and support file for the C subroutine + * interface library (Xlib) to the X Window System Protocol (V11). + * Structures and symbols starting with "_" are private to the library. + */ +#ifndef _XLIB_H_ +#define _XLIB_H_ + +#define XlibSpecificationRelease 5 + +#if !defined(MAC_OSX_TK) +# include +#endif +#ifdef MAC_OSX_TK +# include +# define Cursor XCursor +# define Region XRegion +#endif + +/* applications should not depend on these two headers being included! */ +#include + +#ifndef X_WCHAR +#ifdef X_NOT_STDC_ENV +#define X_WCHAR +#endif +#endif + +#ifndef X_WCHAR +#include +#else +/* replace this with #include or typedef appropriate for your system */ +typedef unsigned long wchar_t; +#endif + +typedef char *XPointer; + +#define Bool int +#if defined(MAC_OSX_TK) +/* Use define rather than typedef, since may need to undefine this later */ +#define Status int +#else +typedef int Status; +#endif +#define True 1 +#define False 0 + +#define QueuedAlready 0 +#define QueuedAfterReading 1 +#define QueuedAfterFlush 2 + +#define ConnectionNumber(dpy) ((dpy)->fd) +#define RootWindow(dpy, scr) (((dpy)->screens[(scr)]).root) +#define DefaultScreen(dpy) ((dpy)->default_screen) +#define DefaultRootWindow(dpy) (((dpy)->screens[(dpy)->default_screen]).root) +#define DefaultVisual(dpy, scr) (((dpy)->screens[(scr)]).root_visual) +#define DefaultGC(dpy, scr) (((dpy)->screens[(scr)]).default_gc) +#define BlackPixel(dpy, scr) (((dpy)->screens[(scr)]).black_pixel) +#define WhitePixel(dpy, scr) (((dpy)->screens[(scr)]).white_pixel) +#define AllPlanes ((unsigned long)~0L) +#define QLength(dpy) ((dpy)->qlen) +#define DisplayWidth(dpy, scr) (((dpy)->screens[(scr)]).width) +#define DisplayHeight(dpy, scr) (((dpy)->screens[(scr)]).height) +#define DisplayWidthMM(dpy, scr)(((dpy)->screens[(scr)]).mwidth) +#define DisplayHeightMM(dpy, scr)(((dpy)->screens[(scr)]).mheight) +#define DisplayPlanes(dpy, scr) (((dpy)->screens[(scr)]).root_depth) +#define DisplayCells(dpy, scr) (DefaultVisual((dpy), (scr))->map_entries) +#define ScreenCount(dpy) ((dpy)->nscreens) +#define ServerVendor(dpy) ((dpy)->vendor) +#define ProtocolVersion(dpy) ((dpy)->proto_major_version) +#define ProtocolRevision(dpy) ((dpy)->proto_minor_version) +#define VendorRelease(dpy) ((dpy)->release) +#define DisplayString(dpy) ((dpy)->display_name) +#define DefaultDepth(dpy, scr) (((dpy)->screens[(scr)]).root_depth) +#define DefaultColormap(dpy, scr)(((dpy)->screens[(scr)]).cmap) +#define BitmapUnit(dpy) ((dpy)->bitmap_unit) +#define BitmapBitOrder(dpy) ((dpy)->bitmap_bit_order) +#define BitmapPad(dpy) ((dpy)->bitmap_pad) +#define ImageByteOrder(dpy) ((dpy)->byte_order) +#define NextRequest(dpy) ((dpy)->request + 1) +#define LastKnownRequestProcessed(dpy) ((dpy)->request) + +/* macros for screen oriented applications (toolkit) */ +#define ScreenOfDisplay(dpy, scr)(&((dpy)->screens[(scr)])) +#define DefaultScreenOfDisplay(dpy) (&((dpy)->screens[(dpy)->default_screen])) +#define DisplayOfScreen(s) ((s)->display) +#define RootWindowOfScreen(s) ((s)->root) +#define BlackPixelOfScreen(s) ((s)->black_pixel) +#define WhitePixelOfScreen(s) ((s)->white_pixel) +#define DefaultColormapOfScreen(s)((s)->cmap) +#define DefaultDepthOfScreen(s) ((s)->root_depth) +#define DefaultGCOfScreen(s) ((s)->default_gc) +#define DefaultVisualOfScreen(s)((s)->root_visual) +#define WidthOfScreen(s) ((s)->width) +#define HeightOfScreen(s) ((s)->height) +#define WidthMMOfScreen(s) ((s)->mwidth) +#define HeightMMOfScreen(s) ((s)->mheight) +#define PlanesOfScreen(s) ((s)->root_depth) +#define CellsOfScreen(s) (DefaultVisualOfScreen((s))->map_entries) +#define MinCmapsOfScreen(s) ((s)->min_maps) +#define MaxCmapsOfScreen(s) ((s)->max_maps) +#define DoesSaveUnders(s) ((s)->save_unders) +#define DoesBackingStore(s) ((s)->backing_store) +#define EventMaskOfScreen(s) ((s)->root_input_mask) + +/* + * Extensions need a way to hang private data on some structures. + */ +typedef struct _XExtData { + int number; /* number returned by XRegisterExtension */ + struct _XExtData *next; /* next item on list of data for structure */ + int (*free_private)(); /* called to free private storage */ + XPointer private_data; /* data private to this extension. */ +} XExtData; + +/* + * This file contains structures used by the extension mechanism. + */ +typedef struct { /* public to extension, cannot be changed */ + int extension; /* extension number */ + int major_opcode; /* major op-code assigned by server */ + int first_event; /* first event number for the extension */ + int first_error; /* first error number for the extension */ +} XExtCodes; + +/* + * Data structure for retrieving info about pixmap formats. + */ + +typedef struct { + int depth; + int bits_per_pixel; + int scanline_pad; +} XPixmapFormatValues; + + +/* + * Data structure for setting graphics context. + */ +typedef struct { + int function; /* logical operation */ + unsigned long plane_mask;/* plane mask */ + unsigned long foreground;/* foreground pixel */ + unsigned long background;/* background pixel */ + int line_width; /* line width */ + int line_style; /* LineSolid, LineOnOffDash, LineDoubleDash */ + int cap_style; /* CapNotLast, CapButt, + CapRound, CapProjecting */ + int join_style; /* JoinMiter, JoinRound, JoinBevel */ + int fill_style; /* FillSolid, FillTiled, + FillStippled, FillOpaeueStippled */ + int fill_rule; /* EvenOddRule, WindingRule */ + int arc_mode; /* ArcChord, ArcPieSlice */ + Pixmap tile; /* tile pixmap for tiling operations */ + Pixmap stipple; /* stipple 1 plane pixmap for stipping */ + int ts_x_origin; /* offset for tile or stipple operations */ + int ts_y_origin; + Font font; /* default text font for text operations */ + int subwindow_mode; /* ClipByChildren, IncludeInferiors */ + Bool graphics_exposures;/* boolean, should exposures be generated */ + int clip_x_origin; /* origin for clipping */ + int clip_y_origin; + Pixmap clip_mask; /* bitmap clipping; other calls for rects */ + int dash_offset; /* patterned/dashed line information */ + char dashes; +} XGCValues; + +/* + * Graphics context. The contents of this structure are implementation + * dependent. A GC should be treated as opaque by application code. + */ + +typedef XGCValues *GC; + +/* + * Visual structure; contains information about colormapping possible. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + VisualID visualid; /* visual id of this visual */ +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ class of screen (monochrome, etc.) */ +#else + int class; /* class of screen (monochrome, etc.) */ +#endif + unsigned long red_mask, green_mask, blue_mask; /* mask values */ + int bits_per_rgb; /* log base 2 of distinct color values */ + int map_entries; /* color map entries */ +} Visual; + +/* + * Depth structure; contains information for each possible depth. + */ +typedef struct { + int depth; /* this depth (Z) of the depth */ + int nvisuals; /* number of Visual types at this depth */ + Visual *visuals; /* list of visuals possible at this depth */ +} Depth; + +/* + * Information about the screen. The contents of this structure are + * implementation dependent. A Screen should be treated as opaque + * by application code. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + struct _XDisplay *display;/* back pointer to display structure */ + Window root; /* Root window id. */ + int width, height; /* width and height of screen */ + int mwidth, mheight; /* width and height of in millimeters */ + int ndepths; /* number of depths possible */ + Depth *depths; /* list of allowable depths on the screen */ + int root_depth; /* bits per pixel */ + Visual *root_visual; /* root visual */ + GC default_gc; /* GC for the root root visual */ + Colormap cmap; /* default color map */ + unsigned long white_pixel; + unsigned long black_pixel; /* White and Black pixel values */ + int max_maps, min_maps; /* max and min color maps */ + int backing_store; /* Never, WhenMapped, Always */ + Bool save_unders; + long root_input_mask; /* initial root input mask */ +} Screen; + +/* + * Format structure; describes ZFormat data the screen will understand. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + int depth; /* depth of this image format */ + int bits_per_pixel; /* bits/pixel at this depth */ + int scanline_pad; /* scanline must padded to this multiple */ +} ScreenFormat; + +/* + * Data structure for setting window attributes. + */ +typedef struct { + Pixmap background_pixmap; /* background or None or ParentRelative */ + unsigned long background_pixel; /* background pixel */ + Pixmap border_pixmap; /* border of the window */ + unsigned long border_pixel; /* border pixel value */ + int bit_gravity; /* one of bit gravity values */ + int win_gravity; /* one of the window gravity values */ + int backing_store; /* NotUseful, WhenMapped, Always */ + unsigned long backing_planes;/* planes to be preseved if possible */ + unsigned long backing_pixel;/* value to use in restoring planes */ + Bool save_under; /* should bits under be saved? (popups) */ + long event_mask; /* set of events that should be saved */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Colormap colormap; /* color map to be associated with window */ + Cursor cursor; /* cursor to be displayed (or None) */ +} XSetWindowAttributes; + +typedef struct { + int x, y; /* location of window */ + int width, height; /* width and height of window */ + int border_width; /* border width of window */ + int depth; /* depth of window */ + Visual *visual; /* the associated visual structure */ + Window root; /* root of screen containing window */ +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ InputOutput, InputOnly*/ +#else + int class; /* InputOutput, InputOnly*/ +#endif + int bit_gravity; /* one of bit gravity values */ + int win_gravity; /* one of the window gravity values */ + int backing_store; /* NotUseful, WhenMapped, Always */ + unsigned long backing_planes;/* planes to be preserved if possible */ + unsigned long backing_pixel;/* value to be used when restoring planes */ + Bool save_under; /* boolean, should bits under be saved? */ + Colormap colormap; /* color map to be associated with window */ + Bool map_installed; /* boolean, is color map currently installed*/ + int map_state; /* IsUnmapped, IsUnviewable, IsViewable */ + long all_event_masks; /* set of events all people have interest in*/ + long your_event_mask; /* my event mask */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Screen *screen; /* back pointer to correct screen */ +} XWindowAttributes; + +/* + * Data structure for host setting; getting routines. + * + */ + +typedef struct { + int family; /* for example FamilyInternet */ + int length; /* length of address, in bytes */ + char *address; /* pointer to where to find the bytes */ +} XHostAddress; + +/* + * Data structure for "image" data, used by image manipulation routines. + */ +typedef struct _XImage { + int width, height; /* size of image */ + int xoffset; /* number of pixels offset in X direction */ + int format; /* XYBitmap, XYPixmap, ZPixmap */ + char *data; /* pointer to image data */ + int byte_order; /* data byte order, LSBFirst, MSBFirst */ + int bitmap_unit; /* quant. of scanline 8, 16, 32 */ + int bitmap_bit_order; /* LSBFirst, MSBFirst */ + int bitmap_pad; /* 8, 16, 32 either XY or ZPixmap */ + int depth; /* depth of image */ + int bytes_per_line; /* accelarator to next line */ + int bits_per_pixel; /* bits per pixel (ZPixmap) */ + unsigned long red_mask; /* bits in z arrangment */ + unsigned long green_mask; + unsigned long blue_mask; + XPointer obdata; /* hook for the object routines to hang on */ + struct funcs { /* image manipulation routines */ + struct _XImage *(*create_image)(); +#if NeedFunctionPrototypes + int (*destroy_image) (struct _XImage *); + unsigned long (*get_pixel) (struct _XImage *, int, int); + int (*put_pixel) (struct _XImage *, int, int, unsigned long); + struct _XImage *(*sub_image)(struct _XImage *, int, int, unsigned int, unsigned int); + int (*add_pixel) (struct _XImage *, long); +#else + int (*destroy_image)(); + unsigned long (*get_pixel)(); + int (*put_pixel)(); + struct _XImage *(*sub_image)(); + int (*add_pixel)(); +#endif + } f; +} XImage; + +/* + * Data structure for XReconfigureWindow + */ +typedef struct { + int x, y; + int width, height; + int border_width; + Window sibling; + int stack_mode; +} XWindowChanges; + +/* + * Data structure used by color operations + */ +typedef struct { + unsigned long pixel; + unsigned short red, green, blue; + char flags; /* do_red, do_green, do_blue */ + char pad; +} XColor; + +/* + * Data structures for graphics operations. On most machines, these are + * congruent with the wire protocol structures, so reformatting the data + * can be avoided on these architectures. + */ +typedef struct { + short x1, y1, x2, y2; +} XSegment; + +typedef struct { + short x, y; +} XPoint; + +typedef struct { + short x, y; + unsigned short width, height; +} XRectangle; + +typedef struct { + short x, y; + unsigned short width, height; + short angle1, angle2; +} XArc; + + +/* Data structure for XChangeKeyboardControl */ + +typedef struct { + int key_click_percent; + int bell_percent; + int bell_pitch; + int bell_duration; + int led; + int led_mode; + int key; + int auto_repeat_mode; /* On, Off, Default */ +} XKeyboardControl; + +/* Data structure for XGetKeyboardControl */ + +typedef struct { + int key_click_percent; + int bell_percent; + unsigned int bell_pitch, bell_duration; + unsigned long led_mask; + int global_auto_repeat; + char auto_repeats[32]; +} XKeyboardState; + +/* Data structure for XGetMotionEvents. */ + +typedef struct { + Time time; + short x, y; +} XTimeCoord; + +/* Data structure for X{Set,Get}ModifierMapping */ + +typedef struct { + int max_keypermod; /* The server's max # of keys per modifier */ + KeyCode *modifiermap; /* An 8 by max_keypermod array of modifiers */ +} XModifierKeymap; + + +/* + * Display datatype maintaining display specific data. + * The contents of this structure are implementation dependent. + * A Display should be treated as opaque by application code. + */ +typedef struct _XDisplay { + XExtData *ext_data; /* hook for extension to hang data */ + struct _XFreeFuncs *free_funcs; /* internal free functions */ + int fd; /* Network socket. */ + int conn_checker; /* ugly thing used by _XEventsQueued */ + int proto_major_version;/* maj. version of server's X protocol */ + int proto_minor_version;/* minor version of servers X protocol */ + char *vendor; /* vendor of the server hardware */ + XID resource_base; /* resource ID base */ + XID resource_mask; /* resource ID mask bits */ + XID resource_id; /* allocator current ID */ + int resource_shift; /* allocator shift to correct bits */ + XID (*resource_alloc)(); /* allocator function */ + int byte_order; /* screen byte order, LSBFirst, MSBFirst */ + int bitmap_unit; /* padding and data requirements */ + int bitmap_pad; /* padding requirements on bitmaps */ + int bitmap_bit_order; /* LeastSignificant or MostSignificant */ + int nformats; /* number of pixmap formats in list */ + ScreenFormat *pixmap_format; /* pixmap format list */ + int vnumber; /* Xlib's X protocol version number. */ + int release; /* release of the server */ + struct _XSQEvent *head, *tail; /* Input event queue. */ + int qlen; /* Length of input event queue */ + unsigned long request; /* sequence number of last request. */ + char *last_req; /* beginning of last request, or dummy */ + char *buffer; /* Output buffer starting address. */ + char *bufptr; /* Output buffer index pointer. */ + char *bufmax; /* Output buffer maximum+1 address. */ + unsigned max_request_size; /* maximum number 32 bit words in request*/ + struct _XrmHashBucketRec *db; + int (*synchandler)(); /* Synchronization handler */ + char *display_name; /* "host:display" string used on this connect*/ + int default_screen; /* default screen for operations */ + int nscreens; /* number of screens on this server*/ + Screen *screens; /* pointer to list of screens */ + unsigned long motion_buffer; /* size of motion buffer */ + unsigned long flags; /* internal connection flags */ + int min_keycode; /* minimum defined keycode */ + int max_keycode; /* maximum defined keycode */ + KeySym *keysyms; /* This server's keysyms */ + XModifierKeymap *modifiermap; /* This server's modifier keymap */ + int keysyms_per_keycode;/* number of rows */ + char *xdefaults; /* contents of defaults from server */ + char *scratch_buffer; /* place to hang scratch buffer */ + unsigned long scratch_length; /* length of scratch buffer */ + int ext_number; /* extension number on this display */ + struct _XExten *ext_procs; /* extensions initialized on this display */ + /* + * the following can be fixed size, as the protocol defines how + * much address space is available. + * While this could be done using the extension vector, there + * may be MANY events processed, so a search through the extension + * list to find the right procedure for each event might be + * expensive if many extensions are being used. + */ + Bool (*event_vec[128])(); /* vector for wire to event */ + Status (*wire_vec[128])(); /* vector for event to wire */ + KeySym lock_meaning; /* for XLookupString */ + struct _XLockInfo *lock; /* multi-thread state, display lock */ + struct _XInternalAsync *async_handlers; /* for internal async */ + unsigned long bigreq_size; /* max size of big requests */ + struct _XLockPtrs *lock_fns; /* pointers to threads functions */ + /* things above this line should not move, for binary compatibility */ + struct _XKeytrans *key_bindings; /* for XLookupString */ + Font cursor_font; /* for XCreateFontCursor */ + struct _XDisplayAtoms *atoms; /* for XInternAtom */ + unsigned int mode_switch; /* keyboard group modifiers */ + struct _XContextDB *context_db; /* context database */ + Bool (**error_vec)(); /* vector for wire to error */ + /* + * Xcms information + */ + struct { + XPointer defaultCCCs; /* pointer to an array of default XcmsCCC */ + XPointer clientCmaps; /* pointer to linked list of XcmsCmapRec */ + XPointer perVisualIntensityMaps; + /* linked list of XcmsIntensityMap */ + } cms; + struct _XIMFilter *im_filters; + struct _XSQEvent *qfree; /* unallocated event queue elements */ + unsigned long next_event_serial_num; /* inserted into next queue elt */ + int (*savedsynchandler)(); /* user synchandler when Xlib usurps */ +} Display; + +#if NeedFunctionPrototypes /* prototypes require event type definitions */ +#undef _XEVENT_ +#endif +#ifndef _XEVENT_ + +#define XMaxTransChars 4 + +/* + * Definitions of specific events. + */ +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window it is reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int keycode; /* detail */ + Bool same_screen; /* same screen flag */ + char trans_chars[XMaxTransChars]; + /* translated characters */ + int nbytes; +} XKeyEvent; +typedef XKeyEvent XKeyPressedEvent; +typedef XKeyEvent XKeyReleasedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window it is reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int button; /* detail */ + Bool same_screen; /* same screen flag */ +} XButtonEvent; +typedef XButtonEvent XButtonPressedEvent; +typedef XButtonEvent XButtonReleasedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + char is_hint; /* detail */ + Bool same_screen; /* same screen flag */ +} XMotionEvent; +typedef XMotionEvent XPointerMovedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonlinear,NotifyNonlinearVirtual + */ + Bool same_screen; /* same screen flag */ + Bool focus; /* boolean focus */ + unsigned int state; /* key or button mask */ +} XCrossingEvent; +typedef XCrossingEvent XEnterWindowEvent; +typedef XCrossingEvent XLeaveWindowEvent; + +typedef struct { + int type; /* FocusIn or FocusOut */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window of event */ + int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonlinear,NotifyNonlinearVirtual, NotifyPointer, + * NotifyPointerRoot, NotifyDetailNone + */ +} XFocusChangeEvent; +typedef XFocusChangeEvent XFocusInEvent; +typedef XFocusChangeEvent XFocusOutEvent; + +/* generated on EnterWindow and FocusIn when KeyMapState selected */ +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + char key_vector[32]; +} XKeymapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int x, y; + int width, height; + int count; /* if non-zero, at least this many more */ +} XExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; + int x, y; + int width, height; + int count; /* if non-zero, at least this many more */ + int major_code; /* core is CopyArea or CopyPlane */ + int minor_code; /* not defined in the core */ +} XGraphicsExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; + int major_code; /* core is CopyArea or CopyPlane */ + int minor_code; /* not defined in the core */ +} XNoExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int state; /* Visibility state */ +} XVisibilityEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; /* parent of the window */ + Window window; /* window id of window created */ + int x, y; /* window location */ + int width, height; /* size of window */ + int border_width; /* border width */ + Bool override_redirect; /* creation should be overridden */ +} XCreateWindowEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; +} XDestroyWindowEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Bool from_configure; +} XUnmapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Bool override_redirect; /* boolean, is override set... */ +} XMapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; +} XMapRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Window parent; + int x, y; + Bool override_redirect; +} XReparentEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int x, y; + int width, height; + int border_width; + Window above; + Bool override_redirect; +} XConfigureEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int x, y; +} XGravityEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int width, height; +} XResizeRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; + int x, y; + int width, height; + int border_width; + Window above; + int detail; /* Above, Below, TopIf, BottomIf, Opposite */ + unsigned long value_mask; +} XConfigureRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int place; /* PlaceOnTop, PlaceOnBottom */ +} XCirculateEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; + int place; /* PlaceOnTop, PlaceOnBottom */ +} XCirculateRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom atom; + Time time; + int state; /* NewValue, Deleted */ +} XPropertyEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom selection; + Time time; +} XSelectionClearEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window owner; + Window requestor; + Atom selection; + Atom target; + Atom property; + Time time; +} XSelectionRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window requestor; + Atom selection; + Atom target; + Atom property; /* ATOM or None */ + Time time; +} XSelectionEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Colormap colormap; /* COLORMAP or None */ +#if defined(__cplusplus) || defined(c_plusplus) + Bool c_new; /* C++ */ +#else + Bool new; +#endif + int state; /* ColormapInstalled, ColormapUninstalled */ +} XColormapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom message_type; + int format; + union { + char b[20]; + short s[10]; + long l[5]; + } data; +} XClientMessageEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* unused */ + int request; /* one of MappingModifier, MappingKeyboard, + MappingPointer */ + int first_keycode; /* first keycode */ + int count; /* defines range of change w. first_keycode*/ +} XMappingEvent; + +typedef struct { + int type; + Display *display; /* Display the event was read from */ + XID resourceid; /* resource id */ + unsigned long serial; /* serial number of failed request */ + unsigned char error_code; /* error code of failed request */ + unsigned char request_code; /* Major op-code of failed request */ + unsigned char minor_code; /* Minor op-code of failed request */ +} XErrorEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display;/* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ +} XAnyEvent; + +/* + * this union is defined so Xlib can always use the same sized + * event structure internally, to avoid memory fragmentation. + */ +typedef union _XEvent { + int type; /* must not be changed; first element */ + XAnyEvent xany; + XKeyEvent xkey; + XButtonEvent xbutton; + XMotionEvent xmotion; + XCrossingEvent xcrossing; + XFocusChangeEvent xfocus; + XExposeEvent xexpose; + XGraphicsExposeEvent xgraphicsexpose; + XNoExposeEvent xnoexpose; + XVisibilityEvent xvisibility; + XCreateWindowEvent xcreatewindow; + XDestroyWindowEvent xdestroywindow; + XUnmapEvent xunmap; + XMapEvent xmap; + XMapRequestEvent xmaprequest; + XReparentEvent xreparent; + XConfigureEvent xconfigure; + XGravityEvent xgravity; + XResizeRequestEvent xresizerequest; + XConfigureRequestEvent xconfigurerequest; + XCirculateEvent xcirculate; + XCirculateRequestEvent xcirculaterequest; + XPropertyEvent xproperty; + XSelectionClearEvent xselectionclear; + XSelectionRequestEvent xselectionrequest; + XSelectionEvent xselection; + XColormapEvent xcolormap; + XClientMessageEvent xclient; + XMappingEvent xmapping; + XErrorEvent xerror; + XKeymapEvent xkeymap; + long pad[24]; +} XEvent; +#endif + +#define XAllocID(dpy) ((*(dpy)->resource_alloc)((dpy))) + +/* + * per character font metric information. + */ +typedef struct { + short lbearing; /* origin to left edge of raster */ + short rbearing; /* origin to right edge of raster */ + short width; /* advance to next char's origin */ + short ascent; /* baseline to top edge of raster */ + short descent; /* baseline to bottom edge of raster */ + unsigned short attributes; /* per char flags (not predefined) */ +} XCharStruct; + +/* + * To allow arbitrary information with fonts, there are additional properties + * returned. + */ +typedef struct { + Atom name; + unsigned long card32; +} XFontProp; + +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + Font fid; /* Font id for this font */ + unsigned direction; /* hint about direction the font is painted */ + unsigned min_char_or_byte2;/* first character */ + unsigned max_char_or_byte2;/* last character */ + unsigned min_byte1; /* first row that exists */ + unsigned max_byte1; /* last row that exists */ + Bool all_chars_exist;/* flag if all characters have non-zero size*/ + unsigned default_char; /* char to print for undefined character */ + int n_properties; /* how many properties there are */ + XFontProp *properties; /* pointer to array of additional properties*/ + XCharStruct min_bounds; /* minimum bounds over all existing char*/ + XCharStruct max_bounds; /* maximum bounds over all existing char*/ + XCharStruct *per_char; /* first_char to last_char information */ + int ascent; /* log. extent above baseline for spacing */ + int descent; /* log. descent below baseline for spacing */ +} XFontStruct; + +/* + * PolyText routines take these as arguments. + */ +typedef struct { + char *chars; /* pointer to string */ + int nchars; /* number of characters */ + int delta; /* delta between strings */ + Font font; /* font to print it in, None don't change */ +} XTextItem; + +typedef struct { /* normal 16 bit characters are two bytes */ + unsigned char byte1; + unsigned char byte2; +} XChar2b; + +typedef struct { + XChar2b *chars; /* two byte characters */ + int nchars; /* number of characters */ + int delta; /* delta between strings */ + Font font; /* font to print it in, None don't change */ +} XTextItem16; + + +typedef union { Display *display; + GC gc; + Visual *visual; + Screen *screen; + ScreenFormat *pixmap_format; + XFontStruct *font; } XEDataObject; + +typedef struct { + XRectangle max_ink_extent; + XRectangle max_logical_extent; +} XFontSetExtents; + +typedef struct _XFontSet *XFontSet; + +typedef struct { + char *chars; + int nchars; + int delta; + XFontSet font_set; +} XmbTextItem; + +typedef struct { + wchar_t *chars; + int nchars; + int delta; + XFontSet font_set; +} XwcTextItem; + +typedef void (*XIMProc)(); + +typedef struct _XIM *XIM; +typedef struct _XIC *XIC; + +typedef unsigned long XIMStyle; + +typedef struct { + unsigned short count_styles; + XIMStyle *supported_styles; +} XIMStyles; + +#define XIMPreeditArea 0x0001L +#define XIMPreeditCallbacks 0x0002L +#define XIMPreeditPosition 0x0004L +#define XIMPreeditNothing 0x0008L +#define XIMPreeditNone 0x0010L +#define XIMStatusArea 0x0100L +#define XIMStatusCallbacks 0x0200L +#define XIMStatusNothing 0x0400L +#define XIMStatusNone 0x0800L + +#define XNVaNestedList "XNVaNestedList" +#define XNClientWindow "clientWindow" +#define XNInputStyle "inputStyle" +#define XNFocusWindow "focusWindow" +#define XNResourceName "resourceName" +#define XNResourceClass "resourceClass" +#define XNGeometryCallback "geometryCallback" +#define XNFilterEvents "filterEvents" +#define XNPreeditStartCallback "preeditStartCallback" +#define XNPreeditDoneCallback "preeditDoneCallback" +#define XNPreeditDrawCallback "preeditDrawCallback" +#define XNPreeditCaretCallback "preeditCaretCallback" +#define XNPreeditAttributes "preeditAttributes" +#define XNStatusStartCallback "statusStartCallback" +#define XNStatusDoneCallback "statusDoneCallback" +#define XNStatusDrawCallback "statusDrawCallback" +#define XNStatusAttributes "statusAttributes" +#define XNArea "area" +#define XNAreaNeeded "areaNeeded" +#define XNSpotLocation "spotLocation" +#define XNColormap "colorMap" +#define XNStdColormap "stdColorMap" +#define XNForeground "foreground" +#define XNBackground "background" +#define XNBackgroundPixmap "backgroundPixmap" +#define XNFontSet "fontSet" +#define XNLineSpace "lineSpace" +#define XNCursor "cursor" + +#define XBufferOverflow -1 +#define XLookupNone 1 +#define XLookupChars 2 +#define XLookupKeySym 3 +#define XLookupBoth 4 + +#if NeedFunctionPrototypes +typedef void *XVaNestedList; +#else +typedef XPointer XVaNestedList; +#endif + +typedef struct { + XPointer client_data; + XIMProc callback; +} XIMCallback; + +typedef unsigned long XIMFeedback; + +#define XIMReverse 1 +#define XIMUnderline (1<<1) +#define XIMHighlight (1<<2) +#define XIMPrimary (1<<5) +#define XIMSecondary (1<<6) +#define XIMTertiary (1<<7) + +typedef struct _XIMText { + unsigned short length; + XIMFeedback *feedback; + Bool encoding_is_wchar; + union { + char *multi_byte; + wchar_t *wide_char; + } string; +} XIMText; + +typedef struct _XIMPreeditDrawCallbackStruct { + int caret; /* Cursor offset within pre-edit string */ + int chg_first; /* Starting change position */ + int chg_length; /* Length of the change in character count */ + XIMText *text; +} XIMPreeditDrawCallbackStruct; + +typedef enum { + XIMForwardChar, XIMBackwardChar, + XIMForwardWord, XIMBackwardWord, + XIMCaretUp, XIMCaretDown, + XIMNextLine, XIMPreviousLine, + XIMLineStart, XIMLineEnd, + XIMAbsolutePosition, + XIMDontChange +} XIMCaretDirection; + +typedef enum { + XIMIsInvisible, /* Disable caret feedback */ + XIMIsPrimary, /* UI defined caret feedback */ + XIMIsSecondary /* UI defined caret feedback */ +} XIMCaretStyle; + +typedef struct _XIMPreeditCaretCallbackStruct { + int position; /* Caret offset within pre-edit string */ + XIMCaretDirection direction; /* Caret moves direction */ + XIMCaretStyle style; /* Feedback of the caret */ +} XIMPreeditCaretCallbackStruct; + +typedef enum { + XIMTextType, + XIMBitmapType +} XIMStatusDataType; + +typedef struct _XIMStatusDrawCallbackStruct { + XIMStatusDataType type; + union { + XIMText *text; + Pixmap bitmap; + } data; +} XIMStatusDrawCallbackStruct; + +typedef int (*XErrorHandler) ( /* WARNING, this type not in Xlib spec */ +#if NeedFunctionPrototypes + Display* /* display */, + XErrorEvent* /* error_event */ +#endif +); + +_XFUNCPROTOBEGIN + + + +#include "tkIntXlibDecls.h" + +_XFUNCPROTOEND + +#if defined(MAC_OSX_TK) +# undef Cursor +# undef Region +#endif + +#endif /* _XLIB_H_ */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xutil.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xutil.h new file mode 100644 index 00000000..7348e903 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/Xutil.h @@ -0,0 +1,855 @@ +/* $XConsortium: Xutil.h,v 11.73 91/07/30 16:21:37 rws Exp $ */ + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ + +#ifndef _XUTIL_H_ +#define _XUTIL_H_ + +/* You must include before including this file */ + +#if defined(MAC_OSX_TK) +# define Region XRegion +#endif + +/* + * Bitmask returned by XParseGeometry(). Each bit tells if the corresponding + * value (x, y, width, height) was found in the parsed string. + */ +#define NoValue 0x0000 +#define XValue 0x0001 +#define YValue 0x0002 +#define WidthValue 0x0004 +#define HeightValue 0x0008 +#define AllValues 0x000F +#define XNegative 0x0010 +#define YNegative 0x0020 + +/* + * new version containing base_width, base_height, and win_gravity fields; + * used with WM_NORMAL_HINTS. + */ +typedef struct { + long flags; /* marks which fields in this structure are defined */ + int x, y; /* obsolete for new window mgrs, but clients */ + int width, height; /* should set so old wm's don't mess up */ + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; + struct { + int x; /* numerator */ + int y; /* denominator */ + } min_aspect, max_aspect; + int base_width, base_height; /* added by ICCCM version 1 */ + int win_gravity; /* added by ICCCM version 1 */ +} XSizeHints; + +/* + * The next block of definitions are for window manager properties that + * clients and applications use for communication. + */ + +/* flags argument in size hints */ +#define USPosition (1L << 0) /* user specified x, y */ +#define USSize (1L << 1) /* user specified width, height */ + +#define PPosition (1L << 2) /* program specified position */ +#define PSize (1L << 3) /* program specified size */ +#define PMinSize (1L << 4) /* program specified minimum size */ +#define PMaxSize (1L << 5) /* program specified maximum size */ +#define PResizeInc (1L << 6) /* program specified resize increments */ +#define PAspect (1L << 7) /* program specified min and max aspect ratios */ +#define PBaseSize (1L << 8) /* program specified base for incrementing */ +#define PWinGravity (1L << 9) /* program specified window gravity */ + +/* obsolete */ +#define PAllHints (PPosition|PSize|PMinSize|PMaxSize|PResizeInc|PAspect) + + + +typedef struct { + long flags; /* marks which fields in this structure are defined */ + Bool input; /* does this application rely on the window manager to + get keyboard input? */ + int initial_state; /* see below */ + Pixmap icon_pixmap; /* pixmap to be used as icon */ + Window icon_window; /* window to be used as icon */ + int icon_x, icon_y; /* initial position of icon */ + Pixmap icon_mask; /* icon mask bitmap */ + XID window_group; /* id of related window group */ + /* this structure may be extended in the future */ +} XWMHints; + +/* definition for flags of XWMHints */ + +#define InputHint (1L << 0) +#define StateHint (1L << 1) +#define IconPixmapHint (1L << 2) +#define IconWindowHint (1L << 3) +#define IconPositionHint (1L << 4) +#define IconMaskHint (1L << 5) +#define WindowGroupHint (1L << 6) +#define AllHints (InputHint|StateHint|IconPixmapHint|IconWindowHint| \ +IconPositionHint|IconMaskHint|WindowGroupHint) + +/* definitions for initial window state */ +#define WithdrawnState 0 /* for windows that are not mapped */ +#define NormalState 1 /* most applications want to start this way */ +#define IconicState 3 /* application wants to start as an icon */ + +/* + * Obsolete states no longer defined by ICCCM + */ +#define DontCareState 0 /* don't know or care */ +#define ZoomState 2 /* application wants to start zoomed */ +#define InactiveState 4 /* application believes it is seldom used; */ + /* some wm's may put it on inactive menu */ + + +/* + * new structure for manipulating TEXT properties; used with WM_NAME, + * WM_ICON_NAME, WM_CLIENT_MACHINE, and WM_COMMAND. + */ +typedef struct { + unsigned char *value; /* same as Property routines */ + Atom encoding; /* prop type */ + int format; /* prop data format: 8, 16, or 32 */ + unsigned long nitems; /* number of data items in value */ +} XTextProperty; + +#define XNoMemory -1 +#define XLocaleNotSupported -2 +#define XConverterNotFound -3 + +typedef enum { + XStringStyle, /* STRING */ + XCompoundTextStyle, /* COMPOUND_TEXT */ + XTextStyle, /* text in owner's encoding (current locale)*/ + XStdICCTextStyle /* STRING, else COMPOUND_TEXT */ +} XICCEncodingStyle; + +typedef struct { + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; +} XIconSize; + +typedef struct { + char *res_name; + char *res_class; +} XClassHint; + +/* + * These macros are used to give some sugar to the image routines so that + * naive people are more comfortable with them. + */ +#define XDestroyImage(ximage) \ + ((*((ximage)->f.destroy_image))((ximage))) +#define XGetPixel(ximage, x, y) \ + ((*((ximage)->f.get_pixel))((ximage), (x), (y))) +#define XPutPixel(ximage, x, y, pixel) \ + ((*((ximage)->f.put_pixel))((ximage), (x), (y), (pixel))) +#define XSubImage(ximage, x, y, width, height) \ + ((*((ximage)->f.sub_image))((ximage), (x), (y), (width), (height))) +#define XAddPixel(ximage, value) \ + ((*((ximage)->f.add_pixel))((ximage), (value))) + +/* + * Compose sequence status structure, used in calling XLookupString. + */ +typedef struct _XComposeStatus { + XPointer compose_ptr; /* state table pointer */ + int chars_matched; /* match state */ +} XComposeStatus; + +/* + * Keysym macros, used on Keysyms to test for classes of symbols + */ +#define IsKeypadKey(keysym) \ + (((unsigned)(keysym) >= XK_KP_Space) && ((unsigned)(keysym) <= XK_KP_Equal)) + +#define IsCursorKey(keysym) \ + (((unsigned)(keysym) >= XK_Home) && ((unsigned)(keysym) < XK_Select)) + +#define IsPFKey(keysym) \ + (((unsigned)(keysym) >= XK_KP_F1) && ((unsigned)(keysym) <= XK_KP_F4)) + +#define IsFunctionKey(keysym) \ + (((unsigned)(keysym) >= XK_F1) && ((unsigned)(keysym) <= XK_F35)) + +#define IsMiscFunctionKey(keysym) \ + (((unsigned)(keysym) >= XK_Select) && ((unsigned)(keysym) <= XK_Break)) + +#define IsModifierKey(keysym) \ + ((((unsigned)(keysym) >= XK_Shift_L) && ((unsigned)(keysym) <= XK_Hyper_R)) \ + || ((unsigned)(keysym) == XK_Mode_switch) \ + || ((unsigned)(keysym) == XK_Num_Lock)) +/* + * opaque reference to Region data type + */ +typedef struct _XRegion *Region; + +/* Return values from XRectInRegion() */ + +#define RectangleOut 0 +#define RectangleIn 1 +#define RectanglePart 2 + + +/* + * Information used by the visual utility routines to find desired visual + * type from the many visuals a display may support. + */ + +typedef struct { + Visual *visual; + VisualID visualid; + int screen; + int depth; +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ */ +#else + int class; +#endif + unsigned long red_mask; + unsigned long green_mask; + unsigned long blue_mask; + int colormap_size; + int bits_per_rgb; +} XVisualInfo; + +#define VisualNoMask 0x0 +#define VisualIDMask 0x1 +#define VisualScreenMask 0x2 +#define VisualDepthMask 0x4 +#define VisualClassMask 0x8 +#define VisualRedMaskMask 0x10 +#define VisualGreenMaskMask 0x20 +#define VisualBlueMaskMask 0x40 +#define VisualColormapSizeMask 0x80 +#define VisualBitsPerRGBMask 0x100 +#define VisualAllMask 0x1FF + +/* + * This defines a window manager property that clients may use to + * share standard color maps of type RGB_COLOR_MAP: + */ +typedef struct { + Colormap colormap; + unsigned long red_max; + unsigned long red_mult; + unsigned long green_max; + unsigned long green_mult; + unsigned long blue_max; + unsigned long blue_mult; + unsigned long base_pixel; + VisualID visualid; /* added by ICCCM version 1 */ + XID killid; /* added by ICCCM version 1 */ +} XStandardColormap; + +#define ReleaseByFreeingColormap ((XID) 1L) /* for killid field above */ + + +/* + * return codes for XReadBitmapFile and XWriteBitmapFile + */ +#define BitmapSuccess 0 +#define BitmapOpenFailed 1 +#define BitmapFileInvalid 2 +#define BitmapNoMemory 3 + +/**************************************************************** + * + * Context Management + * + ****************************************************************/ + + +/* Associative lookup table return codes */ + +#define XCSUCCESS 0 /* No error. */ +#define XCNOMEM 1 /* Out of memory */ +#define XCNOENT 2 /* No entry in table */ + +typedef int XContext; + +#define XUniqueContext() ((XContext) XrmUniqueQuark()) +#define XStringToContext(string) ((XContext) XrmStringToQuark(string)) + +_XFUNCPROTOBEGIN + +/* The following declarations are alphabetized. */ + +extern XClassHint *XAllocClassHint ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XIconSize *XAllocIconSize ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XSizeHints *XAllocSizeHints ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XStandardColormap *XAllocStandardColormap ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XWMHints *XAllocWMHints ( +#if NeedFunctionPrototypes + void +#endif +); + +extern void XClipBox( +#if NeedFunctionPrototypes + Region /* r */, + XRectangle* /* rect_return */ +#endif +); + +extern Region XCreateRegion( +#if NeedFunctionPrototypes + void +#endif +); + +extern char *XDefaultString( +#if NeedFunctionPrototypes + void +#endif +); + +extern int XDeleteContext( +#if NeedFunctionPrototypes + Display* /* display */, + XID /* rid */, + XContext /* context */ +#endif +); + +extern void XDestroyRegion( +#if NeedFunctionPrototypes + Region /* r */ +#endif +); + +extern Bool XEmptyRegion( +#if NeedFunctionPrototypes + Region /* r */ +#endif +); + +extern Bool XEqualRegion( +#if NeedFunctionPrototypes + Region /* r1 */, + Region /* r2 */ +#endif +); + +extern int XFindContext( +#if NeedFunctionPrototypes + Display* /* display */, + XID /* rid */, + XContext /* context */, + XPointer* /* data_return */ +#endif +); + +extern Status XGetClassHint( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XClassHint* /* class_hints_return */ +#endif +); + +extern Status XGetIconSizes( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XIconSize** /* size_list_return */, + int* /* count_return */ +#endif +); + +extern Status XGetNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */ +#endif +); + +extern Status XGetRGBColormaps( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap** /* stdcmap_return */, + int* /* count_return */, + Atom /* property */ +#endif +); + +extern Status XGetSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + Atom /* property */ +#endif +); + +extern Status XGetStandardColormap( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap* /* colormap_return */, + Atom /* property */ +#endif +); + +extern Status XGetTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* window */, + XTextProperty* /* text_prop_return */, + Atom /* property */ +#endif +); + + +extern Status XGetWMClientMachine( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern XWMHints *XGetWMHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */ +#endif +); + +extern Status XGetWMIconName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern Status XGetWMName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern Status XGetWMNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + long* /* supplied_return */ +#endif +); + +extern Status XGetWMSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + long* /* supplied_return */, + Atom /* property */ +#endif +); + +extern Status XGetZoomHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* zhints_return */ +#endif +); + +extern void XIntersectRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +extern int XLookupString( +#if NeedFunctionPrototypes + XKeyEvent* /* event_struct */, + char* /* buffer_return */, + int /* bytes_buffer */, + KeySym* /* keysym_return */, + XComposeStatus* /* status_in_out */ +#endif +); + +extern Status XMatchVisualInfo( +#if NeedFunctionPrototypes + Display* /* display */, + int /* screen */, + int /* depth */, + int /* class */, + XVisualInfo* /* vinfo_return */ +#endif +); + +extern void XOffsetRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* dx */, + int /* dy */ +#endif +); + +extern Bool XPointInRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* x */, + int /* y */ +#endif +); + +extern Region XPolygonRegion( +#if NeedFunctionPrototypes + XPoint* /* points */, + int /* n */, + int /* fill_rule */ +#endif +); + +extern int XRectInRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */ +#endif +); + +extern int XSaveContext( +#if NeedFunctionPrototypes + Display* /* display */, + XID /* rid */, + XContext /* context */, + _Xconst char* /* data */ +#endif +); + +extern void XSetClassHint( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XClassHint* /* class_hints */ +#endif +); + +extern void XSetIconSizes( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XIconSize* /* size_list */, + int /* count */ +#endif +); + +extern void XSetNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */ +#endif +); + +extern void XSetRGBColormaps( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap* /* stdcmaps */, + int /* count */, + Atom /* property */ +#endif +); + +extern void XSetSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */, + Atom /* property */ +#endif +); + +extern void XSetStandardProperties( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + Pixmap /* icon_pixmap */, + char** /* argv */, + int /* argc */, + XSizeHints* /* hints */ +#endif +); + +extern void XSetTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */, + Atom /* property */ +#endif +); + +extern void XSetWMHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XWMHints* /* wm_hints */ +#endif +); + +extern void XSetWMIconName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +#endif +); + +extern void XSetWMName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +#endif +); + +extern void XSetWMNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */ +#endif +); + +extern void XSetWMProperties( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* window_name */, + XTextProperty* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +#endif +); + +extern void XmbSetWMProperties( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +#endif +); + +extern void XSetWMSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */, + Atom /* property */ +#endif +); + +extern void XSetRegion( +#if NeedFunctionPrototypes + Display* /* display */, + GC /* gc */, + Region /* r */ +#endif +); + +extern void XSetStandardColormap( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap* /* colormap */, + Atom /* property */ +#endif +); + +extern void XSetZoomHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* zhints */ +#endif +); + +extern void XShrinkRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* dx */, + int /* dy */ +#endif +); + +extern void XSubtractRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +extern int XmbTextListToTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + char** /* list */, + int /* count */, + XICCEncodingStyle /* style */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern int XwcTextListToTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + wchar_t** /* list */, + int /* count */, + XICCEncodingStyle /* style */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern void XwcFreeStringList( +#if NeedFunctionPrototypes + wchar_t** /* list */ +#endif +); + +extern Status XTextPropertyToStringList( +#if NeedFunctionPrototypes + XTextProperty* /* text_prop */, + char*** /* list_return */, + int* /* count_return */ +#endif +); + +extern int XmbTextPropertyToTextList( +#if NeedFunctionPrototypes + Display* /* display */, + XTextProperty* /* text_prop */, + char*** /* list_return */, + int* /* count_return */ +#endif +); + +extern int XwcTextPropertyToTextList( +#if NeedFunctionPrototypes + Display* /* display */, + XTextProperty* /* text_prop */, + wchar_t*** /* list_return */, + int* /* count_return */ +#endif +); + +extern void XUnionRectWithRegion( +#if NeedFunctionPrototypes + XRectangle* /* rectangle */, + Region /* src_region */, + Region /* dest_region_return */ +#endif +); + +extern void XUnionRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +extern int XWMGeometry( +#if NeedFunctionPrototypes + Display* /* display */, + int /* screen_number */, + _Xconst char* /* user_geometry */, + _Xconst char* /* default_geometry */, + unsigned int /* border_width */, + XSizeHints* /* hints */, + int* /* x_return */, + int* /* y_return */, + int* /* width_return */, + int* /* height_return */, + int* /* gravity_return */ +#endif +); + +extern void XXorRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +_XFUNCPROTOEND + +#if defined(MAC_OSX_TK) +# undef Region +#endif + +#endif /* _XUTIL_H_ */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/cursorfont.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/cursorfont.h new file mode 100644 index 00000000..617274fa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/cursorfont.h @@ -0,0 +1,79 @@ +/* $XConsortium: cursorfont.h,v 1.2 88/09/06 16:44:27 jim Exp $ */ +#define XC_num_glyphs 154 +#define XC_X_cursor 0 +#define XC_arrow 2 +#define XC_based_arrow_down 4 +#define XC_based_arrow_up 6 +#define XC_boat 8 +#define XC_bogosity 10 +#define XC_bottom_left_corner 12 +#define XC_bottom_right_corner 14 +#define XC_bottom_side 16 +#define XC_bottom_tee 18 +#define XC_box_spiral 20 +#define XC_center_ptr 22 +#define XC_circle 24 +#define XC_clock 26 +#define XC_coffee_mug 28 +#define XC_cross 30 +#define XC_cross_reverse 32 +#define XC_crosshair 34 +#define XC_diamond_cross 36 +#define XC_dot 38 +#define XC_dotbox 40 +#define XC_double_arrow 42 +#define XC_draft_large 44 +#define XC_draft_small 46 +#define XC_draped_box 48 +#define XC_exchange 50 +#define XC_fleur 52 +#define XC_gobbler 54 +#define XC_gumby 56 +#define XC_hand1 58 +#define XC_hand2 60 +#define XC_heart 62 +#define XC_icon 64 +#define XC_iron_cross 66 +#define XC_left_ptr 68 +#define XC_left_side 70 +#define XC_left_tee 72 +#define XC_leftbutton 74 +#define XC_ll_angle 76 +#define XC_lr_angle 78 +#define XC_man 80 +#define XC_middlebutton 82 +#define XC_mouse 84 +#define XC_pencil 86 +#define XC_pirate 88 +#define XC_plus 90 +#define XC_question_arrow 92 +#define XC_right_ptr 94 +#define XC_right_side 96 +#define XC_right_tee 98 +#define XC_rightbutton 100 +#define XC_rtl_logo 102 +#define XC_sailboat 104 +#define XC_sb_down_arrow 106 +#define XC_sb_h_double_arrow 108 +#define XC_sb_left_arrow 110 +#define XC_sb_right_arrow 112 +#define XC_sb_up_arrow 114 +#define XC_sb_v_double_arrow 116 +#define XC_shuttle 118 +#define XC_sizing 120 +#define XC_spider 122 +#define XC_spraycan 124 +#define XC_star 126 +#define XC_target 128 +#define XC_tcross 130 +#define XC_top_left_arrow 132 +#define XC_top_left_corner 134 +#define XC_top_right_corner 136 +#define XC_top_side 138 +#define XC_top_tee 140 +#define XC_trek 142 +#define XC_ul_angle 144 +#define XC_umbrella 146 +#define XC_ur_angle 148 +#define XC_watch 150 +#define XC_xterm 152 diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/keysym.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/keysym.h new file mode 100644 index 00000000..a8f14089 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/keysym.h @@ -0,0 +1,35 @@ +/* $XConsortium: keysym.h,v 1.13 91/03/13 20:09:49 rws Exp $ */ + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ + +/* default keysyms */ +#define XK_MISCELLANY +#define XK_LATIN1 +#define XK_LATIN2 +#define XK_LATIN3 +#define XK_LATIN4 +#define XK_GREEK + +#include diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/keysymdef.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/keysymdef.h new file mode 100644 index 00000000..b22d41b3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/keysymdef.h @@ -0,0 +1,1169 @@ +/* $XConsortium: keysymdef.h,v 1.15 93/04/02 10:57:36 rws Exp $ */ + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ + +#define XK_VoidSymbol 0xFFFFFF /* void symbol */ + +#ifdef XK_MISCELLANY +/* + * TTY Functions, cleverly chosen to map to ascii, for convenience of + * programming, but could have been arbitrary (at the cost of lookup + * tables in client code. + */ + +#define XK_BackSpace 0xFF08 /* back space, back char */ +#define XK_Tab 0xFF09 +#define XK_Linefeed 0xFF0A /* Linefeed, LF */ +#define XK_Clear 0xFF0B +#define XK_Return 0xFF0D /* Return, enter */ +#define XK_Pause 0xFF13 /* Pause, hold */ +#define XK_Scroll_Lock 0xFF14 +#define XK_Sys_Req 0xFF15 +#define XK_Escape 0xFF1B +#define XK_Delete 0xFFFF /* Delete, rubout */ + + + +/* International & multi-key character composition */ + +#define XK_Multi_key 0xFF20 /* Multi-key character compose */ + +/* Japanese keyboard support */ + +#define XK_Kanji 0xFF21 /* Kanji, Kanji convert */ +#define XK_Muhenkan 0xFF22 /* Cancel Conversion */ +#define XK_Henkan_Mode 0xFF23 /* Start/Stop Conversion */ +#define XK_Henkan 0xFF23 /* Alias for Henkan_Mode */ +#define XK_Romaji 0xFF24 /* to Romaji */ +#define XK_Hiragana 0xFF25 /* to Hiragana */ +#define XK_Katakana 0xFF26 /* to Katakana */ +#define XK_Hiragana_Katakana 0xFF27 /* Hiragana/Katakana toggle */ +#define XK_Zenkaku 0xFF28 /* to Zenkaku */ +#define XK_Hankaku 0xFF29 /* to Hankaku */ +#define XK_Zenkaku_Hankaku 0xFF2A /* Zenkaku/Hankaku toggle */ +#define XK_Touroku 0xFF2B /* Add to Dictionary */ +#define XK_Massyo 0xFF2C /* Delete from Dictionary */ +#define XK_Kana_Lock 0xFF2D /* Kana Lock */ +#define XK_Kana_Shift 0xFF2E /* Kana Shift */ +#define XK_Eisu_Shift 0xFF2F /* Alphanumeric Shift */ +#define XK_Eisu_toggle 0xFF30 /* Alphanumeric toggle */ + +/* Cursor control & motion */ + +#define XK_Home 0xFF50 +#define XK_Left 0xFF51 /* Move left, left arrow */ +#define XK_Up 0xFF52 /* Move up, up arrow */ +#define XK_Right 0xFF53 /* Move right, right arrow */ +#define XK_Down 0xFF54 /* Move down, down arrow */ +#define XK_Prior 0xFF55 /* Prior, previous */ +#define XK_Page_Up 0xFF55 +#define XK_Next 0xFF56 /* Next */ +#define XK_Page_Down 0xFF56 +#define XK_End 0xFF57 /* EOL */ +#define XK_Begin 0xFF58 /* BOL */ + +/* Special Windows keyboard keys */ + +#define XK_Win_L 0xFF5B /* Left-hand Windows */ +#define XK_Win_R 0xFF5C /* Right-hand Windows */ +#define XK_App 0xFF5D /* Menu key */ + +/* Misc Functions */ + +#define XK_Select 0xFF60 /* Select, mark */ +#define XK_Print 0xFF61 +#define XK_Execute 0xFF62 /* Execute, run, do */ +#define XK_Insert 0xFF63 /* Insert, insert here */ +#define XK_Undo 0xFF65 /* Undo, oops */ +#define XK_Redo 0xFF66 /* redo, again */ +#define XK_Menu 0xFF67 +#define XK_Find 0xFF68 /* Find, search */ +#define XK_Cancel 0xFF69 /* Cancel, stop, abort, exit */ +#define XK_Help 0xFF6A /* Help, ? */ +#define XK_Break 0xFF6B +#define XK_Mode_switch 0xFF7E /* Character set switch */ +#define XK_script_switch 0xFF7E /* Alias for mode_switch */ +#define XK_Num_Lock 0xFF7F + +/* Keypad Functions, keypad numbers cleverly chosen to map to ascii */ + +#define XK_KP_Space 0xFF80 /* space */ +#define XK_KP_Tab 0xFF89 +#define XK_KP_Enter 0xFF8D /* enter */ +#define XK_KP_F1 0xFF91 /* PF1, KP_A, ... */ +#define XK_KP_F2 0xFF92 +#define XK_KP_F3 0xFF93 +#define XK_KP_F4 0xFF94 +#define XK_KP_Home 0xFF95 +#define XK_KP_Left 0xFF96 +#define XK_KP_Up 0xFF97 +#define XK_KP_Right 0xFF98 +#define XK_KP_Down 0xFF99 +#define XK_KP_Prior 0xFF9A +#define XK_KP_Page_Up 0xFF9A +#define XK_KP_Next 0xFF9B +#define XK_KP_Page_Down 0xFF9B +#define XK_KP_End 0xFF9C +#define XK_KP_Begin 0xFF9D +#define XK_KP_Insert 0xFF9E +#define XK_KP_Delete 0xFF9F +#define XK_KP_Equal 0xFFBD /* equals */ +#define XK_KP_Multiply 0xFFAA +#define XK_KP_Add 0xFFAB +#define XK_KP_Separator 0xFFAC /* separator, often comma */ +#define XK_KP_Subtract 0xFFAD +#define XK_KP_Decimal 0xFFAE +#define XK_KP_Divide 0xFFAF + +#define XK_KP_0 0xFFB0 +#define XK_KP_1 0xFFB1 +#define XK_KP_2 0xFFB2 +#define XK_KP_3 0xFFB3 +#define XK_KP_4 0xFFB4 +#define XK_KP_5 0xFFB5 +#define XK_KP_6 0xFFB6 +#define XK_KP_7 0xFFB7 +#define XK_KP_8 0xFFB8 +#define XK_KP_9 0xFFB9 + + + +/* + * Auxilliary Functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufactures have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + +#define XK_F1 0xFFBE +#define XK_F2 0xFFBF +#define XK_F3 0xFFC0 +#define XK_F4 0xFFC1 +#define XK_F5 0xFFC2 +#define XK_F6 0xFFC3 +#define XK_F7 0xFFC4 +#define XK_F8 0xFFC5 +#define XK_F9 0xFFC6 +#define XK_F10 0xFFC7 +#define XK_F11 0xFFC8 +#define XK_L1 0xFFC8 +#define XK_F12 0xFFC9 +#define XK_L2 0xFFC9 +#define XK_F13 0xFFCA +#define XK_L3 0xFFCA +#define XK_F14 0xFFCB +#define XK_L4 0xFFCB +#define XK_F15 0xFFCC +#define XK_L5 0xFFCC +#define XK_F16 0xFFCD +#define XK_L6 0xFFCD +#define XK_F17 0xFFCE +#define XK_L7 0xFFCE +#define XK_F18 0xFFCF +#define XK_L8 0xFFCF +#define XK_F19 0xFFD0 +#define XK_L9 0xFFD0 +#define XK_F20 0xFFD1 +#define XK_L10 0xFFD1 +#define XK_F21 0xFFD2 +#define XK_R1 0xFFD2 +#define XK_F22 0xFFD3 +#define XK_R2 0xFFD3 +#define XK_F23 0xFFD4 +#define XK_R3 0xFFD4 +#define XK_F24 0xFFD5 +#define XK_R4 0xFFD5 +#define XK_F25 0xFFD6 +#define XK_R5 0xFFD6 +#define XK_F26 0xFFD7 +#define XK_R6 0xFFD7 +#define XK_F27 0xFFD8 +#define XK_R7 0xFFD8 +#define XK_F28 0xFFD9 +#define XK_R8 0xFFD9 +#define XK_F29 0xFFDA +#define XK_R9 0xFFDA +#define XK_F30 0xFFDB +#define XK_R10 0xFFDB +#define XK_F31 0xFFDC +#define XK_R11 0xFFDC +#define XK_F32 0xFFDD +#define XK_R12 0xFFDD +#define XK_F33 0xFFDE +#define XK_R13 0xFFDE +#define XK_F34 0xFFDF +#define XK_R14 0xFFDF +#define XK_F35 0xFFE0 +#define XK_R15 0xFFE0 + +/* Modifiers */ + +#define XK_Shift_L 0xFFE1 /* Left shift */ +#define XK_Shift_R 0xFFE2 /* Right shift */ +#define XK_Control_L 0xFFE3 /* Left control */ +#define XK_Control_R 0xFFE4 /* Right control */ +#define XK_Caps_Lock 0xFFE5 /* Caps lock */ +#define XK_Shift_Lock 0xFFE6 /* Shift lock */ + +#define XK_Meta_L 0xFFE7 /* Left meta */ +#define XK_Meta_R 0xFFE8 /* Right meta */ +#define XK_Alt_L 0xFFE9 /* Left alt */ +#define XK_Alt_R 0xFFEA /* Right alt */ +#define XK_Super_L 0xFFEB /* Left super */ +#define XK_Super_R 0xFFEC /* Right super */ +#define XK_Hyper_L 0xFFED /* Left hyper */ +#define XK_Hyper_R 0xFFEE /* Right hyper */ +#endif /* XK_MISCELLANY */ + +/* + * Latin 1 + * Byte 3 = 0 + */ +#ifdef XK_LATIN1 +#define XK_space 0x020 +#define XK_exclam 0x021 +#define XK_quotedbl 0x022 +#define XK_numbersign 0x023 +#define XK_dollar 0x024 +#define XK_percent 0x025 +#define XK_ampersand 0x026 +#define XK_apostrophe 0x027 +#define XK_quoteright 0x027 /* deprecated */ +#define XK_parenleft 0x028 +#define XK_parenright 0x029 +#define XK_asterisk 0x02a +#define XK_plus 0x02b +#define XK_comma 0x02c +#define XK_minus 0x02d +#define XK_period 0x02e +#define XK_slash 0x02f +#define XK_0 0x030 +#define XK_1 0x031 +#define XK_2 0x032 +#define XK_3 0x033 +#define XK_4 0x034 +#define XK_5 0x035 +#define XK_6 0x036 +#define XK_7 0x037 +#define XK_8 0x038 +#define XK_9 0x039 +#define XK_colon 0x03a +#define XK_semicolon 0x03b +#define XK_less 0x03c +#define XK_equal 0x03d +#define XK_greater 0x03e +#define XK_question 0x03f +#define XK_at 0x040 +#define XK_A 0x041 +#define XK_B 0x042 +#define XK_C 0x043 +#define XK_D 0x044 +#define XK_E 0x045 +#define XK_F 0x046 +#define XK_G 0x047 +#define XK_H 0x048 +#define XK_I 0x049 +#define XK_J 0x04a +#define XK_K 0x04b +#define XK_L 0x04c +#define XK_M 0x04d +#define XK_N 0x04e +#define XK_O 0x04f +#define XK_P 0x050 +#define XK_Q 0x051 +#define XK_R 0x052 +#define XK_S 0x053 +#define XK_T 0x054 +#define XK_U 0x055 +#define XK_V 0x056 +#define XK_W 0x057 +#define XK_X 0x058 +#define XK_Y 0x059 +#define XK_Z 0x05a +#define XK_bracketleft 0x05b +#define XK_backslash 0x05c +#define XK_bracketright 0x05d +#define XK_asciicircum 0x05e +#define XK_underscore 0x05f +#define XK_grave 0x060 +#define XK_quoteleft 0x060 /* deprecated */ +#define XK_a 0x061 +#define XK_b 0x062 +#define XK_c 0x063 +#define XK_d 0x064 +#define XK_e 0x065 +#define XK_f 0x066 +#define XK_g 0x067 +#define XK_h 0x068 +#define XK_i 0x069 +#define XK_j 0x06a +#define XK_k 0x06b +#define XK_l 0x06c +#define XK_m 0x06d +#define XK_n 0x06e +#define XK_o 0x06f +#define XK_p 0x070 +#define XK_q 0x071 +#define XK_r 0x072 +#define XK_s 0x073 +#define XK_t 0x074 +#define XK_u 0x075 +#define XK_v 0x076 +#define XK_w 0x077 +#define XK_x 0x078 +#define XK_y 0x079 +#define XK_z 0x07a +#define XK_braceleft 0x07b +#define XK_bar 0x07c +#define XK_braceright 0x07d +#define XK_asciitilde 0x07e + +#define XK_nobreakspace 0x0a0 +#define XK_exclamdown 0x0a1 +#define XK_cent 0x0a2 +#define XK_sterling 0x0a3 +#define XK_currency 0x0a4 +#define XK_yen 0x0a5 +#define XK_brokenbar 0x0a6 +#define XK_section 0x0a7 +#define XK_diaeresis 0x0a8 +#define XK_copyright 0x0a9 +#define XK_ordfeminine 0x0aa +#define XK_guillemotleft 0x0ab /* left angle quotation mark */ +#define XK_notsign 0x0ac +#define XK_hyphen 0x0ad +#define XK_registered 0x0ae +#define XK_macron 0x0af +#define XK_degree 0x0b0 +#define XK_plusminus 0x0b1 +#define XK_twosuperior 0x0b2 +#define XK_threesuperior 0x0b3 +#define XK_acute 0x0b4 +#define XK_mu 0x0b5 +#define XK_paragraph 0x0b6 +#define XK_periodcentered 0x0b7 +#define XK_cedilla 0x0b8 +#define XK_onesuperior 0x0b9 +#define XK_masculine 0x0ba +#define XK_guillemotright 0x0bb /* right angle quotation mark */ +#define XK_onequarter 0x0bc +#define XK_onehalf 0x0bd +#define XK_threequarters 0x0be +#define XK_questiondown 0x0bf +#define XK_Agrave 0x0c0 +#define XK_Aacute 0x0c1 +#define XK_Acircumflex 0x0c2 +#define XK_Atilde 0x0c3 +#define XK_Adiaeresis 0x0c4 +#define XK_Aring 0x0c5 +#define XK_AE 0x0c6 +#define XK_Ccedilla 0x0c7 +#define XK_Egrave 0x0c8 +#define XK_Eacute 0x0c9 +#define XK_Ecircumflex 0x0ca +#define XK_Ediaeresis 0x0cb +#define XK_Igrave 0x0cc +#define XK_Iacute 0x0cd +#define XK_Icircumflex 0x0ce +#define XK_Idiaeresis 0x0cf +#define XK_ETH 0x0d0 +#define XK_Eth 0x0d0 /* deprecated */ +#define XK_Ntilde 0x0d1 +#define XK_Ograve 0x0d2 +#define XK_Oacute 0x0d3 +#define XK_Ocircumflex 0x0d4 +#define XK_Otilde 0x0d5 +#define XK_Odiaeresis 0x0d6 +#define XK_multiply 0x0d7 +#define XK_Ooblique 0x0d8 +#define XK_Ugrave 0x0d9 +#define XK_Uacute 0x0da +#define XK_Ucircumflex 0x0db +#define XK_Udiaeresis 0x0dc +#define XK_Yacute 0x0dd +#define XK_THORN 0x0de +#define XK_Thorn 0x0de /* deprecated */ +#define XK_ssharp 0x0df +#define XK_agrave 0x0e0 +#define XK_aacute 0x0e1 +#define XK_acircumflex 0x0e2 +#define XK_atilde 0x0e3 +#define XK_adiaeresis 0x0e4 +#define XK_aring 0x0e5 +#define XK_ae 0x0e6 +#define XK_ccedilla 0x0e7 +#define XK_egrave 0x0e8 +#define XK_eacute 0x0e9 +#define XK_ecircumflex 0x0ea +#define XK_ediaeresis 0x0eb +#define XK_igrave 0x0ec +#define XK_iacute 0x0ed +#define XK_icircumflex 0x0ee +#define XK_idiaeresis 0x0ef +#define XK_eth 0x0f0 +#define XK_ntilde 0x0f1 +#define XK_ograve 0x0f2 +#define XK_oacute 0x0f3 +#define XK_ocircumflex 0x0f4 +#define XK_otilde 0x0f5 +#define XK_odiaeresis 0x0f6 +#define XK_division 0x0f7 +#define XK_oslash 0x0f8 +#define XK_ugrave 0x0f9 +#define XK_uacute 0x0fa +#define XK_ucircumflex 0x0fb +#define XK_udiaeresis 0x0fc +#define XK_yacute 0x0fd +#define XK_thorn 0x0fe +#define XK_ydiaeresis 0x0ff +#endif /* XK_LATIN1 */ + +/* + * Latin 2 + * Byte 3 = 1 + */ + +#ifdef XK_LATIN2 +#define XK_Aogonek 0x1a1 +#define XK_breve 0x1a2 +#define XK_Lstroke 0x1a3 +#define XK_Lcaron 0x1a5 +#define XK_Sacute 0x1a6 +#define XK_Scaron 0x1a9 +#define XK_Scedilla 0x1aa +#define XK_Tcaron 0x1ab +#define XK_Zacute 0x1ac +#define XK_Zcaron 0x1ae +#define XK_Zabovedot 0x1af +#define XK_aogonek 0x1b1 +#define XK_ogonek 0x1b2 +#define XK_lstroke 0x1b3 +#define XK_lcaron 0x1b5 +#define XK_sacute 0x1b6 +#define XK_caron 0x1b7 +#define XK_scaron 0x1b9 +#define XK_scedilla 0x1ba +#define XK_tcaron 0x1bb +#define XK_zacute 0x1bc +#define XK_doubleacute 0x1bd +#define XK_zcaron 0x1be +#define XK_zabovedot 0x1bf +#define XK_Racute 0x1c0 +#define XK_Abreve 0x1c3 +#define XK_Lacute 0x1c5 +#define XK_Cacute 0x1c6 +#define XK_Ccaron 0x1c8 +#define XK_Eogonek 0x1ca +#define XK_Ecaron 0x1cc +#define XK_Dcaron 0x1cf +#define XK_Dstroke 0x1d0 +#define XK_Nacute 0x1d1 +#define XK_Ncaron 0x1d2 +#define XK_Odoubleacute 0x1d5 +#define XK_Rcaron 0x1d8 +#define XK_Uring 0x1d9 +#define XK_Udoubleacute 0x1db +#define XK_Tcedilla 0x1de +#define XK_racute 0x1e0 +#define XK_abreve 0x1e3 +#define XK_lacute 0x1e5 +#define XK_cacute 0x1e6 +#define XK_ccaron 0x1e8 +#define XK_eogonek 0x1ea +#define XK_ecaron 0x1ec +#define XK_dcaron 0x1ef +#define XK_dstroke 0x1f0 +#define XK_nacute 0x1f1 +#define XK_ncaron 0x1f2 +#define XK_odoubleacute 0x1f5 +#define XK_udoubleacute 0x1fb +#define XK_rcaron 0x1f8 +#define XK_uring 0x1f9 +#define XK_tcedilla 0x1fe +#define XK_abovedot 0x1ff +#endif /* XK_LATIN2 */ + +/* + * Latin 3 + * Byte 3 = 2 + */ + +#ifdef XK_LATIN3 +#define XK_Hstroke 0x2a1 +#define XK_Hcircumflex 0x2a6 +#define XK_Iabovedot 0x2a9 +#define XK_Gbreve 0x2ab +#define XK_Jcircumflex 0x2ac +#define XK_hstroke 0x2b1 +#define XK_hcircumflex 0x2b6 +#define XK_idotless 0x2b9 +#define XK_gbreve 0x2bb +#define XK_jcircumflex 0x2bc +#define XK_Cabovedot 0x2c5 +#define XK_Ccircumflex 0x2c6 +#define XK_Gabovedot 0x2d5 +#define XK_Gcircumflex 0x2d8 +#define XK_Ubreve 0x2dd +#define XK_Scircumflex 0x2de +#define XK_cabovedot 0x2e5 +#define XK_ccircumflex 0x2e6 +#define XK_gabovedot 0x2f5 +#define XK_gcircumflex 0x2f8 +#define XK_ubreve 0x2fd +#define XK_scircumflex 0x2fe +#endif /* XK_LATIN3 */ + + +/* + * Latin 4 + * Byte 3 = 3 + */ + +#ifdef XK_LATIN4 +#define XK_kra 0x3a2 +#define XK_kappa 0x3a2 /* deprecated */ +#define XK_Rcedilla 0x3a3 +#define XK_Itilde 0x3a5 +#define XK_Lcedilla 0x3a6 +#define XK_Emacron 0x3aa +#define XK_Gcedilla 0x3ab +#define XK_Tslash 0x3ac +#define XK_rcedilla 0x3b3 +#define XK_itilde 0x3b5 +#define XK_lcedilla 0x3b6 +#define XK_emacron 0x3ba +#define XK_gcedilla 0x3bb +#define XK_tslash 0x3bc +#define XK_ENG 0x3bd +#define XK_eng 0x3bf +#define XK_Amacron 0x3c0 +#define XK_Iogonek 0x3c7 +#define XK_Eabovedot 0x3cc +#define XK_Imacron 0x3cf +#define XK_Ncedilla 0x3d1 +#define XK_Omacron 0x3d2 +#define XK_Kcedilla 0x3d3 +#define XK_Uogonek 0x3d9 +#define XK_Utilde 0x3dd +#define XK_Umacron 0x3de +#define XK_amacron 0x3e0 +#define XK_iogonek 0x3e7 +#define XK_eabovedot 0x3ec +#define XK_imacron 0x3ef +#define XK_ncedilla 0x3f1 +#define XK_omacron 0x3f2 +#define XK_kcedilla 0x3f3 +#define XK_uogonek 0x3f9 +#define XK_utilde 0x3fd +#define XK_umacron 0x3fe +#endif /* XK_LATIN4 */ + +/* + * Katakana + * Byte 3 = 4 + */ + +#ifdef XK_KATAKANA +#define XK_overline 0x47e +#define XK_kana_fullstop 0x4a1 +#define XK_kana_openingbracket 0x4a2 +#define XK_kana_closingbracket 0x4a3 +#define XK_kana_comma 0x4a4 +#define XK_kana_conjunctive 0x4a5 +#define XK_kana_middledot 0x4a5 /* deprecated */ +#define XK_kana_WO 0x4a6 +#define XK_kana_a 0x4a7 +#define XK_kana_i 0x4a8 +#define XK_kana_u 0x4a9 +#define XK_kana_e 0x4aa +#define XK_kana_o 0x4ab +#define XK_kana_ya 0x4ac +#define XK_kana_yu 0x4ad +#define XK_kana_yo 0x4ae +#define XK_kana_tsu 0x4af +#define XK_kana_tu 0x4af /* deprecated */ +#define XK_prolongedsound 0x4b0 +#define XK_kana_A 0x4b1 +#define XK_kana_I 0x4b2 +#define XK_kana_U 0x4b3 +#define XK_kana_E 0x4b4 +#define XK_kana_O 0x4b5 +#define XK_kana_KA 0x4b6 +#define XK_kana_KI 0x4b7 +#define XK_kana_KU 0x4b8 +#define XK_kana_KE 0x4b9 +#define XK_kana_KO 0x4ba +#define XK_kana_SA 0x4bb +#define XK_kana_SHI 0x4bc +#define XK_kana_SU 0x4bd +#define XK_kana_SE 0x4be +#define XK_kana_SO 0x4bf +#define XK_kana_TA 0x4c0 +#define XK_kana_CHI 0x4c1 +#define XK_kana_TI 0x4c1 /* deprecated */ +#define XK_kana_TSU 0x4c2 +#define XK_kana_TU 0x4c2 /* deprecated */ +#define XK_kana_TE 0x4c3 +#define XK_kana_TO 0x4c4 +#define XK_kana_NA 0x4c5 +#define XK_kana_NI 0x4c6 +#define XK_kana_NU 0x4c7 +#define XK_kana_NE 0x4c8 +#define XK_kana_NO 0x4c9 +#define XK_kana_HA 0x4ca +#define XK_kana_HI 0x4cb +#define XK_kana_FU 0x4cc +#define XK_kana_HU 0x4cc /* deprecated */ +#define XK_kana_HE 0x4cd +#define XK_kana_HO 0x4ce +#define XK_kana_MA 0x4cf +#define XK_kana_MI 0x4d0 +#define XK_kana_MU 0x4d1 +#define XK_kana_ME 0x4d2 +#define XK_kana_MO 0x4d3 +#define XK_kana_YA 0x4d4 +#define XK_kana_YU 0x4d5 +#define XK_kana_YO 0x4d6 +#define XK_kana_RA 0x4d7 +#define XK_kana_RI 0x4d8 +#define XK_kana_RU 0x4d9 +#define XK_kana_RE 0x4da +#define XK_kana_RO 0x4db +#define XK_kana_WA 0x4dc +#define XK_kana_N 0x4dd +#define XK_voicedsound 0x4de +#define XK_semivoicedsound 0x4df +#define XK_kana_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_KATAKANA */ + +/* + * Arabic + * Byte 3 = 5 + */ + +#ifdef XK_ARABIC +#define XK_Arabic_comma 0x5ac +#define XK_Arabic_semicolon 0x5bb +#define XK_Arabic_question_mark 0x5bf +#define XK_Arabic_hamza 0x5c1 +#define XK_Arabic_maddaonalef 0x5c2 +#define XK_Arabic_hamzaonalef 0x5c3 +#define XK_Arabic_hamzaonwaw 0x5c4 +#define XK_Arabic_hamzaunderalef 0x5c5 +#define XK_Arabic_hamzaonyeh 0x5c6 +#define XK_Arabic_alef 0x5c7 +#define XK_Arabic_beh 0x5c8 +#define XK_Arabic_tehmarbuta 0x5c9 +#define XK_Arabic_teh 0x5ca +#define XK_Arabic_theh 0x5cb +#define XK_Arabic_jeem 0x5cc +#define XK_Arabic_hah 0x5cd +#define XK_Arabic_khah 0x5ce +#define XK_Arabic_dal 0x5cf +#define XK_Arabic_thal 0x5d0 +#define XK_Arabic_ra 0x5d1 +#define XK_Arabic_zain 0x5d2 +#define XK_Arabic_seen 0x5d3 +#define XK_Arabic_sheen 0x5d4 +#define XK_Arabic_sad 0x5d5 +#define XK_Arabic_dad 0x5d6 +#define XK_Arabic_tah 0x5d7 +#define XK_Arabic_zah 0x5d8 +#define XK_Arabic_ain 0x5d9 +#define XK_Arabic_ghain 0x5da +#define XK_Arabic_tatweel 0x5e0 +#define XK_Arabic_feh 0x5e1 +#define XK_Arabic_qaf 0x5e2 +#define XK_Arabic_kaf 0x5e3 +#define XK_Arabic_lam 0x5e4 +#define XK_Arabic_meem 0x5e5 +#define XK_Arabic_noon 0x5e6 +#define XK_Arabic_ha 0x5e7 +#define XK_Arabic_heh 0x5e7 /* deprecated */ +#define XK_Arabic_waw 0x5e8 +#define XK_Arabic_alefmaksura 0x5e9 +#define XK_Arabic_yeh 0x5ea +#define XK_Arabic_fathatan 0x5eb +#define XK_Arabic_dammatan 0x5ec +#define XK_Arabic_kasratan 0x5ed +#define XK_Arabic_fatha 0x5ee +#define XK_Arabic_damma 0x5ef +#define XK_Arabic_kasra 0x5f0 +#define XK_Arabic_shadda 0x5f1 +#define XK_Arabic_sukun 0x5f2 +#define XK_Arabic_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_ARABIC */ + +/* + * Cyrillic + * Byte 3 = 6 + */ +#ifdef XK_CYRILLIC +#define XK_Serbian_dje 0x6a1 +#define XK_Macedonia_gje 0x6a2 +#define XK_Cyrillic_io 0x6a3 +#define XK_Ukrainian_ie 0x6a4 +#define XK_Ukranian_je 0x6a4 /* deprecated */ +#define XK_Macedonia_dse 0x6a5 +#define XK_Ukrainian_i 0x6a6 +#define XK_Ukranian_i 0x6a6 /* deprecated */ +#define XK_Ukrainian_yi 0x6a7 +#define XK_Ukranian_yi 0x6a7 /* deprecated */ +#define XK_Cyrillic_je 0x6a8 +#define XK_Serbian_je 0x6a8 /* deprecated */ +#define XK_Cyrillic_lje 0x6a9 +#define XK_Serbian_lje 0x6a9 /* deprecated */ +#define XK_Cyrillic_nje 0x6aa +#define XK_Serbian_nje 0x6aa /* deprecated */ +#define XK_Serbian_tshe 0x6ab +#define XK_Macedonia_kje 0x6ac +#define XK_Byelorussian_shortu 0x6ae +#define XK_Cyrillic_dzhe 0x6af +#define XK_Serbian_dze 0x6af /* deprecated */ +#define XK_numerosign 0x6b0 +#define XK_Serbian_DJE 0x6b1 +#define XK_Macedonia_GJE 0x6b2 +#define XK_Cyrillic_IO 0x6b3 +#define XK_Ukrainian_IE 0x6b4 +#define XK_Ukranian_JE 0x6b4 /* deprecated */ +#define XK_Macedonia_DSE 0x6b5 +#define XK_Ukrainian_I 0x6b6 +#define XK_Ukranian_I 0x6b6 /* deprecated */ +#define XK_Ukrainian_YI 0x6b7 +#define XK_Ukranian_YI 0x6b7 /* deprecated */ +#define XK_Cyrillic_JE 0x6b8 +#define XK_Serbian_JE 0x6b8 /* deprecated */ +#define XK_Cyrillic_LJE 0x6b9 +#define XK_Serbian_LJE 0x6b9 /* deprecated */ +#define XK_Cyrillic_NJE 0x6ba +#define XK_Serbian_NJE 0x6ba /* deprecated */ +#define XK_Serbian_TSHE 0x6bb +#define XK_Macedonia_KJE 0x6bc +#define XK_Byelorussian_SHORTU 0x6be +#define XK_Cyrillic_DZHE 0x6bf +#define XK_Serbian_DZE 0x6bf /* deprecated */ +#define XK_Cyrillic_yu 0x6c0 +#define XK_Cyrillic_a 0x6c1 +#define XK_Cyrillic_be 0x6c2 +#define XK_Cyrillic_tse 0x6c3 +#define XK_Cyrillic_de 0x6c4 +#define XK_Cyrillic_ie 0x6c5 +#define XK_Cyrillic_ef 0x6c6 +#define XK_Cyrillic_ghe 0x6c7 +#define XK_Cyrillic_ha 0x6c8 +#define XK_Cyrillic_i 0x6c9 +#define XK_Cyrillic_shorti 0x6ca +#define XK_Cyrillic_ka 0x6cb +#define XK_Cyrillic_el 0x6cc +#define XK_Cyrillic_em 0x6cd +#define XK_Cyrillic_en 0x6ce +#define XK_Cyrillic_o 0x6cf +#define XK_Cyrillic_pe 0x6d0 +#define XK_Cyrillic_ya 0x6d1 +#define XK_Cyrillic_er 0x6d2 +#define XK_Cyrillic_es 0x6d3 +#define XK_Cyrillic_te 0x6d4 +#define XK_Cyrillic_u 0x6d5 +#define XK_Cyrillic_zhe 0x6d6 +#define XK_Cyrillic_ve 0x6d7 +#define XK_Cyrillic_softsign 0x6d8 +#define XK_Cyrillic_yeru 0x6d9 +#define XK_Cyrillic_ze 0x6da +#define XK_Cyrillic_sha 0x6db +#define XK_Cyrillic_e 0x6dc +#define XK_Cyrillic_shcha 0x6dd +#define XK_Cyrillic_che 0x6de +#define XK_Cyrillic_hardsign 0x6df +#define XK_Cyrillic_YU 0x6e0 +#define XK_Cyrillic_A 0x6e1 +#define XK_Cyrillic_BE 0x6e2 +#define XK_Cyrillic_TSE 0x6e3 +#define XK_Cyrillic_DE 0x6e4 +#define XK_Cyrillic_IE 0x6e5 +#define XK_Cyrillic_EF 0x6e6 +#define XK_Cyrillic_GHE 0x6e7 +#define XK_Cyrillic_HA 0x6e8 +#define XK_Cyrillic_I 0x6e9 +#define XK_Cyrillic_SHORTI 0x6ea +#define XK_Cyrillic_KA 0x6eb +#define XK_Cyrillic_EL 0x6ec +#define XK_Cyrillic_EM 0x6ed +#define XK_Cyrillic_EN 0x6ee +#define XK_Cyrillic_O 0x6ef +#define XK_Cyrillic_PE 0x6f0 +#define XK_Cyrillic_YA 0x6f1 +#define XK_Cyrillic_ER 0x6f2 +#define XK_Cyrillic_ES 0x6f3 +#define XK_Cyrillic_TE 0x6f4 +#define XK_Cyrillic_U 0x6f5 +#define XK_Cyrillic_ZHE 0x6f6 +#define XK_Cyrillic_VE 0x6f7 +#define XK_Cyrillic_SOFTSIGN 0x6f8 +#define XK_Cyrillic_YERU 0x6f9 +#define XK_Cyrillic_ZE 0x6fa +#define XK_Cyrillic_SHA 0x6fb +#define XK_Cyrillic_E 0x6fc +#define XK_Cyrillic_SHCHA 0x6fd +#define XK_Cyrillic_CHE 0x6fe +#define XK_Cyrillic_HARDSIGN 0x6ff +#endif /* XK_CYRILLIC */ + +/* + * Greek + * Byte 3 = 7 + */ + +#ifdef XK_GREEK +#define XK_Greek_ALPHAaccent 0x7a1 +#define XK_Greek_EPSILONaccent 0x7a2 +#define XK_Greek_ETAaccent 0x7a3 +#define XK_Greek_IOTAaccent 0x7a4 +#define XK_Greek_IOTAdiaeresis 0x7a5 +#define XK_Greek_OMICRONaccent 0x7a7 +#define XK_Greek_UPSILONaccent 0x7a8 +#define XK_Greek_UPSILONdieresis 0x7a9 +#define XK_Greek_OMEGAaccent 0x7ab +#define XK_Greek_accentdieresis 0x7ae +#define XK_Greek_horizbar 0x7af +#define XK_Greek_alphaaccent 0x7b1 +#define XK_Greek_epsilonaccent 0x7b2 +#define XK_Greek_etaaccent 0x7b3 +#define XK_Greek_iotaaccent 0x7b4 +#define XK_Greek_iotadieresis 0x7b5 +#define XK_Greek_iotaaccentdieresis 0x7b6 +#define XK_Greek_omicronaccent 0x7b7 +#define XK_Greek_upsilonaccent 0x7b8 +#define XK_Greek_upsilondieresis 0x7b9 +#define XK_Greek_upsilonaccentdieresis 0x7ba +#define XK_Greek_omegaaccent 0x7bb +#define XK_Greek_ALPHA 0x7c1 +#define XK_Greek_BETA 0x7c2 +#define XK_Greek_GAMMA 0x7c3 +#define XK_Greek_DELTA 0x7c4 +#define XK_Greek_EPSILON 0x7c5 +#define XK_Greek_ZETA 0x7c6 +#define XK_Greek_ETA 0x7c7 +#define XK_Greek_THETA 0x7c8 +#define XK_Greek_IOTA 0x7c9 +#define XK_Greek_KAPPA 0x7ca +#define XK_Greek_LAMDA 0x7cb +#define XK_Greek_LAMBDA 0x7cb +#define XK_Greek_MU 0x7cc +#define XK_Greek_NU 0x7cd +#define XK_Greek_XI 0x7ce +#define XK_Greek_OMICRON 0x7cf +#define XK_Greek_PI 0x7d0 +#define XK_Greek_RHO 0x7d1 +#define XK_Greek_SIGMA 0x7d2 +#define XK_Greek_TAU 0x7d4 +#define XK_Greek_UPSILON 0x7d5 +#define XK_Greek_PHI 0x7d6 +#define XK_Greek_CHI 0x7d7 +#define XK_Greek_PSI 0x7d8 +#define XK_Greek_OMEGA 0x7d9 +#define XK_Greek_alpha 0x7e1 +#define XK_Greek_beta 0x7e2 +#define XK_Greek_gamma 0x7e3 +#define XK_Greek_delta 0x7e4 +#define XK_Greek_epsilon 0x7e5 +#define XK_Greek_zeta 0x7e6 +#define XK_Greek_eta 0x7e7 +#define XK_Greek_theta 0x7e8 +#define XK_Greek_iota 0x7e9 +#define XK_Greek_kappa 0x7ea +#define XK_Greek_lamda 0x7eb +#define XK_Greek_lambda 0x7eb +#define XK_Greek_mu 0x7ec +#define XK_Greek_nu 0x7ed +#define XK_Greek_xi 0x7ee +#define XK_Greek_omicron 0x7ef +#define XK_Greek_pi 0x7f0 +#define XK_Greek_rho 0x7f1 +#define XK_Greek_sigma 0x7f2 +#define XK_Greek_finalsmallsigma 0x7f3 +#define XK_Greek_tau 0x7f4 +#define XK_Greek_upsilon 0x7f5 +#define XK_Greek_phi 0x7f6 +#define XK_Greek_chi 0x7f7 +#define XK_Greek_psi 0x7f8 +#define XK_Greek_omega 0x7f9 +#define XK_Greek_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_GREEK */ + +/* + * Technical + * Byte 3 = 8 + */ + +#ifdef XK_TECHNICAL +#define XK_leftradical 0x8a1 +#define XK_topleftradical 0x8a2 +#define XK_horizconnector 0x8a3 +#define XK_topintegral 0x8a4 +#define XK_botintegral 0x8a5 +#define XK_vertconnector 0x8a6 +#define XK_topleftsqbracket 0x8a7 +#define XK_botleftsqbracket 0x8a8 +#define XK_toprightsqbracket 0x8a9 +#define XK_botrightsqbracket 0x8aa +#define XK_topleftparens 0x8ab +#define XK_botleftparens 0x8ac +#define XK_toprightparens 0x8ad +#define XK_botrightparens 0x8ae +#define XK_leftmiddlecurlybrace 0x8af +#define XK_rightmiddlecurlybrace 0x8b0 +#define XK_topleftsummation 0x8b1 +#define XK_botleftsummation 0x8b2 +#define XK_topvertsummationconnector 0x8b3 +#define XK_botvertsummationconnector 0x8b4 +#define XK_toprightsummation 0x8b5 +#define XK_botrightsummation 0x8b6 +#define XK_rightmiddlesummation 0x8b7 +#define XK_lessthanequal 0x8bc +#define XK_notequal 0x8bd +#define XK_greaterthanequal 0x8be +#define XK_integral 0x8bf +#define XK_therefore 0x8c0 +#define XK_variation 0x8c1 +#define XK_infinity 0x8c2 +#define XK_nabla 0x8c5 +#define XK_approximate 0x8c8 +#define XK_similarequal 0x8c9 +#define XK_ifonlyif 0x8cd +#define XK_implies 0x8ce +#define XK_identical 0x8cf +#define XK_radical 0x8d6 +#define XK_includedin 0x8da +#define XK_includes 0x8db +#define XK_intersection 0x8dc +#define XK_union 0x8dd +#define XK_logicaland 0x8de +#define XK_logicalor 0x8df +#define XK_partialderivative 0x8ef +#define XK_function 0x8f6 +#define XK_leftarrow 0x8fb +#define XK_uparrow 0x8fc +#define XK_rightarrow 0x8fd +#define XK_downarrow 0x8fe +#endif /* XK_TECHNICAL */ + +/* + * Special + * Byte 3 = 9 + */ + +#ifdef XK_SPECIAL +#define XK_blank 0x9df +#define XK_soliddiamond 0x9e0 +#define XK_checkerboard 0x9e1 +#define XK_ht 0x9e2 +#define XK_ff 0x9e3 +#define XK_cr 0x9e4 +#define XK_lf 0x9e5 +#define XK_nl 0x9e8 +#define XK_vt 0x9e9 +#define XK_lowrightcorner 0x9ea +#define XK_uprightcorner 0x9eb +#define XK_upleftcorner 0x9ec +#define XK_lowleftcorner 0x9ed +#define XK_crossinglines 0x9ee +#define XK_horizlinescan1 0x9ef +#define XK_horizlinescan3 0x9f0 +#define XK_horizlinescan5 0x9f1 +#define XK_horizlinescan7 0x9f2 +#define XK_horizlinescan9 0x9f3 +#define XK_leftt 0x9f4 +#define XK_rightt 0x9f5 +#define XK_bott 0x9f6 +#define XK_topt 0x9f7 +#define XK_vertbar 0x9f8 +#endif /* XK_SPECIAL */ + +/* + * Publishing + * Byte 3 = a + */ + +#ifdef XK_PUBLISHING +#define XK_emspace 0xaa1 +#define XK_enspace 0xaa2 +#define XK_em3space 0xaa3 +#define XK_em4space 0xaa4 +#define XK_digitspace 0xaa5 +#define XK_punctspace 0xaa6 +#define XK_thinspace 0xaa7 +#define XK_hairspace 0xaa8 +#define XK_emdash 0xaa9 +#define XK_endash 0xaaa +#define XK_signifblank 0xaac +#define XK_ellipsis 0xaae +#define XK_doubbaselinedot 0xaaf +#define XK_onethird 0xab0 +#define XK_twothirds 0xab1 +#define XK_onefifth 0xab2 +#define XK_twofifths 0xab3 +#define XK_threefifths 0xab4 +#define XK_fourfifths 0xab5 +#define XK_onesixth 0xab6 +#define XK_fivesixths 0xab7 +#define XK_careof 0xab8 +#define XK_figdash 0xabb +#define XK_leftanglebracket 0xabc +#define XK_decimalpoint 0xabd +#define XK_rightanglebracket 0xabe +#define XK_marker 0xabf +#define XK_oneeighth 0xac3 +#define XK_threeeighths 0xac4 +#define XK_fiveeighths 0xac5 +#define XK_seveneighths 0xac6 +#define XK_trademark 0xac9 +#define XK_signaturemark 0xaca +#define XK_trademarkincircle 0xacb +#define XK_leftopentriangle 0xacc +#define XK_rightopentriangle 0xacd +#define XK_emopencircle 0xace +#define XK_emopenrectangle 0xacf +#define XK_leftsinglequotemark 0xad0 +#define XK_rightsinglequotemark 0xad1 +#define XK_leftdoublequotemark 0xad2 +#define XK_rightdoublequotemark 0xad3 +#define XK_prescription 0xad4 +#define XK_minutes 0xad6 +#define XK_seconds 0xad7 +#define XK_latincross 0xad9 +#define XK_hexagram 0xada +#define XK_filledrectbullet 0xadb +#define XK_filledlefttribullet 0xadc +#define XK_filledrighttribullet 0xadd +#define XK_emfilledcircle 0xade +#define XK_emfilledrect 0xadf +#define XK_enopencircbullet 0xae0 +#define XK_enopensquarebullet 0xae1 +#define XK_openrectbullet 0xae2 +#define XK_opentribulletup 0xae3 +#define XK_opentribulletdown 0xae4 +#define XK_openstar 0xae5 +#define XK_enfilledcircbullet 0xae6 +#define XK_enfilledsqbullet 0xae7 +#define XK_filledtribulletup 0xae8 +#define XK_filledtribulletdown 0xae9 +#define XK_leftpointer 0xaea +#define XK_rightpointer 0xaeb +#define XK_club 0xaec +#define XK_diamond 0xaed +#define XK_heart 0xaee +#define XK_maltesecross 0xaf0 +#define XK_dagger 0xaf1 +#define XK_doubledagger 0xaf2 +#define XK_checkmark 0xaf3 +#define XK_ballotcross 0xaf4 +#define XK_musicalsharp 0xaf5 +#define XK_musicalflat 0xaf6 +#define XK_malesymbol 0xaf7 +#define XK_femalesymbol 0xaf8 +#define XK_telephone 0xaf9 +#define XK_telephonerecorder 0xafa +#define XK_phonographcopyright 0xafb +#define XK_caret 0xafc +#define XK_singlelowquotemark 0xafd +#define XK_doublelowquotemark 0xafe +#define XK_cursor 0xaff +#endif /* XK_PUBLISHING */ + +/* + * APL + * Byte 3 = b + */ + +#ifdef XK_APL +#define XK_leftcaret 0xba3 +#define XK_rightcaret 0xba6 +#define XK_downcaret 0xba8 +#define XK_upcaret 0xba9 +#define XK_overbar 0xbc0 +#define XK_downtack 0xbc2 +#define XK_upshoe 0xbc3 +#define XK_downstile 0xbc4 +#define XK_underbar 0xbc6 +#define XK_jot 0xbca +#define XK_quad 0xbcc +#define XK_uptack 0xbce +#define XK_circle 0xbcf +#define XK_upstile 0xbd3 +#define XK_downshoe 0xbd6 +#define XK_rightshoe 0xbd8 +#define XK_leftshoe 0xbda +#define XK_lefttack 0xbdc +#define XK_righttack 0xbfc +#endif /* XK_APL */ + +/* + * Hebrew + * Byte 3 = c + */ + +#ifdef XK_HEBREW +#define XK_hebrew_doublelowline 0xcdf +#define XK_hebrew_aleph 0xce0 +#define XK_hebrew_bet 0xce1 +#define XK_hebrew_beth 0xce1 /* deprecated */ +#define XK_hebrew_gimel 0xce2 +#define XK_hebrew_gimmel 0xce2 /* deprecated */ +#define XK_hebrew_dalet 0xce3 +#define XK_hebrew_daleth 0xce3 /* deprecated */ +#define XK_hebrew_he 0xce4 +#define XK_hebrew_waw 0xce5 +#define XK_hebrew_zain 0xce6 +#define XK_hebrew_zayin 0xce6 /* deprecated */ +#define XK_hebrew_chet 0xce7 +#define XK_hebrew_het 0xce7 /* deprecated */ +#define XK_hebrew_tet 0xce8 +#define XK_hebrew_teth 0xce8 /* deprecated */ +#define XK_hebrew_yod 0xce9 +#define XK_hebrew_finalkaph 0xcea +#define XK_hebrew_kaph 0xceb +#define XK_hebrew_lamed 0xcec +#define XK_hebrew_finalmem 0xced +#define XK_hebrew_mem 0xcee +#define XK_hebrew_finalnun 0xcef +#define XK_hebrew_nun 0xcf0 +#define XK_hebrew_samech 0xcf1 +#define XK_hebrew_samekh 0xcf1 /* deprecated */ +#define XK_hebrew_ayin 0xcf2 +#define XK_hebrew_finalpe 0xcf3 +#define XK_hebrew_pe 0xcf4 +#define XK_hebrew_finalzade 0xcf5 +#define XK_hebrew_finalzadi 0xcf5 /* deprecated */ +#define XK_hebrew_zade 0xcf6 +#define XK_hebrew_zadi 0xcf6 /* deprecated */ +#define XK_hebrew_qoph 0xcf7 +#define XK_hebrew_kuf 0xcf7 /* deprecated */ +#define XK_hebrew_resh 0xcf8 +#define XK_hebrew_shin 0xcf9 +#define XK_hebrew_taw 0xcfa +#define XK_hebrew_taf 0xcfa /* deprecated */ +#define XK_Hebrew_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_HEBREW */ + diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/tkIntXlibDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/tkIntXlibDecls.h new file mode 100644 index 00000000..fc12521c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/X11/tkIntXlibDecls.h @@ -0,0 +1,1806 @@ +/* + * tkIntXlibDecls.h -- + * + * This file contains the declarations for all platform dependent + * unsupported functions that are exported by the Tk library. These + * interfaces are not guaranteed to remain the same between + * versions. Use at your own risk. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * All rights reserved. + */ + +#ifndef _TKINTXLIBDECLS +#define _TKINTXLIBDECLS + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tkInt.decls script. + */ + +#include "X11/Xutil.h" + +#ifdef BUILD_tk +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLEXPORT +#endif + +typedef int (*XAfterFunction) ( /* WARNING, this type not in Xlib spec */ + Display* /* display */ +); + +/* !BEGIN!: Do not edit below this line. */ + +/* + * Exported function declarations: + */ + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ +/* 0 */ +EXTERN int XSetDashes _ANSI_ARGS_((Display *display, GC gc, + int dash_offset, _Xconst char *dash_list, + int n)); +/* 1 */ +EXTERN XModifierKeymap * XGetModifierMapping _ANSI_ARGS_((Display *d)); +/* 2 */ +EXTERN XImage * XCreateImage _ANSI_ARGS_((Display *d, Visual *v, + unsigned int ui1, int i1, int i2, char *cp, + unsigned int ui2, unsigned int ui3, int i3, + int i4)); +/* 3 */ +EXTERN XImage * XGetImage _ANSI_ARGS_((Display *d, Drawable dr, + int i1, int i2, unsigned int ui1, + unsigned int ui2, unsigned long ul, int i3)); +/* 4 */ +EXTERN char * XGetAtomName _ANSI_ARGS_((Display *d, Atom a)); +/* 5 */ +EXTERN char * XKeysymToString _ANSI_ARGS_((KeySym k)); +/* 6 */ +EXTERN Colormap XCreateColormap _ANSI_ARGS_((Display *d, Window w, + Visual *v, int i)); +/* 7 */ +EXTERN Cursor XCreatePixmapCursor _ANSI_ARGS_((Display *d, + Pixmap p1, Pixmap p2, XColor *x1, XColor *x2, + unsigned int ui1, unsigned int ui2)); +/* 8 */ +EXTERN Cursor XCreateGlyphCursor _ANSI_ARGS_((Display *d, Font f1, + Font f2, unsigned int ui1, unsigned int ui2, + XColor _Xconst *x1, XColor _Xconst *x2)); +/* 9 */ +EXTERN GContext XGContextFromGC _ANSI_ARGS_((GC g)); +/* 10 */ +EXTERN XHostAddress * XListHosts _ANSI_ARGS_((Display *d, int *i, Bool *b)); +/* 11 */ +EXTERN KeySym XKeycodeToKeysym _ANSI_ARGS_((Display *d, + unsigned int k, int i)); +/* 12 */ +EXTERN KeySym XStringToKeysym _ANSI_ARGS_((_Xconst char *c)); +/* 13 */ +EXTERN Window XRootWindow _ANSI_ARGS_((Display *d, int i)); +/* 14 */ +EXTERN XErrorHandler XSetErrorHandler _ANSI_ARGS_((XErrorHandler x)); +/* 15 */ +EXTERN Status XIconifyWindow _ANSI_ARGS_((Display *d, Window w, + int i)); +/* 16 */ +EXTERN Status XWithdrawWindow _ANSI_ARGS_((Display *d, Window w, + int i)); +/* 17 */ +EXTERN Status XGetWMColormapWindows _ANSI_ARGS_((Display *d, + Window w, Window **wpp, int *ip)); +/* 18 */ +EXTERN Status XAllocColor _ANSI_ARGS_((Display *d, Colormap c, + XColor *xp)); +/* 19 */ +EXTERN int XBell _ANSI_ARGS_((Display *d, int i)); +/* 20 */ +EXTERN int XChangeProperty _ANSI_ARGS_((Display *d, Window w, + Atom a1, Atom a2, int i1, int i2, + _Xconst unsigned char *c, int i3)); +/* 21 */ +EXTERN int XChangeWindowAttributes _ANSI_ARGS_((Display *d, + Window w, unsigned long ul, + XSetWindowAttributes *x)); +/* 22 */ +EXTERN int XClearWindow _ANSI_ARGS_((Display *d, Window w)); +/* 23 */ +EXTERN int XConfigureWindow _ANSI_ARGS_((Display *d, Window w, + unsigned int i, XWindowChanges *x)); +/* 24 */ +EXTERN int XCopyArea _ANSI_ARGS_((Display *d, Drawable dr1, + Drawable dr2, GC g, int i1, int i2, + unsigned int ui1, unsigned int ui2, int i3, + int i4)); +/* 25 */ +EXTERN int XCopyPlane _ANSI_ARGS_((Display *d, Drawable dr1, + Drawable dr2, GC g, int i1, int i2, + unsigned int ui1, unsigned int ui2, int i3, + int i4, unsigned long ul)); +/* 26 */ +EXTERN Pixmap XCreateBitmapFromData _ANSI_ARGS_((Display *display, + Drawable d, _Xconst char *data, + unsigned int width, unsigned int height)); +/* 27 */ +EXTERN int XDefineCursor _ANSI_ARGS_((Display *d, Window w, + Cursor c)); +/* 28 */ +EXTERN int XDeleteProperty _ANSI_ARGS_((Display *d, Window w, + Atom a)); +/* 29 */ +EXTERN int XDestroyWindow _ANSI_ARGS_((Display *d, Window w)); +/* 30 */ +EXTERN int XDrawArc _ANSI_ARGS_((Display *d, Drawable dr, GC g, + int i1, int i2, unsigned int ui1, + unsigned int ui2, int i3, int i4)); +/* 31 */ +EXTERN int XDrawLines _ANSI_ARGS_((Display *d, Drawable dr, + GC g, XPoint *x, int i1, int i2)); +/* 32 */ +EXTERN int XDrawRectangle _ANSI_ARGS_((Display *d, Drawable dr, + GC g, int i1, int i2, unsigned int ui1, + unsigned int ui2)); +/* 33 */ +EXTERN int XFillArc _ANSI_ARGS_((Display *d, Drawable dr, GC g, + int i1, int i2, unsigned int ui1, + unsigned int ui2, int i3, int i4)); +/* 34 */ +EXTERN int XFillPolygon _ANSI_ARGS_((Display *d, Drawable dr, + GC g, XPoint *x, int i1, int i2, int i3)); +/* 35 */ +EXTERN int XFillRectangles _ANSI_ARGS_((Display *d, Drawable dr, + GC g, XRectangle *x, int i)); +/* 36 */ +EXTERN int XForceScreenSaver _ANSI_ARGS_((Display *d, int i)); +/* 37 */ +EXTERN int XFreeColormap _ANSI_ARGS_((Display *d, Colormap c)); +/* 38 */ +EXTERN int XFreeColors _ANSI_ARGS_((Display *d, Colormap c, + unsigned long *ulp, int i, unsigned long ul)); +/* 39 */ +EXTERN int XFreeCursor _ANSI_ARGS_((Display *d, Cursor c)); +/* 40 */ +EXTERN int XFreeModifiermap _ANSI_ARGS_((XModifierKeymap *x)); +/* 41 */ +EXTERN Status XGetGeometry _ANSI_ARGS_((Display *d, Drawable dr, + Window *w, int *i1, int *i2, + unsigned int *ui1, unsigned int *ui2, + unsigned int *ui3, unsigned int *ui4)); +/* 42 */ +EXTERN int XGetInputFocus _ANSI_ARGS_((Display *d, Window *w, + int *i)); +/* 43 */ +EXTERN int XGetWindowProperty _ANSI_ARGS_((Display *d, Window w, + Atom a1, long l1, long l2, Bool b, Atom a2, + Atom *ap, int *ip, unsigned long *ulp1, + unsigned long *ulp2, unsigned char **cpp)); +/* 44 */ +EXTERN Status XGetWindowAttributes _ANSI_ARGS_((Display *d, + Window w, XWindowAttributes *x)); +/* 45 */ +EXTERN int XGrabKeyboard _ANSI_ARGS_((Display *d, Window w, + Bool b, int i1, int i2, Time t)); +/* 46 */ +EXTERN int XGrabPointer _ANSI_ARGS_((Display *d, Window w1, + Bool b, unsigned int ui, int i1, int i2, + Window w2, Cursor c, Time t)); +/* 47 */ +EXTERN KeyCode XKeysymToKeycode _ANSI_ARGS_((Display *d, KeySym k)); +/* 48 */ +EXTERN Status XLookupColor _ANSI_ARGS_((Display *d, Colormap c1, + _Xconst char *c2, XColor *x1, XColor *x2)); +/* 49 */ +EXTERN int XMapWindow _ANSI_ARGS_((Display *d, Window w)); +/* 50 */ +EXTERN int XMoveResizeWindow _ANSI_ARGS_((Display *d, Window w, + int i1, int i2, unsigned int ui1, + unsigned int ui2)); +/* 51 */ +EXTERN int XMoveWindow _ANSI_ARGS_((Display *d, Window w, + int i1, int i2)); +/* 52 */ +EXTERN int XNextEvent _ANSI_ARGS_((Display *d, XEvent *x)); +/* 53 */ +EXTERN int XPutBackEvent _ANSI_ARGS_((Display *d, XEvent *x)); +/* 54 */ +EXTERN int XQueryColors _ANSI_ARGS_((Display *d, Colormap c, + XColor *x, int i)); +/* 55 */ +EXTERN Bool XQueryPointer _ANSI_ARGS_((Display *d, Window w1, + Window *w2, Window *w3, int *i1, int *i2, + int *i3, int *i4, unsigned int *ui)); +/* 56 */ +EXTERN Status XQueryTree _ANSI_ARGS_((Display *d, Window w1, + Window *w2, Window *w3, Window **w4, + unsigned int *ui)); +/* 57 */ +EXTERN int XRaiseWindow _ANSI_ARGS_((Display *d, Window w)); +/* 58 */ +EXTERN int XRefreshKeyboardMapping _ANSI_ARGS_(( + XMappingEvent *x)); +/* 59 */ +EXTERN int XResizeWindow _ANSI_ARGS_((Display *d, Window w, + unsigned int ui1, unsigned int ui2)); +/* 60 */ +EXTERN int XSelectInput _ANSI_ARGS_((Display *d, Window w, + long l)); +/* 61 */ +EXTERN Status XSendEvent _ANSI_ARGS_((Display *d, Window w, Bool b, + long l, XEvent *x)); +/* 62 */ +EXTERN int XSetCommand _ANSI_ARGS_((Display *d, Window w, + char **c, int i)); +/* 63 */ +EXTERN int XSetIconName _ANSI_ARGS_((Display *d, Window w, + _Xconst char *c)); +/* 64 */ +EXTERN int XSetInputFocus _ANSI_ARGS_((Display *d, Window w, + int i, Time t)); +/* 65 */ +EXTERN int XSetSelectionOwner _ANSI_ARGS_((Display *d, Atom a, + Window w, Time t)); +/* 66 */ +EXTERN int XSetWindowBackground _ANSI_ARGS_((Display *d, + Window w, unsigned long ul)); +/* 67 */ +EXTERN int XSetWindowBackgroundPixmap _ANSI_ARGS_((Display *d, + Window w, Pixmap p)); +/* 68 */ +EXTERN int XSetWindowBorder _ANSI_ARGS_((Display *d, Window w, + unsigned long ul)); +/* 69 */ +EXTERN int XSetWindowBorderPixmap _ANSI_ARGS_((Display *d, + Window w, Pixmap p)); +/* 70 */ +EXTERN int XSetWindowBorderWidth _ANSI_ARGS_((Display *d, + Window w, unsigned int ui)); +/* 71 */ +EXTERN int XSetWindowColormap _ANSI_ARGS_((Display *d, Window w, + Colormap c)); +/* 72 */ +EXTERN Bool XTranslateCoordinates _ANSI_ARGS_((Display *d, + Window w1, Window w2, int i1, int i2, + int *i3, int *i4, Window *w3)); +/* 73 */ +EXTERN int XUngrabKeyboard _ANSI_ARGS_((Display *d, Time t)); +/* 74 */ +EXTERN int XUngrabPointer _ANSI_ARGS_((Display *d, Time t)); +/* 75 */ +EXTERN int XUnmapWindow _ANSI_ARGS_((Display *d, Window w)); +/* 76 */ +EXTERN int XWindowEvent _ANSI_ARGS_((Display *d, Window w, + long l, XEvent *x)); +/* 77 */ +EXTERN void XDestroyIC _ANSI_ARGS_((XIC x)); +/* 78 */ +EXTERN Bool XFilterEvent _ANSI_ARGS_((XEvent *x, Window w)); +/* 79 */ +EXTERN int XmbLookupString _ANSI_ARGS_((XIC xi, + XKeyPressedEvent *xk, char *c, int i, + KeySym *k, Status *s)); +/* 80 */ +EXTERN int TkPutImage _ANSI_ARGS_((unsigned long *colors, + int ncolors, Display *display, Drawable d, + GC gc, XImage *image, int src_x, int src_y, + int dest_x, int dest_y, unsigned int width, + unsigned int height)); +/* Slot 81 is reserved */ +/* 82 */ +EXTERN Status XParseColor _ANSI_ARGS_((Display *display, + Colormap map, _Xconst char *spec, + XColor *colorPtr)); +/* 83 */ +EXTERN GC XCreateGC _ANSI_ARGS_((Display *display, Drawable d, + unsigned long valuemask, XGCValues *values)); +/* 84 */ +EXTERN int XFreeGC _ANSI_ARGS_((Display *display, GC gc)); +/* 85 */ +EXTERN Atom XInternAtom _ANSI_ARGS_((Display *display, + _Xconst char *atom_name, Bool only_if_exists)); +/* 86 */ +EXTERN int XSetBackground _ANSI_ARGS_((Display *display, GC gc, + unsigned long foreground)); +/* 87 */ +EXTERN int XSetForeground _ANSI_ARGS_((Display *display, GC gc, + unsigned long foreground)); +/* 88 */ +EXTERN int XSetClipMask _ANSI_ARGS_((Display *display, GC gc, + Pixmap pixmap)); +/* 89 */ +EXTERN int XSetClipOrigin _ANSI_ARGS_((Display *display, GC gc, + int clip_x_origin, int clip_y_origin)); +/* 90 */ +EXTERN int XSetTSOrigin _ANSI_ARGS_((Display *display, GC gc, + int ts_x_origin, int ts_y_origin)); +/* 91 */ +EXTERN int XChangeGC _ANSI_ARGS_((Display *d, GC gc, + unsigned long mask, XGCValues *values)); +/* 92 */ +EXTERN int XSetFont _ANSI_ARGS_((Display *display, GC gc, + Font font)); +/* 93 */ +EXTERN int XSetArcMode _ANSI_ARGS_((Display *display, GC gc, + int arc_mode)); +/* 94 */ +EXTERN int XSetStipple _ANSI_ARGS_((Display *display, GC gc, + Pixmap stipple)); +/* 95 */ +EXTERN int XSetFillRule _ANSI_ARGS_((Display *display, GC gc, + int fill_rule)); +/* 96 */ +EXTERN int XSetFillStyle _ANSI_ARGS_((Display *display, GC gc, + int fill_style)); +/* 97 */ +EXTERN int XSetFunction _ANSI_ARGS_((Display *display, GC gc, + int function)); +/* 98 */ +EXTERN int XSetLineAttributes _ANSI_ARGS_((Display *display, + GC gc, unsigned int line_width, + int line_style, int cap_style, + int join_style)); +/* 99 */ +EXTERN int _XInitImageFuncPtrs _ANSI_ARGS_((XImage *image)); +/* 100 */ +EXTERN XIC XCreateIC _ANSI_ARGS_(TCL_VARARGS(XIM,xim)); +/* 101 */ +EXTERN XVisualInfo * XGetVisualInfo _ANSI_ARGS_((Display *display, + long vinfo_mask, XVisualInfo *vinfo_template, + int *nitems_return)); +/* 102 */ +EXTERN void XSetWMClientMachine _ANSI_ARGS_((Display *display, + Window w, XTextProperty *text_prop)); +/* 103 */ +EXTERN Status XStringListToTextProperty _ANSI_ARGS_((char **list, + int count, XTextProperty *text_prop_return)); +/* 104 */ +EXTERN int XDrawLine _ANSI_ARGS_((Display *d, Drawable dr, GC g, + int x1, int y1, int x2, int y2)); +/* 105 */ +EXTERN int XWarpPointer _ANSI_ARGS_((Display *d, Window s, + Window dw, int sx, int sy, unsigned int sw, + unsigned int sh, int dx, int dy)); +/* 106 */ +EXTERN int XFillRectangle _ANSI_ARGS_((Display *display, + Drawable d, GC gc, int x, int y, + unsigned int width, unsigned int height)); +/* 107 */ +EXTERN int XFlush _ANSI_ARGS_((Display *display)); +/* 108 */ +EXTERN int XGrabServer _ANSI_ARGS_((Display *display)); +/* 109 */ +EXTERN int XUngrabServer _ANSI_ARGS_((Display *display)); +/* 110 */ +EXTERN int XFree _ANSI_ARGS_((VOID *data)); +/* 111 */ +EXTERN int XNoOp _ANSI_ARGS_((Display *display)); +/* 112 */ +EXTERN XAfterFunction XSynchronize _ANSI_ARGS_((Display *display, + Bool onoff)); +/* 113 */ +EXTERN int XSync _ANSI_ARGS_((Display *display, Bool discard)); +/* 114 */ +EXTERN VisualID XVisualIDFromVisual _ANSI_ARGS_((Visual *visual)); +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ +/* 0 */ +EXTERN int XSetDashes _ANSI_ARGS_((Display *display, GC gc, + int dash_offset, _Xconst char *dash_list, + int n)); +/* 1 */ +EXTERN XModifierKeymap * XGetModifierMapping _ANSI_ARGS_((Display *d)); +/* 2 */ +EXTERN XImage * XCreateImage _ANSI_ARGS_((Display *d, Visual *v, + unsigned int ui1, int i1, int i2, char *cp, + unsigned int ui2, unsigned int ui3, int i3, + int i4)); +/* 3 */ +EXTERN XImage * XGetImage _ANSI_ARGS_((Display *d, Drawable dr, + int i1, int i2, unsigned int ui1, + unsigned int ui2, unsigned long ul, int i3)); +/* 4 */ +EXTERN char * XGetAtomName _ANSI_ARGS_((Display *d, Atom a)); +/* 5 */ +EXTERN char * XKeysymToString _ANSI_ARGS_((KeySym k)); +/* 6 */ +EXTERN Colormap XCreateColormap _ANSI_ARGS_((Display *d, Window w, + Visual *v, int i)); +/* 7 */ +EXTERN GContext XGContextFromGC _ANSI_ARGS_((GC g)); +/* 8 */ +EXTERN KeySym XKeycodeToKeysym _ANSI_ARGS_((Display *d, KeyCode k, + int i)); +/* 9 */ +EXTERN KeySym XStringToKeysym _ANSI_ARGS_((_Xconst char *c)); +/* 10 */ +EXTERN Window XRootWindow _ANSI_ARGS_((Display *d, int i)); +/* 11 */ +EXTERN XErrorHandler XSetErrorHandler _ANSI_ARGS_((XErrorHandler x)); +/* 12 */ +EXTERN Status XAllocColor _ANSI_ARGS_((Display *d, Colormap c, + XColor *xp)); +/* 13 */ +EXTERN int XBell _ANSI_ARGS_((Display *d, int i)); +/* 14 */ +EXTERN void XChangeProperty _ANSI_ARGS_((Display *d, Window w, + Atom a1, Atom a2, int i1, int i2, + _Xconst unsigned char *c, int i3)); +/* 15 */ +EXTERN void XChangeWindowAttributes _ANSI_ARGS_((Display *d, + Window w, unsigned long ul, + XSetWindowAttributes *x)); +/* 16 */ +EXTERN void XConfigureWindow _ANSI_ARGS_((Display *d, Window w, + unsigned int i, XWindowChanges *x)); +/* 17 */ +EXTERN void XCopyArea _ANSI_ARGS_((Display *d, Drawable dr1, + Drawable dr2, GC g, int i1, int i2, + unsigned int ui1, unsigned int ui2, int i3, + int i4)); +/* 18 */ +EXTERN void XCopyPlane _ANSI_ARGS_((Display *d, Drawable dr1, + Drawable dr2, GC g, int i1, int i2, + unsigned int ui1, unsigned int ui2, int i3, + int i4, unsigned long ul)); +/* 19 */ +EXTERN Pixmap XCreateBitmapFromData _ANSI_ARGS_((Display *display, + Drawable d, _Xconst char *data, + unsigned int width, unsigned int height)); +/* 20 */ +EXTERN int XDefineCursor _ANSI_ARGS_((Display *d, Window w, + Cursor c)); +/* 21 */ +EXTERN void XDestroyWindow _ANSI_ARGS_((Display *d, Window w)); +/* 22 */ +EXTERN void XDrawArc _ANSI_ARGS_((Display *d, Drawable dr, GC g, + int i1, int i2, unsigned int ui1, + unsigned int ui2, int i3, int i4)); +/* 23 */ +EXTERN int XDrawLines _ANSI_ARGS_((Display *d, Drawable dr, + GC g, XPoint *x, int i1, int i2)); +/* 24 */ +EXTERN void XDrawRectangle _ANSI_ARGS_((Display *d, Drawable dr, + GC g, int i1, int i2, unsigned int ui1, + unsigned int ui2)); +/* 25 */ +EXTERN void XFillArc _ANSI_ARGS_((Display *d, Drawable dr, GC g, + int i1, int i2, unsigned int ui1, + unsigned int ui2, int i3, int i4)); +/* 26 */ +EXTERN void XFillPolygon _ANSI_ARGS_((Display *d, Drawable dr, + GC g, XPoint *x, int i1, int i2, int i3)); +/* 27 */ +EXTERN int XFillRectangles _ANSI_ARGS_((Display *d, Drawable dr, + GC g, XRectangle *x, int i)); +/* 28 */ +EXTERN int XFreeColormap _ANSI_ARGS_((Display *d, Colormap c)); +/* 29 */ +EXTERN int XFreeColors _ANSI_ARGS_((Display *d, Colormap c, + unsigned long *ulp, int i, unsigned long ul)); +/* 30 */ +EXTERN int XFreeModifiermap _ANSI_ARGS_((XModifierKeymap *x)); +/* 31 */ +EXTERN Status XGetGeometry _ANSI_ARGS_((Display *d, Drawable dr, + Window *w, int *i1, int *i2, + unsigned int *ui1, unsigned int *ui2, + unsigned int *ui3, unsigned int *ui4)); +/* 32 */ +EXTERN int XGetWindowProperty _ANSI_ARGS_((Display *d, Window w, + Atom a1, long l1, long l2, Bool b, Atom a2, + Atom *ap, int *ip, unsigned long *ulp1, + unsigned long *ulp2, unsigned char **cpp)); +/* 33 */ +EXTERN int XGrabKeyboard _ANSI_ARGS_((Display *d, Window w, + Bool b, int i1, int i2, Time t)); +/* 34 */ +EXTERN int XGrabPointer _ANSI_ARGS_((Display *d, Window w1, + Bool b, unsigned int ui, int i1, int i2, + Window w2, Cursor c, Time t)); +/* 35 */ +EXTERN KeyCode XKeysymToKeycode _ANSI_ARGS_((Display *d, KeySym k)); +/* 36 */ +EXTERN void XMapWindow _ANSI_ARGS_((Display *d, Window w)); +/* 37 */ +EXTERN void XMoveResizeWindow _ANSI_ARGS_((Display *d, Window w, + int i1, int i2, unsigned int ui1, + unsigned int ui2)); +/* 38 */ +EXTERN void XMoveWindow _ANSI_ARGS_((Display *d, Window w, + int i1, int i2)); +/* 39 */ +EXTERN Bool XQueryPointer _ANSI_ARGS_((Display *d, Window w1, + Window *w2, Window *w3, int *i1, int *i2, + int *i3, int *i4, unsigned int *ui)); +/* 40 */ +EXTERN void XRaiseWindow _ANSI_ARGS_((Display *d, Window w)); +/* 41 */ +EXTERN void XRefreshKeyboardMapping _ANSI_ARGS_(( + XMappingEvent *x)); +/* 42 */ +EXTERN void XResizeWindow _ANSI_ARGS_((Display *d, Window w, + unsigned int ui1, unsigned int ui2)); +/* 43 */ +EXTERN void XSelectInput _ANSI_ARGS_((Display *d, Window w, + long l)); +/* 44 */ +EXTERN Status XSendEvent _ANSI_ARGS_((Display *d, Window w, Bool b, + long l, XEvent *x)); +/* 45 */ +EXTERN void XSetIconName _ANSI_ARGS_((Display *d, Window w, + _Xconst char *c)); +/* 46 */ +EXTERN void XSetInputFocus _ANSI_ARGS_((Display *d, Window w, + int i, Time t)); +/* 47 */ +EXTERN int XSetSelectionOwner _ANSI_ARGS_((Display *d, Atom a, + Window w, Time t)); +/* 48 */ +EXTERN void XSetWindowBackground _ANSI_ARGS_((Display *d, + Window w, unsigned long ul)); +/* 49 */ +EXTERN void XSetWindowBackgroundPixmap _ANSI_ARGS_((Display *d, + Window w, Pixmap p)); +/* 50 */ +EXTERN void XSetWindowBorder _ANSI_ARGS_((Display *d, Window w, + unsigned long ul)); +/* 51 */ +EXTERN void XSetWindowBorderPixmap _ANSI_ARGS_((Display *d, + Window w, Pixmap p)); +/* 52 */ +EXTERN void XSetWindowBorderWidth _ANSI_ARGS_((Display *d, + Window w, unsigned int ui)); +/* 53 */ +EXTERN void XSetWindowColormap _ANSI_ARGS_((Display *d, Window w, + Colormap c)); +/* 54 */ +EXTERN void XUngrabKeyboard _ANSI_ARGS_((Display *d, Time t)); +/* 55 */ +EXTERN int XUngrabPointer _ANSI_ARGS_((Display *d, Time t)); +/* 56 */ +EXTERN void XUnmapWindow _ANSI_ARGS_((Display *d, Window w)); +/* 57 */ +EXTERN int TkPutImage _ANSI_ARGS_((unsigned long *colors, + int ncolors, Display *display, Drawable d, + GC gc, XImage *image, int src_x, int src_y, + int dest_x, int dest_y, unsigned int width, + unsigned int height)); +/* 58 */ +EXTERN Status XParseColor _ANSI_ARGS_((Display *display, + Colormap map, _Xconst char *spec, + XColor *colorPtr)); +/* 59 */ +EXTERN GC XCreateGC _ANSI_ARGS_((Display *display, Drawable d, + unsigned long valuemask, XGCValues *values)); +/* 60 */ +EXTERN int XFreeGC _ANSI_ARGS_((Display *display, GC gc)); +/* 61 */ +EXTERN Atom XInternAtom _ANSI_ARGS_((Display *display, + _Xconst char *atom_name, Bool only_if_exists)); +/* 62 */ +EXTERN int XSetBackground _ANSI_ARGS_((Display *display, GC gc, + unsigned long foreground)); +/* 63 */ +EXTERN int XSetForeground _ANSI_ARGS_((Display *display, GC gc, + unsigned long foreground)); +/* 64 */ +EXTERN int XSetClipMask _ANSI_ARGS_((Display *display, GC gc, + Pixmap pixmap)); +/* 65 */ +EXTERN int XSetClipOrigin _ANSI_ARGS_((Display *display, GC gc, + int clip_x_origin, int clip_y_origin)); +/* 66 */ +EXTERN int XSetTSOrigin _ANSI_ARGS_((Display *display, GC gc, + int ts_x_origin, int ts_y_origin)); +/* 67 */ +EXTERN int XChangeGC _ANSI_ARGS_((Display *d, GC gc, + unsigned long mask, XGCValues *values)); +/* 68 */ +EXTERN int XSetFont _ANSI_ARGS_((Display *display, GC gc, + Font font)); +/* 69 */ +EXTERN int XSetArcMode _ANSI_ARGS_((Display *display, GC gc, + int arc_mode)); +/* 70 */ +EXTERN int XSetStipple _ANSI_ARGS_((Display *display, GC gc, + Pixmap stipple)); +/* 71 */ +EXTERN int XSetFillRule _ANSI_ARGS_((Display *display, GC gc, + int fill_rule)); +/* 72 */ +EXTERN int XSetFillStyle _ANSI_ARGS_((Display *display, GC gc, + int fill_style)); +/* 73 */ +EXTERN int XSetFunction _ANSI_ARGS_((Display *display, GC gc, + int function)); +/* 74 */ +EXTERN int XSetLineAttributes _ANSI_ARGS_((Display *display, + GC gc, unsigned int line_width, + int line_style, int cap_style, + int join_style)); +/* 75 */ +EXTERN int _XInitImageFuncPtrs _ANSI_ARGS_((XImage *image)); +/* 76 */ +EXTERN XIC XCreateIC _ANSI_ARGS_((void)); +/* 77 */ +EXTERN XVisualInfo * XGetVisualInfo _ANSI_ARGS_((Display *display, + long vinfo_mask, XVisualInfo *vinfo_template, + int *nitems_return)); +/* 78 */ +EXTERN void XSetWMClientMachine _ANSI_ARGS_((Display *display, + Window w, XTextProperty *text_prop)); +/* 79 */ +EXTERN Status XStringListToTextProperty _ANSI_ARGS_((char **list, + int count, XTextProperty *text_prop_return)); +/* 80 */ +EXTERN void XDrawSegments _ANSI_ARGS_((Display *display, + Drawable d, GC gc, XSegment *segments, + int nsegments)); +/* 81 */ +EXTERN void XForceScreenSaver _ANSI_ARGS_((Display *display, + int mode)); +/* 82 */ +EXTERN int XDrawLine _ANSI_ARGS_((Display *d, Drawable dr, GC g, + int x1, int y1, int x2, int y2)); +/* 83 */ +EXTERN int XFillRectangle _ANSI_ARGS_((Display *display, + Drawable d, GC gc, int x, int y, + unsigned int width, unsigned int height)); +/* 84 */ +EXTERN void XClearWindow _ANSI_ARGS_((Display *d, Window w)); +/* 85 */ +EXTERN void XDrawPoint _ANSI_ARGS_((Display *display, Drawable d, + GC gc, int x, int y)); +/* 86 */ +EXTERN void XDrawPoints _ANSI_ARGS_((Display *display, + Drawable d, GC gc, XPoint *points, + int npoints, int mode)); +/* 87 */ +EXTERN int XWarpPointer _ANSI_ARGS_((Display *display, + Window src_w, Window dest_w, int src_x, + int src_y, unsigned int src_width, + unsigned int src_height, int dest_x, + int dest_y)); +/* 88 */ +EXTERN void XQueryColor _ANSI_ARGS_((Display *display, + Colormap colormap, XColor *def_in_out)); +/* 89 */ +EXTERN void XQueryColors _ANSI_ARGS_((Display *display, + Colormap colormap, XColor *defs_in_out, + int ncolors)); +/* 90 */ +EXTERN Status XQueryTree _ANSI_ARGS_((Display *d, Window w1, + Window *w2, Window *w3, Window **w4, + unsigned int *ui)); +/* 91 */ +EXTERN int XSync _ANSI_ARGS_((Display *display, Bool flag)); +#endif /* AQUA */ + +typedef struct TkIntXlibStubs { + int magic; + struct TkIntXlibStubHooks *hooks; + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ + int (*xSetDashes) _ANSI_ARGS_((Display *display, GC gc, int dash_offset, _Xconst char *dash_list, int n)); /* 0 */ + XModifierKeymap * (*xGetModifierMapping) _ANSI_ARGS_((Display *d)); /* 1 */ + XImage * (*xCreateImage) _ANSI_ARGS_((Display *d, Visual *v, unsigned int ui1, int i1, int i2, char *cp, unsigned int ui2, unsigned int ui3, int i3, int i4)); /* 2 */ + XImage * (*xGetImage) _ANSI_ARGS_((Display *d, Drawable dr, int i1, int i2, unsigned int ui1, unsigned int ui2, unsigned long ul, int i3)); /* 3 */ + char * (*xGetAtomName) _ANSI_ARGS_((Display *d, Atom a)); /* 4 */ + char * (*xKeysymToString) _ANSI_ARGS_((KeySym k)); /* 5 */ + Colormap (*xCreateColormap) _ANSI_ARGS_((Display *d, Window w, Visual *v, int i)); /* 6 */ + Cursor (*xCreatePixmapCursor) _ANSI_ARGS_((Display *d, Pixmap p1, Pixmap p2, XColor *x1, XColor *x2, unsigned int ui1, unsigned int ui2)); /* 7 */ + Cursor (*xCreateGlyphCursor) _ANSI_ARGS_((Display *d, Font f1, Font f2, unsigned int ui1, unsigned int ui2, XColor _Xconst *x1, XColor _Xconst *x2)); /* 8 */ + GContext (*xGContextFromGC) _ANSI_ARGS_((GC g)); /* 9 */ + XHostAddress * (*xListHosts) _ANSI_ARGS_((Display *d, int *i, Bool *b)); /* 10 */ + KeySym (*xKeycodeToKeysym) _ANSI_ARGS_((Display *d, unsigned int k, int i)); /* 11 */ + KeySym (*xStringToKeysym) _ANSI_ARGS_((_Xconst char *c)); /* 12 */ + Window (*xRootWindow) _ANSI_ARGS_((Display *d, int i)); /* 13 */ + XErrorHandler (*xSetErrorHandler) _ANSI_ARGS_((XErrorHandler x)); /* 14 */ + Status (*xIconifyWindow) _ANSI_ARGS_((Display *d, Window w, int i)); /* 15 */ + Status (*xWithdrawWindow) _ANSI_ARGS_((Display *d, Window w, int i)); /* 16 */ + Status (*xGetWMColormapWindows) _ANSI_ARGS_((Display *d, Window w, Window **wpp, int *ip)); /* 17 */ + Status (*xAllocColor) _ANSI_ARGS_((Display *d, Colormap c, XColor *xp)); /* 18 */ + int (*xBell) _ANSI_ARGS_((Display *d, int i)); /* 19 */ + int (*xChangeProperty) _ANSI_ARGS_((Display *d, Window w, Atom a1, Atom a2, int i1, int i2, _Xconst unsigned char *c, int i3)); /* 20 */ + int (*xChangeWindowAttributes) _ANSI_ARGS_((Display *d, Window w, unsigned long ul, XSetWindowAttributes *x)); /* 21 */ + int (*xClearWindow) _ANSI_ARGS_((Display *d, Window w)); /* 22 */ + int (*xConfigureWindow) _ANSI_ARGS_((Display *d, Window w, unsigned int i, XWindowChanges *x)); /* 23 */ + int (*xCopyArea) _ANSI_ARGS_((Display *d, Drawable dr1, Drawable dr2, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4)); /* 24 */ + int (*xCopyPlane) _ANSI_ARGS_((Display *d, Drawable dr1, Drawable dr2, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4, unsigned long ul)); /* 25 */ + Pixmap (*xCreateBitmapFromData) _ANSI_ARGS_((Display *display, Drawable d, _Xconst char *data, unsigned int width, unsigned int height)); /* 26 */ + int (*xDefineCursor) _ANSI_ARGS_((Display *d, Window w, Cursor c)); /* 27 */ + int (*xDeleteProperty) _ANSI_ARGS_((Display *d, Window w, Atom a)); /* 28 */ + int (*xDestroyWindow) _ANSI_ARGS_((Display *d, Window w)); /* 29 */ + int (*xDrawArc) _ANSI_ARGS_((Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4)); /* 30 */ + int (*xDrawLines) _ANSI_ARGS_((Display *d, Drawable dr, GC g, XPoint *x, int i1, int i2)); /* 31 */ + int (*xDrawRectangle) _ANSI_ARGS_((Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2)); /* 32 */ + int (*xFillArc) _ANSI_ARGS_((Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4)); /* 33 */ + int (*xFillPolygon) _ANSI_ARGS_((Display *d, Drawable dr, GC g, XPoint *x, int i1, int i2, int i3)); /* 34 */ + int (*xFillRectangles) _ANSI_ARGS_((Display *d, Drawable dr, GC g, XRectangle *x, int i)); /* 35 */ + int (*xForceScreenSaver) _ANSI_ARGS_((Display *d, int i)); /* 36 */ + int (*xFreeColormap) _ANSI_ARGS_((Display *d, Colormap c)); /* 37 */ + int (*xFreeColors) _ANSI_ARGS_((Display *d, Colormap c, unsigned long *ulp, int i, unsigned long ul)); /* 38 */ + int (*xFreeCursor) _ANSI_ARGS_((Display *d, Cursor c)); /* 39 */ + int (*xFreeModifiermap) _ANSI_ARGS_((XModifierKeymap *x)); /* 40 */ + Status (*xGetGeometry) _ANSI_ARGS_((Display *d, Drawable dr, Window *w, int *i1, int *i2, unsigned int *ui1, unsigned int *ui2, unsigned int *ui3, unsigned int *ui4)); /* 41 */ + int (*xGetInputFocus) _ANSI_ARGS_((Display *d, Window *w, int *i)); /* 42 */ + int (*xGetWindowProperty) _ANSI_ARGS_((Display *d, Window w, Atom a1, long l1, long l2, Bool b, Atom a2, Atom *ap, int *ip, unsigned long *ulp1, unsigned long *ulp2, unsigned char **cpp)); /* 43 */ + Status (*xGetWindowAttributes) _ANSI_ARGS_((Display *d, Window w, XWindowAttributes *x)); /* 44 */ + int (*xGrabKeyboard) _ANSI_ARGS_((Display *d, Window w, Bool b, int i1, int i2, Time t)); /* 45 */ + int (*xGrabPointer) _ANSI_ARGS_((Display *d, Window w1, Bool b, unsigned int ui, int i1, int i2, Window w2, Cursor c, Time t)); /* 46 */ + KeyCode (*xKeysymToKeycode) _ANSI_ARGS_((Display *d, KeySym k)); /* 47 */ + Status (*xLookupColor) _ANSI_ARGS_((Display *d, Colormap c1, _Xconst char *c2, XColor *x1, XColor *x2)); /* 48 */ + int (*xMapWindow) _ANSI_ARGS_((Display *d, Window w)); /* 49 */ + int (*xMoveResizeWindow) _ANSI_ARGS_((Display *d, Window w, int i1, int i2, unsigned int ui1, unsigned int ui2)); /* 50 */ + int (*xMoveWindow) _ANSI_ARGS_((Display *d, Window w, int i1, int i2)); /* 51 */ + int (*xNextEvent) _ANSI_ARGS_((Display *d, XEvent *x)); /* 52 */ + int (*xPutBackEvent) _ANSI_ARGS_((Display *d, XEvent *x)); /* 53 */ + int (*xQueryColors) _ANSI_ARGS_((Display *d, Colormap c, XColor *x, int i)); /* 54 */ + Bool (*xQueryPointer) _ANSI_ARGS_((Display *d, Window w1, Window *w2, Window *w3, int *i1, int *i2, int *i3, int *i4, unsigned int *ui)); /* 55 */ + Status (*xQueryTree) _ANSI_ARGS_((Display *d, Window w1, Window *w2, Window *w3, Window **w4, unsigned int *ui)); /* 56 */ + int (*xRaiseWindow) _ANSI_ARGS_((Display *d, Window w)); /* 57 */ + int (*xRefreshKeyboardMapping) _ANSI_ARGS_((XMappingEvent *x)); /* 58 */ + int (*xResizeWindow) _ANSI_ARGS_((Display *d, Window w, unsigned int ui1, unsigned int ui2)); /* 59 */ + int (*xSelectInput) _ANSI_ARGS_((Display *d, Window w, long l)); /* 60 */ + Status (*xSendEvent) _ANSI_ARGS_((Display *d, Window w, Bool b, long l, XEvent *x)); /* 61 */ + int (*xSetCommand) _ANSI_ARGS_((Display *d, Window w, char **c, int i)); /* 62 */ + int (*xSetIconName) _ANSI_ARGS_((Display *d, Window w, _Xconst char *c)); /* 63 */ + int (*xSetInputFocus) _ANSI_ARGS_((Display *d, Window w, int i, Time t)); /* 64 */ + int (*xSetSelectionOwner) _ANSI_ARGS_((Display *d, Atom a, Window w, Time t)); /* 65 */ + int (*xSetWindowBackground) _ANSI_ARGS_((Display *d, Window w, unsigned long ul)); /* 66 */ + int (*xSetWindowBackgroundPixmap) _ANSI_ARGS_((Display *d, Window w, Pixmap p)); /* 67 */ + int (*xSetWindowBorder) _ANSI_ARGS_((Display *d, Window w, unsigned long ul)); /* 68 */ + int (*xSetWindowBorderPixmap) _ANSI_ARGS_((Display *d, Window w, Pixmap p)); /* 69 */ + int (*xSetWindowBorderWidth) _ANSI_ARGS_((Display *d, Window w, unsigned int ui)); /* 70 */ + int (*xSetWindowColormap) _ANSI_ARGS_((Display *d, Window w, Colormap c)); /* 71 */ + Bool (*xTranslateCoordinates) _ANSI_ARGS_((Display *d, Window w1, Window w2, int i1, int i2, int *i3, int *i4, Window *w3)); /* 72 */ + int (*xUngrabKeyboard) _ANSI_ARGS_((Display *d, Time t)); /* 73 */ + int (*xUngrabPointer) _ANSI_ARGS_((Display *d, Time t)); /* 74 */ + int (*xUnmapWindow) _ANSI_ARGS_((Display *d, Window w)); /* 75 */ + int (*xWindowEvent) _ANSI_ARGS_((Display *d, Window w, long l, XEvent *x)); /* 76 */ + void (*xDestroyIC) _ANSI_ARGS_((XIC x)); /* 77 */ + Bool (*xFilterEvent) _ANSI_ARGS_((XEvent *x, Window w)); /* 78 */ + int (*xmbLookupString) _ANSI_ARGS_((XIC xi, XKeyPressedEvent *xk, char *c, int i, KeySym *k, Status *s)); /* 79 */ + int (*tkPutImage) _ANSI_ARGS_((unsigned long *colors, int ncolors, Display *display, Drawable d, GC gc, XImage *image, int src_x, int src_y, int dest_x, int dest_y, unsigned int width, unsigned int height)); /* 80 */ + VOID *reserved81; + Status (*xParseColor) _ANSI_ARGS_((Display *display, Colormap map, _Xconst char *spec, XColor *colorPtr)); /* 82 */ + GC (*xCreateGC) _ANSI_ARGS_((Display *display, Drawable d, unsigned long valuemask, XGCValues *values)); /* 83 */ + int (*xFreeGC) _ANSI_ARGS_((Display *display, GC gc)); /* 84 */ + Atom (*xInternAtom) _ANSI_ARGS_((Display *display, _Xconst char *atom_name, Bool only_if_exists)); /* 85 */ + int (*xSetBackground) _ANSI_ARGS_((Display *display, GC gc, unsigned long foreground)); /* 86 */ + int (*xSetForeground) _ANSI_ARGS_((Display *display, GC gc, unsigned long foreground)); /* 87 */ + int (*xSetClipMask) _ANSI_ARGS_((Display *display, GC gc, Pixmap pixmap)); /* 88 */ + int (*xSetClipOrigin) _ANSI_ARGS_((Display *display, GC gc, int clip_x_origin, int clip_y_origin)); /* 89 */ + int (*xSetTSOrigin) _ANSI_ARGS_((Display *display, GC gc, int ts_x_origin, int ts_y_origin)); /* 90 */ + int (*xChangeGC) _ANSI_ARGS_((Display *d, GC gc, unsigned long mask, XGCValues *values)); /* 91 */ + int (*xSetFont) _ANSI_ARGS_((Display *display, GC gc, Font font)); /* 92 */ + int (*xSetArcMode) _ANSI_ARGS_((Display *display, GC gc, int arc_mode)); /* 93 */ + int (*xSetStipple) _ANSI_ARGS_((Display *display, GC gc, Pixmap stipple)); /* 94 */ + int (*xSetFillRule) _ANSI_ARGS_((Display *display, GC gc, int fill_rule)); /* 95 */ + int (*xSetFillStyle) _ANSI_ARGS_((Display *display, GC gc, int fill_style)); /* 96 */ + int (*xSetFunction) _ANSI_ARGS_((Display *display, GC gc, int function)); /* 97 */ + int (*xSetLineAttributes) _ANSI_ARGS_((Display *display, GC gc, unsigned int line_width, int line_style, int cap_style, int join_style)); /* 98 */ + int (*_XInitImageFuncPtrs) _ANSI_ARGS_((XImage *image)); /* 99 */ + XIC (*xCreateIC) _ANSI_ARGS_((XIM xim, ...)); /* 100 */ + XVisualInfo * (*xGetVisualInfo) _ANSI_ARGS_((Display *display, long vinfo_mask, XVisualInfo *vinfo_template, int *nitems_return)); /* 101 */ + void (*xSetWMClientMachine) _ANSI_ARGS_((Display *display, Window w, XTextProperty *text_prop)); /* 102 */ + Status (*xStringListToTextProperty) _ANSI_ARGS_((char **list, int count, XTextProperty *text_prop_return)); /* 103 */ + int (*xDrawLine) _ANSI_ARGS_((Display *d, Drawable dr, GC g, int x1, int y1, int x2, int y2)); /* 104 */ + int (*xWarpPointer) _ANSI_ARGS_((Display *d, Window s, Window dw, int sx, int sy, unsigned int sw, unsigned int sh, int dx, int dy)); /* 105 */ + int (*xFillRectangle) _ANSI_ARGS_((Display *display, Drawable d, GC gc, int x, int y, unsigned int width, unsigned int height)); /* 106 */ + int (*xFlush) _ANSI_ARGS_((Display *display)); /* 107 */ + int (*xGrabServer) _ANSI_ARGS_((Display *display)); /* 108 */ + int (*xUngrabServer) _ANSI_ARGS_((Display *display)); /* 109 */ + int (*xFree) _ANSI_ARGS_((VOID *data)); /* 110 */ + int (*xNoOp) _ANSI_ARGS_((Display *display)); /* 111 */ + XAfterFunction (*xSynchronize) _ANSI_ARGS_((Display *display, Bool onoff)); /* 112 */ + int (*xSync) _ANSI_ARGS_((Display *display, Bool discard)); /* 113 */ + VisualID (*xVisualIDFromVisual) _ANSI_ARGS_((Visual *visual)); /* 114 */ +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ + int (*xSetDashes) _ANSI_ARGS_((Display *display, GC gc, int dash_offset, _Xconst char *dash_list, int n)); /* 0 */ + XModifierKeymap * (*xGetModifierMapping) _ANSI_ARGS_((Display *d)); /* 1 */ + XImage * (*xCreateImage) _ANSI_ARGS_((Display *d, Visual *v, unsigned int ui1, int i1, int i2, char *cp, unsigned int ui2, unsigned int ui3, int i3, int i4)); /* 2 */ + XImage * (*xGetImage) _ANSI_ARGS_((Display *d, Drawable dr, int i1, int i2, unsigned int ui1, unsigned int ui2, unsigned long ul, int i3)); /* 3 */ + char * (*xGetAtomName) _ANSI_ARGS_((Display *d, Atom a)); /* 4 */ + char * (*xKeysymToString) _ANSI_ARGS_((KeySym k)); /* 5 */ + Colormap (*xCreateColormap) _ANSI_ARGS_((Display *d, Window w, Visual *v, int i)); /* 6 */ + GContext (*xGContextFromGC) _ANSI_ARGS_((GC g)); /* 7 */ + KeySym (*xKeycodeToKeysym) _ANSI_ARGS_((Display *d, KeyCode k, int i)); /* 8 */ + KeySym (*xStringToKeysym) _ANSI_ARGS_((_Xconst char *c)); /* 9 */ + Window (*xRootWindow) _ANSI_ARGS_((Display *d, int i)); /* 10 */ + XErrorHandler (*xSetErrorHandler) _ANSI_ARGS_((XErrorHandler x)); /* 11 */ + Status (*xAllocColor) _ANSI_ARGS_((Display *d, Colormap c, XColor *xp)); /* 12 */ + int (*xBell) _ANSI_ARGS_((Display *d, int i)); /* 13 */ + void (*xChangeProperty) _ANSI_ARGS_((Display *d, Window w, Atom a1, Atom a2, int i1, int i2, _Xconst unsigned char *c, int i3)); /* 14 */ + void (*xChangeWindowAttributes) _ANSI_ARGS_((Display *d, Window w, unsigned long ul, XSetWindowAttributes *x)); /* 15 */ + void (*xConfigureWindow) _ANSI_ARGS_((Display *d, Window w, unsigned int i, XWindowChanges *x)); /* 16 */ + void (*xCopyArea) _ANSI_ARGS_((Display *d, Drawable dr1, Drawable dr2, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4)); /* 17 */ + void (*xCopyPlane) _ANSI_ARGS_((Display *d, Drawable dr1, Drawable dr2, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4, unsigned long ul)); /* 18 */ + Pixmap (*xCreateBitmapFromData) _ANSI_ARGS_((Display *display, Drawable d, _Xconst char *data, unsigned int width, unsigned int height)); /* 19 */ + int (*xDefineCursor) _ANSI_ARGS_((Display *d, Window w, Cursor c)); /* 20 */ + void (*xDestroyWindow) _ANSI_ARGS_((Display *d, Window w)); /* 21 */ + void (*xDrawArc) _ANSI_ARGS_((Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4)); /* 22 */ + int (*xDrawLines) _ANSI_ARGS_((Display *d, Drawable dr, GC g, XPoint *x, int i1, int i2)); /* 23 */ + void (*xDrawRectangle) _ANSI_ARGS_((Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2)); /* 24 */ + void (*xFillArc) _ANSI_ARGS_((Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4)); /* 25 */ + void (*xFillPolygon) _ANSI_ARGS_((Display *d, Drawable dr, GC g, XPoint *x, int i1, int i2, int i3)); /* 26 */ + int (*xFillRectangles) _ANSI_ARGS_((Display *d, Drawable dr, GC g, XRectangle *x, int i)); /* 27 */ + int (*xFreeColormap) _ANSI_ARGS_((Display *d, Colormap c)); /* 28 */ + int (*xFreeColors) _ANSI_ARGS_((Display *d, Colormap c, unsigned long *ulp, int i, unsigned long ul)); /* 29 */ + int (*xFreeModifiermap) _ANSI_ARGS_((XModifierKeymap *x)); /* 30 */ + Status (*xGetGeometry) _ANSI_ARGS_((Display *d, Drawable dr, Window *w, int *i1, int *i2, unsigned int *ui1, unsigned int *ui2, unsigned int *ui3, unsigned int *ui4)); /* 31 */ + int (*xGetWindowProperty) _ANSI_ARGS_((Display *d, Window w, Atom a1, long l1, long l2, Bool b, Atom a2, Atom *ap, int *ip, unsigned long *ulp1, unsigned long *ulp2, unsigned char **cpp)); /* 32 */ + int (*xGrabKeyboard) _ANSI_ARGS_((Display *d, Window w, Bool b, int i1, int i2, Time t)); /* 33 */ + int (*xGrabPointer) _ANSI_ARGS_((Display *d, Window w1, Bool b, unsigned int ui, int i1, int i2, Window w2, Cursor c, Time t)); /* 34 */ + KeyCode (*xKeysymToKeycode) _ANSI_ARGS_((Display *d, KeySym k)); /* 35 */ + void (*xMapWindow) _ANSI_ARGS_((Display *d, Window w)); /* 36 */ + void (*xMoveResizeWindow) _ANSI_ARGS_((Display *d, Window w, int i1, int i2, unsigned int ui1, unsigned int ui2)); /* 37 */ + void (*xMoveWindow) _ANSI_ARGS_((Display *d, Window w, int i1, int i2)); /* 38 */ + Bool (*xQueryPointer) _ANSI_ARGS_((Display *d, Window w1, Window *w2, Window *w3, int *i1, int *i2, int *i3, int *i4, unsigned int *ui)); /* 39 */ + void (*xRaiseWindow) _ANSI_ARGS_((Display *d, Window w)); /* 40 */ + void (*xRefreshKeyboardMapping) _ANSI_ARGS_((XMappingEvent *x)); /* 41 */ + void (*xResizeWindow) _ANSI_ARGS_((Display *d, Window w, unsigned int ui1, unsigned int ui2)); /* 42 */ + void (*xSelectInput) _ANSI_ARGS_((Display *d, Window w, long l)); /* 43 */ + Status (*xSendEvent) _ANSI_ARGS_((Display *d, Window w, Bool b, long l, XEvent *x)); /* 44 */ + void (*xSetIconName) _ANSI_ARGS_((Display *d, Window w, _Xconst char *c)); /* 45 */ + void (*xSetInputFocus) _ANSI_ARGS_((Display *d, Window w, int i, Time t)); /* 46 */ + int (*xSetSelectionOwner) _ANSI_ARGS_((Display *d, Atom a, Window w, Time t)); /* 47 */ + void (*xSetWindowBackground) _ANSI_ARGS_((Display *d, Window w, unsigned long ul)); /* 48 */ + void (*xSetWindowBackgroundPixmap) _ANSI_ARGS_((Display *d, Window w, Pixmap p)); /* 49 */ + void (*xSetWindowBorder) _ANSI_ARGS_((Display *d, Window w, unsigned long ul)); /* 50 */ + void (*xSetWindowBorderPixmap) _ANSI_ARGS_((Display *d, Window w, Pixmap p)); /* 51 */ + void (*xSetWindowBorderWidth) _ANSI_ARGS_((Display *d, Window w, unsigned int ui)); /* 52 */ + void (*xSetWindowColormap) _ANSI_ARGS_((Display *d, Window w, Colormap c)); /* 53 */ + void (*xUngrabKeyboard) _ANSI_ARGS_((Display *d, Time t)); /* 54 */ + int (*xUngrabPointer) _ANSI_ARGS_((Display *d, Time t)); /* 55 */ + void (*xUnmapWindow) _ANSI_ARGS_((Display *d, Window w)); /* 56 */ + int (*tkPutImage) _ANSI_ARGS_((unsigned long *colors, int ncolors, Display *display, Drawable d, GC gc, XImage *image, int src_x, int src_y, int dest_x, int dest_y, unsigned int width, unsigned int height)); /* 57 */ + Status (*xParseColor) _ANSI_ARGS_((Display *display, Colormap map, _Xconst char *spec, XColor *colorPtr)); /* 58 */ + GC (*xCreateGC) _ANSI_ARGS_((Display *display, Drawable d, unsigned long valuemask, XGCValues *values)); /* 59 */ + int (*xFreeGC) _ANSI_ARGS_((Display *display, GC gc)); /* 60 */ + Atom (*xInternAtom) _ANSI_ARGS_((Display *display, _Xconst char *atom_name, Bool only_if_exists)); /* 61 */ + int (*xSetBackground) _ANSI_ARGS_((Display *display, GC gc, unsigned long foreground)); /* 62 */ + int (*xSetForeground) _ANSI_ARGS_((Display *display, GC gc, unsigned long foreground)); /* 63 */ + int (*xSetClipMask) _ANSI_ARGS_((Display *display, GC gc, Pixmap pixmap)); /* 64 */ + int (*xSetClipOrigin) _ANSI_ARGS_((Display *display, GC gc, int clip_x_origin, int clip_y_origin)); /* 65 */ + int (*xSetTSOrigin) _ANSI_ARGS_((Display *display, GC gc, int ts_x_origin, int ts_y_origin)); /* 66 */ + int (*xChangeGC) _ANSI_ARGS_((Display *d, GC gc, unsigned long mask, XGCValues *values)); /* 67 */ + int (*xSetFont) _ANSI_ARGS_((Display *display, GC gc, Font font)); /* 68 */ + int (*xSetArcMode) _ANSI_ARGS_((Display *display, GC gc, int arc_mode)); /* 69 */ + int (*xSetStipple) _ANSI_ARGS_((Display *display, GC gc, Pixmap stipple)); /* 70 */ + int (*xSetFillRule) _ANSI_ARGS_((Display *display, GC gc, int fill_rule)); /* 71 */ + int (*xSetFillStyle) _ANSI_ARGS_((Display *display, GC gc, int fill_style)); /* 72 */ + int (*xSetFunction) _ANSI_ARGS_((Display *display, GC gc, int function)); /* 73 */ + int (*xSetLineAttributes) _ANSI_ARGS_((Display *display, GC gc, unsigned int line_width, int line_style, int cap_style, int join_style)); /* 74 */ + int (*_XInitImageFuncPtrs) _ANSI_ARGS_((XImage *image)); /* 75 */ + XIC (*xCreateIC) _ANSI_ARGS_((void)); /* 76 */ + XVisualInfo * (*xGetVisualInfo) _ANSI_ARGS_((Display *display, long vinfo_mask, XVisualInfo *vinfo_template, int *nitems_return)); /* 77 */ + void (*xSetWMClientMachine) _ANSI_ARGS_((Display *display, Window w, XTextProperty *text_prop)); /* 78 */ + Status (*xStringListToTextProperty) _ANSI_ARGS_((char **list, int count, XTextProperty *text_prop_return)); /* 79 */ + void (*xDrawSegments) _ANSI_ARGS_((Display *display, Drawable d, GC gc, XSegment *segments, int nsegments)); /* 80 */ + void (*xForceScreenSaver) _ANSI_ARGS_((Display *display, int mode)); /* 81 */ + int (*xDrawLine) _ANSI_ARGS_((Display *d, Drawable dr, GC g, int x1, int y1, int x2, int y2)); /* 82 */ + int (*xFillRectangle) _ANSI_ARGS_((Display *display, Drawable d, GC gc, int x, int y, unsigned int width, unsigned int height)); /* 83 */ + void (*xClearWindow) _ANSI_ARGS_((Display *d, Window w)); /* 84 */ + void (*xDrawPoint) _ANSI_ARGS_((Display *display, Drawable d, GC gc, int x, int y)); /* 85 */ + void (*xDrawPoints) _ANSI_ARGS_((Display *display, Drawable d, GC gc, XPoint *points, int npoints, int mode)); /* 86 */ + int (*xWarpPointer) _ANSI_ARGS_((Display *display, Window src_w, Window dest_w, int src_x, int src_y, unsigned int src_width, unsigned int src_height, int dest_x, int dest_y)); /* 87 */ + void (*xQueryColor) _ANSI_ARGS_((Display *display, Colormap colormap, XColor *def_in_out)); /* 88 */ + void (*xQueryColors) _ANSI_ARGS_((Display *display, Colormap colormap, XColor *defs_in_out, int ncolors)); /* 89 */ + Status (*xQueryTree) _ANSI_ARGS_((Display *d, Window w1, Window *w2, Window *w3, Window **w4, unsigned int *ui)); /* 90 */ + int (*xSync) _ANSI_ARGS_((Display *display, Bool flag)); /* 91 */ +#endif /* AQUA */ +} TkIntXlibStubs; + +#ifdef __cplusplus +extern "C" { +#endif +extern TkIntXlibStubs *tkIntXlibStubsPtr; +#ifdef __cplusplus +} +#endif + +#if defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) + +/* + * Inline function declarations: + */ + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ +#ifndef XSetDashes +#define XSetDashes \ + (tkIntXlibStubsPtr->xSetDashes) /* 0 */ +#endif +#ifndef XGetModifierMapping +#define XGetModifierMapping \ + (tkIntXlibStubsPtr->xGetModifierMapping) /* 1 */ +#endif +#ifndef XCreateImage +#define XCreateImage \ + (tkIntXlibStubsPtr->xCreateImage) /* 2 */ +#endif +#ifndef XGetImage +#define XGetImage \ + (tkIntXlibStubsPtr->xGetImage) /* 3 */ +#endif +#ifndef XGetAtomName +#define XGetAtomName \ + (tkIntXlibStubsPtr->xGetAtomName) /* 4 */ +#endif +#ifndef XKeysymToString +#define XKeysymToString \ + (tkIntXlibStubsPtr->xKeysymToString) /* 5 */ +#endif +#ifndef XCreateColormap +#define XCreateColormap \ + (tkIntXlibStubsPtr->xCreateColormap) /* 6 */ +#endif +#ifndef XCreatePixmapCursor +#define XCreatePixmapCursor \ + (tkIntXlibStubsPtr->xCreatePixmapCursor) /* 7 */ +#endif +#ifndef XCreateGlyphCursor +#define XCreateGlyphCursor \ + (tkIntXlibStubsPtr->xCreateGlyphCursor) /* 8 */ +#endif +#ifndef XGContextFromGC +#define XGContextFromGC \ + (tkIntXlibStubsPtr->xGContextFromGC) /* 9 */ +#endif +#ifndef XListHosts +#define XListHosts \ + (tkIntXlibStubsPtr->xListHosts) /* 10 */ +#endif +#ifndef XKeycodeToKeysym +#define XKeycodeToKeysym \ + (tkIntXlibStubsPtr->xKeycodeToKeysym) /* 11 */ +#endif +#ifndef XStringToKeysym +#define XStringToKeysym \ + (tkIntXlibStubsPtr->xStringToKeysym) /* 12 */ +#endif +#ifndef XRootWindow +#define XRootWindow \ + (tkIntXlibStubsPtr->xRootWindow) /* 13 */ +#endif +#ifndef XSetErrorHandler +#define XSetErrorHandler \ + (tkIntXlibStubsPtr->xSetErrorHandler) /* 14 */ +#endif +#ifndef XIconifyWindow +#define XIconifyWindow \ + (tkIntXlibStubsPtr->xIconifyWindow) /* 15 */ +#endif +#ifndef XWithdrawWindow +#define XWithdrawWindow \ + (tkIntXlibStubsPtr->xWithdrawWindow) /* 16 */ +#endif +#ifndef XGetWMColormapWindows +#define XGetWMColormapWindows \ + (tkIntXlibStubsPtr->xGetWMColormapWindows) /* 17 */ +#endif +#ifndef XAllocColor +#define XAllocColor \ + (tkIntXlibStubsPtr->xAllocColor) /* 18 */ +#endif +#ifndef XBell +#define XBell \ + (tkIntXlibStubsPtr->xBell) /* 19 */ +#endif +#ifndef XChangeProperty +#define XChangeProperty \ + (tkIntXlibStubsPtr->xChangeProperty) /* 20 */ +#endif +#ifndef XChangeWindowAttributes +#define XChangeWindowAttributes \ + (tkIntXlibStubsPtr->xChangeWindowAttributes) /* 21 */ +#endif +#ifndef XClearWindow +#define XClearWindow \ + (tkIntXlibStubsPtr->xClearWindow) /* 22 */ +#endif +#ifndef XConfigureWindow +#define XConfigureWindow \ + (tkIntXlibStubsPtr->xConfigureWindow) /* 23 */ +#endif +#ifndef XCopyArea +#define XCopyArea \ + (tkIntXlibStubsPtr->xCopyArea) /* 24 */ +#endif +#ifndef XCopyPlane +#define XCopyPlane \ + (tkIntXlibStubsPtr->xCopyPlane) /* 25 */ +#endif +#ifndef XCreateBitmapFromData +#define XCreateBitmapFromData \ + (tkIntXlibStubsPtr->xCreateBitmapFromData) /* 26 */ +#endif +#ifndef XDefineCursor +#define XDefineCursor \ + (tkIntXlibStubsPtr->xDefineCursor) /* 27 */ +#endif +#ifndef XDeleteProperty +#define XDeleteProperty \ + (tkIntXlibStubsPtr->xDeleteProperty) /* 28 */ +#endif +#ifndef XDestroyWindow +#define XDestroyWindow \ + (tkIntXlibStubsPtr->xDestroyWindow) /* 29 */ +#endif +#ifndef XDrawArc +#define XDrawArc \ + (tkIntXlibStubsPtr->xDrawArc) /* 30 */ +#endif +#ifndef XDrawLines +#define XDrawLines \ + (tkIntXlibStubsPtr->xDrawLines) /* 31 */ +#endif +#ifndef XDrawRectangle +#define XDrawRectangle \ + (tkIntXlibStubsPtr->xDrawRectangle) /* 32 */ +#endif +#ifndef XFillArc +#define XFillArc \ + (tkIntXlibStubsPtr->xFillArc) /* 33 */ +#endif +#ifndef XFillPolygon +#define XFillPolygon \ + (tkIntXlibStubsPtr->xFillPolygon) /* 34 */ +#endif +#ifndef XFillRectangles +#define XFillRectangles \ + (tkIntXlibStubsPtr->xFillRectangles) /* 35 */ +#endif +#ifndef XForceScreenSaver +#define XForceScreenSaver \ + (tkIntXlibStubsPtr->xForceScreenSaver) /* 36 */ +#endif +#ifndef XFreeColormap +#define XFreeColormap \ + (tkIntXlibStubsPtr->xFreeColormap) /* 37 */ +#endif +#ifndef XFreeColors +#define XFreeColors \ + (tkIntXlibStubsPtr->xFreeColors) /* 38 */ +#endif +#ifndef XFreeCursor +#define XFreeCursor \ + (tkIntXlibStubsPtr->xFreeCursor) /* 39 */ +#endif +#ifndef XFreeModifiermap +#define XFreeModifiermap \ + (tkIntXlibStubsPtr->xFreeModifiermap) /* 40 */ +#endif +#ifndef XGetGeometry +#define XGetGeometry \ + (tkIntXlibStubsPtr->xGetGeometry) /* 41 */ +#endif +#ifndef XGetInputFocus +#define XGetInputFocus \ + (tkIntXlibStubsPtr->xGetInputFocus) /* 42 */ +#endif +#ifndef XGetWindowProperty +#define XGetWindowProperty \ + (tkIntXlibStubsPtr->xGetWindowProperty) /* 43 */ +#endif +#ifndef XGetWindowAttributes +#define XGetWindowAttributes \ + (tkIntXlibStubsPtr->xGetWindowAttributes) /* 44 */ +#endif +#ifndef XGrabKeyboard +#define XGrabKeyboard \ + (tkIntXlibStubsPtr->xGrabKeyboard) /* 45 */ +#endif +#ifndef XGrabPointer +#define XGrabPointer \ + (tkIntXlibStubsPtr->xGrabPointer) /* 46 */ +#endif +#ifndef XKeysymToKeycode +#define XKeysymToKeycode \ + (tkIntXlibStubsPtr->xKeysymToKeycode) /* 47 */ +#endif +#ifndef XLookupColor +#define XLookupColor \ + (tkIntXlibStubsPtr->xLookupColor) /* 48 */ +#endif +#ifndef XMapWindow +#define XMapWindow \ + (tkIntXlibStubsPtr->xMapWindow) /* 49 */ +#endif +#ifndef XMoveResizeWindow +#define XMoveResizeWindow \ + (tkIntXlibStubsPtr->xMoveResizeWindow) /* 50 */ +#endif +#ifndef XMoveWindow +#define XMoveWindow \ + (tkIntXlibStubsPtr->xMoveWindow) /* 51 */ +#endif +#ifndef XNextEvent +#define XNextEvent \ + (tkIntXlibStubsPtr->xNextEvent) /* 52 */ +#endif +#ifndef XPutBackEvent +#define XPutBackEvent \ + (tkIntXlibStubsPtr->xPutBackEvent) /* 53 */ +#endif +#ifndef XQueryColors +#define XQueryColors \ + (tkIntXlibStubsPtr->xQueryColors) /* 54 */ +#endif +#ifndef XQueryPointer +#define XQueryPointer \ + (tkIntXlibStubsPtr->xQueryPointer) /* 55 */ +#endif +#ifndef XQueryTree +#define XQueryTree \ + (tkIntXlibStubsPtr->xQueryTree) /* 56 */ +#endif +#ifndef XRaiseWindow +#define XRaiseWindow \ + (tkIntXlibStubsPtr->xRaiseWindow) /* 57 */ +#endif +#ifndef XRefreshKeyboardMapping +#define XRefreshKeyboardMapping \ + (tkIntXlibStubsPtr->xRefreshKeyboardMapping) /* 58 */ +#endif +#ifndef XResizeWindow +#define XResizeWindow \ + (tkIntXlibStubsPtr->xResizeWindow) /* 59 */ +#endif +#ifndef XSelectInput +#define XSelectInput \ + (tkIntXlibStubsPtr->xSelectInput) /* 60 */ +#endif +#ifndef XSendEvent +#define XSendEvent \ + (tkIntXlibStubsPtr->xSendEvent) /* 61 */ +#endif +#ifndef XSetCommand +#define XSetCommand \ + (tkIntXlibStubsPtr->xSetCommand) /* 62 */ +#endif +#ifndef XSetIconName +#define XSetIconName \ + (tkIntXlibStubsPtr->xSetIconName) /* 63 */ +#endif +#ifndef XSetInputFocus +#define XSetInputFocus \ + (tkIntXlibStubsPtr->xSetInputFocus) /* 64 */ +#endif +#ifndef XSetSelectionOwner +#define XSetSelectionOwner \ + (tkIntXlibStubsPtr->xSetSelectionOwner) /* 65 */ +#endif +#ifndef XSetWindowBackground +#define XSetWindowBackground \ + (tkIntXlibStubsPtr->xSetWindowBackground) /* 66 */ +#endif +#ifndef XSetWindowBackgroundPixmap +#define XSetWindowBackgroundPixmap \ + (tkIntXlibStubsPtr->xSetWindowBackgroundPixmap) /* 67 */ +#endif +#ifndef XSetWindowBorder +#define XSetWindowBorder \ + (tkIntXlibStubsPtr->xSetWindowBorder) /* 68 */ +#endif +#ifndef XSetWindowBorderPixmap +#define XSetWindowBorderPixmap \ + (tkIntXlibStubsPtr->xSetWindowBorderPixmap) /* 69 */ +#endif +#ifndef XSetWindowBorderWidth +#define XSetWindowBorderWidth \ + (tkIntXlibStubsPtr->xSetWindowBorderWidth) /* 70 */ +#endif +#ifndef XSetWindowColormap +#define XSetWindowColormap \ + (tkIntXlibStubsPtr->xSetWindowColormap) /* 71 */ +#endif +#ifndef XTranslateCoordinates +#define XTranslateCoordinates \ + (tkIntXlibStubsPtr->xTranslateCoordinates) /* 72 */ +#endif +#ifndef XUngrabKeyboard +#define XUngrabKeyboard \ + (tkIntXlibStubsPtr->xUngrabKeyboard) /* 73 */ +#endif +#ifndef XUngrabPointer +#define XUngrabPointer \ + (tkIntXlibStubsPtr->xUngrabPointer) /* 74 */ +#endif +#ifndef XUnmapWindow +#define XUnmapWindow \ + (tkIntXlibStubsPtr->xUnmapWindow) /* 75 */ +#endif +#ifndef XWindowEvent +#define XWindowEvent \ + (tkIntXlibStubsPtr->xWindowEvent) /* 76 */ +#endif +#ifndef XDestroyIC +#define XDestroyIC \ + (tkIntXlibStubsPtr->xDestroyIC) /* 77 */ +#endif +#ifndef XFilterEvent +#define XFilterEvent \ + (tkIntXlibStubsPtr->xFilterEvent) /* 78 */ +#endif +#ifndef XmbLookupString +#define XmbLookupString \ + (tkIntXlibStubsPtr->xmbLookupString) /* 79 */ +#endif +#ifndef TkPutImage +#define TkPutImage \ + (tkIntXlibStubsPtr->tkPutImage) /* 80 */ +#endif +/* Slot 81 is reserved */ +#ifndef XParseColor +#define XParseColor \ + (tkIntXlibStubsPtr->xParseColor) /* 82 */ +#endif +#ifndef XCreateGC +#define XCreateGC \ + (tkIntXlibStubsPtr->xCreateGC) /* 83 */ +#endif +#ifndef XFreeGC +#define XFreeGC \ + (tkIntXlibStubsPtr->xFreeGC) /* 84 */ +#endif +#ifndef XInternAtom +#define XInternAtom \ + (tkIntXlibStubsPtr->xInternAtom) /* 85 */ +#endif +#ifndef XSetBackground +#define XSetBackground \ + (tkIntXlibStubsPtr->xSetBackground) /* 86 */ +#endif +#ifndef XSetForeground +#define XSetForeground \ + (tkIntXlibStubsPtr->xSetForeground) /* 87 */ +#endif +#ifndef XSetClipMask +#define XSetClipMask \ + (tkIntXlibStubsPtr->xSetClipMask) /* 88 */ +#endif +#ifndef XSetClipOrigin +#define XSetClipOrigin \ + (tkIntXlibStubsPtr->xSetClipOrigin) /* 89 */ +#endif +#ifndef XSetTSOrigin +#define XSetTSOrigin \ + (tkIntXlibStubsPtr->xSetTSOrigin) /* 90 */ +#endif +#ifndef XChangeGC +#define XChangeGC \ + (tkIntXlibStubsPtr->xChangeGC) /* 91 */ +#endif +#ifndef XSetFont +#define XSetFont \ + (tkIntXlibStubsPtr->xSetFont) /* 92 */ +#endif +#ifndef XSetArcMode +#define XSetArcMode \ + (tkIntXlibStubsPtr->xSetArcMode) /* 93 */ +#endif +#ifndef XSetStipple +#define XSetStipple \ + (tkIntXlibStubsPtr->xSetStipple) /* 94 */ +#endif +#ifndef XSetFillRule +#define XSetFillRule \ + (tkIntXlibStubsPtr->xSetFillRule) /* 95 */ +#endif +#ifndef XSetFillStyle +#define XSetFillStyle \ + (tkIntXlibStubsPtr->xSetFillStyle) /* 96 */ +#endif +#ifndef XSetFunction +#define XSetFunction \ + (tkIntXlibStubsPtr->xSetFunction) /* 97 */ +#endif +#ifndef XSetLineAttributes +#define XSetLineAttributes \ + (tkIntXlibStubsPtr->xSetLineAttributes) /* 98 */ +#endif +#ifndef _XInitImageFuncPtrs +#define _XInitImageFuncPtrs \ + (tkIntXlibStubsPtr->_XInitImageFuncPtrs) /* 99 */ +#endif +#ifndef XCreateIC +#define XCreateIC \ + (tkIntXlibStubsPtr->xCreateIC) /* 100 */ +#endif +#ifndef XGetVisualInfo +#define XGetVisualInfo \ + (tkIntXlibStubsPtr->xGetVisualInfo) /* 101 */ +#endif +#ifndef XSetWMClientMachine +#define XSetWMClientMachine \ + (tkIntXlibStubsPtr->xSetWMClientMachine) /* 102 */ +#endif +#ifndef XStringListToTextProperty +#define XStringListToTextProperty \ + (tkIntXlibStubsPtr->xStringListToTextProperty) /* 103 */ +#endif +#ifndef XDrawLine +#define XDrawLine \ + (tkIntXlibStubsPtr->xDrawLine) /* 104 */ +#endif +#ifndef XWarpPointer +#define XWarpPointer \ + (tkIntXlibStubsPtr->xWarpPointer) /* 105 */ +#endif +#ifndef XFillRectangle +#define XFillRectangle \ + (tkIntXlibStubsPtr->xFillRectangle) /* 106 */ +#endif +#ifndef XFlush +#define XFlush \ + (tkIntXlibStubsPtr->xFlush) /* 107 */ +#endif +#ifndef XGrabServer +#define XGrabServer \ + (tkIntXlibStubsPtr->xGrabServer) /* 108 */ +#endif +#ifndef XUngrabServer +#define XUngrabServer \ + (tkIntXlibStubsPtr->xUngrabServer) /* 109 */ +#endif +#ifndef XFree +#define XFree \ + (tkIntXlibStubsPtr->xFree) /* 110 */ +#endif +#ifndef XNoOp +#define XNoOp \ + (tkIntXlibStubsPtr->xNoOp) /* 111 */ +#endif +#ifndef XSynchronize +#define XSynchronize \ + (tkIntXlibStubsPtr->xSynchronize) /* 112 */ +#endif +#ifndef XSync +#define XSync \ + (tkIntXlibStubsPtr->xSync) /* 113 */ +#endif +#ifndef XVisualIDFromVisual +#define XVisualIDFromVisual \ + (tkIntXlibStubsPtr->xVisualIDFromVisual) /* 114 */ +#endif +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ +#ifndef XSetDashes +#define XSetDashes \ + (tkIntXlibStubsPtr->xSetDashes) /* 0 */ +#endif +#ifndef XGetModifierMapping +#define XGetModifierMapping \ + (tkIntXlibStubsPtr->xGetModifierMapping) /* 1 */ +#endif +#ifndef XCreateImage +#define XCreateImage \ + (tkIntXlibStubsPtr->xCreateImage) /* 2 */ +#endif +#ifndef XGetImage +#define XGetImage \ + (tkIntXlibStubsPtr->xGetImage) /* 3 */ +#endif +#ifndef XGetAtomName +#define XGetAtomName \ + (tkIntXlibStubsPtr->xGetAtomName) /* 4 */ +#endif +#ifndef XKeysymToString +#define XKeysymToString \ + (tkIntXlibStubsPtr->xKeysymToString) /* 5 */ +#endif +#ifndef XCreateColormap +#define XCreateColormap \ + (tkIntXlibStubsPtr->xCreateColormap) /* 6 */ +#endif +#ifndef XGContextFromGC +#define XGContextFromGC \ + (tkIntXlibStubsPtr->xGContextFromGC) /* 7 */ +#endif +#ifndef XKeycodeToKeysym +#define XKeycodeToKeysym \ + (tkIntXlibStubsPtr->xKeycodeToKeysym) /* 8 */ +#endif +#ifndef XStringToKeysym +#define XStringToKeysym \ + (tkIntXlibStubsPtr->xStringToKeysym) /* 9 */ +#endif +#ifndef XRootWindow +#define XRootWindow \ + (tkIntXlibStubsPtr->xRootWindow) /* 10 */ +#endif +#ifndef XSetErrorHandler +#define XSetErrorHandler \ + (tkIntXlibStubsPtr->xSetErrorHandler) /* 11 */ +#endif +#ifndef XAllocColor +#define XAllocColor \ + (tkIntXlibStubsPtr->xAllocColor) /* 12 */ +#endif +#ifndef XBell +#define XBell \ + (tkIntXlibStubsPtr->xBell) /* 13 */ +#endif +#ifndef XChangeProperty +#define XChangeProperty \ + (tkIntXlibStubsPtr->xChangeProperty) /* 14 */ +#endif +#ifndef XChangeWindowAttributes +#define XChangeWindowAttributes \ + (tkIntXlibStubsPtr->xChangeWindowAttributes) /* 15 */ +#endif +#ifndef XConfigureWindow +#define XConfigureWindow \ + (tkIntXlibStubsPtr->xConfigureWindow) /* 16 */ +#endif +#ifndef XCopyArea +#define XCopyArea \ + (tkIntXlibStubsPtr->xCopyArea) /* 17 */ +#endif +#ifndef XCopyPlane +#define XCopyPlane \ + (tkIntXlibStubsPtr->xCopyPlane) /* 18 */ +#endif +#ifndef XCreateBitmapFromData +#define XCreateBitmapFromData \ + (tkIntXlibStubsPtr->xCreateBitmapFromData) /* 19 */ +#endif +#ifndef XDefineCursor +#define XDefineCursor \ + (tkIntXlibStubsPtr->xDefineCursor) /* 20 */ +#endif +#ifndef XDestroyWindow +#define XDestroyWindow \ + (tkIntXlibStubsPtr->xDestroyWindow) /* 21 */ +#endif +#ifndef XDrawArc +#define XDrawArc \ + (tkIntXlibStubsPtr->xDrawArc) /* 22 */ +#endif +#ifndef XDrawLines +#define XDrawLines \ + (tkIntXlibStubsPtr->xDrawLines) /* 23 */ +#endif +#ifndef XDrawRectangle +#define XDrawRectangle \ + (tkIntXlibStubsPtr->xDrawRectangle) /* 24 */ +#endif +#ifndef XFillArc +#define XFillArc \ + (tkIntXlibStubsPtr->xFillArc) /* 25 */ +#endif +#ifndef XFillPolygon +#define XFillPolygon \ + (tkIntXlibStubsPtr->xFillPolygon) /* 26 */ +#endif +#ifndef XFillRectangles +#define XFillRectangles \ + (tkIntXlibStubsPtr->xFillRectangles) /* 27 */ +#endif +#ifndef XFreeColormap +#define XFreeColormap \ + (tkIntXlibStubsPtr->xFreeColormap) /* 28 */ +#endif +#ifndef XFreeColors +#define XFreeColors \ + (tkIntXlibStubsPtr->xFreeColors) /* 29 */ +#endif +#ifndef XFreeModifiermap +#define XFreeModifiermap \ + (tkIntXlibStubsPtr->xFreeModifiermap) /* 30 */ +#endif +#ifndef XGetGeometry +#define XGetGeometry \ + (tkIntXlibStubsPtr->xGetGeometry) /* 31 */ +#endif +#ifndef XGetWindowProperty +#define XGetWindowProperty \ + (tkIntXlibStubsPtr->xGetWindowProperty) /* 32 */ +#endif +#ifndef XGrabKeyboard +#define XGrabKeyboard \ + (tkIntXlibStubsPtr->xGrabKeyboard) /* 33 */ +#endif +#ifndef XGrabPointer +#define XGrabPointer \ + (tkIntXlibStubsPtr->xGrabPointer) /* 34 */ +#endif +#ifndef XKeysymToKeycode +#define XKeysymToKeycode \ + (tkIntXlibStubsPtr->xKeysymToKeycode) /* 35 */ +#endif +#ifndef XMapWindow +#define XMapWindow \ + (tkIntXlibStubsPtr->xMapWindow) /* 36 */ +#endif +#ifndef XMoveResizeWindow +#define XMoveResizeWindow \ + (tkIntXlibStubsPtr->xMoveResizeWindow) /* 37 */ +#endif +#ifndef XMoveWindow +#define XMoveWindow \ + (tkIntXlibStubsPtr->xMoveWindow) /* 38 */ +#endif +#ifndef XQueryPointer +#define XQueryPointer \ + (tkIntXlibStubsPtr->xQueryPointer) /* 39 */ +#endif +#ifndef XRaiseWindow +#define XRaiseWindow \ + (tkIntXlibStubsPtr->xRaiseWindow) /* 40 */ +#endif +#ifndef XRefreshKeyboardMapping +#define XRefreshKeyboardMapping \ + (tkIntXlibStubsPtr->xRefreshKeyboardMapping) /* 41 */ +#endif +#ifndef XResizeWindow +#define XResizeWindow \ + (tkIntXlibStubsPtr->xResizeWindow) /* 42 */ +#endif +#ifndef XSelectInput +#define XSelectInput \ + (tkIntXlibStubsPtr->xSelectInput) /* 43 */ +#endif +#ifndef XSendEvent +#define XSendEvent \ + (tkIntXlibStubsPtr->xSendEvent) /* 44 */ +#endif +#ifndef XSetIconName +#define XSetIconName \ + (tkIntXlibStubsPtr->xSetIconName) /* 45 */ +#endif +#ifndef XSetInputFocus +#define XSetInputFocus \ + (tkIntXlibStubsPtr->xSetInputFocus) /* 46 */ +#endif +#ifndef XSetSelectionOwner +#define XSetSelectionOwner \ + (tkIntXlibStubsPtr->xSetSelectionOwner) /* 47 */ +#endif +#ifndef XSetWindowBackground +#define XSetWindowBackground \ + (tkIntXlibStubsPtr->xSetWindowBackground) /* 48 */ +#endif +#ifndef XSetWindowBackgroundPixmap +#define XSetWindowBackgroundPixmap \ + (tkIntXlibStubsPtr->xSetWindowBackgroundPixmap) /* 49 */ +#endif +#ifndef XSetWindowBorder +#define XSetWindowBorder \ + (tkIntXlibStubsPtr->xSetWindowBorder) /* 50 */ +#endif +#ifndef XSetWindowBorderPixmap +#define XSetWindowBorderPixmap \ + (tkIntXlibStubsPtr->xSetWindowBorderPixmap) /* 51 */ +#endif +#ifndef XSetWindowBorderWidth +#define XSetWindowBorderWidth \ + (tkIntXlibStubsPtr->xSetWindowBorderWidth) /* 52 */ +#endif +#ifndef XSetWindowColormap +#define XSetWindowColormap \ + (tkIntXlibStubsPtr->xSetWindowColormap) /* 53 */ +#endif +#ifndef XUngrabKeyboard +#define XUngrabKeyboard \ + (tkIntXlibStubsPtr->xUngrabKeyboard) /* 54 */ +#endif +#ifndef XUngrabPointer +#define XUngrabPointer \ + (tkIntXlibStubsPtr->xUngrabPointer) /* 55 */ +#endif +#ifndef XUnmapWindow +#define XUnmapWindow \ + (tkIntXlibStubsPtr->xUnmapWindow) /* 56 */ +#endif +#ifndef TkPutImage +#define TkPutImage \ + (tkIntXlibStubsPtr->tkPutImage) /* 57 */ +#endif +#ifndef XParseColor +#define XParseColor \ + (tkIntXlibStubsPtr->xParseColor) /* 58 */ +#endif +#ifndef XCreateGC +#define XCreateGC \ + (tkIntXlibStubsPtr->xCreateGC) /* 59 */ +#endif +#ifndef XFreeGC +#define XFreeGC \ + (tkIntXlibStubsPtr->xFreeGC) /* 60 */ +#endif +#ifndef XInternAtom +#define XInternAtom \ + (tkIntXlibStubsPtr->xInternAtom) /* 61 */ +#endif +#ifndef XSetBackground +#define XSetBackground \ + (tkIntXlibStubsPtr->xSetBackground) /* 62 */ +#endif +#ifndef XSetForeground +#define XSetForeground \ + (tkIntXlibStubsPtr->xSetForeground) /* 63 */ +#endif +#ifndef XSetClipMask +#define XSetClipMask \ + (tkIntXlibStubsPtr->xSetClipMask) /* 64 */ +#endif +#ifndef XSetClipOrigin +#define XSetClipOrigin \ + (tkIntXlibStubsPtr->xSetClipOrigin) /* 65 */ +#endif +#ifndef XSetTSOrigin +#define XSetTSOrigin \ + (tkIntXlibStubsPtr->xSetTSOrigin) /* 66 */ +#endif +#ifndef XChangeGC +#define XChangeGC \ + (tkIntXlibStubsPtr->xChangeGC) /* 67 */ +#endif +#ifndef XSetFont +#define XSetFont \ + (tkIntXlibStubsPtr->xSetFont) /* 68 */ +#endif +#ifndef XSetArcMode +#define XSetArcMode \ + (tkIntXlibStubsPtr->xSetArcMode) /* 69 */ +#endif +#ifndef XSetStipple +#define XSetStipple \ + (tkIntXlibStubsPtr->xSetStipple) /* 70 */ +#endif +#ifndef XSetFillRule +#define XSetFillRule \ + (tkIntXlibStubsPtr->xSetFillRule) /* 71 */ +#endif +#ifndef XSetFillStyle +#define XSetFillStyle \ + (tkIntXlibStubsPtr->xSetFillStyle) /* 72 */ +#endif +#ifndef XSetFunction +#define XSetFunction \ + (tkIntXlibStubsPtr->xSetFunction) /* 73 */ +#endif +#ifndef XSetLineAttributes +#define XSetLineAttributes \ + (tkIntXlibStubsPtr->xSetLineAttributes) /* 74 */ +#endif +#ifndef _XInitImageFuncPtrs +#define _XInitImageFuncPtrs \ + (tkIntXlibStubsPtr->_XInitImageFuncPtrs) /* 75 */ +#endif +#ifndef XCreateIC +#define XCreateIC \ + (tkIntXlibStubsPtr->xCreateIC) /* 76 */ +#endif +#ifndef XGetVisualInfo +#define XGetVisualInfo \ + (tkIntXlibStubsPtr->xGetVisualInfo) /* 77 */ +#endif +#ifndef XSetWMClientMachine +#define XSetWMClientMachine \ + (tkIntXlibStubsPtr->xSetWMClientMachine) /* 78 */ +#endif +#ifndef XStringListToTextProperty +#define XStringListToTextProperty \ + (tkIntXlibStubsPtr->xStringListToTextProperty) /* 79 */ +#endif +#ifndef XDrawSegments +#define XDrawSegments \ + (tkIntXlibStubsPtr->xDrawSegments) /* 80 */ +#endif +#ifndef XForceScreenSaver +#define XForceScreenSaver \ + (tkIntXlibStubsPtr->xForceScreenSaver) /* 81 */ +#endif +#ifndef XDrawLine +#define XDrawLine \ + (tkIntXlibStubsPtr->xDrawLine) /* 82 */ +#endif +#ifndef XFillRectangle +#define XFillRectangle \ + (tkIntXlibStubsPtr->xFillRectangle) /* 83 */ +#endif +#ifndef XClearWindow +#define XClearWindow \ + (tkIntXlibStubsPtr->xClearWindow) /* 84 */ +#endif +#ifndef XDrawPoint +#define XDrawPoint \ + (tkIntXlibStubsPtr->xDrawPoint) /* 85 */ +#endif +#ifndef XDrawPoints +#define XDrawPoints \ + (tkIntXlibStubsPtr->xDrawPoints) /* 86 */ +#endif +#ifndef XWarpPointer +#define XWarpPointer \ + (tkIntXlibStubsPtr->xWarpPointer) /* 87 */ +#endif +#ifndef XQueryColor +#define XQueryColor \ + (tkIntXlibStubsPtr->xQueryColor) /* 88 */ +#endif +#ifndef XQueryColors +#define XQueryColors \ + (tkIntXlibStubsPtr->xQueryColors) /* 89 */ +#endif +#ifndef XQueryTree +#define XQueryTree \ + (tkIntXlibStubsPtr->xQueryTree) /* 90 */ +#endif +#ifndef XSync +#define XSync \ + (tkIntXlibStubsPtr->xSync) /* 91 */ +#endif +#endif /* AQUA */ + +#endif /* defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) */ + +/* !END!: Do not edit above this line. */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#if defined(__WIN32__) + +#undef XFlush +#undef XGrabServer +#undef XUngrabServer +#undef XFree +#undef XNoOp +#undef XSynchronize +#undef XSync +#undef XVisualIDFromVisual + +#if defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) +/* + * The following stubs implement various calls that don't do anything + * under Windows. In win32 tclsh 8.4 and 8.5 holds: + * tkIntStubsPtr->tkBindDeadWindow != NULL + * Then the following macros don't do anything. But when running Tcl win32 + * version 8.6 or Cygwin (8.4, 8.5 or 8.6) then the functions are available in + * the stub table. The real function from the stub table will be called, + * even though it might be doing nothing. + */ + +#define XFlush(display) (tkIntStubsPtr->tkBindDeadWindow? 0: tkIntXlibStubsPtr->xFlush(display)) +#define XGrabServer(display) (tkIntStubsPtr->tkBindDeadWindow? 0: tkIntXlibStubsPtr->xGrabServer(display)) +#define XUngrabServer(display) (tkIntStubsPtr->tkBindDeadWindow? 0: tkIntXlibStubsPtr->xUngrabServer(display)) + +/* + * The following functions are implemented as macros under Windows. + */ + + +#define XFree(data) (tkIntStubsPtr->tkBindDeadWindow? ((data)? (ckfree((char *) (data)), 0): 0): tkIntXlibStubsPtr->xFree(data)) +#define XNoOp(display) (tkIntStubsPtr->tkBindDeadWindow? 0: tkIntXlibStubsPtr->xNoOp(display)) +#define XSynchronize(display, bool) (tkIntStubsPtr->tkBindDeadWindow? 0: tkIntXlibStubsPtr->xSynchronize(display, bool)) +#define XSync(display, bool) (tkIntStubsPtr->tkBindDeadWindow? 0: tkIntXlibStubsPtr->xSync(display, bool)) +#define XVisualIDFromVisual(visual) (tkIntStubsPtr->tkBindDeadWindow? ((visual)->visualid): tkIntXlibStubsPtr->xVisualIDFromVisual(visual)) + +#else /* !USE_TK_STUBS */ +/* + * The following stubs implement various calls that don't do anything + * under Windows. + */ + +#define XFlush(display) +#define XGrabServer(display) +#define XUngrabServer(display) + +/* + * The following functions are implemented as macros under Windows. + */ + +#define XFree(data) {if ((data) != NULL) ckfree((char *) (data));} +#define XNoOp(display) {display->request++;} +#define XSynchronize(display, bool) {display->request++;} +#define XSync(display, bool) {display->request++;} +#define XVisualIDFromVisual(visual) (visual->visualid) + +#endif /* !USE_TK_STUBS */ + +#endif /* __WIN32__ */ + +#endif /* _TKINTXLIBDECLS */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tcl.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tcl.h new file mode 100644 index 00000000..f16e90ec --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tcl.h @@ -0,0 +1,2380 @@ +/* + * tcl.h -- + * + * This header file describes the externally-visible facilities + * of the Tcl interpreter. + * + * Copyright (c) 1987-1994 The Regents of the University of California. + * Copyright (c) 1993-1996 Lucent Technologies. + * Copyright (c) 1994-1998 Sun Microsystems, Inc. + * Copyright (c) 1998-2000 by Scriptics Corporation. + * Copyright (c) 2002 by Kevin B. Kenny. All rights reserved. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TCL +#define _TCL + +/* + * For C++ compilers, use extern "C" + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The following defines are used to indicate the various release levels. + */ + +#define TCL_ALPHA_RELEASE 0 +#define TCL_BETA_RELEASE 1 +#define TCL_FINAL_RELEASE 2 + +/* + * When version numbers change here, must also go into the following files + * and update the version numbers: + * + * library/init.tcl (only if Major.minor changes, not patchlevel) 1 LOC + * unix/configure.in (2 LOC Major, 2 LOC minor, 1 LOC patch) + * win/configure.in (as above) + * win/tcl.m4 (not patchlevel) + * win/makefile.vc (not patchlevel) 2 LOC + * README (sections 0 and 2) + * mac/README (2 LOC, not patchlevel) + * macosx/Tcl.pbproj/project.pbxproj (not patchlevel) 1 LOC + * macosx/Tcl.pbproj/default.pbxuser (not patchlevel) 1 LOC + * win/README.binary (sections 0-4) + * win/README (not patchlevel) (sections 0 and 2) + * unix/tcl.spec (2 LOC Major/Minor, 1 LOC patch) + * tests/basic.test (1 LOC M/M, not patchlevel) + * tools/tcl.hpj.in (not patchlevel, for windows installer) + * tools/tcl.wse.in (for windows installer) + * tools/tclSplash.bmp (not patchlevel) + */ +#define TCL_MAJOR_VERSION 8 +#define TCL_MINOR_VERSION 4 +#define TCL_RELEASE_LEVEL TCL_FINAL_RELEASE +#define TCL_RELEASE_SERIAL 20 + +#define TCL_VERSION "8.4" +#define TCL_PATCH_LEVEL "8.4.20" + +/* + * The following definitions set up the proper options for Windows + * compilers. We use this method because there is no autoconf equivalent. + */ + +#ifndef __WIN32__ +# if defined(_WIN32) || defined(WIN32) || defined(__MINGW32__) || defined(__BORLANDC__) || (defined(__WATCOMC__) && defined(__WINDOWS_386__)) +# define __WIN32__ +# ifndef WIN32 +# define WIN32 +# endif +# ifndef _WIN32 +# define _WIN32 +# endif +# endif +#endif + +/* + * STRICT: See MSDN Article Q83456 + */ + +#ifdef __WIN32__ +# ifndef STRICT +# define STRICT +# endif +#endif /* __WIN32__ */ + +/* + * Utility macros: STRINGIFY takes an argument and wraps it in "" (double + * quotation marks), JOIN joins two arguments. + */ +#ifndef STRINGIFY +# define STRINGIFY(x) STRINGIFY1(x) +# define STRINGIFY1(x) #x +#endif +#ifndef JOIN +# define JOIN(a,b) JOIN1(a,b) +# define JOIN1(a,b) a##b +#endif + +/* + * A special definition used to allow this header file to be included + * from windows resource files so that they can obtain version + * information. RC_INVOKED is defined by default by the windows RC tool. + * + * Resource compilers don't like all the C stuff, like typedefs and + * procedure declarations, that occur below, so block them out. + */ + +#ifndef RC_INVOKED + +/* + * Special macro to define mutexes, that doesn't do anything + * if we are not using threads. + */ + +#ifdef TCL_THREADS +#define TCL_DECLARE_MUTEX(name) static Tcl_Mutex name; +#else +#define TCL_DECLARE_MUTEX(name) +#endif + +/* + * Macros that eliminate the overhead of the thread synchronization + * functions when compiling without thread support. + */ + +#ifndef TCL_THREADS +#define Tcl_MutexLock(mutexPtr) +#define Tcl_MutexUnlock(mutexPtr) +#define Tcl_MutexFinalize(mutexPtr) +#define Tcl_ConditionNotify(condPtr) +#define Tcl_ConditionWait(condPtr, mutexPtr, timePtr) +#define Tcl_ConditionFinalize(condPtr) +#endif /* TCL_THREADS */ + + +#ifndef BUFSIZ +# include +#endif + + +/* + * Definitions that allow Tcl functions with variable numbers of + * arguments to be used with either varargs.h or stdarg.h. TCL_VARARGS + * is used in procedure prototypes. TCL_VARARGS_DEF is used to declare + * the arguments in a function definiton: it takes the type and name of + * the first argument and supplies the appropriate argument declaration + * string for use in the function definition. TCL_VARARGS_START + * initializes the va_list data structure and returns the first argument. + */ +#if !defined(NO_STDARG) +# include +# define TCL_VARARGS(type, name) (type name, ...) +# define TCL_VARARGS_DEF(type, name) (type name, ...) +# define TCL_VARARGS_START(type, name, list) (va_start(list, name), name) +#else +# include +# define TCL_VARARGS(type, name) () +# define TCL_VARARGS_DEF(type, name) (va_alist) +# define TCL_VARARGS_START(type, name, list) \ + (va_start(list), va_arg(list, type)) +#endif + +/* + * Macros used to declare a function to be exported by a DLL. + * Used by Windows, maps to no-op declarations on non-Windows systems. + * The default build on windows is for a DLL, which causes the DLLIMPORT + * and DLLEXPORT macros to be nonempty. To build a static library, the + * macro STATIC_BUILD should be defined. + */ + +#if (defined(__WIN32__) && (defined(_MSC_VER) || (__BORLANDC__ >= 0x0550) || defined(__LCC__) || defined(__WATCOMC__) || (defined(__GNUC__) && defined(__declspec)))) +# ifdef STATIC_BUILD +# define DLLIMPORT +# define DLLEXPORT +# else +# define DLLIMPORT __declspec(dllimport) +# define DLLEXPORT __declspec(dllexport) +# endif +#else +# define DLLIMPORT +# if defined(__GNUC__) && __GNUC__ > 3 +# define DLLEXPORT __attribute__ ((visibility("default"))) +# else +# define DLLEXPORT +# endif +#endif + +/* + * These macros are used to control whether functions are being declared for + * import or export. If a function is being declared while it is being built + * to be included in a shared library, then it should have the DLLEXPORT + * storage class. If is being declared for use by a module that is going to + * link against the shared library, then it should have the DLLIMPORT storage + * class. If the symbol is beind declared for a static build or for use from a + * stub library, then the storage class should be empty. + * + * The convention is that a macro called BUILD_xxxx, where xxxx is the + * name of a library we are building, is set on the compile line for sources + * that are to be placed in the library. When this macro is set, the + * storage class will be set to DLLEXPORT. At the end of the header file, the + * storage class will be reset to DLLIMPORT. + */ +#undef TCL_STORAGE_CLASS +#ifdef BUILD_tcl +# define TCL_STORAGE_CLASS DLLEXPORT +#else +# ifdef USE_TCL_STUBS +# define TCL_STORAGE_CLASS +# else +# define TCL_STORAGE_CLASS DLLIMPORT +# endif +#endif + +/* + * Definitions that allow this header file to be used either with or + * without ANSI C features like function prototypes. + */ + +#undef _ANSI_ARGS_ +#undef CONST +#ifndef INLINE +# define INLINE +#endif + +#ifndef NO_CONST +# define CONST const +#else +# define CONST +#endif + +#ifndef NO_PROTOTYPES +# define _ANSI_ARGS_(x) x +#else +# define _ANSI_ARGS_(x) () +#endif + +#ifdef USE_NON_CONST +# ifdef USE_COMPAT_CONST +# error define at most one of USE_NON_CONST and USE_COMPAT_CONST +# endif +# define CONST84 +# define CONST84_RETURN +#else +# ifdef USE_COMPAT_CONST +# define CONST84 +# define CONST84_RETURN CONST +# else +# define CONST84 CONST +# define CONST84_RETURN CONST +# endif +#endif + +/* + * Make sure EXTERN isn't defined elsewhere + */ + +#ifdef EXTERN +# undef EXTERN +#endif /* EXTERN */ + +#ifdef __cplusplus +# define EXTERN extern "C" TCL_STORAGE_CLASS +#else +# define EXTERN extern TCL_STORAGE_CLASS +#endif + +/* + * The following code is copied from winnt.h. + * If we don't replicate it here, then can't be included + * after tcl.h, since tcl.h also defines VOID. + * This block is skipped under Cygwin and Mingw. + * + * + */ + +#if defined(__WIN32__) && !defined(HAVE_WINNT_IGNORE_VOID) +#ifndef VOID +#define VOID void +typedef char CHAR; +typedef short SHORT; +typedef long LONG; +#endif +#endif /* __WIN32__ && !HAVE_WINNT_IGNORE_VOID */ + +/* + * Macro to use instead of "void" for arguments that must have + * type "void *" in ANSI C; maps them to type "char *" in + * non-ANSI systems. + */ + +#ifndef __VXWORKS__ +# ifndef NO_VOID +# define VOID void +# else +# define VOID char +# endif +#endif + +/* + * Miscellaneous declarations. + */ + +#ifndef _CLIENTDATA +# ifndef NO_VOID + typedef void *ClientData; +# else + typedef int *ClientData; +# endif +# define _CLIENTDATA +#endif + +/* + * Darwin specific configure overrides (to support fat compiles, where + * configure runs only once for multiple architectures): + */ + +#ifdef __APPLE__ +# ifdef __LP64__ +# undef TCL_WIDE_INT_TYPE +# define TCL_WIDE_INT_IS_LONG 1 +# else /* !__LP64__ */ +# define TCL_WIDE_INT_TYPE long long +# undef TCL_WIDE_INT_IS_LONG +# endif /* __LP64__ */ +# undef HAVE_STRUCT_STAT64 +# include +#endif /* __APPLE__ */ + +/* + * Define Tcl_WideInt to be a type that is (at least) 64-bits wide, + * and define Tcl_WideUInt to be the unsigned variant of that type + * (assuming that where we have one, we can have the other.) + * + * Also defines the following macros: + * TCL_WIDE_INT_IS_LONG - if wide ints are really longs (i.e. we're on + * a real 64-bit system.) + * Tcl_WideAsLong - forgetful converter from wideInt to long. + * Tcl_LongAsWide - sign-extending converter from long to wideInt. + * Tcl_WideAsDouble - converter from wideInt to double. + * Tcl_DoubleAsWide - converter from double to wideInt. + * + * The following invariant should hold for any long value 'longVal': + * longVal == Tcl_WideAsLong(Tcl_LongAsWide(longVal)) + * + * Note on converting between Tcl_WideInt and strings. This + * implementation (in tclObj.c) depends on the functions strtoull() + * and sprintf(...,"%" TCL_LL_MODIFIER "d",...). TCL_LL_MODIFIER_SIZE + * is the length of the modifier string, which is "ll" on most 32-bit + * Unix systems. It has to be split up like this to allow for the more + * complex formats sometimes needed (e.g. in the format(n) command.) + */ + +#if !defined(TCL_WIDE_INT_TYPE)&&!defined(TCL_WIDE_INT_IS_LONG) +# if defined(__WIN32__) +# define TCL_WIDE_INT_TYPE __int64 +# ifdef __BORLANDC__ +# define TCL_LL_MODIFIER "L" +# define TCL_LL_MODIFIER_SIZE 1 +# else /* __BORLANDC__ */ +# define TCL_LL_MODIFIER "I64" +# define TCL_LL_MODIFIER_SIZE 3 +# endif /* __BORLANDC__ */ +# elif defined(__GNUC__) +# define TCL_WIDE_INT_TYPE long long +# define TCL_LL_MODIFIER "ll" +# define TCL_LL_MODIFIER_SIZE 2 +# else /* ! __WIN32__ && ! __GNUC__ */ +/* + * Don't know what platform it is and configure hasn't discovered what + * is going on for us. Try to guess... + */ +# ifdef NO_LIMITS_H +# error please define either TCL_WIDE_INT_TYPE or TCL_WIDE_INT_IS_LONG +# else /* !NO_LIMITS_H */ +# include +# if (INT_MAX < LONG_MAX) +# define TCL_WIDE_INT_IS_LONG 1 +# else +# define TCL_WIDE_INT_TYPE long long +# endif +# endif /* NO_LIMITS_H */ +# endif /* __WIN32__ */ +#endif /* !TCL_WIDE_INT_TYPE & !TCL_WIDE_INT_IS_LONG */ +#ifdef TCL_WIDE_INT_IS_LONG +# undef TCL_WIDE_INT_TYPE +# define TCL_WIDE_INT_TYPE long +#endif /* TCL_WIDE_INT_IS_LONG */ + +typedef TCL_WIDE_INT_TYPE Tcl_WideInt; +typedef unsigned TCL_WIDE_INT_TYPE Tcl_WideUInt; + +#ifdef TCL_WIDE_INT_IS_LONG +# define Tcl_WideAsLong(val) ((long)(val)) +# define Tcl_LongAsWide(val) ((long)(val)) +# define Tcl_WideAsDouble(val) ((double)((long)(val))) +# define Tcl_DoubleAsWide(val) ((long)((double)(val))) +# ifndef TCL_LL_MODIFIER +# define TCL_LL_MODIFIER "l" +# define TCL_LL_MODIFIER_SIZE 1 +# endif /* !TCL_LL_MODIFIER */ +#else /* TCL_WIDE_INT_IS_LONG */ +/* + * The next short section of defines are only done when not running on + * Windows or some other strange platform. + */ +# ifndef TCL_LL_MODIFIER +# define TCL_LL_MODIFIER "ll" +# define TCL_LL_MODIFIER_SIZE 2 +# endif /* !TCL_LL_MODIFIER */ +# define Tcl_WideAsLong(val) ((long)((Tcl_WideInt)(val))) +# define Tcl_LongAsWide(val) ((Tcl_WideInt)((long)(val))) +# define Tcl_WideAsDouble(val) ((double)((Tcl_WideInt)(val))) +# define Tcl_DoubleAsWide(val) ((Tcl_WideInt)((double)(val))) +#endif /* TCL_WIDE_INT_IS_LONG */ + +#if defined(__WIN32__) +# ifdef __BORLANDC__ + typedef struct stati64 Tcl_StatBuf; +# elif defined(_WIN64) + typedef struct __stat64 Tcl_StatBuf; +# elif (defined(_MSC_VER) && (_MSC_VER < 1400)) || defined(_USE_32BIT_TIME_T) + typedef struct _stati64 Tcl_StatBuf; +# else + typedef struct _stat32i64 Tcl_StatBuf; +# endif /* _MSC_VER < 1400 */ +#elif defined(__CYGWIN__) + typedef struct _stat32i64 { + dev_t st_dev; + unsigned short st_ino; + unsigned short st_mode; + short st_nlink; + short st_uid; + short st_gid; + /* Here is a 2-byte gap */ + dev_t st_rdev; + /* Here is a 4-byte gap */ + long long st_size; + struct {long tv_sec;} st_atim; + struct {long tv_sec;} st_mtim; + struct {long tv_sec;} st_ctim; + /* Here is a 4-byte gap */ + } Tcl_StatBuf; +#elif defined(HAVE_STRUCT_STAT64) + typedef struct stat64 Tcl_StatBuf; +#else + typedef struct stat Tcl_StatBuf; +#endif + + +/* + * This flag controls whether binary compatability is maintained with + * extensions built against a previous version of Tcl. This is true + * by default. + */ +#ifndef TCL_PRESERVE_BINARY_COMPATABILITY +# define TCL_PRESERVE_BINARY_COMPATABILITY 1 +#endif + + +/* + * Data structures defined opaquely in this module. The definitions below + * just provide dummy types. A few fields are made visible in Tcl_Interp + * structures, namely those used for returning a string result from + * commands. Direct access to the result field is discouraged in Tcl 8.0. + * The interpreter result is either an object or a string, and the two + * values are kept consistent unless some C code sets interp->result + * directly. Programmers should use either the procedure Tcl_GetObjResult() + * or Tcl_GetStringResult() to read the interpreter's result. See the + * SetResult man page for details. + * + * Note: any change to the Tcl_Interp definition below must be mirrored + * in the "real" definition in tclInt.h. + * + * Note: Tcl_ObjCmdProc procedures do not directly set result and freeProc. + * Instead, they set a Tcl_Obj member in the "real" structure that can be + * accessed with Tcl_GetObjResult() and Tcl_SetObjResult(). + */ + +typedef struct Tcl_Interp { + char *result; /* If the last command returned a string + * result, this points to it. */ + void (*freeProc) _ANSI_ARGS_((char *blockPtr)); + /* Zero means the string result is + * statically allocated. TCL_DYNAMIC means + * it was allocated with ckalloc and should + * be freed with ckfree. Other values give + * the address of procedure to invoke to + * free the result. Tcl_Eval must free it + * before executing next command. */ + int errorLine; /* When TCL_ERROR is returned, this gives + * the line number within the command where + * the error occurred (1 if first line). */ +} Tcl_Interp; + +typedef struct Tcl_AsyncHandler_ *Tcl_AsyncHandler; +typedef struct Tcl_Channel_ *Tcl_Channel; +typedef struct Tcl_Command_ *Tcl_Command; +typedef struct Tcl_Condition_ *Tcl_Condition; +typedef struct Tcl_EncodingState_ *Tcl_EncodingState; +typedef struct Tcl_Encoding_ *Tcl_Encoding; +typedef struct Tcl_Event Tcl_Event; +typedef struct Tcl_Mutex_ *Tcl_Mutex; +typedef struct Tcl_Pid_ *Tcl_Pid; +typedef struct Tcl_RegExp_ *Tcl_RegExp; +typedef struct Tcl_ThreadDataKey_ *Tcl_ThreadDataKey; +typedef struct Tcl_ThreadId_ *Tcl_ThreadId; +typedef struct Tcl_TimerToken_ *Tcl_TimerToken; +typedef struct Tcl_Trace_ *Tcl_Trace; +typedef struct Tcl_Var_ *Tcl_Var; +typedef struct Tcl_ChannelTypeVersion_ *Tcl_ChannelTypeVersion; +typedef struct Tcl_LoadHandle_ *Tcl_LoadHandle; + +/* + * Definition of the interface to procedures implementing threads. + * A procedure following this definition is given to each call of + * 'Tcl_CreateThread' and will be called as the main fuction of + * the new thread created by that call. + */ +#if defined __WIN32__ +typedef unsigned (__stdcall Tcl_ThreadCreateProc) _ANSI_ARGS_((ClientData clientData)); +#else +typedef void (Tcl_ThreadCreateProc) _ANSI_ARGS_((ClientData clientData)); +#endif + +/* + * Threading function return types used for abstracting away platform + * differences when writing a Tcl_ThreadCreateProc. See the NewThread + * function in generic/tclThreadTest.c for it's usage. + */ +#ifdef __WIN32__ +# define Tcl_ThreadCreateType unsigned __stdcall +# define TCL_THREAD_CREATE_RETURN return 0 +#else +# define Tcl_ThreadCreateType void +# define TCL_THREAD_CREATE_RETURN +#endif + +/* + * Definition of values for default stacksize and the possible flags to be + * given to Tcl_CreateThread. + */ + +#define TCL_THREAD_STACK_DEFAULT (0) /* Use default size for stack */ +#define TCL_THREAD_NOFLAGS (0000) /* Standard flags, default behaviour */ +#define TCL_THREAD_JOINABLE (0001) /* Mark the thread as joinable */ + +/* + * Flag values passed to Tcl_GetRegExpFromObj. + */ +#define TCL_REG_BASIC 000000 /* BREs (convenience) */ +#define TCL_REG_EXTENDED 000001 /* EREs */ +#define TCL_REG_ADVF 000002 /* advanced features in EREs */ +#define TCL_REG_ADVANCED 000003 /* AREs (which are also EREs) */ +#define TCL_REG_QUOTE 000004 /* no special characters, none */ +#define TCL_REG_NOCASE 000010 /* ignore case */ +#define TCL_REG_NOSUB 000020 /* don't care about subexpressions */ +#define TCL_REG_EXPANDED 000040 /* expanded format, white space & + * comments */ +#define TCL_REG_NLSTOP 000100 /* \n doesn't match . or [^ ] */ +#define TCL_REG_NLANCH 000200 /* ^ matches after \n, $ before */ +#define TCL_REG_NEWLINE 000300 /* newlines are line terminators */ +#define TCL_REG_CANMATCH 001000 /* report details on partial/limited + * matches */ + +/* + * The following flag is experimental and only intended for use by Expect. It + * will probably go away in a later release. + */ + +#define TCL_REG_BOSONLY 002000 /* prepend \A to pattern so it only + * matches at the beginning of the + * string. */ + +/* + * Flags values passed to Tcl_RegExpExecObj. + */ +#define TCL_REG_NOTBOL 0001 /* Beginning of string does not match ^. */ +#define TCL_REG_NOTEOL 0002 /* End of string does not match $. */ + +/* + * Structures filled in by Tcl_RegExpInfo. Note that all offset values are + * relative to the start of the match string, not the beginning of the + * entire string. + */ + +typedef struct Tcl_RegExpIndices { + long start; /* character offset of first character in match */ + long end; /* character offset of first character after the + * match. */ +} Tcl_RegExpIndices; + +typedef struct Tcl_RegExpInfo { + int nsubs; /* number of subexpressions in the + * compiled expression */ + Tcl_RegExpIndices *matches; /* array of nsubs match offset + * pairs */ + long extendStart; /* The offset at which a subsequent + * match might begin. */ + long reserved; /* Reserved for later use. */ +} Tcl_RegExpInfo; + +/* + * Picky compilers complain if this typdef doesn't appear before the + * struct's reference in tclDecls.h. + */ + +typedef Tcl_StatBuf *Tcl_Stat_; +typedef struct stat *Tcl_OldStat_; + +/* + * When a TCL command returns, the interpreter contains a result from the + * command. Programmers are strongly encouraged to use one of the + * procedures Tcl_GetObjResult() or Tcl_GetStringResult() to read the + * interpreter's result. See the SetResult man page for details. Besides + * this result, the command procedure returns an integer code, which is + * one of the following: + * + * TCL_OK Command completed normally; the interpreter's + * result contains the command's result. + * TCL_ERROR The command couldn't be completed successfully; + * the interpreter's result describes what went wrong. + * TCL_RETURN The command requests that the current procedure + * return; the interpreter's result contains the + * procedure's return value. + * TCL_BREAK The command requests that the innermost loop + * be exited; the interpreter's result is meaningless. + * TCL_CONTINUE Go on to the next iteration of the current loop; + * the interpreter's result is meaningless. + */ + +#define TCL_OK 0 +#define TCL_ERROR 1 +#define TCL_RETURN 2 +#define TCL_BREAK 3 +#define TCL_CONTINUE 4 + +#define TCL_RESULT_SIZE 200 + +/* + * Flags to control what substitutions are performed by Tcl_SubstObj(): + */ + +#define TCL_SUBST_COMMANDS 001 +#define TCL_SUBST_VARIABLES 002 +#define TCL_SUBST_BACKSLASHES 004 +#define TCL_SUBST_ALL 007 + + +/* + * Argument descriptors for math function callbacks in expressions: + */ +typedef enum { + TCL_INT, TCL_DOUBLE, TCL_EITHER, TCL_WIDE_INT +} Tcl_ValueType; +typedef struct Tcl_Value { + Tcl_ValueType type; /* Indicates intValue or doubleValue is + * valid, or both. */ + long intValue; /* Integer value. */ + double doubleValue; /* Double-precision floating value. */ + Tcl_WideInt wideValue; /* Wide (min. 64-bit) integer value. */ +} Tcl_Value; + +/* + * Forward declaration of Tcl_Obj to prevent an error when the forward + * reference to Tcl_Obj is encountered in the procedure types declared + * below. + */ +struct Tcl_Obj; + +/* + * Procedure types defined by Tcl: + */ + +typedef int (Tcl_AppInitProc) _ANSI_ARGS_((Tcl_Interp *interp)); +typedef int (Tcl_AsyncProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int code)); +typedef void (Tcl_ChannelProc) _ANSI_ARGS_((ClientData clientData, int mask)); +typedef void (Tcl_CloseProc) _ANSI_ARGS_((ClientData data)); +typedef void (Tcl_CmdDeleteProc) _ANSI_ARGS_((ClientData clientData)); +typedef int (Tcl_CmdProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int argc, CONST84 char *argv[])); +typedef void (Tcl_CmdTraceProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int level, char *command, Tcl_CmdProc *proc, + ClientData cmdClientData, int argc, CONST84 char *argv[])); +typedef int (Tcl_CmdObjTraceProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int level, CONST char *command, + Tcl_Command commandInfo, int objc, struct Tcl_Obj * CONST * objv)); +typedef void (Tcl_CmdObjTraceDeleteProc) _ANSI_ARGS_((ClientData clientData)); +typedef void (Tcl_DupInternalRepProc) _ANSI_ARGS_((struct Tcl_Obj *srcPtr, + struct Tcl_Obj *dupPtr)); +typedef int (Tcl_EncodingConvertProc)_ANSI_ARGS_((ClientData clientData, + CONST char *src, int srcLen, int flags, Tcl_EncodingState *statePtr, + char *dst, int dstLen, int *srcReadPtr, int *dstWrotePtr, + int *dstCharsPtr)); +typedef void (Tcl_EncodingFreeProc)_ANSI_ARGS_((ClientData clientData)); +typedef int (Tcl_EventProc) _ANSI_ARGS_((Tcl_Event *evPtr, int flags)); +typedef void (Tcl_EventCheckProc) _ANSI_ARGS_((ClientData clientData, + int flags)); +typedef int (Tcl_EventDeleteProc) _ANSI_ARGS_((Tcl_Event *evPtr, + ClientData clientData)); +typedef void (Tcl_EventSetupProc) _ANSI_ARGS_((ClientData clientData, + int flags)); +typedef void (Tcl_ExitProc) _ANSI_ARGS_((ClientData clientData)); +typedef void (Tcl_FileProc) _ANSI_ARGS_((ClientData clientData, int mask)); +typedef void (Tcl_FileFreeProc) _ANSI_ARGS_((ClientData clientData)); +typedef void (Tcl_FreeInternalRepProc) _ANSI_ARGS_((struct Tcl_Obj *objPtr)); +typedef void (Tcl_FreeProc) _ANSI_ARGS_((char *blockPtr)); +typedef void (Tcl_IdleProc) _ANSI_ARGS_((ClientData clientData)); +typedef void (Tcl_InterpDeleteProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp)); +typedef int (Tcl_MathProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, Tcl_Value *args, Tcl_Value *resultPtr)); +typedef void (Tcl_NamespaceDeleteProc) _ANSI_ARGS_((ClientData clientData)); +typedef int (Tcl_ObjCmdProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int objc, struct Tcl_Obj * CONST * objv)); +typedef int (Tcl_PackageInitProc) _ANSI_ARGS_((Tcl_Interp *interp)); +typedef void (Tcl_PanicProc) _ANSI_ARGS_(TCL_VARARGS(CONST char *, format)); +typedef void (Tcl_TcpAcceptProc) _ANSI_ARGS_((ClientData callbackData, + Tcl_Channel chan, char *address, int port)); +typedef void (Tcl_TimerProc) _ANSI_ARGS_((ClientData clientData)); +typedef int (Tcl_SetFromAnyProc) _ANSI_ARGS_((Tcl_Interp *interp, + struct Tcl_Obj *objPtr)); +typedef void (Tcl_UpdateStringProc) _ANSI_ARGS_((struct Tcl_Obj *objPtr)); +typedef char *(Tcl_VarTraceProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, CONST84 char *part1, CONST84 char *part2, + int flags)); +typedef void (Tcl_CommandTraceProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, CONST char *oldName, CONST char *newName, + int flags)); +typedef void (Tcl_CreateFileHandlerProc) _ANSI_ARGS_((int fd, int mask, + Tcl_FileProc *proc, ClientData clientData)); +typedef void (Tcl_DeleteFileHandlerProc) _ANSI_ARGS_((int fd)); +typedef void (Tcl_AlertNotifierProc) _ANSI_ARGS_((ClientData clientData)); +typedef void (Tcl_ServiceModeHookProc) _ANSI_ARGS_((int mode)); +typedef ClientData (Tcl_InitNotifierProc) _ANSI_ARGS_((VOID)); +typedef void (Tcl_FinalizeNotifierProc) _ANSI_ARGS_((ClientData clientData)); +typedef void (Tcl_MainLoopProc) _ANSI_ARGS_((void)); + +/* + * The following structure represents a type of object, which is a + * particular internal representation for an object plus a set of + * procedures that provide standard operations on objects of that type. + */ + +typedef struct Tcl_ObjType { + char *name; /* Name of the type, e.g. "int". */ + Tcl_FreeInternalRepProc *freeIntRepProc; + /* Called to free any storage for the type's + * internal rep. NULL if the internal rep + * does not need freeing. */ + Tcl_DupInternalRepProc *dupIntRepProc; + /* Called to create a new object as a copy + * of an existing object. */ + Tcl_UpdateStringProc *updateStringProc; + /* Called to update the string rep from the + * type's internal representation. */ + Tcl_SetFromAnyProc *setFromAnyProc; + /* Called to convert the object's internal + * rep to this type. Frees the internal rep + * of the old type. Returns TCL_ERROR on + * failure. */ +} Tcl_ObjType; + + +/* + * One of the following structures exists for each object in the Tcl + * system. An object stores a value as either a string, some internal + * representation, or both. + */ + +typedef struct Tcl_Obj { + int refCount; /* When 0 the object will be freed. */ + char *bytes; /* This points to the first byte of the + * object's string representation. The array + * must be followed by a null byte (i.e., at + * offset length) but may also contain + * embedded null characters. The array's + * storage is allocated by ckalloc. NULL + * means the string rep is invalid and must + * be regenerated from the internal rep. + * Clients should use Tcl_GetStringFromObj + * or Tcl_GetString to get a pointer to the + * byte array as a readonly value. */ + int length; /* The number of bytes at *bytes, not + * including the terminating null. */ + Tcl_ObjType *typePtr; /* Denotes the object's type. Always + * corresponds to the type of the object's + * internal rep. NULL indicates the object + * has no internal rep (has no type). */ + union { /* The internal representation: */ + long longValue; /* - an long integer value */ + double doubleValue; /* - a double-precision floating value */ + VOID *otherValuePtr; /* - another, type-specific value */ + Tcl_WideInt wideValue; /* - a long long value */ + struct { /* - internal rep as two pointers */ + VOID *ptr1; + VOID *ptr2; + } twoPtrValue; + } internalRep; +} Tcl_Obj; + + +/* + * Macros to increment and decrement a Tcl_Obj's reference count, and to + * test whether an object is shared (i.e. has reference count > 1). + * Note: clients should use Tcl_DecrRefCount() when they are finished using + * an object, and should never call TclFreeObj() directly. TclFreeObj() is + * only defined and made public in tcl.h to support Tcl_DecrRefCount's macro + * definition. + */ +void Tcl_IncrRefCount _ANSI_ARGS_((Tcl_Obj *objPtr)); +void Tcl_DecrRefCount _ANSI_ARGS_((Tcl_Obj *objPtr)); +int Tcl_IsShared _ANSI_ARGS_((Tcl_Obj *objPtr)); + +#ifdef TCL_MEM_DEBUG +# define Tcl_IncrRefCount(objPtr) \ + Tcl_DbIncrRefCount(objPtr, __FILE__, __LINE__) +# define Tcl_DecrRefCount(objPtr) \ + Tcl_DbDecrRefCount(objPtr, __FILE__, __LINE__) +# define Tcl_IsShared(objPtr) \ + Tcl_DbIsShared(objPtr, __FILE__, __LINE__) +#else +# define Tcl_IncrRefCount(objPtr) \ + ++(objPtr)->refCount + /* + * Use do/while0 idiom for optimum correctness without compiler warnings + * http://c2.com/cgi/wiki?TrivialDoWhileLoop + */ +# define Tcl_DecrRefCount(objPtr) \ + do { \ + Tcl_Obj *_objPtr = (objPtr); \ + if (--(_objPtr)->refCount <= 0) { \ + TclFreeObj(_objPtr); \ + } \ + } while(0) +# define Tcl_IsShared(objPtr) \ + ((objPtr)->refCount > 1) +#endif + +/* + * Macros and definitions that help to debug the use of Tcl objects. + * When TCL_MEM_DEBUG is defined, the Tcl_New declarations are + * overridden to call debugging versions of the object creation procedures. + */ + +#ifdef TCL_MEM_DEBUG +# define Tcl_NewBooleanObj(val) \ + Tcl_DbNewBooleanObj(val, __FILE__, __LINE__) +# define Tcl_NewByteArrayObj(bytes, len) \ + Tcl_DbNewByteArrayObj(bytes, len, __FILE__, __LINE__) +# define Tcl_NewDoubleObj(val) \ + Tcl_DbNewDoubleObj(val, __FILE__, __LINE__) +# define Tcl_NewIntObj(val) \ + Tcl_DbNewLongObj(val, __FILE__, __LINE__) +# define Tcl_NewListObj(objc, objv) \ + Tcl_DbNewListObj(objc, objv, __FILE__, __LINE__) +# define Tcl_NewLongObj(val) \ + Tcl_DbNewLongObj(val, __FILE__, __LINE__) +# define Tcl_NewObj() \ + Tcl_DbNewObj(__FILE__, __LINE__) +# define Tcl_NewStringObj(bytes, len) \ + Tcl_DbNewStringObj(bytes, len, __FILE__, __LINE__) +# define Tcl_NewWideIntObj(val) \ + Tcl_DbNewWideIntObj(val, __FILE__, __LINE__) +#endif /* TCL_MEM_DEBUG */ + + +/* + * The following structure contains the state needed by + * Tcl_SaveResult. No-one outside of Tcl should access any of these + * fields. This structure is typically allocated on the stack. + */ +typedef struct Tcl_SavedResult { + char *result; + Tcl_FreeProc *freeProc; + Tcl_Obj *objResultPtr; + char *appendResult; + int appendAvl; + int appendUsed; + char resultSpace[TCL_RESULT_SIZE+1]; +} Tcl_SavedResult; + +/* + * The following definitions support Tcl's namespace facility. + * Note: the first five fields must match exactly the fields in a + * Namespace structure (see tclInt.h). + */ + +typedef struct Tcl_Namespace { + char *name; /* The namespace's name within its parent + * namespace. This contains no ::'s. The + * name of the global namespace is "" + * although "::" is an synonym. */ + char *fullName; /* The namespace's fully qualified name. + * This starts with ::. */ + ClientData clientData; /* Arbitrary value associated with this + * namespace. */ + Tcl_NamespaceDeleteProc* deleteProc; + /* Procedure invoked when deleting the + * namespace to, e.g., free clientData. */ + struct Tcl_Namespace* parentPtr; + /* Points to the namespace that contains + * this one. NULL if this is the global + * namespace. */ +} Tcl_Namespace; + +/* + * The following structure represents a call frame, or activation record. + * A call frame defines a naming context for a procedure call: its local + * scope (for local variables) and its namespace scope (used for non-local + * variables; often the global :: namespace). A call frame can also define + * the naming context for a namespace eval or namespace inscope command: + * the namespace in which the command's code should execute. The + * Tcl_CallFrame structures exist only while procedures or namespace + * eval/inscope's are being executed, and provide a Tcl call stack. + * + * A call frame is initialized and pushed using Tcl_PushCallFrame and + * popped using Tcl_PopCallFrame. Storage for a Tcl_CallFrame must be + * provided by the Tcl_PushCallFrame caller, and callers typically allocate + * them on the C call stack for efficiency. For this reason, Tcl_CallFrame + * is defined as a structure and not as an opaque token. However, most + * Tcl_CallFrame fields are hidden since applications should not access + * them directly; others are declared as "dummyX". + * + * WARNING!! The structure definition must be kept consistent with the + * CallFrame structure in tclInt.h. If you change one, change the other. + */ + +typedef struct Tcl_CallFrame { + Tcl_Namespace *nsPtr; + int dummy1; + int dummy2; + VOID *dummy3; + VOID *dummy4; + VOID *dummy5; + int dummy6; + VOID *dummy7; + VOID *dummy8; + int dummy9; + VOID *dummy10; + VOID *dummy11; + VOID *dummy12; + VOID *dummy13; +} Tcl_CallFrame; + +/* + * Information about commands that is returned by Tcl_GetCommandInfo and + * passed to Tcl_SetCommandInfo. objProc is an objc/objv object-based + * command procedure while proc is a traditional Tcl argc/argv + * string-based procedure. Tcl_CreateObjCommand and Tcl_CreateCommand + * ensure that both objProc and proc are non-NULL and can be called to + * execute the command. However, it may be faster to call one instead of + * the other. The member isNativeObjectProc is set to 1 if an + * object-based procedure was registered by Tcl_CreateObjCommand, and to + * 0 if a string-based procedure was registered by Tcl_CreateCommand. + * The other procedure is typically set to a compatibility wrapper that + * does string-to-object or object-to-string argument conversions then + * calls the other procedure. + */ + +typedef struct Tcl_CmdInfo { + int isNativeObjectProc; /* 1 if objProc was registered by a call to + * Tcl_CreateObjCommand; 0 otherwise. + * Tcl_SetCmdInfo does not modify this + * field. */ + Tcl_ObjCmdProc *objProc; /* Command's object-based procedure. */ + ClientData objClientData; /* ClientData for object proc. */ + Tcl_CmdProc *proc; /* Command's string-based procedure. */ + ClientData clientData; /* ClientData for string proc. */ + Tcl_CmdDeleteProc *deleteProc; + /* Procedure to call when command is + * deleted. */ + ClientData deleteData; /* Value to pass to deleteProc (usually + * the same as clientData). */ + Tcl_Namespace *namespacePtr; /* Points to the namespace that contains + * this command. Note that Tcl_SetCmdInfo + * will not change a command's namespace; + * use Tcl_RenameCommand to do that. */ + +} Tcl_CmdInfo; + +/* + * The structure defined below is used to hold dynamic strings. The only + * field that clients should use is the string field, accessible via the + * macro Tcl_DStringValue. + */ + +#define TCL_DSTRING_STATIC_SIZE 200 +typedef struct Tcl_DString { + char *string; /* Points to beginning of string: either + * staticSpace below or a malloced array. */ + int length; /* Number of non-NULL characters in the + * string. */ + int spaceAvl; /* Total number of bytes available for the + * string and its terminating NULL char. */ + char staticSpace[TCL_DSTRING_STATIC_SIZE]; + /* Space to use in common case where string + * is small. */ +} Tcl_DString; + +#define Tcl_DStringLength(dsPtr) ((dsPtr)->length) +#define Tcl_DStringValue(dsPtr) ((dsPtr)->string) +#define Tcl_DStringTrunc Tcl_DStringSetLength + +/* + * Definitions for the maximum number of digits of precision that may + * be specified in the "tcl_precision" variable, and the number of + * bytes of buffer space required by Tcl_PrintDouble. + */ + +#define TCL_MAX_PREC 17 +#define TCL_DOUBLE_SPACE (TCL_MAX_PREC+10) + +/* + * Definition for a number of bytes of buffer space sufficient to hold the + * string representation of an integer in base 10 (assuming the existence + * of 64-bit integers). + */ + +#define TCL_INTEGER_SPACE 24 + +/* + * Flag that may be passed to Tcl_ConvertElement to force it not to + * output braces (careful! if you change this flag be sure to change + * the definitions at the front of tclUtil.c). + */ + +#define TCL_DONT_USE_BRACES 1 + +/* + * Flag that may be passed to Tcl_GetIndexFromObj to force it to disallow + * abbreviated strings. + */ + +#define TCL_EXACT 1 + +/* + * Flag values passed to Tcl_RecordAndEval and/or Tcl_EvalObj. + * WARNING: these bit choices must not conflict with the bit choices + * for evalFlag bits in tclInt.h!! + */ +#define TCL_NO_EVAL 0x10000 +#define TCL_EVAL_GLOBAL 0x20000 +#define TCL_EVAL_DIRECT 0x40000 +#define TCL_EVAL_INVOKE 0x80000 + +/* + * Special freeProc values that may be passed to Tcl_SetResult (see + * the man page for details): + */ + +#define TCL_VOLATILE ((Tcl_FreeProc *) 1) +#define TCL_STATIC ((Tcl_FreeProc *) 0) +#define TCL_DYNAMIC ((Tcl_FreeProc *) 3) + +/* + * Flag values passed to variable-related procedures. + */ + +#define TCL_GLOBAL_ONLY 1 +#define TCL_NAMESPACE_ONLY 2 +#define TCL_APPEND_VALUE 4 +#define TCL_LIST_ELEMENT 8 +#define TCL_TRACE_READS 0x10 +#define TCL_TRACE_WRITES 0x20 +#define TCL_TRACE_UNSETS 0x40 +#define TCL_TRACE_DESTROYED 0x80 +#define TCL_INTERP_DESTROYED 0x100 +#define TCL_LEAVE_ERR_MSG 0x200 +#define TCL_TRACE_ARRAY 0x800 +#ifndef TCL_REMOVE_OBSOLETE_TRACES +/* Required to support old variable/vdelete/vinfo traces */ +#define TCL_TRACE_OLD_STYLE 0x1000 +#endif +/* Indicate the semantics of the result of a trace */ +#define TCL_TRACE_RESULT_DYNAMIC 0x8000 +#define TCL_TRACE_RESULT_OBJECT 0x10000 + +/* + * Flag values passed to command-related procedures. + */ + +#define TCL_TRACE_RENAME 0x2000 +#define TCL_TRACE_DELETE 0x4000 + +#define TCL_ALLOW_INLINE_COMPILATION 0x20000 + +/* + * Flag values passed to Tcl_CreateObjTrace, and used internally + * by command execution traces. Slots 4,8,16 and 32 are + * used internally by execution traces (see tclCmdMZ.c) + */ +#define TCL_TRACE_ENTER_EXEC 1 +#define TCL_TRACE_LEAVE_EXEC 2 + +/* + * The TCL_PARSE_PART1 flag is deprecated and has no effect. + * The part1 is now always parsed whenever the part2 is NULL. + * (This is to avoid a common error when converting code to + * use the new object based APIs and forgetting to give the + * flag) + */ +#ifndef TCL_NO_DEPRECATED +# define TCL_PARSE_PART1 0x400 +#endif + +/* + * Types for linked variables: + */ +#define TCL_LINK_INT 1 +#define TCL_LINK_DOUBLE 2 +#define TCL_LINK_BOOLEAN 3 +#define TCL_LINK_STRING 4 +#define TCL_LINK_WIDE_INT 5 +#define TCL_LINK_READ_ONLY 0x80 + +/* + * Forward declarations of Tcl_HashTable and related types. + */ + +typedef struct Tcl_HashKeyType Tcl_HashKeyType; +typedef struct Tcl_HashTable Tcl_HashTable; +typedef struct Tcl_HashEntry Tcl_HashEntry; + +typedef unsigned int (Tcl_HashKeyProc) _ANSI_ARGS_((Tcl_HashTable *tablePtr, + VOID *keyPtr)); +typedef int (Tcl_CompareHashKeysProc) _ANSI_ARGS_((VOID *keyPtr, + Tcl_HashEntry *hPtr)); +typedef Tcl_HashEntry *(Tcl_AllocHashEntryProc) _ANSI_ARGS_(( + Tcl_HashTable *tablePtr, VOID *keyPtr)); +typedef void (Tcl_FreeHashEntryProc) _ANSI_ARGS_((Tcl_HashEntry *hPtr)); + +/* + * This flag controls whether the hash table stores the hash of a key, or + * recalculates it. There should be no reason for turning this flag off + * as it is completely binary and source compatible unless you directly + * access the bucketPtr member of the Tcl_HashTableEntry structure. This + * member has been removed and the space used to store the hash value. + */ + +#ifndef TCL_HASH_KEY_STORE_HASH +# define TCL_HASH_KEY_STORE_HASH 1 +#endif + +/* + * Structure definition for an entry in a hash table. No-one outside + * Tcl should access any of these fields directly; use the macros + * defined below. + */ + +struct Tcl_HashEntry { + Tcl_HashEntry *nextPtr; /* Pointer to next entry in this + * hash bucket, or NULL for end of + * chain. */ + Tcl_HashTable *tablePtr; /* Pointer to table containing entry. */ +#if TCL_HASH_KEY_STORE_HASH +# if TCL_PRESERVE_BINARY_COMPATABILITY + VOID *hash; /* Hash value, stored as pointer to + * ensure that the offsets of the + * fields in this structure are not + * changed. */ +# else + unsigned int hash; /* Hash value. */ +# endif +#else + Tcl_HashEntry **bucketPtr; /* Pointer to bucket that points to + * first entry in this entry's chain: + * used for deleting the entry. */ +#endif + ClientData clientData; /* Application stores something here + * with Tcl_SetHashValue. */ + union { /* Key has one of these forms: */ + char *oneWordValue; /* One-word value for key. */ + Tcl_Obj *objPtr; /* Tcl_Obj * key value. */ + int words[1]; /* Multiple integer words for key. + * The actual size will be as large + * as necessary for this table's + * keys. */ + char string[4]; /* String for key. The actual size + * will be as large as needed to hold + * the key. */ + } key; /* MUST BE LAST FIELD IN RECORD!! */ +}; + +/* + * Flags used in Tcl_HashKeyType. + * + * TCL_HASH_KEY_RANDOMIZE_HASH: + * There are some things, pointers for example + * which don't hash well because they do not use + * the lower bits. If this flag is set then the + * hash table will attempt to rectify this by + * randomising the bits and then using the upper + * N bits as the index into the table. + */ +#define TCL_HASH_KEY_RANDOMIZE_HASH 0x1 + +/* + * Structure definition for the methods associated with a hash table + * key type. + */ +#define TCL_HASH_KEY_TYPE_VERSION 1 +struct Tcl_HashKeyType { + int version; /* Version of the table. If this structure is + * extended in future then the version can be + * used to distinguish between different + * structures. + */ + + int flags; /* Flags, see above for details. */ + + /* Calculates a hash value for the key. If this is NULL then the pointer + * itself is used as a hash value. + */ + Tcl_HashKeyProc *hashKeyProc; + + /* Compares two keys and returns zero if they do not match, and non-zero + * if they do. If this is NULL then the pointers are compared. + */ + Tcl_CompareHashKeysProc *compareKeysProc; + + /* Called to allocate memory for a new entry, i.e. if the key is a + * string then this could allocate a single block which contains enough + * space for both the entry and the string. Only the key field of the + * allocated Tcl_HashEntry structure needs to be filled in. If something + * else needs to be done to the key, i.e. incrementing a reference count + * then that should be done by this function. If this is NULL then Tcl_Alloc + * is used to allocate enough space for a Tcl_HashEntry and the key pointer + * is assigned to key.oneWordValue. + */ + Tcl_AllocHashEntryProc *allocEntryProc; + + /* Called to free memory associated with an entry. If something else needs + * to be done to the key, i.e. decrementing a reference count then that + * should be done by this function. If this is NULL then Tcl_Free is used + * to free the Tcl_HashEntry. + */ + Tcl_FreeHashEntryProc *freeEntryProc; +}; + +/* + * Structure definition for a hash table. Must be in tcl.h so clients + * can allocate space for these structures, but clients should never + * access any fields in this structure. + */ + +#define TCL_SMALL_HASH_TABLE 4 +struct Tcl_HashTable { + Tcl_HashEntry **buckets; /* Pointer to bucket array. Each + * element points to first entry in + * bucket's hash chain, or NULL. */ + Tcl_HashEntry *staticBuckets[TCL_SMALL_HASH_TABLE]; + /* Bucket array used for small tables + * (to avoid mallocs and frees). */ + int numBuckets; /* Total number of buckets allocated + * at **bucketPtr. */ + int numEntries; /* Total number of entries present + * in table. */ + int rebuildSize; /* Enlarge table when numEntries gets + * to be this large. */ + int downShift; /* Shift count used in hashing + * function. Designed to use high- + * order bits of randomized keys. */ + int mask; /* Mask value used in hashing + * function. */ + int keyType; /* Type of keys used in this table. + * It's either TCL_CUSTOM_KEYS, + * TCL_STRING_KEYS, TCL_ONE_WORD_KEYS, + * or an integer giving the number of + * ints that is the size of the key. + */ +#if TCL_PRESERVE_BINARY_COMPATABILITY + Tcl_HashEntry *(*findProc) _ANSI_ARGS_((Tcl_HashTable *tablePtr, + CONST char *key)); + Tcl_HashEntry *(*createProc) _ANSI_ARGS_((Tcl_HashTable *tablePtr, + CONST char *key, int *newPtr)); +#endif + Tcl_HashKeyType *typePtr; /* Type of the keys used in the + * Tcl_HashTable. */ +}; + +/* + * Structure definition for information used to keep track of searches + * through hash tables: + */ + +typedef struct Tcl_HashSearch { + Tcl_HashTable *tablePtr; /* Table being searched. */ + int nextIndex; /* Index of next bucket to be + * enumerated after present one. */ + Tcl_HashEntry *nextEntryPtr; /* Next entry to be enumerated in the + * the current bucket. */ +} Tcl_HashSearch; + +/* + * Acceptable key types for hash tables: + * + * TCL_STRING_KEYS: The keys are strings, they are copied into + * the entry. + * TCL_ONE_WORD_KEYS: The keys are pointers, the pointer is stored + * in the entry. + * TCL_CUSTOM_TYPE_KEYS: The keys are arbitrary types which are copied + * into the entry. + * TCL_CUSTOM_PTR_KEYS: The keys are pointers to arbitrary types, the + * pointer is stored in the entry. + * + * While maintaining binary compatability the above have to be distinct + * values as they are used to differentiate between old versions of the + * hash table which don't have a typePtr and new ones which do. Once binary + * compatability is discarded in favour of making more wide spread changes + * TCL_STRING_KEYS can be the same as TCL_CUSTOM_TYPE_KEYS, and + * TCL_ONE_WORD_KEYS can be the same as TCL_CUSTOM_PTR_KEYS because they + * simply determine how the key is accessed from the entry and not the + * behaviour. + */ + +#define TCL_STRING_KEYS 0 +#define TCL_ONE_WORD_KEYS 1 + +#if TCL_PRESERVE_BINARY_COMPATABILITY +# define TCL_CUSTOM_TYPE_KEYS -2 +# define TCL_CUSTOM_PTR_KEYS -1 +#else +# define TCL_CUSTOM_TYPE_KEYS TCL_STRING_KEYS +# define TCL_CUSTOM_PTR_KEYS TCL_ONE_WORD_KEYS +#endif + +/* + * Macros for clients to use to access fields of hash entries: + */ + +#define Tcl_GetHashValue(h) ((h)->clientData) +#define Tcl_SetHashValue(h, value) ((h)->clientData = (ClientData) (value)) +#if TCL_PRESERVE_BINARY_COMPATABILITY +# define Tcl_GetHashKey(tablePtr, h) \ + ((char *) (((tablePtr)->keyType == TCL_ONE_WORD_KEYS || \ + (tablePtr)->keyType == TCL_CUSTOM_PTR_KEYS) \ + ? (h)->key.oneWordValue \ + : (h)->key.string)) +#else +# define Tcl_GetHashKey(tablePtr, h) \ + ((char *) (((tablePtr)->keyType == TCL_ONE_WORD_KEYS) \ + ? (h)->key.oneWordValue \ + : (h)->key.string)) +#endif + +/* + * Macros to use for clients to use to invoke find and create procedures + * for hash tables: + */ + +#if TCL_PRESERVE_BINARY_COMPATABILITY +# define Tcl_FindHashEntry(tablePtr, key) \ + (*((tablePtr)->findProc))(tablePtr, key) +# define Tcl_CreateHashEntry(tablePtr, key, newPtr) \ + (*((tablePtr)->createProc))(tablePtr, key, newPtr) +#else /* !TCL_PRESERVE_BINARY_COMPATABILITY */ +/* + * Macro to use new extended version of Tcl_InitHashTable. + */ +# define Tcl_InitHashTable(tablePtr, keyType) \ + Tcl_InitHashTableEx(tablePtr, keyType, NULL) +#endif /* TCL_PRESERVE_BINARY_COMPATABILITY */ + + +/* + * Flag values to pass to Tcl_DoOneEvent to disable searches + * for some kinds of events: + */ +#define TCL_DONT_WAIT (1<<1) +#define TCL_WINDOW_EVENTS (1<<2) +#define TCL_FILE_EVENTS (1<<3) +#define TCL_TIMER_EVENTS (1<<4) +#define TCL_IDLE_EVENTS (1<<5) /* WAS 0x10 ???? */ +#define TCL_ALL_EVENTS (~TCL_DONT_WAIT) + +/* + * The following structure defines a generic event for the Tcl event + * system. These are the things that are queued in calls to Tcl_QueueEvent + * and serviced later by Tcl_DoOneEvent. There can be many different + * kinds of events with different fields, corresponding to window events, + * timer events, etc. The structure for a particular event consists of + * a Tcl_Event header followed by additional information specific to that + * event. + */ + +struct Tcl_Event { + Tcl_EventProc *proc; /* Procedure to call to service this event. */ + struct Tcl_Event *nextPtr; /* Next in list of pending events, or NULL. */ +}; + +/* + * Positions to pass to Tcl_QueueEvent: + */ + +typedef enum { + TCL_QUEUE_TAIL, TCL_QUEUE_HEAD, TCL_QUEUE_MARK +} Tcl_QueuePosition; + +/* + * Values to pass to Tcl_SetServiceMode to specify the behavior of notifier + * event routines. + */ + +#define TCL_SERVICE_NONE 0 +#define TCL_SERVICE_ALL 1 + +/* + * The following structure keeps is used to hold a time value, either as + * an absolute time (the number of seconds from the epoch) or as an + * elapsed time. On Unix systems the epoch is Midnight Jan 1, 1970 GMT. + */ + +typedef struct Tcl_Time { + long sec; /* Seconds. */ + long usec; /* Microseconds. */ +} Tcl_Time; + +typedef void (Tcl_SetTimerProc) _ANSI_ARGS_((Tcl_Time *timePtr)); +typedef int (Tcl_WaitForEventProc) _ANSI_ARGS_((Tcl_Time *timePtr)); + +/* + * Bits to pass to Tcl_CreateFileHandler and Tcl_CreateChannelHandler + * to indicate what sorts of events are of interest: + */ +#define TCL_READABLE (1<<1) +#define TCL_WRITABLE (1<<2) +#define TCL_EXCEPTION (1<<3) + +/* + * Flag values to pass to Tcl_OpenCommandChannel to indicate the + * disposition of the stdio handles. TCL_STDIN, TCL_STDOUT, TCL_STDERR, + * are also used in Tcl_GetStdChannel. + */ + +#define TCL_STDIN (1<<1) +#define TCL_STDOUT (1<<2) +#define TCL_STDERR (1<<3) +#define TCL_ENFORCE_MODE (1<<4) + +/* + * Bits passed to Tcl_DriverClose2Proc to indicate which side of a channel + * should be closed. + */ +#define TCL_CLOSE_READ (1<<1) +#define TCL_CLOSE_WRITE (1<<2) + +/* + * Value to use as the closeProc for a channel that supports the + * close2Proc interface. + */ + +#define TCL_CLOSE2PROC ((Tcl_DriverCloseProc *)1) + +/* + * Channel version tag. This was introduced in 8.3.2/8.4. + */ + +#define TCL_CHANNEL_VERSION_1 ((Tcl_ChannelTypeVersion) 0x1) +#define TCL_CHANNEL_VERSION_2 ((Tcl_ChannelTypeVersion) 0x2) +#define TCL_CHANNEL_VERSION_3 ((Tcl_ChannelTypeVersion) 0x3) +#define TCL_CHANNEL_VERSION_4 ((Tcl_ChannelTypeVersion) 0x4) + +/* + * TIP #218: Channel Actions, Ids for Tcl_DriverThreadActionProc + */ + +#define TCL_CHANNEL_THREAD_INSERT (0) +#define TCL_CHANNEL_THREAD_REMOVE (1) + +/* + * Typedefs for the various operations in a channel type: + */ + +typedef int (Tcl_DriverBlockModeProc) _ANSI_ARGS_(( + ClientData instanceData, int mode)); +typedef int (Tcl_DriverCloseProc) _ANSI_ARGS_((ClientData instanceData, + Tcl_Interp *interp)); +typedef int (Tcl_DriverClose2Proc) _ANSI_ARGS_((ClientData instanceData, + Tcl_Interp *interp, int flags)); +typedef int (Tcl_DriverInputProc) _ANSI_ARGS_((ClientData instanceData, + char *buf, int toRead, int *errorCodePtr)); +typedef int (Tcl_DriverOutputProc) _ANSI_ARGS_((ClientData instanceData, + CONST84 char *buf, int toWrite, int *errorCodePtr)); +typedef int (Tcl_DriverSeekProc) _ANSI_ARGS_((ClientData instanceData, + long offset, int mode, int *errorCodePtr)); +typedef int (Tcl_DriverSetOptionProc) _ANSI_ARGS_(( + ClientData instanceData, Tcl_Interp *interp, + CONST char *optionName, CONST char *value)); +typedef int (Tcl_DriverGetOptionProc) _ANSI_ARGS_(( + ClientData instanceData, Tcl_Interp *interp, + CONST84 char *optionName, Tcl_DString *dsPtr)); +typedef void (Tcl_DriverWatchProc) _ANSI_ARGS_(( + ClientData instanceData, int mask)); +typedef int (Tcl_DriverGetHandleProc) _ANSI_ARGS_(( + ClientData instanceData, int direction, + ClientData *handlePtr)); +typedef int (Tcl_DriverFlushProc) _ANSI_ARGS_(( + ClientData instanceData)); +typedef int (Tcl_DriverHandlerProc) _ANSI_ARGS_(( + ClientData instanceData, int interestMask)); +typedef Tcl_WideInt (Tcl_DriverWideSeekProc) _ANSI_ARGS_(( + ClientData instanceData, Tcl_WideInt offset, + int mode, int *errorCodePtr)); + + /* TIP #218, Channel Thread Actions */ +typedef void (Tcl_DriverThreadActionProc) _ANSI_ARGS_ (( + ClientData instanceData, int action)); + +/* + * The following declarations either map ckalloc and ckfree to + * malloc and free, or they map them to procedures with all sorts + * of debugging hooks defined in tclCkalloc.c. + */ +#ifdef TCL_MEM_DEBUG + +# define ckalloc(x) Tcl_DbCkalloc(x, __FILE__, __LINE__) +# define ckfree(x) Tcl_DbCkfree(x, __FILE__, __LINE__) +# define ckrealloc(x,y) Tcl_DbCkrealloc((x), (y),__FILE__, __LINE__) +# define attemptckalloc(x) Tcl_AttemptDbCkalloc(x, __FILE__, __LINE__) +# define attemptckrealloc(x,y) Tcl_AttemptDbCkrealloc((x), (y), __FILE__, __LINE__) +#else /* !TCL_MEM_DEBUG */ + +/* + * If we are not using the debugging allocator, we should call the + * Tcl_Alloc, et al. routines in order to guarantee that every module + * is using the same memory allocator both inside and outside of the + * Tcl library. + */ +# define ckalloc(x) Tcl_Alloc(x) +# define ckfree(x) Tcl_Free(x) +# define ckrealloc(x,y) Tcl_Realloc(x,y) +# define attemptckalloc(x) Tcl_AttemptAlloc(x) +# define attemptckrealloc(x,y) Tcl_AttemptRealloc(x,y) +# define Tcl_InitMemory(x) +# define Tcl_DumpActiveMemory(x) +# define Tcl_ValidateAllMemory(x,y) + +#endif /* !TCL_MEM_DEBUG */ + +/* + * struct Tcl_ChannelType: + * + * One such structure exists for each type (kind) of channel. + * It collects together in one place all the functions that are + * part of the specific channel type. + * + * It is recommend that the Tcl_Channel* functions are used to access + * elements of this structure, instead of direct accessing. + */ + +typedef struct Tcl_ChannelType { + char *typeName; /* The name of the channel type in Tcl + * commands. This storage is owned by + * channel type. */ + Tcl_ChannelTypeVersion version; /* Version of the channel type. */ + Tcl_DriverCloseProc *closeProc; /* Procedure to call to close the + * channel, or TCL_CLOSE2PROC if the + * close2Proc should be used + * instead. */ + Tcl_DriverInputProc *inputProc; /* Procedure to call for input + * on channel. */ + Tcl_DriverOutputProc *outputProc; /* Procedure to call for output + * on channel. */ + Tcl_DriverSeekProc *seekProc; /* Procedure to call to seek + * on the channel. May be NULL. */ + Tcl_DriverSetOptionProc *setOptionProc; + /* Set an option on a channel. */ + Tcl_DriverGetOptionProc *getOptionProc; + /* Get an option from a channel. */ + Tcl_DriverWatchProc *watchProc; /* Set up the notifier to watch + * for events on this channel. */ + Tcl_DriverGetHandleProc *getHandleProc; + /* Get an OS handle from the channel + * or NULL if not supported. */ + Tcl_DriverClose2Proc *close2Proc; /* Procedure to call to close the + * channel if the device supports + * closing the read & write sides + * independently. */ + Tcl_DriverBlockModeProc *blockModeProc; + /* Set blocking mode for the + * raw channel. May be NULL. */ + /* + * Only valid in TCL_CHANNEL_VERSION_2 channels or later + */ + Tcl_DriverFlushProc *flushProc; /* Procedure to call to flush a + * channel. May be NULL. */ + Tcl_DriverHandlerProc *handlerProc; /* Procedure to call to handle a + * channel event. This will be passed + * up the stacked channel chain. */ + /* + * Only valid in TCL_CHANNEL_VERSION_3 channels or later + */ + Tcl_DriverWideSeekProc *wideSeekProc; + /* Procedure to call to seek + * on the channel which can + * handle 64-bit offsets. May be + * NULL, and must be NULL if + * seekProc is NULL. */ + + /* + * Only valid in TCL_CHANNEL_VERSION_4 channels or later + * TIP #218, Channel Thread Actions + */ + Tcl_DriverThreadActionProc *threadActionProc; + /* Procedure to call to notify + * the driver of thread specific + * activity for a channel. + * May be NULL. */ +} Tcl_ChannelType; + +/* + * The following flags determine whether the blockModeProc above should + * set the channel into blocking or nonblocking mode. They are passed + * as arguments to the blockModeProc procedure in the above structure. + */ +#define TCL_MODE_BLOCKING 0 /* Put channel into blocking mode. */ +#define TCL_MODE_NONBLOCKING 1 /* Put channel into nonblocking + * mode. */ + +/* + * Enum for different types of file paths. + */ + +typedef enum Tcl_PathType { + TCL_PATH_ABSOLUTE, + TCL_PATH_RELATIVE, + TCL_PATH_VOLUME_RELATIVE +} Tcl_PathType; + +/* + * The following structure is used to pass glob type data amongst + * the various glob routines and Tcl_FSMatchInDirectory. + */ +typedef struct Tcl_GlobTypeData { + /* Corresponds to bcdpfls as in 'find -t' */ + int type; + /* Corresponds to file permissions */ + int perm; + /* Acceptable mac type */ + Tcl_Obj* macType; + /* Acceptable mac creator */ + Tcl_Obj* macCreator; +} Tcl_GlobTypeData; + +/* + * type and permission definitions for glob command + */ + +#define TCL_GLOB_TYPE_BLOCK (1<<0) +#define TCL_GLOB_TYPE_CHAR (1<<1) +#define TCL_GLOB_TYPE_DIR (1<<2) +#define TCL_GLOB_TYPE_PIPE (1<<3) +#define TCL_GLOB_TYPE_FILE (1<<4) +#define TCL_GLOB_TYPE_LINK (1<<5) +#define TCL_GLOB_TYPE_SOCK (1<<6) +#define TCL_GLOB_TYPE_MOUNT (1<<7) + +#define TCL_GLOB_PERM_RONLY (1<<0) +#define TCL_GLOB_PERM_HIDDEN (1<<1) +#define TCL_GLOB_PERM_R (1<<2) +#define TCL_GLOB_PERM_W (1<<3) +#define TCL_GLOB_PERM_X (1<<4) + +/* + * Typedefs for the various filesystem operations: + */ + +typedef int (Tcl_FSStatProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, Tcl_StatBuf *buf)); +typedef int (Tcl_FSAccessProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, int mode)); +typedef Tcl_Channel (Tcl_FSOpenFileChannelProc) + _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *pathPtr, + int mode, int permissions)); +typedef int (Tcl_FSMatchInDirectoryProc) _ANSI_ARGS_((Tcl_Interp* interp, + Tcl_Obj *result, Tcl_Obj *pathPtr, CONST char *pattern, + Tcl_GlobTypeData * types)); +typedef Tcl_Obj* (Tcl_FSGetCwdProc) _ANSI_ARGS_((Tcl_Interp *interp)); +typedef int (Tcl_FSChdirProc) _ANSI_ARGS_((Tcl_Obj *pathPtr)); +typedef int (Tcl_FSLstatProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, + Tcl_StatBuf *buf)); +typedef int (Tcl_FSCreateDirectoryProc) _ANSI_ARGS_((Tcl_Obj *pathPtr)); +typedef int (Tcl_FSDeleteFileProc) _ANSI_ARGS_((Tcl_Obj *pathPtr)); +typedef int (Tcl_FSCopyDirectoryProc) _ANSI_ARGS_((Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr, Tcl_Obj **errorPtr)); +typedef int (Tcl_FSCopyFileProc) _ANSI_ARGS_((Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr)); +typedef int (Tcl_FSRemoveDirectoryProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, + int recursive, Tcl_Obj **errorPtr)); +typedef int (Tcl_FSRenameFileProc) _ANSI_ARGS_((Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr)); +typedef void (Tcl_FSUnloadFileProc) _ANSI_ARGS_((Tcl_LoadHandle loadHandle)); +typedef Tcl_Obj* (Tcl_FSListVolumesProc) _ANSI_ARGS_((void)); +/* We have to declare the utime structure here. */ +struct utimbuf; +typedef int (Tcl_FSUtimeProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, + struct utimbuf *tval)); +typedef int (Tcl_FSNormalizePathProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *pathPtr, int nextCheckpoint)); +typedef int (Tcl_FSFileAttrsGetProc) _ANSI_ARGS_((Tcl_Interp *interp, + int index, Tcl_Obj *pathPtr, + Tcl_Obj **objPtrRef)); +typedef CONST char** (Tcl_FSFileAttrStringsProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, + Tcl_Obj** objPtrRef)); +typedef int (Tcl_FSFileAttrsSetProc) _ANSI_ARGS_((Tcl_Interp *interp, + int index, Tcl_Obj *pathPtr, + Tcl_Obj *objPtr)); +typedef Tcl_Obj* (Tcl_FSLinkProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, + Tcl_Obj *toPtr, int linkType)); +typedef int (Tcl_FSLoadFileProc) _ANSI_ARGS_((Tcl_Interp * interp, + Tcl_Obj *pathPtr, + Tcl_LoadHandle *handlePtr, + Tcl_FSUnloadFileProc **unloadProcPtr)); +typedef int (Tcl_FSPathInFilesystemProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, + ClientData *clientDataPtr)); +typedef Tcl_Obj* (Tcl_FSFilesystemPathTypeProc) + _ANSI_ARGS_((Tcl_Obj *pathPtr)); +typedef Tcl_Obj* (Tcl_FSFilesystemSeparatorProc) + _ANSI_ARGS_((Tcl_Obj *pathPtr)); +typedef void (Tcl_FSFreeInternalRepProc) _ANSI_ARGS_((ClientData clientData)); +typedef ClientData (Tcl_FSDupInternalRepProc) + _ANSI_ARGS_((ClientData clientData)); +typedef Tcl_Obj* (Tcl_FSInternalToNormalizedProc) + _ANSI_ARGS_((ClientData clientData)); +typedef ClientData (Tcl_FSCreateInternalRepProc) _ANSI_ARGS_((Tcl_Obj *pathPtr)); + +typedef struct Tcl_FSVersion_ *Tcl_FSVersion; + +/* + *---------------------------------------------------------------- + * Data structures related to hooking into the filesystem + *---------------------------------------------------------------- + */ + +/* + * Filesystem version tag. This was introduced in 8.4. + */ +#define TCL_FILESYSTEM_VERSION_1 ((Tcl_FSVersion) 0x1) + +/* + * struct Tcl_Filesystem: + * + * One such structure exists for each type (kind) of filesystem. + * It collects together in one place all the functions that are + * part of the specific filesystem. Tcl always accesses the + * filesystem through one of these structures. + * + * Not all entries need be non-NULL; any which are NULL are simply + * ignored. However, a complete filesystem should provide all of + * these functions. The explanations in the structure show + * the importance of each function. + */ + +typedef struct Tcl_Filesystem { + CONST char *typeName; /* The name of the filesystem. */ + int structureLength; /* Length of this structure, so future + * binary compatibility can be assured. */ + Tcl_FSVersion version; + /* Version of the filesystem type. */ + Tcl_FSPathInFilesystemProc *pathInFilesystemProc; + /* Function to check whether a path is in + * this filesystem. This is the most + * important filesystem procedure. */ + Tcl_FSDupInternalRepProc *dupInternalRepProc; + /* Function to duplicate internal fs rep. May + * be NULL (but then fs is less efficient). */ + Tcl_FSFreeInternalRepProc *freeInternalRepProc; + /* Function to free internal fs rep. Must + * be implemented, if internal representations + * need freeing, otherwise it can be NULL. */ + Tcl_FSInternalToNormalizedProc *internalToNormalizedProc; + /* Function to convert internal representation + * to a normalized path. Only required if + * the fs creates pure path objects with no + * string/path representation. */ + Tcl_FSCreateInternalRepProc *createInternalRepProc; + /* Function to create a filesystem-specific + * internal representation. May be NULL + * if paths have no internal representation, + * or if the Tcl_FSPathInFilesystemProc + * for this filesystem always immediately + * creates an internal representation for + * paths it accepts. */ + Tcl_FSNormalizePathProc *normalizePathProc; + /* Function to normalize a path. Should + * be implemented for all filesystems + * which can have multiple string + * representations for the same path + * object. */ + Tcl_FSFilesystemPathTypeProc *filesystemPathTypeProc; + /* Function to determine the type of a + * path in this filesystem. May be NULL. */ + Tcl_FSFilesystemSeparatorProc *filesystemSeparatorProc; + /* Function to return the separator + * character(s) for this filesystem. Must + * be implemented. */ + Tcl_FSStatProc *statProc; + /* + * Function to process a 'Tcl_FSStat()' + * call. Must be implemented for any + * reasonable filesystem. + */ + Tcl_FSAccessProc *accessProc; + /* + * Function to process a 'Tcl_FSAccess()' + * call. Must be implemented for any + * reasonable filesystem. + */ + Tcl_FSOpenFileChannelProc *openFileChannelProc; + /* + * Function to process a + * 'Tcl_FSOpenFileChannel()' call. Must be + * implemented for any reasonable + * filesystem. + */ + Tcl_FSMatchInDirectoryProc *matchInDirectoryProc; + /* Function to process a + * 'Tcl_FSMatchInDirectory()'. If not + * implemented, then glob and recursive + * copy functionality will be lacking in + * the filesystem. */ + Tcl_FSUtimeProc *utimeProc; + /* Function to process a + * 'Tcl_FSUtime()' call. Required to + * allow setting (not reading) of times + * with 'file mtime', 'file atime' and + * the open-r/open-w/fcopy implementation + * of 'file copy'. */ + Tcl_FSLinkProc *linkProc; + /* Function to process a + * 'Tcl_FSLink()' call. Should be + * implemented only if the filesystem supports + * links (reading or creating). */ + Tcl_FSListVolumesProc *listVolumesProc; + /* Function to list any filesystem volumes + * added by this filesystem. Should be + * implemented only if the filesystem adds + * volumes at the head of the filesystem. */ + Tcl_FSFileAttrStringsProc *fileAttrStringsProc; + /* Function to list all attributes strings + * which are valid for this filesystem. + * If not implemented the filesystem will + * not support the 'file attributes' command. + * This allows arbitrary additional information + * to be attached to files in the filesystem. */ + Tcl_FSFileAttrsGetProc *fileAttrsGetProc; + /* Function to process a + * 'Tcl_FSFileAttrsGet()' call, used by + * 'file attributes'. */ + Tcl_FSFileAttrsSetProc *fileAttrsSetProc; + /* Function to process a + * 'Tcl_FSFileAttrsSet()' call, used by + * 'file attributes'. */ + Tcl_FSCreateDirectoryProc *createDirectoryProc; + /* Function to process a + * 'Tcl_FSCreateDirectory()' call. Should + * be implemented unless the FS is + * read-only. */ + Tcl_FSRemoveDirectoryProc *removeDirectoryProc; + /* Function to process a + * 'Tcl_FSRemoveDirectory()' call. Should + * be implemented unless the FS is + * read-only. */ + Tcl_FSDeleteFileProc *deleteFileProc; + /* Function to process a + * 'Tcl_FSDeleteFile()' call. Should + * be implemented unless the FS is + * read-only. */ + Tcl_FSCopyFileProc *copyFileProc; + /* Function to process a + * 'Tcl_FSCopyFile()' call. If not + * implemented Tcl will fall back + * on open-r, open-w and fcopy as + * a copying mechanism, for copying + * actions initiated in Tcl (not C). */ + Tcl_FSRenameFileProc *renameFileProc; + /* Function to process a + * 'Tcl_FSRenameFile()' call. If not + * implemented, Tcl will fall back on + * a copy and delete mechanism, for + * rename actions initiated in Tcl (not C). */ + Tcl_FSCopyDirectoryProc *copyDirectoryProc; + /* Function to process a + * 'Tcl_FSCopyDirectory()' call. If + * not implemented, Tcl will fall back + * on a recursive create-dir, file copy + * mechanism, for copying actions + * initiated in Tcl (not C). */ + Tcl_FSLstatProc *lstatProc; + /* Function to process a + * 'Tcl_FSLstat()' call. If not implemented, + * Tcl will attempt to use the 'statProc' + * defined above instead. */ + Tcl_FSLoadFileProc *loadFileProc; + /* Function to process a + * 'Tcl_FSLoadFile()' call. If not + * implemented, Tcl will fall back on + * a copy to native-temp followed by a + * Tcl_FSLoadFile on that temporary copy. */ + Tcl_FSGetCwdProc *getCwdProc; + /* + * Function to process a 'Tcl_FSGetCwd()' + * call. Most filesystems need not + * implement this. It will usually only be + * called once, if 'getcwd' is called + * before 'chdir'. May be NULL. + */ + Tcl_FSChdirProc *chdirProc; + /* + * Function to process a 'Tcl_FSChdir()' + * call. If filesystems do not implement + * this, it will be emulated by a series of + * directory access checks. Otherwise, + * virtual filesystems which do implement + * it need only respond with a positive + * return result if the dirName is a valid + * directory in their filesystem. They + * need not remember the result, since that + * will be automatically remembered for use + * by GetCwd. Real filesystems should + * carry out the correct action (i.e. call + * the correct system 'chdir' api). If not + * implemented, then 'cd' and 'pwd' will + * fail inside the filesystem. + */ +} Tcl_Filesystem; + +/* + * The following definitions are used as values for the 'linkAction' flag + * to Tcl_FSLink, or the linkProc of any filesystem. Any combination + * of flags can be given. For link creation, the linkProc should create + * a link which matches any of the types given. + * + * TCL_CREATE_SYMBOLIC_LINK: Create a symbolic or soft link. + * TCL_CREATE_HARD_LINK: Create a hard link. + */ + +#define TCL_CREATE_SYMBOLIC_LINK 0x01 +#define TCL_CREATE_HARD_LINK 0x02 + +/* + * The following structure represents the Notifier functions that + * you can override with the Tcl_SetNotifier call. + */ + +typedef struct Tcl_NotifierProcs { + Tcl_SetTimerProc *setTimerProc; + Tcl_WaitForEventProc *waitForEventProc; + Tcl_CreateFileHandlerProc *createFileHandlerProc; + Tcl_DeleteFileHandlerProc *deleteFileHandlerProc; + Tcl_InitNotifierProc *initNotifierProc; + Tcl_FinalizeNotifierProc *finalizeNotifierProc; + Tcl_AlertNotifierProc *alertNotifierProc; + Tcl_ServiceModeHookProc *serviceModeHookProc; +} Tcl_NotifierProcs; + +/* + * The following structure represents a user-defined encoding. It collects + * together all the functions that are used by the specific encoding. + */ + +typedef struct Tcl_EncodingType { + CONST char *encodingName; /* The name of the encoding, e.g. "euc-jp". + * This name is the unique key for this + * encoding type. */ + Tcl_EncodingConvertProc *toUtfProc; + /* Procedure to convert from external + * encoding into UTF-8. */ + Tcl_EncodingConvertProc *fromUtfProc; + /* Procedure to convert from UTF-8 into + * external encoding. */ + Tcl_EncodingFreeProc *freeProc; + /* If non-NULL, procedure to call when this + * encoding is deleted. */ + ClientData clientData; /* Arbitrary value associated with encoding + * type. Passed to conversion procedures. */ + int nullSize; /* Number of zero bytes that signify + * end-of-string in this encoding. This + * number is used to determine the source + * string length when the srcLen argument is + * negative. Must be 1 or 2. */ +} Tcl_EncodingType; + +/* + * The following definitions are used as values for the conversion control + * flags argument when converting text from one character set to another: + * + * TCL_ENCODING_START: Signifies that the source buffer is the first + * block in a (potentially multi-block) input + * stream. Tells the conversion procedure to + * reset to an initial state and perform any + * initialization that needs to occur before the + * first byte is converted. If the source + * buffer contains the entire input stream to be + * converted, this flag should be set. + * + * TCL_ENCODING_END: Signifies that the source buffer is the last + * block in a (potentially multi-block) input + * stream. Tells the conversion routine to + * perform any finalization that needs to occur + * after the last byte is converted and then to + * reset to an initial state. If the source + * buffer contains the entire input stream to be + * converted, this flag should be set. + * + * TCL_ENCODING_STOPONERROR: If set, then the converter will return + * immediately upon encountering an invalid + * byte sequence or a source character that has + * no mapping in the target encoding. If clear, + * then the converter will skip the problem, + * substituting one or more "close" characters + * in the destination buffer and then continue + * to sonvert the source. + */ +#define TCL_ENCODING_START 0x01 +#define TCL_ENCODING_END 0x02 +#define TCL_ENCODING_STOPONERROR 0x04 + +/* + * The following data structures and declarations are for the new Tcl + * parser. + */ + +/* + * For each word of a command, and for each piece of a word such as a + * variable reference, one of the following structures is created to + * describe the token. + */ + +typedef struct Tcl_Token { + int type; /* Type of token, such as TCL_TOKEN_WORD; + * see below for valid types. */ + CONST char *start; /* First character in token. */ + int size; /* Number of bytes in token. */ + int numComponents; /* If this token is composed of other + * tokens, this field tells how many of + * them there are (including components of + * components, etc.). The component tokens + * immediately follow this one. */ +} Tcl_Token; + +/* + * Type values defined for Tcl_Token structures. These values are + * defined as mask bits so that it's easy to check for collections of + * types. + * + * TCL_TOKEN_WORD - The token describes one word of a command, + * from the first non-blank character of + * the word (which may be " or {) up to but + * not including the space, semicolon, or + * bracket that terminates the word. + * NumComponents counts the total number of + * sub-tokens that make up the word. This + * includes, for example, sub-tokens of + * TCL_TOKEN_VARIABLE tokens. + * TCL_TOKEN_SIMPLE_WORD - This token is just like TCL_TOKEN_WORD + * except that the word is guaranteed to + * consist of a single TCL_TOKEN_TEXT + * sub-token. + * TCL_TOKEN_TEXT - The token describes a range of literal + * text that is part of a word. + * NumComponents is always 0. + * TCL_TOKEN_BS - The token describes a backslash sequence + * that must be collapsed. NumComponents + * is always 0. + * TCL_TOKEN_COMMAND - The token describes a command whose result + * must be substituted into the word. The + * token includes the enclosing brackets. + * NumComponents is always 0. + * TCL_TOKEN_VARIABLE - The token describes a variable + * substitution, including the dollar sign, + * variable name, and array index (if there + * is one) up through the right + * parentheses. NumComponents tells how + * many additional tokens follow to + * represent the variable name. The first + * token will be a TCL_TOKEN_TEXT token + * that describes the variable name. If + * the variable is an array reference then + * there will be one or more additional + * tokens, of type TCL_TOKEN_TEXT, + * TCL_TOKEN_BS, TCL_TOKEN_COMMAND, and + * TCL_TOKEN_VARIABLE, that describe the + * array index; numComponents counts the + * total number of nested tokens that make + * up the variable reference, including + * sub-tokens of TCL_TOKEN_VARIABLE tokens. + * TCL_TOKEN_SUB_EXPR - The token describes one subexpression of a + * expression, from the first non-blank + * character of the subexpression up to but not + * including the space, brace, or bracket + * that terminates the subexpression. + * NumComponents counts the total number of + * following subtokens that make up the + * subexpression; this includes all subtokens + * for any nested TCL_TOKEN_SUB_EXPR tokens. + * For example, a numeric value used as a + * primitive operand is described by a + * TCL_TOKEN_SUB_EXPR token followed by a + * TCL_TOKEN_TEXT token. A binary subexpression + * is described by a TCL_TOKEN_SUB_EXPR token + * followed by the TCL_TOKEN_OPERATOR token + * for the operator, then TCL_TOKEN_SUB_EXPR + * tokens for the left then the right operands. + * TCL_TOKEN_OPERATOR - The token describes one expression operator. + * An operator might be the name of a math + * function such as "abs". A TCL_TOKEN_OPERATOR + * token is always preceeded by one + * TCL_TOKEN_SUB_EXPR token for the operator's + * subexpression, and is followed by zero or + * more TCL_TOKEN_SUB_EXPR tokens for the + * operator's operands. NumComponents is + * always 0. + */ +#define TCL_TOKEN_WORD 1 +#define TCL_TOKEN_SIMPLE_WORD 2 +#define TCL_TOKEN_TEXT 4 +#define TCL_TOKEN_BS 8 +#define TCL_TOKEN_COMMAND 16 +#define TCL_TOKEN_VARIABLE 32 +#define TCL_TOKEN_SUB_EXPR 64 +#define TCL_TOKEN_OPERATOR 128 + +/* + * Parsing error types. On any parsing error, one of these values + * will be stored in the error field of the Tcl_Parse structure + * defined below. + */ + +#define TCL_PARSE_SUCCESS 0 +#define TCL_PARSE_QUOTE_EXTRA 1 +#define TCL_PARSE_BRACE_EXTRA 2 +#define TCL_PARSE_MISSING_BRACE 3 +#define TCL_PARSE_MISSING_BRACKET 4 +#define TCL_PARSE_MISSING_PAREN 5 +#define TCL_PARSE_MISSING_QUOTE 6 +#define TCL_PARSE_MISSING_VAR_BRACE 7 +#define TCL_PARSE_SYNTAX 8 +#define TCL_PARSE_BAD_NUMBER 9 + +/* + * A structure of the following type is filled in by Tcl_ParseCommand. + * It describes a single command parsed from an input string. + */ + +#define NUM_STATIC_TOKENS 20 + +typedef struct Tcl_Parse { + CONST char *commentStart; /* Pointer to # that begins the first of + * one or more comments preceding the + * command. */ + int commentSize; /* Number of bytes in comments (up through + * newline character that terminates the + * last comment). If there were no + * comments, this field is 0. */ + CONST char *commandStart; /* First character in first word of command. */ + int commandSize; /* Number of bytes in command, including + * first character of first word, up + * through the terminating newline, + * close bracket, or semicolon. */ + int numWords; /* Total number of words in command. May + * be 0. */ + Tcl_Token *tokenPtr; /* Pointer to first token representing + * the words of the command. Initially + * points to staticTokens, but may change + * to point to malloc-ed space if command + * exceeds space in staticTokens. */ + int numTokens; /* Total number of tokens in command. */ + int tokensAvailable; /* Total number of tokens available at + * *tokenPtr. */ + int errorType; /* One of the parsing error types defined + * above. */ + + /* + * The fields below are intended only for the private use of the + * parser. They should not be used by procedures that invoke + * Tcl_ParseCommand. + */ + + CONST char *string; /* The original command string passed to + * Tcl_ParseCommand. */ + CONST char *end; /* Points to the character just after the + * last one in the command string. */ + Tcl_Interp *interp; /* Interpreter to use for error reporting, + * or NULL. */ + CONST char *term; /* Points to character in string that + * terminated most recent token. Filled in + * by ParseTokens. If an error occurs, + * points to beginning of region where the + * error occurred (e.g. the open brace if + * the close brace is missing). */ + int incomplete; /* This field is set to 1 by Tcl_ParseCommand + * if the command appears to be incomplete. + * This information is used by + * Tcl_CommandComplete. */ + Tcl_Token staticTokens[NUM_STATIC_TOKENS]; + /* Initial space for tokens for command. + * This space should be large enough to + * accommodate most commands; dynamic + * space is allocated for very large + * commands that don't fit here. */ +} Tcl_Parse; + +/* + * The following definitions are the error codes returned by the conversion + * routines: + * + * TCL_OK: All characters were converted. + * + * TCL_CONVERT_NOSPACE: The output buffer would not have been large + * enough for all of the converted data; as many + * characters as could fit were converted though. + * + * TCL_CONVERT_MULTIBYTE: The last few bytes in the source string were + * the beginning of a multibyte sequence, but + * more bytes were needed to complete this + * sequence. A subsequent call to the conversion + * routine should pass the beginning of this + * unconverted sequence plus additional bytes + * from the source stream to properly convert + * the formerly split-up multibyte sequence. + * + * TCL_CONVERT_SYNTAX: The source stream contained an invalid + * character sequence. This may occur if the + * input stream has been damaged or if the input + * encoding method was misidentified. This error + * is reported only if TCL_ENCODING_STOPONERROR + * was specified. + * + * TCL_CONVERT_UNKNOWN: The source string contained a character + * that could not be represented in the target + * encoding. This error is reported only if + * TCL_ENCODING_STOPONERROR was specified. + */ + +#define TCL_CONVERT_MULTIBYTE -1 +#define TCL_CONVERT_SYNTAX -2 +#define TCL_CONVERT_UNKNOWN -3 +#define TCL_CONVERT_NOSPACE -4 + +/* + * The maximum number of bytes that are necessary to represent a single + * Unicode character in UTF-8. The valid values should be 3 or 6 (or + * perhaps 1 if we want to support a non-unicode enabled core). + * If 3, then Tcl_UniChar must be 2-bytes in size (UCS-2). (default) + * If 6, then Tcl_UniChar must be 4-bytes in size (UCS-4). + * At this time UCS-2 mode is the default and recommended mode. + * UCS-4 is experimental and not recommended. It works for the core, + * but most extensions expect UCS-2. + */ + +#ifndef TCL_UTF_MAX +#define TCL_UTF_MAX 3 +#endif + +/* + * This represents a Unicode character. Any changes to this should + * also be reflected in regcustom.h. + */ + +#if TCL_UTF_MAX > 4 + /* + * unsigned int isn't 100% accurate as it should be a strict 4-byte + * value (perhaps wchar_t). 64-bit systems may have troubles. The + * size of this value must be reflected correctly in regcustom.h and + * in tclEncoding.c. + * XXX: Tcl is currently UCS-2 and planning UTF-16 for the Unicode + * XXX: string rep that Tcl_UniChar represents. Changing the size + * XXX: of Tcl_UniChar is /not/ supported. + */ +typedef unsigned int Tcl_UniChar; +#else +typedef unsigned short Tcl_UniChar; +#endif + + +/* + * These function have been renamed. The old names are deprecated, but we + * define these macros for backwards compatibilty. + */ +#define Tcl_Ckalloc Tcl_Alloc +#define Tcl_Ckfree Tcl_Free +#define Tcl_Ckrealloc Tcl_Realloc +#define Tcl_Return Tcl_SetResult +#define Tcl_TildeSubst Tcl_TranslateFileName +#define panic Tcl_Panic +#define panicVA Tcl_PanicVA + +/* + * The following constant is used to test for older versions of Tcl + * in the stubs tables. + * + * Jan Nijtman's plus patch uses 0xFCA1BACF, so we need to pick a different + * value since the stubs tables don't match. + */ + +#define TCL_STUB_MAGIC ((int)0xFCA3BACF) + +/* + * The following function is required to be defined in all stubs aware + * extensions. The function is actually implemented in the stub + * library, not the main Tcl library, although there is a trivial + * implementation in the main library in case an extension is statically + * linked into an application. + */ + +EXTERN CONST char * Tcl_InitStubs _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *version, int exact)); + +#ifndef USE_TCL_STUBS + +/* + * When not using stubs, make it a macro. + */ + +#define Tcl_InitStubs(interp, version, exact) \ + Tcl_PkgRequire(interp, "Tcl", version, exact) + +#endif + + +/* + * Include the public function declarations that are accessible via + * the stubs table. + */ + +#include "tclDecls.h" + +/* + * Include platform specific public function declarations that are + * accessible via the stubs table. + */ + +#include "tclPlatDecls.h" + +/* + * Public functions that are not accessible via the stubs table. + */ + +EXTERN void Tcl_Main _ANSI_ARGS_((int argc, char **argv, + Tcl_AppInitProc *appInitProc)); + +/* + * Convenience declaration of Tcl_AppInit for backwards compatibility. + * This function is not *implemented* by the tcl library, so the storage + * class is neither DLLEXPORT nor DLLIMPORT + */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS + +EXTERN int Tcl_AppInit _ANSI_ARGS_((Tcl_Interp *interp)); + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#endif /* RC_INVOKED */ + +/* + * end block for C++ + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TCL */ + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tclDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tclDecls.h new file mode 100644 index 00000000..cbfa8ee2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tclDecls.h @@ -0,0 +1,4613 @@ +/* + * tclDecls.h -- + * + * Declarations of functions in the platform independent public Tcl API. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TCLDECLS +#define _TCLDECLS + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tcl.decls script. + */ + +/* !BEGIN!: Do not edit below this line. */ + +/* + * Exported function declarations: + */ + +/* 0 */ +EXTERN int Tcl_PkgProvideEx _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name, CONST char *version, + ClientData clientData)); +/* 1 */ +EXTERN CONST84_RETURN char * Tcl_PkgRequireEx _ANSI_ARGS_(( + Tcl_Interp *interp, CONST char *name, + CONST char *version, int exact, + ClientData *clientDataPtr)); +/* 2 */ +EXTERN void Tcl_Panic _ANSI_ARGS_(TCL_VARARGS(CONST char *,format)); +/* 3 */ +EXTERN char * Tcl_Alloc _ANSI_ARGS_((unsigned int size)); +/* 4 */ +EXTERN void Tcl_Free _ANSI_ARGS_((char *ptr)); +/* 5 */ +EXTERN char * Tcl_Realloc _ANSI_ARGS_((char *ptr, + unsigned int size)); +/* 6 */ +EXTERN char * Tcl_DbCkalloc _ANSI_ARGS_((unsigned int size, + CONST char *file, int line)); +/* 7 */ +EXTERN void Tcl_DbCkfree _ANSI_ARGS_((char *ptr, + CONST char *file, int line)); +/* 8 */ +EXTERN char * Tcl_DbCkrealloc _ANSI_ARGS_((char *ptr, + unsigned int size, CONST char *file, + int line)); +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ +/* 9 */ +EXTERN void Tcl_CreateFileHandler _ANSI_ARGS_((int fd, int mask, + Tcl_FileProc *proc, ClientData clientData)); +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +/* 9 */ +EXTERN void Tcl_CreateFileHandler _ANSI_ARGS_((int fd, int mask, + Tcl_FileProc *proc, ClientData clientData)); +#endif /* MACOSX */ +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ +/* 10 */ +EXTERN void Tcl_DeleteFileHandler _ANSI_ARGS_((int fd)); +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +/* 10 */ +EXTERN void Tcl_DeleteFileHandler _ANSI_ARGS_((int fd)); +#endif /* MACOSX */ +/* 11 */ +EXTERN void Tcl_SetTimer _ANSI_ARGS_((Tcl_Time *timePtr)); +/* 12 */ +EXTERN void Tcl_Sleep _ANSI_ARGS_((int ms)); +/* 13 */ +EXTERN int Tcl_WaitForEvent _ANSI_ARGS_((Tcl_Time *timePtr)); +/* 14 */ +EXTERN int Tcl_AppendAllObjTypes _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *objPtr)); +/* 15 */ +EXTERN void Tcl_AppendStringsToObj _ANSI_ARGS_(TCL_VARARGS(Tcl_Obj *,objPtr)); +/* 16 */ +EXTERN void Tcl_AppendToObj _ANSI_ARGS_((Tcl_Obj *objPtr, + CONST char *bytes, int length)); +/* 17 */ +EXTERN Tcl_Obj * Tcl_ConcatObj _ANSI_ARGS_((int objc, + Tcl_Obj *CONST objv[])); +/* 18 */ +EXTERN int Tcl_ConvertToType _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, Tcl_ObjType *typePtr)); +/* 19 */ +EXTERN void Tcl_DbDecrRefCount _ANSI_ARGS_((Tcl_Obj *objPtr, + CONST char *file, int line)); +/* 20 */ +EXTERN void Tcl_DbIncrRefCount _ANSI_ARGS_((Tcl_Obj *objPtr, + CONST char *file, int line)); +/* 21 */ +EXTERN int Tcl_DbIsShared _ANSI_ARGS_((Tcl_Obj *objPtr, + CONST char *file, int line)); +/* 22 */ +EXTERN Tcl_Obj * Tcl_DbNewBooleanObj _ANSI_ARGS_((int boolValue, + CONST char *file, int line)); +/* 23 */ +EXTERN Tcl_Obj * Tcl_DbNewByteArrayObj _ANSI_ARGS_(( + CONST unsigned char *bytes, int length, + CONST char *file, int line)); +/* 24 */ +EXTERN Tcl_Obj * Tcl_DbNewDoubleObj _ANSI_ARGS_((double doubleValue, + CONST char *file, int line)); +/* 25 */ +EXTERN Tcl_Obj * Tcl_DbNewListObj _ANSI_ARGS_((int objc, + Tcl_Obj *CONST *objv, CONST char *file, + int line)); +/* 26 */ +EXTERN Tcl_Obj * Tcl_DbNewLongObj _ANSI_ARGS_((long longValue, + CONST char *file, int line)); +/* 27 */ +EXTERN Tcl_Obj * Tcl_DbNewObj _ANSI_ARGS_((CONST char *file, int line)); +/* 28 */ +EXTERN Tcl_Obj * Tcl_DbNewStringObj _ANSI_ARGS_((CONST char *bytes, + int length, CONST char *file, int line)); +/* 29 */ +EXTERN Tcl_Obj * Tcl_DuplicateObj _ANSI_ARGS_((Tcl_Obj *objPtr)); +/* 30 */ +EXTERN void TclFreeObj _ANSI_ARGS_((Tcl_Obj *objPtr)); +/* 31 */ +EXTERN int Tcl_GetBoolean _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *src, int *boolPtr)); +/* 32 */ +EXTERN int Tcl_GetBooleanFromObj _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *objPtr, + int *boolPtr)); +/* 33 */ +EXTERN unsigned char * Tcl_GetByteArrayFromObj _ANSI_ARGS_((Tcl_Obj *objPtr, + int *lengthPtr)); +/* 34 */ +EXTERN int Tcl_GetDouble _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *src, double *doublePtr)); +/* 35 */ +EXTERN int Tcl_GetDoubleFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, double *doublePtr)); +/* 36 */ +EXTERN int Tcl_GetIndexFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, CONST84 char **tablePtr, + CONST char *msg, int flags, int *indexPtr)); +/* 37 */ +EXTERN int Tcl_GetInt _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *src, int *intPtr)); +/* 38 */ +EXTERN int Tcl_GetIntFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, int *intPtr)); +/* 39 */ +EXTERN int Tcl_GetLongFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, long *longPtr)); +/* 40 */ +EXTERN Tcl_ObjType * Tcl_GetObjType _ANSI_ARGS_((CONST char *typeName)); +/* 41 */ +EXTERN char * Tcl_GetStringFromObj _ANSI_ARGS_((Tcl_Obj *objPtr, + int *lengthPtr)); +/* 42 */ +EXTERN void Tcl_InvalidateStringRep _ANSI_ARGS_((Tcl_Obj *objPtr)); +/* 43 */ +EXTERN int Tcl_ListObjAppendList _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *listPtr, + Tcl_Obj *elemListPtr)); +/* 44 */ +EXTERN int Tcl_ListObjAppendElement _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *listPtr, + Tcl_Obj *objPtr)); +/* 45 */ +EXTERN int Tcl_ListObjGetElements _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *listPtr, + int *objcPtr, Tcl_Obj ***objvPtr)); +/* 46 */ +EXTERN int Tcl_ListObjIndex _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *listPtr, int index, + Tcl_Obj **objPtrPtr)); +/* 47 */ +EXTERN int Tcl_ListObjLength _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *listPtr, int *lengthPtr)); +/* 48 */ +EXTERN int Tcl_ListObjReplace _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *listPtr, int first, int count, + int objc, Tcl_Obj *CONST objv[])); +/* 49 */ +EXTERN Tcl_Obj * Tcl_NewBooleanObj _ANSI_ARGS_((int boolValue)); +/* 50 */ +EXTERN Tcl_Obj * Tcl_NewByteArrayObj _ANSI_ARGS_(( + CONST unsigned char *bytes, int length)); +/* 51 */ +EXTERN Tcl_Obj * Tcl_NewDoubleObj _ANSI_ARGS_((double doubleValue)); +/* 52 */ +EXTERN Tcl_Obj * Tcl_NewIntObj _ANSI_ARGS_((int intValue)); +/* 53 */ +EXTERN Tcl_Obj * Tcl_NewListObj _ANSI_ARGS_((int objc, + Tcl_Obj *CONST objv[])); +/* 54 */ +EXTERN Tcl_Obj * Tcl_NewLongObj _ANSI_ARGS_((long longValue)); +/* 55 */ +EXTERN Tcl_Obj * Tcl_NewObj _ANSI_ARGS_((void)); +/* 56 */ +EXTERN Tcl_Obj * Tcl_NewStringObj _ANSI_ARGS_((CONST char *bytes, + int length)); +/* 57 */ +EXTERN void Tcl_SetBooleanObj _ANSI_ARGS_((Tcl_Obj *objPtr, + int boolValue)); +/* 58 */ +EXTERN unsigned char * Tcl_SetByteArrayLength _ANSI_ARGS_((Tcl_Obj *objPtr, + int length)); +/* 59 */ +EXTERN void Tcl_SetByteArrayObj _ANSI_ARGS_((Tcl_Obj *objPtr, + CONST unsigned char *bytes, int length)); +/* 60 */ +EXTERN void Tcl_SetDoubleObj _ANSI_ARGS_((Tcl_Obj *objPtr, + double doubleValue)); +/* 61 */ +EXTERN void Tcl_SetIntObj _ANSI_ARGS_((Tcl_Obj *objPtr, + int intValue)); +/* 62 */ +EXTERN void Tcl_SetListObj _ANSI_ARGS_((Tcl_Obj *objPtr, + int objc, Tcl_Obj *CONST objv[])); +/* 63 */ +EXTERN void Tcl_SetLongObj _ANSI_ARGS_((Tcl_Obj *objPtr, + long longValue)); +/* 64 */ +EXTERN void Tcl_SetObjLength _ANSI_ARGS_((Tcl_Obj *objPtr, + int length)); +/* 65 */ +EXTERN void Tcl_SetStringObj _ANSI_ARGS_((Tcl_Obj *objPtr, + CONST char *bytes, int length)); +/* 66 */ +EXTERN void Tcl_AddErrorInfo _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *message)); +/* 67 */ +EXTERN void Tcl_AddObjErrorInfo _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *message, int length)); +/* 68 */ +EXTERN void Tcl_AllowExceptions _ANSI_ARGS_((Tcl_Interp *interp)); +/* 69 */ +EXTERN void Tcl_AppendElement _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *element)); +/* 70 */ +EXTERN void Tcl_AppendResult _ANSI_ARGS_(TCL_VARARGS(Tcl_Interp *,interp)); +/* 71 */ +EXTERN Tcl_AsyncHandler Tcl_AsyncCreate _ANSI_ARGS_((Tcl_AsyncProc *proc, + ClientData clientData)); +/* 72 */ +EXTERN void Tcl_AsyncDelete _ANSI_ARGS_((Tcl_AsyncHandler async)); +/* 73 */ +EXTERN int Tcl_AsyncInvoke _ANSI_ARGS_((Tcl_Interp *interp, + int code)); +/* 74 */ +EXTERN void Tcl_AsyncMark _ANSI_ARGS_((Tcl_AsyncHandler async)); +/* 75 */ +EXTERN int Tcl_AsyncReady _ANSI_ARGS_((void)); +/* 76 */ +EXTERN void Tcl_BackgroundError _ANSI_ARGS_((Tcl_Interp *interp)); +/* 77 */ +EXTERN char Tcl_Backslash _ANSI_ARGS_((CONST char *src, + int *readPtr)); +/* 78 */ +EXTERN int Tcl_BadChannelOption _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *optionName, + CONST char *optionList)); +/* 79 */ +EXTERN void Tcl_CallWhenDeleted _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_InterpDeleteProc *proc, + ClientData clientData)); +/* 80 */ +EXTERN void Tcl_CancelIdleCall _ANSI_ARGS_(( + Tcl_IdleProc *idleProc, + ClientData clientData)); +/* 81 */ +EXTERN int Tcl_Close _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Channel chan)); +/* 82 */ +EXTERN int Tcl_CommandComplete _ANSI_ARGS_((CONST char *cmd)); +/* 83 */ +EXTERN char * Tcl_Concat _ANSI_ARGS_((int argc, + CONST84 char *CONST *argv)); +/* 84 */ +EXTERN int Tcl_ConvertElement _ANSI_ARGS_((CONST char *src, + char *dst, int flags)); +/* 85 */ +EXTERN int Tcl_ConvertCountedElement _ANSI_ARGS_(( + CONST char *src, int length, char *dst, + int flags)); +/* 86 */ +EXTERN int Tcl_CreateAlias _ANSI_ARGS_((Tcl_Interp *slave, + CONST char *slaveCmd, Tcl_Interp *target, + CONST char *targetCmd, int argc, + CONST84 char *CONST *argv)); +/* 87 */ +EXTERN int Tcl_CreateAliasObj _ANSI_ARGS_((Tcl_Interp *slave, + CONST char *slaveCmd, Tcl_Interp *target, + CONST char *targetCmd, int objc, + Tcl_Obj *CONST objv[])); +/* 88 */ +EXTERN Tcl_Channel Tcl_CreateChannel _ANSI_ARGS_(( + Tcl_ChannelType *typePtr, + CONST char *chanName, + ClientData instanceData, int mask)); +/* 89 */ +EXTERN void Tcl_CreateChannelHandler _ANSI_ARGS_(( + Tcl_Channel chan, int mask, + Tcl_ChannelProc *proc, ClientData clientData)); +/* 90 */ +EXTERN void Tcl_CreateCloseHandler _ANSI_ARGS_((Tcl_Channel chan, + Tcl_CloseProc *proc, ClientData clientData)); +/* 91 */ +EXTERN Tcl_Command Tcl_CreateCommand _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *cmdName, Tcl_CmdProc *proc, + ClientData clientData, + Tcl_CmdDeleteProc *deleteProc)); +/* 92 */ +EXTERN void Tcl_CreateEventSource _ANSI_ARGS_(( + Tcl_EventSetupProc *setupProc, + Tcl_EventCheckProc *checkProc, + ClientData clientData)); +/* 93 */ +EXTERN void Tcl_CreateExitHandler _ANSI_ARGS_(( + Tcl_ExitProc *proc, ClientData clientData)); +/* 94 */ +EXTERN Tcl_Interp * Tcl_CreateInterp _ANSI_ARGS_((void)); +/* 95 */ +EXTERN void Tcl_CreateMathFunc _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name, int numArgs, + Tcl_ValueType *argTypes, Tcl_MathProc *proc, + ClientData clientData)); +/* 96 */ +EXTERN Tcl_Command Tcl_CreateObjCommand _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *cmdName, Tcl_ObjCmdProc *proc, + ClientData clientData, + Tcl_CmdDeleteProc *deleteProc)); +/* 97 */ +EXTERN Tcl_Interp * Tcl_CreateSlave _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *slaveName, int isSafe)); +/* 98 */ +EXTERN Tcl_TimerToken Tcl_CreateTimerHandler _ANSI_ARGS_((int milliseconds, + Tcl_TimerProc *proc, ClientData clientData)); +/* 99 */ +EXTERN Tcl_Trace Tcl_CreateTrace _ANSI_ARGS_((Tcl_Interp *interp, + int level, Tcl_CmdTraceProc *proc, + ClientData clientData)); +/* 100 */ +EXTERN void Tcl_DeleteAssocData _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name)); +/* 101 */ +EXTERN void Tcl_DeleteChannelHandler _ANSI_ARGS_(( + Tcl_Channel chan, Tcl_ChannelProc *proc, + ClientData clientData)); +/* 102 */ +EXTERN void Tcl_DeleteCloseHandler _ANSI_ARGS_((Tcl_Channel chan, + Tcl_CloseProc *proc, ClientData clientData)); +/* 103 */ +EXTERN int Tcl_DeleteCommand _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *cmdName)); +/* 104 */ +EXTERN int Tcl_DeleteCommandFromToken _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Command command)); +/* 105 */ +EXTERN void Tcl_DeleteEvents _ANSI_ARGS_(( + Tcl_EventDeleteProc *proc, + ClientData clientData)); +/* 106 */ +EXTERN void Tcl_DeleteEventSource _ANSI_ARGS_(( + Tcl_EventSetupProc *setupProc, + Tcl_EventCheckProc *checkProc, + ClientData clientData)); +/* 107 */ +EXTERN void Tcl_DeleteExitHandler _ANSI_ARGS_(( + Tcl_ExitProc *proc, ClientData clientData)); +/* 108 */ +EXTERN void Tcl_DeleteHashEntry _ANSI_ARGS_(( + Tcl_HashEntry *entryPtr)); +/* 109 */ +EXTERN void Tcl_DeleteHashTable _ANSI_ARGS_(( + Tcl_HashTable *tablePtr)); +/* 110 */ +EXTERN void Tcl_DeleteInterp _ANSI_ARGS_((Tcl_Interp *interp)); +/* 111 */ +EXTERN void Tcl_DetachPids _ANSI_ARGS_((int numPids, + Tcl_Pid *pidPtr)); +/* 112 */ +EXTERN void Tcl_DeleteTimerHandler _ANSI_ARGS_(( + Tcl_TimerToken token)); +/* 113 */ +EXTERN void Tcl_DeleteTrace _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Trace trace)); +/* 114 */ +EXTERN void Tcl_DontCallWhenDeleted _ANSI_ARGS_(( + Tcl_Interp *interp, + Tcl_InterpDeleteProc *proc, + ClientData clientData)); +/* 115 */ +EXTERN int Tcl_DoOneEvent _ANSI_ARGS_((int flags)); +/* 116 */ +EXTERN void Tcl_DoWhenIdle _ANSI_ARGS_((Tcl_IdleProc *proc, + ClientData clientData)); +/* 117 */ +EXTERN char * Tcl_DStringAppend _ANSI_ARGS_((Tcl_DString *dsPtr, + CONST char *bytes, int length)); +/* 118 */ +EXTERN char * Tcl_DStringAppendElement _ANSI_ARGS_(( + Tcl_DString *dsPtr, CONST char *element)); +/* 119 */ +EXTERN void Tcl_DStringEndSublist _ANSI_ARGS_(( + Tcl_DString *dsPtr)); +/* 120 */ +EXTERN void Tcl_DStringFree _ANSI_ARGS_((Tcl_DString *dsPtr)); +/* 121 */ +EXTERN void Tcl_DStringGetResult _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_DString *dsPtr)); +/* 122 */ +EXTERN void Tcl_DStringInit _ANSI_ARGS_((Tcl_DString *dsPtr)); +/* 123 */ +EXTERN void Tcl_DStringResult _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_DString *dsPtr)); +/* 124 */ +EXTERN void Tcl_DStringSetLength _ANSI_ARGS_((Tcl_DString *dsPtr, + int length)); +/* 125 */ +EXTERN void Tcl_DStringStartSublist _ANSI_ARGS_(( + Tcl_DString *dsPtr)); +/* 126 */ +EXTERN int Tcl_Eof _ANSI_ARGS_((Tcl_Channel chan)); +/* 127 */ +EXTERN CONST84_RETURN char * Tcl_ErrnoId _ANSI_ARGS_((void)); +/* 128 */ +EXTERN CONST84_RETURN char * Tcl_ErrnoMsg _ANSI_ARGS_((int err)); +/* 129 */ +EXTERN int Tcl_Eval _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *script)); +/* 130 */ +EXTERN int Tcl_EvalFile _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *fileName)); +/* 131 */ +EXTERN int Tcl_EvalObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr)); +/* 132 */ +EXTERN void Tcl_EventuallyFree _ANSI_ARGS_(( + ClientData clientData, + Tcl_FreeProc *freeProc)); +/* 133 */ +EXTERN void Tcl_Exit _ANSI_ARGS_((int status)); +/* 134 */ +EXTERN int Tcl_ExposeCommand _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *hiddenCmdToken, + CONST char *cmdName)); +/* 135 */ +EXTERN int Tcl_ExprBoolean _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *expr, int *ptr)); +/* 136 */ +EXTERN int Tcl_ExprBooleanObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, int *ptr)); +/* 137 */ +EXTERN int Tcl_ExprDouble _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *expr, double *ptr)); +/* 138 */ +EXTERN int Tcl_ExprDoubleObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, double *ptr)); +/* 139 */ +EXTERN int Tcl_ExprLong _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *expr, long *ptr)); +/* 140 */ +EXTERN int Tcl_ExprLongObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, long *ptr)); +/* 141 */ +EXTERN int Tcl_ExprObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, Tcl_Obj **resultPtrPtr)); +/* 142 */ +EXTERN int Tcl_ExprString _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *expr)); +/* 143 */ +EXTERN void Tcl_Finalize _ANSI_ARGS_((void)); +/* 144 */ +EXTERN void Tcl_FindExecutable _ANSI_ARGS_((CONST char *argv0)); +/* 145 */ +EXTERN Tcl_HashEntry * Tcl_FirstHashEntry _ANSI_ARGS_(( + Tcl_HashTable *tablePtr, + Tcl_HashSearch *searchPtr)); +/* 146 */ +EXTERN int Tcl_Flush _ANSI_ARGS_((Tcl_Channel chan)); +/* 147 */ +EXTERN void Tcl_FreeResult _ANSI_ARGS_((Tcl_Interp *interp)); +/* 148 */ +EXTERN int Tcl_GetAlias _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *slaveCmd, + Tcl_Interp **targetInterpPtr, + CONST84 char **targetCmdPtr, int *argcPtr, + CONST84 char ***argvPtr)); +/* 149 */ +EXTERN int Tcl_GetAliasObj _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *slaveCmd, + Tcl_Interp **targetInterpPtr, + CONST84 char **targetCmdPtr, int *objcPtr, + Tcl_Obj ***objv)); +/* 150 */ +EXTERN ClientData Tcl_GetAssocData _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name, + Tcl_InterpDeleteProc **procPtr)); +/* 151 */ +EXTERN Tcl_Channel Tcl_GetChannel _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *chanName, int *modePtr)); +/* 152 */ +EXTERN int Tcl_GetChannelBufferSize _ANSI_ARGS_(( + Tcl_Channel chan)); +/* 153 */ +EXTERN int Tcl_GetChannelHandle _ANSI_ARGS_((Tcl_Channel chan, + int direction, ClientData *handlePtr)); +/* 154 */ +EXTERN ClientData Tcl_GetChannelInstanceData _ANSI_ARGS_(( + Tcl_Channel chan)); +/* 155 */ +EXTERN int Tcl_GetChannelMode _ANSI_ARGS_((Tcl_Channel chan)); +/* 156 */ +EXTERN CONST84_RETURN char * Tcl_GetChannelName _ANSI_ARGS_(( + Tcl_Channel chan)); +/* 157 */ +EXTERN int Tcl_GetChannelOption _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Channel chan, CONST char *optionName, + Tcl_DString *dsPtr)); +/* 158 */ +EXTERN Tcl_ChannelType * Tcl_GetChannelType _ANSI_ARGS_((Tcl_Channel chan)); +/* 159 */ +EXTERN int Tcl_GetCommandInfo _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *cmdName, Tcl_CmdInfo *infoPtr)); +/* 160 */ +EXTERN CONST84_RETURN char * Tcl_GetCommandName _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Command command)); +/* 161 */ +EXTERN int Tcl_GetErrno _ANSI_ARGS_((void)); +/* 162 */ +EXTERN CONST84_RETURN char * Tcl_GetHostName _ANSI_ARGS_((void)); +/* 163 */ +EXTERN int Tcl_GetInterpPath _ANSI_ARGS_((Tcl_Interp *askInterp, + Tcl_Interp *slaveInterp)); +/* 164 */ +EXTERN Tcl_Interp * Tcl_GetMaster _ANSI_ARGS_((Tcl_Interp *interp)); +/* 165 */ +EXTERN CONST char * Tcl_GetNameOfExecutable _ANSI_ARGS_((void)); +/* 166 */ +EXTERN Tcl_Obj * Tcl_GetObjResult _ANSI_ARGS_((Tcl_Interp *interp)); +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ +/* 167 */ +EXTERN int Tcl_GetOpenFile _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *chanID, int forWriting, + int checkUsage, ClientData *filePtr)); +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +/* 167 */ +EXTERN int Tcl_GetOpenFile _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *chanID, int forWriting, + int checkUsage, ClientData *filePtr)); +#endif /* MACOSX */ +/* 168 */ +EXTERN Tcl_PathType Tcl_GetPathType _ANSI_ARGS_((CONST char *path)); +/* 169 */ +EXTERN int Tcl_Gets _ANSI_ARGS_((Tcl_Channel chan, + Tcl_DString *dsPtr)); +/* 170 */ +EXTERN int Tcl_GetsObj _ANSI_ARGS_((Tcl_Channel chan, + Tcl_Obj *objPtr)); +/* 171 */ +EXTERN int Tcl_GetServiceMode _ANSI_ARGS_((void)); +/* 172 */ +EXTERN Tcl_Interp * Tcl_GetSlave _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *slaveName)); +/* 173 */ +EXTERN Tcl_Channel Tcl_GetStdChannel _ANSI_ARGS_((int type)); +/* 174 */ +EXTERN CONST84_RETURN char * Tcl_GetStringResult _ANSI_ARGS_(( + Tcl_Interp *interp)); +/* 175 */ +EXTERN CONST84_RETURN char * Tcl_GetVar _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *varName, int flags)); +/* 176 */ +EXTERN CONST84_RETURN char * Tcl_GetVar2 _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *part1, CONST char *part2, + int flags)); +/* 177 */ +EXTERN int Tcl_GlobalEval _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *command)); +/* 178 */ +EXTERN int Tcl_GlobalEvalObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr)); +/* 179 */ +EXTERN int Tcl_HideCommand _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *cmdName, + CONST char *hiddenCmdToken)); +/* 180 */ +EXTERN int Tcl_Init _ANSI_ARGS_((Tcl_Interp *interp)); +/* 181 */ +EXTERN void Tcl_InitHashTable _ANSI_ARGS_(( + Tcl_HashTable *tablePtr, int keyType)); +/* 182 */ +EXTERN int Tcl_InputBlocked _ANSI_ARGS_((Tcl_Channel chan)); +/* 183 */ +EXTERN int Tcl_InputBuffered _ANSI_ARGS_((Tcl_Channel chan)); +/* 184 */ +EXTERN int Tcl_InterpDeleted _ANSI_ARGS_((Tcl_Interp *interp)); +/* 185 */ +EXTERN int Tcl_IsSafe _ANSI_ARGS_((Tcl_Interp *interp)); +/* 186 */ +EXTERN char * Tcl_JoinPath _ANSI_ARGS_((int argc, + CONST84 char *CONST *argv, + Tcl_DString *resultPtr)); +/* 187 */ +EXTERN int Tcl_LinkVar _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *varName, char *addr, int type)); +/* Slot 188 is reserved */ +/* 189 */ +EXTERN Tcl_Channel Tcl_MakeFileChannel _ANSI_ARGS_((ClientData handle, + int mode)); +/* 190 */ +EXTERN int Tcl_MakeSafe _ANSI_ARGS_((Tcl_Interp *interp)); +/* 191 */ +EXTERN Tcl_Channel Tcl_MakeTcpClientChannel _ANSI_ARGS_(( + ClientData tcpSocket)); +/* 192 */ +EXTERN char * Tcl_Merge _ANSI_ARGS_((int argc, + CONST84 char *CONST *argv)); +/* 193 */ +EXTERN Tcl_HashEntry * Tcl_NextHashEntry _ANSI_ARGS_(( + Tcl_HashSearch *searchPtr)); +/* 194 */ +EXTERN void Tcl_NotifyChannel _ANSI_ARGS_((Tcl_Channel channel, + int mask)); +/* 195 */ +EXTERN Tcl_Obj * Tcl_ObjGetVar2 _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, + int flags)); +/* 196 */ +EXTERN Tcl_Obj * Tcl_ObjSetVar2 _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, + Tcl_Obj *newValuePtr, int flags)); +/* 197 */ +EXTERN Tcl_Channel Tcl_OpenCommandChannel _ANSI_ARGS_(( + Tcl_Interp *interp, int argc, + CONST84 char **argv, int flags)); +/* 198 */ +EXTERN Tcl_Channel Tcl_OpenFileChannel _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *fileName, CONST char *modeString, + int permissions)); +/* 199 */ +EXTERN Tcl_Channel Tcl_OpenTcpClient _ANSI_ARGS_((Tcl_Interp *interp, + int port, CONST char *address, + CONST char *myaddr, int myport, int async)); +/* 200 */ +EXTERN Tcl_Channel Tcl_OpenTcpServer _ANSI_ARGS_((Tcl_Interp *interp, + int port, CONST char *host, + Tcl_TcpAcceptProc *acceptProc, + ClientData callbackData)); +/* 201 */ +EXTERN void Tcl_Preserve _ANSI_ARGS_((ClientData data)); +/* 202 */ +EXTERN void Tcl_PrintDouble _ANSI_ARGS_((Tcl_Interp *interp, + double value, char *dst)); +/* 203 */ +EXTERN int Tcl_PutEnv _ANSI_ARGS_((CONST char *assignment)); +/* 204 */ +EXTERN CONST84_RETURN char * Tcl_PosixError _ANSI_ARGS_((Tcl_Interp *interp)); +/* 205 */ +EXTERN void Tcl_QueueEvent _ANSI_ARGS_((Tcl_Event *evPtr, + Tcl_QueuePosition position)); +/* 206 */ +EXTERN int Tcl_Read _ANSI_ARGS_((Tcl_Channel chan, char *bufPtr, + int toRead)); +/* 207 */ +EXTERN void Tcl_ReapDetachedProcs _ANSI_ARGS_((void)); +/* 208 */ +EXTERN int Tcl_RecordAndEval _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *cmd, int flags)); +/* 209 */ +EXTERN int Tcl_RecordAndEvalObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *cmdPtr, int flags)); +/* 210 */ +EXTERN void Tcl_RegisterChannel _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Channel chan)); +/* 211 */ +EXTERN void Tcl_RegisterObjType _ANSI_ARGS_(( + Tcl_ObjType *typePtr)); +/* 212 */ +EXTERN Tcl_RegExp Tcl_RegExpCompile _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *pattern)); +/* 213 */ +EXTERN int Tcl_RegExpExec _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_RegExp regexp, CONST char *text, + CONST char *start)); +/* 214 */ +EXTERN int Tcl_RegExpMatch _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *text, CONST char *pattern)); +/* 215 */ +EXTERN void Tcl_RegExpRange _ANSI_ARGS_((Tcl_RegExp regexp, + int index, CONST84 char **startPtr, + CONST84 char **endPtr)); +/* 216 */ +EXTERN void Tcl_Release _ANSI_ARGS_((ClientData clientData)); +/* 217 */ +EXTERN void Tcl_ResetResult _ANSI_ARGS_((Tcl_Interp *interp)); +/* 218 */ +EXTERN int Tcl_ScanElement _ANSI_ARGS_((CONST char *src, + int *flagPtr)); +/* 219 */ +EXTERN int Tcl_ScanCountedElement _ANSI_ARGS_((CONST char *src, + int length, int *flagPtr)); +/* 220 */ +EXTERN int Tcl_SeekOld _ANSI_ARGS_((Tcl_Channel chan, + int offset, int mode)); +/* 221 */ +EXTERN int Tcl_ServiceAll _ANSI_ARGS_((void)); +/* 222 */ +EXTERN int Tcl_ServiceEvent _ANSI_ARGS_((int flags)); +/* 223 */ +EXTERN void Tcl_SetAssocData _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name, Tcl_InterpDeleteProc *proc, + ClientData clientData)); +/* 224 */ +EXTERN void Tcl_SetChannelBufferSize _ANSI_ARGS_(( + Tcl_Channel chan, int sz)); +/* 225 */ +EXTERN int Tcl_SetChannelOption _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Channel chan, CONST char *optionName, + CONST char *newValue)); +/* 226 */ +EXTERN int Tcl_SetCommandInfo _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *cmdName, + CONST Tcl_CmdInfo *infoPtr)); +/* 227 */ +EXTERN void Tcl_SetErrno _ANSI_ARGS_((int err)); +/* 228 */ +EXTERN void Tcl_SetErrorCode _ANSI_ARGS_(TCL_VARARGS(Tcl_Interp *,interp)); +/* 229 */ +EXTERN void Tcl_SetMaxBlockTime _ANSI_ARGS_((Tcl_Time *timePtr)); +/* 230 */ +EXTERN void Tcl_SetPanicProc _ANSI_ARGS_(( + Tcl_PanicProc *panicProc)); +/* 231 */ +EXTERN int Tcl_SetRecursionLimit _ANSI_ARGS_(( + Tcl_Interp *interp, int depth)); +/* 232 */ +EXTERN void Tcl_SetResult _ANSI_ARGS_((Tcl_Interp *interp, + char *result, Tcl_FreeProc *freeProc)); +/* 233 */ +EXTERN int Tcl_SetServiceMode _ANSI_ARGS_((int mode)); +/* 234 */ +EXTERN void Tcl_SetObjErrorCode _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *errorObjPtr)); +/* 235 */ +EXTERN void Tcl_SetObjResult _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *resultObjPtr)); +/* 236 */ +EXTERN void Tcl_SetStdChannel _ANSI_ARGS_((Tcl_Channel channel, + int type)); +/* 237 */ +EXTERN CONST84_RETURN char * Tcl_SetVar _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *varName, CONST char *newValue, + int flags)); +/* 238 */ +EXTERN CONST84_RETURN char * Tcl_SetVar2 _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *part1, CONST char *part2, + CONST char *newValue, int flags)); +/* 239 */ +EXTERN CONST84_RETURN char * Tcl_SignalId _ANSI_ARGS_((int sig)); +/* 240 */ +EXTERN CONST84_RETURN char * Tcl_SignalMsg _ANSI_ARGS_((int sig)); +/* 241 */ +EXTERN void Tcl_SourceRCFile _ANSI_ARGS_((Tcl_Interp *interp)); +/* 242 */ +EXTERN int Tcl_SplitList _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *listStr, int *argcPtr, + CONST84 char ***argvPtr)); +/* 243 */ +EXTERN void Tcl_SplitPath _ANSI_ARGS_((CONST char *path, + int *argcPtr, CONST84 char ***argvPtr)); +/* 244 */ +EXTERN void Tcl_StaticPackage _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *pkgName, + Tcl_PackageInitProc *initProc, + Tcl_PackageInitProc *safeInitProc)); +/* 245 */ +EXTERN int Tcl_StringMatch _ANSI_ARGS_((CONST char *str, + CONST char *pattern)); +/* 246 */ +EXTERN int Tcl_TellOld _ANSI_ARGS_((Tcl_Channel chan)); +/* 247 */ +EXTERN int Tcl_TraceVar _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *varName, int flags, + Tcl_VarTraceProc *proc, + ClientData clientData)); +/* 248 */ +EXTERN int Tcl_TraceVar2 _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *part1, CONST char *part2, + int flags, Tcl_VarTraceProc *proc, + ClientData clientData)); +/* 249 */ +EXTERN char * Tcl_TranslateFileName _ANSI_ARGS_(( + Tcl_Interp *interp, CONST char *name, + Tcl_DString *bufferPtr)); +/* 250 */ +EXTERN int Tcl_Ungets _ANSI_ARGS_((Tcl_Channel chan, + CONST char *str, int len, int atHead)); +/* 251 */ +EXTERN void Tcl_UnlinkVar _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *varName)); +/* 252 */ +EXTERN int Tcl_UnregisterChannel _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Channel chan)); +/* 253 */ +EXTERN int Tcl_UnsetVar _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *varName, int flags)); +/* 254 */ +EXTERN int Tcl_UnsetVar2 _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *part1, CONST char *part2, + int flags)); +/* 255 */ +EXTERN void Tcl_UntraceVar _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *varName, int flags, + Tcl_VarTraceProc *proc, + ClientData clientData)); +/* 256 */ +EXTERN void Tcl_UntraceVar2 _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *part1, CONST char *part2, + int flags, Tcl_VarTraceProc *proc, + ClientData clientData)); +/* 257 */ +EXTERN void Tcl_UpdateLinkedVar _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *varName)); +/* 258 */ +EXTERN int Tcl_UpVar _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *frameName, CONST char *varName, + CONST char *localName, int flags)); +/* 259 */ +EXTERN int Tcl_UpVar2 _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *frameName, CONST char *part1, + CONST char *part2, CONST char *localName, + int flags)); +/* 260 */ +EXTERN int Tcl_VarEval _ANSI_ARGS_(TCL_VARARGS(Tcl_Interp *,interp)); +/* 261 */ +EXTERN ClientData Tcl_VarTraceInfo _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *varName, int flags, + Tcl_VarTraceProc *procPtr, + ClientData prevClientData)); +/* 262 */ +EXTERN ClientData Tcl_VarTraceInfo2 _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *part1, CONST char *part2, + int flags, Tcl_VarTraceProc *procPtr, + ClientData prevClientData)); +/* 263 */ +EXTERN int Tcl_Write _ANSI_ARGS_((Tcl_Channel chan, + CONST char *s, int slen)); +/* 264 */ +EXTERN void Tcl_WrongNumArgs _ANSI_ARGS_((Tcl_Interp *interp, + int objc, Tcl_Obj *CONST objv[], + CONST char *message)); +/* 265 */ +EXTERN int Tcl_DumpActiveMemory _ANSI_ARGS_(( + CONST char *fileName)); +/* 266 */ +EXTERN void Tcl_ValidateAllMemory _ANSI_ARGS_((CONST char *file, + int line)); +/* 267 */ +EXTERN void Tcl_AppendResultVA _ANSI_ARGS_((Tcl_Interp *interp, + va_list argList)); +/* 268 */ +EXTERN void Tcl_AppendStringsToObjVA _ANSI_ARGS_(( + Tcl_Obj *objPtr, va_list argList)); +/* 269 */ +EXTERN char * Tcl_HashStats _ANSI_ARGS_((Tcl_HashTable *tablePtr)); +/* 270 */ +EXTERN CONST84_RETURN char * Tcl_ParseVar _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *start, CONST84 char **termPtr)); +/* 271 */ +EXTERN CONST84_RETURN char * Tcl_PkgPresent _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name, CONST char *version, + int exact)); +/* 272 */ +EXTERN CONST84_RETURN char * Tcl_PkgPresentEx _ANSI_ARGS_(( + Tcl_Interp *interp, CONST char *name, + CONST char *version, int exact, + ClientData *clientDataPtr)); +/* 273 */ +EXTERN int Tcl_PkgProvide _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name, CONST char *version)); +/* 274 */ +EXTERN CONST84_RETURN char * Tcl_PkgRequire _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name, CONST char *version, + int exact)); +/* 275 */ +EXTERN void Tcl_SetErrorCodeVA _ANSI_ARGS_((Tcl_Interp *interp, + va_list argList)); +/* 276 */ +EXTERN int Tcl_VarEvalVA _ANSI_ARGS_((Tcl_Interp *interp, + va_list argList)); +/* 277 */ +EXTERN Tcl_Pid Tcl_WaitPid _ANSI_ARGS_((Tcl_Pid pid, int *statPtr, + int options)); +/* 278 */ +EXTERN void Tcl_PanicVA _ANSI_ARGS_((CONST char *format, + va_list argList)); +/* 279 */ +EXTERN void Tcl_GetVersion _ANSI_ARGS_((int *major, int *minor, + int *patchLevel, int *type)); +/* 280 */ +EXTERN void Tcl_InitMemory _ANSI_ARGS_((Tcl_Interp *interp)); +/* 281 */ +EXTERN Tcl_Channel Tcl_StackChannel _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_ChannelType *typePtr, + ClientData instanceData, int mask, + Tcl_Channel prevChan)); +/* 282 */ +EXTERN int Tcl_UnstackChannel _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Channel chan)); +/* 283 */ +EXTERN Tcl_Channel Tcl_GetStackedChannel _ANSI_ARGS_((Tcl_Channel chan)); +/* 284 */ +EXTERN void Tcl_SetMainLoop _ANSI_ARGS_((Tcl_MainLoopProc *proc)); +/* Slot 285 is reserved */ +/* 286 */ +EXTERN void Tcl_AppendObjToObj _ANSI_ARGS_((Tcl_Obj *objPtr, + Tcl_Obj *appendObjPtr)); +/* 287 */ +EXTERN Tcl_Encoding Tcl_CreateEncoding _ANSI_ARGS_(( + Tcl_EncodingType *typePtr)); +/* 288 */ +EXTERN void Tcl_CreateThreadExitHandler _ANSI_ARGS_(( + Tcl_ExitProc *proc, ClientData clientData)); +/* 289 */ +EXTERN void Tcl_DeleteThreadExitHandler _ANSI_ARGS_(( + Tcl_ExitProc *proc, ClientData clientData)); +/* 290 */ +EXTERN void Tcl_DiscardResult _ANSI_ARGS_(( + Tcl_SavedResult *statePtr)); +/* 291 */ +EXTERN int Tcl_EvalEx _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *script, int numBytes, int flags)); +/* 292 */ +EXTERN int Tcl_EvalObjv _ANSI_ARGS_((Tcl_Interp *interp, + int objc, Tcl_Obj *CONST objv[], int flags)); +/* 293 */ +EXTERN int Tcl_EvalObjEx _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, int flags)); +/* 294 */ +EXTERN void Tcl_ExitThread _ANSI_ARGS_((int status)); +/* 295 */ +EXTERN int Tcl_ExternalToUtf _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Encoding encoding, CONST char *src, + int srcLen, int flags, + Tcl_EncodingState *statePtr, char *dst, + int dstLen, int *srcReadPtr, + int *dstWrotePtr, int *dstCharsPtr)); +/* 296 */ +EXTERN char * Tcl_ExternalToUtfDString _ANSI_ARGS_(( + Tcl_Encoding encoding, CONST char *src, + int srcLen, Tcl_DString *dsPtr)); +/* 297 */ +EXTERN void Tcl_FinalizeThread _ANSI_ARGS_((void)); +/* 298 */ +EXTERN void Tcl_FinalizeNotifier _ANSI_ARGS_(( + ClientData clientData)); +/* 299 */ +EXTERN void Tcl_FreeEncoding _ANSI_ARGS_((Tcl_Encoding encoding)); +/* 300 */ +EXTERN Tcl_ThreadId Tcl_GetCurrentThread _ANSI_ARGS_((void)); +/* 301 */ +EXTERN Tcl_Encoding Tcl_GetEncoding _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name)); +/* 302 */ +EXTERN CONST84_RETURN char * Tcl_GetEncodingName _ANSI_ARGS_(( + Tcl_Encoding encoding)); +/* 303 */ +EXTERN void Tcl_GetEncodingNames _ANSI_ARGS_((Tcl_Interp *interp)); +/* 304 */ +EXTERN int Tcl_GetIndexFromObjStruct _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *objPtr, + CONST VOID *tablePtr, int offset, + CONST char *msg, int flags, int *indexPtr)); +/* 305 */ +EXTERN VOID * Tcl_GetThreadData _ANSI_ARGS_(( + Tcl_ThreadDataKey *keyPtr, int size)); +/* 306 */ +EXTERN Tcl_Obj * Tcl_GetVar2Ex _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *part1, CONST char *part2, + int flags)); +/* 307 */ +EXTERN ClientData Tcl_InitNotifier _ANSI_ARGS_((void)); +/* 308 */ +EXTERN void Tcl_MutexLock _ANSI_ARGS_((Tcl_Mutex *mutexPtr)); +/* 309 */ +EXTERN void Tcl_MutexUnlock _ANSI_ARGS_((Tcl_Mutex *mutexPtr)); +/* 310 */ +EXTERN void Tcl_ConditionNotify _ANSI_ARGS_(( + Tcl_Condition *condPtr)); +/* 311 */ +EXTERN void Tcl_ConditionWait _ANSI_ARGS_(( + Tcl_Condition *condPtr, Tcl_Mutex *mutexPtr, + Tcl_Time *timePtr)); +/* 312 */ +EXTERN int Tcl_NumUtfChars _ANSI_ARGS_((CONST char *src, + int length)); +/* 313 */ +EXTERN int Tcl_ReadChars _ANSI_ARGS_((Tcl_Channel channel, + Tcl_Obj *objPtr, int charsToRead, + int appendFlag)); +/* 314 */ +EXTERN void Tcl_RestoreResult _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_SavedResult *statePtr)); +/* 315 */ +EXTERN void Tcl_SaveResult _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_SavedResult *statePtr)); +/* 316 */ +EXTERN int Tcl_SetSystemEncoding _ANSI_ARGS_(( + Tcl_Interp *interp, CONST char *name)); +/* 317 */ +EXTERN Tcl_Obj * Tcl_SetVar2Ex _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *part1, CONST char *part2, + Tcl_Obj *newValuePtr, int flags)); +/* 318 */ +EXTERN void Tcl_ThreadAlert _ANSI_ARGS_((Tcl_ThreadId threadId)); +/* 319 */ +EXTERN void Tcl_ThreadQueueEvent _ANSI_ARGS_(( + Tcl_ThreadId threadId, Tcl_Event *evPtr, + Tcl_QueuePosition position)); +/* 320 */ +EXTERN Tcl_UniChar Tcl_UniCharAtIndex _ANSI_ARGS_((CONST char *src, + int index)); +/* 321 */ +EXTERN Tcl_UniChar Tcl_UniCharToLower _ANSI_ARGS_((int ch)); +/* 322 */ +EXTERN Tcl_UniChar Tcl_UniCharToTitle _ANSI_ARGS_((int ch)); +/* 323 */ +EXTERN Tcl_UniChar Tcl_UniCharToUpper _ANSI_ARGS_((int ch)); +/* 324 */ +EXTERN int Tcl_UniCharToUtf _ANSI_ARGS_((int ch, char *buf)); +/* 325 */ +EXTERN CONST84_RETURN char * Tcl_UtfAtIndex _ANSI_ARGS_((CONST char *src, + int index)); +/* 326 */ +EXTERN int Tcl_UtfCharComplete _ANSI_ARGS_((CONST char *src, + int length)); +/* 327 */ +EXTERN int Tcl_UtfBackslash _ANSI_ARGS_((CONST char *src, + int *readPtr, char *dst)); +/* 328 */ +EXTERN CONST84_RETURN char * Tcl_UtfFindFirst _ANSI_ARGS_((CONST char *src, + int ch)); +/* 329 */ +EXTERN CONST84_RETURN char * Tcl_UtfFindLast _ANSI_ARGS_((CONST char *src, + int ch)); +/* 330 */ +EXTERN CONST84_RETURN char * Tcl_UtfNext _ANSI_ARGS_((CONST char *src)); +/* 331 */ +EXTERN CONST84_RETURN char * Tcl_UtfPrev _ANSI_ARGS_((CONST char *src, + CONST char *start)); +/* 332 */ +EXTERN int Tcl_UtfToExternal _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Encoding encoding, CONST char *src, + int srcLen, int flags, + Tcl_EncodingState *statePtr, char *dst, + int dstLen, int *srcReadPtr, + int *dstWrotePtr, int *dstCharsPtr)); +/* 333 */ +EXTERN char * Tcl_UtfToExternalDString _ANSI_ARGS_(( + Tcl_Encoding encoding, CONST char *src, + int srcLen, Tcl_DString *dsPtr)); +/* 334 */ +EXTERN int Tcl_UtfToLower _ANSI_ARGS_((char *src)); +/* 335 */ +EXTERN int Tcl_UtfToTitle _ANSI_ARGS_((char *src)); +/* 336 */ +EXTERN int Tcl_UtfToUniChar _ANSI_ARGS_((CONST char *src, + Tcl_UniChar *chPtr)); +/* 337 */ +EXTERN int Tcl_UtfToUpper _ANSI_ARGS_((char *src)); +/* 338 */ +EXTERN int Tcl_WriteChars _ANSI_ARGS_((Tcl_Channel chan, + CONST char *src, int srcLen)); +/* 339 */ +EXTERN int Tcl_WriteObj _ANSI_ARGS_((Tcl_Channel chan, + Tcl_Obj *objPtr)); +/* 340 */ +EXTERN char * Tcl_GetString _ANSI_ARGS_((Tcl_Obj *objPtr)); +/* 341 */ +EXTERN CONST84_RETURN char * Tcl_GetDefaultEncodingDir _ANSI_ARGS_((void)); +/* 342 */ +EXTERN void Tcl_SetDefaultEncodingDir _ANSI_ARGS_(( + CONST char *path)); +/* 343 */ +EXTERN void Tcl_AlertNotifier _ANSI_ARGS_((ClientData clientData)); +/* 344 */ +EXTERN void Tcl_ServiceModeHook _ANSI_ARGS_((int mode)); +/* 345 */ +EXTERN int Tcl_UniCharIsAlnum _ANSI_ARGS_((int ch)); +/* 346 */ +EXTERN int Tcl_UniCharIsAlpha _ANSI_ARGS_((int ch)); +/* 347 */ +EXTERN int Tcl_UniCharIsDigit _ANSI_ARGS_((int ch)); +/* 348 */ +EXTERN int Tcl_UniCharIsLower _ANSI_ARGS_((int ch)); +/* 349 */ +EXTERN int Tcl_UniCharIsSpace _ANSI_ARGS_((int ch)); +/* 350 */ +EXTERN int Tcl_UniCharIsUpper _ANSI_ARGS_((int ch)); +/* 351 */ +EXTERN int Tcl_UniCharIsWordChar _ANSI_ARGS_((int ch)); +/* 352 */ +EXTERN int Tcl_UniCharLen _ANSI_ARGS_(( + CONST Tcl_UniChar *uniStr)); +/* 353 */ +EXTERN int Tcl_UniCharNcmp _ANSI_ARGS_((CONST Tcl_UniChar *ucs, + CONST Tcl_UniChar *uct, + unsigned long numChars)); +/* 354 */ +EXTERN char * Tcl_UniCharToUtfDString _ANSI_ARGS_(( + CONST Tcl_UniChar *uniStr, int uniLength, + Tcl_DString *dsPtr)); +/* 355 */ +EXTERN Tcl_UniChar * Tcl_UtfToUniCharDString _ANSI_ARGS_((CONST char *src, + int length, Tcl_DString *dsPtr)); +/* 356 */ +EXTERN Tcl_RegExp Tcl_GetRegExpFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *patObj, int flags)); +/* 357 */ +EXTERN Tcl_Obj * Tcl_EvalTokens _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Token *tokenPtr, int count)); +/* 358 */ +EXTERN void Tcl_FreeParse _ANSI_ARGS_((Tcl_Parse *parsePtr)); +/* 359 */ +EXTERN void Tcl_LogCommandInfo _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *script, CONST char *command, + int length)); +/* 360 */ +EXTERN int Tcl_ParseBraces _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *start, int numBytes, + Tcl_Parse *parsePtr, int append, + CONST84 char **termPtr)); +/* 361 */ +EXTERN int Tcl_ParseCommand _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *start, int numBytes, int nested, + Tcl_Parse *parsePtr)); +/* 362 */ +EXTERN int Tcl_ParseExpr _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *start, int numBytes, + Tcl_Parse *parsePtr)); +/* 363 */ +EXTERN int Tcl_ParseQuotedString _ANSI_ARGS_(( + Tcl_Interp *interp, CONST char *start, + int numBytes, Tcl_Parse *parsePtr, + int append, CONST84 char **termPtr)); +/* 364 */ +EXTERN int Tcl_ParseVarName _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *start, int numBytes, + Tcl_Parse *parsePtr, int append)); +/* 365 */ +EXTERN char * Tcl_GetCwd _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_DString *cwdPtr)); +/* 366 */ +EXTERN int Tcl_Chdir _ANSI_ARGS_((CONST char *dirName)); +/* 367 */ +EXTERN int Tcl_Access _ANSI_ARGS_((CONST char *path, int mode)); +/* 368 */ +EXTERN int Tcl_Stat _ANSI_ARGS_((CONST char *path, + struct stat *bufPtr)); +/* 369 */ +EXTERN int Tcl_UtfNcmp _ANSI_ARGS_((CONST char *s1, + CONST char *s2, unsigned long n)); +/* 370 */ +EXTERN int Tcl_UtfNcasecmp _ANSI_ARGS_((CONST char *s1, + CONST char *s2, unsigned long n)); +/* 371 */ +EXTERN int Tcl_StringCaseMatch _ANSI_ARGS_((CONST char *str, + CONST char *pattern, int nocase)); +/* 372 */ +EXTERN int Tcl_UniCharIsControl _ANSI_ARGS_((int ch)); +/* 373 */ +EXTERN int Tcl_UniCharIsGraph _ANSI_ARGS_((int ch)); +/* 374 */ +EXTERN int Tcl_UniCharIsPrint _ANSI_ARGS_((int ch)); +/* 375 */ +EXTERN int Tcl_UniCharIsPunct _ANSI_ARGS_((int ch)); +/* 376 */ +EXTERN int Tcl_RegExpExecObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_RegExp regexp, Tcl_Obj *textObj, + int offset, int nmatches, int flags)); +/* 377 */ +EXTERN void Tcl_RegExpGetInfo _ANSI_ARGS_((Tcl_RegExp regexp, + Tcl_RegExpInfo *infoPtr)); +/* 378 */ +EXTERN Tcl_Obj * Tcl_NewUnicodeObj _ANSI_ARGS_(( + CONST Tcl_UniChar *unicode, int numChars)); +/* 379 */ +EXTERN void Tcl_SetUnicodeObj _ANSI_ARGS_((Tcl_Obj *objPtr, + CONST Tcl_UniChar *unicode, int numChars)); +/* 380 */ +EXTERN int Tcl_GetCharLength _ANSI_ARGS_((Tcl_Obj *objPtr)); +/* 381 */ +EXTERN Tcl_UniChar Tcl_GetUniChar _ANSI_ARGS_((Tcl_Obj *objPtr, + int index)); +/* 382 */ +EXTERN Tcl_UniChar * Tcl_GetUnicode _ANSI_ARGS_((Tcl_Obj *objPtr)); +/* 383 */ +EXTERN Tcl_Obj * Tcl_GetRange _ANSI_ARGS_((Tcl_Obj *objPtr, int first, + int last)); +/* 384 */ +EXTERN void Tcl_AppendUnicodeToObj _ANSI_ARGS_((Tcl_Obj *objPtr, + CONST Tcl_UniChar *unicode, int length)); +/* 385 */ +EXTERN int Tcl_RegExpMatchObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *textObj, Tcl_Obj *patternObj)); +/* 386 */ +EXTERN void Tcl_SetNotifier _ANSI_ARGS_(( + Tcl_NotifierProcs *notifierProcPtr)); +/* 387 */ +EXTERN Tcl_Mutex * Tcl_GetAllocMutex _ANSI_ARGS_((void)); +/* 388 */ +EXTERN int Tcl_GetChannelNames _ANSI_ARGS_((Tcl_Interp *interp)); +/* 389 */ +EXTERN int Tcl_GetChannelNamesEx _ANSI_ARGS_(( + Tcl_Interp *interp, CONST char *pattern)); +/* 390 */ +EXTERN int Tcl_ProcObjCmd _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int objc, + Tcl_Obj *CONST objv[])); +/* 391 */ +EXTERN void Tcl_ConditionFinalize _ANSI_ARGS_(( + Tcl_Condition *condPtr)); +/* 392 */ +EXTERN void Tcl_MutexFinalize _ANSI_ARGS_((Tcl_Mutex *mutex)); +/* 393 */ +EXTERN int Tcl_CreateThread _ANSI_ARGS_((Tcl_ThreadId *idPtr, + Tcl_ThreadCreateProc proc, + ClientData clientData, int stackSize, + int flags)); +/* 394 */ +EXTERN int Tcl_ReadRaw _ANSI_ARGS_((Tcl_Channel chan, char *dst, + int bytesToRead)); +/* 395 */ +EXTERN int Tcl_WriteRaw _ANSI_ARGS_((Tcl_Channel chan, + CONST char *src, int srcLen)); +/* 396 */ +EXTERN Tcl_Channel Tcl_GetTopChannel _ANSI_ARGS_((Tcl_Channel chan)); +/* 397 */ +EXTERN int Tcl_ChannelBuffered _ANSI_ARGS_((Tcl_Channel chan)); +/* 398 */ +EXTERN CONST84_RETURN char * Tcl_ChannelName _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 399 */ +EXTERN Tcl_ChannelTypeVersion Tcl_ChannelVersion _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 400 */ +EXTERN Tcl_DriverBlockModeProc * Tcl_ChannelBlockModeProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 401 */ +EXTERN Tcl_DriverCloseProc * Tcl_ChannelCloseProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 402 */ +EXTERN Tcl_DriverClose2Proc * Tcl_ChannelClose2Proc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 403 */ +EXTERN Tcl_DriverInputProc * Tcl_ChannelInputProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 404 */ +EXTERN Tcl_DriverOutputProc * Tcl_ChannelOutputProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 405 */ +EXTERN Tcl_DriverSeekProc * Tcl_ChannelSeekProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 406 */ +EXTERN Tcl_DriverSetOptionProc * Tcl_ChannelSetOptionProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 407 */ +EXTERN Tcl_DriverGetOptionProc * Tcl_ChannelGetOptionProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 408 */ +EXTERN Tcl_DriverWatchProc * Tcl_ChannelWatchProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 409 */ +EXTERN Tcl_DriverGetHandleProc * Tcl_ChannelGetHandleProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 410 */ +EXTERN Tcl_DriverFlushProc * Tcl_ChannelFlushProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 411 */ +EXTERN Tcl_DriverHandlerProc * Tcl_ChannelHandlerProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* 412 */ +EXTERN int Tcl_JoinThread _ANSI_ARGS_((Tcl_ThreadId threadId, + int *result)); +/* 413 */ +EXTERN int Tcl_IsChannelShared _ANSI_ARGS_((Tcl_Channel channel)); +/* 414 */ +EXTERN int Tcl_IsChannelRegistered _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Channel channel)); +/* 415 */ +EXTERN void Tcl_CutChannel _ANSI_ARGS_((Tcl_Channel channel)); +/* 416 */ +EXTERN void Tcl_SpliceChannel _ANSI_ARGS_((Tcl_Channel channel)); +/* 417 */ +EXTERN void Tcl_ClearChannelHandlers _ANSI_ARGS_(( + Tcl_Channel channel)); +/* 418 */ +EXTERN int Tcl_IsChannelExisting _ANSI_ARGS_(( + CONST char *channelName)); +/* 419 */ +EXTERN int Tcl_UniCharNcasecmp _ANSI_ARGS_(( + CONST Tcl_UniChar *ucs, + CONST Tcl_UniChar *uct, + unsigned long numChars)); +/* 420 */ +EXTERN int Tcl_UniCharCaseMatch _ANSI_ARGS_(( + CONST Tcl_UniChar *uniStr, + CONST Tcl_UniChar *uniPattern, int nocase)); +/* 421 */ +EXTERN Tcl_HashEntry * Tcl_FindHashEntry _ANSI_ARGS_(( + Tcl_HashTable *tablePtr, CONST char *key)); +/* 422 */ +EXTERN Tcl_HashEntry * Tcl_CreateHashEntry _ANSI_ARGS_(( + Tcl_HashTable *tablePtr, CONST char *key, + int *newPtr)); +/* 423 */ +EXTERN void Tcl_InitCustomHashTable _ANSI_ARGS_(( + Tcl_HashTable *tablePtr, int keyType, + Tcl_HashKeyType *typePtr)); +/* 424 */ +EXTERN void Tcl_InitObjHashTable _ANSI_ARGS_(( + Tcl_HashTable *tablePtr)); +/* 425 */ +EXTERN ClientData Tcl_CommandTraceInfo _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *varName, int flags, + Tcl_CommandTraceProc *procPtr, + ClientData prevClientData)); +/* 426 */ +EXTERN int Tcl_TraceCommand _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *varName, int flags, + Tcl_CommandTraceProc *proc, + ClientData clientData)); +/* 427 */ +EXTERN void Tcl_UntraceCommand _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *varName, int flags, + Tcl_CommandTraceProc *proc, + ClientData clientData)); +/* 428 */ +EXTERN char * Tcl_AttemptAlloc _ANSI_ARGS_((unsigned int size)); +/* 429 */ +EXTERN char * Tcl_AttemptDbCkalloc _ANSI_ARGS_((unsigned int size, + CONST char *file, int line)); +/* 430 */ +EXTERN char * Tcl_AttemptRealloc _ANSI_ARGS_((char *ptr, + unsigned int size)); +/* 431 */ +EXTERN char * Tcl_AttemptDbCkrealloc _ANSI_ARGS_((char *ptr, + unsigned int size, CONST char *file, + int line)); +/* 432 */ +EXTERN int Tcl_AttemptSetObjLength _ANSI_ARGS_((Tcl_Obj *objPtr, + int length)); +/* 433 */ +EXTERN Tcl_ThreadId Tcl_GetChannelThread _ANSI_ARGS_(( + Tcl_Channel channel)); +/* 434 */ +EXTERN Tcl_UniChar * Tcl_GetUnicodeFromObj _ANSI_ARGS_((Tcl_Obj *objPtr, + int *lengthPtr)); +/* 435 */ +EXTERN int Tcl_GetMathFuncInfo _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name, int *numArgsPtr, + Tcl_ValueType **argTypesPtr, + Tcl_MathProc **procPtr, + ClientData *clientDataPtr)); +/* 436 */ +EXTERN Tcl_Obj * Tcl_ListMathFuncs _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *pattern)); +/* 437 */ +EXTERN Tcl_Obj * Tcl_SubstObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, int flags)); +/* 438 */ +EXTERN int Tcl_DetachChannel _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Channel channel)); +/* 439 */ +EXTERN int Tcl_IsStandardChannel _ANSI_ARGS_(( + Tcl_Channel channel)); +/* 440 */ +EXTERN int Tcl_FSCopyFile _ANSI_ARGS_((Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr)); +/* 441 */ +EXTERN int Tcl_FSCopyDirectory _ANSI_ARGS_((Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr, Tcl_Obj **errorPtr)); +/* 442 */ +EXTERN int Tcl_FSCreateDirectory _ANSI_ARGS_((Tcl_Obj *pathPtr)); +/* 443 */ +EXTERN int Tcl_FSDeleteFile _ANSI_ARGS_((Tcl_Obj *pathPtr)); +/* 444 */ +EXTERN int Tcl_FSLoadFile _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *pathPtr, CONST char *sym1, + CONST char *sym2, + Tcl_PackageInitProc **proc1Ptr, + Tcl_PackageInitProc **proc2Ptr, + Tcl_LoadHandle *handlePtr, + Tcl_FSUnloadFileProc **unloadProcPtr)); +/* 445 */ +EXTERN int Tcl_FSMatchInDirectory _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *result, + Tcl_Obj *pathPtr, CONST char *pattern, + Tcl_GlobTypeData *types)); +/* 446 */ +EXTERN Tcl_Obj * Tcl_FSLink _ANSI_ARGS_((Tcl_Obj *pathPtr, + Tcl_Obj *toPtr, int linkAction)); +/* 447 */ +EXTERN int Tcl_FSRemoveDirectory _ANSI_ARGS_((Tcl_Obj *pathPtr, + int recursive, Tcl_Obj **errorPtr)); +/* 448 */ +EXTERN int Tcl_FSRenameFile _ANSI_ARGS_((Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr)); +/* 449 */ +EXTERN int Tcl_FSLstat _ANSI_ARGS_((Tcl_Obj *pathPtr, + Tcl_StatBuf *buf)); +/* 450 */ +EXTERN int Tcl_FSUtime _ANSI_ARGS_((Tcl_Obj *pathPtr, + struct utimbuf *tval)); +/* 451 */ +EXTERN int Tcl_FSFileAttrsGet _ANSI_ARGS_((Tcl_Interp *interp, + int index, Tcl_Obj *pathPtr, + Tcl_Obj **objPtrRef)); +/* 452 */ +EXTERN int Tcl_FSFileAttrsSet _ANSI_ARGS_((Tcl_Interp *interp, + int index, Tcl_Obj *pathPtr, Tcl_Obj *objPtr)); +/* 453 */ +EXTERN CONST char ** Tcl_FSFileAttrStrings _ANSI_ARGS_((Tcl_Obj *pathPtr, + Tcl_Obj **objPtrRef)); +/* 454 */ +EXTERN int Tcl_FSStat _ANSI_ARGS_((Tcl_Obj *pathPtr, + Tcl_StatBuf *buf)); +/* 455 */ +EXTERN int Tcl_FSAccess _ANSI_ARGS_((Tcl_Obj *pathPtr, int mode)); +/* 456 */ +EXTERN Tcl_Channel Tcl_FSOpenFileChannel _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *pathPtr, + CONST char *modeString, int permissions)); +/* 457 */ +EXTERN Tcl_Obj * Tcl_FSGetCwd _ANSI_ARGS_((Tcl_Interp *interp)); +/* 458 */ +EXTERN int Tcl_FSChdir _ANSI_ARGS_((Tcl_Obj *pathPtr)); +/* 459 */ +EXTERN int Tcl_FSConvertToPathType _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *pathPtr)); +/* 460 */ +EXTERN Tcl_Obj * Tcl_FSJoinPath _ANSI_ARGS_((Tcl_Obj *listObj, + int elements)); +/* 461 */ +EXTERN Tcl_Obj * Tcl_FSSplitPath _ANSI_ARGS_((Tcl_Obj *pathPtr, + int *lenPtr)); +/* 462 */ +EXTERN int Tcl_FSEqualPaths _ANSI_ARGS_((Tcl_Obj *firstPtr, + Tcl_Obj *secondPtr)); +/* 463 */ +EXTERN Tcl_Obj * Tcl_FSGetNormalizedPath _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *pathPtr)); +/* 464 */ +EXTERN Tcl_Obj * Tcl_FSJoinToPath _ANSI_ARGS_((Tcl_Obj *pathPtr, + int objc, Tcl_Obj *CONST objv[])); +/* 465 */ +EXTERN ClientData Tcl_FSGetInternalRep _ANSI_ARGS_((Tcl_Obj *pathPtr, + Tcl_Filesystem *fsPtr)); +/* 466 */ +EXTERN Tcl_Obj * Tcl_FSGetTranslatedPath _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *pathPtr)); +/* 467 */ +EXTERN int Tcl_FSEvalFile _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *fileName)); +/* 468 */ +EXTERN Tcl_Obj * Tcl_FSNewNativePath _ANSI_ARGS_(( + Tcl_Filesystem *fromFilesystem, + ClientData clientData)); +/* 469 */ +EXTERN CONST char * Tcl_FSGetNativePath _ANSI_ARGS_((Tcl_Obj *pathPtr)); +/* 470 */ +EXTERN Tcl_Obj * Tcl_FSFileSystemInfo _ANSI_ARGS_((Tcl_Obj *pathPtr)); +/* 471 */ +EXTERN Tcl_Obj * Tcl_FSPathSeparator _ANSI_ARGS_((Tcl_Obj *pathPtr)); +/* 472 */ +EXTERN Tcl_Obj * Tcl_FSListVolumes _ANSI_ARGS_((void)); +/* 473 */ +EXTERN int Tcl_FSRegister _ANSI_ARGS_((ClientData clientData, + Tcl_Filesystem *fsPtr)); +/* 474 */ +EXTERN int Tcl_FSUnregister _ANSI_ARGS_((Tcl_Filesystem *fsPtr)); +/* 475 */ +EXTERN ClientData Tcl_FSData _ANSI_ARGS_((Tcl_Filesystem *fsPtr)); +/* 476 */ +EXTERN CONST char * Tcl_FSGetTranslatedStringPath _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *pathPtr)); +/* 477 */ +EXTERN Tcl_Filesystem * Tcl_FSGetFileSystemForPath _ANSI_ARGS_(( + Tcl_Obj *pathPtr)); +/* 478 */ +EXTERN Tcl_PathType Tcl_FSGetPathType _ANSI_ARGS_((Tcl_Obj *pathPtr)); +/* 479 */ +EXTERN int Tcl_OutputBuffered _ANSI_ARGS_((Tcl_Channel chan)); +/* 480 */ +EXTERN void Tcl_FSMountsChanged _ANSI_ARGS_(( + Tcl_Filesystem *fsPtr)); +/* 481 */ +EXTERN int Tcl_EvalTokensStandard _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Token *tokenPtr, + int count)); +/* 482 */ +EXTERN void Tcl_GetTime _ANSI_ARGS_((Tcl_Time *timeBuf)); +/* 483 */ +EXTERN Tcl_Trace Tcl_CreateObjTrace _ANSI_ARGS_((Tcl_Interp *interp, + int level, int flags, + Tcl_CmdObjTraceProc *objProc, + ClientData clientData, + Tcl_CmdObjTraceDeleteProc *delProc)); +/* 484 */ +EXTERN int Tcl_GetCommandInfoFromToken _ANSI_ARGS_(( + Tcl_Command token, Tcl_CmdInfo *infoPtr)); +/* 485 */ +EXTERN int Tcl_SetCommandInfoFromToken _ANSI_ARGS_(( + Tcl_Command token, + CONST Tcl_CmdInfo *infoPtr)); +/* 486 */ +EXTERN Tcl_Obj * Tcl_DbNewWideIntObj _ANSI_ARGS_(( + Tcl_WideInt wideValue, CONST char *file, + int line)); +/* 487 */ +EXTERN int Tcl_GetWideIntFromObj _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *objPtr, + Tcl_WideInt *widePtr)); +/* 488 */ +EXTERN Tcl_Obj * Tcl_NewWideIntObj _ANSI_ARGS_((Tcl_WideInt wideValue)); +/* 489 */ +EXTERN void Tcl_SetWideIntObj _ANSI_ARGS_((Tcl_Obj *objPtr, + Tcl_WideInt wideValue)); +/* 490 */ +EXTERN Tcl_StatBuf * Tcl_AllocStatBuf _ANSI_ARGS_((void)); +/* 491 */ +EXTERN Tcl_WideInt Tcl_Seek _ANSI_ARGS_((Tcl_Channel chan, + Tcl_WideInt offset, int mode)); +/* 492 */ +EXTERN Tcl_WideInt Tcl_Tell _ANSI_ARGS_((Tcl_Channel chan)); +/* 493 */ +EXTERN Tcl_DriverWideSeekProc * Tcl_ChannelWideSeekProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* Slot 494 is reserved */ +/* Slot 495 is reserved */ +/* Slot 496 is reserved */ +/* Slot 497 is reserved */ +/* Slot 498 is reserved */ +/* Slot 499 is reserved */ +/* Slot 500 is reserved */ +/* Slot 501 is reserved */ +/* Slot 502 is reserved */ +/* Slot 503 is reserved */ +/* Slot 504 is reserved */ +/* Slot 505 is reserved */ +/* Slot 506 is reserved */ +/* Slot 507 is reserved */ +/* Slot 508 is reserved */ +/* Slot 509 is reserved */ +/* Slot 510 is reserved */ +/* Slot 511 is reserved */ +/* Slot 512 is reserved */ +/* Slot 513 is reserved */ +/* Slot 514 is reserved */ +/* Slot 515 is reserved */ +/* Slot 516 is reserved */ +/* Slot 517 is reserved */ +/* Slot 518 is reserved */ +/* Slot 519 is reserved */ +/* Slot 520 is reserved */ +/* Slot 521 is reserved */ +/* Slot 522 is reserved */ +/* Slot 523 is reserved */ +/* Slot 524 is reserved */ +/* Slot 525 is reserved */ +/* Slot 526 is reserved */ +/* Slot 527 is reserved */ +/* Slot 528 is reserved */ +/* Slot 529 is reserved */ +/* Slot 530 is reserved */ +/* Slot 531 is reserved */ +/* Slot 532 is reserved */ +/* Slot 533 is reserved */ +/* Slot 534 is reserved */ +/* Slot 535 is reserved */ +/* Slot 536 is reserved */ +/* Slot 537 is reserved */ +/* Slot 538 is reserved */ +/* Slot 539 is reserved */ +/* Slot 540 is reserved */ +/* Slot 541 is reserved */ +/* Slot 542 is reserved */ +/* Slot 543 is reserved */ +/* Slot 544 is reserved */ +/* Slot 545 is reserved */ +/* Slot 546 is reserved */ +/* Slot 547 is reserved */ +/* Slot 548 is reserved */ +/* Slot 549 is reserved */ +/* Slot 550 is reserved */ +/* Slot 551 is reserved */ +/* Slot 552 is reserved */ +/* Slot 553 is reserved */ +/* 554 */ +EXTERN Tcl_DriverThreadActionProc * Tcl_ChannelThreadActionProc _ANSI_ARGS_(( + Tcl_ChannelType *chanTypePtr)); +/* Slot 555 is reserved */ +/* Slot 556 is reserved */ +/* Slot 557 is reserved */ +/* Slot 558 is reserved */ +/* Slot 559 is reserved */ +/* Slot 560 is reserved */ +/* Slot 561 is reserved */ +/* Slot 562 is reserved */ +/* Slot 563 is reserved */ +/* Slot 564 is reserved */ +/* Slot 565 is reserved */ +/* Slot 566 is reserved */ +/* Slot 567 is reserved */ +/* Slot 568 is reserved */ +/* Slot 569 is reserved */ +/* Slot 570 is reserved */ +/* Slot 571 is reserved */ +/* Slot 572 is reserved */ +/* 573 */ +EXTERN int Tcl_PkgRequireProc _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name, int objc, + Tcl_Obj *CONST objv[], + ClientData *clientDataPtr)); +/* Slot 574 is reserved */ +/* Slot 575 is reserved */ +/* Slot 576 is reserved */ +/* Slot 577 is reserved */ +/* Slot 578 is reserved */ +/* Slot 579 is reserved */ +/* Slot 580 is reserved */ +/* Slot 581 is reserved */ +/* Slot 582 is reserved */ +/* Slot 583 is reserved */ +/* Slot 584 is reserved */ +/* Slot 585 is reserved */ +/* Slot 586 is reserved */ +/* Slot 587 is reserved */ +/* Slot 588 is reserved */ +/* Slot 589 is reserved */ +/* Slot 590 is reserved */ +/* Slot 591 is reserved */ +/* Slot 592 is reserved */ +/* Slot 593 is reserved */ +/* Slot 594 is reserved */ +/* Slot 595 is reserved */ +/* Slot 596 is reserved */ +/* Slot 597 is reserved */ +/* Slot 598 is reserved */ +/* Slot 599 is reserved */ +/* Slot 600 is reserved */ +/* Slot 601 is reserved */ +/* Slot 602 is reserved */ +/* Slot 603 is reserved */ +/* Slot 604 is reserved */ +/* Slot 605 is reserved */ +/* Slot 606 is reserved */ +/* Slot 607 is reserved */ +/* Slot 608 is reserved */ +/* Slot 609 is reserved */ +/* Slot 610 is reserved */ +/* Slot 611 is reserved */ +/* Slot 612 is reserved */ +/* Slot 613 is reserved */ +/* Slot 614 is reserved */ +/* Slot 615 is reserved */ +/* Slot 616 is reserved */ +/* Slot 617 is reserved */ +/* Slot 618 is reserved */ +/* Slot 619 is reserved */ +/* Slot 620 is reserved */ +/* Slot 621 is reserved */ +/* Slot 622 is reserved */ +/* Slot 623 is reserved */ +/* Slot 624 is reserved */ +/* Slot 625 is reserved */ +/* Slot 626 is reserved */ +/* Slot 627 is reserved */ +/* Slot 628 is reserved */ +/* Slot 629 is reserved */ +/* 630 */ +EXTERN void TclUnusedStubEntry _ANSI_ARGS_((void)); + +typedef struct TclStubHooks { + struct TclPlatStubs *tclPlatStubs; + struct TclIntStubs *tclIntStubs; + struct TclIntPlatStubs *tclIntPlatStubs; +} TclStubHooks; + +typedef struct TclStubs { + int magic; + struct TclStubHooks *hooks; + + int (*tcl_PkgProvideEx) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, CONST char *version, ClientData clientData)); /* 0 */ + CONST84_RETURN char * (*tcl_PkgRequireEx) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, CONST char *version, int exact, ClientData *clientDataPtr)); /* 1 */ + void (*tcl_Panic) _ANSI_ARGS_((CONST char *format, ...)); /* 2 */ + char * (*tcl_Alloc) _ANSI_ARGS_((unsigned int size)); /* 3 */ + void (*tcl_Free) _ANSI_ARGS_((char *ptr)); /* 4 */ + char * (*tcl_Realloc) _ANSI_ARGS_((char *ptr, unsigned int size)); /* 5 */ + char * (*tcl_DbCkalloc) _ANSI_ARGS_((unsigned int size, CONST char *file, int line)); /* 6 */ + void (*tcl_DbCkfree) _ANSI_ARGS_((char *ptr, CONST char *file, int line)); /* 7 */ + char * (*tcl_DbCkrealloc) _ANSI_ARGS_((char *ptr, unsigned int size, CONST char *file, int line)); /* 8 */ +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ + void (*tcl_CreateFileHandler) _ANSI_ARGS_((int fd, int mask, Tcl_FileProc *proc, ClientData clientData)); /* 9 */ +#endif /* UNIX */ +#if defined(__WIN32__) /* WIN */ + VOID *reserved9; +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ + void (*tcl_CreateFileHandler) _ANSI_ARGS_((int fd, int mask, Tcl_FileProc *proc, ClientData clientData)); /* 9 */ +#endif /* MACOSX */ +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ + void (*tcl_DeleteFileHandler) _ANSI_ARGS_((int fd)); /* 10 */ +#endif /* UNIX */ +#if defined(__WIN32__) /* WIN */ + VOID *reserved10; +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ + void (*tcl_DeleteFileHandler) _ANSI_ARGS_((int fd)); /* 10 */ +#endif /* MACOSX */ + void (*tcl_SetTimer) _ANSI_ARGS_((Tcl_Time *timePtr)); /* 11 */ + void (*tcl_Sleep) _ANSI_ARGS_((int ms)); /* 12 */ + int (*tcl_WaitForEvent) _ANSI_ARGS_((Tcl_Time *timePtr)); /* 13 */ + int (*tcl_AppendAllObjTypes) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr)); /* 14 */ + void (*tcl_AppendStringsToObj) _ANSI_ARGS_((Tcl_Obj *objPtr, ...)); /* 15 */ + void (*tcl_AppendToObj) _ANSI_ARGS_((Tcl_Obj *objPtr, CONST char *bytes, int length)); /* 16 */ + Tcl_Obj * (*tcl_ConcatObj) _ANSI_ARGS_((int objc, Tcl_Obj *CONST objv[])); /* 17 */ + int (*tcl_ConvertToType) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_ObjType *typePtr)); /* 18 */ + void (*tcl_DbDecrRefCount) _ANSI_ARGS_((Tcl_Obj *objPtr, CONST char *file, int line)); /* 19 */ + void (*tcl_DbIncrRefCount) _ANSI_ARGS_((Tcl_Obj *objPtr, CONST char *file, int line)); /* 20 */ + int (*tcl_DbIsShared) _ANSI_ARGS_((Tcl_Obj *objPtr, CONST char *file, int line)); /* 21 */ + Tcl_Obj * (*tcl_DbNewBooleanObj) _ANSI_ARGS_((int boolValue, CONST char *file, int line)); /* 22 */ + Tcl_Obj * (*tcl_DbNewByteArrayObj) _ANSI_ARGS_((CONST unsigned char *bytes, int length, CONST char *file, int line)); /* 23 */ + Tcl_Obj * (*tcl_DbNewDoubleObj) _ANSI_ARGS_((double doubleValue, CONST char *file, int line)); /* 24 */ + Tcl_Obj * (*tcl_DbNewListObj) _ANSI_ARGS_((int objc, Tcl_Obj *CONST *objv, CONST char *file, int line)); /* 25 */ + Tcl_Obj * (*tcl_DbNewLongObj) _ANSI_ARGS_((long longValue, CONST char *file, int line)); /* 26 */ + Tcl_Obj * (*tcl_DbNewObj) _ANSI_ARGS_((CONST char *file, int line)); /* 27 */ + Tcl_Obj * (*tcl_DbNewStringObj) _ANSI_ARGS_((CONST char *bytes, int length, CONST char *file, int line)); /* 28 */ + Tcl_Obj * (*tcl_DuplicateObj) _ANSI_ARGS_((Tcl_Obj *objPtr)); /* 29 */ + void (*tclFreeObj) _ANSI_ARGS_((Tcl_Obj *objPtr)); /* 30 */ + int (*tcl_GetBoolean) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *src, int *boolPtr)); /* 31 */ + int (*tcl_GetBooleanFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, int *boolPtr)); /* 32 */ + unsigned char * (*tcl_GetByteArrayFromObj) _ANSI_ARGS_((Tcl_Obj *objPtr, int *lengthPtr)); /* 33 */ + int (*tcl_GetDouble) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *src, double *doublePtr)); /* 34 */ + int (*tcl_GetDoubleFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, double *doublePtr)); /* 35 */ + int (*tcl_GetIndexFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, CONST84 char **tablePtr, CONST char *msg, int flags, int *indexPtr)); /* 36 */ + int (*tcl_GetInt) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *src, int *intPtr)); /* 37 */ + int (*tcl_GetIntFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, int *intPtr)); /* 38 */ + int (*tcl_GetLongFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, long *longPtr)); /* 39 */ + Tcl_ObjType * (*tcl_GetObjType) _ANSI_ARGS_((CONST char *typeName)); /* 40 */ + char * (*tcl_GetStringFromObj) _ANSI_ARGS_((Tcl_Obj *objPtr, int *lengthPtr)); /* 41 */ + void (*tcl_InvalidateStringRep) _ANSI_ARGS_((Tcl_Obj *objPtr)); /* 42 */ + int (*tcl_ListObjAppendList) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *listPtr, Tcl_Obj *elemListPtr)); /* 43 */ + int (*tcl_ListObjAppendElement) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *listPtr, Tcl_Obj *objPtr)); /* 44 */ + int (*tcl_ListObjGetElements) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *listPtr, int *objcPtr, Tcl_Obj ***objvPtr)); /* 45 */ + int (*tcl_ListObjIndex) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *listPtr, int index, Tcl_Obj **objPtrPtr)); /* 46 */ + int (*tcl_ListObjLength) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *listPtr, int *lengthPtr)); /* 47 */ + int (*tcl_ListObjReplace) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *listPtr, int first, int count, int objc, Tcl_Obj *CONST objv[])); /* 48 */ + Tcl_Obj * (*tcl_NewBooleanObj) _ANSI_ARGS_((int boolValue)); /* 49 */ + Tcl_Obj * (*tcl_NewByteArrayObj) _ANSI_ARGS_((CONST unsigned char *bytes, int length)); /* 50 */ + Tcl_Obj * (*tcl_NewDoubleObj) _ANSI_ARGS_((double doubleValue)); /* 51 */ + Tcl_Obj * (*tcl_NewIntObj) _ANSI_ARGS_((int intValue)); /* 52 */ + Tcl_Obj * (*tcl_NewListObj) _ANSI_ARGS_((int objc, Tcl_Obj *CONST objv[])); /* 53 */ + Tcl_Obj * (*tcl_NewLongObj) _ANSI_ARGS_((long longValue)); /* 54 */ + Tcl_Obj * (*tcl_NewObj) _ANSI_ARGS_((void)); /* 55 */ + Tcl_Obj * (*tcl_NewStringObj) _ANSI_ARGS_((CONST char *bytes, int length)); /* 56 */ + void (*tcl_SetBooleanObj) _ANSI_ARGS_((Tcl_Obj *objPtr, int boolValue)); /* 57 */ + unsigned char * (*tcl_SetByteArrayLength) _ANSI_ARGS_((Tcl_Obj *objPtr, int length)); /* 58 */ + void (*tcl_SetByteArrayObj) _ANSI_ARGS_((Tcl_Obj *objPtr, CONST unsigned char *bytes, int length)); /* 59 */ + void (*tcl_SetDoubleObj) _ANSI_ARGS_((Tcl_Obj *objPtr, double doubleValue)); /* 60 */ + void (*tcl_SetIntObj) _ANSI_ARGS_((Tcl_Obj *objPtr, int intValue)); /* 61 */ + void (*tcl_SetListObj) _ANSI_ARGS_((Tcl_Obj *objPtr, int objc, Tcl_Obj *CONST objv[])); /* 62 */ + void (*tcl_SetLongObj) _ANSI_ARGS_((Tcl_Obj *objPtr, long longValue)); /* 63 */ + void (*tcl_SetObjLength) _ANSI_ARGS_((Tcl_Obj *objPtr, int length)); /* 64 */ + void (*tcl_SetStringObj) _ANSI_ARGS_((Tcl_Obj *objPtr, CONST char *bytes, int length)); /* 65 */ + void (*tcl_AddErrorInfo) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *message)); /* 66 */ + void (*tcl_AddObjErrorInfo) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *message, int length)); /* 67 */ + void (*tcl_AllowExceptions) _ANSI_ARGS_((Tcl_Interp *interp)); /* 68 */ + void (*tcl_AppendElement) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *element)); /* 69 */ + void (*tcl_AppendResult) _ANSI_ARGS_((Tcl_Interp *interp, ...)); /* 70 */ + Tcl_AsyncHandler (*tcl_AsyncCreate) _ANSI_ARGS_((Tcl_AsyncProc *proc, ClientData clientData)); /* 71 */ + void (*tcl_AsyncDelete) _ANSI_ARGS_((Tcl_AsyncHandler async)); /* 72 */ + int (*tcl_AsyncInvoke) _ANSI_ARGS_((Tcl_Interp *interp, int code)); /* 73 */ + void (*tcl_AsyncMark) _ANSI_ARGS_((Tcl_AsyncHandler async)); /* 74 */ + int (*tcl_AsyncReady) _ANSI_ARGS_((void)); /* 75 */ + void (*tcl_BackgroundError) _ANSI_ARGS_((Tcl_Interp *interp)); /* 76 */ + char (*tcl_Backslash) _ANSI_ARGS_((CONST char *src, int *readPtr)); /* 77 */ + int (*tcl_BadChannelOption) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *optionName, CONST char *optionList)); /* 78 */ + void (*tcl_CallWhenDeleted) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_InterpDeleteProc *proc, ClientData clientData)); /* 79 */ + void (*tcl_CancelIdleCall) _ANSI_ARGS_((Tcl_IdleProc *idleProc, ClientData clientData)); /* 80 */ + int (*tcl_Close) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Channel chan)); /* 81 */ + int (*tcl_CommandComplete) _ANSI_ARGS_((CONST char *cmd)); /* 82 */ + char * (*tcl_Concat) _ANSI_ARGS_((int argc, CONST84 char *CONST *argv)); /* 83 */ + int (*tcl_ConvertElement) _ANSI_ARGS_((CONST char *src, char *dst, int flags)); /* 84 */ + int (*tcl_ConvertCountedElement) _ANSI_ARGS_((CONST char *src, int length, char *dst, int flags)); /* 85 */ + int (*tcl_CreateAlias) _ANSI_ARGS_((Tcl_Interp *slave, CONST char *slaveCmd, Tcl_Interp *target, CONST char *targetCmd, int argc, CONST84 char *CONST *argv)); /* 86 */ + int (*tcl_CreateAliasObj) _ANSI_ARGS_((Tcl_Interp *slave, CONST char *slaveCmd, Tcl_Interp *target, CONST char *targetCmd, int objc, Tcl_Obj *CONST objv[])); /* 87 */ + Tcl_Channel (*tcl_CreateChannel) _ANSI_ARGS_((Tcl_ChannelType *typePtr, CONST char *chanName, ClientData instanceData, int mask)); /* 88 */ + void (*tcl_CreateChannelHandler) _ANSI_ARGS_((Tcl_Channel chan, int mask, Tcl_ChannelProc *proc, ClientData clientData)); /* 89 */ + void (*tcl_CreateCloseHandler) _ANSI_ARGS_((Tcl_Channel chan, Tcl_CloseProc *proc, ClientData clientData)); /* 90 */ + Tcl_Command (*tcl_CreateCommand) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *cmdName, Tcl_CmdProc *proc, ClientData clientData, Tcl_CmdDeleteProc *deleteProc)); /* 91 */ + void (*tcl_CreateEventSource) _ANSI_ARGS_((Tcl_EventSetupProc *setupProc, Tcl_EventCheckProc *checkProc, ClientData clientData)); /* 92 */ + void (*tcl_CreateExitHandler) _ANSI_ARGS_((Tcl_ExitProc *proc, ClientData clientData)); /* 93 */ + Tcl_Interp * (*tcl_CreateInterp) _ANSI_ARGS_((void)); /* 94 */ + void (*tcl_CreateMathFunc) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, int numArgs, Tcl_ValueType *argTypes, Tcl_MathProc *proc, ClientData clientData)); /* 95 */ + Tcl_Command (*tcl_CreateObjCommand) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *cmdName, Tcl_ObjCmdProc *proc, ClientData clientData, Tcl_CmdDeleteProc *deleteProc)); /* 96 */ + Tcl_Interp * (*tcl_CreateSlave) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *slaveName, int isSafe)); /* 97 */ + Tcl_TimerToken (*tcl_CreateTimerHandler) _ANSI_ARGS_((int milliseconds, Tcl_TimerProc *proc, ClientData clientData)); /* 98 */ + Tcl_Trace (*tcl_CreateTrace) _ANSI_ARGS_((Tcl_Interp *interp, int level, Tcl_CmdTraceProc *proc, ClientData clientData)); /* 99 */ + void (*tcl_DeleteAssocData) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name)); /* 100 */ + void (*tcl_DeleteChannelHandler) _ANSI_ARGS_((Tcl_Channel chan, Tcl_ChannelProc *proc, ClientData clientData)); /* 101 */ + void (*tcl_DeleteCloseHandler) _ANSI_ARGS_((Tcl_Channel chan, Tcl_CloseProc *proc, ClientData clientData)); /* 102 */ + int (*tcl_DeleteCommand) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *cmdName)); /* 103 */ + int (*tcl_DeleteCommandFromToken) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Command command)); /* 104 */ + void (*tcl_DeleteEvents) _ANSI_ARGS_((Tcl_EventDeleteProc *proc, ClientData clientData)); /* 105 */ + void (*tcl_DeleteEventSource) _ANSI_ARGS_((Tcl_EventSetupProc *setupProc, Tcl_EventCheckProc *checkProc, ClientData clientData)); /* 106 */ + void (*tcl_DeleteExitHandler) _ANSI_ARGS_((Tcl_ExitProc *proc, ClientData clientData)); /* 107 */ + void (*tcl_DeleteHashEntry) _ANSI_ARGS_((Tcl_HashEntry *entryPtr)); /* 108 */ + void (*tcl_DeleteHashTable) _ANSI_ARGS_((Tcl_HashTable *tablePtr)); /* 109 */ + void (*tcl_DeleteInterp) _ANSI_ARGS_((Tcl_Interp *interp)); /* 110 */ + void (*tcl_DetachPids) _ANSI_ARGS_((int numPids, Tcl_Pid *pidPtr)); /* 111 */ + void (*tcl_DeleteTimerHandler) _ANSI_ARGS_((Tcl_TimerToken token)); /* 112 */ + void (*tcl_DeleteTrace) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Trace trace)); /* 113 */ + void (*tcl_DontCallWhenDeleted) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_InterpDeleteProc *proc, ClientData clientData)); /* 114 */ + int (*tcl_DoOneEvent) _ANSI_ARGS_((int flags)); /* 115 */ + void (*tcl_DoWhenIdle) _ANSI_ARGS_((Tcl_IdleProc *proc, ClientData clientData)); /* 116 */ + char * (*tcl_DStringAppend) _ANSI_ARGS_((Tcl_DString *dsPtr, CONST char *bytes, int length)); /* 117 */ + char * (*tcl_DStringAppendElement) _ANSI_ARGS_((Tcl_DString *dsPtr, CONST char *element)); /* 118 */ + void (*tcl_DStringEndSublist) _ANSI_ARGS_((Tcl_DString *dsPtr)); /* 119 */ + void (*tcl_DStringFree) _ANSI_ARGS_((Tcl_DString *dsPtr)); /* 120 */ + void (*tcl_DStringGetResult) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_DString *dsPtr)); /* 121 */ + void (*tcl_DStringInit) _ANSI_ARGS_((Tcl_DString *dsPtr)); /* 122 */ + void (*tcl_DStringResult) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_DString *dsPtr)); /* 123 */ + void (*tcl_DStringSetLength) _ANSI_ARGS_((Tcl_DString *dsPtr, int length)); /* 124 */ + void (*tcl_DStringStartSublist) _ANSI_ARGS_((Tcl_DString *dsPtr)); /* 125 */ + int (*tcl_Eof) _ANSI_ARGS_((Tcl_Channel chan)); /* 126 */ + CONST84_RETURN char * (*tcl_ErrnoId) _ANSI_ARGS_((void)); /* 127 */ + CONST84_RETURN char * (*tcl_ErrnoMsg) _ANSI_ARGS_((int err)); /* 128 */ + int (*tcl_Eval) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *script)); /* 129 */ + int (*tcl_EvalFile) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *fileName)); /* 130 */ + int (*tcl_EvalObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr)); /* 131 */ + void (*tcl_EventuallyFree) _ANSI_ARGS_((ClientData clientData, Tcl_FreeProc *freeProc)); /* 132 */ + void (*tcl_Exit) _ANSI_ARGS_((int status)); /* 133 */ + int (*tcl_ExposeCommand) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *hiddenCmdToken, CONST char *cmdName)); /* 134 */ + int (*tcl_ExprBoolean) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *expr, int *ptr)); /* 135 */ + int (*tcl_ExprBooleanObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, int *ptr)); /* 136 */ + int (*tcl_ExprDouble) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *expr, double *ptr)); /* 137 */ + int (*tcl_ExprDoubleObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, double *ptr)); /* 138 */ + int (*tcl_ExprLong) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *expr, long *ptr)); /* 139 */ + int (*tcl_ExprLongObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, long *ptr)); /* 140 */ + int (*tcl_ExprObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Obj **resultPtrPtr)); /* 141 */ + int (*tcl_ExprString) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *expr)); /* 142 */ + void (*tcl_Finalize) _ANSI_ARGS_((void)); /* 143 */ + void (*tcl_FindExecutable) _ANSI_ARGS_((CONST char *argv0)); /* 144 */ + Tcl_HashEntry * (*tcl_FirstHashEntry) _ANSI_ARGS_((Tcl_HashTable *tablePtr, Tcl_HashSearch *searchPtr)); /* 145 */ + int (*tcl_Flush) _ANSI_ARGS_((Tcl_Channel chan)); /* 146 */ + void (*tcl_FreeResult) _ANSI_ARGS_((Tcl_Interp *interp)); /* 147 */ + int (*tcl_GetAlias) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *slaveCmd, Tcl_Interp **targetInterpPtr, CONST84 char **targetCmdPtr, int *argcPtr, CONST84 char ***argvPtr)); /* 148 */ + int (*tcl_GetAliasObj) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *slaveCmd, Tcl_Interp **targetInterpPtr, CONST84 char **targetCmdPtr, int *objcPtr, Tcl_Obj ***objv)); /* 149 */ + ClientData (*tcl_GetAssocData) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, Tcl_InterpDeleteProc **procPtr)); /* 150 */ + Tcl_Channel (*tcl_GetChannel) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *chanName, int *modePtr)); /* 151 */ + int (*tcl_GetChannelBufferSize) _ANSI_ARGS_((Tcl_Channel chan)); /* 152 */ + int (*tcl_GetChannelHandle) _ANSI_ARGS_((Tcl_Channel chan, int direction, ClientData *handlePtr)); /* 153 */ + ClientData (*tcl_GetChannelInstanceData) _ANSI_ARGS_((Tcl_Channel chan)); /* 154 */ + int (*tcl_GetChannelMode) _ANSI_ARGS_((Tcl_Channel chan)); /* 155 */ + CONST84_RETURN char * (*tcl_GetChannelName) _ANSI_ARGS_((Tcl_Channel chan)); /* 156 */ + int (*tcl_GetChannelOption) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Channel chan, CONST char *optionName, Tcl_DString *dsPtr)); /* 157 */ + Tcl_ChannelType * (*tcl_GetChannelType) _ANSI_ARGS_((Tcl_Channel chan)); /* 158 */ + int (*tcl_GetCommandInfo) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *cmdName, Tcl_CmdInfo *infoPtr)); /* 159 */ + CONST84_RETURN char * (*tcl_GetCommandName) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Command command)); /* 160 */ + int (*tcl_GetErrno) _ANSI_ARGS_((void)); /* 161 */ + CONST84_RETURN char * (*tcl_GetHostName) _ANSI_ARGS_((void)); /* 162 */ + int (*tcl_GetInterpPath) _ANSI_ARGS_((Tcl_Interp *askInterp, Tcl_Interp *slaveInterp)); /* 163 */ + Tcl_Interp * (*tcl_GetMaster) _ANSI_ARGS_((Tcl_Interp *interp)); /* 164 */ + CONST char * (*tcl_GetNameOfExecutable) _ANSI_ARGS_((void)); /* 165 */ + Tcl_Obj * (*tcl_GetObjResult) _ANSI_ARGS_((Tcl_Interp *interp)); /* 166 */ +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ + int (*tcl_GetOpenFile) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *chanID, int forWriting, int checkUsage, ClientData *filePtr)); /* 167 */ +#endif /* UNIX */ +#if defined(__WIN32__) /* WIN */ + VOID *reserved167; +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ + int (*tcl_GetOpenFile) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *chanID, int forWriting, int checkUsage, ClientData *filePtr)); /* 167 */ +#endif /* MACOSX */ + Tcl_PathType (*tcl_GetPathType) _ANSI_ARGS_((CONST char *path)); /* 168 */ + int (*tcl_Gets) _ANSI_ARGS_((Tcl_Channel chan, Tcl_DString *dsPtr)); /* 169 */ + int (*tcl_GetsObj) _ANSI_ARGS_((Tcl_Channel chan, Tcl_Obj *objPtr)); /* 170 */ + int (*tcl_GetServiceMode) _ANSI_ARGS_((void)); /* 171 */ + Tcl_Interp * (*tcl_GetSlave) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *slaveName)); /* 172 */ + Tcl_Channel (*tcl_GetStdChannel) _ANSI_ARGS_((int type)); /* 173 */ + CONST84_RETURN char * (*tcl_GetStringResult) _ANSI_ARGS_((Tcl_Interp *interp)); /* 174 */ + CONST84_RETURN char * (*tcl_GetVar) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *varName, int flags)); /* 175 */ + CONST84_RETURN char * (*tcl_GetVar2) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *part1, CONST char *part2, int flags)); /* 176 */ + int (*tcl_GlobalEval) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *command)); /* 177 */ + int (*tcl_GlobalEvalObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr)); /* 178 */ + int (*tcl_HideCommand) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *cmdName, CONST char *hiddenCmdToken)); /* 179 */ + int (*tcl_Init) _ANSI_ARGS_((Tcl_Interp *interp)); /* 180 */ + void (*tcl_InitHashTable) _ANSI_ARGS_((Tcl_HashTable *tablePtr, int keyType)); /* 181 */ + int (*tcl_InputBlocked) _ANSI_ARGS_((Tcl_Channel chan)); /* 182 */ + int (*tcl_InputBuffered) _ANSI_ARGS_((Tcl_Channel chan)); /* 183 */ + int (*tcl_InterpDeleted) _ANSI_ARGS_((Tcl_Interp *interp)); /* 184 */ + int (*tcl_IsSafe) _ANSI_ARGS_((Tcl_Interp *interp)); /* 185 */ + char * (*tcl_JoinPath) _ANSI_ARGS_((int argc, CONST84 char *CONST *argv, Tcl_DString *resultPtr)); /* 186 */ + int (*tcl_LinkVar) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *varName, char *addr, int type)); /* 187 */ + VOID *reserved188; + Tcl_Channel (*tcl_MakeFileChannel) _ANSI_ARGS_((ClientData handle, int mode)); /* 189 */ + int (*tcl_MakeSafe) _ANSI_ARGS_((Tcl_Interp *interp)); /* 190 */ + Tcl_Channel (*tcl_MakeTcpClientChannel) _ANSI_ARGS_((ClientData tcpSocket)); /* 191 */ + char * (*tcl_Merge) _ANSI_ARGS_((int argc, CONST84 char *CONST *argv)); /* 192 */ + Tcl_HashEntry * (*tcl_NextHashEntry) _ANSI_ARGS_((Tcl_HashSearch *searchPtr)); /* 193 */ + void (*tcl_NotifyChannel) _ANSI_ARGS_((Tcl_Channel channel, int mask)); /* 194 */ + Tcl_Obj * (*tcl_ObjGetVar2) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, int flags)); /* 195 */ + Tcl_Obj * (*tcl_ObjSetVar2) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, Tcl_Obj *newValuePtr, int flags)); /* 196 */ + Tcl_Channel (*tcl_OpenCommandChannel) _ANSI_ARGS_((Tcl_Interp *interp, int argc, CONST84 char **argv, int flags)); /* 197 */ + Tcl_Channel (*tcl_OpenFileChannel) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *fileName, CONST char *modeString, int permissions)); /* 198 */ + Tcl_Channel (*tcl_OpenTcpClient) _ANSI_ARGS_((Tcl_Interp *interp, int port, CONST char *address, CONST char *myaddr, int myport, int async)); /* 199 */ + Tcl_Channel (*tcl_OpenTcpServer) _ANSI_ARGS_((Tcl_Interp *interp, int port, CONST char *host, Tcl_TcpAcceptProc *acceptProc, ClientData callbackData)); /* 200 */ + void (*tcl_Preserve) _ANSI_ARGS_((ClientData data)); /* 201 */ + void (*tcl_PrintDouble) _ANSI_ARGS_((Tcl_Interp *interp, double value, char *dst)); /* 202 */ + int (*tcl_PutEnv) _ANSI_ARGS_((CONST char *assignment)); /* 203 */ + CONST84_RETURN char * (*tcl_PosixError) _ANSI_ARGS_((Tcl_Interp *interp)); /* 204 */ + void (*tcl_QueueEvent) _ANSI_ARGS_((Tcl_Event *evPtr, Tcl_QueuePosition position)); /* 205 */ + int (*tcl_Read) _ANSI_ARGS_((Tcl_Channel chan, char *bufPtr, int toRead)); /* 206 */ + void (*tcl_ReapDetachedProcs) _ANSI_ARGS_((void)); /* 207 */ + int (*tcl_RecordAndEval) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *cmd, int flags)); /* 208 */ + int (*tcl_RecordAndEvalObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *cmdPtr, int flags)); /* 209 */ + void (*tcl_RegisterChannel) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Channel chan)); /* 210 */ + void (*tcl_RegisterObjType) _ANSI_ARGS_((Tcl_ObjType *typePtr)); /* 211 */ + Tcl_RegExp (*tcl_RegExpCompile) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *pattern)); /* 212 */ + int (*tcl_RegExpExec) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_RegExp regexp, CONST char *text, CONST char *start)); /* 213 */ + int (*tcl_RegExpMatch) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *text, CONST char *pattern)); /* 214 */ + void (*tcl_RegExpRange) _ANSI_ARGS_((Tcl_RegExp regexp, int index, CONST84 char **startPtr, CONST84 char **endPtr)); /* 215 */ + void (*tcl_Release) _ANSI_ARGS_((ClientData clientData)); /* 216 */ + void (*tcl_ResetResult) _ANSI_ARGS_((Tcl_Interp *interp)); /* 217 */ + int (*tcl_ScanElement) _ANSI_ARGS_((CONST char *src, int *flagPtr)); /* 218 */ + int (*tcl_ScanCountedElement) _ANSI_ARGS_((CONST char *src, int length, int *flagPtr)); /* 219 */ + int (*tcl_SeekOld) _ANSI_ARGS_((Tcl_Channel chan, int offset, int mode)); /* 220 */ + int (*tcl_ServiceAll) _ANSI_ARGS_((void)); /* 221 */ + int (*tcl_ServiceEvent) _ANSI_ARGS_((int flags)); /* 222 */ + void (*tcl_SetAssocData) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, Tcl_InterpDeleteProc *proc, ClientData clientData)); /* 223 */ + void (*tcl_SetChannelBufferSize) _ANSI_ARGS_((Tcl_Channel chan, int sz)); /* 224 */ + int (*tcl_SetChannelOption) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Channel chan, CONST char *optionName, CONST char *newValue)); /* 225 */ + int (*tcl_SetCommandInfo) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *cmdName, CONST Tcl_CmdInfo *infoPtr)); /* 226 */ + void (*tcl_SetErrno) _ANSI_ARGS_((int err)); /* 227 */ + void (*tcl_SetErrorCode) _ANSI_ARGS_((Tcl_Interp *interp, ...)); /* 228 */ + void (*tcl_SetMaxBlockTime) _ANSI_ARGS_((Tcl_Time *timePtr)); /* 229 */ + void (*tcl_SetPanicProc) _ANSI_ARGS_((Tcl_PanicProc *panicProc)); /* 230 */ + int (*tcl_SetRecursionLimit) _ANSI_ARGS_((Tcl_Interp *interp, int depth)); /* 231 */ + void (*tcl_SetResult) _ANSI_ARGS_((Tcl_Interp *interp, char *result, Tcl_FreeProc *freeProc)); /* 232 */ + int (*tcl_SetServiceMode) _ANSI_ARGS_((int mode)); /* 233 */ + void (*tcl_SetObjErrorCode) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *errorObjPtr)); /* 234 */ + void (*tcl_SetObjResult) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *resultObjPtr)); /* 235 */ + void (*tcl_SetStdChannel) _ANSI_ARGS_((Tcl_Channel channel, int type)); /* 236 */ + CONST84_RETURN char * (*tcl_SetVar) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *varName, CONST char *newValue, int flags)); /* 237 */ + CONST84_RETURN char * (*tcl_SetVar2) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *part1, CONST char *part2, CONST char *newValue, int flags)); /* 238 */ + CONST84_RETURN char * (*tcl_SignalId) _ANSI_ARGS_((int sig)); /* 239 */ + CONST84_RETURN char * (*tcl_SignalMsg) _ANSI_ARGS_((int sig)); /* 240 */ + void (*tcl_SourceRCFile) _ANSI_ARGS_((Tcl_Interp *interp)); /* 241 */ + int (*tcl_SplitList) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *listStr, int *argcPtr, CONST84 char ***argvPtr)); /* 242 */ + void (*tcl_SplitPath) _ANSI_ARGS_((CONST char *path, int *argcPtr, CONST84 char ***argvPtr)); /* 243 */ + void (*tcl_StaticPackage) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *pkgName, Tcl_PackageInitProc *initProc, Tcl_PackageInitProc *safeInitProc)); /* 244 */ + int (*tcl_StringMatch) _ANSI_ARGS_((CONST char *str, CONST char *pattern)); /* 245 */ + int (*tcl_TellOld) _ANSI_ARGS_((Tcl_Channel chan)); /* 246 */ + int (*tcl_TraceVar) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *varName, int flags, Tcl_VarTraceProc *proc, ClientData clientData)); /* 247 */ + int (*tcl_TraceVar2) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *part1, CONST char *part2, int flags, Tcl_VarTraceProc *proc, ClientData clientData)); /* 248 */ + char * (*tcl_TranslateFileName) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, Tcl_DString *bufferPtr)); /* 249 */ + int (*tcl_Ungets) _ANSI_ARGS_((Tcl_Channel chan, CONST char *str, int len, int atHead)); /* 250 */ + void (*tcl_UnlinkVar) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *varName)); /* 251 */ + int (*tcl_UnregisterChannel) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Channel chan)); /* 252 */ + int (*tcl_UnsetVar) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *varName, int flags)); /* 253 */ + int (*tcl_UnsetVar2) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *part1, CONST char *part2, int flags)); /* 254 */ + void (*tcl_UntraceVar) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *varName, int flags, Tcl_VarTraceProc *proc, ClientData clientData)); /* 255 */ + void (*tcl_UntraceVar2) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *part1, CONST char *part2, int flags, Tcl_VarTraceProc *proc, ClientData clientData)); /* 256 */ + void (*tcl_UpdateLinkedVar) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *varName)); /* 257 */ + int (*tcl_UpVar) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *frameName, CONST char *varName, CONST char *localName, int flags)); /* 258 */ + int (*tcl_UpVar2) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *frameName, CONST char *part1, CONST char *part2, CONST char *localName, int flags)); /* 259 */ + int (*tcl_VarEval) _ANSI_ARGS_((Tcl_Interp *interp, ...)); /* 260 */ + ClientData (*tcl_VarTraceInfo) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *varName, int flags, Tcl_VarTraceProc *procPtr, ClientData prevClientData)); /* 261 */ + ClientData (*tcl_VarTraceInfo2) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *part1, CONST char *part2, int flags, Tcl_VarTraceProc *procPtr, ClientData prevClientData)); /* 262 */ + int (*tcl_Write) _ANSI_ARGS_((Tcl_Channel chan, CONST char *s, int slen)); /* 263 */ + void (*tcl_WrongNumArgs) _ANSI_ARGS_((Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], CONST char *message)); /* 264 */ + int (*tcl_DumpActiveMemory) _ANSI_ARGS_((CONST char *fileName)); /* 265 */ + void (*tcl_ValidateAllMemory) _ANSI_ARGS_((CONST char *file, int line)); /* 266 */ + void (*tcl_AppendResultVA) _ANSI_ARGS_((Tcl_Interp *interp, va_list argList)); /* 267 */ + void (*tcl_AppendStringsToObjVA) _ANSI_ARGS_((Tcl_Obj *objPtr, va_list argList)); /* 268 */ + char * (*tcl_HashStats) _ANSI_ARGS_((Tcl_HashTable *tablePtr)); /* 269 */ + CONST84_RETURN char * (*tcl_ParseVar) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *start, CONST84 char **termPtr)); /* 270 */ + CONST84_RETURN char * (*tcl_PkgPresent) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, CONST char *version, int exact)); /* 271 */ + CONST84_RETURN char * (*tcl_PkgPresentEx) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, CONST char *version, int exact, ClientData *clientDataPtr)); /* 272 */ + int (*tcl_PkgProvide) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, CONST char *version)); /* 273 */ + CONST84_RETURN char * (*tcl_PkgRequire) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, CONST char *version, int exact)); /* 274 */ + void (*tcl_SetErrorCodeVA) _ANSI_ARGS_((Tcl_Interp *interp, va_list argList)); /* 275 */ + int (*tcl_VarEvalVA) _ANSI_ARGS_((Tcl_Interp *interp, va_list argList)); /* 276 */ + Tcl_Pid (*tcl_WaitPid) _ANSI_ARGS_((Tcl_Pid pid, int *statPtr, int options)); /* 277 */ + void (*tcl_PanicVA) _ANSI_ARGS_((CONST char *format, va_list argList)); /* 278 */ + void (*tcl_GetVersion) _ANSI_ARGS_((int *major, int *minor, int *patchLevel, int *type)); /* 279 */ + void (*tcl_InitMemory) _ANSI_ARGS_((Tcl_Interp *interp)); /* 280 */ + Tcl_Channel (*tcl_StackChannel) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_ChannelType *typePtr, ClientData instanceData, int mask, Tcl_Channel prevChan)); /* 281 */ + int (*tcl_UnstackChannel) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Channel chan)); /* 282 */ + Tcl_Channel (*tcl_GetStackedChannel) _ANSI_ARGS_((Tcl_Channel chan)); /* 283 */ + void (*tcl_SetMainLoop) _ANSI_ARGS_((Tcl_MainLoopProc *proc)); /* 284 */ + VOID *reserved285; + void (*tcl_AppendObjToObj) _ANSI_ARGS_((Tcl_Obj *objPtr, Tcl_Obj *appendObjPtr)); /* 286 */ + Tcl_Encoding (*tcl_CreateEncoding) _ANSI_ARGS_((Tcl_EncodingType *typePtr)); /* 287 */ + void (*tcl_CreateThreadExitHandler) _ANSI_ARGS_((Tcl_ExitProc *proc, ClientData clientData)); /* 288 */ + void (*tcl_DeleteThreadExitHandler) _ANSI_ARGS_((Tcl_ExitProc *proc, ClientData clientData)); /* 289 */ + void (*tcl_DiscardResult) _ANSI_ARGS_((Tcl_SavedResult *statePtr)); /* 290 */ + int (*tcl_EvalEx) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *script, int numBytes, int flags)); /* 291 */ + int (*tcl_EvalObjv) _ANSI_ARGS_((Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int flags)); /* 292 */ + int (*tcl_EvalObjEx) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, int flags)); /* 293 */ + void (*tcl_ExitThread) _ANSI_ARGS_((int status)); /* 294 */ + int (*tcl_ExternalToUtf) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Encoding encoding, CONST char *src, int srcLen, int flags, Tcl_EncodingState *statePtr, char *dst, int dstLen, int *srcReadPtr, int *dstWrotePtr, int *dstCharsPtr)); /* 295 */ + char * (*tcl_ExternalToUtfDString) _ANSI_ARGS_((Tcl_Encoding encoding, CONST char *src, int srcLen, Tcl_DString *dsPtr)); /* 296 */ + void (*tcl_FinalizeThread) _ANSI_ARGS_((void)); /* 297 */ + void (*tcl_FinalizeNotifier) _ANSI_ARGS_((ClientData clientData)); /* 298 */ + void (*tcl_FreeEncoding) _ANSI_ARGS_((Tcl_Encoding encoding)); /* 299 */ + Tcl_ThreadId (*tcl_GetCurrentThread) _ANSI_ARGS_((void)); /* 300 */ + Tcl_Encoding (*tcl_GetEncoding) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name)); /* 301 */ + CONST84_RETURN char * (*tcl_GetEncodingName) _ANSI_ARGS_((Tcl_Encoding encoding)); /* 302 */ + void (*tcl_GetEncodingNames) _ANSI_ARGS_((Tcl_Interp *interp)); /* 303 */ + int (*tcl_GetIndexFromObjStruct) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, CONST VOID *tablePtr, int offset, CONST char *msg, int flags, int *indexPtr)); /* 304 */ + VOID * (*tcl_GetThreadData) _ANSI_ARGS_((Tcl_ThreadDataKey *keyPtr, int size)); /* 305 */ + Tcl_Obj * (*tcl_GetVar2Ex) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *part1, CONST char *part2, int flags)); /* 306 */ + ClientData (*tcl_InitNotifier) _ANSI_ARGS_((void)); /* 307 */ + void (*tcl_MutexLock) _ANSI_ARGS_((Tcl_Mutex *mutexPtr)); /* 308 */ + void (*tcl_MutexUnlock) _ANSI_ARGS_((Tcl_Mutex *mutexPtr)); /* 309 */ + void (*tcl_ConditionNotify) _ANSI_ARGS_((Tcl_Condition *condPtr)); /* 310 */ + void (*tcl_ConditionWait) _ANSI_ARGS_((Tcl_Condition *condPtr, Tcl_Mutex *mutexPtr, Tcl_Time *timePtr)); /* 311 */ + int (*tcl_NumUtfChars) _ANSI_ARGS_((CONST char *src, int length)); /* 312 */ + int (*tcl_ReadChars) _ANSI_ARGS_((Tcl_Channel channel, Tcl_Obj *objPtr, int charsToRead, int appendFlag)); /* 313 */ + void (*tcl_RestoreResult) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_SavedResult *statePtr)); /* 314 */ + void (*tcl_SaveResult) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_SavedResult *statePtr)); /* 315 */ + int (*tcl_SetSystemEncoding) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name)); /* 316 */ + Tcl_Obj * (*tcl_SetVar2Ex) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *part1, CONST char *part2, Tcl_Obj *newValuePtr, int flags)); /* 317 */ + void (*tcl_ThreadAlert) _ANSI_ARGS_((Tcl_ThreadId threadId)); /* 318 */ + void (*tcl_ThreadQueueEvent) _ANSI_ARGS_((Tcl_ThreadId threadId, Tcl_Event *evPtr, Tcl_QueuePosition position)); /* 319 */ + Tcl_UniChar (*tcl_UniCharAtIndex) _ANSI_ARGS_((CONST char *src, int index)); /* 320 */ + Tcl_UniChar (*tcl_UniCharToLower) _ANSI_ARGS_((int ch)); /* 321 */ + Tcl_UniChar (*tcl_UniCharToTitle) _ANSI_ARGS_((int ch)); /* 322 */ + Tcl_UniChar (*tcl_UniCharToUpper) _ANSI_ARGS_((int ch)); /* 323 */ + int (*tcl_UniCharToUtf) _ANSI_ARGS_((int ch, char *buf)); /* 324 */ + CONST84_RETURN char * (*tcl_UtfAtIndex) _ANSI_ARGS_((CONST char *src, int index)); /* 325 */ + int (*tcl_UtfCharComplete) _ANSI_ARGS_((CONST char *src, int length)); /* 326 */ + int (*tcl_UtfBackslash) _ANSI_ARGS_((CONST char *src, int *readPtr, char *dst)); /* 327 */ + CONST84_RETURN char * (*tcl_UtfFindFirst) _ANSI_ARGS_((CONST char *src, int ch)); /* 328 */ + CONST84_RETURN char * (*tcl_UtfFindLast) _ANSI_ARGS_((CONST char *src, int ch)); /* 329 */ + CONST84_RETURN char * (*tcl_UtfNext) _ANSI_ARGS_((CONST char *src)); /* 330 */ + CONST84_RETURN char * (*tcl_UtfPrev) _ANSI_ARGS_((CONST char *src, CONST char *start)); /* 331 */ + int (*tcl_UtfToExternal) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Encoding encoding, CONST char *src, int srcLen, int flags, Tcl_EncodingState *statePtr, char *dst, int dstLen, int *srcReadPtr, int *dstWrotePtr, int *dstCharsPtr)); /* 332 */ + char * (*tcl_UtfToExternalDString) _ANSI_ARGS_((Tcl_Encoding encoding, CONST char *src, int srcLen, Tcl_DString *dsPtr)); /* 333 */ + int (*tcl_UtfToLower) _ANSI_ARGS_((char *src)); /* 334 */ + int (*tcl_UtfToTitle) _ANSI_ARGS_((char *src)); /* 335 */ + int (*tcl_UtfToUniChar) _ANSI_ARGS_((CONST char *src, Tcl_UniChar *chPtr)); /* 336 */ + int (*tcl_UtfToUpper) _ANSI_ARGS_((char *src)); /* 337 */ + int (*tcl_WriteChars) _ANSI_ARGS_((Tcl_Channel chan, CONST char *src, int srcLen)); /* 338 */ + int (*tcl_WriteObj) _ANSI_ARGS_((Tcl_Channel chan, Tcl_Obj *objPtr)); /* 339 */ + char * (*tcl_GetString) _ANSI_ARGS_((Tcl_Obj *objPtr)); /* 340 */ + CONST84_RETURN char * (*tcl_GetDefaultEncodingDir) _ANSI_ARGS_((void)); /* 341 */ + void (*tcl_SetDefaultEncodingDir) _ANSI_ARGS_((CONST char *path)); /* 342 */ + void (*tcl_AlertNotifier) _ANSI_ARGS_((ClientData clientData)); /* 343 */ + void (*tcl_ServiceModeHook) _ANSI_ARGS_((int mode)); /* 344 */ + int (*tcl_UniCharIsAlnum) _ANSI_ARGS_((int ch)); /* 345 */ + int (*tcl_UniCharIsAlpha) _ANSI_ARGS_((int ch)); /* 346 */ + int (*tcl_UniCharIsDigit) _ANSI_ARGS_((int ch)); /* 347 */ + int (*tcl_UniCharIsLower) _ANSI_ARGS_((int ch)); /* 348 */ + int (*tcl_UniCharIsSpace) _ANSI_ARGS_((int ch)); /* 349 */ + int (*tcl_UniCharIsUpper) _ANSI_ARGS_((int ch)); /* 350 */ + int (*tcl_UniCharIsWordChar) _ANSI_ARGS_((int ch)); /* 351 */ + int (*tcl_UniCharLen) _ANSI_ARGS_((CONST Tcl_UniChar *uniStr)); /* 352 */ + int (*tcl_UniCharNcmp) _ANSI_ARGS_((CONST Tcl_UniChar *ucs, CONST Tcl_UniChar *uct, unsigned long numChars)); /* 353 */ + char * (*tcl_UniCharToUtfDString) _ANSI_ARGS_((CONST Tcl_UniChar *uniStr, int uniLength, Tcl_DString *dsPtr)); /* 354 */ + Tcl_UniChar * (*tcl_UtfToUniCharDString) _ANSI_ARGS_((CONST char *src, int length, Tcl_DString *dsPtr)); /* 355 */ + Tcl_RegExp (*tcl_GetRegExpFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *patObj, int flags)); /* 356 */ + Tcl_Obj * (*tcl_EvalTokens) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Token *tokenPtr, int count)); /* 357 */ + void (*tcl_FreeParse) _ANSI_ARGS_((Tcl_Parse *parsePtr)); /* 358 */ + void (*tcl_LogCommandInfo) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *script, CONST char *command, int length)); /* 359 */ + int (*tcl_ParseBraces) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *start, int numBytes, Tcl_Parse *parsePtr, int append, CONST84 char **termPtr)); /* 360 */ + int (*tcl_ParseCommand) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *start, int numBytes, int nested, Tcl_Parse *parsePtr)); /* 361 */ + int (*tcl_ParseExpr) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *start, int numBytes, Tcl_Parse *parsePtr)); /* 362 */ + int (*tcl_ParseQuotedString) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *start, int numBytes, Tcl_Parse *parsePtr, int append, CONST84 char **termPtr)); /* 363 */ + int (*tcl_ParseVarName) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *start, int numBytes, Tcl_Parse *parsePtr, int append)); /* 364 */ + char * (*tcl_GetCwd) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_DString *cwdPtr)); /* 365 */ + int (*tcl_Chdir) _ANSI_ARGS_((CONST char *dirName)); /* 366 */ + int (*tcl_Access) _ANSI_ARGS_((CONST char *path, int mode)); /* 367 */ + int (*tcl_Stat) _ANSI_ARGS_((CONST char *path, struct stat *bufPtr)); /* 368 */ + int (*tcl_UtfNcmp) _ANSI_ARGS_((CONST char *s1, CONST char *s2, unsigned long n)); /* 369 */ + int (*tcl_UtfNcasecmp) _ANSI_ARGS_((CONST char *s1, CONST char *s2, unsigned long n)); /* 370 */ + int (*tcl_StringCaseMatch) _ANSI_ARGS_((CONST char *str, CONST char *pattern, int nocase)); /* 371 */ + int (*tcl_UniCharIsControl) _ANSI_ARGS_((int ch)); /* 372 */ + int (*tcl_UniCharIsGraph) _ANSI_ARGS_((int ch)); /* 373 */ + int (*tcl_UniCharIsPrint) _ANSI_ARGS_((int ch)); /* 374 */ + int (*tcl_UniCharIsPunct) _ANSI_ARGS_((int ch)); /* 375 */ + int (*tcl_RegExpExecObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_RegExp regexp, Tcl_Obj *textObj, int offset, int nmatches, int flags)); /* 376 */ + void (*tcl_RegExpGetInfo) _ANSI_ARGS_((Tcl_RegExp regexp, Tcl_RegExpInfo *infoPtr)); /* 377 */ + Tcl_Obj * (*tcl_NewUnicodeObj) _ANSI_ARGS_((CONST Tcl_UniChar *unicode, int numChars)); /* 378 */ + void (*tcl_SetUnicodeObj) _ANSI_ARGS_((Tcl_Obj *objPtr, CONST Tcl_UniChar *unicode, int numChars)); /* 379 */ + int (*tcl_GetCharLength) _ANSI_ARGS_((Tcl_Obj *objPtr)); /* 380 */ + Tcl_UniChar (*tcl_GetUniChar) _ANSI_ARGS_((Tcl_Obj *objPtr, int index)); /* 381 */ + Tcl_UniChar * (*tcl_GetUnicode) _ANSI_ARGS_((Tcl_Obj *objPtr)); /* 382 */ + Tcl_Obj * (*tcl_GetRange) _ANSI_ARGS_((Tcl_Obj *objPtr, int first, int last)); /* 383 */ + void (*tcl_AppendUnicodeToObj) _ANSI_ARGS_((Tcl_Obj *objPtr, CONST Tcl_UniChar *unicode, int length)); /* 384 */ + int (*tcl_RegExpMatchObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *textObj, Tcl_Obj *patternObj)); /* 385 */ + void (*tcl_SetNotifier) _ANSI_ARGS_((Tcl_NotifierProcs *notifierProcPtr)); /* 386 */ + Tcl_Mutex * (*tcl_GetAllocMutex) _ANSI_ARGS_((void)); /* 387 */ + int (*tcl_GetChannelNames) _ANSI_ARGS_((Tcl_Interp *interp)); /* 388 */ + int (*tcl_GetChannelNamesEx) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *pattern)); /* 389 */ + int (*tcl_ProcObjCmd) _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); /* 390 */ + void (*tcl_ConditionFinalize) _ANSI_ARGS_((Tcl_Condition *condPtr)); /* 391 */ + void (*tcl_MutexFinalize) _ANSI_ARGS_((Tcl_Mutex *mutex)); /* 392 */ + int (*tcl_CreateThread) _ANSI_ARGS_((Tcl_ThreadId *idPtr, Tcl_ThreadCreateProc proc, ClientData clientData, int stackSize, int flags)); /* 393 */ + int (*tcl_ReadRaw) _ANSI_ARGS_((Tcl_Channel chan, char *dst, int bytesToRead)); /* 394 */ + int (*tcl_WriteRaw) _ANSI_ARGS_((Tcl_Channel chan, CONST char *src, int srcLen)); /* 395 */ + Tcl_Channel (*tcl_GetTopChannel) _ANSI_ARGS_((Tcl_Channel chan)); /* 396 */ + int (*tcl_ChannelBuffered) _ANSI_ARGS_((Tcl_Channel chan)); /* 397 */ + CONST84_RETURN char * (*tcl_ChannelName) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 398 */ + Tcl_ChannelTypeVersion (*tcl_ChannelVersion) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 399 */ + Tcl_DriverBlockModeProc * (*tcl_ChannelBlockModeProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 400 */ + Tcl_DriverCloseProc * (*tcl_ChannelCloseProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 401 */ + Tcl_DriverClose2Proc * (*tcl_ChannelClose2Proc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 402 */ + Tcl_DriverInputProc * (*tcl_ChannelInputProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 403 */ + Tcl_DriverOutputProc * (*tcl_ChannelOutputProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 404 */ + Tcl_DriverSeekProc * (*tcl_ChannelSeekProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 405 */ + Tcl_DriverSetOptionProc * (*tcl_ChannelSetOptionProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 406 */ + Tcl_DriverGetOptionProc * (*tcl_ChannelGetOptionProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 407 */ + Tcl_DriverWatchProc * (*tcl_ChannelWatchProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 408 */ + Tcl_DriverGetHandleProc * (*tcl_ChannelGetHandleProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 409 */ + Tcl_DriverFlushProc * (*tcl_ChannelFlushProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 410 */ + Tcl_DriverHandlerProc * (*tcl_ChannelHandlerProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 411 */ + int (*tcl_JoinThread) _ANSI_ARGS_((Tcl_ThreadId threadId, int *result)); /* 412 */ + int (*tcl_IsChannelShared) _ANSI_ARGS_((Tcl_Channel channel)); /* 413 */ + int (*tcl_IsChannelRegistered) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Channel channel)); /* 414 */ + void (*tcl_CutChannel) _ANSI_ARGS_((Tcl_Channel channel)); /* 415 */ + void (*tcl_SpliceChannel) _ANSI_ARGS_((Tcl_Channel channel)); /* 416 */ + void (*tcl_ClearChannelHandlers) _ANSI_ARGS_((Tcl_Channel channel)); /* 417 */ + int (*tcl_IsChannelExisting) _ANSI_ARGS_((CONST char *channelName)); /* 418 */ + int (*tcl_UniCharNcasecmp) _ANSI_ARGS_((CONST Tcl_UniChar *ucs, CONST Tcl_UniChar *uct, unsigned long numChars)); /* 419 */ + int (*tcl_UniCharCaseMatch) _ANSI_ARGS_((CONST Tcl_UniChar *uniStr, CONST Tcl_UniChar *uniPattern, int nocase)); /* 420 */ + Tcl_HashEntry * (*tcl_FindHashEntry) _ANSI_ARGS_((Tcl_HashTable *tablePtr, CONST char *key)); /* 421 */ + Tcl_HashEntry * (*tcl_CreateHashEntry) _ANSI_ARGS_((Tcl_HashTable *tablePtr, CONST char *key, int *newPtr)); /* 422 */ + void (*tcl_InitCustomHashTable) _ANSI_ARGS_((Tcl_HashTable *tablePtr, int keyType, Tcl_HashKeyType *typePtr)); /* 423 */ + void (*tcl_InitObjHashTable) _ANSI_ARGS_((Tcl_HashTable *tablePtr)); /* 424 */ + ClientData (*tcl_CommandTraceInfo) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *varName, int flags, Tcl_CommandTraceProc *procPtr, ClientData prevClientData)); /* 425 */ + int (*tcl_TraceCommand) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *varName, int flags, Tcl_CommandTraceProc *proc, ClientData clientData)); /* 426 */ + void (*tcl_UntraceCommand) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *varName, int flags, Tcl_CommandTraceProc *proc, ClientData clientData)); /* 427 */ + char * (*tcl_AttemptAlloc) _ANSI_ARGS_((unsigned int size)); /* 428 */ + char * (*tcl_AttemptDbCkalloc) _ANSI_ARGS_((unsigned int size, CONST char *file, int line)); /* 429 */ + char * (*tcl_AttemptRealloc) _ANSI_ARGS_((char *ptr, unsigned int size)); /* 430 */ + char * (*tcl_AttemptDbCkrealloc) _ANSI_ARGS_((char *ptr, unsigned int size, CONST char *file, int line)); /* 431 */ + int (*tcl_AttemptSetObjLength) _ANSI_ARGS_((Tcl_Obj *objPtr, int length)); /* 432 */ + Tcl_ThreadId (*tcl_GetChannelThread) _ANSI_ARGS_((Tcl_Channel channel)); /* 433 */ + Tcl_UniChar * (*tcl_GetUnicodeFromObj) _ANSI_ARGS_((Tcl_Obj *objPtr, int *lengthPtr)); /* 434 */ + int (*tcl_GetMathFuncInfo) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, int *numArgsPtr, Tcl_ValueType **argTypesPtr, Tcl_MathProc **procPtr, ClientData *clientDataPtr)); /* 435 */ + Tcl_Obj * (*tcl_ListMathFuncs) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *pattern)); /* 436 */ + Tcl_Obj * (*tcl_SubstObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, int flags)); /* 437 */ + int (*tcl_DetachChannel) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Channel channel)); /* 438 */ + int (*tcl_IsStandardChannel) _ANSI_ARGS_((Tcl_Channel channel)); /* 439 */ + int (*tcl_FSCopyFile) _ANSI_ARGS_((Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr)); /* 440 */ + int (*tcl_FSCopyDirectory) _ANSI_ARGS_((Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr, Tcl_Obj **errorPtr)); /* 441 */ + int (*tcl_FSCreateDirectory) _ANSI_ARGS_((Tcl_Obj *pathPtr)); /* 442 */ + int (*tcl_FSDeleteFile) _ANSI_ARGS_((Tcl_Obj *pathPtr)); /* 443 */ + int (*tcl_FSLoadFile) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *pathPtr, CONST char *sym1, CONST char *sym2, Tcl_PackageInitProc **proc1Ptr, Tcl_PackageInitProc **proc2Ptr, Tcl_LoadHandle *handlePtr, Tcl_FSUnloadFileProc **unloadProcPtr)); /* 444 */ + int (*tcl_FSMatchInDirectory) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *result, Tcl_Obj *pathPtr, CONST char *pattern, Tcl_GlobTypeData *types)); /* 445 */ + Tcl_Obj * (*tcl_FSLink) _ANSI_ARGS_((Tcl_Obj *pathPtr, Tcl_Obj *toPtr, int linkAction)); /* 446 */ + int (*tcl_FSRemoveDirectory) _ANSI_ARGS_((Tcl_Obj *pathPtr, int recursive, Tcl_Obj **errorPtr)); /* 447 */ + int (*tcl_FSRenameFile) _ANSI_ARGS_((Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr)); /* 448 */ + int (*tcl_FSLstat) _ANSI_ARGS_((Tcl_Obj *pathPtr, Tcl_StatBuf *buf)); /* 449 */ + int (*tcl_FSUtime) _ANSI_ARGS_((Tcl_Obj *pathPtr, struct utimbuf *tval)); /* 450 */ + int (*tcl_FSFileAttrsGet) _ANSI_ARGS_((Tcl_Interp *interp, int index, Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef)); /* 451 */ + int (*tcl_FSFileAttrsSet) _ANSI_ARGS_((Tcl_Interp *interp, int index, Tcl_Obj *pathPtr, Tcl_Obj *objPtr)); /* 452 */ + CONST char ** (*tcl_FSFileAttrStrings) _ANSI_ARGS_((Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef)); /* 453 */ + int (*tcl_FSStat) _ANSI_ARGS_((Tcl_Obj *pathPtr, Tcl_StatBuf *buf)); /* 454 */ + int (*tcl_FSAccess) _ANSI_ARGS_((Tcl_Obj *pathPtr, int mode)); /* 455 */ + Tcl_Channel (*tcl_FSOpenFileChannel) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *pathPtr, CONST char *modeString, int permissions)); /* 456 */ + Tcl_Obj * (*tcl_FSGetCwd) _ANSI_ARGS_((Tcl_Interp *interp)); /* 457 */ + int (*tcl_FSChdir) _ANSI_ARGS_((Tcl_Obj *pathPtr)); /* 458 */ + int (*tcl_FSConvertToPathType) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *pathPtr)); /* 459 */ + Tcl_Obj * (*tcl_FSJoinPath) _ANSI_ARGS_((Tcl_Obj *listObj, int elements)); /* 460 */ + Tcl_Obj * (*tcl_FSSplitPath) _ANSI_ARGS_((Tcl_Obj *pathPtr, int *lenPtr)); /* 461 */ + int (*tcl_FSEqualPaths) _ANSI_ARGS_((Tcl_Obj *firstPtr, Tcl_Obj *secondPtr)); /* 462 */ + Tcl_Obj * (*tcl_FSGetNormalizedPath) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *pathPtr)); /* 463 */ + Tcl_Obj * (*tcl_FSJoinToPath) _ANSI_ARGS_((Tcl_Obj *pathPtr, int objc, Tcl_Obj *CONST objv[])); /* 464 */ + ClientData (*tcl_FSGetInternalRep) _ANSI_ARGS_((Tcl_Obj *pathPtr, Tcl_Filesystem *fsPtr)); /* 465 */ + Tcl_Obj * (*tcl_FSGetTranslatedPath) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *pathPtr)); /* 466 */ + int (*tcl_FSEvalFile) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *fileName)); /* 467 */ + Tcl_Obj * (*tcl_FSNewNativePath) _ANSI_ARGS_((Tcl_Filesystem *fromFilesystem, ClientData clientData)); /* 468 */ + CONST char * (*tcl_FSGetNativePath) _ANSI_ARGS_((Tcl_Obj *pathPtr)); /* 469 */ + Tcl_Obj * (*tcl_FSFileSystemInfo) _ANSI_ARGS_((Tcl_Obj *pathPtr)); /* 470 */ + Tcl_Obj * (*tcl_FSPathSeparator) _ANSI_ARGS_((Tcl_Obj *pathPtr)); /* 471 */ + Tcl_Obj * (*tcl_FSListVolumes) _ANSI_ARGS_((void)); /* 472 */ + int (*tcl_FSRegister) _ANSI_ARGS_((ClientData clientData, Tcl_Filesystem *fsPtr)); /* 473 */ + int (*tcl_FSUnregister) _ANSI_ARGS_((Tcl_Filesystem *fsPtr)); /* 474 */ + ClientData (*tcl_FSData) _ANSI_ARGS_((Tcl_Filesystem *fsPtr)); /* 475 */ + CONST char * (*tcl_FSGetTranslatedStringPath) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *pathPtr)); /* 476 */ + Tcl_Filesystem * (*tcl_FSGetFileSystemForPath) _ANSI_ARGS_((Tcl_Obj *pathPtr)); /* 477 */ + Tcl_PathType (*tcl_FSGetPathType) _ANSI_ARGS_((Tcl_Obj *pathPtr)); /* 478 */ + int (*tcl_OutputBuffered) _ANSI_ARGS_((Tcl_Channel chan)); /* 479 */ + void (*tcl_FSMountsChanged) _ANSI_ARGS_((Tcl_Filesystem *fsPtr)); /* 480 */ + int (*tcl_EvalTokensStandard) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Token *tokenPtr, int count)); /* 481 */ + void (*tcl_GetTime) _ANSI_ARGS_((Tcl_Time *timeBuf)); /* 482 */ + Tcl_Trace (*tcl_CreateObjTrace) _ANSI_ARGS_((Tcl_Interp *interp, int level, int flags, Tcl_CmdObjTraceProc *objProc, ClientData clientData, Tcl_CmdObjTraceDeleteProc *delProc)); /* 483 */ + int (*tcl_GetCommandInfoFromToken) _ANSI_ARGS_((Tcl_Command token, Tcl_CmdInfo *infoPtr)); /* 484 */ + int (*tcl_SetCommandInfoFromToken) _ANSI_ARGS_((Tcl_Command token, CONST Tcl_CmdInfo *infoPtr)); /* 485 */ + Tcl_Obj * (*tcl_DbNewWideIntObj) _ANSI_ARGS_((Tcl_WideInt wideValue, CONST char *file, int line)); /* 486 */ + int (*tcl_GetWideIntFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_WideInt *widePtr)); /* 487 */ + Tcl_Obj * (*tcl_NewWideIntObj) _ANSI_ARGS_((Tcl_WideInt wideValue)); /* 488 */ + void (*tcl_SetWideIntObj) _ANSI_ARGS_((Tcl_Obj *objPtr, Tcl_WideInt wideValue)); /* 489 */ + Tcl_StatBuf * (*tcl_AllocStatBuf) _ANSI_ARGS_((void)); /* 490 */ + Tcl_WideInt (*tcl_Seek) _ANSI_ARGS_((Tcl_Channel chan, Tcl_WideInt offset, int mode)); /* 491 */ + Tcl_WideInt (*tcl_Tell) _ANSI_ARGS_((Tcl_Channel chan)); /* 492 */ + Tcl_DriverWideSeekProc * (*tcl_ChannelWideSeekProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 493 */ + VOID *reserved494; + VOID *reserved495; + VOID *reserved496; + VOID *reserved497; + VOID *reserved498; + VOID *reserved499; + VOID *reserved500; + VOID *reserved501; + VOID *reserved502; + VOID *reserved503; + VOID *reserved504; + VOID *reserved505; + VOID *reserved506; + VOID *reserved507; + VOID *reserved508; + VOID *reserved509; + VOID *reserved510; + VOID *reserved511; + VOID *reserved512; + VOID *reserved513; + VOID *reserved514; + VOID *reserved515; + VOID *reserved516; + VOID *reserved517; + VOID *reserved518; + VOID *reserved519; + VOID *reserved520; + VOID *reserved521; + VOID *reserved522; + VOID *reserved523; + VOID *reserved524; + VOID *reserved525; + VOID *reserved526; + VOID *reserved527; + VOID *reserved528; + VOID *reserved529; + VOID *reserved530; + VOID *reserved531; + VOID *reserved532; + VOID *reserved533; + VOID *reserved534; + VOID *reserved535; + VOID *reserved536; + VOID *reserved537; + VOID *reserved538; + VOID *reserved539; + VOID *reserved540; + VOID *reserved541; + VOID *reserved542; + VOID *reserved543; + VOID *reserved544; + VOID *reserved545; + VOID *reserved546; + VOID *reserved547; + VOID *reserved548; + VOID *reserved549; + VOID *reserved550; + VOID *reserved551; + VOID *reserved552; + VOID *reserved553; + Tcl_DriverThreadActionProc * (*tcl_ChannelThreadActionProc) _ANSI_ARGS_((Tcl_ChannelType *chanTypePtr)); /* 554 */ + VOID *reserved555; + VOID *reserved556; + VOID *reserved557; + VOID *reserved558; + VOID *reserved559; + VOID *reserved560; + VOID *reserved561; + VOID *reserved562; + VOID *reserved563; + VOID *reserved564; + VOID *reserved565; + VOID *reserved566; + VOID *reserved567; + VOID *reserved568; + VOID *reserved569; + VOID *reserved570; + VOID *reserved571; + VOID *reserved572; + int (*tcl_PkgRequireProc) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, int objc, Tcl_Obj *CONST objv[], ClientData *clientDataPtr)); /* 573 */ + VOID *reserved574; + VOID *reserved575; + VOID *reserved576; + VOID *reserved577; + VOID *reserved578; + VOID *reserved579; + VOID *reserved580; + VOID *reserved581; + VOID *reserved582; + VOID *reserved583; + VOID *reserved584; + VOID *reserved585; + VOID *reserved586; + VOID *reserved587; + VOID *reserved588; + VOID *reserved589; + VOID *reserved590; + VOID *reserved591; + VOID *reserved592; + VOID *reserved593; + VOID *reserved594; + VOID *reserved595; + VOID *reserved596; + VOID *reserved597; + VOID *reserved598; + VOID *reserved599; + VOID *reserved600; + VOID *reserved601; + VOID *reserved602; + VOID *reserved603; + VOID *reserved604; + VOID *reserved605; + VOID *reserved606; + VOID *reserved607; + VOID *reserved608; + VOID *reserved609; + VOID *reserved610; + VOID *reserved611; + VOID *reserved612; + VOID *reserved613; + VOID *reserved614; + VOID *reserved615; + VOID *reserved616; + VOID *reserved617; + VOID *reserved618; + VOID *reserved619; + VOID *reserved620; + VOID *reserved621; + VOID *reserved622; + VOID *reserved623; + VOID *reserved624; + VOID *reserved625; + VOID *reserved626; + VOID *reserved627; + VOID *reserved628; + VOID *reserved629; + void (*tclUnusedStubEntry) _ANSI_ARGS_((void)); /* 630 */ +} TclStubs; + +#ifdef __cplusplus +extern "C" { +#endif +extern TclStubs *tclStubsPtr; +#ifdef __cplusplus +} +#endif + +#if defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) + +/* + * Inline function declarations: + */ + +#ifndef Tcl_PkgProvideEx +#define Tcl_PkgProvideEx \ + (tclStubsPtr->tcl_PkgProvideEx) /* 0 */ +#endif +#ifndef Tcl_PkgRequireEx +#define Tcl_PkgRequireEx \ + (tclStubsPtr->tcl_PkgRequireEx) /* 1 */ +#endif +#ifndef Tcl_Panic +#define Tcl_Panic \ + (tclStubsPtr->tcl_Panic) /* 2 */ +#endif +#ifndef Tcl_Alloc +#define Tcl_Alloc \ + (tclStubsPtr->tcl_Alloc) /* 3 */ +#endif +#ifndef Tcl_Free +#define Tcl_Free \ + (tclStubsPtr->tcl_Free) /* 4 */ +#endif +#ifndef Tcl_Realloc +#define Tcl_Realloc \ + (tclStubsPtr->tcl_Realloc) /* 5 */ +#endif +#ifndef Tcl_DbCkalloc +#define Tcl_DbCkalloc \ + (tclStubsPtr->tcl_DbCkalloc) /* 6 */ +#endif +#ifndef Tcl_DbCkfree +#define Tcl_DbCkfree \ + (tclStubsPtr->tcl_DbCkfree) /* 7 */ +#endif +#ifndef Tcl_DbCkrealloc +#define Tcl_DbCkrealloc \ + (tclStubsPtr->tcl_DbCkrealloc) /* 8 */ +#endif +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ +#ifndef Tcl_CreateFileHandler +#define Tcl_CreateFileHandler \ + (tclStubsPtr->tcl_CreateFileHandler) /* 9 */ +#endif +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#ifndef Tcl_CreateFileHandler +#define Tcl_CreateFileHandler \ + (tclStubsPtr->tcl_CreateFileHandler) /* 9 */ +#endif +#endif /* MACOSX */ +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ +#ifndef Tcl_DeleteFileHandler +#define Tcl_DeleteFileHandler \ + (tclStubsPtr->tcl_DeleteFileHandler) /* 10 */ +#endif +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#ifndef Tcl_DeleteFileHandler +#define Tcl_DeleteFileHandler \ + (tclStubsPtr->tcl_DeleteFileHandler) /* 10 */ +#endif +#endif /* MACOSX */ +#ifndef Tcl_SetTimer +#define Tcl_SetTimer \ + (tclStubsPtr->tcl_SetTimer) /* 11 */ +#endif +#ifndef Tcl_Sleep +#define Tcl_Sleep \ + (tclStubsPtr->tcl_Sleep) /* 12 */ +#endif +#ifndef Tcl_WaitForEvent +#define Tcl_WaitForEvent \ + (tclStubsPtr->tcl_WaitForEvent) /* 13 */ +#endif +#ifndef Tcl_AppendAllObjTypes +#define Tcl_AppendAllObjTypes \ + (tclStubsPtr->tcl_AppendAllObjTypes) /* 14 */ +#endif +#ifndef Tcl_AppendStringsToObj +#define Tcl_AppendStringsToObj \ + (tclStubsPtr->tcl_AppendStringsToObj) /* 15 */ +#endif +#ifndef Tcl_AppendToObj +#define Tcl_AppendToObj \ + (tclStubsPtr->tcl_AppendToObj) /* 16 */ +#endif +#ifndef Tcl_ConcatObj +#define Tcl_ConcatObj \ + (tclStubsPtr->tcl_ConcatObj) /* 17 */ +#endif +#ifndef Tcl_ConvertToType +#define Tcl_ConvertToType \ + (tclStubsPtr->tcl_ConvertToType) /* 18 */ +#endif +#ifndef Tcl_DbDecrRefCount +#define Tcl_DbDecrRefCount \ + (tclStubsPtr->tcl_DbDecrRefCount) /* 19 */ +#endif +#ifndef Tcl_DbIncrRefCount +#define Tcl_DbIncrRefCount \ + (tclStubsPtr->tcl_DbIncrRefCount) /* 20 */ +#endif +#ifndef Tcl_DbIsShared +#define Tcl_DbIsShared \ + (tclStubsPtr->tcl_DbIsShared) /* 21 */ +#endif +#ifndef Tcl_DbNewBooleanObj +#define Tcl_DbNewBooleanObj \ + (tclStubsPtr->tcl_DbNewBooleanObj) /* 22 */ +#endif +#ifndef Tcl_DbNewByteArrayObj +#define Tcl_DbNewByteArrayObj \ + (tclStubsPtr->tcl_DbNewByteArrayObj) /* 23 */ +#endif +#ifndef Tcl_DbNewDoubleObj +#define Tcl_DbNewDoubleObj \ + (tclStubsPtr->tcl_DbNewDoubleObj) /* 24 */ +#endif +#ifndef Tcl_DbNewListObj +#define Tcl_DbNewListObj \ + (tclStubsPtr->tcl_DbNewListObj) /* 25 */ +#endif +#ifndef Tcl_DbNewLongObj +#define Tcl_DbNewLongObj \ + (tclStubsPtr->tcl_DbNewLongObj) /* 26 */ +#endif +#ifndef Tcl_DbNewObj +#define Tcl_DbNewObj \ + (tclStubsPtr->tcl_DbNewObj) /* 27 */ +#endif +#ifndef Tcl_DbNewStringObj +#define Tcl_DbNewStringObj \ + (tclStubsPtr->tcl_DbNewStringObj) /* 28 */ +#endif +#ifndef Tcl_DuplicateObj +#define Tcl_DuplicateObj \ + (tclStubsPtr->tcl_DuplicateObj) /* 29 */ +#endif +#ifndef TclFreeObj +#define TclFreeObj \ + (tclStubsPtr->tclFreeObj) /* 30 */ +#endif +#ifndef Tcl_GetBoolean +#define Tcl_GetBoolean \ + (tclStubsPtr->tcl_GetBoolean) /* 31 */ +#endif +#ifndef Tcl_GetBooleanFromObj +#define Tcl_GetBooleanFromObj \ + (tclStubsPtr->tcl_GetBooleanFromObj) /* 32 */ +#endif +#ifndef Tcl_GetByteArrayFromObj +#define Tcl_GetByteArrayFromObj \ + (tclStubsPtr->tcl_GetByteArrayFromObj) /* 33 */ +#endif +#ifndef Tcl_GetDouble +#define Tcl_GetDouble \ + (tclStubsPtr->tcl_GetDouble) /* 34 */ +#endif +#ifndef Tcl_GetDoubleFromObj +#define Tcl_GetDoubleFromObj \ + (tclStubsPtr->tcl_GetDoubleFromObj) /* 35 */ +#endif +#ifndef Tcl_GetIndexFromObj +#define Tcl_GetIndexFromObj \ + (tclStubsPtr->tcl_GetIndexFromObj) /* 36 */ +#endif +#ifndef Tcl_GetInt +#define Tcl_GetInt \ + (tclStubsPtr->tcl_GetInt) /* 37 */ +#endif +#ifndef Tcl_GetIntFromObj +#define Tcl_GetIntFromObj \ + (tclStubsPtr->tcl_GetIntFromObj) /* 38 */ +#endif +#ifndef Tcl_GetLongFromObj +#define Tcl_GetLongFromObj \ + (tclStubsPtr->tcl_GetLongFromObj) /* 39 */ +#endif +#ifndef Tcl_GetObjType +#define Tcl_GetObjType \ + (tclStubsPtr->tcl_GetObjType) /* 40 */ +#endif +#ifndef Tcl_GetStringFromObj +#define Tcl_GetStringFromObj \ + (tclStubsPtr->tcl_GetStringFromObj) /* 41 */ +#endif +#ifndef Tcl_InvalidateStringRep +#define Tcl_InvalidateStringRep \ + (tclStubsPtr->tcl_InvalidateStringRep) /* 42 */ +#endif +#ifndef Tcl_ListObjAppendList +#define Tcl_ListObjAppendList \ + (tclStubsPtr->tcl_ListObjAppendList) /* 43 */ +#endif +#ifndef Tcl_ListObjAppendElement +#define Tcl_ListObjAppendElement \ + (tclStubsPtr->tcl_ListObjAppendElement) /* 44 */ +#endif +#ifndef Tcl_ListObjGetElements +#define Tcl_ListObjGetElements \ + (tclStubsPtr->tcl_ListObjGetElements) /* 45 */ +#endif +#ifndef Tcl_ListObjIndex +#define Tcl_ListObjIndex \ + (tclStubsPtr->tcl_ListObjIndex) /* 46 */ +#endif +#ifndef Tcl_ListObjLength +#define Tcl_ListObjLength \ + (tclStubsPtr->tcl_ListObjLength) /* 47 */ +#endif +#ifndef Tcl_ListObjReplace +#define Tcl_ListObjReplace \ + (tclStubsPtr->tcl_ListObjReplace) /* 48 */ +#endif +#ifndef Tcl_NewBooleanObj +#define Tcl_NewBooleanObj \ + (tclStubsPtr->tcl_NewBooleanObj) /* 49 */ +#endif +#ifndef Tcl_NewByteArrayObj +#define Tcl_NewByteArrayObj \ + (tclStubsPtr->tcl_NewByteArrayObj) /* 50 */ +#endif +#ifndef Tcl_NewDoubleObj +#define Tcl_NewDoubleObj \ + (tclStubsPtr->tcl_NewDoubleObj) /* 51 */ +#endif +#ifndef Tcl_NewIntObj +#define Tcl_NewIntObj \ + (tclStubsPtr->tcl_NewIntObj) /* 52 */ +#endif +#ifndef Tcl_NewListObj +#define Tcl_NewListObj \ + (tclStubsPtr->tcl_NewListObj) /* 53 */ +#endif +#ifndef Tcl_NewLongObj +#define Tcl_NewLongObj \ + (tclStubsPtr->tcl_NewLongObj) /* 54 */ +#endif +#ifndef Tcl_NewObj +#define Tcl_NewObj \ + (tclStubsPtr->tcl_NewObj) /* 55 */ +#endif +#ifndef Tcl_NewStringObj +#define Tcl_NewStringObj \ + (tclStubsPtr->tcl_NewStringObj) /* 56 */ +#endif +#ifndef Tcl_SetBooleanObj +#define Tcl_SetBooleanObj \ + (tclStubsPtr->tcl_SetBooleanObj) /* 57 */ +#endif +#ifndef Tcl_SetByteArrayLength +#define Tcl_SetByteArrayLength \ + (tclStubsPtr->tcl_SetByteArrayLength) /* 58 */ +#endif +#ifndef Tcl_SetByteArrayObj +#define Tcl_SetByteArrayObj \ + (tclStubsPtr->tcl_SetByteArrayObj) /* 59 */ +#endif +#ifndef Tcl_SetDoubleObj +#define Tcl_SetDoubleObj \ + (tclStubsPtr->tcl_SetDoubleObj) /* 60 */ +#endif +#ifndef Tcl_SetIntObj +#define Tcl_SetIntObj \ + (tclStubsPtr->tcl_SetIntObj) /* 61 */ +#endif +#ifndef Tcl_SetListObj +#define Tcl_SetListObj \ + (tclStubsPtr->tcl_SetListObj) /* 62 */ +#endif +#ifndef Tcl_SetLongObj +#define Tcl_SetLongObj \ + (tclStubsPtr->tcl_SetLongObj) /* 63 */ +#endif +#ifndef Tcl_SetObjLength +#define Tcl_SetObjLength \ + (tclStubsPtr->tcl_SetObjLength) /* 64 */ +#endif +#ifndef Tcl_SetStringObj +#define Tcl_SetStringObj \ + (tclStubsPtr->tcl_SetStringObj) /* 65 */ +#endif +#ifndef Tcl_AddErrorInfo +#define Tcl_AddErrorInfo \ + (tclStubsPtr->tcl_AddErrorInfo) /* 66 */ +#endif +#ifndef Tcl_AddObjErrorInfo +#define Tcl_AddObjErrorInfo \ + (tclStubsPtr->tcl_AddObjErrorInfo) /* 67 */ +#endif +#ifndef Tcl_AllowExceptions +#define Tcl_AllowExceptions \ + (tclStubsPtr->tcl_AllowExceptions) /* 68 */ +#endif +#ifndef Tcl_AppendElement +#define Tcl_AppendElement \ + (tclStubsPtr->tcl_AppendElement) /* 69 */ +#endif +#ifndef Tcl_AppendResult +#define Tcl_AppendResult \ + (tclStubsPtr->tcl_AppendResult) /* 70 */ +#endif +#ifndef Tcl_AsyncCreate +#define Tcl_AsyncCreate \ + (tclStubsPtr->tcl_AsyncCreate) /* 71 */ +#endif +#ifndef Tcl_AsyncDelete +#define Tcl_AsyncDelete \ + (tclStubsPtr->tcl_AsyncDelete) /* 72 */ +#endif +#ifndef Tcl_AsyncInvoke +#define Tcl_AsyncInvoke \ + (tclStubsPtr->tcl_AsyncInvoke) /* 73 */ +#endif +#ifndef Tcl_AsyncMark +#define Tcl_AsyncMark \ + (tclStubsPtr->tcl_AsyncMark) /* 74 */ +#endif +#ifndef Tcl_AsyncReady +#define Tcl_AsyncReady \ + (tclStubsPtr->tcl_AsyncReady) /* 75 */ +#endif +#ifndef Tcl_BackgroundError +#define Tcl_BackgroundError \ + (tclStubsPtr->tcl_BackgroundError) /* 76 */ +#endif +#ifndef Tcl_Backslash +#define Tcl_Backslash \ + (tclStubsPtr->tcl_Backslash) /* 77 */ +#endif +#ifndef Tcl_BadChannelOption +#define Tcl_BadChannelOption \ + (tclStubsPtr->tcl_BadChannelOption) /* 78 */ +#endif +#ifndef Tcl_CallWhenDeleted +#define Tcl_CallWhenDeleted \ + (tclStubsPtr->tcl_CallWhenDeleted) /* 79 */ +#endif +#ifndef Tcl_CancelIdleCall +#define Tcl_CancelIdleCall \ + (tclStubsPtr->tcl_CancelIdleCall) /* 80 */ +#endif +#ifndef Tcl_Close +#define Tcl_Close \ + (tclStubsPtr->tcl_Close) /* 81 */ +#endif +#ifndef Tcl_CommandComplete +#define Tcl_CommandComplete \ + (tclStubsPtr->tcl_CommandComplete) /* 82 */ +#endif +#ifndef Tcl_Concat +#define Tcl_Concat \ + (tclStubsPtr->tcl_Concat) /* 83 */ +#endif +#ifndef Tcl_ConvertElement +#define Tcl_ConvertElement \ + (tclStubsPtr->tcl_ConvertElement) /* 84 */ +#endif +#ifndef Tcl_ConvertCountedElement +#define Tcl_ConvertCountedElement \ + (tclStubsPtr->tcl_ConvertCountedElement) /* 85 */ +#endif +#ifndef Tcl_CreateAlias +#define Tcl_CreateAlias \ + (tclStubsPtr->tcl_CreateAlias) /* 86 */ +#endif +#ifndef Tcl_CreateAliasObj +#define Tcl_CreateAliasObj \ + (tclStubsPtr->tcl_CreateAliasObj) /* 87 */ +#endif +#ifndef Tcl_CreateChannel +#define Tcl_CreateChannel \ + (tclStubsPtr->tcl_CreateChannel) /* 88 */ +#endif +#ifndef Tcl_CreateChannelHandler +#define Tcl_CreateChannelHandler \ + (tclStubsPtr->tcl_CreateChannelHandler) /* 89 */ +#endif +#ifndef Tcl_CreateCloseHandler +#define Tcl_CreateCloseHandler \ + (tclStubsPtr->tcl_CreateCloseHandler) /* 90 */ +#endif +#ifndef Tcl_CreateCommand +#define Tcl_CreateCommand \ + (tclStubsPtr->tcl_CreateCommand) /* 91 */ +#endif +#ifndef Tcl_CreateEventSource +#define Tcl_CreateEventSource \ + (tclStubsPtr->tcl_CreateEventSource) /* 92 */ +#endif +#ifndef Tcl_CreateExitHandler +#define Tcl_CreateExitHandler \ + (tclStubsPtr->tcl_CreateExitHandler) /* 93 */ +#endif +#ifndef Tcl_CreateInterp +#define Tcl_CreateInterp \ + (tclStubsPtr->tcl_CreateInterp) /* 94 */ +#endif +#ifndef Tcl_CreateMathFunc +#define Tcl_CreateMathFunc \ + (tclStubsPtr->tcl_CreateMathFunc) /* 95 */ +#endif +#ifndef Tcl_CreateObjCommand +#define Tcl_CreateObjCommand \ + (tclStubsPtr->tcl_CreateObjCommand) /* 96 */ +#endif +#ifndef Tcl_CreateSlave +#define Tcl_CreateSlave \ + (tclStubsPtr->tcl_CreateSlave) /* 97 */ +#endif +#ifndef Tcl_CreateTimerHandler +#define Tcl_CreateTimerHandler \ + (tclStubsPtr->tcl_CreateTimerHandler) /* 98 */ +#endif +#ifndef Tcl_CreateTrace +#define Tcl_CreateTrace \ + (tclStubsPtr->tcl_CreateTrace) /* 99 */ +#endif +#ifndef Tcl_DeleteAssocData +#define Tcl_DeleteAssocData \ + (tclStubsPtr->tcl_DeleteAssocData) /* 100 */ +#endif +#ifndef Tcl_DeleteChannelHandler +#define Tcl_DeleteChannelHandler \ + (tclStubsPtr->tcl_DeleteChannelHandler) /* 101 */ +#endif +#ifndef Tcl_DeleteCloseHandler +#define Tcl_DeleteCloseHandler \ + (tclStubsPtr->tcl_DeleteCloseHandler) /* 102 */ +#endif +#ifndef Tcl_DeleteCommand +#define Tcl_DeleteCommand \ + (tclStubsPtr->tcl_DeleteCommand) /* 103 */ +#endif +#ifndef Tcl_DeleteCommandFromToken +#define Tcl_DeleteCommandFromToken \ + (tclStubsPtr->tcl_DeleteCommandFromToken) /* 104 */ +#endif +#ifndef Tcl_DeleteEvents +#define Tcl_DeleteEvents \ + (tclStubsPtr->tcl_DeleteEvents) /* 105 */ +#endif +#ifndef Tcl_DeleteEventSource +#define Tcl_DeleteEventSource \ + (tclStubsPtr->tcl_DeleteEventSource) /* 106 */ +#endif +#ifndef Tcl_DeleteExitHandler +#define Tcl_DeleteExitHandler \ + (tclStubsPtr->tcl_DeleteExitHandler) /* 107 */ +#endif +#ifndef Tcl_DeleteHashEntry +#define Tcl_DeleteHashEntry \ + (tclStubsPtr->tcl_DeleteHashEntry) /* 108 */ +#endif +#ifndef Tcl_DeleteHashTable +#define Tcl_DeleteHashTable \ + (tclStubsPtr->tcl_DeleteHashTable) /* 109 */ +#endif +#ifndef Tcl_DeleteInterp +#define Tcl_DeleteInterp \ + (tclStubsPtr->tcl_DeleteInterp) /* 110 */ +#endif +#ifndef Tcl_DetachPids +#define Tcl_DetachPids \ + (tclStubsPtr->tcl_DetachPids) /* 111 */ +#endif +#ifndef Tcl_DeleteTimerHandler +#define Tcl_DeleteTimerHandler \ + (tclStubsPtr->tcl_DeleteTimerHandler) /* 112 */ +#endif +#ifndef Tcl_DeleteTrace +#define Tcl_DeleteTrace \ + (tclStubsPtr->tcl_DeleteTrace) /* 113 */ +#endif +#ifndef Tcl_DontCallWhenDeleted +#define Tcl_DontCallWhenDeleted \ + (tclStubsPtr->tcl_DontCallWhenDeleted) /* 114 */ +#endif +#ifndef Tcl_DoOneEvent +#define Tcl_DoOneEvent \ + (tclStubsPtr->tcl_DoOneEvent) /* 115 */ +#endif +#ifndef Tcl_DoWhenIdle +#define Tcl_DoWhenIdle \ + (tclStubsPtr->tcl_DoWhenIdle) /* 116 */ +#endif +#ifndef Tcl_DStringAppend +#define Tcl_DStringAppend \ + (tclStubsPtr->tcl_DStringAppend) /* 117 */ +#endif +#ifndef Tcl_DStringAppendElement +#define Tcl_DStringAppendElement \ + (tclStubsPtr->tcl_DStringAppendElement) /* 118 */ +#endif +#ifndef Tcl_DStringEndSublist +#define Tcl_DStringEndSublist \ + (tclStubsPtr->tcl_DStringEndSublist) /* 119 */ +#endif +#ifndef Tcl_DStringFree +#define Tcl_DStringFree \ + (tclStubsPtr->tcl_DStringFree) /* 120 */ +#endif +#ifndef Tcl_DStringGetResult +#define Tcl_DStringGetResult \ + (tclStubsPtr->tcl_DStringGetResult) /* 121 */ +#endif +#ifndef Tcl_DStringInit +#define Tcl_DStringInit \ + (tclStubsPtr->tcl_DStringInit) /* 122 */ +#endif +#ifndef Tcl_DStringResult +#define Tcl_DStringResult \ + (tclStubsPtr->tcl_DStringResult) /* 123 */ +#endif +#ifndef Tcl_DStringSetLength +#define Tcl_DStringSetLength \ + (tclStubsPtr->tcl_DStringSetLength) /* 124 */ +#endif +#ifndef Tcl_DStringStartSublist +#define Tcl_DStringStartSublist \ + (tclStubsPtr->tcl_DStringStartSublist) /* 125 */ +#endif +#ifndef Tcl_Eof +#define Tcl_Eof \ + (tclStubsPtr->tcl_Eof) /* 126 */ +#endif +#ifndef Tcl_ErrnoId +#define Tcl_ErrnoId \ + (tclStubsPtr->tcl_ErrnoId) /* 127 */ +#endif +#ifndef Tcl_ErrnoMsg +#define Tcl_ErrnoMsg \ + (tclStubsPtr->tcl_ErrnoMsg) /* 128 */ +#endif +#ifndef Tcl_Eval +#define Tcl_Eval \ + (tclStubsPtr->tcl_Eval) /* 129 */ +#endif +#ifndef Tcl_EvalFile +#define Tcl_EvalFile \ + (tclStubsPtr->tcl_EvalFile) /* 130 */ +#endif +#ifndef Tcl_EvalObj +#define Tcl_EvalObj \ + (tclStubsPtr->tcl_EvalObj) /* 131 */ +#endif +#ifndef Tcl_EventuallyFree +#define Tcl_EventuallyFree \ + (tclStubsPtr->tcl_EventuallyFree) /* 132 */ +#endif +#ifndef Tcl_Exit +#define Tcl_Exit \ + (tclStubsPtr->tcl_Exit) /* 133 */ +#endif +#ifndef Tcl_ExposeCommand +#define Tcl_ExposeCommand \ + (tclStubsPtr->tcl_ExposeCommand) /* 134 */ +#endif +#ifndef Tcl_ExprBoolean +#define Tcl_ExprBoolean \ + (tclStubsPtr->tcl_ExprBoolean) /* 135 */ +#endif +#ifndef Tcl_ExprBooleanObj +#define Tcl_ExprBooleanObj \ + (tclStubsPtr->tcl_ExprBooleanObj) /* 136 */ +#endif +#ifndef Tcl_ExprDouble +#define Tcl_ExprDouble \ + (tclStubsPtr->tcl_ExprDouble) /* 137 */ +#endif +#ifndef Tcl_ExprDoubleObj +#define Tcl_ExprDoubleObj \ + (tclStubsPtr->tcl_ExprDoubleObj) /* 138 */ +#endif +#ifndef Tcl_ExprLong +#define Tcl_ExprLong \ + (tclStubsPtr->tcl_ExprLong) /* 139 */ +#endif +#ifndef Tcl_ExprLongObj +#define Tcl_ExprLongObj \ + (tclStubsPtr->tcl_ExprLongObj) /* 140 */ +#endif +#ifndef Tcl_ExprObj +#define Tcl_ExprObj \ + (tclStubsPtr->tcl_ExprObj) /* 141 */ +#endif +#ifndef Tcl_ExprString +#define Tcl_ExprString \ + (tclStubsPtr->tcl_ExprString) /* 142 */ +#endif +#ifndef Tcl_Finalize +#define Tcl_Finalize \ + (tclStubsPtr->tcl_Finalize) /* 143 */ +#endif +#ifndef Tcl_FindExecutable +#define Tcl_FindExecutable \ + (tclStubsPtr->tcl_FindExecutable) /* 144 */ +#endif +#ifndef Tcl_FirstHashEntry +#define Tcl_FirstHashEntry \ + (tclStubsPtr->tcl_FirstHashEntry) /* 145 */ +#endif +#ifndef Tcl_Flush +#define Tcl_Flush \ + (tclStubsPtr->tcl_Flush) /* 146 */ +#endif +#ifndef Tcl_FreeResult +#define Tcl_FreeResult \ + (tclStubsPtr->tcl_FreeResult) /* 147 */ +#endif +#ifndef Tcl_GetAlias +#define Tcl_GetAlias \ + (tclStubsPtr->tcl_GetAlias) /* 148 */ +#endif +#ifndef Tcl_GetAliasObj +#define Tcl_GetAliasObj \ + (tclStubsPtr->tcl_GetAliasObj) /* 149 */ +#endif +#ifndef Tcl_GetAssocData +#define Tcl_GetAssocData \ + (tclStubsPtr->tcl_GetAssocData) /* 150 */ +#endif +#ifndef Tcl_GetChannel +#define Tcl_GetChannel \ + (tclStubsPtr->tcl_GetChannel) /* 151 */ +#endif +#ifndef Tcl_GetChannelBufferSize +#define Tcl_GetChannelBufferSize \ + (tclStubsPtr->tcl_GetChannelBufferSize) /* 152 */ +#endif +#ifndef Tcl_GetChannelHandle +#define Tcl_GetChannelHandle \ + (tclStubsPtr->tcl_GetChannelHandle) /* 153 */ +#endif +#ifndef Tcl_GetChannelInstanceData +#define Tcl_GetChannelInstanceData \ + (tclStubsPtr->tcl_GetChannelInstanceData) /* 154 */ +#endif +#ifndef Tcl_GetChannelMode +#define Tcl_GetChannelMode \ + (tclStubsPtr->tcl_GetChannelMode) /* 155 */ +#endif +#ifndef Tcl_GetChannelName +#define Tcl_GetChannelName \ + (tclStubsPtr->tcl_GetChannelName) /* 156 */ +#endif +#ifndef Tcl_GetChannelOption +#define Tcl_GetChannelOption \ + (tclStubsPtr->tcl_GetChannelOption) /* 157 */ +#endif +#ifndef Tcl_GetChannelType +#define Tcl_GetChannelType \ + (tclStubsPtr->tcl_GetChannelType) /* 158 */ +#endif +#ifndef Tcl_GetCommandInfo +#define Tcl_GetCommandInfo \ + (tclStubsPtr->tcl_GetCommandInfo) /* 159 */ +#endif +#ifndef Tcl_GetCommandName +#define Tcl_GetCommandName \ + (tclStubsPtr->tcl_GetCommandName) /* 160 */ +#endif +#ifndef Tcl_GetErrno +#define Tcl_GetErrno \ + (tclStubsPtr->tcl_GetErrno) /* 161 */ +#endif +#ifndef Tcl_GetHostName +#define Tcl_GetHostName \ + (tclStubsPtr->tcl_GetHostName) /* 162 */ +#endif +#ifndef Tcl_GetInterpPath +#define Tcl_GetInterpPath \ + (tclStubsPtr->tcl_GetInterpPath) /* 163 */ +#endif +#ifndef Tcl_GetMaster +#define Tcl_GetMaster \ + (tclStubsPtr->tcl_GetMaster) /* 164 */ +#endif +#ifndef Tcl_GetNameOfExecutable +#define Tcl_GetNameOfExecutable \ + (tclStubsPtr->tcl_GetNameOfExecutable) /* 165 */ +#endif +#ifndef Tcl_GetObjResult +#define Tcl_GetObjResult \ + (tclStubsPtr->tcl_GetObjResult) /* 166 */ +#endif +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ +#ifndef Tcl_GetOpenFile +#define Tcl_GetOpenFile \ + (tclStubsPtr->tcl_GetOpenFile) /* 167 */ +#endif +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#ifndef Tcl_GetOpenFile +#define Tcl_GetOpenFile \ + (tclStubsPtr->tcl_GetOpenFile) /* 167 */ +#endif +#endif /* MACOSX */ +#ifndef Tcl_GetPathType +#define Tcl_GetPathType \ + (tclStubsPtr->tcl_GetPathType) /* 168 */ +#endif +#ifndef Tcl_Gets +#define Tcl_Gets \ + (tclStubsPtr->tcl_Gets) /* 169 */ +#endif +#ifndef Tcl_GetsObj +#define Tcl_GetsObj \ + (tclStubsPtr->tcl_GetsObj) /* 170 */ +#endif +#ifndef Tcl_GetServiceMode +#define Tcl_GetServiceMode \ + (tclStubsPtr->tcl_GetServiceMode) /* 171 */ +#endif +#ifndef Tcl_GetSlave +#define Tcl_GetSlave \ + (tclStubsPtr->tcl_GetSlave) /* 172 */ +#endif +#ifndef Tcl_GetStdChannel +#define Tcl_GetStdChannel \ + (tclStubsPtr->tcl_GetStdChannel) /* 173 */ +#endif +#ifndef Tcl_GetStringResult +#define Tcl_GetStringResult \ + (tclStubsPtr->tcl_GetStringResult) /* 174 */ +#endif +#ifndef Tcl_GetVar +#define Tcl_GetVar \ + (tclStubsPtr->tcl_GetVar) /* 175 */ +#endif +#ifndef Tcl_GetVar2 +#define Tcl_GetVar2 \ + (tclStubsPtr->tcl_GetVar2) /* 176 */ +#endif +#ifndef Tcl_GlobalEval +#define Tcl_GlobalEval \ + (tclStubsPtr->tcl_GlobalEval) /* 177 */ +#endif +#ifndef Tcl_GlobalEvalObj +#define Tcl_GlobalEvalObj \ + (tclStubsPtr->tcl_GlobalEvalObj) /* 178 */ +#endif +#ifndef Tcl_HideCommand +#define Tcl_HideCommand \ + (tclStubsPtr->tcl_HideCommand) /* 179 */ +#endif +#ifndef Tcl_Init +#define Tcl_Init \ + (tclStubsPtr->tcl_Init) /* 180 */ +#endif +#ifndef Tcl_InitHashTable +#define Tcl_InitHashTable \ + (tclStubsPtr->tcl_InitHashTable) /* 181 */ +#endif +#ifndef Tcl_InputBlocked +#define Tcl_InputBlocked \ + (tclStubsPtr->tcl_InputBlocked) /* 182 */ +#endif +#ifndef Tcl_InputBuffered +#define Tcl_InputBuffered \ + (tclStubsPtr->tcl_InputBuffered) /* 183 */ +#endif +#ifndef Tcl_InterpDeleted +#define Tcl_InterpDeleted \ + (tclStubsPtr->tcl_InterpDeleted) /* 184 */ +#endif +#ifndef Tcl_IsSafe +#define Tcl_IsSafe \ + (tclStubsPtr->tcl_IsSafe) /* 185 */ +#endif +#ifndef Tcl_JoinPath +#define Tcl_JoinPath \ + (tclStubsPtr->tcl_JoinPath) /* 186 */ +#endif +#ifndef Tcl_LinkVar +#define Tcl_LinkVar \ + (tclStubsPtr->tcl_LinkVar) /* 187 */ +#endif +/* Slot 188 is reserved */ +#ifndef Tcl_MakeFileChannel +#define Tcl_MakeFileChannel \ + (tclStubsPtr->tcl_MakeFileChannel) /* 189 */ +#endif +#ifndef Tcl_MakeSafe +#define Tcl_MakeSafe \ + (tclStubsPtr->tcl_MakeSafe) /* 190 */ +#endif +#ifndef Tcl_MakeTcpClientChannel +#define Tcl_MakeTcpClientChannel \ + (tclStubsPtr->tcl_MakeTcpClientChannel) /* 191 */ +#endif +#ifndef Tcl_Merge +#define Tcl_Merge \ + (tclStubsPtr->tcl_Merge) /* 192 */ +#endif +#ifndef Tcl_NextHashEntry +#define Tcl_NextHashEntry \ + (tclStubsPtr->tcl_NextHashEntry) /* 193 */ +#endif +#ifndef Tcl_NotifyChannel +#define Tcl_NotifyChannel \ + (tclStubsPtr->tcl_NotifyChannel) /* 194 */ +#endif +#ifndef Tcl_ObjGetVar2 +#define Tcl_ObjGetVar2 \ + (tclStubsPtr->tcl_ObjGetVar2) /* 195 */ +#endif +#ifndef Tcl_ObjSetVar2 +#define Tcl_ObjSetVar2 \ + (tclStubsPtr->tcl_ObjSetVar2) /* 196 */ +#endif +#ifndef Tcl_OpenCommandChannel +#define Tcl_OpenCommandChannel \ + (tclStubsPtr->tcl_OpenCommandChannel) /* 197 */ +#endif +#ifndef Tcl_OpenFileChannel +#define Tcl_OpenFileChannel \ + (tclStubsPtr->tcl_OpenFileChannel) /* 198 */ +#endif +#ifndef Tcl_OpenTcpClient +#define Tcl_OpenTcpClient \ + (tclStubsPtr->tcl_OpenTcpClient) /* 199 */ +#endif +#ifndef Tcl_OpenTcpServer +#define Tcl_OpenTcpServer \ + (tclStubsPtr->tcl_OpenTcpServer) /* 200 */ +#endif +#ifndef Tcl_Preserve +#define Tcl_Preserve \ + (tclStubsPtr->tcl_Preserve) /* 201 */ +#endif +#ifndef Tcl_PrintDouble +#define Tcl_PrintDouble \ + (tclStubsPtr->tcl_PrintDouble) /* 202 */ +#endif +#ifndef Tcl_PutEnv +#define Tcl_PutEnv \ + (tclStubsPtr->tcl_PutEnv) /* 203 */ +#endif +#ifndef Tcl_PosixError +#define Tcl_PosixError \ + (tclStubsPtr->tcl_PosixError) /* 204 */ +#endif +#ifndef Tcl_QueueEvent +#define Tcl_QueueEvent \ + (tclStubsPtr->tcl_QueueEvent) /* 205 */ +#endif +#ifndef Tcl_Read +#define Tcl_Read \ + (tclStubsPtr->tcl_Read) /* 206 */ +#endif +#ifndef Tcl_ReapDetachedProcs +#define Tcl_ReapDetachedProcs \ + (tclStubsPtr->tcl_ReapDetachedProcs) /* 207 */ +#endif +#ifndef Tcl_RecordAndEval +#define Tcl_RecordAndEval \ + (tclStubsPtr->tcl_RecordAndEval) /* 208 */ +#endif +#ifndef Tcl_RecordAndEvalObj +#define Tcl_RecordAndEvalObj \ + (tclStubsPtr->tcl_RecordAndEvalObj) /* 209 */ +#endif +#ifndef Tcl_RegisterChannel +#define Tcl_RegisterChannel \ + (tclStubsPtr->tcl_RegisterChannel) /* 210 */ +#endif +#ifndef Tcl_RegisterObjType +#define Tcl_RegisterObjType \ + (tclStubsPtr->tcl_RegisterObjType) /* 211 */ +#endif +#ifndef Tcl_RegExpCompile +#define Tcl_RegExpCompile \ + (tclStubsPtr->tcl_RegExpCompile) /* 212 */ +#endif +#ifndef Tcl_RegExpExec +#define Tcl_RegExpExec \ + (tclStubsPtr->tcl_RegExpExec) /* 213 */ +#endif +#ifndef Tcl_RegExpMatch +#define Tcl_RegExpMatch \ + (tclStubsPtr->tcl_RegExpMatch) /* 214 */ +#endif +#ifndef Tcl_RegExpRange +#define Tcl_RegExpRange \ + (tclStubsPtr->tcl_RegExpRange) /* 215 */ +#endif +#ifndef Tcl_Release +#define Tcl_Release \ + (tclStubsPtr->tcl_Release) /* 216 */ +#endif +#ifndef Tcl_ResetResult +#define Tcl_ResetResult \ + (tclStubsPtr->tcl_ResetResult) /* 217 */ +#endif +#ifndef Tcl_ScanElement +#define Tcl_ScanElement \ + (tclStubsPtr->tcl_ScanElement) /* 218 */ +#endif +#ifndef Tcl_ScanCountedElement +#define Tcl_ScanCountedElement \ + (tclStubsPtr->tcl_ScanCountedElement) /* 219 */ +#endif +#ifndef Tcl_SeekOld +#define Tcl_SeekOld \ + (tclStubsPtr->tcl_SeekOld) /* 220 */ +#endif +#ifndef Tcl_ServiceAll +#define Tcl_ServiceAll \ + (tclStubsPtr->tcl_ServiceAll) /* 221 */ +#endif +#ifndef Tcl_ServiceEvent +#define Tcl_ServiceEvent \ + (tclStubsPtr->tcl_ServiceEvent) /* 222 */ +#endif +#ifndef Tcl_SetAssocData +#define Tcl_SetAssocData \ + (tclStubsPtr->tcl_SetAssocData) /* 223 */ +#endif +#ifndef Tcl_SetChannelBufferSize +#define Tcl_SetChannelBufferSize \ + (tclStubsPtr->tcl_SetChannelBufferSize) /* 224 */ +#endif +#ifndef Tcl_SetChannelOption +#define Tcl_SetChannelOption \ + (tclStubsPtr->tcl_SetChannelOption) /* 225 */ +#endif +#ifndef Tcl_SetCommandInfo +#define Tcl_SetCommandInfo \ + (tclStubsPtr->tcl_SetCommandInfo) /* 226 */ +#endif +#ifndef Tcl_SetErrno +#define Tcl_SetErrno \ + (tclStubsPtr->tcl_SetErrno) /* 227 */ +#endif +#ifndef Tcl_SetErrorCode +#define Tcl_SetErrorCode \ + (tclStubsPtr->tcl_SetErrorCode) /* 228 */ +#endif +#ifndef Tcl_SetMaxBlockTime +#define Tcl_SetMaxBlockTime \ + (tclStubsPtr->tcl_SetMaxBlockTime) /* 229 */ +#endif +#ifndef Tcl_SetPanicProc +#define Tcl_SetPanicProc \ + (tclStubsPtr->tcl_SetPanicProc) /* 230 */ +#endif +#ifndef Tcl_SetRecursionLimit +#define Tcl_SetRecursionLimit \ + (tclStubsPtr->tcl_SetRecursionLimit) /* 231 */ +#endif +#ifndef Tcl_SetResult +#define Tcl_SetResult \ + (tclStubsPtr->tcl_SetResult) /* 232 */ +#endif +#ifndef Tcl_SetServiceMode +#define Tcl_SetServiceMode \ + (tclStubsPtr->tcl_SetServiceMode) /* 233 */ +#endif +#ifndef Tcl_SetObjErrorCode +#define Tcl_SetObjErrorCode \ + (tclStubsPtr->tcl_SetObjErrorCode) /* 234 */ +#endif +#ifndef Tcl_SetObjResult +#define Tcl_SetObjResult \ + (tclStubsPtr->tcl_SetObjResult) /* 235 */ +#endif +#ifndef Tcl_SetStdChannel +#define Tcl_SetStdChannel \ + (tclStubsPtr->tcl_SetStdChannel) /* 236 */ +#endif +#ifndef Tcl_SetVar +#define Tcl_SetVar \ + (tclStubsPtr->tcl_SetVar) /* 237 */ +#endif +#ifndef Tcl_SetVar2 +#define Tcl_SetVar2 \ + (tclStubsPtr->tcl_SetVar2) /* 238 */ +#endif +#ifndef Tcl_SignalId +#define Tcl_SignalId \ + (tclStubsPtr->tcl_SignalId) /* 239 */ +#endif +#ifndef Tcl_SignalMsg +#define Tcl_SignalMsg \ + (tclStubsPtr->tcl_SignalMsg) /* 240 */ +#endif +#ifndef Tcl_SourceRCFile +#define Tcl_SourceRCFile \ + (tclStubsPtr->tcl_SourceRCFile) /* 241 */ +#endif +#ifndef Tcl_SplitList +#define Tcl_SplitList \ + (tclStubsPtr->tcl_SplitList) /* 242 */ +#endif +#ifndef Tcl_SplitPath +#define Tcl_SplitPath \ + (tclStubsPtr->tcl_SplitPath) /* 243 */ +#endif +#ifndef Tcl_StaticPackage +#define Tcl_StaticPackage \ + (tclStubsPtr->tcl_StaticPackage) /* 244 */ +#endif +#ifndef Tcl_StringMatch +#define Tcl_StringMatch \ + (tclStubsPtr->tcl_StringMatch) /* 245 */ +#endif +#ifndef Tcl_TellOld +#define Tcl_TellOld \ + (tclStubsPtr->tcl_TellOld) /* 246 */ +#endif +#ifndef Tcl_TraceVar +#define Tcl_TraceVar \ + (tclStubsPtr->tcl_TraceVar) /* 247 */ +#endif +#ifndef Tcl_TraceVar2 +#define Tcl_TraceVar2 \ + (tclStubsPtr->tcl_TraceVar2) /* 248 */ +#endif +#ifndef Tcl_TranslateFileName +#define Tcl_TranslateFileName \ + (tclStubsPtr->tcl_TranslateFileName) /* 249 */ +#endif +#ifndef Tcl_Ungets +#define Tcl_Ungets \ + (tclStubsPtr->tcl_Ungets) /* 250 */ +#endif +#ifndef Tcl_UnlinkVar +#define Tcl_UnlinkVar \ + (tclStubsPtr->tcl_UnlinkVar) /* 251 */ +#endif +#ifndef Tcl_UnregisterChannel +#define Tcl_UnregisterChannel \ + (tclStubsPtr->tcl_UnregisterChannel) /* 252 */ +#endif +#ifndef Tcl_UnsetVar +#define Tcl_UnsetVar \ + (tclStubsPtr->tcl_UnsetVar) /* 253 */ +#endif +#ifndef Tcl_UnsetVar2 +#define Tcl_UnsetVar2 \ + (tclStubsPtr->tcl_UnsetVar2) /* 254 */ +#endif +#ifndef Tcl_UntraceVar +#define Tcl_UntraceVar \ + (tclStubsPtr->tcl_UntraceVar) /* 255 */ +#endif +#ifndef Tcl_UntraceVar2 +#define Tcl_UntraceVar2 \ + (tclStubsPtr->tcl_UntraceVar2) /* 256 */ +#endif +#ifndef Tcl_UpdateLinkedVar +#define Tcl_UpdateLinkedVar \ + (tclStubsPtr->tcl_UpdateLinkedVar) /* 257 */ +#endif +#ifndef Tcl_UpVar +#define Tcl_UpVar \ + (tclStubsPtr->tcl_UpVar) /* 258 */ +#endif +#ifndef Tcl_UpVar2 +#define Tcl_UpVar2 \ + (tclStubsPtr->tcl_UpVar2) /* 259 */ +#endif +#ifndef Tcl_VarEval +#define Tcl_VarEval \ + (tclStubsPtr->tcl_VarEval) /* 260 */ +#endif +#ifndef Tcl_VarTraceInfo +#define Tcl_VarTraceInfo \ + (tclStubsPtr->tcl_VarTraceInfo) /* 261 */ +#endif +#ifndef Tcl_VarTraceInfo2 +#define Tcl_VarTraceInfo2 \ + (tclStubsPtr->tcl_VarTraceInfo2) /* 262 */ +#endif +#ifndef Tcl_Write +#define Tcl_Write \ + (tclStubsPtr->tcl_Write) /* 263 */ +#endif +#ifndef Tcl_WrongNumArgs +#define Tcl_WrongNumArgs \ + (tclStubsPtr->tcl_WrongNumArgs) /* 264 */ +#endif +#ifndef Tcl_DumpActiveMemory +#define Tcl_DumpActiveMemory \ + (tclStubsPtr->tcl_DumpActiveMemory) /* 265 */ +#endif +#ifndef Tcl_ValidateAllMemory +#define Tcl_ValidateAllMemory \ + (tclStubsPtr->tcl_ValidateAllMemory) /* 266 */ +#endif +#ifndef Tcl_AppendResultVA +#define Tcl_AppendResultVA \ + (tclStubsPtr->tcl_AppendResultVA) /* 267 */ +#endif +#ifndef Tcl_AppendStringsToObjVA +#define Tcl_AppendStringsToObjVA \ + (tclStubsPtr->tcl_AppendStringsToObjVA) /* 268 */ +#endif +#ifndef Tcl_HashStats +#define Tcl_HashStats \ + (tclStubsPtr->tcl_HashStats) /* 269 */ +#endif +#ifndef Tcl_ParseVar +#define Tcl_ParseVar \ + (tclStubsPtr->tcl_ParseVar) /* 270 */ +#endif +#ifndef Tcl_PkgPresent +#define Tcl_PkgPresent \ + (tclStubsPtr->tcl_PkgPresent) /* 271 */ +#endif +#ifndef Tcl_PkgPresentEx +#define Tcl_PkgPresentEx \ + (tclStubsPtr->tcl_PkgPresentEx) /* 272 */ +#endif +#ifndef Tcl_PkgProvide +#define Tcl_PkgProvide \ + (tclStubsPtr->tcl_PkgProvide) /* 273 */ +#endif +#ifndef Tcl_PkgRequire +#define Tcl_PkgRequire \ + (tclStubsPtr->tcl_PkgRequire) /* 274 */ +#endif +#ifndef Tcl_SetErrorCodeVA +#define Tcl_SetErrorCodeVA \ + (tclStubsPtr->tcl_SetErrorCodeVA) /* 275 */ +#endif +#ifndef Tcl_VarEvalVA +#define Tcl_VarEvalVA \ + (tclStubsPtr->tcl_VarEvalVA) /* 276 */ +#endif +#ifndef Tcl_WaitPid +#define Tcl_WaitPid \ + (tclStubsPtr->tcl_WaitPid) /* 277 */ +#endif +#ifndef Tcl_PanicVA +#define Tcl_PanicVA \ + (tclStubsPtr->tcl_PanicVA) /* 278 */ +#endif +#ifndef Tcl_GetVersion +#define Tcl_GetVersion \ + (tclStubsPtr->tcl_GetVersion) /* 279 */ +#endif +#ifndef Tcl_InitMemory +#define Tcl_InitMemory \ + (tclStubsPtr->tcl_InitMemory) /* 280 */ +#endif +#ifndef Tcl_StackChannel +#define Tcl_StackChannel \ + (tclStubsPtr->tcl_StackChannel) /* 281 */ +#endif +#ifndef Tcl_UnstackChannel +#define Tcl_UnstackChannel \ + (tclStubsPtr->tcl_UnstackChannel) /* 282 */ +#endif +#ifndef Tcl_GetStackedChannel +#define Tcl_GetStackedChannel \ + (tclStubsPtr->tcl_GetStackedChannel) /* 283 */ +#endif +#ifndef Tcl_SetMainLoop +#define Tcl_SetMainLoop \ + (tclStubsPtr->tcl_SetMainLoop) /* 284 */ +#endif +/* Slot 285 is reserved */ +#ifndef Tcl_AppendObjToObj +#define Tcl_AppendObjToObj \ + (tclStubsPtr->tcl_AppendObjToObj) /* 286 */ +#endif +#ifndef Tcl_CreateEncoding +#define Tcl_CreateEncoding \ + (tclStubsPtr->tcl_CreateEncoding) /* 287 */ +#endif +#ifndef Tcl_CreateThreadExitHandler +#define Tcl_CreateThreadExitHandler \ + (tclStubsPtr->tcl_CreateThreadExitHandler) /* 288 */ +#endif +#ifndef Tcl_DeleteThreadExitHandler +#define Tcl_DeleteThreadExitHandler \ + (tclStubsPtr->tcl_DeleteThreadExitHandler) /* 289 */ +#endif +#ifndef Tcl_DiscardResult +#define Tcl_DiscardResult \ + (tclStubsPtr->tcl_DiscardResult) /* 290 */ +#endif +#ifndef Tcl_EvalEx +#define Tcl_EvalEx \ + (tclStubsPtr->tcl_EvalEx) /* 291 */ +#endif +#ifndef Tcl_EvalObjv +#define Tcl_EvalObjv \ + (tclStubsPtr->tcl_EvalObjv) /* 292 */ +#endif +#ifndef Tcl_EvalObjEx +#define Tcl_EvalObjEx \ + (tclStubsPtr->tcl_EvalObjEx) /* 293 */ +#endif +#ifndef Tcl_ExitThread +#define Tcl_ExitThread \ + (tclStubsPtr->tcl_ExitThread) /* 294 */ +#endif +#ifndef Tcl_ExternalToUtf +#define Tcl_ExternalToUtf \ + (tclStubsPtr->tcl_ExternalToUtf) /* 295 */ +#endif +#ifndef Tcl_ExternalToUtfDString +#define Tcl_ExternalToUtfDString \ + (tclStubsPtr->tcl_ExternalToUtfDString) /* 296 */ +#endif +#ifndef Tcl_FinalizeThread +#define Tcl_FinalizeThread \ + (tclStubsPtr->tcl_FinalizeThread) /* 297 */ +#endif +#ifndef Tcl_FinalizeNotifier +#define Tcl_FinalizeNotifier \ + (tclStubsPtr->tcl_FinalizeNotifier) /* 298 */ +#endif +#ifndef Tcl_FreeEncoding +#define Tcl_FreeEncoding \ + (tclStubsPtr->tcl_FreeEncoding) /* 299 */ +#endif +#ifndef Tcl_GetCurrentThread +#define Tcl_GetCurrentThread \ + (tclStubsPtr->tcl_GetCurrentThread) /* 300 */ +#endif +#ifndef Tcl_GetEncoding +#define Tcl_GetEncoding \ + (tclStubsPtr->tcl_GetEncoding) /* 301 */ +#endif +#ifndef Tcl_GetEncodingName +#define Tcl_GetEncodingName \ + (tclStubsPtr->tcl_GetEncodingName) /* 302 */ +#endif +#ifndef Tcl_GetEncodingNames +#define Tcl_GetEncodingNames \ + (tclStubsPtr->tcl_GetEncodingNames) /* 303 */ +#endif +#ifndef Tcl_GetIndexFromObjStruct +#define Tcl_GetIndexFromObjStruct \ + (tclStubsPtr->tcl_GetIndexFromObjStruct) /* 304 */ +#endif +#ifndef Tcl_GetThreadData +#define Tcl_GetThreadData \ + (tclStubsPtr->tcl_GetThreadData) /* 305 */ +#endif +#ifndef Tcl_GetVar2Ex +#define Tcl_GetVar2Ex \ + (tclStubsPtr->tcl_GetVar2Ex) /* 306 */ +#endif +#ifndef Tcl_InitNotifier +#define Tcl_InitNotifier \ + (tclStubsPtr->tcl_InitNotifier) /* 307 */ +#endif +#ifndef Tcl_MutexLock +#define Tcl_MutexLock \ + (tclStubsPtr->tcl_MutexLock) /* 308 */ +#endif +#ifndef Tcl_MutexUnlock +#define Tcl_MutexUnlock \ + (tclStubsPtr->tcl_MutexUnlock) /* 309 */ +#endif +#ifndef Tcl_ConditionNotify +#define Tcl_ConditionNotify \ + (tclStubsPtr->tcl_ConditionNotify) /* 310 */ +#endif +#ifndef Tcl_ConditionWait +#define Tcl_ConditionWait \ + (tclStubsPtr->tcl_ConditionWait) /* 311 */ +#endif +#ifndef Tcl_NumUtfChars +#define Tcl_NumUtfChars \ + (tclStubsPtr->tcl_NumUtfChars) /* 312 */ +#endif +#ifndef Tcl_ReadChars +#define Tcl_ReadChars \ + (tclStubsPtr->tcl_ReadChars) /* 313 */ +#endif +#ifndef Tcl_RestoreResult +#define Tcl_RestoreResult \ + (tclStubsPtr->tcl_RestoreResult) /* 314 */ +#endif +#ifndef Tcl_SaveResult +#define Tcl_SaveResult \ + (tclStubsPtr->tcl_SaveResult) /* 315 */ +#endif +#ifndef Tcl_SetSystemEncoding +#define Tcl_SetSystemEncoding \ + (tclStubsPtr->tcl_SetSystemEncoding) /* 316 */ +#endif +#ifndef Tcl_SetVar2Ex +#define Tcl_SetVar2Ex \ + (tclStubsPtr->tcl_SetVar2Ex) /* 317 */ +#endif +#ifndef Tcl_ThreadAlert +#define Tcl_ThreadAlert \ + (tclStubsPtr->tcl_ThreadAlert) /* 318 */ +#endif +#ifndef Tcl_ThreadQueueEvent +#define Tcl_ThreadQueueEvent \ + (tclStubsPtr->tcl_ThreadQueueEvent) /* 319 */ +#endif +#ifndef Tcl_UniCharAtIndex +#define Tcl_UniCharAtIndex \ + (tclStubsPtr->tcl_UniCharAtIndex) /* 320 */ +#endif +#ifndef Tcl_UniCharToLower +#define Tcl_UniCharToLower \ + (tclStubsPtr->tcl_UniCharToLower) /* 321 */ +#endif +#ifndef Tcl_UniCharToTitle +#define Tcl_UniCharToTitle \ + (tclStubsPtr->tcl_UniCharToTitle) /* 322 */ +#endif +#ifndef Tcl_UniCharToUpper +#define Tcl_UniCharToUpper \ + (tclStubsPtr->tcl_UniCharToUpper) /* 323 */ +#endif +#ifndef Tcl_UniCharToUtf +#define Tcl_UniCharToUtf \ + (tclStubsPtr->tcl_UniCharToUtf) /* 324 */ +#endif +#ifndef Tcl_UtfAtIndex +#define Tcl_UtfAtIndex \ + (tclStubsPtr->tcl_UtfAtIndex) /* 325 */ +#endif +#ifndef Tcl_UtfCharComplete +#define Tcl_UtfCharComplete \ + (tclStubsPtr->tcl_UtfCharComplete) /* 326 */ +#endif +#ifndef Tcl_UtfBackslash +#define Tcl_UtfBackslash \ + (tclStubsPtr->tcl_UtfBackslash) /* 327 */ +#endif +#ifndef Tcl_UtfFindFirst +#define Tcl_UtfFindFirst \ + (tclStubsPtr->tcl_UtfFindFirst) /* 328 */ +#endif +#ifndef Tcl_UtfFindLast +#define Tcl_UtfFindLast \ + (tclStubsPtr->tcl_UtfFindLast) /* 329 */ +#endif +#ifndef Tcl_UtfNext +#define Tcl_UtfNext \ + (tclStubsPtr->tcl_UtfNext) /* 330 */ +#endif +#ifndef Tcl_UtfPrev +#define Tcl_UtfPrev \ + (tclStubsPtr->tcl_UtfPrev) /* 331 */ +#endif +#ifndef Tcl_UtfToExternal +#define Tcl_UtfToExternal \ + (tclStubsPtr->tcl_UtfToExternal) /* 332 */ +#endif +#ifndef Tcl_UtfToExternalDString +#define Tcl_UtfToExternalDString \ + (tclStubsPtr->tcl_UtfToExternalDString) /* 333 */ +#endif +#ifndef Tcl_UtfToLower +#define Tcl_UtfToLower \ + (tclStubsPtr->tcl_UtfToLower) /* 334 */ +#endif +#ifndef Tcl_UtfToTitle +#define Tcl_UtfToTitle \ + (tclStubsPtr->tcl_UtfToTitle) /* 335 */ +#endif +#ifndef Tcl_UtfToUniChar +#define Tcl_UtfToUniChar \ + (tclStubsPtr->tcl_UtfToUniChar) /* 336 */ +#endif +#ifndef Tcl_UtfToUpper +#define Tcl_UtfToUpper \ + (tclStubsPtr->tcl_UtfToUpper) /* 337 */ +#endif +#ifndef Tcl_WriteChars +#define Tcl_WriteChars \ + (tclStubsPtr->tcl_WriteChars) /* 338 */ +#endif +#ifndef Tcl_WriteObj +#define Tcl_WriteObj \ + (tclStubsPtr->tcl_WriteObj) /* 339 */ +#endif +#ifndef Tcl_GetString +#define Tcl_GetString \ + (tclStubsPtr->tcl_GetString) /* 340 */ +#endif +#ifndef Tcl_GetDefaultEncodingDir +#define Tcl_GetDefaultEncodingDir \ + (tclStubsPtr->tcl_GetDefaultEncodingDir) /* 341 */ +#endif +#ifndef Tcl_SetDefaultEncodingDir +#define Tcl_SetDefaultEncodingDir \ + (tclStubsPtr->tcl_SetDefaultEncodingDir) /* 342 */ +#endif +#ifndef Tcl_AlertNotifier +#define Tcl_AlertNotifier \ + (tclStubsPtr->tcl_AlertNotifier) /* 343 */ +#endif +#ifndef Tcl_ServiceModeHook +#define Tcl_ServiceModeHook \ + (tclStubsPtr->tcl_ServiceModeHook) /* 344 */ +#endif +#ifndef Tcl_UniCharIsAlnum +#define Tcl_UniCharIsAlnum \ + (tclStubsPtr->tcl_UniCharIsAlnum) /* 345 */ +#endif +#ifndef Tcl_UniCharIsAlpha +#define Tcl_UniCharIsAlpha \ + (tclStubsPtr->tcl_UniCharIsAlpha) /* 346 */ +#endif +#ifndef Tcl_UniCharIsDigit +#define Tcl_UniCharIsDigit \ + (tclStubsPtr->tcl_UniCharIsDigit) /* 347 */ +#endif +#ifndef Tcl_UniCharIsLower +#define Tcl_UniCharIsLower \ + (tclStubsPtr->tcl_UniCharIsLower) /* 348 */ +#endif +#ifndef Tcl_UniCharIsSpace +#define Tcl_UniCharIsSpace \ + (tclStubsPtr->tcl_UniCharIsSpace) /* 349 */ +#endif +#ifndef Tcl_UniCharIsUpper +#define Tcl_UniCharIsUpper \ + (tclStubsPtr->tcl_UniCharIsUpper) /* 350 */ +#endif +#ifndef Tcl_UniCharIsWordChar +#define Tcl_UniCharIsWordChar \ + (tclStubsPtr->tcl_UniCharIsWordChar) /* 351 */ +#endif +#ifndef Tcl_UniCharLen +#define Tcl_UniCharLen \ + (tclStubsPtr->tcl_UniCharLen) /* 352 */ +#endif +#ifndef Tcl_UniCharNcmp +#define Tcl_UniCharNcmp \ + (tclStubsPtr->tcl_UniCharNcmp) /* 353 */ +#endif +#ifndef Tcl_UniCharToUtfDString +#define Tcl_UniCharToUtfDString \ + (tclStubsPtr->tcl_UniCharToUtfDString) /* 354 */ +#endif +#ifndef Tcl_UtfToUniCharDString +#define Tcl_UtfToUniCharDString \ + (tclStubsPtr->tcl_UtfToUniCharDString) /* 355 */ +#endif +#ifndef Tcl_GetRegExpFromObj +#define Tcl_GetRegExpFromObj \ + (tclStubsPtr->tcl_GetRegExpFromObj) /* 356 */ +#endif +#ifndef Tcl_EvalTokens +#define Tcl_EvalTokens \ + (tclStubsPtr->tcl_EvalTokens) /* 357 */ +#endif +#ifndef Tcl_FreeParse +#define Tcl_FreeParse \ + (tclStubsPtr->tcl_FreeParse) /* 358 */ +#endif +#ifndef Tcl_LogCommandInfo +#define Tcl_LogCommandInfo \ + (tclStubsPtr->tcl_LogCommandInfo) /* 359 */ +#endif +#ifndef Tcl_ParseBraces +#define Tcl_ParseBraces \ + (tclStubsPtr->tcl_ParseBraces) /* 360 */ +#endif +#ifndef Tcl_ParseCommand +#define Tcl_ParseCommand \ + (tclStubsPtr->tcl_ParseCommand) /* 361 */ +#endif +#ifndef Tcl_ParseExpr +#define Tcl_ParseExpr \ + (tclStubsPtr->tcl_ParseExpr) /* 362 */ +#endif +#ifndef Tcl_ParseQuotedString +#define Tcl_ParseQuotedString \ + (tclStubsPtr->tcl_ParseQuotedString) /* 363 */ +#endif +#ifndef Tcl_ParseVarName +#define Tcl_ParseVarName \ + (tclStubsPtr->tcl_ParseVarName) /* 364 */ +#endif +#ifndef Tcl_GetCwd +#define Tcl_GetCwd \ + (tclStubsPtr->tcl_GetCwd) /* 365 */ +#endif +#ifndef Tcl_Chdir +#define Tcl_Chdir \ + (tclStubsPtr->tcl_Chdir) /* 366 */ +#endif +#ifndef Tcl_Access +#define Tcl_Access \ + (tclStubsPtr->tcl_Access) /* 367 */ +#endif +#ifndef Tcl_Stat +#define Tcl_Stat \ + (tclStubsPtr->tcl_Stat) /* 368 */ +#endif +#ifndef Tcl_UtfNcmp +#define Tcl_UtfNcmp \ + (tclStubsPtr->tcl_UtfNcmp) /* 369 */ +#endif +#ifndef Tcl_UtfNcasecmp +#define Tcl_UtfNcasecmp \ + (tclStubsPtr->tcl_UtfNcasecmp) /* 370 */ +#endif +#ifndef Tcl_StringCaseMatch +#define Tcl_StringCaseMatch \ + (tclStubsPtr->tcl_StringCaseMatch) /* 371 */ +#endif +#ifndef Tcl_UniCharIsControl +#define Tcl_UniCharIsControl \ + (tclStubsPtr->tcl_UniCharIsControl) /* 372 */ +#endif +#ifndef Tcl_UniCharIsGraph +#define Tcl_UniCharIsGraph \ + (tclStubsPtr->tcl_UniCharIsGraph) /* 373 */ +#endif +#ifndef Tcl_UniCharIsPrint +#define Tcl_UniCharIsPrint \ + (tclStubsPtr->tcl_UniCharIsPrint) /* 374 */ +#endif +#ifndef Tcl_UniCharIsPunct +#define Tcl_UniCharIsPunct \ + (tclStubsPtr->tcl_UniCharIsPunct) /* 375 */ +#endif +#ifndef Tcl_RegExpExecObj +#define Tcl_RegExpExecObj \ + (tclStubsPtr->tcl_RegExpExecObj) /* 376 */ +#endif +#ifndef Tcl_RegExpGetInfo +#define Tcl_RegExpGetInfo \ + (tclStubsPtr->tcl_RegExpGetInfo) /* 377 */ +#endif +#ifndef Tcl_NewUnicodeObj +#define Tcl_NewUnicodeObj \ + (tclStubsPtr->tcl_NewUnicodeObj) /* 378 */ +#endif +#ifndef Tcl_SetUnicodeObj +#define Tcl_SetUnicodeObj \ + (tclStubsPtr->tcl_SetUnicodeObj) /* 379 */ +#endif +#ifndef Tcl_GetCharLength +#define Tcl_GetCharLength \ + (tclStubsPtr->tcl_GetCharLength) /* 380 */ +#endif +#ifndef Tcl_GetUniChar +#define Tcl_GetUniChar \ + (tclStubsPtr->tcl_GetUniChar) /* 381 */ +#endif +#ifndef Tcl_GetUnicode +#define Tcl_GetUnicode \ + (tclStubsPtr->tcl_GetUnicode) /* 382 */ +#endif +#ifndef Tcl_GetRange +#define Tcl_GetRange \ + (tclStubsPtr->tcl_GetRange) /* 383 */ +#endif +#ifndef Tcl_AppendUnicodeToObj +#define Tcl_AppendUnicodeToObj \ + (tclStubsPtr->tcl_AppendUnicodeToObj) /* 384 */ +#endif +#ifndef Tcl_RegExpMatchObj +#define Tcl_RegExpMatchObj \ + (tclStubsPtr->tcl_RegExpMatchObj) /* 385 */ +#endif +#ifndef Tcl_SetNotifier +#define Tcl_SetNotifier \ + (tclStubsPtr->tcl_SetNotifier) /* 386 */ +#endif +#ifndef Tcl_GetAllocMutex +#define Tcl_GetAllocMutex \ + (tclStubsPtr->tcl_GetAllocMutex) /* 387 */ +#endif +#ifndef Tcl_GetChannelNames +#define Tcl_GetChannelNames \ + (tclStubsPtr->tcl_GetChannelNames) /* 388 */ +#endif +#ifndef Tcl_GetChannelNamesEx +#define Tcl_GetChannelNamesEx \ + (tclStubsPtr->tcl_GetChannelNamesEx) /* 389 */ +#endif +#ifndef Tcl_ProcObjCmd +#define Tcl_ProcObjCmd \ + (tclStubsPtr->tcl_ProcObjCmd) /* 390 */ +#endif +#ifndef Tcl_ConditionFinalize +#define Tcl_ConditionFinalize \ + (tclStubsPtr->tcl_ConditionFinalize) /* 391 */ +#endif +#ifndef Tcl_MutexFinalize +#define Tcl_MutexFinalize \ + (tclStubsPtr->tcl_MutexFinalize) /* 392 */ +#endif +#ifndef Tcl_CreateThread +#define Tcl_CreateThread \ + (tclStubsPtr->tcl_CreateThread) /* 393 */ +#endif +#ifndef Tcl_ReadRaw +#define Tcl_ReadRaw \ + (tclStubsPtr->tcl_ReadRaw) /* 394 */ +#endif +#ifndef Tcl_WriteRaw +#define Tcl_WriteRaw \ + (tclStubsPtr->tcl_WriteRaw) /* 395 */ +#endif +#ifndef Tcl_GetTopChannel +#define Tcl_GetTopChannel \ + (tclStubsPtr->tcl_GetTopChannel) /* 396 */ +#endif +#ifndef Tcl_ChannelBuffered +#define Tcl_ChannelBuffered \ + (tclStubsPtr->tcl_ChannelBuffered) /* 397 */ +#endif +#ifndef Tcl_ChannelName +#define Tcl_ChannelName \ + (tclStubsPtr->tcl_ChannelName) /* 398 */ +#endif +#ifndef Tcl_ChannelVersion +#define Tcl_ChannelVersion \ + (tclStubsPtr->tcl_ChannelVersion) /* 399 */ +#endif +#ifndef Tcl_ChannelBlockModeProc +#define Tcl_ChannelBlockModeProc \ + (tclStubsPtr->tcl_ChannelBlockModeProc) /* 400 */ +#endif +#ifndef Tcl_ChannelCloseProc +#define Tcl_ChannelCloseProc \ + (tclStubsPtr->tcl_ChannelCloseProc) /* 401 */ +#endif +#ifndef Tcl_ChannelClose2Proc +#define Tcl_ChannelClose2Proc \ + (tclStubsPtr->tcl_ChannelClose2Proc) /* 402 */ +#endif +#ifndef Tcl_ChannelInputProc +#define Tcl_ChannelInputProc \ + (tclStubsPtr->tcl_ChannelInputProc) /* 403 */ +#endif +#ifndef Tcl_ChannelOutputProc +#define Tcl_ChannelOutputProc \ + (tclStubsPtr->tcl_ChannelOutputProc) /* 404 */ +#endif +#ifndef Tcl_ChannelSeekProc +#define Tcl_ChannelSeekProc \ + (tclStubsPtr->tcl_ChannelSeekProc) /* 405 */ +#endif +#ifndef Tcl_ChannelSetOptionProc +#define Tcl_ChannelSetOptionProc \ + (tclStubsPtr->tcl_ChannelSetOptionProc) /* 406 */ +#endif +#ifndef Tcl_ChannelGetOptionProc +#define Tcl_ChannelGetOptionProc \ + (tclStubsPtr->tcl_ChannelGetOptionProc) /* 407 */ +#endif +#ifndef Tcl_ChannelWatchProc +#define Tcl_ChannelWatchProc \ + (tclStubsPtr->tcl_ChannelWatchProc) /* 408 */ +#endif +#ifndef Tcl_ChannelGetHandleProc +#define Tcl_ChannelGetHandleProc \ + (tclStubsPtr->tcl_ChannelGetHandleProc) /* 409 */ +#endif +#ifndef Tcl_ChannelFlushProc +#define Tcl_ChannelFlushProc \ + (tclStubsPtr->tcl_ChannelFlushProc) /* 410 */ +#endif +#ifndef Tcl_ChannelHandlerProc +#define Tcl_ChannelHandlerProc \ + (tclStubsPtr->tcl_ChannelHandlerProc) /* 411 */ +#endif +#ifndef Tcl_JoinThread +#define Tcl_JoinThread \ + (tclStubsPtr->tcl_JoinThread) /* 412 */ +#endif +#ifndef Tcl_IsChannelShared +#define Tcl_IsChannelShared \ + (tclStubsPtr->tcl_IsChannelShared) /* 413 */ +#endif +#ifndef Tcl_IsChannelRegistered +#define Tcl_IsChannelRegistered \ + (tclStubsPtr->tcl_IsChannelRegistered) /* 414 */ +#endif +#ifndef Tcl_CutChannel +#define Tcl_CutChannel \ + (tclStubsPtr->tcl_CutChannel) /* 415 */ +#endif +#ifndef Tcl_SpliceChannel +#define Tcl_SpliceChannel \ + (tclStubsPtr->tcl_SpliceChannel) /* 416 */ +#endif +#ifndef Tcl_ClearChannelHandlers +#define Tcl_ClearChannelHandlers \ + (tclStubsPtr->tcl_ClearChannelHandlers) /* 417 */ +#endif +#ifndef Tcl_IsChannelExisting +#define Tcl_IsChannelExisting \ + (tclStubsPtr->tcl_IsChannelExisting) /* 418 */ +#endif +#ifndef Tcl_UniCharNcasecmp +#define Tcl_UniCharNcasecmp \ + (tclStubsPtr->tcl_UniCharNcasecmp) /* 419 */ +#endif +#ifndef Tcl_UniCharCaseMatch +#define Tcl_UniCharCaseMatch \ + (tclStubsPtr->tcl_UniCharCaseMatch) /* 420 */ +#endif +#ifndef Tcl_FindHashEntry +#define Tcl_FindHashEntry \ + (tclStubsPtr->tcl_FindHashEntry) /* 421 */ +#endif +#ifndef Tcl_CreateHashEntry +#define Tcl_CreateHashEntry \ + (tclStubsPtr->tcl_CreateHashEntry) /* 422 */ +#endif +#ifndef Tcl_InitCustomHashTable +#define Tcl_InitCustomHashTable \ + (tclStubsPtr->tcl_InitCustomHashTable) /* 423 */ +#endif +#ifndef Tcl_InitObjHashTable +#define Tcl_InitObjHashTable \ + (tclStubsPtr->tcl_InitObjHashTable) /* 424 */ +#endif +#ifndef Tcl_CommandTraceInfo +#define Tcl_CommandTraceInfo \ + (tclStubsPtr->tcl_CommandTraceInfo) /* 425 */ +#endif +#ifndef Tcl_TraceCommand +#define Tcl_TraceCommand \ + (tclStubsPtr->tcl_TraceCommand) /* 426 */ +#endif +#ifndef Tcl_UntraceCommand +#define Tcl_UntraceCommand \ + (tclStubsPtr->tcl_UntraceCommand) /* 427 */ +#endif +#ifndef Tcl_AttemptAlloc +#define Tcl_AttemptAlloc \ + (tclStubsPtr->tcl_AttemptAlloc) /* 428 */ +#endif +#ifndef Tcl_AttemptDbCkalloc +#define Tcl_AttemptDbCkalloc \ + (tclStubsPtr->tcl_AttemptDbCkalloc) /* 429 */ +#endif +#ifndef Tcl_AttemptRealloc +#define Tcl_AttemptRealloc \ + (tclStubsPtr->tcl_AttemptRealloc) /* 430 */ +#endif +#ifndef Tcl_AttemptDbCkrealloc +#define Tcl_AttemptDbCkrealloc \ + (tclStubsPtr->tcl_AttemptDbCkrealloc) /* 431 */ +#endif +#ifndef Tcl_AttemptSetObjLength +#define Tcl_AttemptSetObjLength \ + (tclStubsPtr->tcl_AttemptSetObjLength) /* 432 */ +#endif +#ifndef Tcl_GetChannelThread +#define Tcl_GetChannelThread \ + (tclStubsPtr->tcl_GetChannelThread) /* 433 */ +#endif +#ifndef Tcl_GetUnicodeFromObj +#define Tcl_GetUnicodeFromObj \ + (tclStubsPtr->tcl_GetUnicodeFromObj) /* 434 */ +#endif +#ifndef Tcl_GetMathFuncInfo +#define Tcl_GetMathFuncInfo \ + (tclStubsPtr->tcl_GetMathFuncInfo) /* 435 */ +#endif +#ifndef Tcl_ListMathFuncs +#define Tcl_ListMathFuncs \ + (tclStubsPtr->tcl_ListMathFuncs) /* 436 */ +#endif +#ifndef Tcl_SubstObj +#define Tcl_SubstObj \ + (tclStubsPtr->tcl_SubstObj) /* 437 */ +#endif +#ifndef Tcl_DetachChannel +#define Tcl_DetachChannel \ + (tclStubsPtr->tcl_DetachChannel) /* 438 */ +#endif +#ifndef Tcl_IsStandardChannel +#define Tcl_IsStandardChannel \ + (tclStubsPtr->tcl_IsStandardChannel) /* 439 */ +#endif +#ifndef Tcl_FSCopyFile +#define Tcl_FSCopyFile \ + (tclStubsPtr->tcl_FSCopyFile) /* 440 */ +#endif +#ifndef Tcl_FSCopyDirectory +#define Tcl_FSCopyDirectory \ + (tclStubsPtr->tcl_FSCopyDirectory) /* 441 */ +#endif +#ifndef Tcl_FSCreateDirectory +#define Tcl_FSCreateDirectory \ + (tclStubsPtr->tcl_FSCreateDirectory) /* 442 */ +#endif +#ifndef Tcl_FSDeleteFile +#define Tcl_FSDeleteFile \ + (tclStubsPtr->tcl_FSDeleteFile) /* 443 */ +#endif +#ifndef Tcl_FSLoadFile +#define Tcl_FSLoadFile \ + (tclStubsPtr->tcl_FSLoadFile) /* 444 */ +#endif +#ifndef Tcl_FSMatchInDirectory +#define Tcl_FSMatchInDirectory \ + (tclStubsPtr->tcl_FSMatchInDirectory) /* 445 */ +#endif +#ifndef Tcl_FSLink +#define Tcl_FSLink \ + (tclStubsPtr->tcl_FSLink) /* 446 */ +#endif +#ifndef Tcl_FSRemoveDirectory +#define Tcl_FSRemoveDirectory \ + (tclStubsPtr->tcl_FSRemoveDirectory) /* 447 */ +#endif +#ifndef Tcl_FSRenameFile +#define Tcl_FSRenameFile \ + (tclStubsPtr->tcl_FSRenameFile) /* 448 */ +#endif +#ifndef Tcl_FSLstat +#define Tcl_FSLstat \ + (tclStubsPtr->tcl_FSLstat) /* 449 */ +#endif +#ifndef Tcl_FSUtime +#define Tcl_FSUtime \ + (tclStubsPtr->tcl_FSUtime) /* 450 */ +#endif +#ifndef Tcl_FSFileAttrsGet +#define Tcl_FSFileAttrsGet \ + (tclStubsPtr->tcl_FSFileAttrsGet) /* 451 */ +#endif +#ifndef Tcl_FSFileAttrsSet +#define Tcl_FSFileAttrsSet \ + (tclStubsPtr->tcl_FSFileAttrsSet) /* 452 */ +#endif +#ifndef Tcl_FSFileAttrStrings +#define Tcl_FSFileAttrStrings \ + (tclStubsPtr->tcl_FSFileAttrStrings) /* 453 */ +#endif +#ifndef Tcl_FSStat +#define Tcl_FSStat \ + (tclStubsPtr->tcl_FSStat) /* 454 */ +#endif +#ifndef Tcl_FSAccess +#define Tcl_FSAccess \ + (tclStubsPtr->tcl_FSAccess) /* 455 */ +#endif +#ifndef Tcl_FSOpenFileChannel +#define Tcl_FSOpenFileChannel \ + (tclStubsPtr->tcl_FSOpenFileChannel) /* 456 */ +#endif +#ifndef Tcl_FSGetCwd +#define Tcl_FSGetCwd \ + (tclStubsPtr->tcl_FSGetCwd) /* 457 */ +#endif +#ifndef Tcl_FSChdir +#define Tcl_FSChdir \ + (tclStubsPtr->tcl_FSChdir) /* 458 */ +#endif +#ifndef Tcl_FSConvertToPathType +#define Tcl_FSConvertToPathType \ + (tclStubsPtr->tcl_FSConvertToPathType) /* 459 */ +#endif +#ifndef Tcl_FSJoinPath +#define Tcl_FSJoinPath \ + (tclStubsPtr->tcl_FSJoinPath) /* 460 */ +#endif +#ifndef Tcl_FSSplitPath +#define Tcl_FSSplitPath \ + (tclStubsPtr->tcl_FSSplitPath) /* 461 */ +#endif +#ifndef Tcl_FSEqualPaths +#define Tcl_FSEqualPaths \ + (tclStubsPtr->tcl_FSEqualPaths) /* 462 */ +#endif +#ifndef Tcl_FSGetNormalizedPath +#define Tcl_FSGetNormalizedPath \ + (tclStubsPtr->tcl_FSGetNormalizedPath) /* 463 */ +#endif +#ifndef Tcl_FSJoinToPath +#define Tcl_FSJoinToPath \ + (tclStubsPtr->tcl_FSJoinToPath) /* 464 */ +#endif +#ifndef Tcl_FSGetInternalRep +#define Tcl_FSGetInternalRep \ + (tclStubsPtr->tcl_FSGetInternalRep) /* 465 */ +#endif +#ifndef Tcl_FSGetTranslatedPath +#define Tcl_FSGetTranslatedPath \ + (tclStubsPtr->tcl_FSGetTranslatedPath) /* 466 */ +#endif +#ifndef Tcl_FSEvalFile +#define Tcl_FSEvalFile \ + (tclStubsPtr->tcl_FSEvalFile) /* 467 */ +#endif +#ifndef Tcl_FSNewNativePath +#define Tcl_FSNewNativePath \ + (tclStubsPtr->tcl_FSNewNativePath) /* 468 */ +#endif +#ifndef Tcl_FSGetNativePath +#define Tcl_FSGetNativePath \ + (tclStubsPtr->tcl_FSGetNativePath) /* 469 */ +#endif +#ifndef Tcl_FSFileSystemInfo +#define Tcl_FSFileSystemInfo \ + (tclStubsPtr->tcl_FSFileSystemInfo) /* 470 */ +#endif +#ifndef Tcl_FSPathSeparator +#define Tcl_FSPathSeparator \ + (tclStubsPtr->tcl_FSPathSeparator) /* 471 */ +#endif +#ifndef Tcl_FSListVolumes +#define Tcl_FSListVolumes \ + (tclStubsPtr->tcl_FSListVolumes) /* 472 */ +#endif +#ifndef Tcl_FSRegister +#define Tcl_FSRegister \ + (tclStubsPtr->tcl_FSRegister) /* 473 */ +#endif +#ifndef Tcl_FSUnregister +#define Tcl_FSUnregister \ + (tclStubsPtr->tcl_FSUnregister) /* 474 */ +#endif +#ifndef Tcl_FSData +#define Tcl_FSData \ + (tclStubsPtr->tcl_FSData) /* 475 */ +#endif +#ifndef Tcl_FSGetTranslatedStringPath +#define Tcl_FSGetTranslatedStringPath \ + (tclStubsPtr->tcl_FSGetTranslatedStringPath) /* 476 */ +#endif +#ifndef Tcl_FSGetFileSystemForPath +#define Tcl_FSGetFileSystemForPath \ + (tclStubsPtr->tcl_FSGetFileSystemForPath) /* 477 */ +#endif +#ifndef Tcl_FSGetPathType +#define Tcl_FSGetPathType \ + (tclStubsPtr->tcl_FSGetPathType) /* 478 */ +#endif +#ifndef Tcl_OutputBuffered +#define Tcl_OutputBuffered \ + (tclStubsPtr->tcl_OutputBuffered) /* 479 */ +#endif +#ifndef Tcl_FSMountsChanged +#define Tcl_FSMountsChanged \ + (tclStubsPtr->tcl_FSMountsChanged) /* 480 */ +#endif +#ifndef Tcl_EvalTokensStandard +#define Tcl_EvalTokensStandard \ + (tclStubsPtr->tcl_EvalTokensStandard) /* 481 */ +#endif +#ifndef Tcl_GetTime +#define Tcl_GetTime \ + (tclStubsPtr->tcl_GetTime) /* 482 */ +#endif +#ifndef Tcl_CreateObjTrace +#define Tcl_CreateObjTrace \ + (tclStubsPtr->tcl_CreateObjTrace) /* 483 */ +#endif +#ifndef Tcl_GetCommandInfoFromToken +#define Tcl_GetCommandInfoFromToken \ + (tclStubsPtr->tcl_GetCommandInfoFromToken) /* 484 */ +#endif +#ifndef Tcl_SetCommandInfoFromToken +#define Tcl_SetCommandInfoFromToken \ + (tclStubsPtr->tcl_SetCommandInfoFromToken) /* 485 */ +#endif +#ifndef Tcl_DbNewWideIntObj +#define Tcl_DbNewWideIntObj \ + (tclStubsPtr->tcl_DbNewWideIntObj) /* 486 */ +#endif +#ifndef Tcl_GetWideIntFromObj +#define Tcl_GetWideIntFromObj \ + (tclStubsPtr->tcl_GetWideIntFromObj) /* 487 */ +#endif +#ifndef Tcl_NewWideIntObj +#define Tcl_NewWideIntObj \ + (tclStubsPtr->tcl_NewWideIntObj) /* 488 */ +#endif +#ifndef Tcl_SetWideIntObj +#define Tcl_SetWideIntObj \ + (tclStubsPtr->tcl_SetWideIntObj) /* 489 */ +#endif +#ifndef Tcl_AllocStatBuf +#define Tcl_AllocStatBuf \ + (tclStubsPtr->tcl_AllocStatBuf) /* 490 */ +#endif +#ifndef Tcl_Seek +#define Tcl_Seek \ + (tclStubsPtr->tcl_Seek) /* 491 */ +#endif +#ifndef Tcl_Tell +#define Tcl_Tell \ + (tclStubsPtr->tcl_Tell) /* 492 */ +#endif +#ifndef Tcl_ChannelWideSeekProc +#define Tcl_ChannelWideSeekProc \ + (tclStubsPtr->tcl_ChannelWideSeekProc) /* 493 */ +#endif +/* Slot 494 is reserved */ +/* Slot 495 is reserved */ +/* Slot 496 is reserved */ +/* Slot 497 is reserved */ +/* Slot 498 is reserved */ +/* Slot 499 is reserved */ +/* Slot 500 is reserved */ +/* Slot 501 is reserved */ +/* Slot 502 is reserved */ +/* Slot 503 is reserved */ +/* Slot 504 is reserved */ +/* Slot 505 is reserved */ +/* Slot 506 is reserved */ +/* Slot 507 is reserved */ +/* Slot 508 is reserved */ +/* Slot 509 is reserved */ +/* Slot 510 is reserved */ +/* Slot 511 is reserved */ +/* Slot 512 is reserved */ +/* Slot 513 is reserved */ +/* Slot 514 is reserved */ +/* Slot 515 is reserved */ +/* Slot 516 is reserved */ +/* Slot 517 is reserved */ +/* Slot 518 is reserved */ +/* Slot 519 is reserved */ +/* Slot 520 is reserved */ +/* Slot 521 is reserved */ +/* Slot 522 is reserved */ +/* Slot 523 is reserved */ +/* Slot 524 is reserved */ +/* Slot 525 is reserved */ +/* Slot 526 is reserved */ +/* Slot 527 is reserved */ +/* Slot 528 is reserved */ +/* Slot 529 is reserved */ +/* Slot 530 is reserved */ +/* Slot 531 is reserved */ +/* Slot 532 is reserved */ +/* Slot 533 is reserved */ +/* Slot 534 is reserved */ +/* Slot 535 is reserved */ +/* Slot 536 is reserved */ +/* Slot 537 is reserved */ +/* Slot 538 is reserved */ +/* Slot 539 is reserved */ +/* Slot 540 is reserved */ +/* Slot 541 is reserved */ +/* Slot 542 is reserved */ +/* Slot 543 is reserved */ +/* Slot 544 is reserved */ +/* Slot 545 is reserved */ +/* Slot 546 is reserved */ +/* Slot 547 is reserved */ +/* Slot 548 is reserved */ +/* Slot 549 is reserved */ +/* Slot 550 is reserved */ +/* Slot 551 is reserved */ +/* Slot 552 is reserved */ +/* Slot 553 is reserved */ +#ifndef Tcl_ChannelThreadActionProc +#define Tcl_ChannelThreadActionProc \ + (tclStubsPtr->tcl_ChannelThreadActionProc) /* 554 */ +#endif +/* Slot 555 is reserved */ +/* Slot 556 is reserved */ +/* Slot 557 is reserved */ +/* Slot 558 is reserved */ +/* Slot 559 is reserved */ +/* Slot 560 is reserved */ +/* Slot 561 is reserved */ +/* Slot 562 is reserved */ +/* Slot 563 is reserved */ +/* Slot 564 is reserved */ +/* Slot 565 is reserved */ +/* Slot 566 is reserved */ +/* Slot 567 is reserved */ +/* Slot 568 is reserved */ +/* Slot 569 is reserved */ +/* Slot 570 is reserved */ +/* Slot 571 is reserved */ +/* Slot 572 is reserved */ +#ifndef Tcl_PkgRequireProc +#define Tcl_PkgRequireProc \ + (tclStubsPtr->tcl_PkgRequireProc) /* 573 */ +#endif +/* Slot 574 is reserved */ +/* Slot 575 is reserved */ +/* Slot 576 is reserved */ +/* Slot 577 is reserved */ +/* Slot 578 is reserved */ +/* Slot 579 is reserved */ +/* Slot 580 is reserved */ +/* Slot 581 is reserved */ +/* Slot 582 is reserved */ +/* Slot 583 is reserved */ +/* Slot 584 is reserved */ +/* Slot 585 is reserved */ +/* Slot 586 is reserved */ +/* Slot 587 is reserved */ +/* Slot 588 is reserved */ +/* Slot 589 is reserved */ +/* Slot 590 is reserved */ +/* Slot 591 is reserved */ +/* Slot 592 is reserved */ +/* Slot 593 is reserved */ +/* Slot 594 is reserved */ +/* Slot 595 is reserved */ +/* Slot 596 is reserved */ +/* Slot 597 is reserved */ +/* Slot 598 is reserved */ +/* Slot 599 is reserved */ +/* Slot 600 is reserved */ +/* Slot 601 is reserved */ +/* Slot 602 is reserved */ +/* Slot 603 is reserved */ +/* Slot 604 is reserved */ +/* Slot 605 is reserved */ +/* Slot 606 is reserved */ +/* Slot 607 is reserved */ +/* Slot 608 is reserved */ +/* Slot 609 is reserved */ +/* Slot 610 is reserved */ +/* Slot 611 is reserved */ +/* Slot 612 is reserved */ +/* Slot 613 is reserved */ +/* Slot 614 is reserved */ +/* Slot 615 is reserved */ +/* Slot 616 is reserved */ +/* Slot 617 is reserved */ +/* Slot 618 is reserved */ +/* Slot 619 is reserved */ +/* Slot 620 is reserved */ +/* Slot 621 is reserved */ +/* Slot 622 is reserved */ +/* Slot 623 is reserved */ +/* Slot 624 is reserved */ +/* Slot 625 is reserved */ +/* Slot 626 is reserved */ +/* Slot 627 is reserved */ +/* Slot 628 is reserved */ +/* Slot 629 is reserved */ +#ifndef TclUnusedStubEntry +#define TclUnusedStubEntry \ + (tclStubsPtr->tclUnusedStubEntry) /* 630 */ +#endif + +#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */ + +/* !END!: Do not edit above this line. */ + +#undef TclUnusedStubEntry + +#undef Tcl_PkgPresent +#define Tcl_PkgPresent(interp, name, version, exact) \ + Tcl_PkgPresentEx(interp, name, version, exact, NULL) +#undef Tcl_PkgProvide +#define Tcl_PkgProvide(interp, name, version) \ + Tcl_PkgProvideEx(interp, name, version, NULL) +#undef Tcl_PkgRequire +#define Tcl_PkgRequire(interp, name, version, exact) \ + Tcl_PkgRequireEx(interp, name, version, exact, NULL) +#undef Tcl_GetIndexFromObj +#define Tcl_GetIndexFromObj(interp, objPtr, tablePtr, msg, flags, indexPtr) \ + Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr, \ + sizeof(char *), msg, flags, indexPtr) +#undef Tcl_SetVar +#define Tcl_SetVar(interp, varName, newValue, flags) \ + Tcl_SetVar2(interp, varName, NULL, newValue, flags) +#undef Tcl_UnsetVar +#define Tcl_UnsetVar(interp, varName, flags) \ + Tcl_UnsetVar2(interp, varName, NULL, flags) +#undef Tcl_GetVar +#define Tcl_GetVar(interp, varName, flags) \ + Tcl_GetVar2(interp, varName, NULL, flags) +#undef Tcl_TraceVar +#define Tcl_TraceVar(interp, varName, flags, proc, clientData) \ + Tcl_TraceVar2(interp, varName, NULL, flags, proc, clientData) +#undef Tcl_UntraceVar +#define Tcl_UntraceVar(interp, varName, flags, proc, clientData) \ + Tcl_UntraceVar2(interp, varName, NULL, flags, proc, clientData) +#undef Tcl_VarTraceInfo +#define Tcl_VarTraceInfo(interp, varName, flags, proc, prevClientData) \ + Tcl_VarTraceInfo2(interp, varName, NULL, flags, proc, prevClientData) +#undef Tcl_UpVar +#define Tcl_UpVar(interp, frameName, varName, localName, flags) \ + Tcl_UpVar2(interp, frameName, varName, NULL, localName, flags) + +#if defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) +# if defined(__CYGWIN__) && defined(TCL_WIDE_INT_IS_LONG) +/* On Cygwin64, long is 64-bit while on Win64 long is 32-bit. Therefore + * we have to make sure that all stub entries on Cygwin64 follow the + * Win64 signature. Cygwin64 stubbed extensions cannot use those stub + * entries any more, they should use the 64-bit alternatives where + * possible. Tcl 9 must find a better solution, but that cannot be done + * without introducing a binary incompatibility. + */ +# undef Tcl_DbNewLongObj +# undef Tcl_GetLongFromObj +# undef Tcl_NewLongObj +# undef Tcl_SetLongObj +# undef Tcl_ExprLong +# undef Tcl_ExprLongObj +# undef Tcl_UniCharNcmp +# undef Tcl_UtfNcmp +# undef Tcl_UtfNcasecmp +# undef Tcl_UniCharNcasecmp +# define Tcl_DbNewLongObj ((Tcl_Obj*(*)(long,const char*,int))Tcl_DbNewWideIntObj) +# define Tcl_GetLongFromObj ((int(*)(Tcl_Interp*,Tcl_Obj*,long*))Tcl_GetWideIntFromObj) +# define Tcl_NewLongObj ((Tcl_Obj*(*)(long))Tcl_NewWideIntObj) +# define Tcl_SetLongObj ((void(*)(Tcl_Obj*,long))Tcl_SetWideIntObj) +# define Tcl_ExprLong TclExprLong + static inline int TclExprLong(Tcl_Interp *interp, const char *string, long *ptr){ + int intValue; + int result = tclStubsPtr->tcl_ExprLong(interp, string, (long *)&intValue); + if (result == TCL_OK) *ptr = (long)intValue; + return result; + } +# define Tcl_ExprLongObj TclExprLongObj + static inline int TclExprLongObj(Tcl_Interp *interp, Tcl_Obj *obj, long *ptr){ + int intValue; + int result = tclStubsPtr->tcl_ExprLongObj(interp, obj, (long *)&intValue); + if (result == TCL_OK) *ptr = (long)intValue; + return result; + } +# define Tcl_UniCharNcmp(ucs,uct,n) \ + ((int(*)(const Tcl_UniChar*,const Tcl_UniChar*,unsigned int))tclStubsPtr->tcl_UniCharNcmp)(ucs,uct,(unsigned int)(n)) +# define Tcl_UtfNcmp(s1,s2,n) \ + ((int(*)(const char*,const char*,unsigned int))tclStubsPtr->tcl_UtfNcmp)(s1,s2,(unsigned int)(n)) +# define Tcl_UtfNcasecmp(s1,s2,n) \ + ((int(*)(const char*,const char*,unsigned int))tclStubsPtr->tcl_UtfNcasecmp)(s1,s2,(unsigned int)(n)) +# define Tcl_UniCharNcasecmp(ucs,uct,n) \ + ((int(*)(const Tcl_UniChar*,const Tcl_UniChar*,unsigned int))tclStubsPtr->tcl_UniCharNcasecmp)(ucs,uct,(unsigned int)(n)) +# endif +#endif + +/* + * Deprecated Tcl procedures: + */ +#undef Tcl_EvalObj +#define Tcl_EvalObj(interp,objPtr) \ + Tcl_EvalObjEx((interp),(objPtr),0) +#undef Tcl_GlobalEvalObj +#define Tcl_GlobalEvalObj(interp,objPtr) \ + Tcl_EvalObjEx((interp),(objPtr),TCL_EVAL_GLOBAL) + +#endif /* _TCLDECLS */ + diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tclPlatDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tclPlatDecls.h new file mode 100644 index 00000000..b3397953 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tclPlatDecls.h @@ -0,0 +1,109 @@ +/* + * tclPlatDecls.h -- + * + * Declarations of platform specific Tcl APIs. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * All rights reserved. + */ + +#ifndef _TCLPLATDECLS +#define _TCLPLATDECLS + +/* + * TCHAR is needed here for win32, so if it is not defined yet do it here. + * This way, we don't need to include just for one define. + */ +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(_TCHAR_DEFINED) +# if defined(_UNICODE) + typedef wchar_t TCHAR; +# else + typedef char TCHAR; +# endif +# define _TCHAR_DEFINED +#endif + +/* !BEGIN!: Do not edit below this line. */ + +/* + * Exported function declarations: + */ + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ +/* 0 */ +EXTERN TCHAR * Tcl_WinUtfToTChar _ANSI_ARGS_((CONST char *str, + int len, Tcl_DString *dsPtr)); +/* 1 */ +EXTERN char * Tcl_WinTCharToUtf _ANSI_ARGS_((CONST TCHAR *str, + int len, Tcl_DString *dsPtr)); +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ +/* 0 */ +EXTERN int Tcl_MacOSXOpenBundleResources _ANSI_ARGS_(( + Tcl_Interp *interp, CONST char *bundleName, + int hasResourceFile, int maxPathLen, + char *libraryPath)); +/* 1 */ +EXTERN int Tcl_MacOSXOpenVersionedBundleResources _ANSI_ARGS_(( + Tcl_Interp *interp, CONST char *bundleName, + CONST char *bundleVersion, + int hasResourceFile, int maxPathLen, + char *libraryPath)); +#endif /* MACOSX */ + +typedef struct TclPlatStubs { + int magic; + struct TclPlatStubHooks *hooks; + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ + TCHAR * (*tcl_WinUtfToTChar) _ANSI_ARGS_((CONST char *str, int len, Tcl_DString *dsPtr)); /* 0 */ + char * (*tcl_WinTCharToUtf) _ANSI_ARGS_((CONST TCHAR *str, int len, Tcl_DString *dsPtr)); /* 1 */ +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ + int (*tcl_MacOSXOpenBundleResources) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *bundleName, int hasResourceFile, int maxPathLen, char *libraryPath)); /* 0 */ + int (*tcl_MacOSXOpenVersionedBundleResources) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *bundleName, CONST char *bundleVersion, int hasResourceFile, int maxPathLen, char *libraryPath)); /* 1 */ +#endif /* MACOSX */ +} TclPlatStubs; + +#ifdef __cplusplus +extern "C" { +#endif +extern TclPlatStubs *tclPlatStubsPtr; +#ifdef __cplusplus +} +#endif + +#if defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) + +/* + * Inline function declarations: + */ + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ +#ifndef Tcl_WinUtfToTChar +#define Tcl_WinUtfToTChar \ + (tclPlatStubsPtr->tcl_WinUtfToTChar) /* 0 */ +#endif +#ifndef Tcl_WinTCharToUtf +#define Tcl_WinTCharToUtf \ + (tclPlatStubsPtr->tcl_WinTCharToUtf) /* 1 */ +#endif +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#ifndef Tcl_MacOSXOpenBundleResources +#define Tcl_MacOSXOpenBundleResources \ + (tclPlatStubsPtr->tcl_MacOSXOpenBundleResources) /* 0 */ +#endif +#ifndef Tcl_MacOSXOpenVersionedBundleResources +#define Tcl_MacOSXOpenVersionedBundleResources \ + (tclPlatStubsPtr->tcl_MacOSXOpenVersionedBundleResources) /* 1 */ +#endif +#endif /* MACOSX */ + +#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */ + +/* !END!: Do not edit above this line. */ + +#endif /* _TCLPLATDECLS */ + + diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tk.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tk.h new file mode 100644 index 00000000..2ff21b6d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tk.h @@ -0,0 +1,1600 @@ +/* + * tk.h -- + * + * Declarations for Tk-related things that are visible + * outside of the Tk module itself. + * + * Copyright (c) 1989-1994 The Regents of the University of California. + * Copyright (c) 1994 The Australian National University. + * Copyright (c) 1994-1998 Sun Microsystems, Inc. + * Copyright (c) 1998-2000 Ajuba Solutions. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TK +#define _TK + +#ifndef _TCL +#include +#if (TCL_MAJOR_VERSION != 8) || (TCL_MINOR_VERSION != 4) +# error Tk 8.4 must be compiled with tcl.h from Tcl 8.4 +#endif +#endif + +/* + * For C++ compilers, use extern "C" + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * When version numbers change here, you must also go into the following files + * and update the version numbers: + * + * library/tk.tcl (only if Major.minor changes, not patchlevel) + * unix/configure.in (2 LOC Major, 2 LOC minor, 1 LOC patch) + * win/configure.in (as above) + * win/makefile.vc (not patchlevel) + * README (sections 0 and 1) + * mac/README (not patchlevel) + * win/README (not patchlevel) + * unix/README (not patchlevel) + * unix/tk.spec (3 LOC Major/Minor, 2 LOC patch) + * win/tcl.m4 (not patchlevel) + * + * You may also need to update some of these files when the numbers change + * for the version of Tcl that this release of Tk is compiled against. + */ + +#define TK_MAJOR_VERSION 8 +#define TK_MINOR_VERSION 4 +#define TK_RELEASE_LEVEL TCL_FINAL_RELEASE +#define TK_RELEASE_SERIAL 20 + +#define TK_VERSION "8.4" +#define TK_PATCH_LEVEL "8.4.20" + +/* + * A special definition used to allow this header file to be included + * from windows resource files so that they can obtain version + * information. RC_INVOKED is defined by default by the windows RC tool. + * + * Resource compilers don't like all the C stuff, like typedefs and + * procedure declarations, that occur below, so block them out. + */ + +#ifndef RC_INVOKED + +#ifndef _XLIB_H +# if defined(MAC_OSX_TK) +# include +# include +# else +# include +# endif +#endif +#ifdef __STDC__ +# include +#endif + +#ifdef BUILD_tk +# undef TCL_STORAGE_CLASS +# define TCL_STORAGE_CLASS DLLEXPORT +#endif + +/* + * Decide whether or not to use input methods. + */ + +#ifdef XNQueryInputStyle +#define TK_USE_INPUT_METHODS +#endif + +/* + * Dummy types that are used by clients: + */ + +typedef struct Tk_BindingTable_ *Tk_BindingTable; +typedef struct Tk_Canvas_ *Tk_Canvas; +typedef struct Tk_Cursor_ *Tk_Cursor; +typedef struct Tk_ErrorHandler_ *Tk_ErrorHandler; +typedef struct Tk_Font_ *Tk_Font; +typedef struct Tk_Image__ *Tk_Image; +typedef struct Tk_ImageMaster_ *Tk_ImageMaster; +typedef struct Tk_OptionTable_ *Tk_OptionTable; +typedef struct Tk_PostscriptInfo_ *Tk_PostscriptInfo; +typedef struct Tk_TextLayout_ *Tk_TextLayout; +typedef struct Tk_Window_ *Tk_Window; +typedef struct Tk_3DBorder_ *Tk_3DBorder; +typedef struct Tk_Style_ *Tk_Style; +typedef struct Tk_StyleEngine_ *Tk_StyleEngine; +typedef struct Tk_StyledElement_ *Tk_StyledElement; + +/* + * Additional types exported to clients. + */ + +typedef CONST char *Tk_Uid; + +/* + * The enum below defines the valid types for Tk configuration options + * as implemented by Tk_InitOptions, Tk_SetOptions, etc. + */ + +typedef enum { + TK_OPTION_BOOLEAN, + TK_OPTION_INT, + TK_OPTION_DOUBLE, + TK_OPTION_STRING, + TK_OPTION_STRING_TABLE, + TK_OPTION_COLOR, + TK_OPTION_FONT, + TK_OPTION_BITMAP, + TK_OPTION_BORDER, + TK_OPTION_RELIEF, + TK_OPTION_CURSOR, + TK_OPTION_JUSTIFY, + TK_OPTION_ANCHOR, + TK_OPTION_SYNONYM, + TK_OPTION_PIXELS, + TK_OPTION_WINDOW, + TK_OPTION_END, + TK_OPTION_CUSTOM, + TK_OPTION_STYLE +} Tk_OptionType; + +/* + * Structures of the following type are used by widgets to specify + * their configuration options. Typically each widget has a static + * array of these structures, where each element of the array describes + * a single configuration option. The array is passed to + * Tk_CreateOptionTable. + */ + +typedef struct Tk_OptionSpec { + Tk_OptionType type; /* Type of option, such as TK_OPTION_COLOR; + * see definitions above. Last option in + * table must have type TK_OPTION_END. */ + char *optionName; /* Name used to specify option in Tcl + * commands. */ + char *dbName; /* Name for option in option database. */ + char *dbClass; /* Class for option in database. */ + char *defValue; /* Default value for option if not specified + * in command line, the option database, + * or the system. */ + int objOffset; /* Where in record to store a Tcl_Obj * that + * holds the value of this option, specified + * as an offset in bytes from the start of + * the record. Use the Tk_Offset macro to + * generate values for this. -1 means don't + * store the Tcl_Obj in the record. */ + int internalOffset; /* Where in record to store the internal + * representation of the value of this option, + * such as an int or XColor *. This field + * is specified as an offset in bytes + * from the start of the record. Use the + * Tk_Offset macro to generate values for it. + * -1 means don't store the internal + * representation in the record. */ + int flags; /* Any combination of the values defined + * below. */ + ClientData clientData; /* An alternate place to put option-specific + * data. Used for the monochrome default value + * for colors, etc. */ + int typeMask; /* An arbitrary bit mask defined by the + * class manager; typically bits correspond + * to certain kinds of options such as all + * those that require a redisplay when they + * change. Tk_SetOptions returns the bit-wise + * OR of the typeMasks of all options that + * were changed. */ +} Tk_OptionSpec; + +/* + * Flag values for Tk_OptionSpec structures. These flags are shared by + * Tk_ConfigSpec structures, so be sure to coordinate any changes + * carefully. + */ + +#define TK_OPTION_NULL_OK (1 << 0) +#define TK_OPTION_DONT_SET_DEFAULT (1 << 3) + +/* + * The following structure and function types are used by TK_OPTION_CUSTOM + * options; the structure holds pointers to the functions needed by the Tk + * option config code to handle a custom option. + */ + +typedef int (Tk_CustomOptionSetProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj **value, char *widgRec, + int offset, char *saveInternalPtr, int flags)); +typedef Tcl_Obj *(Tk_CustomOptionGetProc) _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *widgRec, int offset)); +typedef void (Tk_CustomOptionRestoreProc) _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *internalPtr, char *saveInternalPtr)); +typedef void (Tk_CustomOptionFreeProc) _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *internalPtr)); + +typedef struct Tk_ObjCustomOption { + char *name; /* Name of the custom option. */ + Tk_CustomOptionSetProc *setProc; /* Function to use to set a record's + * option value from a Tcl_Obj */ + Tk_CustomOptionGetProc *getProc; /* Function to use to get a Tcl_Obj + * representation from an internal + * representation of an option. */ + Tk_CustomOptionRestoreProc *restoreProc; /* Function to use to restore a + * saved value for the internal + * representation. */ + Tk_CustomOptionFreeProc *freeProc; /* Function to use to free the internal + * representation of an option. */ + ClientData clientData; /* Arbitrary one-word value passed to + * the handling procs. */ +} Tk_ObjCustomOption; + + +/* + * Macro to use to fill in "offset" fields of the Tk_OptionSpec. + * struct. Computes number of bytes from beginning of structure + * to a given field. + */ + +#ifdef offsetof +#define Tk_Offset(type, field) ((int) offsetof(type, field)) +#else +#define Tk_Offset(type, field) ((int) ((char *) &((type *) 0)->field)) +#endif + +/* + * The following two structures are used for error handling. When + * configuration options are being modified, the old values are + * saved in a Tk_SavedOptions structure. If an error occurs, then the + * contents of the structure can be used to restore all of the old + * values. The contents of this structure are for the private use + * Tk. No-one outside Tk should ever read or write any of the fields + * of these structures. + */ + +typedef struct Tk_SavedOption { + struct TkOption *optionPtr; /* Points to information that describes + * the option. */ + Tcl_Obj *valuePtr; /* The old value of the option, in + * the form of a Tcl object; may be + * NULL if the value wasn't saved as + * an object. */ + double internalForm; /* The old value of the option, in + * some internal representation such + * as an int or (XColor *). Valid + * only if optionPtr->specPtr->objOffset + * is < 0. The space must be large + * enough to accommodate a double, a + * long, or a pointer; right now it + * looks like a double is big + * enough. Also, using a double + * guarantees that the field is + * properly aligned for storing large + * values. */ +} Tk_SavedOption; + +#ifdef TCL_MEM_DEBUG +# define TK_NUM_SAVED_OPTIONS 2 +#else +# define TK_NUM_SAVED_OPTIONS 20 +#endif + +typedef struct Tk_SavedOptions { + char *recordPtr; /* The data structure in which to + * restore configuration options. */ + Tk_Window tkwin; /* Window associated with recordPtr; + * needed to restore certain options. */ + int numItems; /* The number of valid items in + * items field. */ + Tk_SavedOption items[TK_NUM_SAVED_OPTIONS]; + /* Items used to hold old values. */ + struct Tk_SavedOptions *nextPtr; /* Points to next structure in list; + * needed if too many options changed + * to hold all the old values in a + * single structure. NULL means no + * more structures. */ +} Tk_SavedOptions; + +/* + * Structure used to describe application-specific configuration + * options: indicates procedures to call to parse an option and + * to return a text string describing an option. THESE ARE + * DEPRECATED; PLEASE USE THE NEW STRUCTURES LISTED ABOVE. + */ + +/* + * This is a temporary flag used while tkObjConfig and new widgets + * are in development. + */ + +#ifndef __NO_OLD_CONFIG + +typedef int (Tk_OptionParseProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, CONST84 char *value, char *widgRec, + int offset)); +typedef char *(Tk_OptionPrintProc) _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *widgRec, int offset, + Tcl_FreeProc **freeProcPtr)); + +typedef struct Tk_CustomOption { + Tk_OptionParseProc *parseProc; /* Procedure to call to parse an + * option and store it in converted + * form. */ + Tk_OptionPrintProc *printProc; /* Procedure to return a printable + * string describing an existing + * option. */ + ClientData clientData; /* Arbitrary one-word value used by + * option parser: passed to + * parseProc and printProc. */ +} Tk_CustomOption; + +/* + * Structure used to specify information for Tk_ConfigureWidget. Each + * structure gives complete information for one option, including + * how the option is specified on the command line, where it appears + * in the option database, etc. + */ + +typedef struct Tk_ConfigSpec { + int type; /* Type of option, such as TK_CONFIG_COLOR; + * see definitions below. Last option in + * table must have type TK_CONFIG_END. */ + char *argvName; /* Switch used to specify option in argv. + * NULL means this spec is part of a group. */ + Tk_Uid dbName; /* Name for option in option database. */ + Tk_Uid dbClass; /* Class for option in database. */ + Tk_Uid defValue; /* Default value for option if not + * specified in command line or database. */ + int offset; /* Where in widget record to store value; + * use Tk_Offset macro to generate values + * for this. */ + int specFlags; /* Any combination of the values defined + * below; other bits are used internally + * by tkConfig.c. */ + Tk_CustomOption *customPtr; /* If type is TK_CONFIG_CUSTOM then this is + * a pointer to info about how to parse and + * print the option. Otherwise it is + * irrelevant. */ +} Tk_ConfigSpec; + +/* + * Type values for Tk_ConfigSpec structures. See the user + * documentation for details. + */ + +typedef enum { + TK_CONFIG_BOOLEAN, TK_CONFIG_INT, TK_CONFIG_DOUBLE, TK_CONFIG_STRING, + TK_CONFIG_UID, TK_CONFIG_COLOR, TK_CONFIG_FONT, TK_CONFIG_BITMAP, + TK_CONFIG_BORDER, TK_CONFIG_RELIEF, TK_CONFIG_CURSOR, + TK_CONFIG_ACTIVE_CURSOR, TK_CONFIG_JUSTIFY, TK_CONFIG_ANCHOR, + TK_CONFIG_SYNONYM, TK_CONFIG_CAP_STYLE, TK_CONFIG_JOIN_STYLE, + TK_CONFIG_PIXELS, TK_CONFIG_MM, TK_CONFIG_WINDOW, TK_CONFIG_CUSTOM, + TK_CONFIG_END +} Tk_ConfigTypes; + +/* + * Possible values for flags argument to Tk_ConfigureWidget: + */ + +#define TK_CONFIG_ARGV_ONLY 1 +#define TK_CONFIG_OBJS 0x80 + +/* + * Possible flag values for Tk_ConfigSpec structures. Any bits at + * or above TK_CONFIG_USER_BIT may be used by clients for selecting + * certain entries. Before changing any values here, coordinate with + * tkOldConfig.c (internal-use-only flags are defined there). + */ + +#define TK_CONFIG_NULL_OK (1 << 0) +#define TK_CONFIG_COLOR_ONLY (1 << 1) +#define TK_CONFIG_MONO_ONLY (1 << 2) +#define TK_CONFIG_DONT_SET_DEFAULT (1 << 3) +#define TK_CONFIG_OPTION_SPECIFIED (1 << 4) +#define TK_CONFIG_USER_BIT 0x100 +#endif /* __NO_OLD_CONFIG */ + +/* + * Structure used to specify how to handle argv options. + */ + +typedef struct { + char *key; /* The key string that flags the option in the + * argv array. */ + int type; /* Indicates option type; see below. */ + char *src; /* Value to be used in setting dst; usage + * depends on type. */ + char *dst; /* Address of value to be modified; usage + * depends on type. */ + char *help; /* Documentation message describing this option. */ +} Tk_ArgvInfo; + +/* + * Legal values for the type field of a Tk_ArgvInfo: see the user + * documentation for details. + */ + +#define TK_ARGV_CONSTANT 15 +#define TK_ARGV_INT 16 +#define TK_ARGV_STRING 17 +#define TK_ARGV_UID 18 +#define TK_ARGV_REST 19 +#define TK_ARGV_FLOAT 20 +#define TK_ARGV_FUNC 21 +#define TK_ARGV_GENFUNC 22 +#define TK_ARGV_HELP 23 +#define TK_ARGV_CONST_OPTION 24 +#define TK_ARGV_OPTION_VALUE 25 +#define TK_ARGV_OPTION_NAME_VALUE 26 +#define TK_ARGV_END 27 + +/* + * Flag bits for passing to Tk_ParseArgv: + */ + +#define TK_ARGV_NO_DEFAULTS 0x1 +#define TK_ARGV_NO_LEFTOVERS 0x2 +#define TK_ARGV_NO_ABBREV 0x4 +#define TK_ARGV_DONT_SKIP_FIRST_ARG 0x8 + +/* + * Enumerated type for describing actions to be taken in response + * to a restrictProc established by Tk_RestrictEvents. + */ + +typedef enum { + TK_DEFER_EVENT, TK_PROCESS_EVENT, TK_DISCARD_EVENT +} Tk_RestrictAction; + +/* + * Priority levels to pass to Tk_AddOption: + */ + +#define TK_WIDGET_DEFAULT_PRIO 20 +#define TK_STARTUP_FILE_PRIO 40 +#define TK_USER_DEFAULT_PRIO 60 +#define TK_INTERACTIVE_PRIO 80 +#define TK_MAX_PRIO 100 + +/* + * Relief values returned by Tk_GetRelief: + */ + +#define TK_RELIEF_NULL -1 +#define TK_RELIEF_FLAT 0 +#define TK_RELIEF_GROOVE 1 +#define TK_RELIEF_RAISED 2 +#define TK_RELIEF_RIDGE 3 +#define TK_RELIEF_SOLID 4 +#define TK_RELIEF_SUNKEN 5 + +/* + * "Which" argument values for Tk_3DBorderGC: + */ + +#define TK_3D_FLAT_GC 1 +#define TK_3D_LIGHT_GC 2 +#define TK_3D_DARK_GC 3 + +/* + * Special EnterNotify/LeaveNotify "mode" for use in events + * generated by tkShare.c. Pick a high enough value that it's + * unlikely to conflict with existing values (like NotifyNormal) + * or any new values defined in the future. + */ + +#define TK_NOTIFY_SHARE 20 + +/* + * Enumerated type for describing a point by which to anchor something: + */ + +typedef enum { + TK_ANCHOR_N, TK_ANCHOR_NE, TK_ANCHOR_E, TK_ANCHOR_SE, + TK_ANCHOR_S, TK_ANCHOR_SW, TK_ANCHOR_W, TK_ANCHOR_NW, + TK_ANCHOR_CENTER +} Tk_Anchor; + +/* + * Enumerated type for describing a style of justification: + */ + +typedef enum { + TK_JUSTIFY_LEFT, TK_JUSTIFY_RIGHT, TK_JUSTIFY_CENTER +} Tk_Justify; + +/* + * The following structure is used by Tk_GetFontMetrics() to return + * information about the properties of a Tk_Font. + */ + +typedef struct Tk_FontMetrics { + int ascent; /* The amount in pixels that the tallest + * letter sticks up above the baseline, plus + * any extra blank space added by the designer + * of the font. */ + int descent; /* The largest amount in pixels that any + * letter sticks below the baseline, plus any + * extra blank space added by the designer of + * the font. */ + int linespace; /* The sum of the ascent and descent. How + * far apart two lines of text in the same + * font should be placed so that none of the + * characters in one line overlap any of the + * characters in the other line. */ +} Tk_FontMetrics; + +/* + * Flags passed to Tk_MeasureChars: + */ + +#define TK_WHOLE_WORDS 1 +#define TK_AT_LEAST_ONE 2 +#define TK_PARTIAL_OK 4 + +/* + * Flags passed to Tk_ComputeTextLayout: + */ + +#define TK_IGNORE_TABS 8 +#define TK_IGNORE_NEWLINES 16 + +/* + * Widget class procedures used to implement platform specific widget + * behavior. + */ + +typedef Window (Tk_ClassCreateProc) _ANSI_ARGS_((Tk_Window tkwin, + Window parent, ClientData instanceData)); +typedef void (Tk_ClassWorldChangedProc) _ANSI_ARGS_((ClientData instanceData)); +typedef void (Tk_ClassModalProc) _ANSI_ARGS_((Tk_Window tkwin, + XEvent *eventPtr)); + +typedef struct Tk_ClassProcs { + unsigned int size; + Tk_ClassWorldChangedProc *worldChangedProc; + /* Procedure to invoke when the widget needs to + * respond in some way to a change in the + * world (font changes, etc.) */ + Tk_ClassCreateProc *createProc; + /* Procedure to invoke when the + * platform-dependent window needs to be + * created. */ + Tk_ClassModalProc *modalProc; + /* Procedure to invoke after all bindings on a + * widget have been triggered in order to + * handle a modal loop. */ +} Tk_ClassProcs; + +/* + * Simple accessor for Tk_ClassProcs structure. Checks that the structure + * is not NULL, then checks the size field and returns either the requested + * field, if present, or NULL if the structure is too small to have the field + * (or NULL if the structure is NULL). + * + * A more general version of this function may be useful if other + * size-versioned structure pop up in the future: + * + * #define Tk_GetField(name, who, which) \ + * (((who) == NULL) ? NULL : + * (((who)->size <= Tk_Offset(name, which)) ? NULL :(name)->which)) + */ + +#define Tk_GetClassProc(procs, which) \ + (((procs) == NULL) ? NULL : \ + (((procs)->size <= Tk_Offset(Tk_ClassProcs, which)) ? NULL:(procs)->which)) + +/* + * Each geometry manager (the packer, the placer, etc.) is represented + * by a structure of the following form, which indicates procedures + * to invoke in the geometry manager to carry out certain functions. + */ + +typedef void (Tk_GeomRequestProc) _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin)); +typedef void (Tk_GeomLostSlaveProc) _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin)); + +typedef struct Tk_GeomMgr { + char *name; /* Name of the geometry manager (command + * used to invoke it, or name of widget + * class that allows embedded widgets). */ + Tk_GeomRequestProc *requestProc; + /* Procedure to invoke when a slave's + * requested geometry changes. */ + Tk_GeomLostSlaveProc *lostSlaveProc; + /* Procedure to invoke when a slave is + * taken away from one geometry manager + * by another. NULL means geometry manager + * doesn't care when slaves are lost. */ +} Tk_GeomMgr; + +/* + * Result values returned by Tk_GetScrollInfo: + */ + +#define TK_SCROLL_MOVETO 1 +#define TK_SCROLL_PAGES 2 +#define TK_SCROLL_UNITS 3 +#define TK_SCROLL_ERROR 4 + +/* + *--------------------------------------------------------------------------- + * + * Extensions to the X event set + * + *--------------------------------------------------------------------------- + */ + +#define VirtualEvent (MappingNotify + 1) +#define ActivateNotify (MappingNotify + 2) +#define DeactivateNotify (MappingNotify + 3) +#define MouseWheelEvent (MappingNotify + 4) +#define TK_LASTEVENT (MappingNotify + 5) + +#define MouseWheelMask (1L << 28) +#define ActivateMask (1L << 29) +#define VirtualEventMask (1L << 30) + +/* + * A virtual event shares most of its fields with the XKeyEvent and + * XButtonEvent structures. 99% of the time a virtual event will be + * an abstraction of a key or button event, so this structure provides + * the most information to the user. The only difference is the changing + * of the detail field for a virtual event so that it holds the name of the + * virtual event being triggered. + * + * When using this structure, if you want your code to work correctly + * in Tk 8.5 as well, you should ensure that you zero out all the + * fields first using memset() or bzero(). + */ + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* True if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; /* Window on which event was requested. */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + Tk_Uid name; /* Name of virtual event. */ + Bool same_screen; /* same screen flag */ + Tcl_Obj *user_data; /* not used in Tk 8.4 */ +} XVirtualEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* True if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* Window in which event occurred. */ +} XActivateDeactivateEvent; +typedef XActivateDeactivateEvent XActivateEvent; +typedef XActivateDeactivateEvent XDeactivateEvent; + +/* + *-------------------------------------------------------------- + * + * Macros for querying Tk_Window structures. See the + * manual entries for documentation. + * + *-------------------------------------------------------------- + */ + +#define Tk_Display(tkwin) (((Tk_FakeWin *) (tkwin))->display) +#define Tk_ScreenNumber(tkwin) (((Tk_FakeWin *) (tkwin))->screenNum) +#define Tk_Screen(tkwin) (ScreenOfDisplay(Tk_Display(tkwin), \ + Tk_ScreenNumber(tkwin))) +#define Tk_Depth(tkwin) (((Tk_FakeWin *) (tkwin))->depth) +#define Tk_Visual(tkwin) (((Tk_FakeWin *) (tkwin))->visual) +#define Tk_WindowId(tkwin) (((Tk_FakeWin *) (tkwin))->window) +#define Tk_PathName(tkwin) (((Tk_FakeWin *) (tkwin))->pathName) +#define Tk_Name(tkwin) (((Tk_FakeWin *) (tkwin))->nameUid) +#define Tk_Class(tkwin) (((Tk_FakeWin *) (tkwin))->classUid) +#define Tk_X(tkwin) (((Tk_FakeWin *) (tkwin))->changes.x) +#define Tk_Y(tkwin) (((Tk_FakeWin *) (tkwin))->changes.y) +#define Tk_Width(tkwin) (((Tk_FakeWin *) (tkwin))->changes.width) +#define Tk_Height(tkwin) \ + (((Tk_FakeWin *) (tkwin))->changes.height) +#define Tk_Changes(tkwin) (&((Tk_FakeWin *) (tkwin))->changes) +#define Tk_Attributes(tkwin) (&((Tk_FakeWin *) (tkwin))->atts) +#define Tk_IsEmbedded(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_EMBEDDED) +#define Tk_IsContainer(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_CONTAINER) +#define Tk_IsMapped(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_MAPPED) +#define Tk_IsTopLevel(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_TOP_LEVEL) +#define Tk_HasWrapper(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_HAS_WRAPPER) +#define Tk_WinManaged(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_WIN_MANAGED) +#define Tk_TopWinHierarchy(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_TOP_HIERARCHY) +#define Tk_ReqWidth(tkwin) (((Tk_FakeWin *) (tkwin))->reqWidth) +#define Tk_ReqHeight(tkwin) (((Tk_FakeWin *) (tkwin))->reqHeight) +/* Tk_InternalBorderWidth is deprecated */ +#define Tk_InternalBorderWidth(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderLeft) +#define Tk_InternalBorderLeft(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderLeft) +#define Tk_InternalBorderRight(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderRight) +#define Tk_InternalBorderTop(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderTop) +#define Tk_InternalBorderBottom(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderBottom) +#define Tk_MinReqWidth(tkwin) (((Tk_FakeWin *) (tkwin))->minReqWidth) +#define Tk_MinReqHeight(tkwin) (((Tk_FakeWin *) (tkwin))->minReqHeight) +#define Tk_Parent(tkwin) (((Tk_FakeWin *) (tkwin))->parentPtr) +#define Tk_Colormap(tkwin) (((Tk_FakeWin *) (tkwin))->atts.colormap) + +/* + * The structure below is needed by the macros above so that they can + * access the fields of a Tk_Window. The fields not needed by the macros + * are declared as "dummyX". The structure has its own type in order to + * prevent applications from accessing Tk_Window fields except using + * official macros. WARNING!! The structure definition must be kept + * consistent with the TkWindow structure in tkInt.h. If you change one, + * then change the other. See the declaration in tkInt.h for + * documentation on what the fields are used for internally. + */ + +typedef struct Tk_FakeWin { + Display *display; + char *dummy1; /* dispPtr */ + int screenNum; + Visual *visual; + int depth; + Window window; + char *dummy2; /* childList */ + char *dummy3; /* lastChildPtr */ + Tk_Window parentPtr; /* parentPtr */ + char *dummy4; /* nextPtr */ + char *dummy5; /* mainPtr */ + char *pathName; + Tk_Uid nameUid; + Tk_Uid classUid; + XWindowChanges changes; + unsigned int dummy6; /* dirtyChanges */ + XSetWindowAttributes atts; + unsigned long dummy7; /* dirtyAtts */ + unsigned int flags; + char *dummy8; /* handlerList */ +#ifdef TK_USE_INPUT_METHODS + XIC dummy9; /* inputContext */ +#endif /* TK_USE_INPUT_METHODS */ + ClientData *dummy10; /* tagPtr */ + int dummy11; /* numTags */ + int dummy12; /* optionLevel */ + char *dummy13; /* selHandlerList */ + char *dummy14; /* geomMgrPtr */ + ClientData dummy15; /* geomData */ + int reqWidth, reqHeight; + int internalBorderLeft; + char *dummy16; /* wmInfoPtr */ + char *dummy17; /* classProcPtr */ + ClientData dummy18; /* instanceData */ + char *dummy19; /* privatePtr */ + int internalBorderRight; + int internalBorderTop; + int internalBorderBottom; + int minReqWidth; + int minReqHeight; +} Tk_FakeWin; + +/* + * Flag values for TkWindow (and Tk_FakeWin) structures are: + * + * TK_MAPPED: 1 means window is currently mapped, + * 0 means unmapped. + * TK_TOP_LEVEL: 1 means this is a top-level widget. + * TK_ALREADY_DEAD: 1 means the window is in the process of + * being destroyed already. + * TK_NEED_CONFIG_NOTIFY: 1 means that the window has been reconfigured + * before it was made to exist. At the time of + * making it exist a ConfigureNotify event needs + * to be generated. + * TK_GRAB_FLAG: Used to manage grabs. See tkGrab.c for + * details. + * TK_CHECKED_IC: 1 means we've already tried to get an input + * context for this window; if the ic field + * is NULL it means that there isn't a context + * for the field. + * TK_DONT_DESTROY_WINDOW: 1 means that Tk_DestroyWindow should not + * invoke XDestroyWindow to destroy this widget's + * X window. The flag is set when the window + * has already been destroyed elsewhere (e.g. + * by another application) or when it will be + * destroyed later (e.g. by destroying its + * parent). + * TK_WM_COLORMAP_WINDOW: 1 means that this window has at some time + * appeared in the WM_COLORMAP_WINDOWS property + * for its toplevel, so we have to remove it + * from that property if the window is + * deleted and the toplevel isn't. + * TK_EMBEDDED: 1 means that this window (which must be a + * toplevel) is not a free-standing window but + * rather is embedded in some other application. + * TK_CONTAINER: 1 means that this window is a container, and + * that some other application (either in + * this process or elsewhere) may be + * embedding itself inside the window. + * TK_BOTH_HALVES: 1 means that this window is used for + * application embedding (either as + * container or embedded application), and + * both the containing and embedded halves + * are associated with windows in this + * particular process. + * TK_DEFER_MODAL: 1 means that this window has deferred a modal + * loop until all of the bindings for the current + * event have been invoked. + * TK_WRAPPER: 1 means that this window is the extra + * wrapper window created around a toplevel + * to hold the menubar under Unix. See + * tkUnixWm.c for more information. + * TK_REPARENTED: 1 means that this window has been reparented + * so that as far as the window system is + * concerned it isn't a child of its Tk + * parent. Initially this is used only for + * special Unix menubar windows. + * TK_ANONYMOUS_WINDOW: 1 means that this window has no name, and is + * thus not accessible from Tk. + * TK_HAS_WRAPPER 1 means that this window has a wrapper window + * TK_WIN_MANAGED 1 means that this window is a child of the + * root window, and is managed by the window + * manager. + * TK_TOP_HIERARCHY 1 means this window is at the top of a + * physical window hierarchy within this + * process, i.e. the window's parent + * either doesn't exist or is not owned by + * this Tk application. + * TK_PROP_PROPCHANGE 1 means that PropertyNotify events in + * this window's children should propagate + * up to this window. + */ + + +#define TK_MAPPED 1 +#define TK_TOP_LEVEL 2 +#define TK_ALREADY_DEAD 4 +#define TK_NEED_CONFIG_NOTIFY 8 +#define TK_GRAB_FLAG 0x10 +#define TK_CHECKED_IC 0x20 +#define TK_DONT_DESTROY_WINDOW 0x40 +#define TK_WM_COLORMAP_WINDOW 0x80 +#define TK_EMBEDDED 0x100 +#define TK_CONTAINER 0x200 +#define TK_BOTH_HALVES 0x400 +#define TK_DEFER_MODAL 0x800 +#define TK_WRAPPER 0x1000 +#define TK_REPARENTED 0x2000 +#define TK_ANONYMOUS_WINDOW 0x4000 +#define TK_HAS_WRAPPER 0x8000 +#define TK_WIN_MANAGED 0x10000 +#define TK_TOP_HIERARCHY 0x20000 +#define TK_PROP_PROPCHANGE 0x40000 + +/* + *-------------------------------------------------------------- + * + * Procedure prototypes and structures used for defining new canvas + * items: + * + *-------------------------------------------------------------- + */ + +typedef enum { + TK_STATE_NULL = -1, TK_STATE_ACTIVE, TK_STATE_DISABLED, + TK_STATE_NORMAL, TK_STATE_HIDDEN +} Tk_State; + +typedef struct Tk_SmoothMethod { + char *name; + int (*coordProc) _ANSI_ARGS_((Tk_Canvas canvas, + double *pointPtr, int numPoints, int numSteps, + XPoint xPoints[], double dblPoints[])); + void (*postscriptProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, double *coordPtr, + int numPoints, int numSteps)); +} Tk_SmoothMethod; + +/* + * For each item in a canvas widget there exists one record with + * the following structure. Each actual item is represented by + * a record with the following stuff at its beginning, plus additional + * type-specific stuff after that. + */ + +#define TK_TAG_SPACE 3 + +typedef struct Tk_Item { + int id; /* Unique identifier for this item + * (also serves as first tag for + * item). */ + struct Tk_Item *nextPtr; /* Next in display list of all + * items in this canvas. Later items + * in list are drawn on top of earlier + * ones. */ + Tk_Uid staticTagSpace[TK_TAG_SPACE];/* Built-in space for limited # of + * tags. */ + Tk_Uid *tagPtr; /* Pointer to array of tags. Usually + * points to staticTagSpace, but + * may point to malloc-ed space if + * there are lots of tags. */ + int tagSpace; /* Total amount of tag space available + * at tagPtr. */ + int numTags; /* Number of tag slots actually used + * at *tagPtr. */ + struct Tk_ItemType *typePtr; /* Table of procedures that implement + * this type of item. */ + int x1, y1, x2, y2; /* Bounding box for item, in integer + * canvas units. Set by item-specific + * code and guaranteed to contain every + * pixel drawn in item. Item area + * includes x1 and y1 but not x2 + * and y2. */ + struct Tk_Item *prevPtr; /* Previous in display list of all + * items in this canvas. Later items + * in list are drawn just below earlier + * ones. */ + Tk_State state; /* state of item */ + char *reserved1; /* reserved for future use */ + int redraw_flags; /* some flags used in the canvas */ + + /* + *------------------------------------------------------------------ + * Starting here is additional type-specific stuff; see the + * declarations for individual types to see what is part of + * each type. The actual space below is determined by the + * "itemInfoSize" of the type's Tk_ItemType record. + *------------------------------------------------------------------ + */ +} Tk_Item; + +/* + * Flag bits for canvases (redraw_flags): + * + * TK_ITEM_STATE_DEPENDANT - 1 means that object needs to be + * redrawn if the canvas state changes. + * TK_ITEM_DONT_REDRAW - 1 means that the object redraw is already + * been prepared, so the general canvas code + * doesn't need to do that any more. + */ + +#define TK_ITEM_STATE_DEPENDANT 1 +#define TK_ITEM_DONT_REDRAW 2 + +/* + * Records of the following type are used to describe a type of + * item (e.g. lines, circles, etc.) that can form part of a + * canvas widget. + */ + +#ifdef USE_OLD_CANVAS +typedef int Tk_ItemCreateProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int argc, + char **argv)); +typedef int Tk_ItemConfigureProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int argc, + char **argv, int flags)); +typedef int Tk_ItemCoordProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int argc, + char **argv)); +#else +typedef int Tk_ItemCreateProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int argc, + Tcl_Obj *CONST objv[])); +typedef int Tk_ItemConfigureProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int argc, + Tcl_Obj *CONST objv[], int flags)); +typedef int Tk_ItemCoordProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int argc, + Tcl_Obj *CONST argv[])); +#endif +typedef void Tk_ItemDeleteProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, Display *display)); +typedef void Tk_ItemDisplayProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, Display *display, Drawable dst, + int x, int y, int width, int height)); +typedef double Tk_ItemPointProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, double *pointPtr)); +typedef int Tk_ItemAreaProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, double *rectPtr)); +typedef int Tk_ItemPostscriptProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int prepass)); +typedef void Tk_ItemScaleProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, double originX, double originY, + double scaleX, double scaleY)); +typedef void Tk_ItemTranslateProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, double deltaX, double deltaY)); +typedef int Tk_ItemIndexProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, char *indexString, + int *indexPtr)); +typedef void Tk_ItemCursorProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, int index)); +typedef int Tk_ItemSelectionProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, int offset, char *buffer, + int maxBytes)); +typedef void Tk_ItemInsertProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, int beforeThis, char *string)); +typedef void Tk_ItemDCharsProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, int first, int last)); + +#ifndef __NO_OLD_CONFIG + +typedef struct Tk_ItemType { + char *name; /* The name of this type of item, such + * as "line". */ + int itemSize; /* Total amount of space needed for + * item's record. */ + Tk_ItemCreateProc *createProc; /* Procedure to create a new item of + * this type. */ + Tk_ConfigSpec *configSpecs; /* Pointer to array of configuration + * specs for this type. Used for + * returning configuration info. */ + Tk_ItemConfigureProc *configProc; /* Procedure to call to change + * configuration options. */ + Tk_ItemCoordProc *coordProc; /* Procedure to call to get and set + * the item's coordinates. */ + Tk_ItemDeleteProc *deleteProc; /* Procedure to delete existing item of + * this type. */ + Tk_ItemDisplayProc *displayProc; /* Procedure to display items of + * this type. */ + int alwaysRedraw; /* Non-zero means displayProc should + * be called even when the item has + * been moved off-screen. */ + Tk_ItemPointProc *pointProc; /* Computes distance from item to + * a given point. */ + Tk_ItemAreaProc *areaProc; /* Computes whether item is inside, + * outside, or overlapping an area. */ + Tk_ItemPostscriptProc *postscriptProc; + /* Procedure to write a Postscript + * description for items of this + * type. */ + Tk_ItemScaleProc *scaleProc; /* Procedure to rescale items of + * this type. */ + Tk_ItemTranslateProc *translateProc;/* Procedure to translate items of + * this type. */ + Tk_ItemIndexProc *indexProc; /* Procedure to determine index of + * indicated character. NULL if + * item doesn't support indexing. */ + Tk_ItemCursorProc *icursorProc; /* Procedure to set insert cursor pos. + * to just before a given position. */ + Tk_ItemSelectionProc *selectionProc;/* Procedure to return selection (in + * STRING format) when it is in this + * item. */ + Tk_ItemInsertProc *insertProc; /* Procedure to insert something into + * an item. */ + Tk_ItemDCharsProc *dCharsProc; /* Procedure to delete characters + * from an item. */ + struct Tk_ItemType *nextPtr; /* Used to link types together into + * a list. */ + char *reserved1; /* Reserved for future extension. */ + int reserved2; /* Carefully compatible with */ + char *reserved3; /* Jan Nijtmans dash patch */ + char *reserved4; +} Tk_ItemType; + +#endif + +/* + * The following structure provides information about the selection and + * the insertion cursor. It is needed by only a few items, such as + * those that display text. It is shared by the generic canvas code + * and the item-specific code, but most of the fields should be written + * only by the canvas generic code. + */ + +typedef struct Tk_CanvasTextInfo { + Tk_3DBorder selBorder; /* Border and background for selected + * characters. Read-only to items.*/ + int selBorderWidth; /* Width of border around selection. + * Read-only to items. */ + XColor *selFgColorPtr; /* Foreground color for selected text. + * Read-only to items. */ + Tk_Item *selItemPtr; /* Pointer to selected item. NULL means + * selection isn't in this canvas. + * Writable by items. */ + int selectFirst; /* Character index of first selected + * character. Writable by items. */ + int selectLast; /* Character index of last selected + * character. Writable by items. */ + Tk_Item *anchorItemPtr; /* Item corresponding to "selectAnchor": + * not necessarily selItemPtr. Read-only + * to items. */ + int selectAnchor; /* Character index of fixed end of + * selection (i.e. "select to" operation will + * use this as one end of the selection). + * Writable by items. */ + Tk_3DBorder insertBorder; /* Used to draw vertical bar for insertion + * cursor. Read-only to items. */ + int insertWidth; /* Total width of insertion cursor. Read-only + * to items. */ + int insertBorderWidth; /* Width of 3-D border around insert cursor. + * Read-only to items. */ + Tk_Item *focusItemPtr; /* Item that currently has the input focus, + * or NULL if no such item. Read-only to + * items. */ + int gotFocus; /* Non-zero means that the canvas widget has + * the input focus. Read-only to items.*/ + int cursorOn; /* Non-zero means that an insertion cursor + * should be displayed in focusItemPtr. + * Read-only to items.*/ +} Tk_CanvasTextInfo; + +/* + * Structures used for Dashing and Outline. + */ + +typedef struct Tk_Dash { + int number; + union { + char *pt; + char array[sizeof(char *)]; + } pattern; +} Tk_Dash; + +typedef struct Tk_TSOffset { + int flags; /* flags; see below for possible values */ + int xoffset; /* x offset */ + int yoffset; /* y offset */ +} Tk_TSOffset; + +/* + * Bit fields in Tk_Offset->flags: + */ + +#define TK_OFFSET_INDEX 1 +#define TK_OFFSET_RELATIVE 2 +#define TK_OFFSET_LEFT 4 +#define TK_OFFSET_CENTER 8 +#define TK_OFFSET_RIGHT 16 +#define TK_OFFSET_TOP 32 +#define TK_OFFSET_MIDDLE 64 +#define TK_OFFSET_BOTTOM 128 + +typedef struct Tk_Outline { + GC gc; /* Graphics context. */ + double width; /* Width of outline. */ + double activeWidth; /* Width of outline. */ + double disabledWidth; /* Width of outline. */ + int offset; /* Dash offset */ + Tk_Dash dash; /* Dash pattern */ + Tk_Dash activeDash; /* Dash pattern if state is active*/ + Tk_Dash disabledDash; /* Dash pattern if state is disabled*/ + VOID *reserved1; /* reserved for future expansion */ + VOID *reserved2; + VOID *reserved3; + Tk_TSOffset tsoffset; /* stipple offset for outline*/ + XColor *color; /* Outline color. */ + XColor *activeColor; /* Outline color if state is active. */ + XColor *disabledColor; /* Outline color if state is disabled. */ + Pixmap stipple; /* Outline Stipple pattern. */ + Pixmap activeStipple; /* Outline Stipple pattern if state is active. */ + Pixmap disabledStipple; /* Outline Stipple pattern if state is disabled. */ +} Tk_Outline; + + +/* + *-------------------------------------------------------------- + * + * Procedure prototypes and structures used for managing images: + * + *-------------------------------------------------------------- + */ + +typedef struct Tk_ImageType Tk_ImageType; +#ifdef USE_OLD_IMAGE +typedef int (Tk_ImageCreateProc) _ANSI_ARGS_((Tcl_Interp *interp, + char *name, int argc, char **argv, Tk_ImageType *typePtr, + Tk_ImageMaster master, ClientData *masterDataPtr)); +#else +typedef int (Tk_ImageCreateProc) _ANSI_ARGS_((Tcl_Interp *interp, + char *name, int objc, Tcl_Obj *CONST objv[], Tk_ImageType *typePtr, + Tk_ImageMaster master, ClientData *masterDataPtr)); +#endif +typedef ClientData (Tk_ImageGetProc) _ANSI_ARGS_((Tk_Window tkwin, + ClientData masterData)); +typedef void (Tk_ImageDisplayProc) _ANSI_ARGS_((ClientData instanceData, + Display *display, Drawable drawable, int imageX, int imageY, + int width, int height, int drawableX, int drawableY)); +typedef void (Tk_ImageFreeProc) _ANSI_ARGS_((ClientData instanceData, + Display *display)); +typedef void (Tk_ImageDeleteProc) _ANSI_ARGS_((ClientData masterData)); +typedef void (Tk_ImageChangedProc) _ANSI_ARGS_((ClientData clientData, + int x, int y, int width, int height, int imageWidth, + int imageHeight)); +typedef int (Tk_ImagePostscriptProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, Tk_PostscriptInfo psinfo, + int x, int y, int width, int height, int prepass)); + +/* + * The following structure represents a particular type of image + * (bitmap, xpm image, etc.). It provides information common to + * all images of that type, such as the type name and a collection + * of procedures in the image manager that respond to various + * events. Each image manager is represented by one of these + * structures. + */ + +struct Tk_ImageType { + char *name; /* Name of image type. */ + Tk_ImageCreateProc *createProc; + /* Procedure to call to create a new image + * of this type. */ + Tk_ImageGetProc *getProc; /* Procedure to call the first time + * Tk_GetImage is called in a new way + * (new visual or screen). */ + Tk_ImageDisplayProc *displayProc; + /* Call to draw image, in response to + * Tk_RedrawImage calls. */ + Tk_ImageFreeProc *freeProc; /* Procedure to call whenever Tk_FreeImage + * is called to release an instance of an + * image. */ + Tk_ImageDeleteProc *deleteProc; + /* Procedure to call to delete image. It + * will not be called until after freeProc + * has been called for each instance of the + * image. */ + Tk_ImagePostscriptProc *postscriptProc; + /* Procedure to call to produce postscript + * output for the image. */ + struct Tk_ImageType *nextPtr; + /* Next in list of all image types currently + * known. Filled in by Tk, not by image + * manager. */ + char *reserved; /* reserved for future expansion */ +}; + +/* + *-------------------------------------------------------------- + * + * Additional definitions used to manage images of type "photo". + * + *-------------------------------------------------------------- + */ + +/* + * The following type is used to identify a particular photo image + * to be manipulated: + */ + +typedef void *Tk_PhotoHandle; + +/* + * The following structure describes a block of pixels in memory: + */ + +typedef struct Tk_PhotoImageBlock { + unsigned char *pixelPtr; /* Pointer to the first pixel. */ + int width; /* Width of block, in pixels. */ + int height; /* Height of block, in pixels. */ + int pitch; /* Address difference between corresponding + * pixels in successive lines. */ + int pixelSize; /* Address difference between successive + * pixels in the same line. */ + int offset[4]; /* Address differences between the red, green, + * blue and alpha components of the pixel and + * the pixel as a whole. */ +} Tk_PhotoImageBlock; + +/* + * The following values control how blocks are combined into photo + * images when the alpha component of a pixel is not 255, a.k.a. the + * compositing rule. + */ + +#define TK_PHOTO_COMPOSITE_OVERLAY 0 +#define TK_PHOTO_COMPOSITE_SET 1 + +/* + * Procedure prototypes and structures used in reading and + * writing photo images: + */ + +typedef struct Tk_PhotoImageFormat Tk_PhotoImageFormat; +#ifdef USE_OLD_IMAGE +typedef int (Tk_ImageFileMatchProc) _ANSI_ARGS_((Tcl_Channel chan, + char *fileName, char *formatString, int *widthPtr, int *heightPtr)); +typedef int (Tk_ImageStringMatchProc) _ANSI_ARGS_((char *string, + char *formatString, int *widthPtr, int *heightPtr)); +typedef int (Tk_ImageFileReadProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Channel chan, char *fileName, char *formatString, + Tk_PhotoHandle imageHandle, int destX, int destY, + int width, int height, int srcX, int srcY)); +typedef int (Tk_ImageStringReadProc) _ANSI_ARGS_((Tcl_Interp *interp, + char *string, char *formatString, Tk_PhotoHandle imageHandle, + int destX, int destY, int width, int height, int srcX, int srcY)); +typedef int (Tk_ImageFileWriteProc) _ANSI_ARGS_((Tcl_Interp *interp, + char *fileName, char *formatString, Tk_PhotoImageBlock *blockPtr)); +typedef int (Tk_ImageStringWriteProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_DString *dataPtr, char *formatString, + Tk_PhotoImageBlock *blockPtr)); +#else +typedef int (Tk_ImageFileMatchProc) _ANSI_ARGS_((Tcl_Channel chan, + CONST char *fileName, Tcl_Obj *format, int *widthPtr, + int *heightPtr, Tcl_Interp *interp)); +typedef int (Tk_ImageStringMatchProc) _ANSI_ARGS_((Tcl_Obj *dataObj, + Tcl_Obj *format, int *widthPtr, int *heightPtr, + Tcl_Interp *interp)); +typedef int (Tk_ImageFileReadProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Channel chan, CONST char *fileName, Tcl_Obj *format, + Tk_PhotoHandle imageHandle, int destX, int destY, + int width, int height, int srcX, int srcY)); +typedef int (Tk_ImageStringReadProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *dataObj, Tcl_Obj *format, Tk_PhotoHandle imageHandle, + int destX, int destY, int width, int height, int srcX, int srcY)); +typedef int (Tk_ImageFileWriteProc) _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *fileName, Tcl_Obj *format, Tk_PhotoImageBlock *blockPtr)); +typedef int (Tk_ImageStringWriteProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *format, Tk_PhotoImageBlock *blockPtr)); +#endif + +/* + * The following structure represents a particular file format for + * storing images (e.g., PPM, GIF, JPEG, etc.). It provides information + * to allow image files of that format to be recognized and read into + * a photo image. + */ + +struct Tk_PhotoImageFormat { + char *name; /* Name of image file format */ + Tk_ImageFileMatchProc *fileMatchProc; + /* Procedure to call to determine whether + * an image file matches this format. */ + Tk_ImageStringMatchProc *stringMatchProc; + /* Procedure to call to determine whether + * the data in a string matches this format. */ + Tk_ImageFileReadProc *fileReadProc; + /* Procedure to call to read data from + * an image file into a photo image. */ + Tk_ImageStringReadProc *stringReadProc; + /* Procedure to call to read data from + * a string into a photo image. */ + Tk_ImageFileWriteProc *fileWriteProc; + /* Procedure to call to write data from + * a photo image to a file. */ + Tk_ImageStringWriteProc *stringWriteProc; + /* Procedure to call to obtain a string + * representation of the data in a photo + * image.*/ + struct Tk_PhotoImageFormat *nextPtr; + /* Next in list of all photo image formats + * currently known. Filled in by Tk, not + * by image format handler. */ +}; + +EXTERN void Tk_CreateOldImageType _ANSI_ARGS_(( + Tk_ImageType *typePtr)); +EXTERN void Tk_CreateOldPhotoImageFormat _ANSI_ARGS_(( + Tk_PhotoImageFormat *formatPtr)); + +#if !defined(USE_TK_STUBS) && defined(USE_OLD_IMAGE) +#define Tk_CreateImageType Tk_CreateOldImageType +#define Tk_CreatePhotoImageFormat Tk_CreateOldPhotoImageFormat +#endif + + +/* + *-------------------------------------------------------------- + * + * Procedure prototypes and structures used for managing styles: + * + *-------------------------------------------------------------- + */ + +/* + * Style support version tag. + */ +#define TK_STYLE_VERSION_1 0x1 +#define TK_STYLE_VERSION TK_STYLE_VERSION_1 + +/* + * The following structures and prototypes are used as static templates to + * declare widget elements. + */ + +typedef void (Tk_GetElementSizeProc) _ANSI_ARGS_((ClientData clientData, + char *recordPtr, CONST Tk_OptionSpec **optionsPtr, Tk_Window tkwin, + int width, int height, int inner, int *widthPtr, int *heightPtr)); +typedef void (Tk_GetElementBoxProc) _ANSI_ARGS_((ClientData clientData, + char *recordPtr, CONST Tk_OptionSpec **optionsPtr, Tk_Window tkwin, + int x, int y, int width, int height, int inner, int *xPtr, int *yPtr, + int *widthPtr, int *heightPtr)); +typedef int (Tk_GetElementBorderWidthProc) _ANSI_ARGS_((ClientData clientData, + char *recordPtr, CONST Tk_OptionSpec **optionsPtr, Tk_Window tkwin)); +typedef void (Tk_DrawElementProc) _ANSI_ARGS_((ClientData clientData, + char *recordPtr, CONST Tk_OptionSpec **optionsPtr, Tk_Window tkwin, + Drawable d, int x, int y, int width, int height, int state)); + +typedef struct Tk_ElementOptionSpec { + char *name; /* Name of the required option. */ + Tk_OptionType type; /* Accepted option type. TK_OPTION_END means + * any. */ +} Tk_ElementOptionSpec; + +typedef struct Tk_ElementSpec { + int version; /* Version of the style support. */ + char *name; /* Name of element. */ + Tk_ElementOptionSpec *options; + /* List of required options. Last one's name + * must be NULL. */ + + /* + * Hooks + */ + + Tk_GetElementSizeProc *getSize; + /* Compute the external (resp. internal) size of + * the element from its desired internal (resp. + * external) size. */ + Tk_GetElementBoxProc *getBox; + /* Compute the inscribed or bounding boxes + * within a given area. */ + Tk_GetElementBorderWidthProc *getBorderWidth; + /* Return the element's internal border width. + * Mostly useful for widgets. */ + Tk_DrawElementProc *draw; /* Draw the element in the given bounding box.*/ +} Tk_ElementSpec; + +/* + * Element state flags. Can be OR'ed. + */ + +#define TK_ELEMENT_STATE_ACTIVE 1<<0 +#define TK_ELEMENT_STATE_DISABLED 1<<1 +#define TK_ELEMENT_STATE_FOCUS 1<<2 +#define TK_ELEMENT_STATE_PRESSED 1<<3 + +/* + *-------------------------------------------------------------- + * + * The definitions below provide backward compatibility for + * functions and types related to event handling that used to + * be in Tk but have moved to Tcl. + * + *-------------------------------------------------------------- + */ + +#define TK_READABLE TCL_READABLE +#define TK_WRITABLE TCL_WRITABLE +#define TK_EXCEPTION TCL_EXCEPTION + +#define TK_DONT_WAIT TCL_DONT_WAIT +#define TK_X_EVENTS TCL_WINDOW_EVENTS +#define TK_WINDOW_EVENTS TCL_WINDOW_EVENTS +#define TK_FILE_EVENTS TCL_FILE_EVENTS +#define TK_TIMER_EVENTS TCL_TIMER_EVENTS +#define TK_IDLE_EVENTS TCL_IDLE_EVENTS +#define TK_ALL_EVENTS TCL_ALL_EVENTS + +#define Tk_IdleProc Tcl_IdleProc +#define Tk_FileProc Tcl_FileProc +#define Tk_TimerProc Tcl_TimerProc +#define Tk_TimerToken Tcl_TimerToken + +#define Tk_BackgroundError Tcl_BackgroundError +#define Tk_CancelIdleCall Tcl_CancelIdleCall +#define Tk_CreateFileHandler Tcl_CreateFileHandler +#define Tk_CreateTimerHandler Tcl_CreateTimerHandler +#define Tk_DeleteFileHandler Tcl_DeleteFileHandler +#define Tk_DeleteTimerHandler Tcl_DeleteTimerHandler +#define Tk_DoOneEvent Tcl_DoOneEvent +#define Tk_DoWhenIdle Tcl_DoWhenIdle +#define Tk_Sleep Tcl_Sleep + +/* Additional stuff that has moved to Tcl: */ + +#define Tk_EventuallyFree Tcl_EventuallyFree +#define Tk_FreeProc Tcl_FreeProc +#define Tk_Preserve Tcl_Preserve +#define Tk_Release Tcl_Release + +/* Removed Tk_Main, use macro instead */ +#define Tk_Main(argc, argv, proc) \ + Tk_MainEx(argc, argv, proc, Tcl_CreateInterp()) + +CONST char *Tk_InitStubs _ANSI_ARGS_((Tcl_Interp *interp, char *version, int exact)); + +#ifndef USE_TK_STUBS + +#define Tk_InitStubs(interp, version, exact) \ + Tcl_PkgRequire(interp, "Tk", version, exact) + +#endif + +void Tk_InitImageArgs _ANSI_ARGS_((Tcl_Interp *interp, int argc, char ***argv)); + +#if !defined(USE_TK_STUBS) || !defined(USE_OLD_IMAGE) + +#define Tk_InitImageArgs(interp, argc, argv) /**/ + +#endif + + +/* + *-------------------------------------------------------------- + * + * Additional procedure types defined by Tk. + * + *-------------------------------------------------------------- + */ + +typedef int (Tk_ErrorProc) _ANSI_ARGS_((ClientData clientData, + XErrorEvent *errEventPtr)); +typedef void (Tk_EventProc) _ANSI_ARGS_((ClientData clientData, + XEvent *eventPtr)); +typedef int (Tk_GenericProc) _ANSI_ARGS_((ClientData clientData, + XEvent *eventPtr)); +typedef int (Tk_ClientMessageProc) _ANSI_ARGS_((Tk_Window tkwin, + XEvent *eventPtr)); +typedef int (Tk_GetSelProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, char *portion)); +typedef void (Tk_LostSelProc) _ANSI_ARGS_((ClientData clientData)); +typedef Tk_RestrictAction (Tk_RestrictProc) _ANSI_ARGS_(( + ClientData clientData, XEvent *eventPtr)); +typedef int (Tk_SelectionProc) _ANSI_ARGS_((ClientData clientData, + int offset, char *buffer, int maxBytes)); + + +/* + *-------------------------------------------------------------- + * + * Platform independant exported procedures and variables. + * + *-------------------------------------------------------------- + */ + +#include "tkDecls.h" + +/* + * Allow users to say that they don't want to alter their source to + * add the extra argument to Tk_PhotoPutBlock(); DO NOT DEFINE THIS + * WHEN BUILDING TK. + * + * This goes after the inclusion of the stubbed-decls so that the + * declarations of what is actually there can be correct. + */ + +#ifdef USE_COMPOSITELESS_PHOTO_PUT_BLOCK +# ifdef Tk_PhotoPutBlock +# undef Tk_PhotoPutBlock +# endif +# define Tk_PhotoPutBlock Tk_PhotoPutBlock_NoComposite +# ifdef Tk_PhotoPutZoomedBlock +# undef Tk_PhotoPutZoomedBlock +# endif +# define Tk_PhotoPutZoomedBlock Tk_PhotoPutZoomedBlock_NoComposite +#endif /* USE_COMPOSITELESS_PHOTO_PUT_BLOCK */ + +/* + * Tcl commands exported by Tk: + */ + + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#endif /* RC_INVOKED */ + +/* + * end block for C++ + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TK */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tkDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tkDecls.h new file mode 100644 index 00000000..3c92ffbb --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tkDecls.h @@ -0,0 +1,2303 @@ +/* + * tkDecls.h -- + * + * Declarations of functions in the platform independent public Tcl API. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TKDECLS +#define _TKDECLS + +#ifdef BUILD_tk +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLEXPORT +#endif + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tk.decls script. + */ + +/* !BEGIN!: Do not edit below this line. */ + +/* + * Exported function declarations: + */ + +/* 0 */ +EXTERN void Tk_MainLoop _ANSI_ARGS_((void)); +/* 1 */ +EXTERN XColor * Tk_3DBorderColor _ANSI_ARGS_((Tk_3DBorder border)); +/* 2 */ +EXTERN GC Tk_3DBorderGC _ANSI_ARGS_((Tk_Window tkwin, + Tk_3DBorder border, int which)); +/* 3 */ +EXTERN void Tk_3DHorizontalBevel _ANSI_ARGS_((Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, int x, + int y, int width, int height, int leftIn, + int rightIn, int topBevel, int relief)); +/* 4 */ +EXTERN void Tk_3DVerticalBevel _ANSI_ARGS_((Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, int x, + int y, int width, int height, int leftBevel, + int relief)); +/* 5 */ +EXTERN void Tk_AddOption _ANSI_ARGS_((Tk_Window tkwin, + CONST char *name, CONST char *value, + int priority)); +/* 6 */ +EXTERN void Tk_BindEvent _ANSI_ARGS_(( + Tk_BindingTable bindingTable, + XEvent *eventPtr, Tk_Window tkwin, + int numObjects, ClientData *objectPtr)); +/* 7 */ +EXTERN void Tk_CanvasDrawableCoords _ANSI_ARGS_(( + Tk_Canvas canvas, double x, double y, + short *drawableXPtr, short *drawableYPtr)); +/* 8 */ +EXTERN void Tk_CanvasEventuallyRedraw _ANSI_ARGS_(( + Tk_Canvas canvas, int x1, int y1, int x2, + int y2)); +/* 9 */ +EXTERN int Tk_CanvasGetCoord _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, CONST char *str, + double *doublePtr)); +/* 10 */ +EXTERN Tk_CanvasTextInfo * Tk_CanvasGetTextInfo _ANSI_ARGS_(( + Tk_Canvas canvas)); +/* 11 */ +EXTERN int Tk_CanvasPsBitmap _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Pixmap bitmap, int x, + int y, int width, int height)); +/* 12 */ +EXTERN int Tk_CanvasPsColor _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, XColor *colorPtr)); +/* 13 */ +EXTERN int Tk_CanvasPsFont _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Font font)); +/* 14 */ +EXTERN void Tk_CanvasPsPath _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, double *coordPtr, + int numPoints)); +/* 15 */ +EXTERN int Tk_CanvasPsStipple _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Pixmap bitmap)); +/* 16 */ +EXTERN double Tk_CanvasPsY _ANSI_ARGS_((Tk_Canvas canvas, double y)); +/* 17 */ +EXTERN void Tk_CanvasSetStippleOrigin _ANSI_ARGS_(( + Tk_Canvas canvas, GC gc)); +/* 18 */ +EXTERN int Tk_CanvasTagsParseProc _ANSI_ARGS_(( + ClientData clientData, Tcl_Interp *interp, + Tk_Window tkwin, CONST char *value, + char *widgRec, int offset)); +/* 19 */ +EXTERN char * Tk_CanvasTagsPrintProc _ANSI_ARGS_(( + ClientData clientData, Tk_Window tkwin, + char *widgRec, int offset, + Tcl_FreeProc **freeProcPtr)); +/* 20 */ +EXTERN Tk_Window Tk_CanvasTkwin _ANSI_ARGS_((Tk_Canvas canvas)); +/* 21 */ +EXTERN void Tk_CanvasWindowCoords _ANSI_ARGS_((Tk_Canvas canvas, + double x, double y, short *screenXPtr, + short *screenYPtr)); +/* 22 */ +EXTERN void Tk_ChangeWindowAttributes _ANSI_ARGS_(( + Tk_Window tkwin, unsigned long valueMask, + XSetWindowAttributes *attsPtr)); +/* 23 */ +EXTERN int Tk_CharBbox _ANSI_ARGS_((Tk_TextLayout layout, + int index, int *xPtr, int *yPtr, + int *widthPtr, int *heightPtr)); +/* 24 */ +EXTERN void Tk_ClearSelection _ANSI_ARGS_((Tk_Window tkwin, + Atom selection)); +/* 25 */ +EXTERN int Tk_ClipboardAppend _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Atom target, Atom format, + char *buffer)); +/* 26 */ +EXTERN int Tk_ClipboardClear _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin)); +/* 27 */ +EXTERN int Tk_ConfigureInfo _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tk_ConfigSpec *specs, + char *widgRec, CONST char *argvName, + int flags)); +/* 28 */ +EXTERN int Tk_ConfigureValue _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tk_ConfigSpec *specs, + char *widgRec, CONST char *argvName, + int flags)); +/* 29 */ +EXTERN int Tk_ConfigureWidget _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tk_ConfigSpec *specs, + int argc, CONST84 char **argv, char *widgRec, + int flags)); +/* 30 */ +EXTERN void Tk_ConfigureWindow _ANSI_ARGS_((Tk_Window tkwin, + unsigned int valueMask, + XWindowChanges *valuePtr)); +/* 31 */ +EXTERN Tk_TextLayout Tk_ComputeTextLayout _ANSI_ARGS_((Tk_Font font, + CONST char *str, int numChars, + int wrapLength, Tk_Justify justify, + int flags, int *widthPtr, int *heightPtr)); +/* 32 */ +EXTERN Tk_Window Tk_CoordsToWindow _ANSI_ARGS_((int rootX, int rootY, + Tk_Window tkwin)); +/* 33 */ +EXTERN unsigned long Tk_CreateBinding _ANSI_ARGS_((Tcl_Interp *interp, + Tk_BindingTable bindingTable, + ClientData object, CONST char *eventStr, + CONST char *script, int append)); +/* 34 */ +EXTERN Tk_BindingTable Tk_CreateBindingTable _ANSI_ARGS_(( + Tcl_Interp *interp)); +/* 35 */ +EXTERN Tk_ErrorHandler Tk_CreateErrorHandler _ANSI_ARGS_((Display *display, + int errNum, int request, int minorCode, + Tk_ErrorProc *errorProc, + ClientData clientData)); +/* 36 */ +EXTERN void Tk_CreateEventHandler _ANSI_ARGS_((Tk_Window token, + unsigned long mask, Tk_EventProc *proc, + ClientData clientData)); +/* 37 */ +EXTERN void Tk_CreateGenericHandler _ANSI_ARGS_(( + Tk_GenericProc *proc, ClientData clientData)); +/* 38 */ +EXTERN void Tk_CreateImageType _ANSI_ARGS_(( + Tk_ImageType *typePtr)); +/* 39 */ +EXTERN void Tk_CreateItemType _ANSI_ARGS_((Tk_ItemType *typePtr)); +/* 40 */ +EXTERN void Tk_CreatePhotoImageFormat _ANSI_ARGS_(( + Tk_PhotoImageFormat *formatPtr)); +/* 41 */ +EXTERN void Tk_CreateSelHandler _ANSI_ARGS_((Tk_Window tkwin, + Atom selection, Atom target, + Tk_SelectionProc *proc, + ClientData clientData, Atom format)); +/* 42 */ +EXTERN Tk_Window Tk_CreateWindow _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window parent, CONST char *name, + CONST char *screenName)); +/* 43 */ +EXTERN Tk_Window Tk_CreateWindowFromPath _ANSI_ARGS_(( + Tcl_Interp *interp, Tk_Window tkwin, + CONST char *pathName, CONST char *screenName)); +/* 44 */ +EXTERN int Tk_DefineBitmap _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name, CONST char *source, + int width, int height)); +/* 45 */ +EXTERN void Tk_DefineCursor _ANSI_ARGS_((Tk_Window window, + Tk_Cursor cursor)); +/* 46 */ +EXTERN void Tk_DeleteAllBindings _ANSI_ARGS_(( + Tk_BindingTable bindingTable, + ClientData object)); +/* 47 */ +EXTERN int Tk_DeleteBinding _ANSI_ARGS_((Tcl_Interp *interp, + Tk_BindingTable bindingTable, + ClientData object, CONST char *eventStr)); +/* 48 */ +EXTERN void Tk_DeleteBindingTable _ANSI_ARGS_(( + Tk_BindingTable bindingTable)); +/* 49 */ +EXTERN void Tk_DeleteErrorHandler _ANSI_ARGS_(( + Tk_ErrorHandler handler)); +/* 50 */ +EXTERN void Tk_DeleteEventHandler _ANSI_ARGS_((Tk_Window token, + unsigned long mask, Tk_EventProc *proc, + ClientData clientData)); +/* 51 */ +EXTERN void Tk_DeleteGenericHandler _ANSI_ARGS_(( + Tk_GenericProc *proc, ClientData clientData)); +/* 52 */ +EXTERN void Tk_DeleteImage _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name)); +/* 53 */ +EXTERN void Tk_DeleteSelHandler _ANSI_ARGS_((Tk_Window tkwin, + Atom selection, Atom target)); +/* 54 */ +EXTERN void Tk_DestroyWindow _ANSI_ARGS_((Tk_Window tkwin)); +/* 55 */ +EXTERN CONST84_RETURN char * Tk_DisplayName _ANSI_ARGS_((Tk_Window tkwin)); +/* 56 */ +EXTERN int Tk_DistanceToTextLayout _ANSI_ARGS_(( + Tk_TextLayout layout, int x, int y)); +/* 57 */ +EXTERN void Tk_Draw3DPolygon _ANSI_ARGS_((Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, + XPoint *pointPtr, int numPoints, + int borderWidth, int leftRelief)); +/* 58 */ +EXTERN void Tk_Draw3DRectangle _ANSI_ARGS_((Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, int x, + int y, int width, int height, + int borderWidth, int relief)); +/* 59 */ +EXTERN void Tk_DrawChars _ANSI_ARGS_((Display *display, + Drawable drawable, GC gc, Tk_Font tkfont, + CONST char *source, int numBytes, int x, + int y)); +/* 60 */ +EXTERN void Tk_DrawFocusHighlight _ANSI_ARGS_((Tk_Window tkwin, + GC gc, int width, Drawable drawable)); +/* 61 */ +EXTERN void Tk_DrawTextLayout _ANSI_ARGS_((Display *display, + Drawable drawable, GC gc, + Tk_TextLayout layout, int x, int y, + int firstChar, int lastChar)); +/* 62 */ +EXTERN void Tk_Fill3DPolygon _ANSI_ARGS_((Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, + XPoint *pointPtr, int numPoints, + int borderWidth, int leftRelief)); +/* 63 */ +EXTERN void Tk_Fill3DRectangle _ANSI_ARGS_((Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, int x, + int y, int width, int height, + int borderWidth, int relief)); +/* 64 */ +EXTERN Tk_PhotoHandle Tk_FindPhoto _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *imageName)); +/* 65 */ +EXTERN Font Tk_FontId _ANSI_ARGS_((Tk_Font font)); +/* 66 */ +EXTERN void Tk_Free3DBorder _ANSI_ARGS_((Tk_3DBorder border)); +/* 67 */ +EXTERN void Tk_FreeBitmap _ANSI_ARGS_((Display *display, + Pixmap bitmap)); +/* 68 */ +EXTERN void Tk_FreeColor _ANSI_ARGS_((XColor *colorPtr)); +/* 69 */ +EXTERN void Tk_FreeColormap _ANSI_ARGS_((Display *display, + Colormap colormap)); +/* 70 */ +EXTERN void Tk_FreeCursor _ANSI_ARGS_((Display *display, + Tk_Cursor cursor)); +/* 71 */ +EXTERN void Tk_FreeFont _ANSI_ARGS_((Tk_Font f)); +/* 72 */ +EXTERN void Tk_FreeGC _ANSI_ARGS_((Display *display, GC gc)); +/* 73 */ +EXTERN void Tk_FreeImage _ANSI_ARGS_((Tk_Image image)); +/* 74 */ +EXTERN void Tk_FreeOptions _ANSI_ARGS_((Tk_ConfigSpec *specs, + char *widgRec, Display *display, + int needFlags)); +/* 75 */ +EXTERN void Tk_FreePixmap _ANSI_ARGS_((Display *display, + Pixmap pixmap)); +/* 76 */ +EXTERN void Tk_FreeTextLayout _ANSI_ARGS_(( + Tk_TextLayout textLayout)); +/* 77 */ +EXTERN void Tk_FreeXId _ANSI_ARGS_((Display *display, XID xid)); +/* 78 */ +EXTERN GC Tk_GCForColor _ANSI_ARGS_((XColor *colorPtr, + Drawable drawable)); +/* 79 */ +EXTERN void Tk_GeometryRequest _ANSI_ARGS_((Tk_Window tkwin, + int reqWidth, int reqHeight)); +/* 80 */ +EXTERN Tk_3DBorder Tk_Get3DBorder _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tk_Uid colorName)); +/* 81 */ +EXTERN void Tk_GetAllBindings _ANSI_ARGS_((Tcl_Interp *interp, + Tk_BindingTable bindingTable, + ClientData object)); +/* 82 */ +EXTERN int Tk_GetAnchor _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *str, Tk_Anchor *anchorPtr)); +/* 83 */ +EXTERN CONST84_RETURN char * Tk_GetAtomName _ANSI_ARGS_((Tk_Window tkwin, + Atom atom)); +/* 84 */ +EXTERN CONST84_RETURN char * Tk_GetBinding _ANSI_ARGS_((Tcl_Interp *interp, + Tk_BindingTable bindingTable, + ClientData object, CONST char *eventStr)); +/* 85 */ +EXTERN Pixmap Tk_GetBitmap _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, CONST char *str)); +/* 86 */ +EXTERN Pixmap Tk_GetBitmapFromData _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, CONST char *source, + int width, int height)); +/* 87 */ +EXTERN int Tk_GetCapStyle _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *str, int *capPtr)); +/* 88 */ +EXTERN XColor * Tk_GetColor _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tk_Uid name)); +/* 89 */ +EXTERN XColor * Tk_GetColorByValue _ANSI_ARGS_((Tk_Window tkwin, + XColor *colorPtr)); +/* 90 */ +EXTERN Colormap Tk_GetColormap _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, CONST char *str)); +/* 91 */ +EXTERN Tk_Cursor Tk_GetCursor _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tk_Uid str)); +/* 92 */ +EXTERN Tk_Cursor Tk_GetCursorFromData _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, CONST char *source, + CONST char *mask, int width, int height, + int xHot, int yHot, Tk_Uid fg, Tk_Uid bg)); +/* 93 */ +EXTERN Tk_Font Tk_GetFont _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, CONST char *str)); +/* 94 */ +EXTERN Tk_Font Tk_GetFontFromObj _ANSI_ARGS_((Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 95 */ +EXTERN void Tk_GetFontMetrics _ANSI_ARGS_((Tk_Font font, + Tk_FontMetrics *fmPtr)); +/* 96 */ +EXTERN GC Tk_GetGC _ANSI_ARGS_((Tk_Window tkwin, + unsigned long valueMask, XGCValues *valuePtr)); +/* 97 */ +EXTERN Tk_Image Tk_GetImage _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, CONST char *name, + Tk_ImageChangedProc *changeProc, + ClientData clientData)); +/* 98 */ +EXTERN ClientData Tk_GetImageMasterData _ANSI_ARGS_(( + Tcl_Interp *interp, CONST char *name, + Tk_ImageType **typePtrPtr)); +/* 99 */ +EXTERN Tk_ItemType * Tk_GetItemTypes _ANSI_ARGS_((void)); +/* 100 */ +EXTERN int Tk_GetJoinStyle _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *str, int *joinPtr)); +/* 101 */ +EXTERN int Tk_GetJustify _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *str, Tk_Justify *justifyPtr)); +/* 102 */ +EXTERN int Tk_GetNumMainWindows _ANSI_ARGS_((void)); +/* 103 */ +EXTERN Tk_Uid Tk_GetOption _ANSI_ARGS_((Tk_Window tkwin, + CONST char *name, CONST char *className)); +/* 104 */ +EXTERN int Tk_GetPixels _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, CONST char *str, + int *intPtr)); +/* 105 */ +EXTERN Pixmap Tk_GetPixmap _ANSI_ARGS_((Display *display, + Drawable d, int width, int height, int depth)); +/* 106 */ +EXTERN int Tk_GetRelief _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name, int *reliefPtr)); +/* 107 */ +EXTERN void Tk_GetRootCoords _ANSI_ARGS_((Tk_Window tkwin, + int *xPtr, int *yPtr)); +/* 108 */ +EXTERN int Tk_GetScrollInfo _ANSI_ARGS_((Tcl_Interp *interp, + int argc, CONST84 char **argv, + double *dblPtr, int *intPtr)); +/* 109 */ +EXTERN int Tk_GetScreenMM _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, CONST char *str, + double *doublePtr)); +/* 110 */ +EXTERN int Tk_GetSelection _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Atom selection, Atom target, + Tk_GetSelProc *proc, ClientData clientData)); +/* 111 */ +EXTERN Tk_Uid Tk_GetUid _ANSI_ARGS_((CONST char *str)); +/* 112 */ +EXTERN Visual * Tk_GetVisual _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, CONST char *str, + int *depthPtr, Colormap *colormapPtr)); +/* 113 */ +EXTERN void Tk_GetVRootGeometry _ANSI_ARGS_((Tk_Window tkwin, + int *xPtr, int *yPtr, int *widthPtr, + int *heightPtr)); +/* 114 */ +EXTERN int Tk_Grab _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, int grabGlobal)); +/* 115 */ +EXTERN void Tk_HandleEvent _ANSI_ARGS_((XEvent *eventPtr)); +/* 116 */ +EXTERN Tk_Window Tk_IdToWindow _ANSI_ARGS_((Display *display, + Window window)); +/* 117 */ +EXTERN void Tk_ImageChanged _ANSI_ARGS_((Tk_ImageMaster master, + int x, int y, int width, int height, + int imageWidth, int imageHeight)); +/* 118 */ +EXTERN int Tk_Init _ANSI_ARGS_((Tcl_Interp *interp)); +/* 119 */ +EXTERN Atom Tk_InternAtom _ANSI_ARGS_((Tk_Window tkwin, + CONST char *name)); +/* 120 */ +EXTERN int Tk_IntersectTextLayout _ANSI_ARGS_(( + Tk_TextLayout layout, int x, int y, + int width, int height)); +/* 121 */ +EXTERN void Tk_MaintainGeometry _ANSI_ARGS_((Tk_Window slave, + Tk_Window master, int x, int y, int width, + int height)); +/* 122 */ +EXTERN Tk_Window Tk_MainWindow _ANSI_ARGS_((Tcl_Interp *interp)); +/* 123 */ +EXTERN void Tk_MakeWindowExist _ANSI_ARGS_((Tk_Window tkwin)); +/* 124 */ +EXTERN void Tk_ManageGeometry _ANSI_ARGS_((Tk_Window tkwin, + Tk_GeomMgr *mgrPtr, ClientData clientData)); +/* 125 */ +EXTERN void Tk_MapWindow _ANSI_ARGS_((Tk_Window tkwin)); +/* 126 */ +EXTERN int Tk_MeasureChars _ANSI_ARGS_((Tk_Font tkfont, + CONST char *source, int numBytes, + int maxPixels, int flags, int *lengthPtr)); +/* 127 */ +EXTERN void Tk_MoveResizeWindow _ANSI_ARGS_((Tk_Window tkwin, + int x, int y, int width, int height)); +/* 128 */ +EXTERN void Tk_MoveWindow _ANSI_ARGS_((Tk_Window tkwin, int x, + int y)); +/* 129 */ +EXTERN void Tk_MoveToplevelWindow _ANSI_ARGS_((Tk_Window tkwin, + int x, int y)); +/* 130 */ +EXTERN CONST84_RETURN char * Tk_NameOf3DBorder _ANSI_ARGS_(( + Tk_3DBorder border)); +/* 131 */ +EXTERN CONST84_RETURN char * Tk_NameOfAnchor _ANSI_ARGS_((Tk_Anchor anchor)); +/* 132 */ +EXTERN CONST84_RETURN char * Tk_NameOfBitmap _ANSI_ARGS_((Display *display, + Pixmap bitmap)); +/* 133 */ +EXTERN CONST84_RETURN char * Tk_NameOfCapStyle _ANSI_ARGS_((int cap)); +/* 134 */ +EXTERN CONST84_RETURN char * Tk_NameOfColor _ANSI_ARGS_((XColor *colorPtr)); +/* 135 */ +EXTERN CONST84_RETURN char * Tk_NameOfCursor _ANSI_ARGS_((Display *display, + Tk_Cursor cursor)); +/* 136 */ +EXTERN CONST84_RETURN char * Tk_NameOfFont _ANSI_ARGS_((Tk_Font font)); +/* 137 */ +EXTERN CONST84_RETURN char * Tk_NameOfImage _ANSI_ARGS_(( + Tk_ImageMaster imageMaster)); +/* 138 */ +EXTERN CONST84_RETURN char * Tk_NameOfJoinStyle _ANSI_ARGS_((int join)); +/* 139 */ +EXTERN CONST84_RETURN char * Tk_NameOfJustify _ANSI_ARGS_(( + Tk_Justify justify)); +/* 140 */ +EXTERN CONST84_RETURN char * Tk_NameOfRelief _ANSI_ARGS_((int relief)); +/* 141 */ +EXTERN Tk_Window Tk_NameToWindow _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *pathName, Tk_Window tkwin)); +/* 142 */ +EXTERN void Tk_OwnSelection _ANSI_ARGS_((Tk_Window tkwin, + Atom selection, Tk_LostSelProc *proc, + ClientData clientData)); +/* 143 */ +EXTERN int Tk_ParseArgv _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, int *argcPtr, + CONST84 char **argv, Tk_ArgvInfo *argTable, + int flags)); +/* 144 */ +EXTERN void Tk_PhotoPutBlock_NoComposite _ANSI_ARGS_(( + Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height)); +/* 145 */ +EXTERN void Tk_PhotoPutZoomedBlock_NoComposite _ANSI_ARGS_(( + Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int zoomX, int zoomY, + int subsampleX, int subsampleY)); +/* 146 */ +EXTERN int Tk_PhotoGetImage _ANSI_ARGS_((Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr)); +/* 147 */ +EXTERN void Tk_PhotoBlank _ANSI_ARGS_((Tk_PhotoHandle handle)); +/* 148 */ +EXTERN void Tk_PhotoExpand _ANSI_ARGS_((Tk_PhotoHandle handle, + int width, int height)); +/* 149 */ +EXTERN void Tk_PhotoGetSize _ANSI_ARGS_((Tk_PhotoHandle handle, + int *widthPtr, int *heightPtr)); +/* 150 */ +EXTERN void Tk_PhotoSetSize _ANSI_ARGS_((Tk_PhotoHandle handle, + int width, int height)); +/* 151 */ +EXTERN int Tk_PointToChar _ANSI_ARGS_((Tk_TextLayout layout, + int x, int y)); +/* 152 */ +EXTERN int Tk_PostscriptFontName _ANSI_ARGS_((Tk_Font tkfont, + Tcl_DString *dsPtr)); +/* 153 */ +EXTERN void Tk_PreserveColormap _ANSI_ARGS_((Display *display, + Colormap colormap)); +/* 154 */ +EXTERN void Tk_QueueWindowEvent _ANSI_ARGS_((XEvent *eventPtr, + Tcl_QueuePosition position)); +/* 155 */ +EXTERN void Tk_RedrawImage _ANSI_ARGS_((Tk_Image image, + int imageX, int imageY, int width, + int height, Drawable drawable, int drawableX, + int drawableY)); +/* 156 */ +EXTERN void Tk_ResizeWindow _ANSI_ARGS_((Tk_Window tkwin, + int width, int height)); +/* 157 */ +EXTERN int Tk_RestackWindow _ANSI_ARGS_((Tk_Window tkwin, + int aboveBelow, Tk_Window other)); +/* 158 */ +EXTERN Tk_RestrictProc * Tk_RestrictEvents _ANSI_ARGS_(( + Tk_RestrictProc *proc, ClientData arg, + ClientData *prevArgPtr)); +/* 159 */ +EXTERN int Tk_SafeInit _ANSI_ARGS_((Tcl_Interp *interp)); +/* 160 */ +EXTERN CONST char * Tk_SetAppName _ANSI_ARGS_((Tk_Window tkwin, + CONST char *name)); +/* 161 */ +EXTERN void Tk_SetBackgroundFromBorder _ANSI_ARGS_(( + Tk_Window tkwin, Tk_3DBorder border)); +/* 162 */ +EXTERN void Tk_SetClass _ANSI_ARGS_((Tk_Window tkwin, + CONST char *className)); +/* 163 */ +EXTERN void Tk_SetGrid _ANSI_ARGS_((Tk_Window tkwin, + int reqWidth, int reqHeight, int gridWidth, + int gridHeight)); +/* 164 */ +EXTERN void Tk_SetInternalBorder _ANSI_ARGS_((Tk_Window tkwin, + int width)); +/* 165 */ +EXTERN void Tk_SetWindowBackground _ANSI_ARGS_((Tk_Window tkwin, + unsigned long pixel)); +/* 166 */ +EXTERN void Tk_SetWindowBackgroundPixmap _ANSI_ARGS_(( + Tk_Window tkwin, Pixmap pixmap)); +/* 167 */ +EXTERN void Tk_SetWindowBorder _ANSI_ARGS_((Tk_Window tkwin, + unsigned long pixel)); +/* 168 */ +EXTERN void Tk_SetWindowBorderWidth _ANSI_ARGS_((Tk_Window tkwin, + int width)); +/* 169 */ +EXTERN void Tk_SetWindowBorderPixmap _ANSI_ARGS_(( + Tk_Window tkwin, Pixmap pixmap)); +/* 170 */ +EXTERN void Tk_SetWindowColormap _ANSI_ARGS_((Tk_Window tkwin, + Colormap colormap)); +/* 171 */ +EXTERN int Tk_SetWindowVisual _ANSI_ARGS_((Tk_Window tkwin, + Visual *visual, int depth, Colormap colormap)); +/* 172 */ +EXTERN void Tk_SizeOfBitmap _ANSI_ARGS_((Display *display, + Pixmap bitmap, int *widthPtr, int *heightPtr)); +/* 173 */ +EXTERN void Tk_SizeOfImage _ANSI_ARGS_((Tk_Image image, + int *widthPtr, int *heightPtr)); +/* 174 */ +EXTERN int Tk_StrictMotif _ANSI_ARGS_((Tk_Window tkwin)); +/* 175 */ +EXTERN void Tk_TextLayoutToPostscript _ANSI_ARGS_(( + Tcl_Interp *interp, Tk_TextLayout layout)); +/* 176 */ +EXTERN int Tk_TextWidth _ANSI_ARGS_((Tk_Font font, + CONST char *str, int numBytes)); +/* 177 */ +EXTERN void Tk_UndefineCursor _ANSI_ARGS_((Tk_Window window)); +/* 178 */ +EXTERN void Tk_UnderlineChars _ANSI_ARGS_((Display *display, + Drawable drawable, GC gc, Tk_Font tkfont, + CONST char *source, int x, int y, + int firstByte, int lastByte)); +/* 179 */ +EXTERN void Tk_UnderlineTextLayout _ANSI_ARGS_((Display *display, + Drawable drawable, GC gc, + Tk_TextLayout layout, int x, int y, + int underline)); +/* 180 */ +EXTERN void Tk_Ungrab _ANSI_ARGS_((Tk_Window tkwin)); +/* 181 */ +EXTERN void Tk_UnmaintainGeometry _ANSI_ARGS_((Tk_Window slave, + Tk_Window master)); +/* 182 */ +EXTERN void Tk_UnmapWindow _ANSI_ARGS_((Tk_Window tkwin)); +/* 183 */ +EXTERN void Tk_UnsetGrid _ANSI_ARGS_((Tk_Window tkwin)); +/* 184 */ +EXTERN void Tk_UpdatePointer _ANSI_ARGS_((Tk_Window tkwin, int x, + int y, int state)); +/* 185 */ +EXTERN Pixmap Tk_AllocBitmapFromObj _ANSI_ARGS_(( + Tcl_Interp *interp, Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 186 */ +EXTERN Tk_3DBorder Tk_Alloc3DBorderFromObj _ANSI_ARGS_(( + Tcl_Interp *interp, Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 187 */ +EXTERN XColor * Tk_AllocColorFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr)); +/* 188 */ +EXTERN Tk_Cursor Tk_AllocCursorFromObj _ANSI_ARGS_(( + Tcl_Interp *interp, Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 189 */ +EXTERN Tk_Font Tk_AllocFontFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr)); +/* 190 */ +EXTERN Tk_OptionTable Tk_CreateOptionTable _ANSI_ARGS_((Tcl_Interp *interp, + CONST Tk_OptionSpec *templatePtr)); +/* 191 */ +EXTERN void Tk_DeleteOptionTable _ANSI_ARGS_(( + Tk_OptionTable optionTable)); +/* 192 */ +EXTERN void Tk_Free3DBorderFromObj _ANSI_ARGS_((Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 193 */ +EXTERN void Tk_FreeBitmapFromObj _ANSI_ARGS_((Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 194 */ +EXTERN void Tk_FreeColorFromObj _ANSI_ARGS_((Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 195 */ +EXTERN void Tk_FreeConfigOptions _ANSI_ARGS_((char *recordPtr, + Tk_OptionTable optionToken, Tk_Window tkwin)); +/* 196 */ +EXTERN void Tk_FreeSavedOptions _ANSI_ARGS_(( + Tk_SavedOptions *savePtr)); +/* 197 */ +EXTERN void Tk_FreeCursorFromObj _ANSI_ARGS_((Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 198 */ +EXTERN void Tk_FreeFontFromObj _ANSI_ARGS_((Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 199 */ +EXTERN Tk_3DBorder Tk_Get3DBorderFromObj _ANSI_ARGS_((Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 200 */ +EXTERN int Tk_GetAnchorFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, Tk_Anchor *anchorPtr)); +/* 201 */ +EXTERN Pixmap Tk_GetBitmapFromObj _ANSI_ARGS_((Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 202 */ +EXTERN XColor * Tk_GetColorFromObj _ANSI_ARGS_((Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 203 */ +EXTERN Tk_Cursor Tk_GetCursorFromObj _ANSI_ARGS_((Tk_Window tkwin, + Tcl_Obj *objPtr)); +/* 204 */ +EXTERN Tcl_Obj * Tk_GetOptionInfo _ANSI_ARGS_((Tcl_Interp *interp, + char *recordPtr, Tk_OptionTable optionTable, + Tcl_Obj *namePtr, Tk_Window tkwin)); +/* 205 */ +EXTERN Tcl_Obj * Tk_GetOptionValue _ANSI_ARGS_((Tcl_Interp *interp, + char *recordPtr, Tk_OptionTable optionTable, + Tcl_Obj *namePtr, Tk_Window tkwin)); +/* 206 */ +EXTERN int Tk_GetJustifyFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, Tk_Justify *justifyPtr)); +/* 207 */ +EXTERN int Tk_GetMMFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr, + double *doublePtr)); +/* 208 */ +EXTERN int Tk_GetPixelsFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr, + int *intPtr)); +/* 209 */ +EXTERN int Tk_GetReliefFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr, int *resultPtr)); +/* 210 */ +EXTERN int Tk_GetScrollInfoObj _ANSI_ARGS_((Tcl_Interp *interp, + int objc, Tcl_Obj *CONST objv[], + double *dblPtr, int *intPtr)); +/* 211 */ +EXTERN int Tk_InitOptions _ANSI_ARGS_((Tcl_Interp *interp, + char *recordPtr, Tk_OptionTable optionToken, + Tk_Window tkwin)); +/* 212 */ +EXTERN void Tk_MainEx _ANSI_ARGS_((int argc, char **argv, + Tcl_AppInitProc *appInitProc, + Tcl_Interp *interp)); +/* 213 */ +EXTERN void Tk_RestoreSavedOptions _ANSI_ARGS_(( + Tk_SavedOptions *savePtr)); +/* 214 */ +EXTERN int Tk_SetOptions _ANSI_ARGS_((Tcl_Interp *interp, + char *recordPtr, Tk_OptionTable optionTable, + int objc, Tcl_Obj *CONST objv[], + Tk_Window tkwin, Tk_SavedOptions *savePtr, + int *maskPtr)); +/* 215 */ +EXTERN void Tk_InitConsoleChannels _ANSI_ARGS_(( + Tcl_Interp *interp)); +/* 216 */ +EXTERN int Tk_CreateConsoleWindow _ANSI_ARGS_(( + Tcl_Interp *interp)); +/* 217 */ +EXTERN void Tk_CreateSmoothMethod _ANSI_ARGS_(( + Tcl_Interp *interp, Tk_SmoothMethod *method)); +/* Slot 218 is reserved */ +/* Slot 219 is reserved */ +/* 220 */ +EXTERN int Tk_GetDash _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *value, Tk_Dash *dash)); +/* 221 */ +EXTERN void Tk_CreateOutline _ANSI_ARGS_((Tk_Outline *outline)); +/* 222 */ +EXTERN void Tk_DeleteOutline _ANSI_ARGS_((Display *display, + Tk_Outline *outline)); +/* 223 */ +EXTERN int Tk_ConfigOutlineGC _ANSI_ARGS_((XGCValues *gcValues, + Tk_Canvas canvas, Tk_Item *item, + Tk_Outline *outline)); +/* 224 */ +EXTERN int Tk_ChangeOutlineGC _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *item, Tk_Outline *outline)); +/* 225 */ +EXTERN int Tk_ResetOutlineGC _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *item, Tk_Outline *outline)); +/* 226 */ +EXTERN int Tk_CanvasPsOutline _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *item, Tk_Outline *outline)); +/* 227 */ +EXTERN void Tk_SetTSOrigin _ANSI_ARGS_((Tk_Window tkwin, GC gc, + int x, int y)); +/* 228 */ +EXTERN int Tk_CanvasGetCoordFromObj _ANSI_ARGS_(( + Tcl_Interp *interp, Tk_Canvas canvas, + Tcl_Obj *obj, double *doublePtr)); +/* 229 */ +EXTERN void Tk_CanvasSetOffset _ANSI_ARGS_((Tk_Canvas canvas, + GC gc, Tk_TSOffset *offset)); +/* 230 */ +EXTERN void Tk_DitherPhoto _ANSI_ARGS_((Tk_PhotoHandle handle, + int x, int y, int width, int height)); +/* 231 */ +EXTERN int Tk_PostscriptBitmap _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tk_PostscriptInfo psInfo, + Pixmap bitmap, int startX, int startY, + int width, int height)); +/* 232 */ +EXTERN int Tk_PostscriptColor _ANSI_ARGS_((Tcl_Interp *interp, + Tk_PostscriptInfo psInfo, XColor *colorPtr)); +/* 233 */ +EXTERN int Tk_PostscriptFont _ANSI_ARGS_((Tcl_Interp *interp, + Tk_PostscriptInfo psInfo, Tk_Font font)); +/* 234 */ +EXTERN int Tk_PostscriptImage _ANSI_ARGS_((Tk_Image image, + Tcl_Interp *interp, Tk_Window tkwin, + Tk_PostscriptInfo psinfo, int x, int y, + int width, int height, int prepass)); +/* 235 */ +EXTERN void Tk_PostscriptPath _ANSI_ARGS_((Tcl_Interp *interp, + Tk_PostscriptInfo psInfo, double *coordPtr, + int numPoints)); +/* 236 */ +EXTERN int Tk_PostscriptStipple _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tk_PostscriptInfo psInfo, + Pixmap bitmap)); +/* 237 */ +EXTERN double Tk_PostscriptY _ANSI_ARGS_((double y, + Tk_PostscriptInfo psInfo)); +/* 238 */ +EXTERN int Tk_PostscriptPhoto _ANSI_ARGS_((Tcl_Interp *interp, + Tk_PhotoImageBlock *blockPtr, + Tk_PostscriptInfo psInfo, int width, + int height)); +/* 239 */ +EXTERN void Tk_CreateClientMessageHandler _ANSI_ARGS_(( + Tk_ClientMessageProc *proc)); +/* 240 */ +EXTERN void Tk_DeleteClientMessageHandler _ANSI_ARGS_(( + Tk_ClientMessageProc *proc)); +/* 241 */ +EXTERN Tk_Window Tk_CreateAnonymousWindow _ANSI_ARGS_(( + Tcl_Interp *interp, Tk_Window parent, + CONST char *screenName)); +/* 242 */ +EXTERN void Tk_SetClassProcs _ANSI_ARGS_((Tk_Window tkwin, + Tk_ClassProcs *procs, + ClientData instanceData)); +/* 243 */ +EXTERN void Tk_SetInternalBorderEx _ANSI_ARGS_((Tk_Window tkwin, + int left, int right, int top, int bottom)); +/* 244 */ +EXTERN void Tk_SetMinimumRequestSize _ANSI_ARGS_(( + Tk_Window tkwin, int minWidth, int minHeight)); +/* 245 */ +EXTERN void Tk_SetCaretPos _ANSI_ARGS_((Tk_Window tkwin, int x, + int y, int height)); +/* 246 */ +EXTERN void Tk_PhotoPutBlock _ANSI_ARGS_((Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int compRule)); +/* 247 */ +EXTERN void Tk_PhotoPutZoomedBlock _ANSI_ARGS_(( + Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int zoomX, int zoomY, + int subsampleX, int subsampleY, int compRule)); +/* 248 */ +EXTERN int Tk_CollapseMotionEvents _ANSI_ARGS_(( + Display *display, int collapse)); +/* 249 */ +EXTERN Tk_StyleEngine Tk_RegisterStyleEngine _ANSI_ARGS_((CONST char *name, + Tk_StyleEngine parent)); +/* 250 */ +EXTERN Tk_StyleEngine Tk_GetStyleEngine _ANSI_ARGS_((CONST char *name)); +/* 251 */ +EXTERN int Tk_RegisterStyledElement _ANSI_ARGS_(( + Tk_StyleEngine engine, + Tk_ElementSpec *templatePtr)); +/* 252 */ +EXTERN int Tk_GetElementId _ANSI_ARGS_((CONST char *name)); +/* 253 */ +EXTERN Tk_Style Tk_CreateStyle _ANSI_ARGS_((CONST char *name, + Tk_StyleEngine engine, ClientData clientData)); +/* 254 */ +EXTERN Tk_Style Tk_GetStyle _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *name)); +/* 255 */ +EXTERN void Tk_FreeStyle _ANSI_ARGS_((Tk_Style style)); +/* 256 */ +EXTERN CONST char * Tk_NameOfStyle _ANSI_ARGS_((Tk_Style style)); +/* 257 */ +EXTERN Tk_Style Tk_AllocStyleFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr)); +/* 258 */ +EXTERN Tk_Style Tk_GetStyleFromObj _ANSI_ARGS_((Tcl_Obj *objPtr)); +/* 259 */ +EXTERN void Tk_FreeStyleFromObj _ANSI_ARGS_((Tcl_Obj *objPtr)); +/* 260 */ +EXTERN Tk_StyledElement Tk_GetStyledElement _ANSI_ARGS_((Tk_Style style, + int elementId, Tk_OptionTable optionTable)); +/* 261 */ +EXTERN void Tk_GetElementSize _ANSI_ARGS_((Tk_Style style, + Tk_StyledElement element, char *recordPtr, + Tk_Window tkwin, int width, int height, + int inner, int *widthPtr, int *heightPtr)); +/* 262 */ +EXTERN void Tk_GetElementBox _ANSI_ARGS_((Tk_Style style, + Tk_StyledElement element, char *recordPtr, + Tk_Window tkwin, int x, int y, int width, + int height, int inner, int *xPtr, int *yPtr, + int *widthPtr, int *heightPtr)); +/* 263 */ +EXTERN int Tk_GetElementBorderWidth _ANSI_ARGS_((Tk_Style style, + Tk_StyledElement element, char *recordPtr, + Tk_Window tkwin)); +/* 264 */ +EXTERN void Tk_DrawElement _ANSI_ARGS_((Tk_Style style, + Tk_StyledElement element, char *recordPtr, + Tk_Window tkwin, Drawable d, int x, int y, + int width, int height, int state)); +/* Slot 265 is reserved */ +/* Slot 266 is reserved */ +/* Slot 267 is reserved */ +/* Slot 268 is reserved */ +/* Slot 269 is reserved */ +/* Slot 270 is reserved */ +/* Slot 271 is reserved */ +/* Slot 272 is reserved */ +/* Slot 273 is reserved */ +/* Slot 274 is reserved */ +/* 275 */ +EXTERN void TkUnusedStubEntry _ANSI_ARGS_((void)); + +typedef struct TkStubHooks { + struct TkPlatStubs *tkPlatStubs; + struct TkIntStubs *tkIntStubs; + struct TkIntPlatStubs *tkIntPlatStubs; + struct TkIntXlibStubs *tkIntXlibStubs; +} TkStubHooks; + +typedef struct TkStubs { + int magic; + struct TkStubHooks *hooks; + + void (*tk_MainLoop) _ANSI_ARGS_((void)); /* 0 */ + XColor * (*tk_3DBorderColor) _ANSI_ARGS_((Tk_3DBorder border)); /* 1 */ + GC (*tk_3DBorderGC) _ANSI_ARGS_((Tk_Window tkwin, Tk_3DBorder border, int which)); /* 2 */ + void (*tk_3DHorizontalBevel) _ANSI_ARGS_((Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height, int leftIn, int rightIn, int topBevel, int relief)); /* 3 */ + void (*tk_3DVerticalBevel) _ANSI_ARGS_((Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height, int leftBevel, int relief)); /* 4 */ + void (*tk_AddOption) _ANSI_ARGS_((Tk_Window tkwin, CONST char *name, CONST char *value, int priority)); /* 5 */ + void (*tk_BindEvent) _ANSI_ARGS_((Tk_BindingTable bindingTable, XEvent *eventPtr, Tk_Window tkwin, int numObjects, ClientData *objectPtr)); /* 6 */ + void (*tk_CanvasDrawableCoords) _ANSI_ARGS_((Tk_Canvas canvas, double x, double y, short *drawableXPtr, short *drawableYPtr)); /* 7 */ + void (*tk_CanvasEventuallyRedraw) _ANSI_ARGS_((Tk_Canvas canvas, int x1, int y1, int x2, int y2)); /* 8 */ + int (*tk_CanvasGetCoord) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Canvas canvas, CONST char *str, double *doublePtr)); /* 9 */ + Tk_CanvasTextInfo * (*tk_CanvasGetTextInfo) _ANSI_ARGS_((Tk_Canvas canvas)); /* 10 */ + int (*tk_CanvasPsBitmap) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Canvas canvas, Pixmap bitmap, int x, int y, int width, int height)); /* 11 */ + int (*tk_CanvasPsColor) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Canvas canvas, XColor *colorPtr)); /* 12 */ + int (*tk_CanvasPsFont) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Canvas canvas, Tk_Font font)); /* 13 */ + void (*tk_CanvasPsPath) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Canvas canvas, double *coordPtr, int numPoints)); /* 14 */ + int (*tk_CanvasPsStipple) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Canvas canvas, Pixmap bitmap)); /* 15 */ + double (*tk_CanvasPsY) _ANSI_ARGS_((Tk_Canvas canvas, double y)); /* 16 */ + void (*tk_CanvasSetStippleOrigin) _ANSI_ARGS_((Tk_Canvas canvas, GC gc)); /* 17 */ + int (*tk_CanvasTagsParseProc) _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, Tk_Window tkwin, CONST char *value, char *widgRec, int offset)); /* 18 */ + char * (*tk_CanvasTagsPrintProc) _ANSI_ARGS_((ClientData clientData, Tk_Window tkwin, char *widgRec, int offset, Tcl_FreeProc **freeProcPtr)); /* 19 */ + Tk_Window (*tk_CanvasTkwin) _ANSI_ARGS_((Tk_Canvas canvas)); /* 20 */ + void (*tk_CanvasWindowCoords) _ANSI_ARGS_((Tk_Canvas canvas, double x, double y, short *screenXPtr, short *screenYPtr)); /* 21 */ + void (*tk_ChangeWindowAttributes) _ANSI_ARGS_((Tk_Window tkwin, unsigned long valueMask, XSetWindowAttributes *attsPtr)); /* 22 */ + int (*tk_CharBbox) _ANSI_ARGS_((Tk_TextLayout layout, int index, int *xPtr, int *yPtr, int *widthPtr, int *heightPtr)); /* 23 */ + void (*tk_ClearSelection) _ANSI_ARGS_((Tk_Window tkwin, Atom selection)); /* 24 */ + int (*tk_ClipboardAppend) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Atom target, Atom format, char *buffer)); /* 25 */ + int (*tk_ClipboardClear) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin)); /* 26 */ + int (*tk_ConfigureInfo) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tk_ConfigSpec *specs, char *widgRec, CONST char *argvName, int flags)); /* 27 */ + int (*tk_ConfigureValue) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tk_ConfigSpec *specs, char *widgRec, CONST char *argvName, int flags)); /* 28 */ + int (*tk_ConfigureWidget) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tk_ConfigSpec *specs, int argc, CONST84 char **argv, char *widgRec, int flags)); /* 29 */ + void (*tk_ConfigureWindow) _ANSI_ARGS_((Tk_Window tkwin, unsigned int valueMask, XWindowChanges *valuePtr)); /* 30 */ + Tk_TextLayout (*tk_ComputeTextLayout) _ANSI_ARGS_((Tk_Font font, CONST char *str, int numChars, int wrapLength, Tk_Justify justify, int flags, int *widthPtr, int *heightPtr)); /* 31 */ + Tk_Window (*tk_CoordsToWindow) _ANSI_ARGS_((int rootX, int rootY, Tk_Window tkwin)); /* 32 */ + unsigned long (*tk_CreateBinding) _ANSI_ARGS_((Tcl_Interp *interp, Tk_BindingTable bindingTable, ClientData object, CONST char *eventStr, CONST char *script, int append)); /* 33 */ + Tk_BindingTable (*tk_CreateBindingTable) _ANSI_ARGS_((Tcl_Interp *interp)); /* 34 */ + Tk_ErrorHandler (*tk_CreateErrorHandler) _ANSI_ARGS_((Display *display, int errNum, int request, int minorCode, Tk_ErrorProc *errorProc, ClientData clientData)); /* 35 */ + void (*tk_CreateEventHandler) _ANSI_ARGS_((Tk_Window token, unsigned long mask, Tk_EventProc *proc, ClientData clientData)); /* 36 */ + void (*tk_CreateGenericHandler) _ANSI_ARGS_((Tk_GenericProc *proc, ClientData clientData)); /* 37 */ + void (*tk_CreateImageType) _ANSI_ARGS_((Tk_ImageType *typePtr)); /* 38 */ + void (*tk_CreateItemType) _ANSI_ARGS_((Tk_ItemType *typePtr)); /* 39 */ + void (*tk_CreatePhotoImageFormat) _ANSI_ARGS_((Tk_PhotoImageFormat *formatPtr)); /* 40 */ + void (*tk_CreateSelHandler) _ANSI_ARGS_((Tk_Window tkwin, Atom selection, Atom target, Tk_SelectionProc *proc, ClientData clientData, Atom format)); /* 41 */ + Tk_Window (*tk_CreateWindow) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window parent, CONST char *name, CONST char *screenName)); /* 42 */ + Tk_Window (*tk_CreateWindowFromPath) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, CONST char *pathName, CONST char *screenName)); /* 43 */ + int (*tk_DefineBitmap) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, CONST char *source, int width, int height)); /* 44 */ + void (*tk_DefineCursor) _ANSI_ARGS_((Tk_Window window, Tk_Cursor cursor)); /* 45 */ + void (*tk_DeleteAllBindings) _ANSI_ARGS_((Tk_BindingTable bindingTable, ClientData object)); /* 46 */ + int (*tk_DeleteBinding) _ANSI_ARGS_((Tcl_Interp *interp, Tk_BindingTable bindingTable, ClientData object, CONST char *eventStr)); /* 47 */ + void (*tk_DeleteBindingTable) _ANSI_ARGS_((Tk_BindingTable bindingTable)); /* 48 */ + void (*tk_DeleteErrorHandler) _ANSI_ARGS_((Tk_ErrorHandler handler)); /* 49 */ + void (*tk_DeleteEventHandler) _ANSI_ARGS_((Tk_Window token, unsigned long mask, Tk_EventProc *proc, ClientData clientData)); /* 50 */ + void (*tk_DeleteGenericHandler) _ANSI_ARGS_((Tk_GenericProc *proc, ClientData clientData)); /* 51 */ + void (*tk_DeleteImage) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name)); /* 52 */ + void (*tk_DeleteSelHandler) _ANSI_ARGS_((Tk_Window tkwin, Atom selection, Atom target)); /* 53 */ + void (*tk_DestroyWindow) _ANSI_ARGS_((Tk_Window tkwin)); /* 54 */ + CONST84_RETURN char * (*tk_DisplayName) _ANSI_ARGS_((Tk_Window tkwin)); /* 55 */ + int (*tk_DistanceToTextLayout) _ANSI_ARGS_((Tk_TextLayout layout, int x, int y)); /* 56 */ + void (*tk_Draw3DPolygon) _ANSI_ARGS_((Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, XPoint *pointPtr, int numPoints, int borderWidth, int leftRelief)); /* 57 */ + void (*tk_Draw3DRectangle) _ANSI_ARGS_((Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height, int borderWidth, int relief)); /* 58 */ + void (*tk_DrawChars) _ANSI_ARGS_((Display *display, Drawable drawable, GC gc, Tk_Font tkfont, CONST char *source, int numBytes, int x, int y)); /* 59 */ + void (*tk_DrawFocusHighlight) _ANSI_ARGS_((Tk_Window tkwin, GC gc, int width, Drawable drawable)); /* 60 */ + void (*tk_DrawTextLayout) _ANSI_ARGS_((Display *display, Drawable drawable, GC gc, Tk_TextLayout layout, int x, int y, int firstChar, int lastChar)); /* 61 */ + void (*tk_Fill3DPolygon) _ANSI_ARGS_((Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, XPoint *pointPtr, int numPoints, int borderWidth, int leftRelief)); /* 62 */ + void (*tk_Fill3DRectangle) _ANSI_ARGS_((Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height, int borderWidth, int relief)); /* 63 */ + Tk_PhotoHandle (*tk_FindPhoto) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *imageName)); /* 64 */ + Font (*tk_FontId) _ANSI_ARGS_((Tk_Font font)); /* 65 */ + void (*tk_Free3DBorder) _ANSI_ARGS_((Tk_3DBorder border)); /* 66 */ + void (*tk_FreeBitmap) _ANSI_ARGS_((Display *display, Pixmap bitmap)); /* 67 */ + void (*tk_FreeColor) _ANSI_ARGS_((XColor *colorPtr)); /* 68 */ + void (*tk_FreeColormap) _ANSI_ARGS_((Display *display, Colormap colormap)); /* 69 */ + void (*tk_FreeCursor) _ANSI_ARGS_((Display *display, Tk_Cursor cursor)); /* 70 */ + void (*tk_FreeFont) _ANSI_ARGS_((Tk_Font f)); /* 71 */ + void (*tk_FreeGC) _ANSI_ARGS_((Display *display, GC gc)); /* 72 */ + void (*tk_FreeImage) _ANSI_ARGS_((Tk_Image image)); /* 73 */ + void (*tk_FreeOptions) _ANSI_ARGS_((Tk_ConfigSpec *specs, char *widgRec, Display *display, int needFlags)); /* 74 */ + void (*tk_FreePixmap) _ANSI_ARGS_((Display *display, Pixmap pixmap)); /* 75 */ + void (*tk_FreeTextLayout) _ANSI_ARGS_((Tk_TextLayout textLayout)); /* 76 */ + void (*tk_FreeXId) _ANSI_ARGS_((Display *display, XID xid)); /* 77 */ + GC (*tk_GCForColor) _ANSI_ARGS_((XColor *colorPtr, Drawable drawable)); /* 78 */ + void (*tk_GeometryRequest) _ANSI_ARGS_((Tk_Window tkwin, int reqWidth, int reqHeight)); /* 79 */ + Tk_3DBorder (*tk_Get3DBorder) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tk_Uid colorName)); /* 80 */ + void (*tk_GetAllBindings) _ANSI_ARGS_((Tcl_Interp *interp, Tk_BindingTable bindingTable, ClientData object)); /* 81 */ + int (*tk_GetAnchor) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *str, Tk_Anchor *anchorPtr)); /* 82 */ + CONST84_RETURN char * (*tk_GetAtomName) _ANSI_ARGS_((Tk_Window tkwin, Atom atom)); /* 83 */ + CONST84_RETURN char * (*tk_GetBinding) _ANSI_ARGS_((Tcl_Interp *interp, Tk_BindingTable bindingTable, ClientData object, CONST char *eventStr)); /* 84 */ + Pixmap (*tk_GetBitmap) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, CONST char *str)); /* 85 */ + Pixmap (*tk_GetBitmapFromData) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, CONST char *source, int width, int height)); /* 86 */ + int (*tk_GetCapStyle) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *str, int *capPtr)); /* 87 */ + XColor * (*tk_GetColor) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tk_Uid name)); /* 88 */ + XColor * (*tk_GetColorByValue) _ANSI_ARGS_((Tk_Window tkwin, XColor *colorPtr)); /* 89 */ + Colormap (*tk_GetColormap) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, CONST char *str)); /* 90 */ + Tk_Cursor (*tk_GetCursor) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tk_Uid str)); /* 91 */ + Tk_Cursor (*tk_GetCursorFromData) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, CONST char *source, CONST char *mask, int width, int height, int xHot, int yHot, Tk_Uid fg, Tk_Uid bg)); /* 92 */ + Tk_Font (*tk_GetFont) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, CONST char *str)); /* 93 */ + Tk_Font (*tk_GetFontFromObj) _ANSI_ARGS_((Tk_Window tkwin, Tcl_Obj *objPtr)); /* 94 */ + void (*tk_GetFontMetrics) _ANSI_ARGS_((Tk_Font font, Tk_FontMetrics *fmPtr)); /* 95 */ + GC (*tk_GetGC) _ANSI_ARGS_((Tk_Window tkwin, unsigned long valueMask, XGCValues *valuePtr)); /* 96 */ + Tk_Image (*tk_GetImage) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, CONST char *name, Tk_ImageChangedProc *changeProc, ClientData clientData)); /* 97 */ + ClientData (*tk_GetImageMasterData) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, Tk_ImageType **typePtrPtr)); /* 98 */ + Tk_ItemType * (*tk_GetItemTypes) _ANSI_ARGS_((void)); /* 99 */ + int (*tk_GetJoinStyle) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *str, int *joinPtr)); /* 100 */ + int (*tk_GetJustify) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *str, Tk_Justify *justifyPtr)); /* 101 */ + int (*tk_GetNumMainWindows) _ANSI_ARGS_((void)); /* 102 */ + Tk_Uid (*tk_GetOption) _ANSI_ARGS_((Tk_Window tkwin, CONST char *name, CONST char *className)); /* 103 */ + int (*tk_GetPixels) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, CONST char *str, int *intPtr)); /* 104 */ + Pixmap (*tk_GetPixmap) _ANSI_ARGS_((Display *display, Drawable d, int width, int height, int depth)); /* 105 */ + int (*tk_GetRelief) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name, int *reliefPtr)); /* 106 */ + void (*tk_GetRootCoords) _ANSI_ARGS_((Tk_Window tkwin, int *xPtr, int *yPtr)); /* 107 */ + int (*tk_GetScrollInfo) _ANSI_ARGS_((Tcl_Interp *interp, int argc, CONST84 char **argv, double *dblPtr, int *intPtr)); /* 108 */ + int (*tk_GetScreenMM) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, CONST char *str, double *doublePtr)); /* 109 */ + int (*tk_GetSelection) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Atom selection, Atom target, Tk_GetSelProc *proc, ClientData clientData)); /* 110 */ + Tk_Uid (*tk_GetUid) _ANSI_ARGS_((CONST char *str)); /* 111 */ + Visual * (*tk_GetVisual) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, CONST char *str, int *depthPtr, Colormap *colormapPtr)); /* 112 */ + void (*tk_GetVRootGeometry) _ANSI_ARGS_((Tk_Window tkwin, int *xPtr, int *yPtr, int *widthPtr, int *heightPtr)); /* 113 */ + int (*tk_Grab) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, int grabGlobal)); /* 114 */ + void (*tk_HandleEvent) _ANSI_ARGS_((XEvent *eventPtr)); /* 115 */ + Tk_Window (*tk_IdToWindow) _ANSI_ARGS_((Display *display, Window window)); /* 116 */ + void (*tk_ImageChanged) _ANSI_ARGS_((Tk_ImageMaster master, int x, int y, int width, int height, int imageWidth, int imageHeight)); /* 117 */ + int (*tk_Init) _ANSI_ARGS_((Tcl_Interp *interp)); /* 118 */ + Atom (*tk_InternAtom) _ANSI_ARGS_((Tk_Window tkwin, CONST char *name)); /* 119 */ + int (*tk_IntersectTextLayout) _ANSI_ARGS_((Tk_TextLayout layout, int x, int y, int width, int height)); /* 120 */ + void (*tk_MaintainGeometry) _ANSI_ARGS_((Tk_Window slave, Tk_Window master, int x, int y, int width, int height)); /* 121 */ + Tk_Window (*tk_MainWindow) _ANSI_ARGS_((Tcl_Interp *interp)); /* 122 */ + void (*tk_MakeWindowExist) _ANSI_ARGS_((Tk_Window tkwin)); /* 123 */ + void (*tk_ManageGeometry) _ANSI_ARGS_((Tk_Window tkwin, Tk_GeomMgr *mgrPtr, ClientData clientData)); /* 124 */ + void (*tk_MapWindow) _ANSI_ARGS_((Tk_Window tkwin)); /* 125 */ + int (*tk_MeasureChars) _ANSI_ARGS_((Tk_Font tkfont, CONST char *source, int numBytes, int maxPixels, int flags, int *lengthPtr)); /* 126 */ + void (*tk_MoveResizeWindow) _ANSI_ARGS_((Tk_Window tkwin, int x, int y, int width, int height)); /* 127 */ + void (*tk_MoveWindow) _ANSI_ARGS_((Tk_Window tkwin, int x, int y)); /* 128 */ + void (*tk_MoveToplevelWindow) _ANSI_ARGS_((Tk_Window tkwin, int x, int y)); /* 129 */ + CONST84_RETURN char * (*tk_NameOf3DBorder) _ANSI_ARGS_((Tk_3DBorder border)); /* 130 */ + CONST84_RETURN char * (*tk_NameOfAnchor) _ANSI_ARGS_((Tk_Anchor anchor)); /* 131 */ + CONST84_RETURN char * (*tk_NameOfBitmap) _ANSI_ARGS_((Display *display, Pixmap bitmap)); /* 132 */ + CONST84_RETURN char * (*tk_NameOfCapStyle) _ANSI_ARGS_((int cap)); /* 133 */ + CONST84_RETURN char * (*tk_NameOfColor) _ANSI_ARGS_((XColor *colorPtr)); /* 134 */ + CONST84_RETURN char * (*tk_NameOfCursor) _ANSI_ARGS_((Display *display, Tk_Cursor cursor)); /* 135 */ + CONST84_RETURN char * (*tk_NameOfFont) _ANSI_ARGS_((Tk_Font font)); /* 136 */ + CONST84_RETURN char * (*tk_NameOfImage) _ANSI_ARGS_((Tk_ImageMaster imageMaster)); /* 137 */ + CONST84_RETURN char * (*tk_NameOfJoinStyle) _ANSI_ARGS_((int join)); /* 138 */ + CONST84_RETURN char * (*tk_NameOfJustify) _ANSI_ARGS_((Tk_Justify justify)); /* 139 */ + CONST84_RETURN char * (*tk_NameOfRelief) _ANSI_ARGS_((int relief)); /* 140 */ + Tk_Window (*tk_NameToWindow) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *pathName, Tk_Window tkwin)); /* 141 */ + void (*tk_OwnSelection) _ANSI_ARGS_((Tk_Window tkwin, Atom selection, Tk_LostSelProc *proc, ClientData clientData)); /* 142 */ + int (*tk_ParseArgv) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, int *argcPtr, CONST84 char **argv, Tk_ArgvInfo *argTable, int flags)); /* 143 */ + void (*tk_PhotoPutBlock_NoComposite) _ANSI_ARGS_((Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height)); /* 144 */ + void (*tk_PhotoPutZoomedBlock_NoComposite) _ANSI_ARGS_((Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY)); /* 145 */ + int (*tk_PhotoGetImage) _ANSI_ARGS_((Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr)); /* 146 */ + void (*tk_PhotoBlank) _ANSI_ARGS_((Tk_PhotoHandle handle)); /* 147 */ + void (*tk_PhotoExpand) _ANSI_ARGS_((Tk_PhotoHandle handle, int width, int height)); /* 148 */ + void (*tk_PhotoGetSize) _ANSI_ARGS_((Tk_PhotoHandle handle, int *widthPtr, int *heightPtr)); /* 149 */ + void (*tk_PhotoSetSize) _ANSI_ARGS_((Tk_PhotoHandle handle, int width, int height)); /* 150 */ + int (*tk_PointToChar) _ANSI_ARGS_((Tk_TextLayout layout, int x, int y)); /* 151 */ + int (*tk_PostscriptFontName) _ANSI_ARGS_((Tk_Font tkfont, Tcl_DString *dsPtr)); /* 152 */ + void (*tk_PreserveColormap) _ANSI_ARGS_((Display *display, Colormap colormap)); /* 153 */ + void (*tk_QueueWindowEvent) _ANSI_ARGS_((XEvent *eventPtr, Tcl_QueuePosition position)); /* 154 */ + void (*tk_RedrawImage) _ANSI_ARGS_((Tk_Image image, int imageX, int imageY, int width, int height, Drawable drawable, int drawableX, int drawableY)); /* 155 */ + void (*tk_ResizeWindow) _ANSI_ARGS_((Tk_Window tkwin, int width, int height)); /* 156 */ + int (*tk_RestackWindow) _ANSI_ARGS_((Tk_Window tkwin, int aboveBelow, Tk_Window other)); /* 157 */ + Tk_RestrictProc * (*tk_RestrictEvents) _ANSI_ARGS_((Tk_RestrictProc *proc, ClientData arg, ClientData *prevArgPtr)); /* 158 */ + int (*tk_SafeInit) _ANSI_ARGS_((Tcl_Interp *interp)); /* 159 */ + CONST char * (*tk_SetAppName) _ANSI_ARGS_((Tk_Window tkwin, CONST char *name)); /* 160 */ + void (*tk_SetBackgroundFromBorder) _ANSI_ARGS_((Tk_Window tkwin, Tk_3DBorder border)); /* 161 */ + void (*tk_SetClass) _ANSI_ARGS_((Tk_Window tkwin, CONST char *className)); /* 162 */ + void (*tk_SetGrid) _ANSI_ARGS_((Tk_Window tkwin, int reqWidth, int reqHeight, int gridWidth, int gridHeight)); /* 163 */ + void (*tk_SetInternalBorder) _ANSI_ARGS_((Tk_Window tkwin, int width)); /* 164 */ + void (*tk_SetWindowBackground) _ANSI_ARGS_((Tk_Window tkwin, unsigned long pixel)); /* 165 */ + void (*tk_SetWindowBackgroundPixmap) _ANSI_ARGS_((Tk_Window tkwin, Pixmap pixmap)); /* 166 */ + void (*tk_SetWindowBorder) _ANSI_ARGS_((Tk_Window tkwin, unsigned long pixel)); /* 167 */ + void (*tk_SetWindowBorderWidth) _ANSI_ARGS_((Tk_Window tkwin, int width)); /* 168 */ + void (*tk_SetWindowBorderPixmap) _ANSI_ARGS_((Tk_Window tkwin, Pixmap pixmap)); /* 169 */ + void (*tk_SetWindowColormap) _ANSI_ARGS_((Tk_Window tkwin, Colormap colormap)); /* 170 */ + int (*tk_SetWindowVisual) _ANSI_ARGS_((Tk_Window tkwin, Visual *visual, int depth, Colormap colormap)); /* 171 */ + void (*tk_SizeOfBitmap) _ANSI_ARGS_((Display *display, Pixmap bitmap, int *widthPtr, int *heightPtr)); /* 172 */ + void (*tk_SizeOfImage) _ANSI_ARGS_((Tk_Image image, int *widthPtr, int *heightPtr)); /* 173 */ + int (*tk_StrictMotif) _ANSI_ARGS_((Tk_Window tkwin)); /* 174 */ + void (*tk_TextLayoutToPostscript) _ANSI_ARGS_((Tcl_Interp *interp, Tk_TextLayout layout)); /* 175 */ + int (*tk_TextWidth) _ANSI_ARGS_((Tk_Font font, CONST char *str, int numBytes)); /* 176 */ + void (*tk_UndefineCursor) _ANSI_ARGS_((Tk_Window window)); /* 177 */ + void (*tk_UnderlineChars) _ANSI_ARGS_((Display *display, Drawable drawable, GC gc, Tk_Font tkfont, CONST char *source, int x, int y, int firstByte, int lastByte)); /* 178 */ + void (*tk_UnderlineTextLayout) _ANSI_ARGS_((Display *display, Drawable drawable, GC gc, Tk_TextLayout layout, int x, int y, int underline)); /* 179 */ + void (*tk_Ungrab) _ANSI_ARGS_((Tk_Window tkwin)); /* 180 */ + void (*tk_UnmaintainGeometry) _ANSI_ARGS_((Tk_Window slave, Tk_Window master)); /* 181 */ + void (*tk_UnmapWindow) _ANSI_ARGS_((Tk_Window tkwin)); /* 182 */ + void (*tk_UnsetGrid) _ANSI_ARGS_((Tk_Window tkwin)); /* 183 */ + void (*tk_UpdatePointer) _ANSI_ARGS_((Tk_Window tkwin, int x, int y, int state)); /* 184 */ + Pixmap (*tk_AllocBitmapFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr)); /* 185 */ + Tk_3DBorder (*tk_Alloc3DBorderFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr)); /* 186 */ + XColor * (*tk_AllocColorFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr)); /* 187 */ + Tk_Cursor (*tk_AllocCursorFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr)); /* 188 */ + Tk_Font (*tk_AllocFontFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr)); /* 189 */ + Tk_OptionTable (*tk_CreateOptionTable) _ANSI_ARGS_((Tcl_Interp *interp, CONST Tk_OptionSpec *templatePtr)); /* 190 */ + void (*tk_DeleteOptionTable) _ANSI_ARGS_((Tk_OptionTable optionTable)); /* 191 */ + void (*tk_Free3DBorderFromObj) _ANSI_ARGS_((Tk_Window tkwin, Tcl_Obj *objPtr)); /* 192 */ + void (*tk_FreeBitmapFromObj) _ANSI_ARGS_((Tk_Window tkwin, Tcl_Obj *objPtr)); /* 193 */ + void (*tk_FreeColorFromObj) _ANSI_ARGS_((Tk_Window tkwin, Tcl_Obj *objPtr)); /* 194 */ + void (*tk_FreeConfigOptions) _ANSI_ARGS_((char *recordPtr, Tk_OptionTable optionToken, Tk_Window tkwin)); /* 195 */ + void (*tk_FreeSavedOptions) _ANSI_ARGS_((Tk_SavedOptions *savePtr)); /* 196 */ + void (*tk_FreeCursorFromObj) _ANSI_ARGS_((Tk_Window tkwin, Tcl_Obj *objPtr)); /* 197 */ + void (*tk_FreeFontFromObj) _ANSI_ARGS_((Tk_Window tkwin, Tcl_Obj *objPtr)); /* 198 */ + Tk_3DBorder (*tk_Get3DBorderFromObj) _ANSI_ARGS_((Tk_Window tkwin, Tcl_Obj *objPtr)); /* 199 */ + int (*tk_GetAnchorFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, Tk_Anchor *anchorPtr)); /* 200 */ + Pixmap (*tk_GetBitmapFromObj) _ANSI_ARGS_((Tk_Window tkwin, Tcl_Obj *objPtr)); /* 201 */ + XColor * (*tk_GetColorFromObj) _ANSI_ARGS_((Tk_Window tkwin, Tcl_Obj *objPtr)); /* 202 */ + Tk_Cursor (*tk_GetCursorFromObj) _ANSI_ARGS_((Tk_Window tkwin, Tcl_Obj *objPtr)); /* 203 */ + Tcl_Obj * (*tk_GetOptionInfo) _ANSI_ARGS_((Tcl_Interp *interp, char *recordPtr, Tk_OptionTable optionTable, Tcl_Obj *namePtr, Tk_Window tkwin)); /* 204 */ + Tcl_Obj * (*tk_GetOptionValue) _ANSI_ARGS_((Tcl_Interp *interp, char *recordPtr, Tk_OptionTable optionTable, Tcl_Obj *namePtr, Tk_Window tkwin)); /* 205 */ + int (*tk_GetJustifyFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, Tk_Justify *justifyPtr)); /* 206 */ + int (*tk_GetMMFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr, double *doublePtr)); /* 207 */ + int (*tk_GetPixelsFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr, int *intPtr)); /* 208 */ + int (*tk_GetReliefFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, int *resultPtr)); /* 209 */ + int (*tk_GetScrollInfoObj) _ANSI_ARGS_((Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], double *dblPtr, int *intPtr)); /* 210 */ + int (*tk_InitOptions) _ANSI_ARGS_((Tcl_Interp *interp, char *recordPtr, Tk_OptionTable optionToken, Tk_Window tkwin)); /* 211 */ + void (*tk_MainEx) _ANSI_ARGS_((int argc, char **argv, Tcl_AppInitProc *appInitProc, Tcl_Interp *interp)); /* 212 */ + void (*tk_RestoreSavedOptions) _ANSI_ARGS_((Tk_SavedOptions *savePtr)); /* 213 */ + int (*tk_SetOptions) _ANSI_ARGS_((Tcl_Interp *interp, char *recordPtr, Tk_OptionTable optionTable, int objc, Tcl_Obj *CONST objv[], Tk_Window tkwin, Tk_SavedOptions *savePtr, int *maskPtr)); /* 214 */ + void (*tk_InitConsoleChannels) _ANSI_ARGS_((Tcl_Interp *interp)); /* 215 */ + int (*tk_CreateConsoleWindow) _ANSI_ARGS_((Tcl_Interp *interp)); /* 216 */ + void (*tk_CreateSmoothMethod) _ANSI_ARGS_((Tcl_Interp *interp, Tk_SmoothMethod *method)); /* 217 */ + VOID *reserved218; + VOID *reserved219; + int (*tk_GetDash) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *value, Tk_Dash *dash)); /* 220 */ + void (*tk_CreateOutline) _ANSI_ARGS_((Tk_Outline *outline)); /* 221 */ + void (*tk_DeleteOutline) _ANSI_ARGS_((Display *display, Tk_Outline *outline)); /* 222 */ + int (*tk_ConfigOutlineGC) _ANSI_ARGS_((XGCValues *gcValues, Tk_Canvas canvas, Tk_Item *item, Tk_Outline *outline)); /* 223 */ + int (*tk_ChangeOutlineGC) _ANSI_ARGS_((Tk_Canvas canvas, Tk_Item *item, Tk_Outline *outline)); /* 224 */ + int (*tk_ResetOutlineGC) _ANSI_ARGS_((Tk_Canvas canvas, Tk_Item *item, Tk_Outline *outline)); /* 225 */ + int (*tk_CanvasPsOutline) _ANSI_ARGS_((Tk_Canvas canvas, Tk_Item *item, Tk_Outline *outline)); /* 226 */ + void (*tk_SetTSOrigin) _ANSI_ARGS_((Tk_Window tkwin, GC gc, int x, int y)); /* 227 */ + int (*tk_CanvasGetCoordFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Canvas canvas, Tcl_Obj *obj, double *doublePtr)); /* 228 */ + void (*tk_CanvasSetOffset) _ANSI_ARGS_((Tk_Canvas canvas, GC gc, Tk_TSOffset *offset)); /* 229 */ + void (*tk_DitherPhoto) _ANSI_ARGS_((Tk_PhotoHandle handle, int x, int y, int width, int height)); /* 230 */ + int (*tk_PostscriptBitmap) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tk_PostscriptInfo psInfo, Pixmap bitmap, int startX, int startY, int width, int height)); /* 231 */ + int (*tk_PostscriptColor) _ANSI_ARGS_((Tcl_Interp *interp, Tk_PostscriptInfo psInfo, XColor *colorPtr)); /* 232 */ + int (*tk_PostscriptFont) _ANSI_ARGS_((Tcl_Interp *interp, Tk_PostscriptInfo psInfo, Tk_Font font)); /* 233 */ + int (*tk_PostscriptImage) _ANSI_ARGS_((Tk_Image image, Tcl_Interp *interp, Tk_Window tkwin, Tk_PostscriptInfo psinfo, int x, int y, int width, int height, int prepass)); /* 234 */ + void (*tk_PostscriptPath) _ANSI_ARGS_((Tcl_Interp *interp, Tk_PostscriptInfo psInfo, double *coordPtr, int numPoints)); /* 235 */ + int (*tk_PostscriptStipple) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin, Tk_PostscriptInfo psInfo, Pixmap bitmap)); /* 236 */ + double (*tk_PostscriptY) _ANSI_ARGS_((double y, Tk_PostscriptInfo psInfo)); /* 237 */ + int (*tk_PostscriptPhoto) _ANSI_ARGS_((Tcl_Interp *interp, Tk_PhotoImageBlock *blockPtr, Tk_PostscriptInfo psInfo, int width, int height)); /* 238 */ + void (*tk_CreateClientMessageHandler) _ANSI_ARGS_((Tk_ClientMessageProc *proc)); /* 239 */ + void (*tk_DeleteClientMessageHandler) _ANSI_ARGS_((Tk_ClientMessageProc *proc)); /* 240 */ + Tk_Window (*tk_CreateAnonymousWindow) _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window parent, CONST char *screenName)); /* 241 */ + void (*tk_SetClassProcs) _ANSI_ARGS_((Tk_Window tkwin, Tk_ClassProcs *procs, ClientData instanceData)); /* 242 */ + void (*tk_SetInternalBorderEx) _ANSI_ARGS_((Tk_Window tkwin, int left, int right, int top, int bottom)); /* 243 */ + void (*tk_SetMinimumRequestSize) _ANSI_ARGS_((Tk_Window tkwin, int minWidth, int minHeight)); /* 244 */ + void (*tk_SetCaretPos) _ANSI_ARGS_((Tk_Window tkwin, int x, int y, int height)); /* 245 */ + void (*tk_PhotoPutBlock) _ANSI_ARGS_((Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int compRule)); /* 246 */ + void (*tk_PhotoPutZoomedBlock) _ANSI_ARGS_((Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY, int compRule)); /* 247 */ + int (*tk_CollapseMotionEvents) _ANSI_ARGS_((Display *display, int collapse)); /* 248 */ + Tk_StyleEngine (*tk_RegisterStyleEngine) _ANSI_ARGS_((CONST char *name, Tk_StyleEngine parent)); /* 249 */ + Tk_StyleEngine (*tk_GetStyleEngine) _ANSI_ARGS_((CONST char *name)); /* 250 */ + int (*tk_RegisterStyledElement) _ANSI_ARGS_((Tk_StyleEngine engine, Tk_ElementSpec *templatePtr)); /* 251 */ + int (*tk_GetElementId) _ANSI_ARGS_((CONST char *name)); /* 252 */ + Tk_Style (*tk_CreateStyle) _ANSI_ARGS_((CONST char *name, Tk_StyleEngine engine, ClientData clientData)); /* 253 */ + Tk_Style (*tk_GetStyle) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *name)); /* 254 */ + void (*tk_FreeStyle) _ANSI_ARGS_((Tk_Style style)); /* 255 */ + CONST char * (*tk_NameOfStyle) _ANSI_ARGS_((Tk_Style style)); /* 256 */ + Tk_Style (*tk_AllocStyleFromObj) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr)); /* 257 */ + Tk_Style (*tk_GetStyleFromObj) _ANSI_ARGS_((Tcl_Obj *objPtr)); /* 258 */ + void (*tk_FreeStyleFromObj) _ANSI_ARGS_((Tcl_Obj *objPtr)); /* 259 */ + Tk_StyledElement (*tk_GetStyledElement) _ANSI_ARGS_((Tk_Style style, int elementId, Tk_OptionTable optionTable)); /* 260 */ + void (*tk_GetElementSize) _ANSI_ARGS_((Tk_Style style, Tk_StyledElement element, char *recordPtr, Tk_Window tkwin, int width, int height, int inner, int *widthPtr, int *heightPtr)); /* 261 */ + void (*tk_GetElementBox) _ANSI_ARGS_((Tk_Style style, Tk_StyledElement element, char *recordPtr, Tk_Window tkwin, int x, int y, int width, int height, int inner, int *xPtr, int *yPtr, int *widthPtr, int *heightPtr)); /* 262 */ + int (*tk_GetElementBorderWidth) _ANSI_ARGS_((Tk_Style style, Tk_StyledElement element, char *recordPtr, Tk_Window tkwin)); /* 263 */ + void (*tk_DrawElement) _ANSI_ARGS_((Tk_Style style, Tk_StyledElement element, char *recordPtr, Tk_Window tkwin, Drawable d, int x, int y, int width, int height, int state)); /* 264 */ + VOID *reserved265; + VOID *reserved266; + VOID *reserved267; + VOID *reserved268; + VOID *reserved269; + VOID *reserved270; + VOID *reserved271; + VOID *reserved272; + VOID *reserved273; + VOID *reserved274; + void (*tkUnusedStubEntry) _ANSI_ARGS_((void)); /* 275 */ +} TkStubs; + +#ifdef __cplusplus +extern "C" { +#endif +extern TkStubs *tkStubsPtr; +#ifdef __cplusplus +} +#endif + +#if defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) + +/* + * Inline function declarations: + */ + +#ifndef Tk_MainLoop +#define Tk_MainLoop \ + (tkStubsPtr->tk_MainLoop) /* 0 */ +#endif +#ifndef Tk_3DBorderColor +#define Tk_3DBorderColor \ + (tkStubsPtr->tk_3DBorderColor) /* 1 */ +#endif +#ifndef Tk_3DBorderGC +#define Tk_3DBorderGC \ + (tkStubsPtr->tk_3DBorderGC) /* 2 */ +#endif +#ifndef Tk_3DHorizontalBevel +#define Tk_3DHorizontalBevel \ + (tkStubsPtr->tk_3DHorizontalBevel) /* 3 */ +#endif +#ifndef Tk_3DVerticalBevel +#define Tk_3DVerticalBevel \ + (tkStubsPtr->tk_3DVerticalBevel) /* 4 */ +#endif +#ifndef Tk_AddOption +#define Tk_AddOption \ + (tkStubsPtr->tk_AddOption) /* 5 */ +#endif +#ifndef Tk_BindEvent +#define Tk_BindEvent \ + (tkStubsPtr->tk_BindEvent) /* 6 */ +#endif +#ifndef Tk_CanvasDrawableCoords +#define Tk_CanvasDrawableCoords \ + (tkStubsPtr->tk_CanvasDrawableCoords) /* 7 */ +#endif +#ifndef Tk_CanvasEventuallyRedraw +#define Tk_CanvasEventuallyRedraw \ + (tkStubsPtr->tk_CanvasEventuallyRedraw) /* 8 */ +#endif +#ifndef Tk_CanvasGetCoord +#define Tk_CanvasGetCoord \ + (tkStubsPtr->tk_CanvasGetCoord) /* 9 */ +#endif +#ifndef Tk_CanvasGetTextInfo +#define Tk_CanvasGetTextInfo \ + (tkStubsPtr->tk_CanvasGetTextInfo) /* 10 */ +#endif +#ifndef Tk_CanvasPsBitmap +#define Tk_CanvasPsBitmap \ + (tkStubsPtr->tk_CanvasPsBitmap) /* 11 */ +#endif +#ifndef Tk_CanvasPsColor +#define Tk_CanvasPsColor \ + (tkStubsPtr->tk_CanvasPsColor) /* 12 */ +#endif +#ifndef Tk_CanvasPsFont +#define Tk_CanvasPsFont \ + (tkStubsPtr->tk_CanvasPsFont) /* 13 */ +#endif +#ifndef Tk_CanvasPsPath +#define Tk_CanvasPsPath \ + (tkStubsPtr->tk_CanvasPsPath) /* 14 */ +#endif +#ifndef Tk_CanvasPsStipple +#define Tk_CanvasPsStipple \ + (tkStubsPtr->tk_CanvasPsStipple) /* 15 */ +#endif +#ifndef Tk_CanvasPsY +#define Tk_CanvasPsY \ + (tkStubsPtr->tk_CanvasPsY) /* 16 */ +#endif +#ifndef Tk_CanvasSetStippleOrigin +#define Tk_CanvasSetStippleOrigin \ + (tkStubsPtr->tk_CanvasSetStippleOrigin) /* 17 */ +#endif +#ifndef Tk_CanvasTagsParseProc +#define Tk_CanvasTagsParseProc \ + (tkStubsPtr->tk_CanvasTagsParseProc) /* 18 */ +#endif +#ifndef Tk_CanvasTagsPrintProc +#define Tk_CanvasTagsPrintProc \ + (tkStubsPtr->tk_CanvasTagsPrintProc) /* 19 */ +#endif +#ifndef Tk_CanvasTkwin +#define Tk_CanvasTkwin \ + (tkStubsPtr->tk_CanvasTkwin) /* 20 */ +#endif +#ifndef Tk_CanvasWindowCoords +#define Tk_CanvasWindowCoords \ + (tkStubsPtr->tk_CanvasWindowCoords) /* 21 */ +#endif +#ifndef Tk_ChangeWindowAttributes +#define Tk_ChangeWindowAttributes \ + (tkStubsPtr->tk_ChangeWindowAttributes) /* 22 */ +#endif +#ifndef Tk_CharBbox +#define Tk_CharBbox \ + (tkStubsPtr->tk_CharBbox) /* 23 */ +#endif +#ifndef Tk_ClearSelection +#define Tk_ClearSelection \ + (tkStubsPtr->tk_ClearSelection) /* 24 */ +#endif +#ifndef Tk_ClipboardAppend +#define Tk_ClipboardAppend \ + (tkStubsPtr->tk_ClipboardAppend) /* 25 */ +#endif +#ifndef Tk_ClipboardClear +#define Tk_ClipboardClear \ + (tkStubsPtr->tk_ClipboardClear) /* 26 */ +#endif +#ifndef Tk_ConfigureInfo +#define Tk_ConfigureInfo \ + (tkStubsPtr->tk_ConfigureInfo) /* 27 */ +#endif +#ifndef Tk_ConfigureValue +#define Tk_ConfigureValue \ + (tkStubsPtr->tk_ConfigureValue) /* 28 */ +#endif +#ifndef Tk_ConfigureWidget +#define Tk_ConfigureWidget \ + (tkStubsPtr->tk_ConfigureWidget) /* 29 */ +#endif +#ifndef Tk_ConfigureWindow +#define Tk_ConfigureWindow \ + (tkStubsPtr->tk_ConfigureWindow) /* 30 */ +#endif +#ifndef Tk_ComputeTextLayout +#define Tk_ComputeTextLayout \ + (tkStubsPtr->tk_ComputeTextLayout) /* 31 */ +#endif +#ifndef Tk_CoordsToWindow +#define Tk_CoordsToWindow \ + (tkStubsPtr->tk_CoordsToWindow) /* 32 */ +#endif +#ifndef Tk_CreateBinding +#define Tk_CreateBinding \ + (tkStubsPtr->tk_CreateBinding) /* 33 */ +#endif +#ifndef Tk_CreateBindingTable +#define Tk_CreateBindingTable \ + (tkStubsPtr->tk_CreateBindingTable) /* 34 */ +#endif +#ifndef Tk_CreateErrorHandler +#define Tk_CreateErrorHandler \ + (tkStubsPtr->tk_CreateErrorHandler) /* 35 */ +#endif +#ifndef Tk_CreateEventHandler +#define Tk_CreateEventHandler \ + (tkStubsPtr->tk_CreateEventHandler) /* 36 */ +#endif +#ifndef Tk_CreateGenericHandler +#define Tk_CreateGenericHandler \ + (tkStubsPtr->tk_CreateGenericHandler) /* 37 */ +#endif +#ifndef Tk_CreateImageType +#define Tk_CreateImageType \ + (tkStubsPtr->tk_CreateImageType) /* 38 */ +#endif +#ifndef Tk_CreateItemType +#define Tk_CreateItemType \ + (tkStubsPtr->tk_CreateItemType) /* 39 */ +#endif +#ifndef Tk_CreatePhotoImageFormat +#define Tk_CreatePhotoImageFormat \ + (tkStubsPtr->tk_CreatePhotoImageFormat) /* 40 */ +#endif +#ifndef Tk_CreateSelHandler +#define Tk_CreateSelHandler \ + (tkStubsPtr->tk_CreateSelHandler) /* 41 */ +#endif +#ifndef Tk_CreateWindow +#define Tk_CreateWindow \ + (tkStubsPtr->tk_CreateWindow) /* 42 */ +#endif +#ifndef Tk_CreateWindowFromPath +#define Tk_CreateWindowFromPath \ + (tkStubsPtr->tk_CreateWindowFromPath) /* 43 */ +#endif +#ifndef Tk_DefineBitmap +#define Tk_DefineBitmap \ + (tkStubsPtr->tk_DefineBitmap) /* 44 */ +#endif +#ifndef Tk_DefineCursor +#define Tk_DefineCursor \ + (tkStubsPtr->tk_DefineCursor) /* 45 */ +#endif +#ifndef Tk_DeleteAllBindings +#define Tk_DeleteAllBindings \ + (tkStubsPtr->tk_DeleteAllBindings) /* 46 */ +#endif +#ifndef Tk_DeleteBinding +#define Tk_DeleteBinding \ + (tkStubsPtr->tk_DeleteBinding) /* 47 */ +#endif +#ifndef Tk_DeleteBindingTable +#define Tk_DeleteBindingTable \ + (tkStubsPtr->tk_DeleteBindingTable) /* 48 */ +#endif +#ifndef Tk_DeleteErrorHandler +#define Tk_DeleteErrorHandler \ + (tkStubsPtr->tk_DeleteErrorHandler) /* 49 */ +#endif +#ifndef Tk_DeleteEventHandler +#define Tk_DeleteEventHandler \ + (tkStubsPtr->tk_DeleteEventHandler) /* 50 */ +#endif +#ifndef Tk_DeleteGenericHandler +#define Tk_DeleteGenericHandler \ + (tkStubsPtr->tk_DeleteGenericHandler) /* 51 */ +#endif +#ifndef Tk_DeleteImage +#define Tk_DeleteImage \ + (tkStubsPtr->tk_DeleteImage) /* 52 */ +#endif +#ifndef Tk_DeleteSelHandler +#define Tk_DeleteSelHandler \ + (tkStubsPtr->tk_DeleteSelHandler) /* 53 */ +#endif +#ifndef Tk_DestroyWindow +#define Tk_DestroyWindow \ + (tkStubsPtr->tk_DestroyWindow) /* 54 */ +#endif +#ifndef Tk_DisplayName +#define Tk_DisplayName \ + (tkStubsPtr->tk_DisplayName) /* 55 */ +#endif +#ifndef Tk_DistanceToTextLayout +#define Tk_DistanceToTextLayout \ + (tkStubsPtr->tk_DistanceToTextLayout) /* 56 */ +#endif +#ifndef Tk_Draw3DPolygon +#define Tk_Draw3DPolygon \ + (tkStubsPtr->tk_Draw3DPolygon) /* 57 */ +#endif +#ifndef Tk_Draw3DRectangle +#define Tk_Draw3DRectangle \ + (tkStubsPtr->tk_Draw3DRectangle) /* 58 */ +#endif +#ifndef Tk_DrawChars +#define Tk_DrawChars \ + (tkStubsPtr->tk_DrawChars) /* 59 */ +#endif +#ifndef Tk_DrawFocusHighlight +#define Tk_DrawFocusHighlight \ + (tkStubsPtr->tk_DrawFocusHighlight) /* 60 */ +#endif +#ifndef Tk_DrawTextLayout +#define Tk_DrawTextLayout \ + (tkStubsPtr->tk_DrawTextLayout) /* 61 */ +#endif +#ifndef Tk_Fill3DPolygon +#define Tk_Fill3DPolygon \ + (tkStubsPtr->tk_Fill3DPolygon) /* 62 */ +#endif +#ifndef Tk_Fill3DRectangle +#define Tk_Fill3DRectangle \ + (tkStubsPtr->tk_Fill3DRectangle) /* 63 */ +#endif +#ifndef Tk_FindPhoto +#define Tk_FindPhoto \ + (tkStubsPtr->tk_FindPhoto) /* 64 */ +#endif +#ifndef Tk_FontId +#define Tk_FontId \ + (tkStubsPtr->tk_FontId) /* 65 */ +#endif +#ifndef Tk_Free3DBorder +#define Tk_Free3DBorder \ + (tkStubsPtr->tk_Free3DBorder) /* 66 */ +#endif +#ifndef Tk_FreeBitmap +#define Tk_FreeBitmap \ + (tkStubsPtr->tk_FreeBitmap) /* 67 */ +#endif +#ifndef Tk_FreeColor +#define Tk_FreeColor \ + (tkStubsPtr->tk_FreeColor) /* 68 */ +#endif +#ifndef Tk_FreeColormap +#define Tk_FreeColormap \ + (tkStubsPtr->tk_FreeColormap) /* 69 */ +#endif +#ifndef Tk_FreeCursor +#define Tk_FreeCursor \ + (tkStubsPtr->tk_FreeCursor) /* 70 */ +#endif +#ifndef Tk_FreeFont +#define Tk_FreeFont \ + (tkStubsPtr->tk_FreeFont) /* 71 */ +#endif +#ifndef Tk_FreeGC +#define Tk_FreeGC \ + (tkStubsPtr->tk_FreeGC) /* 72 */ +#endif +#ifndef Tk_FreeImage +#define Tk_FreeImage \ + (tkStubsPtr->tk_FreeImage) /* 73 */ +#endif +#ifndef Tk_FreeOptions +#define Tk_FreeOptions \ + (tkStubsPtr->tk_FreeOptions) /* 74 */ +#endif +#ifndef Tk_FreePixmap +#define Tk_FreePixmap \ + (tkStubsPtr->tk_FreePixmap) /* 75 */ +#endif +#ifndef Tk_FreeTextLayout +#define Tk_FreeTextLayout \ + (tkStubsPtr->tk_FreeTextLayout) /* 76 */ +#endif +#ifndef Tk_FreeXId +#define Tk_FreeXId \ + (tkStubsPtr->tk_FreeXId) /* 77 */ +#endif +#ifndef Tk_GCForColor +#define Tk_GCForColor \ + (tkStubsPtr->tk_GCForColor) /* 78 */ +#endif +#ifndef Tk_GeometryRequest +#define Tk_GeometryRequest \ + (tkStubsPtr->tk_GeometryRequest) /* 79 */ +#endif +#ifndef Tk_Get3DBorder +#define Tk_Get3DBorder \ + (tkStubsPtr->tk_Get3DBorder) /* 80 */ +#endif +#ifndef Tk_GetAllBindings +#define Tk_GetAllBindings \ + (tkStubsPtr->tk_GetAllBindings) /* 81 */ +#endif +#ifndef Tk_GetAnchor +#define Tk_GetAnchor \ + (tkStubsPtr->tk_GetAnchor) /* 82 */ +#endif +#ifndef Tk_GetAtomName +#define Tk_GetAtomName \ + (tkStubsPtr->tk_GetAtomName) /* 83 */ +#endif +#ifndef Tk_GetBinding +#define Tk_GetBinding \ + (tkStubsPtr->tk_GetBinding) /* 84 */ +#endif +#ifndef Tk_GetBitmap +#define Tk_GetBitmap \ + (tkStubsPtr->tk_GetBitmap) /* 85 */ +#endif +#ifndef Tk_GetBitmapFromData +#define Tk_GetBitmapFromData \ + (tkStubsPtr->tk_GetBitmapFromData) /* 86 */ +#endif +#ifndef Tk_GetCapStyle +#define Tk_GetCapStyle \ + (tkStubsPtr->tk_GetCapStyle) /* 87 */ +#endif +#ifndef Tk_GetColor +#define Tk_GetColor \ + (tkStubsPtr->tk_GetColor) /* 88 */ +#endif +#ifndef Tk_GetColorByValue +#define Tk_GetColorByValue \ + (tkStubsPtr->tk_GetColorByValue) /* 89 */ +#endif +#ifndef Tk_GetColormap +#define Tk_GetColormap \ + (tkStubsPtr->tk_GetColormap) /* 90 */ +#endif +#ifndef Tk_GetCursor +#define Tk_GetCursor \ + (tkStubsPtr->tk_GetCursor) /* 91 */ +#endif +#ifndef Tk_GetCursorFromData +#define Tk_GetCursorFromData \ + (tkStubsPtr->tk_GetCursorFromData) /* 92 */ +#endif +#ifndef Tk_GetFont +#define Tk_GetFont \ + (tkStubsPtr->tk_GetFont) /* 93 */ +#endif +#ifndef Tk_GetFontFromObj +#define Tk_GetFontFromObj \ + (tkStubsPtr->tk_GetFontFromObj) /* 94 */ +#endif +#ifndef Tk_GetFontMetrics +#define Tk_GetFontMetrics \ + (tkStubsPtr->tk_GetFontMetrics) /* 95 */ +#endif +#ifndef Tk_GetGC +#define Tk_GetGC \ + (tkStubsPtr->tk_GetGC) /* 96 */ +#endif +#ifndef Tk_GetImage +#define Tk_GetImage \ + (tkStubsPtr->tk_GetImage) /* 97 */ +#endif +#ifndef Tk_GetImageMasterData +#define Tk_GetImageMasterData \ + (tkStubsPtr->tk_GetImageMasterData) /* 98 */ +#endif +#ifndef Tk_GetItemTypes +#define Tk_GetItemTypes \ + (tkStubsPtr->tk_GetItemTypes) /* 99 */ +#endif +#ifndef Tk_GetJoinStyle +#define Tk_GetJoinStyle \ + (tkStubsPtr->tk_GetJoinStyle) /* 100 */ +#endif +#ifndef Tk_GetJustify +#define Tk_GetJustify \ + (tkStubsPtr->tk_GetJustify) /* 101 */ +#endif +#ifndef Tk_GetNumMainWindows +#define Tk_GetNumMainWindows \ + (tkStubsPtr->tk_GetNumMainWindows) /* 102 */ +#endif +#ifndef Tk_GetOption +#define Tk_GetOption \ + (tkStubsPtr->tk_GetOption) /* 103 */ +#endif +#ifndef Tk_GetPixels +#define Tk_GetPixels \ + (tkStubsPtr->tk_GetPixels) /* 104 */ +#endif +#ifndef Tk_GetPixmap +#define Tk_GetPixmap \ + (tkStubsPtr->tk_GetPixmap) /* 105 */ +#endif +#ifndef Tk_GetRelief +#define Tk_GetRelief \ + (tkStubsPtr->tk_GetRelief) /* 106 */ +#endif +#ifndef Tk_GetRootCoords +#define Tk_GetRootCoords \ + (tkStubsPtr->tk_GetRootCoords) /* 107 */ +#endif +#ifndef Tk_GetScrollInfo +#define Tk_GetScrollInfo \ + (tkStubsPtr->tk_GetScrollInfo) /* 108 */ +#endif +#ifndef Tk_GetScreenMM +#define Tk_GetScreenMM \ + (tkStubsPtr->tk_GetScreenMM) /* 109 */ +#endif +#ifndef Tk_GetSelection +#define Tk_GetSelection \ + (tkStubsPtr->tk_GetSelection) /* 110 */ +#endif +#ifndef Tk_GetUid +#define Tk_GetUid \ + (tkStubsPtr->tk_GetUid) /* 111 */ +#endif +#ifndef Tk_GetVisual +#define Tk_GetVisual \ + (tkStubsPtr->tk_GetVisual) /* 112 */ +#endif +#ifndef Tk_GetVRootGeometry +#define Tk_GetVRootGeometry \ + (tkStubsPtr->tk_GetVRootGeometry) /* 113 */ +#endif +#ifndef Tk_Grab +#define Tk_Grab \ + (tkStubsPtr->tk_Grab) /* 114 */ +#endif +#ifndef Tk_HandleEvent +#define Tk_HandleEvent \ + (tkStubsPtr->tk_HandleEvent) /* 115 */ +#endif +#ifndef Tk_IdToWindow +#define Tk_IdToWindow \ + (tkStubsPtr->tk_IdToWindow) /* 116 */ +#endif +#ifndef Tk_ImageChanged +#define Tk_ImageChanged \ + (tkStubsPtr->tk_ImageChanged) /* 117 */ +#endif +#ifndef Tk_Init +#define Tk_Init \ + (tkStubsPtr->tk_Init) /* 118 */ +#endif +#ifndef Tk_InternAtom +#define Tk_InternAtom \ + (tkStubsPtr->tk_InternAtom) /* 119 */ +#endif +#ifndef Tk_IntersectTextLayout +#define Tk_IntersectTextLayout \ + (tkStubsPtr->tk_IntersectTextLayout) /* 120 */ +#endif +#ifndef Tk_MaintainGeometry +#define Tk_MaintainGeometry \ + (tkStubsPtr->tk_MaintainGeometry) /* 121 */ +#endif +#ifndef Tk_MainWindow +#define Tk_MainWindow \ + (tkStubsPtr->tk_MainWindow) /* 122 */ +#endif +#ifndef Tk_MakeWindowExist +#define Tk_MakeWindowExist \ + (tkStubsPtr->tk_MakeWindowExist) /* 123 */ +#endif +#ifndef Tk_ManageGeometry +#define Tk_ManageGeometry \ + (tkStubsPtr->tk_ManageGeometry) /* 124 */ +#endif +#ifndef Tk_MapWindow +#define Tk_MapWindow \ + (tkStubsPtr->tk_MapWindow) /* 125 */ +#endif +#ifndef Tk_MeasureChars +#define Tk_MeasureChars \ + (tkStubsPtr->tk_MeasureChars) /* 126 */ +#endif +#ifndef Tk_MoveResizeWindow +#define Tk_MoveResizeWindow \ + (tkStubsPtr->tk_MoveResizeWindow) /* 127 */ +#endif +#ifndef Tk_MoveWindow +#define Tk_MoveWindow \ + (tkStubsPtr->tk_MoveWindow) /* 128 */ +#endif +#ifndef Tk_MoveToplevelWindow +#define Tk_MoveToplevelWindow \ + (tkStubsPtr->tk_MoveToplevelWindow) /* 129 */ +#endif +#ifndef Tk_NameOf3DBorder +#define Tk_NameOf3DBorder \ + (tkStubsPtr->tk_NameOf3DBorder) /* 130 */ +#endif +#ifndef Tk_NameOfAnchor +#define Tk_NameOfAnchor \ + (tkStubsPtr->tk_NameOfAnchor) /* 131 */ +#endif +#ifndef Tk_NameOfBitmap +#define Tk_NameOfBitmap \ + (tkStubsPtr->tk_NameOfBitmap) /* 132 */ +#endif +#ifndef Tk_NameOfCapStyle +#define Tk_NameOfCapStyle \ + (tkStubsPtr->tk_NameOfCapStyle) /* 133 */ +#endif +#ifndef Tk_NameOfColor +#define Tk_NameOfColor \ + (tkStubsPtr->tk_NameOfColor) /* 134 */ +#endif +#ifndef Tk_NameOfCursor +#define Tk_NameOfCursor \ + (tkStubsPtr->tk_NameOfCursor) /* 135 */ +#endif +#ifndef Tk_NameOfFont +#define Tk_NameOfFont \ + (tkStubsPtr->tk_NameOfFont) /* 136 */ +#endif +#ifndef Tk_NameOfImage +#define Tk_NameOfImage \ + (tkStubsPtr->tk_NameOfImage) /* 137 */ +#endif +#ifndef Tk_NameOfJoinStyle +#define Tk_NameOfJoinStyle \ + (tkStubsPtr->tk_NameOfJoinStyle) /* 138 */ +#endif +#ifndef Tk_NameOfJustify +#define Tk_NameOfJustify \ + (tkStubsPtr->tk_NameOfJustify) /* 139 */ +#endif +#ifndef Tk_NameOfRelief +#define Tk_NameOfRelief \ + (tkStubsPtr->tk_NameOfRelief) /* 140 */ +#endif +#ifndef Tk_NameToWindow +#define Tk_NameToWindow \ + (tkStubsPtr->tk_NameToWindow) /* 141 */ +#endif +#ifndef Tk_OwnSelection +#define Tk_OwnSelection \ + (tkStubsPtr->tk_OwnSelection) /* 142 */ +#endif +#ifndef Tk_ParseArgv +#define Tk_ParseArgv \ + (tkStubsPtr->tk_ParseArgv) /* 143 */ +#endif +#ifndef Tk_PhotoPutBlock_NoComposite +#define Tk_PhotoPutBlock_NoComposite \ + (tkStubsPtr->tk_PhotoPutBlock_NoComposite) /* 144 */ +#endif +#ifndef Tk_PhotoPutZoomedBlock_NoComposite +#define Tk_PhotoPutZoomedBlock_NoComposite \ + (tkStubsPtr->tk_PhotoPutZoomedBlock_NoComposite) /* 145 */ +#endif +#ifndef Tk_PhotoGetImage +#define Tk_PhotoGetImage \ + (tkStubsPtr->tk_PhotoGetImage) /* 146 */ +#endif +#ifndef Tk_PhotoBlank +#define Tk_PhotoBlank \ + (tkStubsPtr->tk_PhotoBlank) /* 147 */ +#endif +#ifndef Tk_PhotoExpand +#define Tk_PhotoExpand \ + (tkStubsPtr->tk_PhotoExpand) /* 148 */ +#endif +#ifndef Tk_PhotoGetSize +#define Tk_PhotoGetSize \ + (tkStubsPtr->tk_PhotoGetSize) /* 149 */ +#endif +#ifndef Tk_PhotoSetSize +#define Tk_PhotoSetSize \ + (tkStubsPtr->tk_PhotoSetSize) /* 150 */ +#endif +#ifndef Tk_PointToChar +#define Tk_PointToChar \ + (tkStubsPtr->tk_PointToChar) /* 151 */ +#endif +#ifndef Tk_PostscriptFontName +#define Tk_PostscriptFontName \ + (tkStubsPtr->tk_PostscriptFontName) /* 152 */ +#endif +#ifndef Tk_PreserveColormap +#define Tk_PreserveColormap \ + (tkStubsPtr->tk_PreserveColormap) /* 153 */ +#endif +#ifndef Tk_QueueWindowEvent +#define Tk_QueueWindowEvent \ + (tkStubsPtr->tk_QueueWindowEvent) /* 154 */ +#endif +#ifndef Tk_RedrawImage +#define Tk_RedrawImage \ + (tkStubsPtr->tk_RedrawImage) /* 155 */ +#endif +#ifndef Tk_ResizeWindow +#define Tk_ResizeWindow \ + (tkStubsPtr->tk_ResizeWindow) /* 156 */ +#endif +#ifndef Tk_RestackWindow +#define Tk_RestackWindow \ + (tkStubsPtr->tk_RestackWindow) /* 157 */ +#endif +#ifndef Tk_RestrictEvents +#define Tk_RestrictEvents \ + (tkStubsPtr->tk_RestrictEvents) /* 158 */ +#endif +#ifndef Tk_SafeInit +#define Tk_SafeInit \ + (tkStubsPtr->tk_SafeInit) /* 159 */ +#endif +#ifndef Tk_SetAppName +#define Tk_SetAppName \ + (tkStubsPtr->tk_SetAppName) /* 160 */ +#endif +#ifndef Tk_SetBackgroundFromBorder +#define Tk_SetBackgroundFromBorder \ + (tkStubsPtr->tk_SetBackgroundFromBorder) /* 161 */ +#endif +#ifndef Tk_SetClass +#define Tk_SetClass \ + (tkStubsPtr->tk_SetClass) /* 162 */ +#endif +#ifndef Tk_SetGrid +#define Tk_SetGrid \ + (tkStubsPtr->tk_SetGrid) /* 163 */ +#endif +#ifndef Tk_SetInternalBorder +#define Tk_SetInternalBorder \ + (tkStubsPtr->tk_SetInternalBorder) /* 164 */ +#endif +#ifndef Tk_SetWindowBackground +#define Tk_SetWindowBackground \ + (tkStubsPtr->tk_SetWindowBackground) /* 165 */ +#endif +#ifndef Tk_SetWindowBackgroundPixmap +#define Tk_SetWindowBackgroundPixmap \ + (tkStubsPtr->tk_SetWindowBackgroundPixmap) /* 166 */ +#endif +#ifndef Tk_SetWindowBorder +#define Tk_SetWindowBorder \ + (tkStubsPtr->tk_SetWindowBorder) /* 167 */ +#endif +#ifndef Tk_SetWindowBorderWidth +#define Tk_SetWindowBorderWidth \ + (tkStubsPtr->tk_SetWindowBorderWidth) /* 168 */ +#endif +#ifndef Tk_SetWindowBorderPixmap +#define Tk_SetWindowBorderPixmap \ + (tkStubsPtr->tk_SetWindowBorderPixmap) /* 169 */ +#endif +#ifndef Tk_SetWindowColormap +#define Tk_SetWindowColormap \ + (tkStubsPtr->tk_SetWindowColormap) /* 170 */ +#endif +#ifndef Tk_SetWindowVisual +#define Tk_SetWindowVisual \ + (tkStubsPtr->tk_SetWindowVisual) /* 171 */ +#endif +#ifndef Tk_SizeOfBitmap +#define Tk_SizeOfBitmap \ + (tkStubsPtr->tk_SizeOfBitmap) /* 172 */ +#endif +#ifndef Tk_SizeOfImage +#define Tk_SizeOfImage \ + (tkStubsPtr->tk_SizeOfImage) /* 173 */ +#endif +#ifndef Tk_StrictMotif +#define Tk_StrictMotif \ + (tkStubsPtr->tk_StrictMotif) /* 174 */ +#endif +#ifndef Tk_TextLayoutToPostscript +#define Tk_TextLayoutToPostscript \ + (tkStubsPtr->tk_TextLayoutToPostscript) /* 175 */ +#endif +#ifndef Tk_TextWidth +#define Tk_TextWidth \ + (tkStubsPtr->tk_TextWidth) /* 176 */ +#endif +#ifndef Tk_UndefineCursor +#define Tk_UndefineCursor \ + (tkStubsPtr->tk_UndefineCursor) /* 177 */ +#endif +#ifndef Tk_UnderlineChars +#define Tk_UnderlineChars \ + (tkStubsPtr->tk_UnderlineChars) /* 178 */ +#endif +#ifndef Tk_UnderlineTextLayout +#define Tk_UnderlineTextLayout \ + (tkStubsPtr->tk_UnderlineTextLayout) /* 179 */ +#endif +#ifndef Tk_Ungrab +#define Tk_Ungrab \ + (tkStubsPtr->tk_Ungrab) /* 180 */ +#endif +#ifndef Tk_UnmaintainGeometry +#define Tk_UnmaintainGeometry \ + (tkStubsPtr->tk_UnmaintainGeometry) /* 181 */ +#endif +#ifndef Tk_UnmapWindow +#define Tk_UnmapWindow \ + (tkStubsPtr->tk_UnmapWindow) /* 182 */ +#endif +#ifndef Tk_UnsetGrid +#define Tk_UnsetGrid \ + (tkStubsPtr->tk_UnsetGrid) /* 183 */ +#endif +#ifndef Tk_UpdatePointer +#define Tk_UpdatePointer \ + (tkStubsPtr->tk_UpdatePointer) /* 184 */ +#endif +#ifndef Tk_AllocBitmapFromObj +#define Tk_AllocBitmapFromObj \ + (tkStubsPtr->tk_AllocBitmapFromObj) /* 185 */ +#endif +#ifndef Tk_Alloc3DBorderFromObj +#define Tk_Alloc3DBorderFromObj \ + (tkStubsPtr->tk_Alloc3DBorderFromObj) /* 186 */ +#endif +#ifndef Tk_AllocColorFromObj +#define Tk_AllocColorFromObj \ + (tkStubsPtr->tk_AllocColorFromObj) /* 187 */ +#endif +#ifndef Tk_AllocCursorFromObj +#define Tk_AllocCursorFromObj \ + (tkStubsPtr->tk_AllocCursorFromObj) /* 188 */ +#endif +#ifndef Tk_AllocFontFromObj +#define Tk_AllocFontFromObj \ + (tkStubsPtr->tk_AllocFontFromObj) /* 189 */ +#endif +#ifndef Tk_CreateOptionTable +#define Tk_CreateOptionTable \ + (tkStubsPtr->tk_CreateOptionTable) /* 190 */ +#endif +#ifndef Tk_DeleteOptionTable +#define Tk_DeleteOptionTable \ + (tkStubsPtr->tk_DeleteOptionTable) /* 191 */ +#endif +#ifndef Tk_Free3DBorderFromObj +#define Tk_Free3DBorderFromObj \ + (tkStubsPtr->tk_Free3DBorderFromObj) /* 192 */ +#endif +#ifndef Tk_FreeBitmapFromObj +#define Tk_FreeBitmapFromObj \ + (tkStubsPtr->tk_FreeBitmapFromObj) /* 193 */ +#endif +#ifndef Tk_FreeColorFromObj +#define Tk_FreeColorFromObj \ + (tkStubsPtr->tk_FreeColorFromObj) /* 194 */ +#endif +#ifndef Tk_FreeConfigOptions +#define Tk_FreeConfigOptions \ + (tkStubsPtr->tk_FreeConfigOptions) /* 195 */ +#endif +#ifndef Tk_FreeSavedOptions +#define Tk_FreeSavedOptions \ + (tkStubsPtr->tk_FreeSavedOptions) /* 196 */ +#endif +#ifndef Tk_FreeCursorFromObj +#define Tk_FreeCursorFromObj \ + (tkStubsPtr->tk_FreeCursorFromObj) /* 197 */ +#endif +#ifndef Tk_FreeFontFromObj +#define Tk_FreeFontFromObj \ + (tkStubsPtr->tk_FreeFontFromObj) /* 198 */ +#endif +#ifndef Tk_Get3DBorderFromObj +#define Tk_Get3DBorderFromObj \ + (tkStubsPtr->tk_Get3DBorderFromObj) /* 199 */ +#endif +#ifndef Tk_GetAnchorFromObj +#define Tk_GetAnchorFromObj \ + (tkStubsPtr->tk_GetAnchorFromObj) /* 200 */ +#endif +#ifndef Tk_GetBitmapFromObj +#define Tk_GetBitmapFromObj \ + (tkStubsPtr->tk_GetBitmapFromObj) /* 201 */ +#endif +#ifndef Tk_GetColorFromObj +#define Tk_GetColorFromObj \ + (tkStubsPtr->tk_GetColorFromObj) /* 202 */ +#endif +#ifndef Tk_GetCursorFromObj +#define Tk_GetCursorFromObj \ + (tkStubsPtr->tk_GetCursorFromObj) /* 203 */ +#endif +#ifndef Tk_GetOptionInfo +#define Tk_GetOptionInfo \ + (tkStubsPtr->tk_GetOptionInfo) /* 204 */ +#endif +#ifndef Tk_GetOptionValue +#define Tk_GetOptionValue \ + (tkStubsPtr->tk_GetOptionValue) /* 205 */ +#endif +#ifndef Tk_GetJustifyFromObj +#define Tk_GetJustifyFromObj \ + (tkStubsPtr->tk_GetJustifyFromObj) /* 206 */ +#endif +#ifndef Tk_GetMMFromObj +#define Tk_GetMMFromObj \ + (tkStubsPtr->tk_GetMMFromObj) /* 207 */ +#endif +#ifndef Tk_GetPixelsFromObj +#define Tk_GetPixelsFromObj \ + (tkStubsPtr->tk_GetPixelsFromObj) /* 208 */ +#endif +#ifndef Tk_GetReliefFromObj +#define Tk_GetReliefFromObj \ + (tkStubsPtr->tk_GetReliefFromObj) /* 209 */ +#endif +#ifndef Tk_GetScrollInfoObj +#define Tk_GetScrollInfoObj \ + (tkStubsPtr->tk_GetScrollInfoObj) /* 210 */ +#endif +#ifndef Tk_InitOptions +#define Tk_InitOptions \ + (tkStubsPtr->tk_InitOptions) /* 211 */ +#endif +#ifndef Tk_MainEx +#define Tk_MainEx \ + (tkStubsPtr->tk_MainEx) /* 212 */ +#endif +#ifndef Tk_RestoreSavedOptions +#define Tk_RestoreSavedOptions \ + (tkStubsPtr->tk_RestoreSavedOptions) /* 213 */ +#endif +#ifndef Tk_SetOptions +#define Tk_SetOptions \ + (tkStubsPtr->tk_SetOptions) /* 214 */ +#endif +#ifndef Tk_InitConsoleChannels +#define Tk_InitConsoleChannels \ + (tkStubsPtr->tk_InitConsoleChannels) /* 215 */ +#endif +#ifndef Tk_CreateConsoleWindow +#define Tk_CreateConsoleWindow \ + (tkStubsPtr->tk_CreateConsoleWindow) /* 216 */ +#endif +#ifndef Tk_CreateSmoothMethod +#define Tk_CreateSmoothMethod \ + (tkStubsPtr->tk_CreateSmoothMethod) /* 217 */ +#endif +/* Slot 218 is reserved */ +/* Slot 219 is reserved */ +#ifndef Tk_GetDash +#define Tk_GetDash \ + (tkStubsPtr->tk_GetDash) /* 220 */ +#endif +#ifndef Tk_CreateOutline +#define Tk_CreateOutline \ + (tkStubsPtr->tk_CreateOutline) /* 221 */ +#endif +#ifndef Tk_DeleteOutline +#define Tk_DeleteOutline \ + (tkStubsPtr->tk_DeleteOutline) /* 222 */ +#endif +#ifndef Tk_ConfigOutlineGC +#define Tk_ConfigOutlineGC \ + (tkStubsPtr->tk_ConfigOutlineGC) /* 223 */ +#endif +#ifndef Tk_ChangeOutlineGC +#define Tk_ChangeOutlineGC \ + (tkStubsPtr->tk_ChangeOutlineGC) /* 224 */ +#endif +#ifndef Tk_ResetOutlineGC +#define Tk_ResetOutlineGC \ + (tkStubsPtr->tk_ResetOutlineGC) /* 225 */ +#endif +#ifndef Tk_CanvasPsOutline +#define Tk_CanvasPsOutline \ + (tkStubsPtr->tk_CanvasPsOutline) /* 226 */ +#endif +#ifndef Tk_SetTSOrigin +#define Tk_SetTSOrigin \ + (tkStubsPtr->tk_SetTSOrigin) /* 227 */ +#endif +#ifndef Tk_CanvasGetCoordFromObj +#define Tk_CanvasGetCoordFromObj \ + (tkStubsPtr->tk_CanvasGetCoordFromObj) /* 228 */ +#endif +#ifndef Tk_CanvasSetOffset +#define Tk_CanvasSetOffset \ + (tkStubsPtr->tk_CanvasSetOffset) /* 229 */ +#endif +#ifndef Tk_DitherPhoto +#define Tk_DitherPhoto \ + (tkStubsPtr->tk_DitherPhoto) /* 230 */ +#endif +#ifndef Tk_PostscriptBitmap +#define Tk_PostscriptBitmap \ + (tkStubsPtr->tk_PostscriptBitmap) /* 231 */ +#endif +#ifndef Tk_PostscriptColor +#define Tk_PostscriptColor \ + (tkStubsPtr->tk_PostscriptColor) /* 232 */ +#endif +#ifndef Tk_PostscriptFont +#define Tk_PostscriptFont \ + (tkStubsPtr->tk_PostscriptFont) /* 233 */ +#endif +#ifndef Tk_PostscriptImage +#define Tk_PostscriptImage \ + (tkStubsPtr->tk_PostscriptImage) /* 234 */ +#endif +#ifndef Tk_PostscriptPath +#define Tk_PostscriptPath \ + (tkStubsPtr->tk_PostscriptPath) /* 235 */ +#endif +#ifndef Tk_PostscriptStipple +#define Tk_PostscriptStipple \ + (tkStubsPtr->tk_PostscriptStipple) /* 236 */ +#endif +#ifndef Tk_PostscriptY +#define Tk_PostscriptY \ + (tkStubsPtr->tk_PostscriptY) /* 237 */ +#endif +#ifndef Tk_PostscriptPhoto +#define Tk_PostscriptPhoto \ + (tkStubsPtr->tk_PostscriptPhoto) /* 238 */ +#endif +#ifndef Tk_CreateClientMessageHandler +#define Tk_CreateClientMessageHandler \ + (tkStubsPtr->tk_CreateClientMessageHandler) /* 239 */ +#endif +#ifndef Tk_DeleteClientMessageHandler +#define Tk_DeleteClientMessageHandler \ + (tkStubsPtr->tk_DeleteClientMessageHandler) /* 240 */ +#endif +#ifndef Tk_CreateAnonymousWindow +#define Tk_CreateAnonymousWindow \ + (tkStubsPtr->tk_CreateAnonymousWindow) /* 241 */ +#endif +#ifndef Tk_SetClassProcs +#define Tk_SetClassProcs \ + (tkStubsPtr->tk_SetClassProcs) /* 242 */ +#endif +#ifndef Tk_SetInternalBorderEx +#define Tk_SetInternalBorderEx \ + (tkStubsPtr->tk_SetInternalBorderEx) /* 243 */ +#endif +#ifndef Tk_SetMinimumRequestSize +#define Tk_SetMinimumRequestSize \ + (tkStubsPtr->tk_SetMinimumRequestSize) /* 244 */ +#endif +#ifndef Tk_SetCaretPos +#define Tk_SetCaretPos \ + (tkStubsPtr->tk_SetCaretPos) /* 245 */ +#endif +#ifndef Tk_PhotoPutBlock +#define Tk_PhotoPutBlock \ + (tkStubsPtr->tk_PhotoPutBlock) /* 246 */ +#endif +#ifndef Tk_PhotoPutZoomedBlock +#define Tk_PhotoPutZoomedBlock \ + (tkStubsPtr->tk_PhotoPutZoomedBlock) /* 247 */ +#endif +#ifndef Tk_CollapseMotionEvents +#define Tk_CollapseMotionEvents \ + (tkStubsPtr->tk_CollapseMotionEvents) /* 248 */ +#endif +#ifndef Tk_RegisterStyleEngine +#define Tk_RegisterStyleEngine \ + (tkStubsPtr->tk_RegisterStyleEngine) /* 249 */ +#endif +#ifndef Tk_GetStyleEngine +#define Tk_GetStyleEngine \ + (tkStubsPtr->tk_GetStyleEngine) /* 250 */ +#endif +#ifndef Tk_RegisterStyledElement +#define Tk_RegisterStyledElement \ + (tkStubsPtr->tk_RegisterStyledElement) /* 251 */ +#endif +#ifndef Tk_GetElementId +#define Tk_GetElementId \ + (tkStubsPtr->tk_GetElementId) /* 252 */ +#endif +#ifndef Tk_CreateStyle +#define Tk_CreateStyle \ + (tkStubsPtr->tk_CreateStyle) /* 253 */ +#endif +#ifndef Tk_GetStyle +#define Tk_GetStyle \ + (tkStubsPtr->tk_GetStyle) /* 254 */ +#endif +#ifndef Tk_FreeStyle +#define Tk_FreeStyle \ + (tkStubsPtr->tk_FreeStyle) /* 255 */ +#endif +#ifndef Tk_NameOfStyle +#define Tk_NameOfStyle \ + (tkStubsPtr->tk_NameOfStyle) /* 256 */ +#endif +#ifndef Tk_AllocStyleFromObj +#define Tk_AllocStyleFromObj \ + (tkStubsPtr->tk_AllocStyleFromObj) /* 257 */ +#endif +#ifndef Tk_GetStyleFromObj +#define Tk_GetStyleFromObj \ + (tkStubsPtr->tk_GetStyleFromObj) /* 258 */ +#endif +#ifndef Tk_FreeStyleFromObj +#define Tk_FreeStyleFromObj \ + (tkStubsPtr->tk_FreeStyleFromObj) /* 259 */ +#endif +#ifndef Tk_GetStyledElement +#define Tk_GetStyledElement \ + (tkStubsPtr->tk_GetStyledElement) /* 260 */ +#endif +#ifndef Tk_GetElementSize +#define Tk_GetElementSize \ + (tkStubsPtr->tk_GetElementSize) /* 261 */ +#endif +#ifndef Tk_GetElementBox +#define Tk_GetElementBox \ + (tkStubsPtr->tk_GetElementBox) /* 262 */ +#endif +#ifndef Tk_GetElementBorderWidth +#define Tk_GetElementBorderWidth \ + (tkStubsPtr->tk_GetElementBorderWidth) /* 263 */ +#endif +#ifndef Tk_DrawElement +#define Tk_DrawElement \ + (tkStubsPtr->tk_DrawElement) /* 264 */ +#endif +/* Slot 265 is reserved */ +/* Slot 266 is reserved */ +/* Slot 267 is reserved */ +/* Slot 268 is reserved */ +/* Slot 269 is reserved */ +/* Slot 270 is reserved */ +/* Slot 271 is reserved */ +/* Slot 272 is reserved */ +/* Slot 273 is reserved */ +/* Slot 274 is reserved */ +#ifndef TkUnusedStubEntry +#define TkUnusedStubEntry \ + (tkStubsPtr->tkUnusedStubEntry) /* 275 */ +#endif + +#endif /* defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) */ + +/* !END!: Do not edit above this line. */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#undef TkUnusedStubEntry + +#endif /* _TKDECLS */ + diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tkPlatDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tkPlatDecls.h new file mode 100644 index 00000000..509b4f55 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.4/tkPlatDecls.h @@ -0,0 +1,205 @@ +/* + * tkPlatDecls.h -- + * + * Declarations of functions in the platform-specific public Tcl API. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TKPLATDECLS +#define _TKPLATDECLS + +#ifdef BUILD_tk +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLEXPORT +#endif + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tk.decls script. + */ + +/* !BEGIN!: Do not edit below this line. */ + +/* + * Exported function declarations: + */ + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ +/* 0 */ +EXTERN Window Tk_AttachHWND _ANSI_ARGS_((Tk_Window tkwin, + HWND hwnd)); +/* 1 */ +EXTERN HINSTANCE Tk_GetHINSTANCE _ANSI_ARGS_((void)); +/* 2 */ +EXTERN HWND Tk_GetHWND _ANSI_ARGS_((Window window)); +/* 3 */ +EXTERN Tk_Window Tk_HWNDToWindow _ANSI_ARGS_((HWND hwnd)); +/* 4 */ +EXTERN void Tk_PointerEvent _ANSI_ARGS_((HWND hwnd, int x, int y)); +/* 5 */ +EXTERN int Tk_TranslateWinEvent _ANSI_ARGS_((HWND hwnd, + UINT message, WPARAM wParam, LPARAM lParam, + LRESULT *result)); +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ +/* 0 */ +EXTERN void Tk_MacOSXSetEmbedHandler _ANSI_ARGS_(( + Tk_MacOSXEmbedRegisterWinProc *registerWinProcPtr, + Tk_MacOSXEmbedGetGrafPortProc *getPortProcPtr, + Tk_MacOSXEmbedMakeContainerExistProc *containerExistProcPtr, + Tk_MacOSXEmbedGetClipProc *getClipProc, + Tk_MacOSXEmbedGetOffsetInParentProc *getOffsetProc)); +/* 1 */ +EXTERN void Tk_MacOSXTurnOffMenus _ANSI_ARGS_((void)); +/* 2 */ +EXTERN void Tk_MacOSXTkOwnsCursor _ANSI_ARGS_((int tkOwnsIt)); +/* 3 */ +EXTERN void TkMacOSXInitMenus _ANSI_ARGS_((Tcl_Interp *interp)); +/* 4 */ +EXTERN void TkMacOSXInitAppleEvents _ANSI_ARGS_(( + Tcl_Interp *interp)); +/* 5 */ +EXTERN void TkGenWMConfigureEvent _ANSI_ARGS_((Tk_Window tkwin, + int x, int y, int width, int height, + int flags)); +/* 6 */ +EXTERN void TkMacOSXInvalClipRgns _ANSI_ARGS_((Tk_Window tkwin)); +/* 7 */ +EXTERN GWorldPtr TkMacOSXGetDrawablePort _ANSI_ARGS_(( + Drawable drawable)); +/* 8 */ +EXTERN ControlRef TkMacOSXGetRootControl _ANSI_ARGS_(( + Drawable drawable)); +/* 9 */ +EXTERN void Tk_MacOSXSetupTkNotifier _ANSI_ARGS_((void)); +/* 10 */ +EXTERN int Tk_MacOSXIsAppInFront _ANSI_ARGS_((void)); +#endif /* AQUA */ + +typedef struct TkPlatStubs { + int magic; + struct TkPlatStubHooks *hooks; + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ + Window (*tk_AttachHWND) _ANSI_ARGS_((Tk_Window tkwin, HWND hwnd)); /* 0 */ + HINSTANCE (*tk_GetHINSTANCE) _ANSI_ARGS_((void)); /* 1 */ + HWND (*tk_GetHWND) _ANSI_ARGS_((Window window)); /* 2 */ + Tk_Window (*tk_HWNDToWindow) _ANSI_ARGS_((HWND hwnd)); /* 3 */ + void (*tk_PointerEvent) _ANSI_ARGS_((HWND hwnd, int x, int y)); /* 4 */ + int (*tk_TranslateWinEvent) _ANSI_ARGS_((HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT *result)); /* 5 */ +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ + void (*tk_MacOSXSetEmbedHandler) _ANSI_ARGS_((Tk_MacOSXEmbedRegisterWinProc *registerWinProcPtr, Tk_MacOSXEmbedGetGrafPortProc *getPortProcPtr, Tk_MacOSXEmbedMakeContainerExistProc *containerExistProcPtr, Tk_MacOSXEmbedGetClipProc *getClipProc, Tk_MacOSXEmbedGetOffsetInParentProc *getOffsetProc)); /* 0 */ + void (*tk_MacOSXTurnOffMenus) _ANSI_ARGS_((void)); /* 1 */ + void (*tk_MacOSXTkOwnsCursor) _ANSI_ARGS_((int tkOwnsIt)); /* 2 */ + void (*tkMacOSXInitMenus) _ANSI_ARGS_((Tcl_Interp *interp)); /* 3 */ + void (*tkMacOSXInitAppleEvents) _ANSI_ARGS_((Tcl_Interp *interp)); /* 4 */ + void (*tkGenWMConfigureEvent) _ANSI_ARGS_((Tk_Window tkwin, int x, int y, int width, int height, int flags)); /* 5 */ + void (*tkMacOSXInvalClipRgns) _ANSI_ARGS_((Tk_Window tkwin)); /* 6 */ + GWorldPtr (*tkMacOSXGetDrawablePort) _ANSI_ARGS_((Drawable drawable)); /* 7 */ + ControlRef (*tkMacOSXGetRootControl) _ANSI_ARGS_((Drawable drawable)); /* 8 */ + void (*tk_MacOSXSetupTkNotifier) _ANSI_ARGS_((void)); /* 9 */ + int (*tk_MacOSXIsAppInFront) _ANSI_ARGS_((void)); /* 10 */ +#endif /* AQUA */ +} TkPlatStubs; + +#ifdef __cplusplus +extern "C" { +#endif +extern TkPlatStubs *tkPlatStubsPtr; +#ifdef __cplusplus +} +#endif + +#if defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) + +/* + * Inline function declarations: + */ + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ +#ifndef Tk_AttachHWND +#define Tk_AttachHWND \ + (tkPlatStubsPtr->tk_AttachHWND) /* 0 */ +#endif +#ifndef Tk_GetHINSTANCE +#define Tk_GetHINSTANCE \ + (tkPlatStubsPtr->tk_GetHINSTANCE) /* 1 */ +#endif +#ifndef Tk_GetHWND +#define Tk_GetHWND \ + (tkPlatStubsPtr->tk_GetHWND) /* 2 */ +#endif +#ifndef Tk_HWNDToWindow +#define Tk_HWNDToWindow \ + (tkPlatStubsPtr->tk_HWNDToWindow) /* 3 */ +#endif +#ifndef Tk_PointerEvent +#define Tk_PointerEvent \ + (tkPlatStubsPtr->tk_PointerEvent) /* 4 */ +#endif +#ifndef Tk_TranslateWinEvent +#define Tk_TranslateWinEvent \ + (tkPlatStubsPtr->tk_TranslateWinEvent) /* 5 */ +#endif +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ +#ifndef Tk_MacOSXSetEmbedHandler +#define Tk_MacOSXSetEmbedHandler \ + (tkPlatStubsPtr->tk_MacOSXSetEmbedHandler) /* 0 */ +#endif +#ifndef Tk_MacOSXTurnOffMenus +#define Tk_MacOSXTurnOffMenus \ + (tkPlatStubsPtr->tk_MacOSXTurnOffMenus) /* 1 */ +#endif +#ifndef Tk_MacOSXTkOwnsCursor +#define Tk_MacOSXTkOwnsCursor \ + (tkPlatStubsPtr->tk_MacOSXTkOwnsCursor) /* 2 */ +#endif +#ifndef TkMacOSXInitMenus +#define TkMacOSXInitMenus \ + (tkPlatStubsPtr->tkMacOSXInitMenus) /* 3 */ +#endif +#ifndef TkMacOSXInitAppleEvents +#define TkMacOSXInitAppleEvents \ + (tkPlatStubsPtr->tkMacOSXInitAppleEvents) /* 4 */ +#endif +#ifndef TkGenWMConfigureEvent +#define TkGenWMConfigureEvent \ + (tkPlatStubsPtr->tkGenWMConfigureEvent) /* 5 */ +#endif +#ifndef TkMacOSXInvalClipRgns +#define TkMacOSXInvalClipRgns \ + (tkPlatStubsPtr->tkMacOSXInvalClipRgns) /* 6 */ +#endif +#ifndef TkMacOSXGetDrawablePort +#define TkMacOSXGetDrawablePort \ + (tkPlatStubsPtr->tkMacOSXGetDrawablePort) /* 7 */ +#endif +#ifndef TkMacOSXGetRootControl +#define TkMacOSXGetRootControl \ + (tkPlatStubsPtr->tkMacOSXGetRootControl) /* 8 */ +#endif +#ifndef Tk_MacOSXSetupTkNotifier +#define Tk_MacOSXSetupTkNotifier \ + (tkPlatStubsPtr->tk_MacOSXSetupTkNotifier) /* 9 */ +#endif +#ifndef Tk_MacOSXIsAppInFront +#define Tk_MacOSXIsAppInFront \ + (tkPlatStubsPtr->tk_MacOSXIsAppInFront) /* 10 */ +#endif +#endif /* AQUA */ + +#endif /* defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) */ + +/* !END!: Do not edit above this line. */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#endif /* _TKPLATDECLS */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/X.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/X.h new file mode 100644 index 00000000..daf22830 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/X.h @@ -0,0 +1,677 @@ +/* + * $XConsortium: X.h,v 1.66 88/09/06 15:55:56 jim Exp $ + */ + +/* Definitions for the X window system likely to be used by applications */ + +#ifndef X_H +#define X_H + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ +#define X_PROTOCOL 11 /* current protocol version */ +#define X_PROTOCOL_REVISION 0 /* current minor version */ + +#if defined(MAC_OSX_TK) +# define Cursor XCursor +# define Region XRegion +#endif + +/* Resources */ + +#ifdef _WIN64 +typedef __int64 XID; +#else +typedef unsigned long XID; +#endif + +typedef XID Window; +typedef XID Drawable; +typedef XID Font; +typedef XID Pixmap; +typedef XID Cursor; +typedef XID Colormap; +typedef XID GContext; +typedef XID KeySym; + +typedef unsigned long Mask; + +typedef unsigned long Atom; + +typedef unsigned long VisualID; + +typedef unsigned long Time; + +typedef unsigned long KeyCode; /* In order to use IME, the Macintosh needs + * to pack 3 bytes into the keyCode field in + * the XEvent. In the real X.h, a KeyCode is + * defined as a short, which wouldn't be big + * enough. */ + +/***************************************************************** + * RESERVED RESOURCE AND CONSTANT DEFINITIONS + *****************************************************************/ + +#define None 0L /* universal null resource or null atom */ + +#define ParentRelative 1L /* background pixmap in CreateWindow + and ChangeWindowAttributes */ + +#define CopyFromParent 0L /* border pixmap in CreateWindow + and ChangeWindowAttributes + special VisualID and special window + class passed to CreateWindow */ + +#define PointerWindow 0L /* destination window in SendEvent */ +#define InputFocus 1L /* destination window in SendEvent */ + +#define PointerRoot 1L /* focus window in SetInputFocus */ + +#define AnyPropertyType 0L /* special Atom, passed to GetProperty */ + +#define AnyKey 0L /* special Key Code, passed to GrabKey */ + +#define AnyButton 0L /* special Button Code, passed to GrabButton */ + +#define AllTemporary 0L /* special Resource ID passed to KillClient */ + +#define CurrentTime 0L /* special Time */ + +#define NoSymbol 0L /* special KeySym */ + +/***************************************************************** + * EVENT DEFINITIONS + *****************************************************************/ + +/* Input Event Masks. Used as event-mask window attribute and as arguments + to Grab requests. Not to be confused with event names. */ + +#define NoEventMask 0L +#define KeyPressMask (1L<<0) +#define KeyReleaseMask (1L<<1) +#define ButtonPressMask (1L<<2) +#define ButtonReleaseMask (1L<<3) +#define EnterWindowMask (1L<<4) +#define LeaveWindowMask (1L<<5) +#define PointerMotionMask (1L<<6) +#define PointerMotionHintMask (1L<<7) +#define Button1MotionMask (1L<<8) +#define Button2MotionMask (1L<<9) +#define Button3MotionMask (1L<<10) +#define Button4MotionMask (1L<<11) +#define Button5MotionMask (1L<<12) +#define ButtonMotionMask (1L<<13) +#define KeymapStateMask (1L<<14) +#define ExposureMask (1L<<15) +#define VisibilityChangeMask (1L<<16) +#define StructureNotifyMask (1L<<17) +#define ResizeRedirectMask (1L<<18) +#define SubstructureNotifyMask (1L<<19) +#define SubstructureRedirectMask (1L<<20) +#define FocusChangeMask (1L<<21) +#define PropertyChangeMask (1L<<22) +#define ColormapChangeMask (1L<<23) +#define OwnerGrabButtonMask (1L<<24) + +/* Event names. Used in "type" field in XEvent structures. Not to be +confused with event masks above. They start from 2 because 0 and 1 +are reserved in the protocol for errors and replies. */ + +#define KeyPress 2 +#define KeyRelease 3 +#define ButtonPress 4 +#define ButtonRelease 5 +#define MotionNotify 6 +#define EnterNotify 7 +#define LeaveNotify 8 +#define FocusIn 9 +#define FocusOut 10 +#define KeymapNotify 11 +#define Expose 12 +#define GraphicsExpose 13 +#define NoExpose 14 +#define VisibilityNotify 15 +#define CreateNotify 16 +#define DestroyNotify 17 +#define UnmapNotify 18 +#define MapNotify 19 +#define MapRequest 20 +#define ReparentNotify 21 +#define ConfigureNotify 22 +#define ConfigureRequest 23 +#define GravityNotify 24 +#define ResizeRequest 25 +#define CirculateNotify 26 +#define CirculateRequest 27 +#define PropertyNotify 28 +#define SelectionClear 29 +#define SelectionRequest 30 +#define SelectionNotify 31 +#define ColormapNotify 32 +#define ClientMessage 33 +#define MappingNotify 34 +#define LASTEvent 35 /* must be bigger than any event # */ + + +/* Key masks. Used as modifiers to GrabButton and GrabKey, results of QueryPointer, + state in various key-, mouse-, and button-related events. */ + +#define ShiftMask (1<<0) +#define LockMask (1<<1) +#define ControlMask (1<<2) +#define Mod1Mask (1<<3) +#define Mod2Mask (1<<4) +#define Mod3Mask (1<<5) +#define Mod4Mask (1<<6) +#define Mod5Mask (1<<7) + +/* modifier names. Used to build a SetModifierMapping request or + to read a GetModifierMapping request. These correspond to the + masks defined above. */ +#define ShiftMapIndex 0 +#define LockMapIndex 1 +#define ControlMapIndex 2 +#define Mod1MapIndex 3 +#define Mod2MapIndex 4 +#define Mod3MapIndex 5 +#define Mod4MapIndex 6 +#define Mod5MapIndex 7 + + +/* button masks. Used in same manner as Key masks above. Not to be confused + with button names below. */ + +#define Button1Mask (1<<8) +#define Button2Mask (1<<9) +#define Button3Mask (1<<10) +#define Button4Mask (1<<11) +#define Button5Mask (1<<12) + +#define AnyModifier (1<<15) /* used in GrabButton, GrabKey */ + + +/* button names. Used as arguments to GrabButton and as detail in ButtonPress + and ButtonRelease events. Not to be confused with button masks above. + Note that 0 is already defined above as "AnyButton". */ + +#define Button1 1 +#define Button2 2 +#define Button3 3 +#define Button4 4 +#define Button5 5 + +/* Notify modes */ + +#define NotifyNormal 0 +#define NotifyGrab 1 +#define NotifyUngrab 2 +#define NotifyWhileGrabbed 3 + +#define NotifyHint 1 /* for MotionNotify events */ + +/* Notify detail */ + +#define NotifyAncestor 0 +#define NotifyVirtual 1 +#define NotifyInferior 2 +#define NotifyNonlinear 3 +#define NotifyNonlinearVirtual 4 +#define NotifyPointer 5 +#define NotifyPointerRoot 6 +#define NotifyDetailNone 7 + +/* Visibility notify */ + +#define VisibilityUnobscured 0 +#define VisibilityPartiallyObscured 1 +#define VisibilityFullyObscured 2 + +/* Circulation request */ + +#define PlaceOnTop 0 +#define PlaceOnBottom 1 + +/* protocol families */ + +#define FamilyInternet 0 +#define FamilyDECnet 1 +#define FamilyChaos 2 + +/* Property notification */ + +#define PropertyNewValue 0 +#define PropertyDelete 1 + +/* Color Map notification */ + +#define ColormapUninstalled 0 +#define ColormapInstalled 1 + +/* GrabPointer, GrabButton, GrabKeyboard, GrabKey Modes */ + +#define GrabModeSync 0 +#define GrabModeAsync 1 + +/* GrabPointer, GrabKeyboard reply status */ + +#define GrabSuccess 0 +#define AlreadyGrabbed 1 +#define GrabInvalidTime 2 +#define GrabNotViewable 3 +#define GrabFrozen 4 + +/* AllowEvents modes */ + +#define AsyncPointer 0 +#define SyncPointer 1 +#define ReplayPointer 2 +#define AsyncKeyboard 3 +#define SyncKeyboard 4 +#define ReplayKeyboard 5 +#define AsyncBoth 6 +#define SyncBoth 7 + +/* Used in SetInputFocus, GetInputFocus */ + +#define RevertToNone (int)None +#define RevertToPointerRoot (int)PointerRoot +#define RevertToParent 2 + +/***************************************************************** + * ERROR CODES + *****************************************************************/ + +#define Success 0 /* everything's okay */ +#define BadRequest 1 /* bad request code */ +#define BadValue 2 /* int parameter out of range */ +#define BadWindow 3 /* parameter not a Window */ +#define BadPixmap 4 /* parameter not a Pixmap */ +#define BadAtom 5 /* parameter not an Atom */ +#define BadCursor 6 /* parameter not a Cursor */ +#define BadFont 7 /* parameter not a Font */ +#define BadMatch 8 /* parameter mismatch */ +#define BadDrawable 9 /* parameter not a Pixmap or Window */ +#define BadAccess 10 /* depending on context: + - key/button already grabbed + - attempt to free an illegal + cmap entry + - attempt to store into a read-only + color map entry. + - attempt to modify the access control + list from other than the local host. + */ +#define BadAlloc 11 /* insufficient resources */ +#define BadColor 12 /* no such colormap */ +#define BadGC 13 /* parameter not a GC */ +#define BadIDChoice 14 /* choice not in range or already used */ +#define BadName 15 /* font or color name doesn't exist */ +#define BadLength 16 /* Request length incorrect */ +#define BadImplementation 17 /* server is defective */ + +#define FirstExtensionError 128 +#define LastExtensionError 255 + +/***************************************************************** + * WINDOW DEFINITIONS + *****************************************************************/ + +/* Window classes used by CreateWindow */ +/* Note that CopyFromParent is already defined as 0 above */ + +#define InputOutput 1 +#define InputOnly 2 + +/* Window attributes for CreateWindow and ChangeWindowAttributes */ + +#define CWBackPixmap (1L<<0) +#define CWBackPixel (1L<<1) +#define CWBorderPixmap (1L<<2) +#define CWBorderPixel (1L<<3) +#define CWBitGravity (1L<<4) +#define CWWinGravity (1L<<5) +#define CWBackingStore (1L<<6) +#define CWBackingPlanes (1L<<7) +#define CWBackingPixel (1L<<8) +#define CWOverrideRedirect (1L<<9) +#define CWSaveUnder (1L<<10) +#define CWEventMask (1L<<11) +#define CWDontPropagate (1L<<12) +#define CWColormap (1L<<13) +#define CWCursor (1L<<14) + +/* ConfigureWindow structure */ + +#define CWX (1<<0) +#define CWY (1<<1) +#define CWWidth (1<<2) +#define CWHeight (1<<3) +#define CWBorderWidth (1<<4) +#define CWSibling (1<<5) +#define CWStackMode (1<<6) + + +/* Bit Gravity */ + +#define ForgetGravity 0 +#define NorthWestGravity 1 +#define NorthGravity 2 +#define NorthEastGravity 3 +#define WestGravity 4 +#define CenterGravity 5 +#define EastGravity 6 +#define SouthWestGravity 7 +#define SouthGravity 8 +#define SouthEastGravity 9 +#define StaticGravity 10 + +/* Window gravity + bit gravity above */ + +#define UnmapGravity 0 + +/* Used in CreateWindow for backing-store hint */ + +#define NotUseful 0 +#define WhenMapped 1 +#define Always 2 + +/* Used in GetWindowAttributes reply */ + +#define IsUnmapped 0 +#define IsUnviewable 1 +#define IsViewable 2 + +/* Used in ChangeSaveSet */ + +#define SetModeInsert 0 +#define SetModeDelete 1 + +/* Used in ChangeCloseDownMode */ + +#define DestroyAll 0 +#define RetainPermanent 1 +#define RetainTemporary 2 + +/* Window stacking method (in configureWindow) */ + +#define Above 0 +#define Below 1 +#define TopIf 2 +#define BottomIf 3 +#define Opposite 4 + +/* Circulation direction */ + +#define RaiseLowest 0 +#define LowerHighest 1 + +/* Property modes */ + +#define PropModeReplace 0 +#define PropModePrepend 1 +#define PropModeAppend 2 + +/***************************************************************** + * GRAPHICS DEFINITIONS + *****************************************************************/ + +/* graphics functions, as in GC.alu */ + +#define GXclear 0x0 /* 0 */ +#define GXand 0x1 /* src AND dst */ +#define GXandReverse 0x2 /* src AND NOT dst */ +#define GXcopy 0x3 /* src */ +#define GXandInverted 0x4 /* NOT src AND dst */ +#define GXnoop 0x5 /* dst */ +#define GXxor 0x6 /* src XOR dst */ +#define GXor 0x7 /* src OR dst */ +#define GXnor 0x8 /* NOT src AND NOT dst */ +#define GXequiv 0x9 /* NOT src XOR dst */ +#define GXinvert 0xa /* NOT dst */ +#define GXorReverse 0xb /* src OR NOT dst */ +#define GXcopyInverted 0xc /* NOT src */ +#define GXorInverted 0xd /* NOT src OR dst */ +#define GXnand 0xe /* NOT src OR NOT dst */ +#define GXset 0xf /* 1 */ + +/* LineStyle */ + +#define LineSolid 0 +#define LineOnOffDash 1 +#define LineDoubleDash 2 + +/* capStyle */ + +#define CapNotLast 0 +#define CapButt 1 +#define CapRound 2 +#define CapProjecting 3 + +/* joinStyle */ + +#define JoinMiter 0 +#define JoinRound 1 +#define JoinBevel 2 + +/* fillStyle */ + +#define FillSolid 0 +#define FillTiled 1 +#define FillStippled 2 +#define FillOpaqueStippled 3 + +/* fillRule */ + +#define EvenOddRule 0 +#define WindingRule 1 + +/* subwindow mode */ + +#define ClipByChildren 0 +#define IncludeInferiors 1 + +/* SetClipRectangles ordering */ + +#define Unsorted 0 +#define YSorted 1 +#define YXSorted 2 +#define YXBanded 3 + +/* CoordinateMode for drawing routines */ + +#define CoordModeOrigin 0 /* relative to the origin */ +#define CoordModePrevious 1 /* relative to previous point */ + +/* Polygon shapes */ + +#define Complex 0 /* paths may intersect */ +#define Nonconvex 1 /* no paths intersect, but not convex */ +#define Convex 2 /* wholly convex */ + +/* Arc modes for PolyFillArc */ + +#define ArcChord 0 /* join endpoints of arc */ +#define ArcPieSlice 1 /* join endpoints to center of arc */ + +/* GC components: masks used in CreateGC, CopyGC, ChangeGC, OR'ed into + GC.stateChanges */ + +#define GCFunction (1L<<0) +#define GCPlaneMask (1L<<1) +#define GCForeground (1L<<2) +#define GCBackground (1L<<3) +#define GCLineWidth (1L<<4) +#define GCLineStyle (1L<<5) +#define GCCapStyle (1L<<6) +#define GCJoinStyle (1L<<7) +#define GCFillStyle (1L<<8) +#define GCFillRule (1L<<9) +#define GCTile (1L<<10) +#define GCStipple (1L<<11) +#define GCTileStipXOrigin (1L<<12) +#define GCTileStipYOrigin (1L<<13) +#define GCFont (1L<<14) +#define GCSubwindowMode (1L<<15) +#define GCGraphicsExposures (1L<<16) +#define GCClipXOrigin (1L<<17) +#define GCClipYOrigin (1L<<18) +#define GCClipMask (1L<<19) +#define GCDashOffset (1L<<20) +#define GCDashList (1L<<21) +#define GCArcMode (1L<<22) + +#define GCLastBit 22 +/***************************************************************** + * FONTS + *****************************************************************/ + +/* used in QueryFont -- draw direction */ + +#define FontLeftToRight 0 +#define FontRightToLeft 1 + +#define FontChange 255 + +/***************************************************************** + * IMAGING + *****************************************************************/ + +/* ImageFormat -- PutImage, GetImage */ + +#define XYBitmap 0 /* depth 1, XYFormat */ +#define XYPixmap 1 /* depth == drawable depth */ +#define ZPixmap 2 /* depth == drawable depth */ + +/***************************************************************** + * COLOR MAP STUFF + *****************************************************************/ + +/* For CreateColormap */ + +#define AllocNone 0 /* create map with no entries */ +#define AllocAll 1 /* allocate entire map writeable */ + + +/* Flags used in StoreNamedColor, StoreColors */ + +#define DoRed (1<<0) +#define DoGreen (1<<1) +#define DoBlue (1<<2) + +/***************************************************************** + * CURSOR STUFF + *****************************************************************/ + +/* QueryBestSize Class */ + +#define CursorShape 0 /* largest size that can be displayed */ +#define TileShape 1 /* size tiled fastest */ +#define StippleShape 2 /* size stippled fastest */ + +/***************************************************************** + * KEYBOARD/POINTER STUFF + *****************************************************************/ + +#define AutoRepeatModeOff 0 +#define AutoRepeatModeOn 1 +#define AutoRepeatModeDefault 2 + +#define LedModeOff 0 +#define LedModeOn 1 + +/* masks for ChangeKeyboardControl */ + +#define KBKeyClickPercent (1L<<0) +#define KBBellPercent (1L<<1) +#define KBBellPitch (1L<<2) +#define KBBellDuration (1L<<3) +#define KBLed (1L<<4) +#define KBLedMode (1L<<5) +#define KBKey (1L<<6) +#define KBAutoRepeatMode (1L<<7) + +#define MappingSuccess 0 +#define MappingBusy 1 +#define MappingFailed 2 + +#define MappingModifier 0 +#define MappingKeyboard 1 +#define MappingPointer 2 + +/***************************************************************** + * SCREEN SAVER STUFF + *****************************************************************/ + +#define DontPreferBlanking 0 +#define PreferBlanking 1 +#define DefaultBlanking 2 + +#define DisableScreenSaver 0 +#define DisableScreenInterval 0 + +#define DontAllowExposures 0 +#define AllowExposures 1 +#define DefaultExposures 2 + +/* for ForceScreenSaver */ + +#define ScreenSaverReset 0 +#define ScreenSaverActive 1 + +/***************************************************************** + * HOSTS AND CONNECTIONS + *****************************************************************/ + +/* for ChangeHosts */ + +#define HostInsert 0 +#define HostDelete 1 + +/* for ChangeAccessControl */ + +#define EnableAccess 1 +#define DisableAccess 0 + +/* Display classes used in opening the connection + * Note that the statically allocated ones are even numbered and the + * dynamically changeable ones are odd numbered */ + +#define StaticGray 0 +#define GrayScale 1 +#define StaticColor 2 +#define PseudoColor 3 +#define TrueColor 4 +#define DirectColor 5 + + +/* Byte order used in imageByteOrder and bitmapBitOrder */ + +#define LSBFirst 0 +#define MSBFirst 1 + +#if defined(MAC_OSX_TK) +# undef Cursor +# undef Region +#endif + +#endif /* X_H */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xatom.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xatom.h new file mode 100644 index 00000000..485a4236 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xatom.h @@ -0,0 +1,79 @@ +#ifndef XATOM_H +#define XATOM_H 1 + +/* THIS IS A GENERATED FILE + * + * Do not change! Changing this file implies a protocol change! + */ + +#define XA_PRIMARY ((Atom) 1) +#define XA_SECONDARY ((Atom) 2) +#define XA_ARC ((Atom) 3) +#define XA_ATOM ((Atom) 4) +#define XA_BITMAP ((Atom) 5) +#define XA_CARDINAL ((Atom) 6) +#define XA_COLORMAP ((Atom) 7) +#define XA_CURSOR ((Atom) 8) +#define XA_CUT_BUFFER0 ((Atom) 9) +#define XA_CUT_BUFFER1 ((Atom) 10) +#define XA_CUT_BUFFER2 ((Atom) 11) +#define XA_CUT_BUFFER3 ((Atom) 12) +#define XA_CUT_BUFFER4 ((Atom) 13) +#define XA_CUT_BUFFER5 ((Atom) 14) +#define XA_CUT_BUFFER6 ((Atom) 15) +#define XA_CUT_BUFFER7 ((Atom) 16) +#define XA_DRAWABLE ((Atom) 17) +#define XA_FONT ((Atom) 18) +#define XA_INTEGER ((Atom) 19) +#define XA_PIXMAP ((Atom) 20) +#define XA_POINT ((Atom) 21) +#define XA_RECTANGLE ((Atom) 22) +#define XA_RESOURCE_MANAGER ((Atom) 23) +#define XA_RGB_COLOR_MAP ((Atom) 24) +#define XA_RGB_BEST_MAP ((Atom) 25) +#define XA_RGB_BLUE_MAP ((Atom) 26) +#define XA_RGB_DEFAULT_MAP ((Atom) 27) +#define XA_RGB_GRAY_MAP ((Atom) 28) +#define XA_RGB_GREEN_MAP ((Atom) 29) +#define XA_RGB_RED_MAP ((Atom) 30) +#define XA_STRING ((Atom) 31) +#define XA_VISUALID ((Atom) 32) +#define XA_WINDOW ((Atom) 33) +#define XA_WM_COMMAND ((Atom) 34) +#define XA_WM_HINTS ((Atom) 35) +#define XA_WM_CLIENT_MACHINE ((Atom) 36) +#define XA_WM_ICON_NAME ((Atom) 37) +#define XA_WM_ICON_SIZE ((Atom) 38) +#define XA_WM_NAME ((Atom) 39) +#define XA_WM_NORMAL_HINTS ((Atom) 40) +#define XA_WM_SIZE_HINTS ((Atom) 41) +#define XA_WM_ZOOM_HINTS ((Atom) 42) +#define XA_MIN_SPACE ((Atom) 43) +#define XA_NORM_SPACE ((Atom) 44) +#define XA_MAX_SPACE ((Atom) 45) +#define XA_END_SPACE ((Atom) 46) +#define XA_SUPERSCRIPT_X ((Atom) 47) +#define XA_SUPERSCRIPT_Y ((Atom) 48) +#define XA_SUBSCRIPT_X ((Atom) 49) +#define XA_SUBSCRIPT_Y ((Atom) 50) +#define XA_UNDERLINE_POSITION ((Atom) 51) +#define XA_UNDERLINE_THICKNESS ((Atom) 52) +#define XA_STRIKEOUT_ASCENT ((Atom) 53) +#define XA_STRIKEOUT_DESCENT ((Atom) 54) +#define XA_ITALIC_ANGLE ((Atom) 55) +#define XA_X_HEIGHT ((Atom) 56) +#define XA_QUAD_WIDTH ((Atom) 57) +#define XA_WEIGHT ((Atom) 58) +#define XA_POINT_SIZE ((Atom) 59) +#define XA_RESOLUTION ((Atom) 60) +#define XA_COPYRIGHT ((Atom) 61) +#define XA_NOTICE ((Atom) 62) +#define XA_FONT_NAME ((Atom) 63) +#define XA_FAMILY_NAME ((Atom) 64) +#define XA_FULL_NAME ((Atom) 65) +#define XA_CAP_HEIGHT ((Atom) 66) +#define XA_WM_CLASS ((Atom) 67) +#define XA_WM_TRANSIENT_FOR ((Atom) 68) + +#define XA_LAST_PREDEFINED ((Atom) 68) +#endif /* XATOM_H */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xfuncproto.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xfuncproto.h new file mode 100644 index 00000000..6d63002e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xfuncproto.h @@ -0,0 +1,60 @@ +/* $XConsortium: Xfuncproto.h,v 1.7 91/05/13 20:49:21 rws Exp $ */ +/* + * Copyright 1989, 1991 by the Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + */ + +/* Definitions to make function prototypes manageable */ + +#ifndef _XFUNCPROTO_H_ +#define _XFUNCPROTO_H_ + +#ifndef NeedFunctionPrototypes +#define NeedFunctionPrototypes 1 +#endif /* NeedFunctionPrototypes */ + +#ifndef NeedVarargsPrototypes +#define NeedVarargsPrototypes 0 +#endif /* NeedVarargsPrototypes */ + +#if NeedFunctionPrototypes + +#ifndef NeedNestedPrototypes +#define NeedNestedPrototypes 1 +#endif /* NeedNestedPrototypes */ + +#ifndef _Xconst +#define _Xconst const +#endif /* _Xconst */ + +#ifndef NeedWidePrototypes +#ifdef NARROWPROTO +#define NeedWidePrototypes 0 +#else +#define NeedWidePrototypes 1 /* default to make interropt. easier */ +#endif +#endif /* NeedWidePrototypes */ + +#endif /* NeedFunctionPrototypes */ + +#ifdef __cplusplus +#define _XFUNCPROTOBEGIN extern "C" { +#define _XFUNCPROTOEND } +#endif + +#ifndef _XFUNCPROTOBEGIN +#define _XFUNCPROTOBEGIN +#define _XFUNCPROTOEND +#endif /* _XFUNCPROTOBEGIN */ + +#endif /* _XFUNCPROTO_H_ */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xlib.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xlib.h new file mode 100644 index 00000000..667bdc77 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xlib.h @@ -0,0 +1,1205 @@ +/* $XConsortium: Xlib.h,v 11.221 93/07/02 14:13:28 gildea Exp $ */ +/* + * Copyright 1985, 1986, 1987, 1991 by the Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * X Window System is a Trademark of MIT. + * + */ + + +/* + * Xlib.h - Header definition and support file for the C subroutine + * interface library (Xlib) to the X Window System Protocol (V11). + * Structures and symbols starting with "_" are private to the library. + */ +#ifndef _XLIB_H_ +#define _XLIB_H_ + +#define XlibSpecificationRelease 5 + +#if !defined(MAC_OSX_TK) +# include +#endif +#ifdef MAC_OSX_TK +# include +# define Cursor XCursor +# define Region XRegion +#endif + +/* applications should not depend on these two headers being included! */ +#include + +#ifndef X_WCHAR +#ifdef X_NOT_STDC_ENV +#define X_WCHAR +#endif +#endif + +#ifndef X_WCHAR +#include +#else +/* replace this with #include or typedef appropriate for your system */ +typedef unsigned long wchar_t; +#endif + +typedef char *XPointer; + +#define Bool int +#if defined(MAC_OSX_TK) +/* Use define rather than typedef, since may need to undefine this later */ +#define Status int +#else +typedef int Status; +#endif +#define True 1 +#define False 0 + +#define QueuedAlready 0 +#define QueuedAfterReading 1 +#define QueuedAfterFlush 2 + +#define ConnectionNumber(dpy) ((dpy)->fd) +#define RootWindow(dpy, scr) (((dpy)->screens[(scr)]).root) +#define DefaultScreen(dpy) ((dpy)->default_screen) +#define DefaultRootWindow(dpy) (((dpy)->screens[(dpy)->default_screen]).root) +#define DefaultVisual(dpy, scr) (((dpy)->screens[(scr)]).root_visual) +#define DefaultGC(dpy, scr) (((dpy)->screens[(scr)]).default_gc) +#define BlackPixel(dpy, scr) (((dpy)->screens[(scr)]).black_pixel) +#define WhitePixel(dpy, scr) (((dpy)->screens[(scr)]).white_pixel) +#define AllPlanes ((unsigned long)~0L) +#define QLength(dpy) ((dpy)->qlen) +#define DisplayWidth(dpy, scr) (((dpy)->screens[(scr)]).width) +#define DisplayHeight(dpy, scr) (((dpy)->screens[(scr)]).height) +#define DisplayWidthMM(dpy, scr)(((dpy)->screens[(scr)]).mwidth) +#define DisplayHeightMM(dpy, scr)(((dpy)->screens[(scr)]).mheight) +#define DisplayPlanes(dpy, scr) (((dpy)->screens[(scr)]).root_depth) +#define DisplayCells(dpy, scr) (DefaultVisual((dpy), (scr))->map_entries) +#define ScreenCount(dpy) ((dpy)->nscreens) +#define ServerVendor(dpy) ((dpy)->vendor) +#define ProtocolVersion(dpy) ((dpy)->proto_major_version) +#define ProtocolRevision(dpy) ((dpy)->proto_minor_version) +#define VendorRelease(dpy) ((dpy)->release) +#define DisplayString(dpy) ((dpy)->display_name) +#define DefaultDepth(dpy, scr) (((dpy)->screens[(scr)]).root_depth) +#define DefaultColormap(dpy, scr)(((dpy)->screens[(scr)]).cmap) +#define BitmapUnit(dpy) ((dpy)->bitmap_unit) +#define BitmapBitOrder(dpy) ((dpy)->bitmap_bit_order) +#define BitmapPad(dpy) ((dpy)->bitmap_pad) +#define ImageByteOrder(dpy) ((dpy)->byte_order) +#define NextRequest(dpy) ((dpy)->request + 1) +#define LastKnownRequestProcessed(dpy) ((dpy)->request) + +/* macros for screen oriented applications (toolkit) */ +#define ScreenOfDisplay(dpy, scr)(&((dpy)->screens[(scr)])) +#define DefaultScreenOfDisplay(dpy) (&((dpy)->screens[(dpy)->default_screen])) +#define DisplayOfScreen(s) ((s)->display) +#define RootWindowOfScreen(s) ((s)->root) +#define BlackPixelOfScreen(s) ((s)->black_pixel) +#define WhitePixelOfScreen(s) ((s)->white_pixel) +#define DefaultColormapOfScreen(s)((s)->cmap) +#define DefaultDepthOfScreen(s) ((s)->root_depth) +#define DefaultGCOfScreen(s) ((s)->default_gc) +#define DefaultVisualOfScreen(s)((s)->root_visual) +#define WidthOfScreen(s) ((s)->width) +#define HeightOfScreen(s) ((s)->height) +#define WidthMMOfScreen(s) ((s)->mwidth) +#define HeightMMOfScreen(s) ((s)->mheight) +#define PlanesOfScreen(s) ((s)->root_depth) +#define CellsOfScreen(s) (DefaultVisualOfScreen((s))->map_entries) +#define MinCmapsOfScreen(s) ((s)->min_maps) +#define MaxCmapsOfScreen(s) ((s)->max_maps) +#define DoesSaveUnders(s) ((s)->save_unders) +#define DoesBackingStore(s) ((s)->backing_store) +#define EventMaskOfScreen(s) ((s)->root_input_mask) + +/* + * Extensions need a way to hang private data on some structures. + */ +typedef struct _XExtData { + int number; /* number returned by XRegisterExtension */ + struct _XExtData *next; /* next item on list of data for structure */ + int (*free_private)(); /* called to free private storage */ + XPointer private_data; /* data private to this extension. */ +} XExtData; + +/* + * This file contains structures used by the extension mechanism. + */ +typedef struct { /* public to extension, cannot be changed */ + int extension; /* extension number */ + int major_opcode; /* major op-code assigned by server */ + int first_event; /* first event number for the extension */ + int first_error; /* first error number for the extension */ +} XExtCodes; + +/* + * Data structure for retrieving info about pixmap formats. + */ + +typedef struct { + int depth; + int bits_per_pixel; + int scanline_pad; +} XPixmapFormatValues; + + +/* + * Data structure for setting graphics context. + */ +typedef struct { + int function; /* logical operation */ + unsigned long plane_mask;/* plane mask */ + unsigned long foreground;/* foreground pixel */ + unsigned long background;/* background pixel */ + int line_width; /* line width */ + int line_style; /* LineSolid, LineOnOffDash, LineDoubleDash */ + int cap_style; /* CapNotLast, CapButt, + CapRound, CapProjecting */ + int join_style; /* JoinMiter, JoinRound, JoinBevel */ + int fill_style; /* FillSolid, FillTiled, + FillStippled, FillOpaeueStippled */ + int fill_rule; /* EvenOddRule, WindingRule */ + int arc_mode; /* ArcChord, ArcPieSlice */ + Pixmap tile; /* tile pixmap for tiling operations */ + Pixmap stipple; /* stipple 1 plane pixmap for stipping */ + int ts_x_origin; /* offset for tile or stipple operations */ + int ts_y_origin; + Font font; /* default text font for text operations */ + int subwindow_mode; /* ClipByChildren, IncludeInferiors */ + Bool graphics_exposures;/* boolean, should exposures be generated */ + int clip_x_origin; /* origin for clipping */ + int clip_y_origin; + Pixmap clip_mask; /* bitmap clipping; other calls for rects */ + int dash_offset; /* patterned/dashed line information */ + char dashes; +} XGCValues; + +/* + * Graphics context. The contents of this structure are implementation + * dependent. A GC should be treated as opaque by application code. + */ + +typedef XGCValues *GC; + +/* + * Visual structure; contains information about colormapping possible. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + VisualID visualid; /* visual id of this visual */ +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ class of screen (monochrome, etc.) */ +#else + int class; /* class of screen (monochrome, etc.) */ +#endif + unsigned long red_mask, green_mask, blue_mask; /* mask values */ + int bits_per_rgb; /* log base 2 of distinct color values */ + int map_entries; /* color map entries */ +} Visual; + +/* + * Depth structure; contains information for each possible depth. + */ +typedef struct { + int depth; /* this depth (Z) of the depth */ + int nvisuals; /* number of Visual types at this depth */ + Visual *visuals; /* list of visuals possible at this depth */ +} Depth; + +/* + * Information about the screen. The contents of this structure are + * implementation dependent. A Screen should be treated as opaque + * by application code. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + struct _XDisplay *display;/* back pointer to display structure */ + Window root; /* Root window id. */ + int width, height; /* width and height of screen */ + int mwidth, mheight; /* width and height of in millimeters */ + int ndepths; /* number of depths possible */ + Depth *depths; /* list of allowable depths on the screen */ + int root_depth; /* bits per pixel */ + Visual *root_visual; /* root visual */ + GC default_gc; /* GC for the root root visual */ + Colormap cmap; /* default color map */ + unsigned long white_pixel; + unsigned long black_pixel; /* White and Black pixel values */ + int max_maps, min_maps; /* max and min color maps */ + int backing_store; /* Never, WhenMapped, Always */ + Bool save_unders; + long root_input_mask; /* initial root input mask */ +} Screen; + +/* + * Format structure; describes ZFormat data the screen will understand. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + int depth; /* depth of this image format */ + int bits_per_pixel; /* bits/pixel at this depth */ + int scanline_pad; /* scanline must padded to this multiple */ +} ScreenFormat; + +/* + * Data structure for setting window attributes. + */ +typedef struct { + Pixmap background_pixmap; /* background or None or ParentRelative */ + unsigned long background_pixel; /* background pixel */ + Pixmap border_pixmap; /* border of the window */ + unsigned long border_pixel; /* border pixel value */ + int bit_gravity; /* one of bit gravity values */ + int win_gravity; /* one of the window gravity values */ + int backing_store; /* NotUseful, WhenMapped, Always */ + unsigned long backing_planes;/* planes to be preseved if possible */ + unsigned long backing_pixel;/* value to use in restoring planes */ + Bool save_under; /* should bits under be saved? (popups) */ + long event_mask; /* set of events that should be saved */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Colormap colormap; /* color map to be associated with window */ + Cursor cursor; /* cursor to be displayed (or None) */ +} XSetWindowAttributes; + +typedef struct { + int x, y; /* location of window */ + int width, height; /* width and height of window */ + int border_width; /* border width of window */ + int depth; /* depth of window */ + Visual *visual; /* the associated visual structure */ + Window root; /* root of screen containing window */ +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ InputOutput, InputOnly*/ +#else + int class; /* InputOutput, InputOnly*/ +#endif + int bit_gravity; /* one of bit gravity values */ + int win_gravity; /* one of the window gravity values */ + int backing_store; /* NotUseful, WhenMapped, Always */ + unsigned long backing_planes;/* planes to be preserved if possible */ + unsigned long backing_pixel;/* value to be used when restoring planes */ + Bool save_under; /* boolean, should bits under be saved? */ + Colormap colormap; /* color map to be associated with window */ + Bool map_installed; /* boolean, is color map currently installed*/ + int map_state; /* IsUnmapped, IsUnviewable, IsViewable */ + long all_event_masks; /* set of events all people have interest in*/ + long your_event_mask; /* my event mask */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Screen *screen; /* back pointer to correct screen */ +} XWindowAttributes; + +/* + * Data structure for host setting; getting routines. + * + */ + +typedef struct { + int family; /* for example FamilyInternet */ + int length; /* length of address, in bytes */ + char *address; /* pointer to where to find the bytes */ +} XHostAddress; + +/* + * Data structure for "image" data, used by image manipulation routines. + */ +typedef struct _XImage { + int width, height; /* size of image */ + int xoffset; /* number of pixels offset in X direction */ + int format; /* XYBitmap, XYPixmap, ZPixmap */ + char *data; /* pointer to image data */ + int byte_order; /* data byte order, LSBFirst, MSBFirst */ + int bitmap_unit; /* quant. of scanline 8, 16, 32 */ + int bitmap_bit_order; /* LSBFirst, MSBFirst */ + int bitmap_pad; /* 8, 16, 32 either XY or ZPixmap */ + int depth; /* depth of image */ + int bytes_per_line; /* accelarator to next line */ + int bits_per_pixel; /* bits per pixel (ZPixmap) */ + unsigned long red_mask; /* bits in z arrangment */ + unsigned long green_mask; + unsigned long blue_mask; + XPointer obdata; /* hook for the object routines to hang on */ + struct funcs { /* image manipulation routines */ + struct _XImage *(*create_image)(); +#if NeedFunctionPrototypes + int (*destroy_image) (struct _XImage *); + unsigned long (*get_pixel) (struct _XImage *, int, int); + int (*put_pixel) (struct _XImage *, int, int, unsigned long); + struct _XImage *(*sub_image)(struct _XImage *, int, int, unsigned int, unsigned int); + int (*add_pixel) (struct _XImage *, long); +#else + int (*destroy_image)(); + unsigned long (*get_pixel)(); + int (*put_pixel)(); + struct _XImage *(*sub_image)(); + int (*add_pixel)(); +#endif + } f; +} XImage; + +/* + * Data structure for XReconfigureWindow + */ +typedef struct { + int x, y; + int width, height; + int border_width; + Window sibling; + int stack_mode; +} XWindowChanges; + +/* + * Data structure used by color operations + */ +typedef struct { + unsigned long pixel; + unsigned short red, green, blue; + char flags; /* do_red, do_green, do_blue */ + char pad; +} XColor; + +/* + * Data structures for graphics operations. On most machines, these are + * congruent with the wire protocol structures, so reformatting the data + * can be avoided on these architectures. + */ +typedef struct { + short x1, y1, x2, y2; +} XSegment; + +typedef struct { + short x, y; +} XPoint; + +typedef struct { + short x, y; + unsigned short width, height; +} XRectangle; + +typedef struct { + short x, y; + unsigned short width, height; + short angle1, angle2; +} XArc; + + +/* Data structure for XChangeKeyboardControl */ + +typedef struct { + int key_click_percent; + int bell_percent; + int bell_pitch; + int bell_duration; + int led; + int led_mode; + int key; + int auto_repeat_mode; /* On, Off, Default */ +} XKeyboardControl; + +/* Data structure for XGetKeyboardControl */ + +typedef struct { + int key_click_percent; + int bell_percent; + unsigned int bell_pitch, bell_duration; + unsigned long led_mask; + int global_auto_repeat; + char auto_repeats[32]; +} XKeyboardState; + +/* Data structure for XGetMotionEvents. */ + +typedef struct { + Time time; + short x, y; +} XTimeCoord; + +/* Data structure for X{Set,Get}ModifierMapping */ + +typedef struct { + int max_keypermod; /* The server's max # of keys per modifier */ + KeyCode *modifiermap; /* An 8 by max_keypermod array of modifiers */ +} XModifierKeymap; + + +/* + * Display datatype maintaining display specific data. + * The contents of this structure are implementation dependent. + * A Display should be treated as opaque by application code. + */ +typedef struct _XDisplay { + XExtData *ext_data; /* hook for extension to hang data */ + struct _XFreeFuncs *free_funcs; /* internal free functions */ + int fd; /* Network socket. */ + int conn_checker; /* ugly thing used by _XEventsQueued */ + int proto_major_version;/* maj. version of server's X protocol */ + int proto_minor_version;/* minor version of servers X protocol */ + char *vendor; /* vendor of the server hardware */ + XID resource_base; /* resource ID base */ + XID resource_mask; /* resource ID mask bits */ + XID resource_id; /* allocator current ID */ + int resource_shift; /* allocator shift to correct bits */ + XID (*resource_alloc)(); /* allocator function */ + int byte_order; /* screen byte order, LSBFirst, MSBFirst */ + int bitmap_unit; /* padding and data requirements */ + int bitmap_pad; /* padding requirements on bitmaps */ + int bitmap_bit_order; /* LeastSignificant or MostSignificant */ + int nformats; /* number of pixmap formats in list */ + ScreenFormat *pixmap_format; /* pixmap format list */ + int vnumber; /* Xlib's X protocol version number. */ + int release; /* release of the server */ + struct _XSQEvent *head, *tail; /* Input event queue. */ + int qlen; /* Length of input event queue */ + unsigned long request; /* sequence number of last request. */ + char *last_req; /* beginning of last request, or dummy */ + char *buffer; /* Output buffer starting address. */ + char *bufptr; /* Output buffer index pointer. */ + char *bufmax; /* Output buffer maximum+1 address. */ + unsigned max_request_size; /* maximum number 32 bit words in request*/ + struct _XrmHashBucketRec *db; + int (*synchandler)(); /* Synchronization handler */ + char *display_name; /* "host:display" string used on this connect*/ + int default_screen; /* default screen for operations */ + int nscreens; /* number of screens on this server*/ + Screen *screens; /* pointer to list of screens */ + unsigned long motion_buffer; /* size of motion buffer */ + unsigned long flags; /* internal connection flags */ + int min_keycode; /* minimum defined keycode */ + int max_keycode; /* maximum defined keycode */ + KeySym *keysyms; /* This server's keysyms */ + XModifierKeymap *modifiermap; /* This server's modifier keymap */ + int keysyms_per_keycode;/* number of rows */ + char *xdefaults; /* contents of defaults from server */ + char *scratch_buffer; /* place to hang scratch buffer */ + unsigned long scratch_length; /* length of scratch buffer */ + int ext_number; /* extension number on this display */ + struct _XExten *ext_procs; /* extensions initialized on this display */ + /* + * the following can be fixed size, as the protocol defines how + * much address space is available. + * While this could be done using the extension vector, there + * may be MANY events processed, so a search through the extension + * list to find the right procedure for each event might be + * expensive if many extensions are being used. + */ + Bool (*event_vec[128])(); /* vector for wire to event */ + Status (*wire_vec[128])(); /* vector for event to wire */ + KeySym lock_meaning; /* for XLookupString */ + struct _XLockInfo *lock; /* multi-thread state, display lock */ + struct _XInternalAsync *async_handlers; /* for internal async */ + unsigned long bigreq_size; /* max size of big requests */ + struct _XLockPtrs *lock_fns; /* pointers to threads functions */ + /* things above this line should not move, for binary compatibility */ + struct _XKeytrans *key_bindings; /* for XLookupString */ + Font cursor_font; /* for XCreateFontCursor */ + struct _XDisplayAtoms *atoms; /* for XInternAtom */ + unsigned int mode_switch; /* keyboard group modifiers */ + struct _XContextDB *context_db; /* context database */ + Bool (**error_vec)(); /* vector for wire to error */ + /* + * Xcms information + */ + struct { + XPointer defaultCCCs; /* pointer to an array of default XcmsCCC */ + XPointer clientCmaps; /* pointer to linked list of XcmsCmapRec */ + XPointer perVisualIntensityMaps; + /* linked list of XcmsIntensityMap */ + } cms; + struct _XIMFilter *im_filters; + struct _XSQEvent *qfree; /* unallocated event queue elements */ + unsigned long next_event_serial_num; /* inserted into next queue elt */ + int (*savedsynchandler)(); /* user synchandler when Xlib usurps */ +} Display; + +#if NeedFunctionPrototypes /* prototypes require event type definitions */ +#undef _XEVENT_ +#endif +#ifndef _XEVENT_ + +#define XMaxTransChars 4 + +/* + * Definitions of specific events. + */ +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window it is reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int keycode; /* detail */ + Bool same_screen; /* same screen flag */ + char trans_chars[XMaxTransChars]; + /* translated characters */ + int nbytes; +} XKeyEvent; +typedef XKeyEvent XKeyPressedEvent; +typedef XKeyEvent XKeyReleasedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window it is reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int button; /* detail */ + Bool same_screen; /* same screen flag */ +} XButtonEvent; +typedef XButtonEvent XButtonPressedEvent; +typedef XButtonEvent XButtonReleasedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + char is_hint; /* detail */ + Bool same_screen; /* same screen flag */ +} XMotionEvent; +typedef XMotionEvent XPointerMovedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonlinear,NotifyNonlinearVirtual + */ + Bool same_screen; /* same screen flag */ + Bool focus; /* boolean focus */ + unsigned int state; /* key or button mask */ +} XCrossingEvent; +typedef XCrossingEvent XEnterWindowEvent; +typedef XCrossingEvent XLeaveWindowEvent; + +typedef struct { + int type; /* FocusIn or FocusOut */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window of event */ + int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonlinear,NotifyNonlinearVirtual, NotifyPointer, + * NotifyPointerRoot, NotifyDetailNone + */ +} XFocusChangeEvent; +typedef XFocusChangeEvent XFocusInEvent; +typedef XFocusChangeEvent XFocusOutEvent; + +/* generated on EnterWindow and FocusIn when KeyMapState selected */ +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + char key_vector[32]; +} XKeymapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int x, y; + int width, height; + int count; /* if non-zero, at least this many more */ +} XExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; + int x, y; + int width, height; + int count; /* if non-zero, at least this many more */ + int major_code; /* core is CopyArea or CopyPlane */ + int minor_code; /* not defined in the core */ +} XGraphicsExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; + int major_code; /* core is CopyArea or CopyPlane */ + int minor_code; /* not defined in the core */ +} XNoExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int state; /* Visibility state */ +} XVisibilityEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; /* parent of the window */ + Window window; /* window id of window created */ + int x, y; /* window location */ + int width, height; /* size of window */ + int border_width; /* border width */ + Bool override_redirect; /* creation should be overridden */ +} XCreateWindowEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; +} XDestroyWindowEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Bool from_configure; +} XUnmapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Bool override_redirect; /* boolean, is override set... */ +} XMapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; +} XMapRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Window parent; + int x, y; + Bool override_redirect; +} XReparentEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int x, y; + int width, height; + int border_width; + Window above; + Bool override_redirect; +} XConfigureEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int x, y; +} XGravityEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int width, height; +} XResizeRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; + int x, y; + int width, height; + int border_width; + Window above; + int detail; /* Above, Below, TopIf, BottomIf, Opposite */ + unsigned long value_mask; +} XConfigureRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int place; /* PlaceOnTop, PlaceOnBottom */ +} XCirculateEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; + int place; /* PlaceOnTop, PlaceOnBottom */ +} XCirculateRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom atom; + Time time; + int state; /* NewValue, Deleted */ +} XPropertyEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom selection; + Time time; +} XSelectionClearEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window owner; + Window requestor; + Atom selection; + Atom target; + Atom property; + Time time; +} XSelectionRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window requestor; + Atom selection; + Atom target; + Atom property; /* ATOM or None */ + Time time; +} XSelectionEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Colormap colormap; /* COLORMAP or None */ +#if defined(__cplusplus) || defined(c_plusplus) + Bool c_new; /* C++ */ +#else + Bool new; +#endif + int state; /* ColormapInstalled, ColormapUninstalled */ +} XColormapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom message_type; + int format; + union { + char b[20]; + short s[10]; + long l[5]; + } data; +} XClientMessageEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* unused */ + int request; /* one of MappingModifier, MappingKeyboard, + MappingPointer */ + int first_keycode; /* first keycode */ + int count; /* defines range of change w. first_keycode*/ +} XMappingEvent; + +typedef struct { + int type; + Display *display; /* Display the event was read from */ + XID resourceid; /* resource id */ + unsigned long serial; /* serial number of failed request */ + unsigned char error_code; /* error code of failed request */ + unsigned char request_code; /* Major op-code of failed request */ + unsigned char minor_code; /* Minor op-code of failed request */ +} XErrorEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display;/* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ +} XAnyEvent; + +/* + * this union is defined so Xlib can always use the same sized + * event structure internally, to avoid memory fragmentation. + */ +typedef union _XEvent { + int type; /* must not be changed; first element */ + XAnyEvent xany; + XKeyEvent xkey; + XButtonEvent xbutton; + XMotionEvent xmotion; + XCrossingEvent xcrossing; + XFocusChangeEvent xfocus; + XExposeEvent xexpose; + XGraphicsExposeEvent xgraphicsexpose; + XNoExposeEvent xnoexpose; + XVisibilityEvent xvisibility; + XCreateWindowEvent xcreatewindow; + XDestroyWindowEvent xdestroywindow; + XUnmapEvent xunmap; + XMapEvent xmap; + XMapRequestEvent xmaprequest; + XReparentEvent xreparent; + XConfigureEvent xconfigure; + XGravityEvent xgravity; + XResizeRequestEvent xresizerequest; + XConfigureRequestEvent xconfigurerequest; + XCirculateEvent xcirculate; + XCirculateRequestEvent xcirculaterequest; + XPropertyEvent xproperty; + XSelectionClearEvent xselectionclear; + XSelectionRequestEvent xselectionrequest; + XSelectionEvent xselection; + XColormapEvent xcolormap; + XClientMessageEvent xclient; + XMappingEvent xmapping; + XErrorEvent xerror; + XKeymapEvent xkeymap; + long pad[24]; +} XEvent; +#endif + +#define XAllocID(dpy) ((*(dpy)->resource_alloc)((dpy))) + +/* + * per character font metric information. + */ +typedef struct { + short lbearing; /* origin to left edge of raster */ + short rbearing; /* origin to right edge of raster */ + short width; /* advance to next char's origin */ + short ascent; /* baseline to top edge of raster */ + short descent; /* baseline to bottom edge of raster */ + unsigned short attributes; /* per char flags (not predefined) */ +} XCharStruct; + +/* + * To allow arbitrary information with fonts, there are additional properties + * returned. + */ +typedef struct { + Atom name; + unsigned long card32; +} XFontProp; + +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + Font fid; /* Font id for this font */ + unsigned direction; /* hint about direction the font is painted */ + unsigned min_char_or_byte2;/* first character */ + unsigned max_char_or_byte2;/* last character */ + unsigned min_byte1; /* first row that exists */ + unsigned max_byte1; /* last row that exists */ + Bool all_chars_exist;/* flag if all characters have non-zero size*/ + unsigned default_char; /* char to print for undefined character */ + int n_properties; /* how many properties there are */ + XFontProp *properties; /* pointer to array of additional properties*/ + XCharStruct min_bounds; /* minimum bounds over all existing char*/ + XCharStruct max_bounds; /* maximum bounds over all existing char*/ + XCharStruct *per_char; /* first_char to last_char information */ + int ascent; /* log. extent above baseline for spacing */ + int descent; /* log. descent below baseline for spacing */ +} XFontStruct; + +/* + * PolyText routines take these as arguments. + */ +typedef struct { + char *chars; /* pointer to string */ + int nchars; /* number of characters */ + int delta; /* delta between strings */ + Font font; /* font to print it in, None don't change */ +} XTextItem; + +typedef struct { /* normal 16 bit characters are two bytes */ + unsigned char byte1; + unsigned char byte2; +} XChar2b; + +typedef struct { + XChar2b *chars; /* two byte characters */ + int nchars; /* number of characters */ + int delta; /* delta between strings */ + Font font; /* font to print it in, None don't change */ +} XTextItem16; + + +typedef union { Display *display; + GC gc; + Visual *visual; + Screen *screen; + ScreenFormat *pixmap_format; + XFontStruct *font; } XEDataObject; + +typedef struct { + XRectangle max_ink_extent; + XRectangle max_logical_extent; +} XFontSetExtents; + +typedef struct _XFontSet *XFontSet; + +typedef struct { + char *chars; + int nchars; + int delta; + XFontSet font_set; +} XmbTextItem; + +typedef struct { + wchar_t *chars; + int nchars; + int delta; + XFontSet font_set; +} XwcTextItem; + +typedef void (*XIMProc)(); + +typedef struct _XIM *XIM; +typedef struct _XIC *XIC; + +typedef unsigned long XIMStyle; + +typedef struct { + unsigned short count_styles; + XIMStyle *supported_styles; +} XIMStyles; + +#define XIMPreeditArea 0x0001L +#define XIMPreeditCallbacks 0x0002L +#define XIMPreeditPosition 0x0004L +#define XIMPreeditNothing 0x0008L +#define XIMPreeditNone 0x0010L +#define XIMStatusArea 0x0100L +#define XIMStatusCallbacks 0x0200L +#define XIMStatusNothing 0x0400L +#define XIMStatusNone 0x0800L + +#define XNVaNestedList "XNVaNestedList" +#define XNClientWindow "clientWindow" +#define XNInputStyle "inputStyle" +#define XNFocusWindow "focusWindow" +#define XNResourceName "resourceName" +#define XNResourceClass "resourceClass" +#define XNGeometryCallback "geometryCallback" +#define XNFilterEvents "filterEvents" +#define XNPreeditStartCallback "preeditStartCallback" +#define XNPreeditDoneCallback "preeditDoneCallback" +#define XNPreeditDrawCallback "preeditDrawCallback" +#define XNPreeditCaretCallback "preeditCaretCallback" +#define XNPreeditAttributes "preeditAttributes" +#define XNStatusStartCallback "statusStartCallback" +#define XNStatusDoneCallback "statusDoneCallback" +#define XNStatusDrawCallback "statusDrawCallback" +#define XNStatusAttributes "statusAttributes" +#define XNArea "area" +#define XNAreaNeeded "areaNeeded" +#define XNSpotLocation "spotLocation" +#define XNColormap "colorMap" +#define XNStdColormap "stdColorMap" +#define XNForeground "foreground" +#define XNBackground "background" +#define XNBackgroundPixmap "backgroundPixmap" +#define XNFontSet "fontSet" +#define XNLineSpace "lineSpace" +#define XNCursor "cursor" + +#define XBufferOverflow -1 +#define XLookupNone 1 +#define XLookupChars 2 +#define XLookupKeySym 3 +#define XLookupBoth 4 + +#if NeedFunctionPrototypes +typedef void *XVaNestedList; +#else +typedef XPointer XVaNestedList; +#endif + +typedef struct { + XPointer client_data; + XIMProc callback; +} XIMCallback; + +typedef unsigned long XIMFeedback; + +#define XIMReverse 1 +#define XIMUnderline (1<<1) +#define XIMHighlight (1<<2) +#define XIMPrimary (1<<5) +#define XIMSecondary (1<<6) +#define XIMTertiary (1<<7) + +typedef struct _XIMText { + unsigned short length; + XIMFeedback *feedback; + Bool encoding_is_wchar; + union { + char *multi_byte; + wchar_t *wide_char; + } string; +} XIMText; + +typedef struct _XIMPreeditDrawCallbackStruct { + int caret; /* Cursor offset within pre-edit string */ + int chg_first; /* Starting change position */ + int chg_length; /* Length of the change in character count */ + XIMText *text; +} XIMPreeditDrawCallbackStruct; + +typedef enum { + XIMForwardChar, XIMBackwardChar, + XIMForwardWord, XIMBackwardWord, + XIMCaretUp, XIMCaretDown, + XIMNextLine, XIMPreviousLine, + XIMLineStart, XIMLineEnd, + XIMAbsolutePosition, + XIMDontChange +} XIMCaretDirection; + +typedef enum { + XIMIsInvisible, /* Disable caret feedback */ + XIMIsPrimary, /* UI defined caret feedback */ + XIMIsSecondary /* UI defined caret feedback */ +} XIMCaretStyle; + +typedef struct _XIMPreeditCaretCallbackStruct { + int position; /* Caret offset within pre-edit string */ + XIMCaretDirection direction; /* Caret moves direction */ + XIMCaretStyle style; /* Feedback of the caret */ +} XIMPreeditCaretCallbackStruct; + +typedef enum { + XIMTextType, + XIMBitmapType +} XIMStatusDataType; + +typedef struct _XIMStatusDrawCallbackStruct { + XIMStatusDataType type; + union { + XIMText *text; + Pixmap bitmap; + } data; +} XIMStatusDrawCallbackStruct; + +typedef int (*XErrorHandler) ( /* WARNING, this type not in Xlib spec */ +#if NeedFunctionPrototypes + Display* /* display */, + XErrorEvent* /* error_event */ +#endif +); + +_XFUNCPROTOBEGIN + + + +#include "tkIntXlibDecls.h" + +_XFUNCPROTOEND + +#if defined(MAC_OSX_TK) +# undef Cursor +# undef Region +#endif + +#endif /* _XLIB_H_ */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xutil.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xutil.h new file mode 100644 index 00000000..58124b04 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/Xutil.h @@ -0,0 +1,855 @@ +/* $XConsortium: Xutil.h,v 11.73 91/07/30 16:21:37 rws Exp $ */ + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ + +#ifndef _XUTIL_H_ +#define _XUTIL_H_ + +/* You must include before including this file */ + +#if defined(MAC_OSX_TK) +# define Region XRegion +#endif + +/* + * Bitmask returned by XParseGeometry(). Each bit tells if the corresponding + * value (x, y, width, height) was found in the parsed string. + */ +#define NoValue 0x0000 +#define XValue 0x0001 +#define YValue 0x0002 +#define WidthValue 0x0004 +#define HeightValue 0x0008 +#define AllValues 0x000F +#define XNegative 0x0010 +#define YNegative 0x0020 + +/* + * new version containing base_width, base_height, and win_gravity fields; + * used with WM_NORMAL_HINTS. + */ +typedef struct { + long flags; /* marks which fields in this structure are defined */ + int x, y; /* obsolete for new window mgrs, but clients */ + int width, height; /* should set so old wm's don't mess up */ + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; + struct { + int x; /* numerator */ + int y; /* denominator */ + } min_aspect, max_aspect; + int base_width, base_height; /* added by ICCCM version 1 */ + int win_gravity; /* added by ICCCM version 1 */ +} XSizeHints; + +/* + * The next block of definitions are for window manager properties that + * clients and applications use for communication. + */ + +/* flags argument in size hints */ +#define USPosition (1L << 0) /* user specified x, y */ +#define USSize (1L << 1) /* user specified width, height */ + +#define PPosition (1L << 2) /* program specified position */ +#define PSize (1L << 3) /* program specified size */ +#define PMinSize (1L << 4) /* program specified minimum size */ +#define PMaxSize (1L << 5) /* program specified maximum size */ +#define PResizeInc (1L << 6) /* program specified resize increments */ +#define PAspect (1L << 7) /* program specified min and max aspect ratios */ +#define PBaseSize (1L << 8) /* program specified base for incrementing */ +#define PWinGravity (1L << 9) /* program specified window gravity */ + +/* obsolete */ +#define PAllHints (PPosition|PSize|PMinSize|PMaxSize|PResizeInc|PAspect) + + + +typedef struct { + long flags; /* marks which fields in this structure are defined */ + Bool input; /* does this application rely on the window manager to + get keyboard input? */ + int initial_state; /* see below */ + Pixmap icon_pixmap; /* pixmap to be used as icon */ + Window icon_window; /* window to be used as icon */ + int icon_x, icon_y; /* initial position of icon */ + Pixmap icon_mask; /* icon mask bitmap */ + XID window_group; /* id of related window group */ + /* this structure may be extended in the future */ +} XWMHints; + +/* definition for flags of XWMHints */ + +#define InputHint (1L << 0) +#define StateHint (1L << 1) +#define IconPixmapHint (1L << 2) +#define IconWindowHint (1L << 3) +#define IconPositionHint (1L << 4) +#define IconMaskHint (1L << 5) +#define WindowGroupHint (1L << 6) +#define AllHints (InputHint|StateHint|IconPixmapHint|IconWindowHint| \ +IconPositionHint|IconMaskHint|WindowGroupHint) + +/* definitions for initial window state */ +#define WithdrawnState 0 /* for windows that are not mapped */ +#define NormalState 1 /* most applications want to start this way */ +#define IconicState 3 /* application wants to start as an icon */ + +/* + * Obsolete states no longer defined by ICCCM + */ +#define DontCareState 0 /* don't know or care */ +#define ZoomState 2 /* application wants to start zoomed */ +#define InactiveState 4 /* application believes it is seldom used; */ + /* some wm's may put it on inactive menu */ + + +/* + * new structure for manipulating TEXT properties; used with WM_NAME, + * WM_ICON_NAME, WM_CLIENT_MACHINE, and WM_COMMAND. + */ +typedef struct { + unsigned char *value; /* same as Property routines */ + Atom encoding; /* prop type */ + int format; /* prop data format: 8, 16, or 32 */ + unsigned long nitems; /* number of data items in value */ +} XTextProperty; + +#define XNoMemory -1 +#define XLocaleNotSupported -2 +#define XConverterNotFound -3 + +typedef enum { + XStringStyle, /* STRING */ + XCompoundTextStyle, /* COMPOUND_TEXT */ + XTextStyle, /* text in owner's encoding (current locale)*/ + XStdICCTextStyle /* STRING, else COMPOUND_TEXT */ +} XICCEncodingStyle; + +typedef struct { + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; +} XIconSize; + +typedef struct { + char *res_name; + char *res_class; +} XClassHint; + +/* + * These macros are used to give some sugar to the image routines so that + * naive people are more comfortable with them. + */ +#define XDestroyImage(ximage) \ + ((*((ximage)->f.destroy_image))((ximage))) +#define XGetPixel(ximage, x, y) \ + ((*((ximage)->f.get_pixel))((ximage), (x), (y))) +#define XPutPixel(ximage, x, y, pixel) \ + ((*((ximage)->f.put_pixel))((ximage), (x), (y), (pixel))) +#define XSubImage(ximage, x, y, width, height) \ + ((*((ximage)->f.sub_image))((ximage), (x), (y), (width), (height))) +#define XAddPixel(ximage, value) \ + ((*((ximage)->f.add_pixel))((ximage), (value))) + +/* + * Compose sequence status structure, used in calling XLookupString. + */ +typedef struct _XComposeStatus { + XPointer compose_ptr; /* state table pointer */ + int chars_matched; /* match state */ +} XComposeStatus; + +/* + * Keysym macros, used on Keysyms to test for classes of symbols + */ +#define IsKeypadKey(keysym) \ + (((unsigned)(keysym) >= XK_KP_Space) && ((unsigned)(keysym) <= XK_KP_Equal)) + +#define IsCursorKey(keysym) \ + (((unsigned)(keysym) >= XK_Home) && ((unsigned)(keysym) < XK_Select)) + +#define IsPFKey(keysym) \ + (((unsigned)(keysym) >= XK_KP_F1) && ((unsigned)(keysym) <= XK_KP_F4)) + +#define IsFunctionKey(keysym) \ + (((unsigned)(keysym) >= XK_F1) && ((unsigned)(keysym) <= XK_F35)) + +#define IsMiscFunctionKey(keysym) \ + (((unsigned)(keysym) >= XK_Select) && ((unsigned)(keysym) <= XK_Break)) + +#define IsModifierKey(keysym) \ + ((((unsigned)(keysym) >= XK_Shift_L) && ((unsigned)(keysym) <= XK_Hyper_R)) \ + || ((unsigned)(keysym) == XK_Mode_switch) \ + || ((unsigned)(keysym) == XK_Num_Lock)) +/* + * opaque reference to Region data type + */ +typedef struct _XRegion *Region; + +/* Return values from XRectInRegion() */ + +#define RectangleOut 0 +#define RectangleIn 1 +#define RectanglePart 2 + + +/* + * Information used by the visual utility routines to find desired visual + * type from the many visuals a display may support. + */ + +typedef struct { + Visual *visual; + VisualID visualid; + int screen; + int depth; +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ */ +#else + int class; +#endif + unsigned long red_mask; + unsigned long green_mask; + unsigned long blue_mask; + int colormap_size; + int bits_per_rgb; +} XVisualInfo; + +#define VisualNoMask 0x0 +#define VisualIDMask 0x1 +#define VisualScreenMask 0x2 +#define VisualDepthMask 0x4 +#define VisualClassMask 0x8 +#define VisualRedMaskMask 0x10 +#define VisualGreenMaskMask 0x20 +#define VisualBlueMaskMask 0x40 +#define VisualColormapSizeMask 0x80 +#define VisualBitsPerRGBMask 0x100 +#define VisualAllMask 0x1FF + +/* + * This defines a window manager property that clients may use to + * share standard color maps of type RGB_COLOR_MAP: + */ +typedef struct { + Colormap colormap; + unsigned long red_max; + unsigned long red_mult; + unsigned long green_max; + unsigned long green_mult; + unsigned long blue_max; + unsigned long blue_mult; + unsigned long base_pixel; + VisualID visualid; /* added by ICCCM version 1 */ + XID killid; /* added by ICCCM version 1 */ +} XStandardColormap; + +#define ReleaseByFreeingColormap ((XID) 1L) /* for killid field above */ + + +/* + * return codes for XReadBitmapFile and XWriteBitmapFile + */ +#define BitmapSuccess 0 +#define BitmapOpenFailed 1 +#define BitmapFileInvalid 2 +#define BitmapNoMemory 3 + +/**************************************************************** + * + * Context Management + * + ****************************************************************/ + + +/* Associative lookup table return codes */ + +#define XCSUCCESS 0 /* No error. */ +#define XCNOMEM 1 /* Out of memory */ +#define XCNOENT 2 /* No entry in table */ + +typedef int XContext; + +#define XUniqueContext() ((XContext) XrmUniqueQuark()) +#define XStringToContext(string) ((XContext) XrmStringToQuark(string)) + +_XFUNCPROTOBEGIN + +/* The following declarations are alphabetized. */ + +extern XClassHint *XAllocClassHint ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XIconSize *XAllocIconSize ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XSizeHints *XAllocSizeHints ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XStandardColormap *XAllocStandardColormap ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XWMHints *XAllocWMHints ( +#if NeedFunctionPrototypes + void +#endif +); + +extern void XClipBox( +#if NeedFunctionPrototypes + Region /* r */, + XRectangle* /* rect_return */ +#endif +); + +extern Region XCreateRegion( +#if NeedFunctionPrototypes + void +#endif +); + +extern char *XDefaultString( +#if NeedFunctionPrototypes + void +#endif +); + +extern int XDeleteContext( +#if NeedFunctionPrototypes + Display* /* display */, + XID /* rid */, + XContext /* context */ +#endif +); + +extern void XDestroyRegion( +#if NeedFunctionPrototypes + Region /* r */ +#endif +); + +extern Bool XEmptyRegion( +#if NeedFunctionPrototypes + Region /* r */ +#endif +); + +extern Bool XEqualRegion( +#if NeedFunctionPrototypes + Region /* r1 */, + Region /* r2 */ +#endif +); + +extern int XFindContext( +#if NeedFunctionPrototypes + Display* /* display */, + XID /* rid */, + XContext /* context */, + XPointer* /* data_return */ +#endif +); + +extern Status XGetClassHint( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XClassHint* /* class_hints_return */ +#endif +); + +extern Status XGetIconSizes( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XIconSize** /* size_list_return */, + int* /* count_return */ +#endif +); + +extern Status XGetNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */ +#endif +); + +extern Status XGetRGBColormaps( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap** /* stdcmap_return */, + int* /* count_return */, + Atom /* property */ +#endif +); + +extern Status XGetSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + Atom /* property */ +#endif +); + +extern Status XGetStandardColormap( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap* /* colormap_return */, + Atom /* property */ +#endif +); + +extern Status XGetTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* window */, + XTextProperty* /* text_prop_return */, + Atom /* property */ +#endif +); + + +extern Status XGetWMClientMachine( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern XWMHints *XGetWMHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */ +#endif +); + +extern Status XGetWMIconName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern Status XGetWMName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern Status XGetWMNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + long* /* supplied_return */ +#endif +); + +extern Status XGetWMSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + long* /* supplied_return */, + Atom /* property */ +#endif +); + +extern Status XGetZoomHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* zhints_return */ +#endif +); + +extern void XIntersectRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +extern int XLookupString( +#if NeedFunctionPrototypes + XKeyEvent* /* event_struct */, + char* /* buffer_return */, + int /* bytes_buffer */, + KeySym* /* keysym_return */, + XComposeStatus* /* status_in_out */ +#endif +); + +extern Status XMatchVisualInfo( +#if NeedFunctionPrototypes + Display* /* display */, + int /* screen */, + int /* depth */, + int /* class */, + XVisualInfo* /* vinfo_return */ +#endif +); + +extern void XOffsetRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* dx */, + int /* dy */ +#endif +); + +extern Bool XPointInRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* x */, + int /* y */ +#endif +); + +extern Region XPolygonRegion( +#if NeedFunctionPrototypes + XPoint* /* points */, + int /* n */, + int /* fill_rule */ +#endif +); + +extern int XRectInRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */ +#endif +); + +extern int XSaveContext( +#if NeedFunctionPrototypes + Display* /* display */, + XID /* rid */, + XContext /* context */, + _Xconst char* /* data */ +#endif +); + +extern void XSetClassHint( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XClassHint* /* class_hints */ +#endif +); + +extern void XSetIconSizes( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XIconSize* /* size_list */, + int /* count */ +#endif +); + +extern void XSetNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */ +#endif +); + +extern void XSetRGBColormaps( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap* /* stdcmaps */, + int /* count */, + Atom /* property */ +#endif +); + +extern void XSetSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */, + Atom /* property */ +#endif +); + +extern void XSetStandardProperties( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + Pixmap /* icon_pixmap */, + char** /* argv */, + int /* argc */, + XSizeHints* /* hints */ +#endif +); + +extern void XSetTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */, + Atom /* property */ +#endif +); + +extern void XSetWMHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XWMHints* /* wm_hints */ +#endif +); + +extern void XSetWMIconName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +#endif +); + +extern void XSetWMName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +#endif +); + +extern void XSetWMNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */ +#endif +); + +extern void XSetWMProperties( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* window_name */, + XTextProperty* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +#endif +); + +extern void XmbSetWMProperties( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +#endif +); + +extern void XSetWMSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */, + Atom /* property */ +#endif +); + +extern void XSetRegion( +#if NeedFunctionPrototypes + Display* /* display */, + GC /* gc */, + Region /* r */ +#endif +); + +extern void XSetStandardColormap( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap* /* colormap */, + Atom /* property */ +#endif +); + +extern void XSetZoomHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* zhints */ +#endif +); + +extern void XShrinkRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* dx */, + int /* dy */ +#endif +); + +extern void XSubtractRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +extern int XmbTextListToTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + char** /* list */, + int /* count */, + XICCEncodingStyle /* style */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern int XwcTextListToTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + wchar_t** /* list */, + int /* count */, + XICCEncodingStyle /* style */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern void XwcFreeStringList( +#if NeedFunctionPrototypes + wchar_t** /* list */ +#endif +); + +extern Status XTextPropertyToStringList( +#if NeedFunctionPrototypes + XTextProperty* /* text_prop */, + char*** /* list_return */, + int* /* count_return */ +#endif +); + +extern int XmbTextPropertyToTextList( +#if NeedFunctionPrototypes + Display* /* display */, + XTextProperty* /* text_prop */, + char*** /* list_return */, + int* /* count_return */ +#endif +); + +extern int XwcTextPropertyToTextList( +#if NeedFunctionPrototypes + Display* /* display */, + XTextProperty* /* text_prop */, + wchar_t*** /* list_return */, + int* /* count_return */ +#endif +); + +extern void XUnionRectWithRegion( +#if NeedFunctionPrototypes + XRectangle* /* rectangle */, + Region /* src_region */, + Region /* dest_region_return */ +#endif +); + +extern void XUnionRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +extern int XWMGeometry( +#if NeedFunctionPrototypes + Display* /* display */, + int /* screen_number */, + _Xconst char* /* user_geometry */, + _Xconst char* /* default_geometry */, + unsigned int /* border_width */, + XSizeHints* /* hints */, + int* /* x_return */, + int* /* y_return */, + int* /* width_return */, + int* /* height_return */, + int* /* gravity_return */ +#endif +); + +extern void XXorRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +_XFUNCPROTOEND + +#if defined(MAC_OSX_TK) +# undef Region +#endif + +#endif /* _XUTIL_H_ */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/cursorfont.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/cursorfont.h new file mode 100644 index 00000000..617274fa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/cursorfont.h @@ -0,0 +1,79 @@ +/* $XConsortium: cursorfont.h,v 1.2 88/09/06 16:44:27 jim Exp $ */ +#define XC_num_glyphs 154 +#define XC_X_cursor 0 +#define XC_arrow 2 +#define XC_based_arrow_down 4 +#define XC_based_arrow_up 6 +#define XC_boat 8 +#define XC_bogosity 10 +#define XC_bottom_left_corner 12 +#define XC_bottom_right_corner 14 +#define XC_bottom_side 16 +#define XC_bottom_tee 18 +#define XC_box_spiral 20 +#define XC_center_ptr 22 +#define XC_circle 24 +#define XC_clock 26 +#define XC_coffee_mug 28 +#define XC_cross 30 +#define XC_cross_reverse 32 +#define XC_crosshair 34 +#define XC_diamond_cross 36 +#define XC_dot 38 +#define XC_dotbox 40 +#define XC_double_arrow 42 +#define XC_draft_large 44 +#define XC_draft_small 46 +#define XC_draped_box 48 +#define XC_exchange 50 +#define XC_fleur 52 +#define XC_gobbler 54 +#define XC_gumby 56 +#define XC_hand1 58 +#define XC_hand2 60 +#define XC_heart 62 +#define XC_icon 64 +#define XC_iron_cross 66 +#define XC_left_ptr 68 +#define XC_left_side 70 +#define XC_left_tee 72 +#define XC_leftbutton 74 +#define XC_ll_angle 76 +#define XC_lr_angle 78 +#define XC_man 80 +#define XC_middlebutton 82 +#define XC_mouse 84 +#define XC_pencil 86 +#define XC_pirate 88 +#define XC_plus 90 +#define XC_question_arrow 92 +#define XC_right_ptr 94 +#define XC_right_side 96 +#define XC_right_tee 98 +#define XC_rightbutton 100 +#define XC_rtl_logo 102 +#define XC_sailboat 104 +#define XC_sb_down_arrow 106 +#define XC_sb_h_double_arrow 108 +#define XC_sb_left_arrow 110 +#define XC_sb_right_arrow 112 +#define XC_sb_up_arrow 114 +#define XC_sb_v_double_arrow 116 +#define XC_shuttle 118 +#define XC_sizing 120 +#define XC_spider 122 +#define XC_spraycan 124 +#define XC_star 126 +#define XC_target 128 +#define XC_tcross 130 +#define XC_top_left_arrow 132 +#define XC_top_left_corner 134 +#define XC_top_right_corner 136 +#define XC_top_side 138 +#define XC_top_tee 140 +#define XC_trek 142 +#define XC_ul_angle 144 +#define XC_umbrella 146 +#define XC_ur_angle 148 +#define XC_watch 150 +#define XC_xterm 152 diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/keysym.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/keysym.h new file mode 100644 index 00000000..550b76db --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/keysym.h @@ -0,0 +1,35 @@ +/* $XConsortium: keysym.h,v 1.13 91/03/13 20:09:49 rws Exp $ */ + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ + +/* default keysyms */ +#define XK_MISCELLANY +#define XK_LATIN1 +#define XK_LATIN2 +#define XK_LATIN3 +#define XK_LATIN4 +#define XK_GREEK + +#include diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/keysymdef.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/keysymdef.h new file mode 100644 index 00000000..b22d41b3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/keysymdef.h @@ -0,0 +1,1169 @@ +/* $XConsortium: keysymdef.h,v 1.15 93/04/02 10:57:36 rws Exp $ */ + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ + +#define XK_VoidSymbol 0xFFFFFF /* void symbol */ + +#ifdef XK_MISCELLANY +/* + * TTY Functions, cleverly chosen to map to ascii, for convenience of + * programming, but could have been arbitrary (at the cost of lookup + * tables in client code. + */ + +#define XK_BackSpace 0xFF08 /* back space, back char */ +#define XK_Tab 0xFF09 +#define XK_Linefeed 0xFF0A /* Linefeed, LF */ +#define XK_Clear 0xFF0B +#define XK_Return 0xFF0D /* Return, enter */ +#define XK_Pause 0xFF13 /* Pause, hold */ +#define XK_Scroll_Lock 0xFF14 +#define XK_Sys_Req 0xFF15 +#define XK_Escape 0xFF1B +#define XK_Delete 0xFFFF /* Delete, rubout */ + + + +/* International & multi-key character composition */ + +#define XK_Multi_key 0xFF20 /* Multi-key character compose */ + +/* Japanese keyboard support */ + +#define XK_Kanji 0xFF21 /* Kanji, Kanji convert */ +#define XK_Muhenkan 0xFF22 /* Cancel Conversion */ +#define XK_Henkan_Mode 0xFF23 /* Start/Stop Conversion */ +#define XK_Henkan 0xFF23 /* Alias for Henkan_Mode */ +#define XK_Romaji 0xFF24 /* to Romaji */ +#define XK_Hiragana 0xFF25 /* to Hiragana */ +#define XK_Katakana 0xFF26 /* to Katakana */ +#define XK_Hiragana_Katakana 0xFF27 /* Hiragana/Katakana toggle */ +#define XK_Zenkaku 0xFF28 /* to Zenkaku */ +#define XK_Hankaku 0xFF29 /* to Hankaku */ +#define XK_Zenkaku_Hankaku 0xFF2A /* Zenkaku/Hankaku toggle */ +#define XK_Touroku 0xFF2B /* Add to Dictionary */ +#define XK_Massyo 0xFF2C /* Delete from Dictionary */ +#define XK_Kana_Lock 0xFF2D /* Kana Lock */ +#define XK_Kana_Shift 0xFF2E /* Kana Shift */ +#define XK_Eisu_Shift 0xFF2F /* Alphanumeric Shift */ +#define XK_Eisu_toggle 0xFF30 /* Alphanumeric toggle */ + +/* Cursor control & motion */ + +#define XK_Home 0xFF50 +#define XK_Left 0xFF51 /* Move left, left arrow */ +#define XK_Up 0xFF52 /* Move up, up arrow */ +#define XK_Right 0xFF53 /* Move right, right arrow */ +#define XK_Down 0xFF54 /* Move down, down arrow */ +#define XK_Prior 0xFF55 /* Prior, previous */ +#define XK_Page_Up 0xFF55 +#define XK_Next 0xFF56 /* Next */ +#define XK_Page_Down 0xFF56 +#define XK_End 0xFF57 /* EOL */ +#define XK_Begin 0xFF58 /* BOL */ + +/* Special Windows keyboard keys */ + +#define XK_Win_L 0xFF5B /* Left-hand Windows */ +#define XK_Win_R 0xFF5C /* Right-hand Windows */ +#define XK_App 0xFF5D /* Menu key */ + +/* Misc Functions */ + +#define XK_Select 0xFF60 /* Select, mark */ +#define XK_Print 0xFF61 +#define XK_Execute 0xFF62 /* Execute, run, do */ +#define XK_Insert 0xFF63 /* Insert, insert here */ +#define XK_Undo 0xFF65 /* Undo, oops */ +#define XK_Redo 0xFF66 /* redo, again */ +#define XK_Menu 0xFF67 +#define XK_Find 0xFF68 /* Find, search */ +#define XK_Cancel 0xFF69 /* Cancel, stop, abort, exit */ +#define XK_Help 0xFF6A /* Help, ? */ +#define XK_Break 0xFF6B +#define XK_Mode_switch 0xFF7E /* Character set switch */ +#define XK_script_switch 0xFF7E /* Alias for mode_switch */ +#define XK_Num_Lock 0xFF7F + +/* Keypad Functions, keypad numbers cleverly chosen to map to ascii */ + +#define XK_KP_Space 0xFF80 /* space */ +#define XK_KP_Tab 0xFF89 +#define XK_KP_Enter 0xFF8D /* enter */ +#define XK_KP_F1 0xFF91 /* PF1, KP_A, ... */ +#define XK_KP_F2 0xFF92 +#define XK_KP_F3 0xFF93 +#define XK_KP_F4 0xFF94 +#define XK_KP_Home 0xFF95 +#define XK_KP_Left 0xFF96 +#define XK_KP_Up 0xFF97 +#define XK_KP_Right 0xFF98 +#define XK_KP_Down 0xFF99 +#define XK_KP_Prior 0xFF9A +#define XK_KP_Page_Up 0xFF9A +#define XK_KP_Next 0xFF9B +#define XK_KP_Page_Down 0xFF9B +#define XK_KP_End 0xFF9C +#define XK_KP_Begin 0xFF9D +#define XK_KP_Insert 0xFF9E +#define XK_KP_Delete 0xFF9F +#define XK_KP_Equal 0xFFBD /* equals */ +#define XK_KP_Multiply 0xFFAA +#define XK_KP_Add 0xFFAB +#define XK_KP_Separator 0xFFAC /* separator, often comma */ +#define XK_KP_Subtract 0xFFAD +#define XK_KP_Decimal 0xFFAE +#define XK_KP_Divide 0xFFAF + +#define XK_KP_0 0xFFB0 +#define XK_KP_1 0xFFB1 +#define XK_KP_2 0xFFB2 +#define XK_KP_3 0xFFB3 +#define XK_KP_4 0xFFB4 +#define XK_KP_5 0xFFB5 +#define XK_KP_6 0xFFB6 +#define XK_KP_7 0xFFB7 +#define XK_KP_8 0xFFB8 +#define XK_KP_9 0xFFB9 + + + +/* + * Auxilliary Functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufactures have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + +#define XK_F1 0xFFBE +#define XK_F2 0xFFBF +#define XK_F3 0xFFC0 +#define XK_F4 0xFFC1 +#define XK_F5 0xFFC2 +#define XK_F6 0xFFC3 +#define XK_F7 0xFFC4 +#define XK_F8 0xFFC5 +#define XK_F9 0xFFC6 +#define XK_F10 0xFFC7 +#define XK_F11 0xFFC8 +#define XK_L1 0xFFC8 +#define XK_F12 0xFFC9 +#define XK_L2 0xFFC9 +#define XK_F13 0xFFCA +#define XK_L3 0xFFCA +#define XK_F14 0xFFCB +#define XK_L4 0xFFCB +#define XK_F15 0xFFCC +#define XK_L5 0xFFCC +#define XK_F16 0xFFCD +#define XK_L6 0xFFCD +#define XK_F17 0xFFCE +#define XK_L7 0xFFCE +#define XK_F18 0xFFCF +#define XK_L8 0xFFCF +#define XK_F19 0xFFD0 +#define XK_L9 0xFFD0 +#define XK_F20 0xFFD1 +#define XK_L10 0xFFD1 +#define XK_F21 0xFFD2 +#define XK_R1 0xFFD2 +#define XK_F22 0xFFD3 +#define XK_R2 0xFFD3 +#define XK_F23 0xFFD4 +#define XK_R3 0xFFD4 +#define XK_F24 0xFFD5 +#define XK_R4 0xFFD5 +#define XK_F25 0xFFD6 +#define XK_R5 0xFFD6 +#define XK_F26 0xFFD7 +#define XK_R6 0xFFD7 +#define XK_F27 0xFFD8 +#define XK_R7 0xFFD8 +#define XK_F28 0xFFD9 +#define XK_R8 0xFFD9 +#define XK_F29 0xFFDA +#define XK_R9 0xFFDA +#define XK_F30 0xFFDB +#define XK_R10 0xFFDB +#define XK_F31 0xFFDC +#define XK_R11 0xFFDC +#define XK_F32 0xFFDD +#define XK_R12 0xFFDD +#define XK_F33 0xFFDE +#define XK_R13 0xFFDE +#define XK_F34 0xFFDF +#define XK_R14 0xFFDF +#define XK_F35 0xFFE0 +#define XK_R15 0xFFE0 + +/* Modifiers */ + +#define XK_Shift_L 0xFFE1 /* Left shift */ +#define XK_Shift_R 0xFFE2 /* Right shift */ +#define XK_Control_L 0xFFE3 /* Left control */ +#define XK_Control_R 0xFFE4 /* Right control */ +#define XK_Caps_Lock 0xFFE5 /* Caps lock */ +#define XK_Shift_Lock 0xFFE6 /* Shift lock */ + +#define XK_Meta_L 0xFFE7 /* Left meta */ +#define XK_Meta_R 0xFFE8 /* Right meta */ +#define XK_Alt_L 0xFFE9 /* Left alt */ +#define XK_Alt_R 0xFFEA /* Right alt */ +#define XK_Super_L 0xFFEB /* Left super */ +#define XK_Super_R 0xFFEC /* Right super */ +#define XK_Hyper_L 0xFFED /* Left hyper */ +#define XK_Hyper_R 0xFFEE /* Right hyper */ +#endif /* XK_MISCELLANY */ + +/* + * Latin 1 + * Byte 3 = 0 + */ +#ifdef XK_LATIN1 +#define XK_space 0x020 +#define XK_exclam 0x021 +#define XK_quotedbl 0x022 +#define XK_numbersign 0x023 +#define XK_dollar 0x024 +#define XK_percent 0x025 +#define XK_ampersand 0x026 +#define XK_apostrophe 0x027 +#define XK_quoteright 0x027 /* deprecated */ +#define XK_parenleft 0x028 +#define XK_parenright 0x029 +#define XK_asterisk 0x02a +#define XK_plus 0x02b +#define XK_comma 0x02c +#define XK_minus 0x02d +#define XK_period 0x02e +#define XK_slash 0x02f +#define XK_0 0x030 +#define XK_1 0x031 +#define XK_2 0x032 +#define XK_3 0x033 +#define XK_4 0x034 +#define XK_5 0x035 +#define XK_6 0x036 +#define XK_7 0x037 +#define XK_8 0x038 +#define XK_9 0x039 +#define XK_colon 0x03a +#define XK_semicolon 0x03b +#define XK_less 0x03c +#define XK_equal 0x03d +#define XK_greater 0x03e +#define XK_question 0x03f +#define XK_at 0x040 +#define XK_A 0x041 +#define XK_B 0x042 +#define XK_C 0x043 +#define XK_D 0x044 +#define XK_E 0x045 +#define XK_F 0x046 +#define XK_G 0x047 +#define XK_H 0x048 +#define XK_I 0x049 +#define XK_J 0x04a +#define XK_K 0x04b +#define XK_L 0x04c +#define XK_M 0x04d +#define XK_N 0x04e +#define XK_O 0x04f +#define XK_P 0x050 +#define XK_Q 0x051 +#define XK_R 0x052 +#define XK_S 0x053 +#define XK_T 0x054 +#define XK_U 0x055 +#define XK_V 0x056 +#define XK_W 0x057 +#define XK_X 0x058 +#define XK_Y 0x059 +#define XK_Z 0x05a +#define XK_bracketleft 0x05b +#define XK_backslash 0x05c +#define XK_bracketright 0x05d +#define XK_asciicircum 0x05e +#define XK_underscore 0x05f +#define XK_grave 0x060 +#define XK_quoteleft 0x060 /* deprecated */ +#define XK_a 0x061 +#define XK_b 0x062 +#define XK_c 0x063 +#define XK_d 0x064 +#define XK_e 0x065 +#define XK_f 0x066 +#define XK_g 0x067 +#define XK_h 0x068 +#define XK_i 0x069 +#define XK_j 0x06a +#define XK_k 0x06b +#define XK_l 0x06c +#define XK_m 0x06d +#define XK_n 0x06e +#define XK_o 0x06f +#define XK_p 0x070 +#define XK_q 0x071 +#define XK_r 0x072 +#define XK_s 0x073 +#define XK_t 0x074 +#define XK_u 0x075 +#define XK_v 0x076 +#define XK_w 0x077 +#define XK_x 0x078 +#define XK_y 0x079 +#define XK_z 0x07a +#define XK_braceleft 0x07b +#define XK_bar 0x07c +#define XK_braceright 0x07d +#define XK_asciitilde 0x07e + +#define XK_nobreakspace 0x0a0 +#define XK_exclamdown 0x0a1 +#define XK_cent 0x0a2 +#define XK_sterling 0x0a3 +#define XK_currency 0x0a4 +#define XK_yen 0x0a5 +#define XK_brokenbar 0x0a6 +#define XK_section 0x0a7 +#define XK_diaeresis 0x0a8 +#define XK_copyright 0x0a9 +#define XK_ordfeminine 0x0aa +#define XK_guillemotleft 0x0ab /* left angle quotation mark */ +#define XK_notsign 0x0ac +#define XK_hyphen 0x0ad +#define XK_registered 0x0ae +#define XK_macron 0x0af +#define XK_degree 0x0b0 +#define XK_plusminus 0x0b1 +#define XK_twosuperior 0x0b2 +#define XK_threesuperior 0x0b3 +#define XK_acute 0x0b4 +#define XK_mu 0x0b5 +#define XK_paragraph 0x0b6 +#define XK_periodcentered 0x0b7 +#define XK_cedilla 0x0b8 +#define XK_onesuperior 0x0b9 +#define XK_masculine 0x0ba +#define XK_guillemotright 0x0bb /* right angle quotation mark */ +#define XK_onequarter 0x0bc +#define XK_onehalf 0x0bd +#define XK_threequarters 0x0be +#define XK_questiondown 0x0bf +#define XK_Agrave 0x0c0 +#define XK_Aacute 0x0c1 +#define XK_Acircumflex 0x0c2 +#define XK_Atilde 0x0c3 +#define XK_Adiaeresis 0x0c4 +#define XK_Aring 0x0c5 +#define XK_AE 0x0c6 +#define XK_Ccedilla 0x0c7 +#define XK_Egrave 0x0c8 +#define XK_Eacute 0x0c9 +#define XK_Ecircumflex 0x0ca +#define XK_Ediaeresis 0x0cb +#define XK_Igrave 0x0cc +#define XK_Iacute 0x0cd +#define XK_Icircumflex 0x0ce +#define XK_Idiaeresis 0x0cf +#define XK_ETH 0x0d0 +#define XK_Eth 0x0d0 /* deprecated */ +#define XK_Ntilde 0x0d1 +#define XK_Ograve 0x0d2 +#define XK_Oacute 0x0d3 +#define XK_Ocircumflex 0x0d4 +#define XK_Otilde 0x0d5 +#define XK_Odiaeresis 0x0d6 +#define XK_multiply 0x0d7 +#define XK_Ooblique 0x0d8 +#define XK_Ugrave 0x0d9 +#define XK_Uacute 0x0da +#define XK_Ucircumflex 0x0db +#define XK_Udiaeresis 0x0dc +#define XK_Yacute 0x0dd +#define XK_THORN 0x0de +#define XK_Thorn 0x0de /* deprecated */ +#define XK_ssharp 0x0df +#define XK_agrave 0x0e0 +#define XK_aacute 0x0e1 +#define XK_acircumflex 0x0e2 +#define XK_atilde 0x0e3 +#define XK_adiaeresis 0x0e4 +#define XK_aring 0x0e5 +#define XK_ae 0x0e6 +#define XK_ccedilla 0x0e7 +#define XK_egrave 0x0e8 +#define XK_eacute 0x0e9 +#define XK_ecircumflex 0x0ea +#define XK_ediaeresis 0x0eb +#define XK_igrave 0x0ec +#define XK_iacute 0x0ed +#define XK_icircumflex 0x0ee +#define XK_idiaeresis 0x0ef +#define XK_eth 0x0f0 +#define XK_ntilde 0x0f1 +#define XK_ograve 0x0f2 +#define XK_oacute 0x0f3 +#define XK_ocircumflex 0x0f4 +#define XK_otilde 0x0f5 +#define XK_odiaeresis 0x0f6 +#define XK_division 0x0f7 +#define XK_oslash 0x0f8 +#define XK_ugrave 0x0f9 +#define XK_uacute 0x0fa +#define XK_ucircumflex 0x0fb +#define XK_udiaeresis 0x0fc +#define XK_yacute 0x0fd +#define XK_thorn 0x0fe +#define XK_ydiaeresis 0x0ff +#endif /* XK_LATIN1 */ + +/* + * Latin 2 + * Byte 3 = 1 + */ + +#ifdef XK_LATIN2 +#define XK_Aogonek 0x1a1 +#define XK_breve 0x1a2 +#define XK_Lstroke 0x1a3 +#define XK_Lcaron 0x1a5 +#define XK_Sacute 0x1a6 +#define XK_Scaron 0x1a9 +#define XK_Scedilla 0x1aa +#define XK_Tcaron 0x1ab +#define XK_Zacute 0x1ac +#define XK_Zcaron 0x1ae +#define XK_Zabovedot 0x1af +#define XK_aogonek 0x1b1 +#define XK_ogonek 0x1b2 +#define XK_lstroke 0x1b3 +#define XK_lcaron 0x1b5 +#define XK_sacute 0x1b6 +#define XK_caron 0x1b7 +#define XK_scaron 0x1b9 +#define XK_scedilla 0x1ba +#define XK_tcaron 0x1bb +#define XK_zacute 0x1bc +#define XK_doubleacute 0x1bd +#define XK_zcaron 0x1be +#define XK_zabovedot 0x1bf +#define XK_Racute 0x1c0 +#define XK_Abreve 0x1c3 +#define XK_Lacute 0x1c5 +#define XK_Cacute 0x1c6 +#define XK_Ccaron 0x1c8 +#define XK_Eogonek 0x1ca +#define XK_Ecaron 0x1cc +#define XK_Dcaron 0x1cf +#define XK_Dstroke 0x1d0 +#define XK_Nacute 0x1d1 +#define XK_Ncaron 0x1d2 +#define XK_Odoubleacute 0x1d5 +#define XK_Rcaron 0x1d8 +#define XK_Uring 0x1d9 +#define XK_Udoubleacute 0x1db +#define XK_Tcedilla 0x1de +#define XK_racute 0x1e0 +#define XK_abreve 0x1e3 +#define XK_lacute 0x1e5 +#define XK_cacute 0x1e6 +#define XK_ccaron 0x1e8 +#define XK_eogonek 0x1ea +#define XK_ecaron 0x1ec +#define XK_dcaron 0x1ef +#define XK_dstroke 0x1f0 +#define XK_nacute 0x1f1 +#define XK_ncaron 0x1f2 +#define XK_odoubleacute 0x1f5 +#define XK_udoubleacute 0x1fb +#define XK_rcaron 0x1f8 +#define XK_uring 0x1f9 +#define XK_tcedilla 0x1fe +#define XK_abovedot 0x1ff +#endif /* XK_LATIN2 */ + +/* + * Latin 3 + * Byte 3 = 2 + */ + +#ifdef XK_LATIN3 +#define XK_Hstroke 0x2a1 +#define XK_Hcircumflex 0x2a6 +#define XK_Iabovedot 0x2a9 +#define XK_Gbreve 0x2ab +#define XK_Jcircumflex 0x2ac +#define XK_hstroke 0x2b1 +#define XK_hcircumflex 0x2b6 +#define XK_idotless 0x2b9 +#define XK_gbreve 0x2bb +#define XK_jcircumflex 0x2bc +#define XK_Cabovedot 0x2c5 +#define XK_Ccircumflex 0x2c6 +#define XK_Gabovedot 0x2d5 +#define XK_Gcircumflex 0x2d8 +#define XK_Ubreve 0x2dd +#define XK_Scircumflex 0x2de +#define XK_cabovedot 0x2e5 +#define XK_ccircumflex 0x2e6 +#define XK_gabovedot 0x2f5 +#define XK_gcircumflex 0x2f8 +#define XK_ubreve 0x2fd +#define XK_scircumflex 0x2fe +#endif /* XK_LATIN3 */ + + +/* + * Latin 4 + * Byte 3 = 3 + */ + +#ifdef XK_LATIN4 +#define XK_kra 0x3a2 +#define XK_kappa 0x3a2 /* deprecated */ +#define XK_Rcedilla 0x3a3 +#define XK_Itilde 0x3a5 +#define XK_Lcedilla 0x3a6 +#define XK_Emacron 0x3aa +#define XK_Gcedilla 0x3ab +#define XK_Tslash 0x3ac +#define XK_rcedilla 0x3b3 +#define XK_itilde 0x3b5 +#define XK_lcedilla 0x3b6 +#define XK_emacron 0x3ba +#define XK_gcedilla 0x3bb +#define XK_tslash 0x3bc +#define XK_ENG 0x3bd +#define XK_eng 0x3bf +#define XK_Amacron 0x3c0 +#define XK_Iogonek 0x3c7 +#define XK_Eabovedot 0x3cc +#define XK_Imacron 0x3cf +#define XK_Ncedilla 0x3d1 +#define XK_Omacron 0x3d2 +#define XK_Kcedilla 0x3d3 +#define XK_Uogonek 0x3d9 +#define XK_Utilde 0x3dd +#define XK_Umacron 0x3de +#define XK_amacron 0x3e0 +#define XK_iogonek 0x3e7 +#define XK_eabovedot 0x3ec +#define XK_imacron 0x3ef +#define XK_ncedilla 0x3f1 +#define XK_omacron 0x3f2 +#define XK_kcedilla 0x3f3 +#define XK_uogonek 0x3f9 +#define XK_utilde 0x3fd +#define XK_umacron 0x3fe +#endif /* XK_LATIN4 */ + +/* + * Katakana + * Byte 3 = 4 + */ + +#ifdef XK_KATAKANA +#define XK_overline 0x47e +#define XK_kana_fullstop 0x4a1 +#define XK_kana_openingbracket 0x4a2 +#define XK_kana_closingbracket 0x4a3 +#define XK_kana_comma 0x4a4 +#define XK_kana_conjunctive 0x4a5 +#define XK_kana_middledot 0x4a5 /* deprecated */ +#define XK_kana_WO 0x4a6 +#define XK_kana_a 0x4a7 +#define XK_kana_i 0x4a8 +#define XK_kana_u 0x4a9 +#define XK_kana_e 0x4aa +#define XK_kana_o 0x4ab +#define XK_kana_ya 0x4ac +#define XK_kana_yu 0x4ad +#define XK_kana_yo 0x4ae +#define XK_kana_tsu 0x4af +#define XK_kana_tu 0x4af /* deprecated */ +#define XK_prolongedsound 0x4b0 +#define XK_kana_A 0x4b1 +#define XK_kana_I 0x4b2 +#define XK_kana_U 0x4b3 +#define XK_kana_E 0x4b4 +#define XK_kana_O 0x4b5 +#define XK_kana_KA 0x4b6 +#define XK_kana_KI 0x4b7 +#define XK_kana_KU 0x4b8 +#define XK_kana_KE 0x4b9 +#define XK_kana_KO 0x4ba +#define XK_kana_SA 0x4bb +#define XK_kana_SHI 0x4bc +#define XK_kana_SU 0x4bd +#define XK_kana_SE 0x4be +#define XK_kana_SO 0x4bf +#define XK_kana_TA 0x4c0 +#define XK_kana_CHI 0x4c1 +#define XK_kana_TI 0x4c1 /* deprecated */ +#define XK_kana_TSU 0x4c2 +#define XK_kana_TU 0x4c2 /* deprecated */ +#define XK_kana_TE 0x4c3 +#define XK_kana_TO 0x4c4 +#define XK_kana_NA 0x4c5 +#define XK_kana_NI 0x4c6 +#define XK_kana_NU 0x4c7 +#define XK_kana_NE 0x4c8 +#define XK_kana_NO 0x4c9 +#define XK_kana_HA 0x4ca +#define XK_kana_HI 0x4cb +#define XK_kana_FU 0x4cc +#define XK_kana_HU 0x4cc /* deprecated */ +#define XK_kana_HE 0x4cd +#define XK_kana_HO 0x4ce +#define XK_kana_MA 0x4cf +#define XK_kana_MI 0x4d0 +#define XK_kana_MU 0x4d1 +#define XK_kana_ME 0x4d2 +#define XK_kana_MO 0x4d3 +#define XK_kana_YA 0x4d4 +#define XK_kana_YU 0x4d5 +#define XK_kana_YO 0x4d6 +#define XK_kana_RA 0x4d7 +#define XK_kana_RI 0x4d8 +#define XK_kana_RU 0x4d9 +#define XK_kana_RE 0x4da +#define XK_kana_RO 0x4db +#define XK_kana_WA 0x4dc +#define XK_kana_N 0x4dd +#define XK_voicedsound 0x4de +#define XK_semivoicedsound 0x4df +#define XK_kana_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_KATAKANA */ + +/* + * Arabic + * Byte 3 = 5 + */ + +#ifdef XK_ARABIC +#define XK_Arabic_comma 0x5ac +#define XK_Arabic_semicolon 0x5bb +#define XK_Arabic_question_mark 0x5bf +#define XK_Arabic_hamza 0x5c1 +#define XK_Arabic_maddaonalef 0x5c2 +#define XK_Arabic_hamzaonalef 0x5c3 +#define XK_Arabic_hamzaonwaw 0x5c4 +#define XK_Arabic_hamzaunderalef 0x5c5 +#define XK_Arabic_hamzaonyeh 0x5c6 +#define XK_Arabic_alef 0x5c7 +#define XK_Arabic_beh 0x5c8 +#define XK_Arabic_tehmarbuta 0x5c9 +#define XK_Arabic_teh 0x5ca +#define XK_Arabic_theh 0x5cb +#define XK_Arabic_jeem 0x5cc +#define XK_Arabic_hah 0x5cd +#define XK_Arabic_khah 0x5ce +#define XK_Arabic_dal 0x5cf +#define XK_Arabic_thal 0x5d0 +#define XK_Arabic_ra 0x5d1 +#define XK_Arabic_zain 0x5d2 +#define XK_Arabic_seen 0x5d3 +#define XK_Arabic_sheen 0x5d4 +#define XK_Arabic_sad 0x5d5 +#define XK_Arabic_dad 0x5d6 +#define XK_Arabic_tah 0x5d7 +#define XK_Arabic_zah 0x5d8 +#define XK_Arabic_ain 0x5d9 +#define XK_Arabic_ghain 0x5da +#define XK_Arabic_tatweel 0x5e0 +#define XK_Arabic_feh 0x5e1 +#define XK_Arabic_qaf 0x5e2 +#define XK_Arabic_kaf 0x5e3 +#define XK_Arabic_lam 0x5e4 +#define XK_Arabic_meem 0x5e5 +#define XK_Arabic_noon 0x5e6 +#define XK_Arabic_ha 0x5e7 +#define XK_Arabic_heh 0x5e7 /* deprecated */ +#define XK_Arabic_waw 0x5e8 +#define XK_Arabic_alefmaksura 0x5e9 +#define XK_Arabic_yeh 0x5ea +#define XK_Arabic_fathatan 0x5eb +#define XK_Arabic_dammatan 0x5ec +#define XK_Arabic_kasratan 0x5ed +#define XK_Arabic_fatha 0x5ee +#define XK_Arabic_damma 0x5ef +#define XK_Arabic_kasra 0x5f0 +#define XK_Arabic_shadda 0x5f1 +#define XK_Arabic_sukun 0x5f2 +#define XK_Arabic_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_ARABIC */ + +/* + * Cyrillic + * Byte 3 = 6 + */ +#ifdef XK_CYRILLIC +#define XK_Serbian_dje 0x6a1 +#define XK_Macedonia_gje 0x6a2 +#define XK_Cyrillic_io 0x6a3 +#define XK_Ukrainian_ie 0x6a4 +#define XK_Ukranian_je 0x6a4 /* deprecated */ +#define XK_Macedonia_dse 0x6a5 +#define XK_Ukrainian_i 0x6a6 +#define XK_Ukranian_i 0x6a6 /* deprecated */ +#define XK_Ukrainian_yi 0x6a7 +#define XK_Ukranian_yi 0x6a7 /* deprecated */ +#define XK_Cyrillic_je 0x6a8 +#define XK_Serbian_je 0x6a8 /* deprecated */ +#define XK_Cyrillic_lje 0x6a9 +#define XK_Serbian_lje 0x6a9 /* deprecated */ +#define XK_Cyrillic_nje 0x6aa +#define XK_Serbian_nje 0x6aa /* deprecated */ +#define XK_Serbian_tshe 0x6ab +#define XK_Macedonia_kje 0x6ac +#define XK_Byelorussian_shortu 0x6ae +#define XK_Cyrillic_dzhe 0x6af +#define XK_Serbian_dze 0x6af /* deprecated */ +#define XK_numerosign 0x6b0 +#define XK_Serbian_DJE 0x6b1 +#define XK_Macedonia_GJE 0x6b2 +#define XK_Cyrillic_IO 0x6b3 +#define XK_Ukrainian_IE 0x6b4 +#define XK_Ukranian_JE 0x6b4 /* deprecated */ +#define XK_Macedonia_DSE 0x6b5 +#define XK_Ukrainian_I 0x6b6 +#define XK_Ukranian_I 0x6b6 /* deprecated */ +#define XK_Ukrainian_YI 0x6b7 +#define XK_Ukranian_YI 0x6b7 /* deprecated */ +#define XK_Cyrillic_JE 0x6b8 +#define XK_Serbian_JE 0x6b8 /* deprecated */ +#define XK_Cyrillic_LJE 0x6b9 +#define XK_Serbian_LJE 0x6b9 /* deprecated */ +#define XK_Cyrillic_NJE 0x6ba +#define XK_Serbian_NJE 0x6ba /* deprecated */ +#define XK_Serbian_TSHE 0x6bb +#define XK_Macedonia_KJE 0x6bc +#define XK_Byelorussian_SHORTU 0x6be +#define XK_Cyrillic_DZHE 0x6bf +#define XK_Serbian_DZE 0x6bf /* deprecated */ +#define XK_Cyrillic_yu 0x6c0 +#define XK_Cyrillic_a 0x6c1 +#define XK_Cyrillic_be 0x6c2 +#define XK_Cyrillic_tse 0x6c3 +#define XK_Cyrillic_de 0x6c4 +#define XK_Cyrillic_ie 0x6c5 +#define XK_Cyrillic_ef 0x6c6 +#define XK_Cyrillic_ghe 0x6c7 +#define XK_Cyrillic_ha 0x6c8 +#define XK_Cyrillic_i 0x6c9 +#define XK_Cyrillic_shorti 0x6ca +#define XK_Cyrillic_ka 0x6cb +#define XK_Cyrillic_el 0x6cc +#define XK_Cyrillic_em 0x6cd +#define XK_Cyrillic_en 0x6ce +#define XK_Cyrillic_o 0x6cf +#define XK_Cyrillic_pe 0x6d0 +#define XK_Cyrillic_ya 0x6d1 +#define XK_Cyrillic_er 0x6d2 +#define XK_Cyrillic_es 0x6d3 +#define XK_Cyrillic_te 0x6d4 +#define XK_Cyrillic_u 0x6d5 +#define XK_Cyrillic_zhe 0x6d6 +#define XK_Cyrillic_ve 0x6d7 +#define XK_Cyrillic_softsign 0x6d8 +#define XK_Cyrillic_yeru 0x6d9 +#define XK_Cyrillic_ze 0x6da +#define XK_Cyrillic_sha 0x6db +#define XK_Cyrillic_e 0x6dc +#define XK_Cyrillic_shcha 0x6dd +#define XK_Cyrillic_che 0x6de +#define XK_Cyrillic_hardsign 0x6df +#define XK_Cyrillic_YU 0x6e0 +#define XK_Cyrillic_A 0x6e1 +#define XK_Cyrillic_BE 0x6e2 +#define XK_Cyrillic_TSE 0x6e3 +#define XK_Cyrillic_DE 0x6e4 +#define XK_Cyrillic_IE 0x6e5 +#define XK_Cyrillic_EF 0x6e6 +#define XK_Cyrillic_GHE 0x6e7 +#define XK_Cyrillic_HA 0x6e8 +#define XK_Cyrillic_I 0x6e9 +#define XK_Cyrillic_SHORTI 0x6ea +#define XK_Cyrillic_KA 0x6eb +#define XK_Cyrillic_EL 0x6ec +#define XK_Cyrillic_EM 0x6ed +#define XK_Cyrillic_EN 0x6ee +#define XK_Cyrillic_O 0x6ef +#define XK_Cyrillic_PE 0x6f0 +#define XK_Cyrillic_YA 0x6f1 +#define XK_Cyrillic_ER 0x6f2 +#define XK_Cyrillic_ES 0x6f3 +#define XK_Cyrillic_TE 0x6f4 +#define XK_Cyrillic_U 0x6f5 +#define XK_Cyrillic_ZHE 0x6f6 +#define XK_Cyrillic_VE 0x6f7 +#define XK_Cyrillic_SOFTSIGN 0x6f8 +#define XK_Cyrillic_YERU 0x6f9 +#define XK_Cyrillic_ZE 0x6fa +#define XK_Cyrillic_SHA 0x6fb +#define XK_Cyrillic_E 0x6fc +#define XK_Cyrillic_SHCHA 0x6fd +#define XK_Cyrillic_CHE 0x6fe +#define XK_Cyrillic_HARDSIGN 0x6ff +#endif /* XK_CYRILLIC */ + +/* + * Greek + * Byte 3 = 7 + */ + +#ifdef XK_GREEK +#define XK_Greek_ALPHAaccent 0x7a1 +#define XK_Greek_EPSILONaccent 0x7a2 +#define XK_Greek_ETAaccent 0x7a3 +#define XK_Greek_IOTAaccent 0x7a4 +#define XK_Greek_IOTAdiaeresis 0x7a5 +#define XK_Greek_OMICRONaccent 0x7a7 +#define XK_Greek_UPSILONaccent 0x7a8 +#define XK_Greek_UPSILONdieresis 0x7a9 +#define XK_Greek_OMEGAaccent 0x7ab +#define XK_Greek_accentdieresis 0x7ae +#define XK_Greek_horizbar 0x7af +#define XK_Greek_alphaaccent 0x7b1 +#define XK_Greek_epsilonaccent 0x7b2 +#define XK_Greek_etaaccent 0x7b3 +#define XK_Greek_iotaaccent 0x7b4 +#define XK_Greek_iotadieresis 0x7b5 +#define XK_Greek_iotaaccentdieresis 0x7b6 +#define XK_Greek_omicronaccent 0x7b7 +#define XK_Greek_upsilonaccent 0x7b8 +#define XK_Greek_upsilondieresis 0x7b9 +#define XK_Greek_upsilonaccentdieresis 0x7ba +#define XK_Greek_omegaaccent 0x7bb +#define XK_Greek_ALPHA 0x7c1 +#define XK_Greek_BETA 0x7c2 +#define XK_Greek_GAMMA 0x7c3 +#define XK_Greek_DELTA 0x7c4 +#define XK_Greek_EPSILON 0x7c5 +#define XK_Greek_ZETA 0x7c6 +#define XK_Greek_ETA 0x7c7 +#define XK_Greek_THETA 0x7c8 +#define XK_Greek_IOTA 0x7c9 +#define XK_Greek_KAPPA 0x7ca +#define XK_Greek_LAMDA 0x7cb +#define XK_Greek_LAMBDA 0x7cb +#define XK_Greek_MU 0x7cc +#define XK_Greek_NU 0x7cd +#define XK_Greek_XI 0x7ce +#define XK_Greek_OMICRON 0x7cf +#define XK_Greek_PI 0x7d0 +#define XK_Greek_RHO 0x7d1 +#define XK_Greek_SIGMA 0x7d2 +#define XK_Greek_TAU 0x7d4 +#define XK_Greek_UPSILON 0x7d5 +#define XK_Greek_PHI 0x7d6 +#define XK_Greek_CHI 0x7d7 +#define XK_Greek_PSI 0x7d8 +#define XK_Greek_OMEGA 0x7d9 +#define XK_Greek_alpha 0x7e1 +#define XK_Greek_beta 0x7e2 +#define XK_Greek_gamma 0x7e3 +#define XK_Greek_delta 0x7e4 +#define XK_Greek_epsilon 0x7e5 +#define XK_Greek_zeta 0x7e6 +#define XK_Greek_eta 0x7e7 +#define XK_Greek_theta 0x7e8 +#define XK_Greek_iota 0x7e9 +#define XK_Greek_kappa 0x7ea +#define XK_Greek_lamda 0x7eb +#define XK_Greek_lambda 0x7eb +#define XK_Greek_mu 0x7ec +#define XK_Greek_nu 0x7ed +#define XK_Greek_xi 0x7ee +#define XK_Greek_omicron 0x7ef +#define XK_Greek_pi 0x7f0 +#define XK_Greek_rho 0x7f1 +#define XK_Greek_sigma 0x7f2 +#define XK_Greek_finalsmallsigma 0x7f3 +#define XK_Greek_tau 0x7f4 +#define XK_Greek_upsilon 0x7f5 +#define XK_Greek_phi 0x7f6 +#define XK_Greek_chi 0x7f7 +#define XK_Greek_psi 0x7f8 +#define XK_Greek_omega 0x7f9 +#define XK_Greek_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_GREEK */ + +/* + * Technical + * Byte 3 = 8 + */ + +#ifdef XK_TECHNICAL +#define XK_leftradical 0x8a1 +#define XK_topleftradical 0x8a2 +#define XK_horizconnector 0x8a3 +#define XK_topintegral 0x8a4 +#define XK_botintegral 0x8a5 +#define XK_vertconnector 0x8a6 +#define XK_topleftsqbracket 0x8a7 +#define XK_botleftsqbracket 0x8a8 +#define XK_toprightsqbracket 0x8a9 +#define XK_botrightsqbracket 0x8aa +#define XK_topleftparens 0x8ab +#define XK_botleftparens 0x8ac +#define XK_toprightparens 0x8ad +#define XK_botrightparens 0x8ae +#define XK_leftmiddlecurlybrace 0x8af +#define XK_rightmiddlecurlybrace 0x8b0 +#define XK_topleftsummation 0x8b1 +#define XK_botleftsummation 0x8b2 +#define XK_topvertsummationconnector 0x8b3 +#define XK_botvertsummationconnector 0x8b4 +#define XK_toprightsummation 0x8b5 +#define XK_botrightsummation 0x8b6 +#define XK_rightmiddlesummation 0x8b7 +#define XK_lessthanequal 0x8bc +#define XK_notequal 0x8bd +#define XK_greaterthanequal 0x8be +#define XK_integral 0x8bf +#define XK_therefore 0x8c0 +#define XK_variation 0x8c1 +#define XK_infinity 0x8c2 +#define XK_nabla 0x8c5 +#define XK_approximate 0x8c8 +#define XK_similarequal 0x8c9 +#define XK_ifonlyif 0x8cd +#define XK_implies 0x8ce +#define XK_identical 0x8cf +#define XK_radical 0x8d6 +#define XK_includedin 0x8da +#define XK_includes 0x8db +#define XK_intersection 0x8dc +#define XK_union 0x8dd +#define XK_logicaland 0x8de +#define XK_logicalor 0x8df +#define XK_partialderivative 0x8ef +#define XK_function 0x8f6 +#define XK_leftarrow 0x8fb +#define XK_uparrow 0x8fc +#define XK_rightarrow 0x8fd +#define XK_downarrow 0x8fe +#endif /* XK_TECHNICAL */ + +/* + * Special + * Byte 3 = 9 + */ + +#ifdef XK_SPECIAL +#define XK_blank 0x9df +#define XK_soliddiamond 0x9e0 +#define XK_checkerboard 0x9e1 +#define XK_ht 0x9e2 +#define XK_ff 0x9e3 +#define XK_cr 0x9e4 +#define XK_lf 0x9e5 +#define XK_nl 0x9e8 +#define XK_vt 0x9e9 +#define XK_lowrightcorner 0x9ea +#define XK_uprightcorner 0x9eb +#define XK_upleftcorner 0x9ec +#define XK_lowleftcorner 0x9ed +#define XK_crossinglines 0x9ee +#define XK_horizlinescan1 0x9ef +#define XK_horizlinescan3 0x9f0 +#define XK_horizlinescan5 0x9f1 +#define XK_horizlinescan7 0x9f2 +#define XK_horizlinescan9 0x9f3 +#define XK_leftt 0x9f4 +#define XK_rightt 0x9f5 +#define XK_bott 0x9f6 +#define XK_topt 0x9f7 +#define XK_vertbar 0x9f8 +#endif /* XK_SPECIAL */ + +/* + * Publishing + * Byte 3 = a + */ + +#ifdef XK_PUBLISHING +#define XK_emspace 0xaa1 +#define XK_enspace 0xaa2 +#define XK_em3space 0xaa3 +#define XK_em4space 0xaa4 +#define XK_digitspace 0xaa5 +#define XK_punctspace 0xaa6 +#define XK_thinspace 0xaa7 +#define XK_hairspace 0xaa8 +#define XK_emdash 0xaa9 +#define XK_endash 0xaaa +#define XK_signifblank 0xaac +#define XK_ellipsis 0xaae +#define XK_doubbaselinedot 0xaaf +#define XK_onethird 0xab0 +#define XK_twothirds 0xab1 +#define XK_onefifth 0xab2 +#define XK_twofifths 0xab3 +#define XK_threefifths 0xab4 +#define XK_fourfifths 0xab5 +#define XK_onesixth 0xab6 +#define XK_fivesixths 0xab7 +#define XK_careof 0xab8 +#define XK_figdash 0xabb +#define XK_leftanglebracket 0xabc +#define XK_decimalpoint 0xabd +#define XK_rightanglebracket 0xabe +#define XK_marker 0xabf +#define XK_oneeighth 0xac3 +#define XK_threeeighths 0xac4 +#define XK_fiveeighths 0xac5 +#define XK_seveneighths 0xac6 +#define XK_trademark 0xac9 +#define XK_signaturemark 0xaca +#define XK_trademarkincircle 0xacb +#define XK_leftopentriangle 0xacc +#define XK_rightopentriangle 0xacd +#define XK_emopencircle 0xace +#define XK_emopenrectangle 0xacf +#define XK_leftsinglequotemark 0xad0 +#define XK_rightsinglequotemark 0xad1 +#define XK_leftdoublequotemark 0xad2 +#define XK_rightdoublequotemark 0xad3 +#define XK_prescription 0xad4 +#define XK_minutes 0xad6 +#define XK_seconds 0xad7 +#define XK_latincross 0xad9 +#define XK_hexagram 0xada +#define XK_filledrectbullet 0xadb +#define XK_filledlefttribullet 0xadc +#define XK_filledrighttribullet 0xadd +#define XK_emfilledcircle 0xade +#define XK_emfilledrect 0xadf +#define XK_enopencircbullet 0xae0 +#define XK_enopensquarebullet 0xae1 +#define XK_openrectbullet 0xae2 +#define XK_opentribulletup 0xae3 +#define XK_opentribulletdown 0xae4 +#define XK_openstar 0xae5 +#define XK_enfilledcircbullet 0xae6 +#define XK_enfilledsqbullet 0xae7 +#define XK_filledtribulletup 0xae8 +#define XK_filledtribulletdown 0xae9 +#define XK_leftpointer 0xaea +#define XK_rightpointer 0xaeb +#define XK_club 0xaec +#define XK_diamond 0xaed +#define XK_heart 0xaee +#define XK_maltesecross 0xaf0 +#define XK_dagger 0xaf1 +#define XK_doubledagger 0xaf2 +#define XK_checkmark 0xaf3 +#define XK_ballotcross 0xaf4 +#define XK_musicalsharp 0xaf5 +#define XK_musicalflat 0xaf6 +#define XK_malesymbol 0xaf7 +#define XK_femalesymbol 0xaf8 +#define XK_telephone 0xaf9 +#define XK_telephonerecorder 0xafa +#define XK_phonographcopyright 0xafb +#define XK_caret 0xafc +#define XK_singlelowquotemark 0xafd +#define XK_doublelowquotemark 0xafe +#define XK_cursor 0xaff +#endif /* XK_PUBLISHING */ + +/* + * APL + * Byte 3 = b + */ + +#ifdef XK_APL +#define XK_leftcaret 0xba3 +#define XK_rightcaret 0xba6 +#define XK_downcaret 0xba8 +#define XK_upcaret 0xba9 +#define XK_overbar 0xbc0 +#define XK_downtack 0xbc2 +#define XK_upshoe 0xbc3 +#define XK_downstile 0xbc4 +#define XK_underbar 0xbc6 +#define XK_jot 0xbca +#define XK_quad 0xbcc +#define XK_uptack 0xbce +#define XK_circle 0xbcf +#define XK_upstile 0xbd3 +#define XK_downshoe 0xbd6 +#define XK_rightshoe 0xbd8 +#define XK_leftshoe 0xbda +#define XK_lefttack 0xbdc +#define XK_righttack 0xbfc +#endif /* XK_APL */ + +/* + * Hebrew + * Byte 3 = c + */ + +#ifdef XK_HEBREW +#define XK_hebrew_doublelowline 0xcdf +#define XK_hebrew_aleph 0xce0 +#define XK_hebrew_bet 0xce1 +#define XK_hebrew_beth 0xce1 /* deprecated */ +#define XK_hebrew_gimel 0xce2 +#define XK_hebrew_gimmel 0xce2 /* deprecated */ +#define XK_hebrew_dalet 0xce3 +#define XK_hebrew_daleth 0xce3 /* deprecated */ +#define XK_hebrew_he 0xce4 +#define XK_hebrew_waw 0xce5 +#define XK_hebrew_zain 0xce6 +#define XK_hebrew_zayin 0xce6 /* deprecated */ +#define XK_hebrew_chet 0xce7 +#define XK_hebrew_het 0xce7 /* deprecated */ +#define XK_hebrew_tet 0xce8 +#define XK_hebrew_teth 0xce8 /* deprecated */ +#define XK_hebrew_yod 0xce9 +#define XK_hebrew_finalkaph 0xcea +#define XK_hebrew_kaph 0xceb +#define XK_hebrew_lamed 0xcec +#define XK_hebrew_finalmem 0xced +#define XK_hebrew_mem 0xcee +#define XK_hebrew_finalnun 0xcef +#define XK_hebrew_nun 0xcf0 +#define XK_hebrew_samech 0xcf1 +#define XK_hebrew_samekh 0xcf1 /* deprecated */ +#define XK_hebrew_ayin 0xcf2 +#define XK_hebrew_finalpe 0xcf3 +#define XK_hebrew_pe 0xcf4 +#define XK_hebrew_finalzade 0xcf5 +#define XK_hebrew_finalzadi 0xcf5 /* deprecated */ +#define XK_hebrew_zade 0xcf6 +#define XK_hebrew_zadi 0xcf6 /* deprecated */ +#define XK_hebrew_qoph 0xcf7 +#define XK_hebrew_kuf 0xcf7 /* deprecated */ +#define XK_hebrew_resh 0xcf8 +#define XK_hebrew_shin 0xcf9 +#define XK_hebrew_taw 0xcfa +#define XK_hebrew_taf 0xcfa /* deprecated */ +#define XK_Hebrew_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_HEBREW */ + diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/tkIntXlibDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/tkIntXlibDecls.h new file mode 100644 index 00000000..b9785613 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/X11/tkIntXlibDecls.h @@ -0,0 +1,2370 @@ +/* + * tkIntXlibDecls.h -- + * + * This file contains the declarations for all platform dependent + * unsupported functions that are exported by the Tk library. These + * interfaces are not guaranteed to remain the same between + * versions. Use at your own risk. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * All rights reserved. + */ + +#ifndef _TKINTXLIBDECLS +#define _TKINTXLIBDECLS + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tkInt.decls script. + */ + +#ifdef MAC_TCL +#include "Xutil.h" +#else +#include "X11/Xutil.h" +#endif + +#ifdef BUILD_tk +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLEXPORT +#endif + +typedef int (*XAfterFunction) ( /* WARNING, this type not in Xlib spec */ + Display* /* display */ +); + +/* !BEGIN!: Do not edit below this line. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Exported function declarations: + */ + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ +#ifndef XSetDashes_TCL_DECLARED +#define XSetDashes_TCL_DECLARED +/* 0 */ +EXTERN int XSetDashes(Display *display, GC gc, int dash_offset, + _Xconst char *dash_list, int n); +#endif +#ifndef XGetModifierMapping_TCL_DECLARED +#define XGetModifierMapping_TCL_DECLARED +/* 1 */ +EXTERN XModifierKeymap * XGetModifierMapping(Display *d); +#endif +#ifndef XCreateImage_TCL_DECLARED +#define XCreateImage_TCL_DECLARED +/* 2 */ +EXTERN XImage * XCreateImage(Display *d, Visual *v, unsigned int ui1, + int i1, int i2, char *cp, unsigned int ui2, + unsigned int ui3, int i3, int i4); +#endif +#ifndef XGetImage_TCL_DECLARED +#define XGetImage_TCL_DECLARED +/* 3 */ +EXTERN XImage * XGetImage(Display *d, Drawable dr, int i1, int i2, + unsigned int ui1, unsigned int ui2, + unsigned long ul, int i3); +#endif +#ifndef XGetAtomName_TCL_DECLARED +#define XGetAtomName_TCL_DECLARED +/* 4 */ +EXTERN char * XGetAtomName(Display *d, Atom a); +#endif +#ifndef XKeysymToString_TCL_DECLARED +#define XKeysymToString_TCL_DECLARED +/* 5 */ +EXTERN char * XKeysymToString(KeySym k); +#endif +#ifndef XCreateColormap_TCL_DECLARED +#define XCreateColormap_TCL_DECLARED +/* 6 */ +EXTERN Colormap XCreateColormap(Display *d, Window w, Visual *v, + int i); +#endif +#ifndef XCreatePixmapCursor_TCL_DECLARED +#define XCreatePixmapCursor_TCL_DECLARED +/* 7 */ +EXTERN Cursor XCreatePixmapCursor(Display *d, Pixmap p1, Pixmap p2, + XColor *x1, XColor *x2, unsigned int ui1, + unsigned int ui2); +#endif +#ifndef XCreateGlyphCursor_TCL_DECLARED +#define XCreateGlyphCursor_TCL_DECLARED +/* 8 */ +EXTERN Cursor XCreateGlyphCursor(Display *d, Font f1, Font f2, + unsigned int ui1, unsigned int ui2, + XColor _Xconst *x1, XColor _Xconst *x2); +#endif +#ifndef XGContextFromGC_TCL_DECLARED +#define XGContextFromGC_TCL_DECLARED +/* 9 */ +EXTERN GContext XGContextFromGC(GC g); +#endif +#ifndef XListHosts_TCL_DECLARED +#define XListHosts_TCL_DECLARED +/* 10 */ +EXTERN XHostAddress * XListHosts(Display *d, int *i, Bool *b); +#endif +#ifndef XKeycodeToKeysym_TCL_DECLARED +#define XKeycodeToKeysym_TCL_DECLARED +/* 11 */ +EXTERN KeySym XKeycodeToKeysym(Display *d, unsigned int k, int i); +#endif +#ifndef XStringToKeysym_TCL_DECLARED +#define XStringToKeysym_TCL_DECLARED +/* 12 */ +EXTERN KeySym XStringToKeysym(_Xconst char *c); +#endif +#ifndef XRootWindow_TCL_DECLARED +#define XRootWindow_TCL_DECLARED +/* 13 */ +EXTERN Window XRootWindow(Display *d, int i); +#endif +#ifndef XSetErrorHandler_TCL_DECLARED +#define XSetErrorHandler_TCL_DECLARED +/* 14 */ +EXTERN XErrorHandler XSetErrorHandler(XErrorHandler x); +#endif +#ifndef XIconifyWindow_TCL_DECLARED +#define XIconifyWindow_TCL_DECLARED +/* 15 */ +EXTERN Status XIconifyWindow(Display *d, Window w, int i); +#endif +#ifndef XWithdrawWindow_TCL_DECLARED +#define XWithdrawWindow_TCL_DECLARED +/* 16 */ +EXTERN Status XWithdrawWindow(Display *d, Window w, int i); +#endif +#ifndef XGetWMColormapWindows_TCL_DECLARED +#define XGetWMColormapWindows_TCL_DECLARED +/* 17 */ +EXTERN Status XGetWMColormapWindows(Display *d, Window w, + Window **wpp, int *ip); +#endif +#ifndef XAllocColor_TCL_DECLARED +#define XAllocColor_TCL_DECLARED +/* 18 */ +EXTERN Status XAllocColor(Display *d, Colormap c, XColor *xp); +#endif +#ifndef XBell_TCL_DECLARED +#define XBell_TCL_DECLARED +/* 19 */ +EXTERN int XBell(Display *d, int i); +#endif +#ifndef XChangeProperty_TCL_DECLARED +#define XChangeProperty_TCL_DECLARED +/* 20 */ +EXTERN int XChangeProperty(Display *d, Window w, Atom a1, + Atom a2, int i1, int i2, + _Xconst unsigned char *c, int i3); +#endif +#ifndef XChangeWindowAttributes_TCL_DECLARED +#define XChangeWindowAttributes_TCL_DECLARED +/* 21 */ +EXTERN int XChangeWindowAttributes(Display *d, Window w, + unsigned long ul, XSetWindowAttributes *x); +#endif +#ifndef XClearWindow_TCL_DECLARED +#define XClearWindow_TCL_DECLARED +/* 22 */ +EXTERN int XClearWindow(Display *d, Window w); +#endif +#ifndef XConfigureWindow_TCL_DECLARED +#define XConfigureWindow_TCL_DECLARED +/* 23 */ +EXTERN int XConfigureWindow(Display *d, Window w, + unsigned int i, XWindowChanges *x); +#endif +#ifndef XCopyArea_TCL_DECLARED +#define XCopyArea_TCL_DECLARED +/* 24 */ +EXTERN int XCopyArea(Display *d, Drawable dr1, Drawable dr2, + GC g, int i1, int i2, unsigned int ui1, + unsigned int ui2, int i3, int i4); +#endif +#ifndef XCopyPlane_TCL_DECLARED +#define XCopyPlane_TCL_DECLARED +/* 25 */ +EXTERN int XCopyPlane(Display *d, Drawable dr1, Drawable dr2, + GC g, int i1, int i2, unsigned int ui1, + unsigned int ui2, int i3, int i4, + unsigned long ul); +#endif +#ifndef XCreateBitmapFromData_TCL_DECLARED +#define XCreateBitmapFromData_TCL_DECLARED +/* 26 */ +EXTERN Pixmap XCreateBitmapFromData(Display *display, Drawable d, + _Xconst char *data, unsigned int width, + unsigned int height); +#endif +#ifndef XDefineCursor_TCL_DECLARED +#define XDefineCursor_TCL_DECLARED +/* 27 */ +EXTERN int XDefineCursor(Display *d, Window w, Cursor c); +#endif +#ifndef XDeleteProperty_TCL_DECLARED +#define XDeleteProperty_TCL_DECLARED +/* 28 */ +EXTERN int XDeleteProperty(Display *d, Window w, Atom a); +#endif +#ifndef XDestroyWindow_TCL_DECLARED +#define XDestroyWindow_TCL_DECLARED +/* 29 */ +EXTERN int XDestroyWindow(Display *d, Window w); +#endif +#ifndef XDrawArc_TCL_DECLARED +#define XDrawArc_TCL_DECLARED +/* 30 */ +EXTERN int XDrawArc(Display *d, Drawable dr, GC g, int i1, + int i2, unsigned int ui1, unsigned int ui2, + int i3, int i4); +#endif +#ifndef XDrawLines_TCL_DECLARED +#define XDrawLines_TCL_DECLARED +/* 31 */ +EXTERN int XDrawLines(Display *d, Drawable dr, GC g, XPoint *x, + int i1, int i2); +#endif +#ifndef XDrawRectangle_TCL_DECLARED +#define XDrawRectangle_TCL_DECLARED +/* 32 */ +EXTERN int XDrawRectangle(Display *d, Drawable dr, GC g, int i1, + int i2, unsigned int ui1, unsigned int ui2); +#endif +#ifndef XFillArc_TCL_DECLARED +#define XFillArc_TCL_DECLARED +/* 33 */ +EXTERN int XFillArc(Display *d, Drawable dr, GC g, int i1, + int i2, unsigned int ui1, unsigned int ui2, + int i3, int i4); +#endif +#ifndef XFillPolygon_TCL_DECLARED +#define XFillPolygon_TCL_DECLARED +/* 34 */ +EXTERN int XFillPolygon(Display *d, Drawable dr, GC g, + XPoint *x, int i1, int i2, int i3); +#endif +#ifndef XFillRectangles_TCL_DECLARED +#define XFillRectangles_TCL_DECLARED +/* 35 */ +EXTERN int XFillRectangles(Display *d, Drawable dr, GC g, + XRectangle *x, int i); +#endif +#ifndef XForceScreenSaver_TCL_DECLARED +#define XForceScreenSaver_TCL_DECLARED +/* 36 */ +EXTERN int XForceScreenSaver(Display *d, int i); +#endif +#ifndef XFreeColormap_TCL_DECLARED +#define XFreeColormap_TCL_DECLARED +/* 37 */ +EXTERN int XFreeColormap(Display *d, Colormap c); +#endif +#ifndef XFreeColors_TCL_DECLARED +#define XFreeColors_TCL_DECLARED +/* 38 */ +EXTERN int XFreeColors(Display *d, Colormap c, + unsigned long *ulp, int i, unsigned long ul); +#endif +#ifndef XFreeCursor_TCL_DECLARED +#define XFreeCursor_TCL_DECLARED +/* 39 */ +EXTERN int XFreeCursor(Display *d, Cursor c); +#endif +#ifndef XFreeModifiermap_TCL_DECLARED +#define XFreeModifiermap_TCL_DECLARED +/* 40 */ +EXTERN int XFreeModifiermap(XModifierKeymap *x); +#endif +#ifndef XGetGeometry_TCL_DECLARED +#define XGetGeometry_TCL_DECLARED +/* 41 */ +EXTERN Status XGetGeometry(Display *d, Drawable dr, Window *w, + int *i1, int *i2, unsigned int *ui1, + unsigned int *ui2, unsigned int *ui3, + unsigned int *ui4); +#endif +#ifndef XGetInputFocus_TCL_DECLARED +#define XGetInputFocus_TCL_DECLARED +/* 42 */ +EXTERN int XGetInputFocus(Display *d, Window *w, int *i); +#endif +#ifndef XGetWindowProperty_TCL_DECLARED +#define XGetWindowProperty_TCL_DECLARED +/* 43 */ +EXTERN int XGetWindowProperty(Display *d, Window w, Atom a1, + long l1, long l2, Bool b, Atom a2, Atom *ap, + int *ip, unsigned long *ulp1, + unsigned long *ulp2, unsigned char **cpp); +#endif +#ifndef XGetWindowAttributes_TCL_DECLARED +#define XGetWindowAttributes_TCL_DECLARED +/* 44 */ +EXTERN Status XGetWindowAttributes(Display *d, Window w, + XWindowAttributes *x); +#endif +#ifndef XGrabKeyboard_TCL_DECLARED +#define XGrabKeyboard_TCL_DECLARED +/* 45 */ +EXTERN int XGrabKeyboard(Display *d, Window w, Bool b, int i1, + int i2, Time t); +#endif +#ifndef XGrabPointer_TCL_DECLARED +#define XGrabPointer_TCL_DECLARED +/* 46 */ +EXTERN int XGrabPointer(Display *d, Window w1, Bool b, + unsigned int ui, int i1, int i2, Window w2, + Cursor c, Time t); +#endif +#ifndef XKeysymToKeycode_TCL_DECLARED +#define XKeysymToKeycode_TCL_DECLARED +/* 47 */ +EXTERN KeyCode XKeysymToKeycode(Display *d, KeySym k); +#endif +#ifndef XLookupColor_TCL_DECLARED +#define XLookupColor_TCL_DECLARED +/* 48 */ +EXTERN Status XLookupColor(Display *d, Colormap c1, + _Xconst char *c2, XColor *x1, XColor *x2); +#endif +#ifndef XMapWindow_TCL_DECLARED +#define XMapWindow_TCL_DECLARED +/* 49 */ +EXTERN int XMapWindow(Display *d, Window w); +#endif +#ifndef XMoveResizeWindow_TCL_DECLARED +#define XMoveResizeWindow_TCL_DECLARED +/* 50 */ +EXTERN int XMoveResizeWindow(Display *d, Window w, int i1, + int i2, unsigned int ui1, unsigned int ui2); +#endif +#ifndef XMoveWindow_TCL_DECLARED +#define XMoveWindow_TCL_DECLARED +/* 51 */ +EXTERN int XMoveWindow(Display *d, Window w, int i1, int i2); +#endif +#ifndef XNextEvent_TCL_DECLARED +#define XNextEvent_TCL_DECLARED +/* 52 */ +EXTERN int XNextEvent(Display *d, XEvent *x); +#endif +#ifndef XPutBackEvent_TCL_DECLARED +#define XPutBackEvent_TCL_DECLARED +/* 53 */ +EXTERN int XPutBackEvent(Display *d, XEvent *x); +#endif +#ifndef XQueryColors_TCL_DECLARED +#define XQueryColors_TCL_DECLARED +/* 54 */ +EXTERN int XQueryColors(Display *d, Colormap c, XColor *x, + int i); +#endif +#ifndef XQueryPointer_TCL_DECLARED +#define XQueryPointer_TCL_DECLARED +/* 55 */ +EXTERN Bool XQueryPointer(Display *d, Window w1, Window *w2, + Window *w3, int *i1, int *i2, int *i3, + int *i4, unsigned int *ui); +#endif +#ifndef XQueryTree_TCL_DECLARED +#define XQueryTree_TCL_DECLARED +/* 56 */ +EXTERN Status XQueryTree(Display *d, Window w1, Window *w2, + Window *w3, Window **w4, unsigned int *ui); +#endif +#ifndef XRaiseWindow_TCL_DECLARED +#define XRaiseWindow_TCL_DECLARED +/* 57 */ +EXTERN int XRaiseWindow(Display *d, Window w); +#endif +#ifndef XRefreshKeyboardMapping_TCL_DECLARED +#define XRefreshKeyboardMapping_TCL_DECLARED +/* 58 */ +EXTERN int XRefreshKeyboardMapping(XMappingEvent *x); +#endif +#ifndef XResizeWindow_TCL_DECLARED +#define XResizeWindow_TCL_DECLARED +/* 59 */ +EXTERN int XResizeWindow(Display *d, Window w, unsigned int ui1, + unsigned int ui2); +#endif +#ifndef XSelectInput_TCL_DECLARED +#define XSelectInput_TCL_DECLARED +/* 60 */ +EXTERN int XSelectInput(Display *d, Window w, long l); +#endif +#ifndef XSendEvent_TCL_DECLARED +#define XSendEvent_TCL_DECLARED +/* 61 */ +EXTERN Status XSendEvent(Display *d, Window w, Bool b, long l, + XEvent *x); +#endif +#ifndef XSetCommand_TCL_DECLARED +#define XSetCommand_TCL_DECLARED +/* 62 */ +EXTERN int XSetCommand(Display *d, Window w, char **c, int i); +#endif +#ifndef XSetIconName_TCL_DECLARED +#define XSetIconName_TCL_DECLARED +/* 63 */ +EXTERN int XSetIconName(Display *d, Window w, _Xconst char *c); +#endif +#ifndef XSetInputFocus_TCL_DECLARED +#define XSetInputFocus_TCL_DECLARED +/* 64 */ +EXTERN int XSetInputFocus(Display *d, Window w, int i, Time t); +#endif +#ifndef XSetSelectionOwner_TCL_DECLARED +#define XSetSelectionOwner_TCL_DECLARED +/* 65 */ +EXTERN int XSetSelectionOwner(Display *d, Atom a, Window w, + Time t); +#endif +#ifndef XSetWindowBackground_TCL_DECLARED +#define XSetWindowBackground_TCL_DECLARED +/* 66 */ +EXTERN int XSetWindowBackground(Display *d, Window w, + unsigned long ul); +#endif +#ifndef XSetWindowBackgroundPixmap_TCL_DECLARED +#define XSetWindowBackgroundPixmap_TCL_DECLARED +/* 67 */ +EXTERN int XSetWindowBackgroundPixmap(Display *d, Window w, + Pixmap p); +#endif +#ifndef XSetWindowBorder_TCL_DECLARED +#define XSetWindowBorder_TCL_DECLARED +/* 68 */ +EXTERN int XSetWindowBorder(Display *d, Window w, + unsigned long ul); +#endif +#ifndef XSetWindowBorderPixmap_TCL_DECLARED +#define XSetWindowBorderPixmap_TCL_DECLARED +/* 69 */ +EXTERN int XSetWindowBorderPixmap(Display *d, Window w, + Pixmap p); +#endif +#ifndef XSetWindowBorderWidth_TCL_DECLARED +#define XSetWindowBorderWidth_TCL_DECLARED +/* 70 */ +EXTERN int XSetWindowBorderWidth(Display *d, Window w, + unsigned int ui); +#endif +#ifndef XSetWindowColormap_TCL_DECLARED +#define XSetWindowColormap_TCL_DECLARED +/* 71 */ +EXTERN int XSetWindowColormap(Display *d, Window w, Colormap c); +#endif +#ifndef XTranslateCoordinates_TCL_DECLARED +#define XTranslateCoordinates_TCL_DECLARED +/* 72 */ +EXTERN Bool XTranslateCoordinates(Display *d, Window w1, + Window w2, int i1, int i2, int *i3, int *i4, + Window *w3); +#endif +#ifndef XUngrabKeyboard_TCL_DECLARED +#define XUngrabKeyboard_TCL_DECLARED +/* 73 */ +EXTERN int XUngrabKeyboard(Display *d, Time t); +#endif +#ifndef XUngrabPointer_TCL_DECLARED +#define XUngrabPointer_TCL_DECLARED +/* 74 */ +EXTERN int XUngrabPointer(Display *d, Time t); +#endif +#ifndef XUnmapWindow_TCL_DECLARED +#define XUnmapWindow_TCL_DECLARED +/* 75 */ +EXTERN int XUnmapWindow(Display *d, Window w); +#endif +#ifndef XWindowEvent_TCL_DECLARED +#define XWindowEvent_TCL_DECLARED +/* 76 */ +EXTERN int XWindowEvent(Display *d, Window w, long l, XEvent *x); +#endif +#ifndef XDestroyIC_TCL_DECLARED +#define XDestroyIC_TCL_DECLARED +/* 77 */ +EXTERN void XDestroyIC(XIC x); +#endif +#ifndef XFilterEvent_TCL_DECLARED +#define XFilterEvent_TCL_DECLARED +/* 78 */ +EXTERN Bool XFilterEvent(XEvent *x, Window w); +#endif +#ifndef XmbLookupString_TCL_DECLARED +#define XmbLookupString_TCL_DECLARED +/* 79 */ +EXTERN int XmbLookupString(XIC xi, XKeyPressedEvent *xk, + char *c, int i, KeySym *k, Status *s); +#endif +#ifndef TkPutImage_TCL_DECLARED +#define TkPutImage_TCL_DECLARED +/* 80 */ +EXTERN int TkPutImage(unsigned long *colors, int ncolors, + Display *display, Drawable d, GC gc, + XImage *image, int src_x, int src_y, + int dest_x, int dest_y, unsigned int width, + unsigned int height); +#endif +/* Slot 81 is reserved */ +#ifndef XParseColor_TCL_DECLARED +#define XParseColor_TCL_DECLARED +/* 82 */ +EXTERN Status XParseColor(Display *display, Colormap map, + _Xconst char *spec, XColor *colorPtr); +#endif +#ifndef XCreateGC_TCL_DECLARED +#define XCreateGC_TCL_DECLARED +/* 83 */ +EXTERN GC XCreateGC(Display *display, Drawable d, + unsigned long valuemask, XGCValues *values); +#endif +#ifndef XFreeGC_TCL_DECLARED +#define XFreeGC_TCL_DECLARED +/* 84 */ +EXTERN int XFreeGC(Display *display, GC gc); +#endif +#ifndef XInternAtom_TCL_DECLARED +#define XInternAtom_TCL_DECLARED +/* 85 */ +EXTERN Atom XInternAtom(Display *display, + _Xconst char *atom_name, Bool only_if_exists); +#endif +#ifndef XSetBackground_TCL_DECLARED +#define XSetBackground_TCL_DECLARED +/* 86 */ +EXTERN int XSetBackground(Display *display, GC gc, + unsigned long foreground); +#endif +#ifndef XSetForeground_TCL_DECLARED +#define XSetForeground_TCL_DECLARED +/* 87 */ +EXTERN int XSetForeground(Display *display, GC gc, + unsigned long foreground); +#endif +#ifndef XSetClipMask_TCL_DECLARED +#define XSetClipMask_TCL_DECLARED +/* 88 */ +EXTERN int XSetClipMask(Display *display, GC gc, Pixmap pixmap); +#endif +#ifndef XSetClipOrigin_TCL_DECLARED +#define XSetClipOrigin_TCL_DECLARED +/* 89 */ +EXTERN int XSetClipOrigin(Display *display, GC gc, + int clip_x_origin, int clip_y_origin); +#endif +#ifndef XSetTSOrigin_TCL_DECLARED +#define XSetTSOrigin_TCL_DECLARED +/* 90 */ +EXTERN int XSetTSOrigin(Display *display, GC gc, + int ts_x_origin, int ts_y_origin); +#endif +#ifndef XChangeGC_TCL_DECLARED +#define XChangeGC_TCL_DECLARED +/* 91 */ +EXTERN int XChangeGC(Display *d, GC gc, unsigned long mask, + XGCValues *values); +#endif +#ifndef XSetFont_TCL_DECLARED +#define XSetFont_TCL_DECLARED +/* 92 */ +EXTERN int XSetFont(Display *display, GC gc, Font font); +#endif +#ifndef XSetArcMode_TCL_DECLARED +#define XSetArcMode_TCL_DECLARED +/* 93 */ +EXTERN int XSetArcMode(Display *display, GC gc, int arc_mode); +#endif +#ifndef XSetStipple_TCL_DECLARED +#define XSetStipple_TCL_DECLARED +/* 94 */ +EXTERN int XSetStipple(Display *display, GC gc, Pixmap stipple); +#endif +#ifndef XSetFillRule_TCL_DECLARED +#define XSetFillRule_TCL_DECLARED +/* 95 */ +EXTERN int XSetFillRule(Display *display, GC gc, int fill_rule); +#endif +#ifndef XSetFillStyle_TCL_DECLARED +#define XSetFillStyle_TCL_DECLARED +/* 96 */ +EXTERN int XSetFillStyle(Display *display, GC gc, + int fill_style); +#endif +#ifndef XSetFunction_TCL_DECLARED +#define XSetFunction_TCL_DECLARED +/* 97 */ +EXTERN int XSetFunction(Display *display, GC gc, int function); +#endif +#ifndef XSetLineAttributes_TCL_DECLARED +#define XSetLineAttributes_TCL_DECLARED +/* 98 */ +EXTERN int XSetLineAttributes(Display *display, GC gc, + unsigned int line_width, int line_style, + int cap_style, int join_style); +#endif +#ifndef _XInitImageFuncPtrs_TCL_DECLARED +#define _XInitImageFuncPtrs_TCL_DECLARED +/* 99 */ +EXTERN int _XInitImageFuncPtrs(XImage *image); +#endif +#ifndef XCreateIC_TCL_DECLARED +#define XCreateIC_TCL_DECLARED +/* 100 */ +EXTERN XIC XCreateIC(XIM xim, ...); +#endif +#ifndef XGetVisualInfo_TCL_DECLARED +#define XGetVisualInfo_TCL_DECLARED +/* 101 */ +EXTERN XVisualInfo * XGetVisualInfo(Display *display, long vinfo_mask, + XVisualInfo *vinfo_template, + int *nitems_return); +#endif +#ifndef XSetWMClientMachine_TCL_DECLARED +#define XSetWMClientMachine_TCL_DECLARED +/* 102 */ +EXTERN void XSetWMClientMachine(Display *display, Window w, + XTextProperty *text_prop); +#endif +#ifndef XStringListToTextProperty_TCL_DECLARED +#define XStringListToTextProperty_TCL_DECLARED +/* 103 */ +EXTERN Status XStringListToTextProperty(char **list, int count, + XTextProperty *text_prop_return); +#endif +#ifndef XDrawLine_TCL_DECLARED +#define XDrawLine_TCL_DECLARED +/* 104 */ +EXTERN int XDrawLine(Display *d, Drawable dr, GC g, int x1, + int y1, int x2, int y2); +#endif +#ifndef XWarpPointer_TCL_DECLARED +#define XWarpPointer_TCL_DECLARED +/* 105 */ +EXTERN int XWarpPointer(Display *d, Window s, Window dw, int sx, + int sy, unsigned int sw, unsigned int sh, + int dx, int dy); +#endif +#ifndef XFillRectangle_TCL_DECLARED +#define XFillRectangle_TCL_DECLARED +/* 106 */ +EXTERN int XFillRectangle(Display *display, Drawable d, GC gc, + int x, int y, unsigned int width, + unsigned int height); +#endif +#ifndef XFlush_TCL_DECLARED +#define XFlush_TCL_DECLARED +/* 107 */ +EXTERN int XFlush(Display *display); +#endif +#ifndef XGrabServer_TCL_DECLARED +#define XGrabServer_TCL_DECLARED +/* 108 */ +EXTERN int XGrabServer(Display *display); +#endif +#ifndef XUngrabServer_TCL_DECLARED +#define XUngrabServer_TCL_DECLARED +/* 109 */ +EXTERN int XUngrabServer(Display *display); +#endif +#ifndef XFree_TCL_DECLARED +#define XFree_TCL_DECLARED +/* 110 */ +EXTERN int XFree(VOID *data); +#endif +#ifndef XNoOp_TCL_DECLARED +#define XNoOp_TCL_DECLARED +/* 111 */ +EXTERN int XNoOp(Display *display); +#endif +#ifndef XSynchronize_TCL_DECLARED +#define XSynchronize_TCL_DECLARED +/* 112 */ +EXTERN XAfterFunction XSynchronize(Display *display, Bool onoff); +#endif +#ifndef XSync_TCL_DECLARED +#define XSync_TCL_DECLARED +/* 113 */ +EXTERN int XSync(Display *display, Bool discard); +#endif +#ifndef XVisualIDFromVisual_TCL_DECLARED +#define XVisualIDFromVisual_TCL_DECLARED +/* 114 */ +EXTERN VisualID XVisualIDFromVisual(Visual *visual); +#endif +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ +#ifndef XSetDashes_TCL_DECLARED +#define XSetDashes_TCL_DECLARED +/* 0 */ +EXTERN int XSetDashes(Display *display, GC gc, int dash_offset, + _Xconst char *dash_list, int n); +#endif +#ifndef XGetModifierMapping_TCL_DECLARED +#define XGetModifierMapping_TCL_DECLARED +/* 1 */ +EXTERN XModifierKeymap * XGetModifierMapping(Display *d); +#endif +#ifndef XCreateImage_TCL_DECLARED +#define XCreateImage_TCL_DECLARED +/* 2 */ +EXTERN XImage * XCreateImage(Display *d, Visual *v, unsigned int ui1, + int i1, int i2, char *cp, unsigned int ui2, + unsigned int ui3, int i3, int i4); +#endif +#ifndef XGetImage_TCL_DECLARED +#define XGetImage_TCL_DECLARED +/* 3 */ +EXTERN XImage * XGetImage(Display *d, Drawable dr, int i1, int i2, + unsigned int ui1, unsigned int ui2, + unsigned long ul, int i3); +#endif +#ifndef XGetAtomName_TCL_DECLARED +#define XGetAtomName_TCL_DECLARED +/* 4 */ +EXTERN char * XGetAtomName(Display *d, Atom a); +#endif +#ifndef XKeysymToString_TCL_DECLARED +#define XKeysymToString_TCL_DECLARED +/* 5 */ +EXTERN char * XKeysymToString(KeySym k); +#endif +#ifndef XCreateColormap_TCL_DECLARED +#define XCreateColormap_TCL_DECLARED +/* 6 */ +EXTERN Colormap XCreateColormap(Display *d, Window w, Visual *v, + int i); +#endif +#ifndef XGContextFromGC_TCL_DECLARED +#define XGContextFromGC_TCL_DECLARED +/* 7 */ +EXTERN GContext XGContextFromGC(GC g); +#endif +#ifndef XKeycodeToKeysym_TCL_DECLARED +#define XKeycodeToKeysym_TCL_DECLARED +/* 8 */ +EXTERN KeySym XKeycodeToKeysym(Display *d, KeyCode k, int i); +#endif +#ifndef XStringToKeysym_TCL_DECLARED +#define XStringToKeysym_TCL_DECLARED +/* 9 */ +EXTERN KeySym XStringToKeysym(_Xconst char *c); +#endif +#ifndef XRootWindow_TCL_DECLARED +#define XRootWindow_TCL_DECLARED +/* 10 */ +EXTERN Window XRootWindow(Display *d, int i); +#endif +#ifndef XSetErrorHandler_TCL_DECLARED +#define XSetErrorHandler_TCL_DECLARED +/* 11 */ +EXTERN XErrorHandler XSetErrorHandler(XErrorHandler x); +#endif +#ifndef XAllocColor_TCL_DECLARED +#define XAllocColor_TCL_DECLARED +/* 12 */ +EXTERN Status XAllocColor(Display *d, Colormap c, XColor *xp); +#endif +#ifndef XBell_TCL_DECLARED +#define XBell_TCL_DECLARED +/* 13 */ +EXTERN int XBell(Display *d, int i); +#endif +#ifndef XChangeProperty_TCL_DECLARED +#define XChangeProperty_TCL_DECLARED +/* 14 */ +EXTERN void XChangeProperty(Display *d, Window w, Atom a1, + Atom a2, int i1, int i2, + _Xconst unsigned char *c, int i3); +#endif +#ifndef XChangeWindowAttributes_TCL_DECLARED +#define XChangeWindowAttributes_TCL_DECLARED +/* 15 */ +EXTERN void XChangeWindowAttributes(Display *d, Window w, + unsigned long ul, XSetWindowAttributes *x); +#endif +#ifndef XConfigureWindow_TCL_DECLARED +#define XConfigureWindow_TCL_DECLARED +/* 16 */ +EXTERN void XConfigureWindow(Display *d, Window w, + unsigned int i, XWindowChanges *x); +#endif +#ifndef XCopyArea_TCL_DECLARED +#define XCopyArea_TCL_DECLARED +/* 17 */ +EXTERN void XCopyArea(Display *d, Drawable dr1, Drawable dr2, + GC g, int i1, int i2, unsigned int ui1, + unsigned int ui2, int i3, int i4); +#endif +#ifndef XCopyPlane_TCL_DECLARED +#define XCopyPlane_TCL_DECLARED +/* 18 */ +EXTERN void XCopyPlane(Display *d, Drawable dr1, Drawable dr2, + GC g, int i1, int i2, unsigned int ui1, + unsigned int ui2, int i3, int i4, + unsigned long ul); +#endif +#ifndef XCreateBitmapFromData_TCL_DECLARED +#define XCreateBitmapFromData_TCL_DECLARED +/* 19 */ +EXTERN Pixmap XCreateBitmapFromData(Display *display, Drawable d, + _Xconst char *data, unsigned int width, + unsigned int height); +#endif +#ifndef XDefineCursor_TCL_DECLARED +#define XDefineCursor_TCL_DECLARED +/* 20 */ +EXTERN int XDefineCursor(Display *d, Window w, Cursor c); +#endif +#ifndef XDestroyWindow_TCL_DECLARED +#define XDestroyWindow_TCL_DECLARED +/* 21 */ +EXTERN void XDestroyWindow(Display *d, Window w); +#endif +#ifndef XDrawArc_TCL_DECLARED +#define XDrawArc_TCL_DECLARED +/* 22 */ +EXTERN void XDrawArc(Display *d, Drawable dr, GC g, int i1, + int i2, unsigned int ui1, unsigned int ui2, + int i3, int i4); +#endif +#ifndef XDrawLines_TCL_DECLARED +#define XDrawLines_TCL_DECLARED +/* 23 */ +EXTERN int XDrawLines(Display *d, Drawable dr, GC g, XPoint *x, + int i1, int i2); +#endif +#ifndef XDrawRectangle_TCL_DECLARED +#define XDrawRectangle_TCL_DECLARED +/* 24 */ +EXTERN void XDrawRectangle(Display *d, Drawable dr, GC g, int i1, + int i2, unsigned int ui1, unsigned int ui2); +#endif +#ifndef XFillArc_TCL_DECLARED +#define XFillArc_TCL_DECLARED +/* 25 */ +EXTERN void XFillArc(Display *d, Drawable dr, GC g, int i1, + int i2, unsigned int ui1, unsigned int ui2, + int i3, int i4); +#endif +#ifndef XFillPolygon_TCL_DECLARED +#define XFillPolygon_TCL_DECLARED +/* 26 */ +EXTERN void XFillPolygon(Display *d, Drawable dr, GC g, + XPoint *x, int i1, int i2, int i3); +#endif +#ifndef XFillRectangles_TCL_DECLARED +#define XFillRectangles_TCL_DECLARED +/* 27 */ +EXTERN int XFillRectangles(Display *d, Drawable dr, GC g, + XRectangle *x, int i); +#endif +#ifndef XFreeColormap_TCL_DECLARED +#define XFreeColormap_TCL_DECLARED +/* 28 */ +EXTERN int XFreeColormap(Display *d, Colormap c); +#endif +#ifndef XFreeColors_TCL_DECLARED +#define XFreeColors_TCL_DECLARED +/* 29 */ +EXTERN int XFreeColors(Display *d, Colormap c, + unsigned long *ulp, int i, unsigned long ul); +#endif +#ifndef XFreeModifiermap_TCL_DECLARED +#define XFreeModifiermap_TCL_DECLARED +/* 30 */ +EXTERN int XFreeModifiermap(XModifierKeymap *x); +#endif +#ifndef XGetGeometry_TCL_DECLARED +#define XGetGeometry_TCL_DECLARED +/* 31 */ +EXTERN Status XGetGeometry(Display *d, Drawable dr, Window *w, + int *i1, int *i2, unsigned int *ui1, + unsigned int *ui2, unsigned int *ui3, + unsigned int *ui4); +#endif +#ifndef XGetWindowProperty_TCL_DECLARED +#define XGetWindowProperty_TCL_DECLARED +/* 32 */ +EXTERN int XGetWindowProperty(Display *d, Window w, Atom a1, + long l1, long l2, Bool b, Atom a2, Atom *ap, + int *ip, unsigned long *ulp1, + unsigned long *ulp2, unsigned char **cpp); +#endif +#ifndef XGrabKeyboard_TCL_DECLARED +#define XGrabKeyboard_TCL_DECLARED +/* 33 */ +EXTERN int XGrabKeyboard(Display *d, Window w, Bool b, int i1, + int i2, Time t); +#endif +#ifndef XGrabPointer_TCL_DECLARED +#define XGrabPointer_TCL_DECLARED +/* 34 */ +EXTERN int XGrabPointer(Display *d, Window w1, Bool b, + unsigned int ui, int i1, int i2, Window w2, + Cursor c, Time t); +#endif +#ifndef XKeysymToKeycode_TCL_DECLARED +#define XKeysymToKeycode_TCL_DECLARED +/* 35 */ +EXTERN KeyCode XKeysymToKeycode(Display *d, KeySym k); +#endif +#ifndef XMapWindow_TCL_DECLARED +#define XMapWindow_TCL_DECLARED +/* 36 */ +EXTERN void XMapWindow(Display *d, Window w); +#endif +#ifndef XMoveResizeWindow_TCL_DECLARED +#define XMoveResizeWindow_TCL_DECLARED +/* 37 */ +EXTERN void XMoveResizeWindow(Display *d, Window w, int i1, + int i2, unsigned int ui1, unsigned int ui2); +#endif +#ifndef XMoveWindow_TCL_DECLARED +#define XMoveWindow_TCL_DECLARED +/* 38 */ +EXTERN void XMoveWindow(Display *d, Window w, int i1, int i2); +#endif +#ifndef XQueryPointer_TCL_DECLARED +#define XQueryPointer_TCL_DECLARED +/* 39 */ +EXTERN Bool XQueryPointer(Display *d, Window w1, Window *w2, + Window *w3, int *i1, int *i2, int *i3, + int *i4, unsigned int *ui); +#endif +#ifndef XRaiseWindow_TCL_DECLARED +#define XRaiseWindow_TCL_DECLARED +/* 40 */ +EXTERN void XRaiseWindow(Display *d, Window w); +#endif +#ifndef XRefreshKeyboardMapping_TCL_DECLARED +#define XRefreshKeyboardMapping_TCL_DECLARED +/* 41 */ +EXTERN void XRefreshKeyboardMapping(XMappingEvent *x); +#endif +#ifndef XResizeWindow_TCL_DECLARED +#define XResizeWindow_TCL_DECLARED +/* 42 */ +EXTERN void XResizeWindow(Display *d, Window w, unsigned int ui1, + unsigned int ui2); +#endif +#ifndef XSelectInput_TCL_DECLARED +#define XSelectInput_TCL_DECLARED +/* 43 */ +EXTERN void XSelectInput(Display *d, Window w, long l); +#endif +#ifndef XSendEvent_TCL_DECLARED +#define XSendEvent_TCL_DECLARED +/* 44 */ +EXTERN Status XSendEvent(Display *d, Window w, Bool b, long l, + XEvent *x); +#endif +#ifndef XSetIconName_TCL_DECLARED +#define XSetIconName_TCL_DECLARED +/* 45 */ +EXTERN void XSetIconName(Display *d, Window w, _Xconst char *c); +#endif +#ifndef XSetInputFocus_TCL_DECLARED +#define XSetInputFocus_TCL_DECLARED +/* 46 */ +EXTERN void XSetInputFocus(Display *d, Window w, int i, Time t); +#endif +#ifndef XSetSelectionOwner_TCL_DECLARED +#define XSetSelectionOwner_TCL_DECLARED +/* 47 */ +EXTERN int XSetSelectionOwner(Display *d, Atom a, Window w, + Time t); +#endif +#ifndef XSetWindowBackground_TCL_DECLARED +#define XSetWindowBackground_TCL_DECLARED +/* 48 */ +EXTERN void XSetWindowBackground(Display *d, Window w, + unsigned long ul); +#endif +#ifndef XSetWindowBackgroundPixmap_TCL_DECLARED +#define XSetWindowBackgroundPixmap_TCL_DECLARED +/* 49 */ +EXTERN void XSetWindowBackgroundPixmap(Display *d, Window w, + Pixmap p); +#endif +#ifndef XSetWindowBorder_TCL_DECLARED +#define XSetWindowBorder_TCL_DECLARED +/* 50 */ +EXTERN void XSetWindowBorder(Display *d, Window w, + unsigned long ul); +#endif +#ifndef XSetWindowBorderPixmap_TCL_DECLARED +#define XSetWindowBorderPixmap_TCL_DECLARED +/* 51 */ +EXTERN void XSetWindowBorderPixmap(Display *d, Window w, + Pixmap p); +#endif +#ifndef XSetWindowBorderWidth_TCL_DECLARED +#define XSetWindowBorderWidth_TCL_DECLARED +/* 52 */ +EXTERN void XSetWindowBorderWidth(Display *d, Window w, + unsigned int ui); +#endif +#ifndef XSetWindowColormap_TCL_DECLARED +#define XSetWindowColormap_TCL_DECLARED +/* 53 */ +EXTERN void XSetWindowColormap(Display *d, Window w, Colormap c); +#endif +#ifndef XUngrabKeyboard_TCL_DECLARED +#define XUngrabKeyboard_TCL_DECLARED +/* 54 */ +EXTERN void XUngrabKeyboard(Display *d, Time t); +#endif +#ifndef XUngrabPointer_TCL_DECLARED +#define XUngrabPointer_TCL_DECLARED +/* 55 */ +EXTERN int XUngrabPointer(Display *d, Time t); +#endif +#ifndef XUnmapWindow_TCL_DECLARED +#define XUnmapWindow_TCL_DECLARED +/* 56 */ +EXTERN void XUnmapWindow(Display *d, Window w); +#endif +#ifndef TkPutImage_TCL_DECLARED +#define TkPutImage_TCL_DECLARED +/* 57 */ +EXTERN int TkPutImage(unsigned long *colors, int ncolors, + Display *display, Drawable d, GC gc, + XImage *image, int src_x, int src_y, + int dest_x, int dest_y, unsigned int width, + unsigned int height); +#endif +#ifndef XParseColor_TCL_DECLARED +#define XParseColor_TCL_DECLARED +/* 58 */ +EXTERN Status XParseColor(Display *display, Colormap map, + _Xconst char *spec, XColor *colorPtr); +#endif +#ifndef XCreateGC_TCL_DECLARED +#define XCreateGC_TCL_DECLARED +/* 59 */ +EXTERN GC XCreateGC(Display *display, Drawable d, + unsigned long valuemask, XGCValues *values); +#endif +#ifndef XFreeGC_TCL_DECLARED +#define XFreeGC_TCL_DECLARED +/* 60 */ +EXTERN int XFreeGC(Display *display, GC gc); +#endif +#ifndef XInternAtom_TCL_DECLARED +#define XInternAtom_TCL_DECLARED +/* 61 */ +EXTERN Atom XInternAtom(Display *display, + _Xconst char *atom_name, Bool only_if_exists); +#endif +#ifndef XSetBackground_TCL_DECLARED +#define XSetBackground_TCL_DECLARED +/* 62 */ +EXTERN int XSetBackground(Display *display, GC gc, + unsigned long foreground); +#endif +#ifndef XSetForeground_TCL_DECLARED +#define XSetForeground_TCL_DECLARED +/* 63 */ +EXTERN int XSetForeground(Display *display, GC gc, + unsigned long foreground); +#endif +#ifndef XSetClipMask_TCL_DECLARED +#define XSetClipMask_TCL_DECLARED +/* 64 */ +EXTERN int XSetClipMask(Display *display, GC gc, Pixmap pixmap); +#endif +#ifndef XSetClipOrigin_TCL_DECLARED +#define XSetClipOrigin_TCL_DECLARED +/* 65 */ +EXTERN int XSetClipOrigin(Display *display, GC gc, + int clip_x_origin, int clip_y_origin); +#endif +#ifndef XSetTSOrigin_TCL_DECLARED +#define XSetTSOrigin_TCL_DECLARED +/* 66 */ +EXTERN int XSetTSOrigin(Display *display, GC gc, + int ts_x_origin, int ts_y_origin); +#endif +#ifndef XChangeGC_TCL_DECLARED +#define XChangeGC_TCL_DECLARED +/* 67 */ +EXTERN int XChangeGC(Display *d, GC gc, unsigned long mask, + XGCValues *values); +#endif +#ifndef XSetFont_TCL_DECLARED +#define XSetFont_TCL_DECLARED +/* 68 */ +EXTERN int XSetFont(Display *display, GC gc, Font font); +#endif +#ifndef XSetArcMode_TCL_DECLARED +#define XSetArcMode_TCL_DECLARED +/* 69 */ +EXTERN int XSetArcMode(Display *display, GC gc, int arc_mode); +#endif +#ifndef XSetStipple_TCL_DECLARED +#define XSetStipple_TCL_DECLARED +/* 70 */ +EXTERN int XSetStipple(Display *display, GC gc, Pixmap stipple); +#endif +#ifndef XSetFillRule_TCL_DECLARED +#define XSetFillRule_TCL_DECLARED +/* 71 */ +EXTERN int XSetFillRule(Display *display, GC gc, int fill_rule); +#endif +#ifndef XSetFillStyle_TCL_DECLARED +#define XSetFillStyle_TCL_DECLARED +/* 72 */ +EXTERN int XSetFillStyle(Display *display, GC gc, + int fill_style); +#endif +#ifndef XSetFunction_TCL_DECLARED +#define XSetFunction_TCL_DECLARED +/* 73 */ +EXTERN int XSetFunction(Display *display, GC gc, int function); +#endif +#ifndef XSetLineAttributes_TCL_DECLARED +#define XSetLineAttributes_TCL_DECLARED +/* 74 */ +EXTERN int XSetLineAttributes(Display *display, GC gc, + unsigned int line_width, int line_style, + int cap_style, int join_style); +#endif +#ifndef _XInitImageFuncPtrs_TCL_DECLARED +#define _XInitImageFuncPtrs_TCL_DECLARED +/* 75 */ +EXTERN int _XInitImageFuncPtrs(XImage *image); +#endif +#ifndef XCreateIC_TCL_DECLARED +#define XCreateIC_TCL_DECLARED +/* 76 */ +EXTERN XIC XCreateIC(void); +#endif +#ifndef XGetVisualInfo_TCL_DECLARED +#define XGetVisualInfo_TCL_DECLARED +/* 77 */ +EXTERN XVisualInfo * XGetVisualInfo(Display *display, long vinfo_mask, + XVisualInfo *vinfo_template, + int *nitems_return); +#endif +#ifndef XSetWMClientMachine_TCL_DECLARED +#define XSetWMClientMachine_TCL_DECLARED +/* 78 */ +EXTERN void XSetWMClientMachine(Display *display, Window w, + XTextProperty *text_prop); +#endif +#ifndef XStringListToTextProperty_TCL_DECLARED +#define XStringListToTextProperty_TCL_DECLARED +/* 79 */ +EXTERN Status XStringListToTextProperty(char **list, int count, + XTextProperty *text_prop_return); +#endif +#ifndef XDrawSegments_TCL_DECLARED +#define XDrawSegments_TCL_DECLARED +/* 80 */ +EXTERN void XDrawSegments(Display *display, Drawable d, GC gc, + XSegment *segments, int nsegments); +#endif +#ifndef XForceScreenSaver_TCL_DECLARED +#define XForceScreenSaver_TCL_DECLARED +/* 81 */ +EXTERN void XForceScreenSaver(Display *display, int mode); +#endif +#ifndef XDrawLine_TCL_DECLARED +#define XDrawLine_TCL_DECLARED +/* 82 */ +EXTERN int XDrawLine(Display *d, Drawable dr, GC g, int x1, + int y1, int x2, int y2); +#endif +#ifndef XFillRectangle_TCL_DECLARED +#define XFillRectangle_TCL_DECLARED +/* 83 */ +EXTERN int XFillRectangle(Display *display, Drawable d, GC gc, + int x, int y, unsigned int width, + unsigned int height); +#endif +#ifndef XClearWindow_TCL_DECLARED +#define XClearWindow_TCL_DECLARED +/* 84 */ +EXTERN void XClearWindow(Display *d, Window w); +#endif +#ifndef XDrawPoint_TCL_DECLARED +#define XDrawPoint_TCL_DECLARED +/* 85 */ +EXTERN void XDrawPoint(Display *display, Drawable d, GC gc, + int x, int y); +#endif +#ifndef XDrawPoints_TCL_DECLARED +#define XDrawPoints_TCL_DECLARED +/* 86 */ +EXTERN void XDrawPoints(Display *display, Drawable d, GC gc, + XPoint *points, int npoints, int mode); +#endif +#ifndef XWarpPointer_TCL_DECLARED +#define XWarpPointer_TCL_DECLARED +/* 87 */ +EXTERN int XWarpPointer(Display *display, Window src_w, + Window dest_w, int src_x, int src_y, + unsigned int src_width, + unsigned int src_height, int dest_x, + int dest_y); +#endif +#ifndef XQueryColor_TCL_DECLARED +#define XQueryColor_TCL_DECLARED +/* 88 */ +EXTERN void XQueryColor(Display *display, Colormap colormap, + XColor *def_in_out); +#endif +#ifndef XQueryColors_TCL_DECLARED +#define XQueryColors_TCL_DECLARED +/* 89 */ +EXTERN void XQueryColors(Display *display, Colormap colormap, + XColor *defs_in_out, int ncolors); +#endif +#ifndef XQueryTree_TCL_DECLARED +#define XQueryTree_TCL_DECLARED +/* 90 */ +EXTERN Status XQueryTree(Display *d, Window w1, Window *w2, + Window *w3, Window **w4, unsigned int *ui); +#endif +#ifndef XSync_TCL_DECLARED +#define XSync_TCL_DECLARED +/* 91 */ +EXTERN int XSync(Display *display, Bool flag); +#endif +#endif /* AQUA */ + +typedef struct TkIntXlibStubs { + int magic; + struct TkIntXlibStubHooks *hooks; + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ + int (*xSetDashes) (Display *display, GC gc, int dash_offset, _Xconst char *dash_list, int n); /* 0 */ + XModifierKeymap * (*xGetModifierMapping) (Display *d); /* 1 */ + XImage * (*xCreateImage) (Display *d, Visual *v, unsigned int ui1, int i1, int i2, char *cp, unsigned int ui2, unsigned int ui3, int i3, int i4); /* 2 */ + XImage * (*xGetImage) (Display *d, Drawable dr, int i1, int i2, unsigned int ui1, unsigned int ui2, unsigned long ul, int i3); /* 3 */ + char * (*xGetAtomName) (Display *d, Atom a); /* 4 */ + char * (*xKeysymToString) (KeySym k); /* 5 */ + Colormap (*xCreateColormap) (Display *d, Window w, Visual *v, int i); /* 6 */ + Cursor (*xCreatePixmapCursor) (Display *d, Pixmap p1, Pixmap p2, XColor *x1, XColor *x2, unsigned int ui1, unsigned int ui2); /* 7 */ + Cursor (*xCreateGlyphCursor) (Display *d, Font f1, Font f2, unsigned int ui1, unsigned int ui2, XColor _Xconst *x1, XColor _Xconst *x2); /* 8 */ + GContext (*xGContextFromGC) (GC g); /* 9 */ + XHostAddress * (*xListHosts) (Display *d, int *i, Bool *b); /* 10 */ + KeySym (*xKeycodeToKeysym) (Display *d, unsigned int k, int i); /* 11 */ + KeySym (*xStringToKeysym) (_Xconst char *c); /* 12 */ + Window (*xRootWindow) (Display *d, int i); /* 13 */ + XErrorHandler (*xSetErrorHandler) (XErrorHandler x); /* 14 */ + Status (*xIconifyWindow) (Display *d, Window w, int i); /* 15 */ + Status (*xWithdrawWindow) (Display *d, Window w, int i); /* 16 */ + Status (*xGetWMColormapWindows) (Display *d, Window w, Window **wpp, int *ip); /* 17 */ + Status (*xAllocColor) (Display *d, Colormap c, XColor *xp); /* 18 */ + int (*xBell) (Display *d, int i); /* 19 */ + int (*xChangeProperty) (Display *d, Window w, Atom a1, Atom a2, int i1, int i2, _Xconst unsigned char *c, int i3); /* 20 */ + int (*xChangeWindowAttributes) (Display *d, Window w, unsigned long ul, XSetWindowAttributes *x); /* 21 */ + int (*xClearWindow) (Display *d, Window w); /* 22 */ + int (*xConfigureWindow) (Display *d, Window w, unsigned int i, XWindowChanges *x); /* 23 */ + int (*xCopyArea) (Display *d, Drawable dr1, Drawable dr2, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4); /* 24 */ + int (*xCopyPlane) (Display *d, Drawable dr1, Drawable dr2, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4, unsigned long ul); /* 25 */ + Pixmap (*xCreateBitmapFromData) (Display *display, Drawable d, _Xconst char *data, unsigned int width, unsigned int height); /* 26 */ + int (*xDefineCursor) (Display *d, Window w, Cursor c); /* 27 */ + int (*xDeleteProperty) (Display *d, Window w, Atom a); /* 28 */ + int (*xDestroyWindow) (Display *d, Window w); /* 29 */ + int (*xDrawArc) (Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4); /* 30 */ + int (*xDrawLines) (Display *d, Drawable dr, GC g, XPoint *x, int i1, int i2); /* 31 */ + int (*xDrawRectangle) (Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2); /* 32 */ + int (*xFillArc) (Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4); /* 33 */ + int (*xFillPolygon) (Display *d, Drawable dr, GC g, XPoint *x, int i1, int i2, int i3); /* 34 */ + int (*xFillRectangles) (Display *d, Drawable dr, GC g, XRectangle *x, int i); /* 35 */ + int (*xForceScreenSaver) (Display *d, int i); /* 36 */ + int (*xFreeColormap) (Display *d, Colormap c); /* 37 */ + int (*xFreeColors) (Display *d, Colormap c, unsigned long *ulp, int i, unsigned long ul); /* 38 */ + int (*xFreeCursor) (Display *d, Cursor c); /* 39 */ + int (*xFreeModifiermap) (XModifierKeymap *x); /* 40 */ + Status (*xGetGeometry) (Display *d, Drawable dr, Window *w, int *i1, int *i2, unsigned int *ui1, unsigned int *ui2, unsigned int *ui3, unsigned int *ui4); /* 41 */ + int (*xGetInputFocus) (Display *d, Window *w, int *i); /* 42 */ + int (*xGetWindowProperty) (Display *d, Window w, Atom a1, long l1, long l2, Bool b, Atom a2, Atom *ap, int *ip, unsigned long *ulp1, unsigned long *ulp2, unsigned char **cpp); /* 43 */ + Status (*xGetWindowAttributes) (Display *d, Window w, XWindowAttributes *x); /* 44 */ + int (*xGrabKeyboard) (Display *d, Window w, Bool b, int i1, int i2, Time t); /* 45 */ + int (*xGrabPointer) (Display *d, Window w1, Bool b, unsigned int ui, int i1, int i2, Window w2, Cursor c, Time t); /* 46 */ + KeyCode (*xKeysymToKeycode) (Display *d, KeySym k); /* 47 */ + Status (*xLookupColor) (Display *d, Colormap c1, _Xconst char *c2, XColor *x1, XColor *x2); /* 48 */ + int (*xMapWindow) (Display *d, Window w); /* 49 */ + int (*xMoveResizeWindow) (Display *d, Window w, int i1, int i2, unsigned int ui1, unsigned int ui2); /* 50 */ + int (*xMoveWindow) (Display *d, Window w, int i1, int i2); /* 51 */ + int (*xNextEvent) (Display *d, XEvent *x); /* 52 */ + int (*xPutBackEvent) (Display *d, XEvent *x); /* 53 */ + int (*xQueryColors) (Display *d, Colormap c, XColor *x, int i); /* 54 */ + Bool (*xQueryPointer) (Display *d, Window w1, Window *w2, Window *w3, int *i1, int *i2, int *i3, int *i4, unsigned int *ui); /* 55 */ + Status (*xQueryTree) (Display *d, Window w1, Window *w2, Window *w3, Window **w4, unsigned int *ui); /* 56 */ + int (*xRaiseWindow) (Display *d, Window w); /* 57 */ + int (*xRefreshKeyboardMapping) (XMappingEvent *x); /* 58 */ + int (*xResizeWindow) (Display *d, Window w, unsigned int ui1, unsigned int ui2); /* 59 */ + int (*xSelectInput) (Display *d, Window w, long l); /* 60 */ + Status (*xSendEvent) (Display *d, Window w, Bool b, long l, XEvent *x); /* 61 */ + int (*xSetCommand) (Display *d, Window w, char **c, int i); /* 62 */ + int (*xSetIconName) (Display *d, Window w, _Xconst char *c); /* 63 */ + int (*xSetInputFocus) (Display *d, Window w, int i, Time t); /* 64 */ + int (*xSetSelectionOwner) (Display *d, Atom a, Window w, Time t); /* 65 */ + int (*xSetWindowBackground) (Display *d, Window w, unsigned long ul); /* 66 */ + int (*xSetWindowBackgroundPixmap) (Display *d, Window w, Pixmap p); /* 67 */ + int (*xSetWindowBorder) (Display *d, Window w, unsigned long ul); /* 68 */ + int (*xSetWindowBorderPixmap) (Display *d, Window w, Pixmap p); /* 69 */ + int (*xSetWindowBorderWidth) (Display *d, Window w, unsigned int ui); /* 70 */ + int (*xSetWindowColormap) (Display *d, Window w, Colormap c); /* 71 */ + Bool (*xTranslateCoordinates) (Display *d, Window w1, Window w2, int i1, int i2, int *i3, int *i4, Window *w3); /* 72 */ + int (*xUngrabKeyboard) (Display *d, Time t); /* 73 */ + int (*xUngrabPointer) (Display *d, Time t); /* 74 */ + int (*xUnmapWindow) (Display *d, Window w); /* 75 */ + int (*xWindowEvent) (Display *d, Window w, long l, XEvent *x); /* 76 */ + void (*xDestroyIC) (XIC x); /* 77 */ + Bool (*xFilterEvent) (XEvent *x, Window w); /* 78 */ + int (*xmbLookupString) (XIC xi, XKeyPressedEvent *xk, char *c, int i, KeySym *k, Status *s); /* 79 */ + int (*tkPutImage) (unsigned long *colors, int ncolors, Display *display, Drawable d, GC gc, XImage *image, int src_x, int src_y, int dest_x, int dest_y, unsigned int width, unsigned int height); /* 80 */ + VOID *reserved81; + Status (*xParseColor) (Display *display, Colormap map, _Xconst char *spec, XColor *colorPtr); /* 82 */ + GC (*xCreateGC) (Display *display, Drawable d, unsigned long valuemask, XGCValues *values); /* 83 */ + int (*xFreeGC) (Display *display, GC gc); /* 84 */ + Atom (*xInternAtom) (Display *display, _Xconst char *atom_name, Bool only_if_exists); /* 85 */ + int (*xSetBackground) (Display *display, GC gc, unsigned long foreground); /* 86 */ + int (*xSetForeground) (Display *display, GC gc, unsigned long foreground); /* 87 */ + int (*xSetClipMask) (Display *display, GC gc, Pixmap pixmap); /* 88 */ + int (*xSetClipOrigin) (Display *display, GC gc, int clip_x_origin, int clip_y_origin); /* 89 */ + int (*xSetTSOrigin) (Display *display, GC gc, int ts_x_origin, int ts_y_origin); /* 90 */ + int (*xChangeGC) (Display *d, GC gc, unsigned long mask, XGCValues *values); /* 91 */ + int (*xSetFont) (Display *display, GC gc, Font font); /* 92 */ + int (*xSetArcMode) (Display *display, GC gc, int arc_mode); /* 93 */ + int (*xSetStipple) (Display *display, GC gc, Pixmap stipple); /* 94 */ + int (*xSetFillRule) (Display *display, GC gc, int fill_rule); /* 95 */ + int (*xSetFillStyle) (Display *display, GC gc, int fill_style); /* 96 */ + int (*xSetFunction) (Display *display, GC gc, int function); /* 97 */ + int (*xSetLineAttributes) (Display *display, GC gc, unsigned int line_width, int line_style, int cap_style, int join_style); /* 98 */ + int (*_XInitImageFuncPtrs) (XImage *image); /* 99 */ + XIC (*xCreateIC) (XIM xim, ...); /* 100 */ + XVisualInfo * (*xGetVisualInfo) (Display *display, long vinfo_mask, XVisualInfo *vinfo_template, int *nitems_return); /* 101 */ + void (*xSetWMClientMachine) (Display *display, Window w, XTextProperty *text_prop); /* 102 */ + Status (*xStringListToTextProperty) (char **list, int count, XTextProperty *text_prop_return); /* 103 */ + int (*xDrawLine) (Display *d, Drawable dr, GC g, int x1, int y1, int x2, int y2); /* 104 */ + int (*xWarpPointer) (Display *d, Window s, Window dw, int sx, int sy, unsigned int sw, unsigned int sh, int dx, int dy); /* 105 */ + int (*xFillRectangle) (Display *display, Drawable d, GC gc, int x, int y, unsigned int width, unsigned int height); /* 106 */ + int (*xFlush) (Display *display); /* 107 */ + int (*xGrabServer) (Display *display); /* 108 */ + int (*xUngrabServer) (Display *display); /* 109 */ + int (*xFree) (VOID *data); /* 110 */ + int (*xNoOp) (Display *display); /* 111 */ + XAfterFunction (*xSynchronize) (Display *display, Bool onoff); /* 112 */ + int (*xSync) (Display *display, Bool discard); /* 113 */ + VisualID (*xVisualIDFromVisual) (Visual *visual); /* 114 */ +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ + int (*xSetDashes) (Display *display, GC gc, int dash_offset, _Xconst char *dash_list, int n); /* 0 */ + XModifierKeymap * (*xGetModifierMapping) (Display *d); /* 1 */ + XImage * (*xCreateImage) (Display *d, Visual *v, unsigned int ui1, int i1, int i2, char *cp, unsigned int ui2, unsigned int ui3, int i3, int i4); /* 2 */ + XImage * (*xGetImage) (Display *d, Drawable dr, int i1, int i2, unsigned int ui1, unsigned int ui2, unsigned long ul, int i3); /* 3 */ + char * (*xGetAtomName) (Display *d, Atom a); /* 4 */ + char * (*xKeysymToString) (KeySym k); /* 5 */ + Colormap (*xCreateColormap) (Display *d, Window w, Visual *v, int i); /* 6 */ + GContext (*xGContextFromGC) (GC g); /* 7 */ + KeySym (*xKeycodeToKeysym) (Display *d, KeyCode k, int i); /* 8 */ + KeySym (*xStringToKeysym) (_Xconst char *c); /* 9 */ + Window (*xRootWindow) (Display *d, int i); /* 10 */ + XErrorHandler (*xSetErrorHandler) (XErrorHandler x); /* 11 */ + Status (*xAllocColor) (Display *d, Colormap c, XColor *xp); /* 12 */ + int (*xBell) (Display *d, int i); /* 13 */ + void (*xChangeProperty) (Display *d, Window w, Atom a1, Atom a2, int i1, int i2, _Xconst unsigned char *c, int i3); /* 14 */ + void (*xChangeWindowAttributes) (Display *d, Window w, unsigned long ul, XSetWindowAttributes *x); /* 15 */ + void (*xConfigureWindow) (Display *d, Window w, unsigned int i, XWindowChanges *x); /* 16 */ + void (*xCopyArea) (Display *d, Drawable dr1, Drawable dr2, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4); /* 17 */ + void (*xCopyPlane) (Display *d, Drawable dr1, Drawable dr2, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4, unsigned long ul); /* 18 */ + Pixmap (*xCreateBitmapFromData) (Display *display, Drawable d, _Xconst char *data, unsigned int width, unsigned int height); /* 19 */ + int (*xDefineCursor) (Display *d, Window w, Cursor c); /* 20 */ + void (*xDestroyWindow) (Display *d, Window w); /* 21 */ + void (*xDrawArc) (Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4); /* 22 */ + int (*xDrawLines) (Display *d, Drawable dr, GC g, XPoint *x, int i1, int i2); /* 23 */ + void (*xDrawRectangle) (Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2); /* 24 */ + void (*xFillArc) (Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4); /* 25 */ + void (*xFillPolygon) (Display *d, Drawable dr, GC g, XPoint *x, int i1, int i2, int i3); /* 26 */ + int (*xFillRectangles) (Display *d, Drawable dr, GC g, XRectangle *x, int i); /* 27 */ + int (*xFreeColormap) (Display *d, Colormap c); /* 28 */ + int (*xFreeColors) (Display *d, Colormap c, unsigned long *ulp, int i, unsigned long ul); /* 29 */ + int (*xFreeModifiermap) (XModifierKeymap *x); /* 30 */ + Status (*xGetGeometry) (Display *d, Drawable dr, Window *w, int *i1, int *i2, unsigned int *ui1, unsigned int *ui2, unsigned int *ui3, unsigned int *ui4); /* 31 */ + int (*xGetWindowProperty) (Display *d, Window w, Atom a1, long l1, long l2, Bool b, Atom a2, Atom *ap, int *ip, unsigned long *ulp1, unsigned long *ulp2, unsigned char **cpp); /* 32 */ + int (*xGrabKeyboard) (Display *d, Window w, Bool b, int i1, int i2, Time t); /* 33 */ + int (*xGrabPointer) (Display *d, Window w1, Bool b, unsigned int ui, int i1, int i2, Window w2, Cursor c, Time t); /* 34 */ + KeyCode (*xKeysymToKeycode) (Display *d, KeySym k); /* 35 */ + void (*xMapWindow) (Display *d, Window w); /* 36 */ + void (*xMoveResizeWindow) (Display *d, Window w, int i1, int i2, unsigned int ui1, unsigned int ui2); /* 37 */ + void (*xMoveWindow) (Display *d, Window w, int i1, int i2); /* 38 */ + Bool (*xQueryPointer) (Display *d, Window w1, Window *w2, Window *w3, int *i1, int *i2, int *i3, int *i4, unsigned int *ui); /* 39 */ + void (*xRaiseWindow) (Display *d, Window w); /* 40 */ + void (*xRefreshKeyboardMapping) (XMappingEvent *x); /* 41 */ + void (*xResizeWindow) (Display *d, Window w, unsigned int ui1, unsigned int ui2); /* 42 */ + void (*xSelectInput) (Display *d, Window w, long l); /* 43 */ + Status (*xSendEvent) (Display *d, Window w, Bool b, long l, XEvent *x); /* 44 */ + void (*xSetIconName) (Display *d, Window w, _Xconst char *c); /* 45 */ + void (*xSetInputFocus) (Display *d, Window w, int i, Time t); /* 46 */ + int (*xSetSelectionOwner) (Display *d, Atom a, Window w, Time t); /* 47 */ + void (*xSetWindowBackground) (Display *d, Window w, unsigned long ul); /* 48 */ + void (*xSetWindowBackgroundPixmap) (Display *d, Window w, Pixmap p); /* 49 */ + void (*xSetWindowBorder) (Display *d, Window w, unsigned long ul); /* 50 */ + void (*xSetWindowBorderPixmap) (Display *d, Window w, Pixmap p); /* 51 */ + void (*xSetWindowBorderWidth) (Display *d, Window w, unsigned int ui); /* 52 */ + void (*xSetWindowColormap) (Display *d, Window w, Colormap c); /* 53 */ + void (*xUngrabKeyboard) (Display *d, Time t); /* 54 */ + int (*xUngrabPointer) (Display *d, Time t); /* 55 */ + void (*xUnmapWindow) (Display *d, Window w); /* 56 */ + int (*tkPutImage) (unsigned long *colors, int ncolors, Display *display, Drawable d, GC gc, XImage *image, int src_x, int src_y, int dest_x, int dest_y, unsigned int width, unsigned int height); /* 57 */ + Status (*xParseColor) (Display *display, Colormap map, _Xconst char *spec, XColor *colorPtr); /* 58 */ + GC (*xCreateGC) (Display *display, Drawable d, unsigned long valuemask, XGCValues *values); /* 59 */ + int (*xFreeGC) (Display *display, GC gc); /* 60 */ + Atom (*xInternAtom) (Display *display, _Xconst char *atom_name, Bool only_if_exists); /* 61 */ + int (*xSetBackground) (Display *display, GC gc, unsigned long foreground); /* 62 */ + int (*xSetForeground) (Display *display, GC gc, unsigned long foreground); /* 63 */ + int (*xSetClipMask) (Display *display, GC gc, Pixmap pixmap); /* 64 */ + int (*xSetClipOrigin) (Display *display, GC gc, int clip_x_origin, int clip_y_origin); /* 65 */ + int (*xSetTSOrigin) (Display *display, GC gc, int ts_x_origin, int ts_y_origin); /* 66 */ + int (*xChangeGC) (Display *d, GC gc, unsigned long mask, XGCValues *values); /* 67 */ + int (*xSetFont) (Display *display, GC gc, Font font); /* 68 */ + int (*xSetArcMode) (Display *display, GC gc, int arc_mode); /* 69 */ + int (*xSetStipple) (Display *display, GC gc, Pixmap stipple); /* 70 */ + int (*xSetFillRule) (Display *display, GC gc, int fill_rule); /* 71 */ + int (*xSetFillStyle) (Display *display, GC gc, int fill_style); /* 72 */ + int (*xSetFunction) (Display *display, GC gc, int function); /* 73 */ + int (*xSetLineAttributes) (Display *display, GC gc, unsigned int line_width, int line_style, int cap_style, int join_style); /* 74 */ + int (*_XInitImageFuncPtrs) (XImage *image); /* 75 */ + XIC (*xCreateIC) (void); /* 76 */ + XVisualInfo * (*xGetVisualInfo) (Display *display, long vinfo_mask, XVisualInfo *vinfo_template, int *nitems_return); /* 77 */ + void (*xSetWMClientMachine) (Display *display, Window w, XTextProperty *text_prop); /* 78 */ + Status (*xStringListToTextProperty) (char **list, int count, XTextProperty *text_prop_return); /* 79 */ + void (*xDrawSegments) (Display *display, Drawable d, GC gc, XSegment *segments, int nsegments); /* 80 */ + void (*xForceScreenSaver) (Display *display, int mode); /* 81 */ + int (*xDrawLine) (Display *d, Drawable dr, GC g, int x1, int y1, int x2, int y2); /* 82 */ + int (*xFillRectangle) (Display *display, Drawable d, GC gc, int x, int y, unsigned int width, unsigned int height); /* 83 */ + void (*xClearWindow) (Display *d, Window w); /* 84 */ + void (*xDrawPoint) (Display *display, Drawable d, GC gc, int x, int y); /* 85 */ + void (*xDrawPoints) (Display *display, Drawable d, GC gc, XPoint *points, int npoints, int mode); /* 86 */ + int (*xWarpPointer) (Display *display, Window src_w, Window dest_w, int src_x, int src_y, unsigned int src_width, unsigned int src_height, int dest_x, int dest_y); /* 87 */ + void (*xQueryColor) (Display *display, Colormap colormap, XColor *def_in_out); /* 88 */ + void (*xQueryColors) (Display *display, Colormap colormap, XColor *defs_in_out, int ncolors); /* 89 */ + Status (*xQueryTree) (Display *d, Window w1, Window *w2, Window *w3, Window **w4, unsigned int *ui); /* 90 */ + int (*xSync) (Display *display, Bool flag); /* 91 */ +#endif /* AQUA */ +} TkIntXlibStubs; + +extern TkIntXlibStubs *tkIntXlibStubsPtr; + +#ifdef __cplusplus +} +#endif + +#if defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) + +/* + * Inline function declarations: + */ + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ +#ifndef XSetDashes +#define XSetDashes \ + (tkIntXlibStubsPtr->xSetDashes) /* 0 */ +#endif +#ifndef XGetModifierMapping +#define XGetModifierMapping \ + (tkIntXlibStubsPtr->xGetModifierMapping) /* 1 */ +#endif +#ifndef XCreateImage +#define XCreateImage \ + (tkIntXlibStubsPtr->xCreateImage) /* 2 */ +#endif +#ifndef XGetImage +#define XGetImage \ + (tkIntXlibStubsPtr->xGetImage) /* 3 */ +#endif +#ifndef XGetAtomName +#define XGetAtomName \ + (tkIntXlibStubsPtr->xGetAtomName) /* 4 */ +#endif +#ifndef XKeysymToString +#define XKeysymToString \ + (tkIntXlibStubsPtr->xKeysymToString) /* 5 */ +#endif +#ifndef XCreateColormap +#define XCreateColormap \ + (tkIntXlibStubsPtr->xCreateColormap) /* 6 */ +#endif +#ifndef XCreatePixmapCursor +#define XCreatePixmapCursor \ + (tkIntXlibStubsPtr->xCreatePixmapCursor) /* 7 */ +#endif +#ifndef XCreateGlyphCursor +#define XCreateGlyphCursor \ + (tkIntXlibStubsPtr->xCreateGlyphCursor) /* 8 */ +#endif +#ifndef XGContextFromGC +#define XGContextFromGC \ + (tkIntXlibStubsPtr->xGContextFromGC) /* 9 */ +#endif +#ifndef XListHosts +#define XListHosts \ + (tkIntXlibStubsPtr->xListHosts) /* 10 */ +#endif +#ifndef XKeycodeToKeysym +#define XKeycodeToKeysym \ + (tkIntXlibStubsPtr->xKeycodeToKeysym) /* 11 */ +#endif +#ifndef XStringToKeysym +#define XStringToKeysym \ + (tkIntXlibStubsPtr->xStringToKeysym) /* 12 */ +#endif +#ifndef XRootWindow +#define XRootWindow \ + (tkIntXlibStubsPtr->xRootWindow) /* 13 */ +#endif +#ifndef XSetErrorHandler +#define XSetErrorHandler \ + (tkIntXlibStubsPtr->xSetErrorHandler) /* 14 */ +#endif +#ifndef XIconifyWindow +#define XIconifyWindow \ + (tkIntXlibStubsPtr->xIconifyWindow) /* 15 */ +#endif +#ifndef XWithdrawWindow +#define XWithdrawWindow \ + (tkIntXlibStubsPtr->xWithdrawWindow) /* 16 */ +#endif +#ifndef XGetWMColormapWindows +#define XGetWMColormapWindows \ + (tkIntXlibStubsPtr->xGetWMColormapWindows) /* 17 */ +#endif +#ifndef XAllocColor +#define XAllocColor \ + (tkIntXlibStubsPtr->xAllocColor) /* 18 */ +#endif +#ifndef XBell +#define XBell \ + (tkIntXlibStubsPtr->xBell) /* 19 */ +#endif +#ifndef XChangeProperty +#define XChangeProperty \ + (tkIntXlibStubsPtr->xChangeProperty) /* 20 */ +#endif +#ifndef XChangeWindowAttributes +#define XChangeWindowAttributes \ + (tkIntXlibStubsPtr->xChangeWindowAttributes) /* 21 */ +#endif +#ifndef XClearWindow +#define XClearWindow \ + (tkIntXlibStubsPtr->xClearWindow) /* 22 */ +#endif +#ifndef XConfigureWindow +#define XConfigureWindow \ + (tkIntXlibStubsPtr->xConfigureWindow) /* 23 */ +#endif +#ifndef XCopyArea +#define XCopyArea \ + (tkIntXlibStubsPtr->xCopyArea) /* 24 */ +#endif +#ifndef XCopyPlane +#define XCopyPlane \ + (tkIntXlibStubsPtr->xCopyPlane) /* 25 */ +#endif +#ifndef XCreateBitmapFromData +#define XCreateBitmapFromData \ + (tkIntXlibStubsPtr->xCreateBitmapFromData) /* 26 */ +#endif +#ifndef XDefineCursor +#define XDefineCursor \ + (tkIntXlibStubsPtr->xDefineCursor) /* 27 */ +#endif +#ifndef XDeleteProperty +#define XDeleteProperty \ + (tkIntXlibStubsPtr->xDeleteProperty) /* 28 */ +#endif +#ifndef XDestroyWindow +#define XDestroyWindow \ + (tkIntXlibStubsPtr->xDestroyWindow) /* 29 */ +#endif +#ifndef XDrawArc +#define XDrawArc \ + (tkIntXlibStubsPtr->xDrawArc) /* 30 */ +#endif +#ifndef XDrawLines +#define XDrawLines \ + (tkIntXlibStubsPtr->xDrawLines) /* 31 */ +#endif +#ifndef XDrawRectangle +#define XDrawRectangle \ + (tkIntXlibStubsPtr->xDrawRectangle) /* 32 */ +#endif +#ifndef XFillArc +#define XFillArc \ + (tkIntXlibStubsPtr->xFillArc) /* 33 */ +#endif +#ifndef XFillPolygon +#define XFillPolygon \ + (tkIntXlibStubsPtr->xFillPolygon) /* 34 */ +#endif +#ifndef XFillRectangles +#define XFillRectangles \ + (tkIntXlibStubsPtr->xFillRectangles) /* 35 */ +#endif +#ifndef XForceScreenSaver +#define XForceScreenSaver \ + (tkIntXlibStubsPtr->xForceScreenSaver) /* 36 */ +#endif +#ifndef XFreeColormap +#define XFreeColormap \ + (tkIntXlibStubsPtr->xFreeColormap) /* 37 */ +#endif +#ifndef XFreeColors +#define XFreeColors \ + (tkIntXlibStubsPtr->xFreeColors) /* 38 */ +#endif +#ifndef XFreeCursor +#define XFreeCursor \ + (tkIntXlibStubsPtr->xFreeCursor) /* 39 */ +#endif +#ifndef XFreeModifiermap +#define XFreeModifiermap \ + (tkIntXlibStubsPtr->xFreeModifiermap) /* 40 */ +#endif +#ifndef XGetGeometry +#define XGetGeometry \ + (tkIntXlibStubsPtr->xGetGeometry) /* 41 */ +#endif +#ifndef XGetInputFocus +#define XGetInputFocus \ + (tkIntXlibStubsPtr->xGetInputFocus) /* 42 */ +#endif +#ifndef XGetWindowProperty +#define XGetWindowProperty \ + (tkIntXlibStubsPtr->xGetWindowProperty) /* 43 */ +#endif +#ifndef XGetWindowAttributes +#define XGetWindowAttributes \ + (tkIntXlibStubsPtr->xGetWindowAttributes) /* 44 */ +#endif +#ifndef XGrabKeyboard +#define XGrabKeyboard \ + (tkIntXlibStubsPtr->xGrabKeyboard) /* 45 */ +#endif +#ifndef XGrabPointer +#define XGrabPointer \ + (tkIntXlibStubsPtr->xGrabPointer) /* 46 */ +#endif +#ifndef XKeysymToKeycode +#define XKeysymToKeycode \ + (tkIntXlibStubsPtr->xKeysymToKeycode) /* 47 */ +#endif +#ifndef XLookupColor +#define XLookupColor \ + (tkIntXlibStubsPtr->xLookupColor) /* 48 */ +#endif +#ifndef XMapWindow +#define XMapWindow \ + (tkIntXlibStubsPtr->xMapWindow) /* 49 */ +#endif +#ifndef XMoveResizeWindow +#define XMoveResizeWindow \ + (tkIntXlibStubsPtr->xMoveResizeWindow) /* 50 */ +#endif +#ifndef XMoveWindow +#define XMoveWindow \ + (tkIntXlibStubsPtr->xMoveWindow) /* 51 */ +#endif +#ifndef XNextEvent +#define XNextEvent \ + (tkIntXlibStubsPtr->xNextEvent) /* 52 */ +#endif +#ifndef XPutBackEvent +#define XPutBackEvent \ + (tkIntXlibStubsPtr->xPutBackEvent) /* 53 */ +#endif +#ifndef XQueryColors +#define XQueryColors \ + (tkIntXlibStubsPtr->xQueryColors) /* 54 */ +#endif +#ifndef XQueryPointer +#define XQueryPointer \ + (tkIntXlibStubsPtr->xQueryPointer) /* 55 */ +#endif +#ifndef XQueryTree +#define XQueryTree \ + (tkIntXlibStubsPtr->xQueryTree) /* 56 */ +#endif +#ifndef XRaiseWindow +#define XRaiseWindow \ + (tkIntXlibStubsPtr->xRaiseWindow) /* 57 */ +#endif +#ifndef XRefreshKeyboardMapping +#define XRefreshKeyboardMapping \ + (tkIntXlibStubsPtr->xRefreshKeyboardMapping) /* 58 */ +#endif +#ifndef XResizeWindow +#define XResizeWindow \ + (tkIntXlibStubsPtr->xResizeWindow) /* 59 */ +#endif +#ifndef XSelectInput +#define XSelectInput \ + (tkIntXlibStubsPtr->xSelectInput) /* 60 */ +#endif +#ifndef XSendEvent +#define XSendEvent \ + (tkIntXlibStubsPtr->xSendEvent) /* 61 */ +#endif +#ifndef XSetCommand +#define XSetCommand \ + (tkIntXlibStubsPtr->xSetCommand) /* 62 */ +#endif +#ifndef XSetIconName +#define XSetIconName \ + (tkIntXlibStubsPtr->xSetIconName) /* 63 */ +#endif +#ifndef XSetInputFocus +#define XSetInputFocus \ + (tkIntXlibStubsPtr->xSetInputFocus) /* 64 */ +#endif +#ifndef XSetSelectionOwner +#define XSetSelectionOwner \ + (tkIntXlibStubsPtr->xSetSelectionOwner) /* 65 */ +#endif +#ifndef XSetWindowBackground +#define XSetWindowBackground \ + (tkIntXlibStubsPtr->xSetWindowBackground) /* 66 */ +#endif +#ifndef XSetWindowBackgroundPixmap +#define XSetWindowBackgroundPixmap \ + (tkIntXlibStubsPtr->xSetWindowBackgroundPixmap) /* 67 */ +#endif +#ifndef XSetWindowBorder +#define XSetWindowBorder \ + (tkIntXlibStubsPtr->xSetWindowBorder) /* 68 */ +#endif +#ifndef XSetWindowBorderPixmap +#define XSetWindowBorderPixmap \ + (tkIntXlibStubsPtr->xSetWindowBorderPixmap) /* 69 */ +#endif +#ifndef XSetWindowBorderWidth +#define XSetWindowBorderWidth \ + (tkIntXlibStubsPtr->xSetWindowBorderWidth) /* 70 */ +#endif +#ifndef XSetWindowColormap +#define XSetWindowColormap \ + (tkIntXlibStubsPtr->xSetWindowColormap) /* 71 */ +#endif +#ifndef XTranslateCoordinates +#define XTranslateCoordinates \ + (tkIntXlibStubsPtr->xTranslateCoordinates) /* 72 */ +#endif +#ifndef XUngrabKeyboard +#define XUngrabKeyboard \ + (tkIntXlibStubsPtr->xUngrabKeyboard) /* 73 */ +#endif +#ifndef XUngrabPointer +#define XUngrabPointer \ + (tkIntXlibStubsPtr->xUngrabPointer) /* 74 */ +#endif +#ifndef XUnmapWindow +#define XUnmapWindow \ + (tkIntXlibStubsPtr->xUnmapWindow) /* 75 */ +#endif +#ifndef XWindowEvent +#define XWindowEvent \ + (tkIntXlibStubsPtr->xWindowEvent) /* 76 */ +#endif +#ifndef XDestroyIC +#define XDestroyIC \ + (tkIntXlibStubsPtr->xDestroyIC) /* 77 */ +#endif +#ifndef XFilterEvent +#define XFilterEvent \ + (tkIntXlibStubsPtr->xFilterEvent) /* 78 */ +#endif +#ifndef XmbLookupString +#define XmbLookupString \ + (tkIntXlibStubsPtr->xmbLookupString) /* 79 */ +#endif +#ifndef TkPutImage +#define TkPutImage \ + (tkIntXlibStubsPtr->tkPutImage) /* 80 */ +#endif +/* Slot 81 is reserved */ +#ifndef XParseColor +#define XParseColor \ + (tkIntXlibStubsPtr->xParseColor) /* 82 */ +#endif +#ifndef XCreateGC +#define XCreateGC \ + (tkIntXlibStubsPtr->xCreateGC) /* 83 */ +#endif +#ifndef XFreeGC +#define XFreeGC \ + (tkIntXlibStubsPtr->xFreeGC) /* 84 */ +#endif +#ifndef XInternAtom +#define XInternAtom \ + (tkIntXlibStubsPtr->xInternAtom) /* 85 */ +#endif +#ifndef XSetBackground +#define XSetBackground \ + (tkIntXlibStubsPtr->xSetBackground) /* 86 */ +#endif +#ifndef XSetForeground +#define XSetForeground \ + (tkIntXlibStubsPtr->xSetForeground) /* 87 */ +#endif +#ifndef XSetClipMask +#define XSetClipMask \ + (tkIntXlibStubsPtr->xSetClipMask) /* 88 */ +#endif +#ifndef XSetClipOrigin +#define XSetClipOrigin \ + (tkIntXlibStubsPtr->xSetClipOrigin) /* 89 */ +#endif +#ifndef XSetTSOrigin +#define XSetTSOrigin \ + (tkIntXlibStubsPtr->xSetTSOrigin) /* 90 */ +#endif +#ifndef XChangeGC +#define XChangeGC \ + (tkIntXlibStubsPtr->xChangeGC) /* 91 */ +#endif +#ifndef XSetFont +#define XSetFont \ + (tkIntXlibStubsPtr->xSetFont) /* 92 */ +#endif +#ifndef XSetArcMode +#define XSetArcMode \ + (tkIntXlibStubsPtr->xSetArcMode) /* 93 */ +#endif +#ifndef XSetStipple +#define XSetStipple \ + (tkIntXlibStubsPtr->xSetStipple) /* 94 */ +#endif +#ifndef XSetFillRule +#define XSetFillRule \ + (tkIntXlibStubsPtr->xSetFillRule) /* 95 */ +#endif +#ifndef XSetFillStyle +#define XSetFillStyle \ + (tkIntXlibStubsPtr->xSetFillStyle) /* 96 */ +#endif +#ifndef XSetFunction +#define XSetFunction \ + (tkIntXlibStubsPtr->xSetFunction) /* 97 */ +#endif +#ifndef XSetLineAttributes +#define XSetLineAttributes \ + (tkIntXlibStubsPtr->xSetLineAttributes) /* 98 */ +#endif +#ifndef _XInitImageFuncPtrs +#define _XInitImageFuncPtrs \ + (tkIntXlibStubsPtr->_XInitImageFuncPtrs) /* 99 */ +#endif +#ifndef XCreateIC +#define XCreateIC \ + (tkIntXlibStubsPtr->xCreateIC) /* 100 */ +#endif +#ifndef XGetVisualInfo +#define XGetVisualInfo \ + (tkIntXlibStubsPtr->xGetVisualInfo) /* 101 */ +#endif +#ifndef XSetWMClientMachine +#define XSetWMClientMachine \ + (tkIntXlibStubsPtr->xSetWMClientMachine) /* 102 */ +#endif +#ifndef XStringListToTextProperty +#define XStringListToTextProperty \ + (tkIntXlibStubsPtr->xStringListToTextProperty) /* 103 */ +#endif +#ifndef XDrawLine +#define XDrawLine \ + (tkIntXlibStubsPtr->xDrawLine) /* 104 */ +#endif +#ifndef XWarpPointer +#define XWarpPointer \ + (tkIntXlibStubsPtr->xWarpPointer) /* 105 */ +#endif +#ifndef XFillRectangle +#define XFillRectangle \ + (tkIntXlibStubsPtr->xFillRectangle) /* 106 */ +#endif +#ifndef XFlush +#define XFlush \ + (tkIntXlibStubsPtr->xFlush) /* 107 */ +#endif +#ifndef XGrabServer +#define XGrabServer \ + (tkIntXlibStubsPtr->xGrabServer) /* 108 */ +#endif +#ifndef XUngrabServer +#define XUngrabServer \ + (tkIntXlibStubsPtr->xUngrabServer) /* 109 */ +#endif +#ifndef XFree +#define XFree \ + (tkIntXlibStubsPtr->xFree) /* 110 */ +#endif +#ifndef XNoOp +#define XNoOp \ + (tkIntXlibStubsPtr->xNoOp) /* 111 */ +#endif +#ifndef XSynchronize +#define XSynchronize \ + (tkIntXlibStubsPtr->xSynchronize) /* 112 */ +#endif +#ifndef XSync +#define XSync \ + (tkIntXlibStubsPtr->xSync) /* 113 */ +#endif +#ifndef XVisualIDFromVisual +#define XVisualIDFromVisual \ + (tkIntXlibStubsPtr->xVisualIDFromVisual) /* 114 */ +#endif +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ +#ifndef XSetDashes +#define XSetDashes \ + (tkIntXlibStubsPtr->xSetDashes) /* 0 */ +#endif +#ifndef XGetModifierMapping +#define XGetModifierMapping \ + (tkIntXlibStubsPtr->xGetModifierMapping) /* 1 */ +#endif +#ifndef XCreateImage +#define XCreateImage \ + (tkIntXlibStubsPtr->xCreateImage) /* 2 */ +#endif +#ifndef XGetImage +#define XGetImage \ + (tkIntXlibStubsPtr->xGetImage) /* 3 */ +#endif +#ifndef XGetAtomName +#define XGetAtomName \ + (tkIntXlibStubsPtr->xGetAtomName) /* 4 */ +#endif +#ifndef XKeysymToString +#define XKeysymToString \ + (tkIntXlibStubsPtr->xKeysymToString) /* 5 */ +#endif +#ifndef XCreateColormap +#define XCreateColormap \ + (tkIntXlibStubsPtr->xCreateColormap) /* 6 */ +#endif +#ifndef XGContextFromGC +#define XGContextFromGC \ + (tkIntXlibStubsPtr->xGContextFromGC) /* 7 */ +#endif +#ifndef XKeycodeToKeysym +#define XKeycodeToKeysym \ + (tkIntXlibStubsPtr->xKeycodeToKeysym) /* 8 */ +#endif +#ifndef XStringToKeysym +#define XStringToKeysym \ + (tkIntXlibStubsPtr->xStringToKeysym) /* 9 */ +#endif +#ifndef XRootWindow +#define XRootWindow \ + (tkIntXlibStubsPtr->xRootWindow) /* 10 */ +#endif +#ifndef XSetErrorHandler +#define XSetErrorHandler \ + (tkIntXlibStubsPtr->xSetErrorHandler) /* 11 */ +#endif +#ifndef XAllocColor +#define XAllocColor \ + (tkIntXlibStubsPtr->xAllocColor) /* 12 */ +#endif +#ifndef XBell +#define XBell \ + (tkIntXlibStubsPtr->xBell) /* 13 */ +#endif +#ifndef XChangeProperty +#define XChangeProperty \ + (tkIntXlibStubsPtr->xChangeProperty) /* 14 */ +#endif +#ifndef XChangeWindowAttributes +#define XChangeWindowAttributes \ + (tkIntXlibStubsPtr->xChangeWindowAttributes) /* 15 */ +#endif +#ifndef XConfigureWindow +#define XConfigureWindow \ + (tkIntXlibStubsPtr->xConfigureWindow) /* 16 */ +#endif +#ifndef XCopyArea +#define XCopyArea \ + (tkIntXlibStubsPtr->xCopyArea) /* 17 */ +#endif +#ifndef XCopyPlane +#define XCopyPlane \ + (tkIntXlibStubsPtr->xCopyPlane) /* 18 */ +#endif +#ifndef XCreateBitmapFromData +#define XCreateBitmapFromData \ + (tkIntXlibStubsPtr->xCreateBitmapFromData) /* 19 */ +#endif +#ifndef XDefineCursor +#define XDefineCursor \ + (tkIntXlibStubsPtr->xDefineCursor) /* 20 */ +#endif +#ifndef XDestroyWindow +#define XDestroyWindow \ + (tkIntXlibStubsPtr->xDestroyWindow) /* 21 */ +#endif +#ifndef XDrawArc +#define XDrawArc \ + (tkIntXlibStubsPtr->xDrawArc) /* 22 */ +#endif +#ifndef XDrawLines +#define XDrawLines \ + (tkIntXlibStubsPtr->xDrawLines) /* 23 */ +#endif +#ifndef XDrawRectangle +#define XDrawRectangle \ + (tkIntXlibStubsPtr->xDrawRectangle) /* 24 */ +#endif +#ifndef XFillArc +#define XFillArc \ + (tkIntXlibStubsPtr->xFillArc) /* 25 */ +#endif +#ifndef XFillPolygon +#define XFillPolygon \ + (tkIntXlibStubsPtr->xFillPolygon) /* 26 */ +#endif +#ifndef XFillRectangles +#define XFillRectangles \ + (tkIntXlibStubsPtr->xFillRectangles) /* 27 */ +#endif +#ifndef XFreeColormap +#define XFreeColormap \ + (tkIntXlibStubsPtr->xFreeColormap) /* 28 */ +#endif +#ifndef XFreeColors +#define XFreeColors \ + (tkIntXlibStubsPtr->xFreeColors) /* 29 */ +#endif +#ifndef XFreeModifiermap +#define XFreeModifiermap \ + (tkIntXlibStubsPtr->xFreeModifiermap) /* 30 */ +#endif +#ifndef XGetGeometry +#define XGetGeometry \ + (tkIntXlibStubsPtr->xGetGeometry) /* 31 */ +#endif +#ifndef XGetWindowProperty +#define XGetWindowProperty \ + (tkIntXlibStubsPtr->xGetWindowProperty) /* 32 */ +#endif +#ifndef XGrabKeyboard +#define XGrabKeyboard \ + (tkIntXlibStubsPtr->xGrabKeyboard) /* 33 */ +#endif +#ifndef XGrabPointer +#define XGrabPointer \ + (tkIntXlibStubsPtr->xGrabPointer) /* 34 */ +#endif +#ifndef XKeysymToKeycode +#define XKeysymToKeycode \ + (tkIntXlibStubsPtr->xKeysymToKeycode) /* 35 */ +#endif +#ifndef XMapWindow +#define XMapWindow \ + (tkIntXlibStubsPtr->xMapWindow) /* 36 */ +#endif +#ifndef XMoveResizeWindow +#define XMoveResizeWindow \ + (tkIntXlibStubsPtr->xMoveResizeWindow) /* 37 */ +#endif +#ifndef XMoveWindow +#define XMoveWindow \ + (tkIntXlibStubsPtr->xMoveWindow) /* 38 */ +#endif +#ifndef XQueryPointer +#define XQueryPointer \ + (tkIntXlibStubsPtr->xQueryPointer) /* 39 */ +#endif +#ifndef XRaiseWindow +#define XRaiseWindow \ + (tkIntXlibStubsPtr->xRaiseWindow) /* 40 */ +#endif +#ifndef XRefreshKeyboardMapping +#define XRefreshKeyboardMapping \ + (tkIntXlibStubsPtr->xRefreshKeyboardMapping) /* 41 */ +#endif +#ifndef XResizeWindow +#define XResizeWindow \ + (tkIntXlibStubsPtr->xResizeWindow) /* 42 */ +#endif +#ifndef XSelectInput +#define XSelectInput \ + (tkIntXlibStubsPtr->xSelectInput) /* 43 */ +#endif +#ifndef XSendEvent +#define XSendEvent \ + (tkIntXlibStubsPtr->xSendEvent) /* 44 */ +#endif +#ifndef XSetIconName +#define XSetIconName \ + (tkIntXlibStubsPtr->xSetIconName) /* 45 */ +#endif +#ifndef XSetInputFocus +#define XSetInputFocus \ + (tkIntXlibStubsPtr->xSetInputFocus) /* 46 */ +#endif +#ifndef XSetSelectionOwner +#define XSetSelectionOwner \ + (tkIntXlibStubsPtr->xSetSelectionOwner) /* 47 */ +#endif +#ifndef XSetWindowBackground +#define XSetWindowBackground \ + (tkIntXlibStubsPtr->xSetWindowBackground) /* 48 */ +#endif +#ifndef XSetWindowBackgroundPixmap +#define XSetWindowBackgroundPixmap \ + (tkIntXlibStubsPtr->xSetWindowBackgroundPixmap) /* 49 */ +#endif +#ifndef XSetWindowBorder +#define XSetWindowBorder \ + (tkIntXlibStubsPtr->xSetWindowBorder) /* 50 */ +#endif +#ifndef XSetWindowBorderPixmap +#define XSetWindowBorderPixmap \ + (tkIntXlibStubsPtr->xSetWindowBorderPixmap) /* 51 */ +#endif +#ifndef XSetWindowBorderWidth +#define XSetWindowBorderWidth \ + (tkIntXlibStubsPtr->xSetWindowBorderWidth) /* 52 */ +#endif +#ifndef XSetWindowColormap +#define XSetWindowColormap \ + (tkIntXlibStubsPtr->xSetWindowColormap) /* 53 */ +#endif +#ifndef XUngrabKeyboard +#define XUngrabKeyboard \ + (tkIntXlibStubsPtr->xUngrabKeyboard) /* 54 */ +#endif +#ifndef XUngrabPointer +#define XUngrabPointer \ + (tkIntXlibStubsPtr->xUngrabPointer) /* 55 */ +#endif +#ifndef XUnmapWindow +#define XUnmapWindow \ + (tkIntXlibStubsPtr->xUnmapWindow) /* 56 */ +#endif +#ifndef TkPutImage +#define TkPutImage \ + (tkIntXlibStubsPtr->tkPutImage) /* 57 */ +#endif +#ifndef XParseColor +#define XParseColor \ + (tkIntXlibStubsPtr->xParseColor) /* 58 */ +#endif +#ifndef XCreateGC +#define XCreateGC \ + (tkIntXlibStubsPtr->xCreateGC) /* 59 */ +#endif +#ifndef XFreeGC +#define XFreeGC \ + (tkIntXlibStubsPtr->xFreeGC) /* 60 */ +#endif +#ifndef XInternAtom +#define XInternAtom \ + (tkIntXlibStubsPtr->xInternAtom) /* 61 */ +#endif +#ifndef XSetBackground +#define XSetBackground \ + (tkIntXlibStubsPtr->xSetBackground) /* 62 */ +#endif +#ifndef XSetForeground +#define XSetForeground \ + (tkIntXlibStubsPtr->xSetForeground) /* 63 */ +#endif +#ifndef XSetClipMask +#define XSetClipMask \ + (tkIntXlibStubsPtr->xSetClipMask) /* 64 */ +#endif +#ifndef XSetClipOrigin +#define XSetClipOrigin \ + (tkIntXlibStubsPtr->xSetClipOrigin) /* 65 */ +#endif +#ifndef XSetTSOrigin +#define XSetTSOrigin \ + (tkIntXlibStubsPtr->xSetTSOrigin) /* 66 */ +#endif +#ifndef XChangeGC +#define XChangeGC \ + (tkIntXlibStubsPtr->xChangeGC) /* 67 */ +#endif +#ifndef XSetFont +#define XSetFont \ + (tkIntXlibStubsPtr->xSetFont) /* 68 */ +#endif +#ifndef XSetArcMode +#define XSetArcMode \ + (tkIntXlibStubsPtr->xSetArcMode) /* 69 */ +#endif +#ifndef XSetStipple +#define XSetStipple \ + (tkIntXlibStubsPtr->xSetStipple) /* 70 */ +#endif +#ifndef XSetFillRule +#define XSetFillRule \ + (tkIntXlibStubsPtr->xSetFillRule) /* 71 */ +#endif +#ifndef XSetFillStyle +#define XSetFillStyle \ + (tkIntXlibStubsPtr->xSetFillStyle) /* 72 */ +#endif +#ifndef XSetFunction +#define XSetFunction \ + (tkIntXlibStubsPtr->xSetFunction) /* 73 */ +#endif +#ifndef XSetLineAttributes +#define XSetLineAttributes \ + (tkIntXlibStubsPtr->xSetLineAttributes) /* 74 */ +#endif +#ifndef _XInitImageFuncPtrs +#define _XInitImageFuncPtrs \ + (tkIntXlibStubsPtr->_XInitImageFuncPtrs) /* 75 */ +#endif +#ifndef XCreateIC +#define XCreateIC \ + (tkIntXlibStubsPtr->xCreateIC) /* 76 */ +#endif +#ifndef XGetVisualInfo +#define XGetVisualInfo \ + (tkIntXlibStubsPtr->xGetVisualInfo) /* 77 */ +#endif +#ifndef XSetWMClientMachine +#define XSetWMClientMachine \ + (tkIntXlibStubsPtr->xSetWMClientMachine) /* 78 */ +#endif +#ifndef XStringListToTextProperty +#define XStringListToTextProperty \ + (tkIntXlibStubsPtr->xStringListToTextProperty) /* 79 */ +#endif +#ifndef XDrawSegments +#define XDrawSegments \ + (tkIntXlibStubsPtr->xDrawSegments) /* 80 */ +#endif +#ifndef XForceScreenSaver +#define XForceScreenSaver \ + (tkIntXlibStubsPtr->xForceScreenSaver) /* 81 */ +#endif +#ifndef XDrawLine +#define XDrawLine \ + (tkIntXlibStubsPtr->xDrawLine) /* 82 */ +#endif +#ifndef XFillRectangle +#define XFillRectangle \ + (tkIntXlibStubsPtr->xFillRectangle) /* 83 */ +#endif +#ifndef XClearWindow +#define XClearWindow \ + (tkIntXlibStubsPtr->xClearWindow) /* 84 */ +#endif +#ifndef XDrawPoint +#define XDrawPoint \ + (tkIntXlibStubsPtr->xDrawPoint) /* 85 */ +#endif +#ifndef XDrawPoints +#define XDrawPoints \ + (tkIntXlibStubsPtr->xDrawPoints) /* 86 */ +#endif +#ifndef XWarpPointer +#define XWarpPointer \ + (tkIntXlibStubsPtr->xWarpPointer) /* 87 */ +#endif +#ifndef XQueryColor +#define XQueryColor \ + (tkIntXlibStubsPtr->xQueryColor) /* 88 */ +#endif +#ifndef XQueryColors +#define XQueryColors \ + (tkIntXlibStubsPtr->xQueryColors) /* 89 */ +#endif +#ifndef XQueryTree +#define XQueryTree \ + (tkIntXlibStubsPtr->xQueryTree) /* 90 */ +#endif +#ifndef XSync +#define XSync \ + (tkIntXlibStubsPtr->xSync) /* 91 */ +#endif +#endif /* AQUA */ + +#endif /* defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) */ + +/* !END!: Do not edit above this line. */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#if defined(__WIN32__) + +#undef XFlush +#undef XGrabServer +#undef XUngrabServer +#undef XFree +#undef XNoOp +#undef XSynchronize +#undef XSync +#undef XVisualIDFromVisual + +#if defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) +/* + * The following stubs implement various calls that don't do anything + * under Windows. In win32 tclsh 8.4 and 8.5 holds: + * tkIntStubsPtr->tkBindDeadWindow != NULL + * Then the following macros don't do anything. But when running Tcl win32 + * version 8.6 or Cygwin (8.4, 8.5 or 8.6) then the functions are available in + * the stub table. The real function from the stub table will be called, + * even though it might be doing nothing. + */ + +#define XFlush(display) (tkIntStubsPtr->tkBindDeadWindow? 0: tkIntXlibStubsPtr->xFlush(display)) +#define XGrabServer(display) (tkIntStubsPtr->tkBindDeadWindow? 0: tkIntXlibStubsPtr->xGrabServer(display)) +#define XUngrabServer(display) (tkIntStubsPtr->tkBindDeadWindow? 0: tkIntXlibStubsPtr->xUngrabServer(display)) + +/* + * The following functions are implemented as macros under Windows. + */ + + +#define XFree(data) (tkIntStubsPtr->tkBindDeadWindow? ((data)? (ckfree((char *) (data)), 0): 0): tkIntXlibStubsPtr->xFree(data)) +#define XNoOp(display) (tkIntStubsPtr->tkBindDeadWindow? 0: tkIntXlibStubsPtr->xNoOp(display)) +#define XSynchronize(display, bool) (tkIntStubsPtr->tkBindDeadWindow? 0: tkIntXlibStubsPtr->xSynchronize(display, bool)) +#define XSync(display, bool) (tkIntStubsPtr->tkBindDeadWindow? 0: tkIntXlibStubsPtr->xSync(display, bool)) +#define XVisualIDFromVisual(visual) (tkIntStubsPtr->tkBindDeadWindow? ((visual)->visualid): tkIntXlibStubsPtr->xVisualIDFromVisual(visual)) + +#else /* !USE_TK_STUBS */ +/* + * The following stubs implement various calls that don't do anything + * under Windows. + */ + +#define XFlush(display) +#define XGrabServer(display) +#define XUngrabServer(display) + +/* + * The following functions are implemented as macros under Windows. + */ + +#define XFree(data) {if ((data) != NULL) ckfree((char *) (data));} +#define XNoOp(display) {display->request++;} +#define XSynchronize(display, bool) {display->request++;} +#define XSync(display, bool) {display->request++;} +#define XVisualIDFromVisual(visual) (visual->visualid) + +#endif /* !USE_TK_STUBS */ + +#endif /* __WIN32__ */ + +#endif /* _TKINTXLIBDECLS */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tcl.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tcl.h new file mode 100644 index 00000000..5fde9dc6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tcl.h @@ -0,0 +1,2455 @@ +/* + * tcl.h -- + * + * This header file describes the externally-visible facilities of the + * Tcl interpreter. + * + * Copyright (c) 1987-1994 The Regents of the University of California. + * Copyright (c) 1993-1996 Lucent Technologies. + * Copyright (c) 1994-1998 Sun Microsystems, Inc. + * Copyright (c) 1998-2000 by Scriptics Corporation. + * Copyright (c) 2002 by Kevin B. Kenny. All rights reserved. + * + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TCL +#define _TCL + +/* + * For C++ compilers, use extern "C" + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The following defines are used to indicate the various release levels. + */ + +#define TCL_ALPHA_RELEASE 0 +#define TCL_BETA_RELEASE 1 +#define TCL_FINAL_RELEASE 2 + +/* + * When version numbers change here, must also go into the following files and + * update the version numbers: + * + * library/init.tcl (1 LOC patch) + * unix/configure.in (2 LOC Major, 2 LOC minor, 1 LOC patch) + * win/configure.in (as above) + * win/tcl.m4 (not patchlevel) + * win/makefile.bc (not patchlevel) 2 LOC + * README (sections 0 and 2, with and without separator) + * macosx/Tcl.pbproj/project.pbxproj (not patchlevel) 1 LOC + * macosx/Tcl.pbproj/default.pbxuser (not patchlevel) 1 LOC + * macosx/Tcl.xcode/project.pbxproj (not patchlevel) 2 LOC + * macosx/Tcl.xcode/default.pbxuser (not patchlevel) 1 LOC + * macosx/Tcl-Common.xcconfig (not patchlevel) 1 LOC + * win/README (not patchlevel) (sections 0 and 2) + * unix/tcl.spec (1 LOC patch) + * tools/tcl.hpj.in (not patchlevel, for windows installer) + * tools/tcl.wse.in (for windows installer) + * tools/tclSplash.bmp (not patchlevel) + */ + +#define TCL_MAJOR_VERSION 8 +#define TCL_MINOR_VERSION 5 +#define TCL_RELEASE_LEVEL TCL_FINAL_RELEASE +#define TCL_RELEASE_SERIAL 13 + +#define TCL_VERSION "8.5" +#define TCL_PATCH_LEVEL "8.5.13" + +/* + * The following definitions set up the proper options for Windows compilers. + * We use this method because there is no autoconf equivalent. + */ + +#ifndef __WIN32__ +# if defined(_WIN32) || defined(WIN32) || defined(__MINGW32__) || defined(__BORLANDC__) || (defined(__WATCOMC__) && defined(__WINDOWS_386__)) +# define __WIN32__ +# ifndef WIN32 +# define WIN32 +# endif +# ifndef _WIN32 +# define _WIN32 +# endif +# endif +#endif + +/* + * STRICT: See MSDN Article Q83456 + */ + +#ifdef __WIN32__ +# ifndef STRICT +# define STRICT +# endif +#endif /* __WIN32__ */ + +/* + * Utility macros: STRINGIFY takes an argument and wraps it in "" (double + * quotation marks), JOIN joins two arguments. + */ + +#ifndef STRINGIFY +# define STRINGIFY(x) STRINGIFY1(x) +# define STRINGIFY1(x) #x +#endif +#ifndef JOIN +# define JOIN(a,b) JOIN1(a,b) +# define JOIN1(a,b) a##b +#endif + +/* + * A special definition used to allow this header file to be included from + * windows resource files so that they can obtain version information. + * RC_INVOKED is defined by default by the windows RC tool. + * + * Resource compilers don't like all the C stuff, like typedefs and function + * declarations, that occur below, so block them out. + */ + +#ifndef RC_INVOKED + +/* + * Special macro to define mutexes, that doesn't do anything if we are not + * using threads. + */ + +#ifdef TCL_THREADS +#define TCL_DECLARE_MUTEX(name) static Tcl_Mutex name; +#else +#define TCL_DECLARE_MUTEX(name) +#endif + +/* + * Tcl's public routine Tcl_FSSeek() uses the values SEEK_SET, SEEK_CUR, and + * SEEK_END, all #define'd by stdio.h . + * + * Also, many extensions need stdio.h, and they've grown accustomed to tcl.h + * providing it for them rather than #include-ing it themselves as they + * should, so also for their sake, we keep the #include to be consistent with + * prior Tcl releases. + */ + +#include + +/* + * Support for functions with a variable number of arguments. + * + * The following TCL_VARARGS* macros are to support old extensions + * written for older versions of Tcl where the macros permitted + * support for the varargs.h system as well as stdarg.h . + * + * New code should just directly be written to use stdarg.h conventions. + */ + +#include +#ifndef TCL_NO_DEPRECATED +# define TCL_VARARGS(type, name) (type name, ...) +# define TCL_VARARGS_DEF(type, name) (type name, ...) +# define TCL_VARARGS_START(type, name, list) (va_start(list, name), name) +#endif + +/* + * Macros used to declare a function to be exported by a DLL. Used by Windows, + * maps to no-op declarations on non-Windows systems. The default build on + * windows is for a DLL, which causes the DLLIMPORT and DLLEXPORT macros to be + * nonempty. To build a static library, the macro STATIC_BUILD should be + * defined. + * + * Note: when building static but linking dynamically to MSVCRT we must still + * correctly decorate the C library imported function. Use CRTIMPORT + * for this purpose. _DLL is defined by the compiler when linking to + * MSVCRT. + */ + +#if (defined(__WIN32__) && (defined(_MSC_VER) || (__BORLANDC__ >= 0x0550) || defined(__LCC__) || defined(__WATCOMC__) || (defined(__GNUC__) && defined(__declspec)))) +# define HAVE_DECLSPEC 1 +# ifdef STATIC_BUILD +# define DLLIMPORT +# define DLLEXPORT +# ifdef _DLL +# define CRTIMPORT __declspec(dllimport) +# else +# define CRTIMPORT +# endif +# else +# define DLLIMPORT __declspec(dllimport) +# define DLLEXPORT __declspec(dllexport) +# define CRTIMPORT __declspec(dllimport) +# endif +#else +# define DLLIMPORT +# if defined(__GNUC__) && __GNUC__ > 3 +# define DLLEXPORT __attribute__ ((visibility("default"))) +# else +# define DLLEXPORT +# endif +# define CRTIMPORT +#endif + +/* + * These macros are used to control whether functions are being declared for + * import or export. If a function is being declared while it is being built + * to be included in a shared library, then it should have the DLLEXPORT + * storage class. If is being declared for use by a module that is going to + * link against the shared library, then it should have the DLLIMPORT storage + * class. If the symbol is beind declared for a static build or for use from a + * stub library, then the storage class should be empty. + * + * The convention is that a macro called BUILD_xxxx, where xxxx is the name of + * a library we are building, is set on the compile line for sources that are + * to be placed in the library. When this macro is set, the storage class will + * be set to DLLEXPORT. At the end of the header file, the storage class will + * be reset to DLLIMPORT. + */ + +#undef TCL_STORAGE_CLASS +#ifdef BUILD_tcl +# define TCL_STORAGE_CLASS DLLEXPORT +#else +# ifdef USE_TCL_STUBS +# define TCL_STORAGE_CLASS +# else +# define TCL_STORAGE_CLASS DLLIMPORT +# endif +#endif + +/* + * Definitions that allow this header file to be used either with or without + * ANSI C features like function prototypes. + */ + +#undef _ANSI_ARGS_ +#undef CONST +#ifndef INLINE +# define INLINE +#endif + +#ifndef NO_CONST +# define CONST const +#else +# define CONST +#endif + +#ifndef NO_PROTOTYPES +# define _ANSI_ARGS_(x) x +#else +# define _ANSI_ARGS_(x) () +#endif + +#ifdef USE_NON_CONST +# ifdef USE_COMPAT_CONST +# error define at most one of USE_NON_CONST and USE_COMPAT_CONST +# endif +# define CONST84 +# define CONST84_RETURN +#else +# ifdef USE_COMPAT_CONST +# define CONST84 +# define CONST84_RETURN CONST +# else +# define CONST84 CONST +# define CONST84_RETURN CONST +# endif +#endif + +/* + * Make sure EXTERN isn't defined elsewhere. + */ + +#ifdef EXTERN +# undef EXTERN +#endif /* EXTERN */ + +#ifdef __cplusplus +# define EXTERN extern "C" TCL_STORAGE_CLASS +#else +# define EXTERN extern TCL_STORAGE_CLASS +#endif + +/* + * The following code is copied from winnt.h. If we don't replicate it here, + * then can't be included after tcl.h, since tcl.h also defines + * VOID. This block is skipped under Cygwin and Mingw. + */ + +#if defined(__WIN32__) && !defined(HAVE_WINNT_IGNORE_VOID) +#ifndef VOID +#define VOID void +typedef char CHAR; +typedef short SHORT; +typedef long LONG; +#endif +#endif /* __WIN32__ && !HAVE_WINNT_IGNORE_VOID */ + +/* + * Macro to use instead of "void" for arguments that must have type "void *" + * in ANSI C; maps them to type "char *" in non-ANSI systems. + */ + +#ifndef NO_VOID +#define VOID void +#else +#define VOID char +#endif + +/* + * Miscellaneous declarations. + */ + +#ifndef _CLIENTDATA +# ifndef NO_VOID + typedef void *ClientData; +# else + typedef int *ClientData; +# endif +# define _CLIENTDATA +#endif + +/* + * Darwin specific configure overrides (to support fat compiles, where + * configure runs only once for multiple architectures): + */ + +#ifdef __APPLE__ +# ifdef __LP64__ +# undef TCL_WIDE_INT_TYPE +# define TCL_WIDE_INT_IS_LONG 1 +# define TCL_CFG_DO64BIT 1 +# else /* !__LP64__ */ +# define TCL_WIDE_INT_TYPE long long +# undef TCL_WIDE_INT_IS_LONG +# undef TCL_CFG_DO64BIT +# endif /* __LP64__ */ +# undef HAVE_STRUCT_STAT64 +#endif /* __APPLE__ */ + +/* + * Define Tcl_WideInt to be a type that is (at least) 64-bits wide, and define + * Tcl_WideUInt to be the unsigned variant of that type (assuming that where + * we have one, we can have the other.) + * + * Also defines the following macros: + * TCL_WIDE_INT_IS_LONG - if wide ints are really longs (i.e. we're on a real + * 64-bit system.) + * Tcl_WideAsLong - forgetful converter from wideInt to long. + * Tcl_LongAsWide - sign-extending converter from long to wideInt. + * Tcl_WideAsDouble - converter from wideInt to double. + * Tcl_DoubleAsWide - converter from double to wideInt. + * + * The following invariant should hold for any long value 'longVal': + * longVal == Tcl_WideAsLong(Tcl_LongAsWide(longVal)) + * + * Note on converting between Tcl_WideInt and strings. This implementation (in + * tclObj.c) depends on the function + * sprintf(...,"%" TCL_LL_MODIFIER "d",...). + */ + +#if !defined(TCL_WIDE_INT_TYPE)&&!defined(TCL_WIDE_INT_IS_LONG) +# if defined(__WIN32__) +# define TCL_WIDE_INT_TYPE __int64 +# ifdef __BORLANDC__ +# define TCL_LL_MODIFIER "L" +# else /* __BORLANDC__ */ +# define TCL_LL_MODIFIER "I64" +# endif /* __BORLANDC__ */ +# elif defined(__GNUC__) +# define TCL_WIDE_INT_TYPE long long +# define TCL_LL_MODIFIER "ll" +# else /* ! __WIN32__ && ! __GNUC__ */ +/* + * Don't know what platform it is and configure hasn't discovered what is + * going on for us. Try to guess... + */ +# ifdef NO_LIMITS_H +# error please define either TCL_WIDE_INT_TYPE or TCL_WIDE_INT_IS_LONG +# else /* !NO_LIMITS_H */ +# include +# if (INT_MAX < LONG_MAX) +# define TCL_WIDE_INT_IS_LONG 1 +# else +# define TCL_WIDE_INT_TYPE long long +# endif +# endif /* NO_LIMITS_H */ +# endif /* __WIN32__ */ +#endif /* !TCL_WIDE_INT_TYPE & !TCL_WIDE_INT_IS_LONG */ +#ifdef TCL_WIDE_INT_IS_LONG +# undef TCL_WIDE_INT_TYPE +# define TCL_WIDE_INT_TYPE long +#endif /* TCL_WIDE_INT_IS_LONG */ + +typedef TCL_WIDE_INT_TYPE Tcl_WideInt; +typedef unsigned TCL_WIDE_INT_TYPE Tcl_WideUInt; + +#ifdef TCL_WIDE_INT_IS_LONG +# define Tcl_WideAsLong(val) ((long)(val)) +# define Tcl_LongAsWide(val) ((long)(val)) +# define Tcl_WideAsDouble(val) ((double)((long)(val))) +# define Tcl_DoubleAsWide(val) ((long)((double)(val))) +# ifndef TCL_LL_MODIFIER +# define TCL_LL_MODIFIER "l" +# endif /* !TCL_LL_MODIFIER */ +#else /* TCL_WIDE_INT_IS_LONG */ +/* + * The next short section of defines are only done when not running on Windows + * or some other strange platform. + */ +# ifndef TCL_LL_MODIFIER +# define TCL_LL_MODIFIER "ll" +# endif /* !TCL_LL_MODIFIER */ +# define Tcl_WideAsLong(val) ((long)((Tcl_WideInt)(val))) +# define Tcl_LongAsWide(val) ((Tcl_WideInt)((long)(val))) +# define Tcl_WideAsDouble(val) ((double)((Tcl_WideInt)(val))) +# define Tcl_DoubleAsWide(val) ((Tcl_WideInt)((double)(val))) +#endif /* TCL_WIDE_INT_IS_LONG */ + +#if defined(__WIN32__) +# ifdef __BORLANDC__ + typedef struct stati64 Tcl_StatBuf; +# elif defined(_WIN64) + typedef struct __stat64 Tcl_StatBuf; +# elif (defined(_MSC_VER) && (_MSC_VER < 1400)) || defined(_USE_32BIT_TIME_T) + typedef struct _stati64 Tcl_StatBuf; +# else + typedef struct _stat32i64 Tcl_StatBuf; +# endif /* _MSC_VER < 1400 */ +#elif defined(__CYGWIN__) + typedef struct _stat32i64 { + dev_t st_dev; + unsigned short st_ino; + unsigned short st_mode; + short st_nlink; + short st_uid; + short st_gid; + /* Here is a 2-byte gap */ + dev_t st_rdev; + /* Here is a 4-byte gap */ + long long st_size; + struct {long tv_sec;} st_atim; + struct {long tv_sec;} st_mtim; + struct {long tv_sec;} st_ctim; + /* Here is a 4-byte gap */ + } Tcl_StatBuf; +#elif defined(HAVE_STRUCT_STAT64) && !defined(__APPLE__) + typedef struct stat64 Tcl_StatBuf; +#else + typedef struct stat Tcl_StatBuf; +#endif + +/* + * Data structures defined opaquely in this module. The definitions below just + * provide dummy types. A few fields are made visible in Tcl_Interp + * structures, namely those used for returning a string result from commands. + * Direct access to the result field is discouraged in Tcl 8.0. The + * interpreter result is either an object or a string, and the two values are + * kept consistent unless some C code sets interp->result directly. + * Programmers should use either the function Tcl_GetObjResult() or + * Tcl_GetStringResult() to read the interpreter's result. See the SetResult + * man page for details. + * + * Note: any change to the Tcl_Interp definition below must be mirrored in the + * "real" definition in tclInt.h. + * + * Note: Tcl_ObjCmdProc functions do not directly set result and freeProc. + * Instead, they set a Tcl_Obj member in the "real" structure that can be + * accessed with Tcl_GetObjResult() and Tcl_SetObjResult(). + */ + +typedef struct Tcl_Interp { + char *result; /* If the last command returned a string + * result, this points to it. */ + void (*freeProc) _ANSI_ARGS_((char *blockPtr)); + /* Zero means the string result is statically + * allocated. TCL_DYNAMIC means it was + * allocated with ckalloc and should be freed + * with ckfree. Other values give the address + * of function to invoke to free the result. + * Tcl_Eval must free it before executing next + * command. */ + int errorLine; /* When TCL_ERROR is returned, this gives the + * line number within the command where the + * error occurred (1 if first line). */ +} Tcl_Interp; + +typedef struct Tcl_AsyncHandler_ *Tcl_AsyncHandler; +typedef struct Tcl_Channel_ *Tcl_Channel; +typedef struct Tcl_ChannelTypeVersion_ *Tcl_ChannelTypeVersion; +typedef struct Tcl_Command_ *Tcl_Command; +typedef struct Tcl_Condition_ *Tcl_Condition; +typedef struct Tcl_Dict_ *Tcl_Dict; +typedef struct Tcl_EncodingState_ *Tcl_EncodingState; +typedef struct Tcl_Encoding_ *Tcl_Encoding; +typedef struct Tcl_Event Tcl_Event; +typedef struct Tcl_InterpState_ *Tcl_InterpState; +typedef struct Tcl_LoadHandle_ *Tcl_LoadHandle; +typedef struct Tcl_Mutex_ *Tcl_Mutex; +typedef struct Tcl_Pid_ *Tcl_Pid; +typedef struct Tcl_RegExp_ *Tcl_RegExp; +typedef struct Tcl_ThreadDataKey_ *Tcl_ThreadDataKey; +typedef struct Tcl_ThreadId_ *Tcl_ThreadId; +typedef struct Tcl_TimerToken_ *Tcl_TimerToken; +typedef struct Tcl_Trace_ *Tcl_Trace; +typedef struct Tcl_Var_ *Tcl_Var; + +/* + * Definition of the interface to functions implementing threads. A function + * following this definition is given to each call of 'Tcl_CreateThread' and + * will be called as the main fuction of the new thread created by that call. + */ + +#if defined __WIN32__ +typedef unsigned (__stdcall Tcl_ThreadCreateProc) _ANSI_ARGS_((ClientData clientData)); +#else +typedef void (Tcl_ThreadCreateProc) _ANSI_ARGS_((ClientData clientData)); +#endif + +/* + * Threading function return types used for abstracting away platform + * differences when writing a Tcl_ThreadCreateProc. See the NewThread function + * in generic/tclThreadTest.c for it's usage. + */ + +#if defined __WIN32__ +# define Tcl_ThreadCreateType unsigned __stdcall +# define TCL_THREAD_CREATE_RETURN return 0 +#else +# define Tcl_ThreadCreateType void +# define TCL_THREAD_CREATE_RETURN +#endif + +/* + * Definition of values for default stacksize and the possible flags to be + * given to Tcl_CreateThread. + */ + +#define TCL_THREAD_STACK_DEFAULT (0) /* Use default size for stack. */ +#define TCL_THREAD_NOFLAGS (0000) /* Standard flags, default + * behaviour. */ +#define TCL_THREAD_JOINABLE (0001) /* Mark the thread as joinable. */ + +/* + * Flag values passed to Tcl_StringCaseMatch. + */ + +#define TCL_MATCH_NOCASE (1<<0) + +/* + * Flag values passed to Tcl_GetRegExpFromObj. + */ + +#define TCL_REG_BASIC 000000 /* BREs (convenience). */ +#define TCL_REG_EXTENDED 000001 /* EREs. */ +#define TCL_REG_ADVF 000002 /* Advanced features in EREs. */ +#define TCL_REG_ADVANCED 000003 /* AREs (which are also EREs). */ +#define TCL_REG_QUOTE 000004 /* No special characters, none. */ +#define TCL_REG_NOCASE 000010 /* Ignore case. */ +#define TCL_REG_NOSUB 000020 /* Don't care about subexpressions. */ +#define TCL_REG_EXPANDED 000040 /* Expanded format, white space & + * comments. */ +#define TCL_REG_NLSTOP 000100 /* \n doesn't match . or [^ ] */ +#define TCL_REG_NLANCH 000200 /* ^ matches after \n, $ before. */ +#define TCL_REG_NEWLINE 000300 /* Newlines are line terminators. */ +#define TCL_REG_CANMATCH 001000 /* Report details on partial/limited + * matches. */ + +/* + * Flags values passed to Tcl_RegExpExecObj. + */ + +#define TCL_REG_NOTBOL 0001 /* Beginning of string does not match ^. */ +#define TCL_REG_NOTEOL 0002 /* End of string does not match $. */ + +/* + * Structures filled in by Tcl_RegExpInfo. Note that all offset values are + * relative to the start of the match string, not the beginning of the entire + * string. + */ + +typedef struct Tcl_RegExpIndices { + long start; /* Character offset of first character in + * match. */ + long end; /* Character offset of first character after + * the match. */ +} Tcl_RegExpIndices; + +typedef struct Tcl_RegExpInfo { + int nsubs; /* Number of subexpressions in the compiled + * expression. */ + Tcl_RegExpIndices *matches; /* Array of nsubs match offset pairs. */ + long extendStart; /* The offset at which a subsequent match + * might begin. */ + long reserved; /* Reserved for later use. */ +} Tcl_RegExpInfo; + +/* + * Picky compilers complain if this typdef doesn't appear before the struct's + * reference in tclDecls.h. + */ + +typedef Tcl_StatBuf *Tcl_Stat_; +typedef struct stat *Tcl_OldStat_; + +/* + * When a TCL command returns, the interpreter contains a result from the + * command. Programmers are strongly encouraged to use one of the functions + * Tcl_GetObjResult() or Tcl_GetStringResult() to read the interpreter's + * result. See the SetResult man page for details. Besides this result, the + * command function returns an integer code, which is one of the following: + * + * TCL_OK Command completed normally; the interpreter's result + * contains the command's result. + * TCL_ERROR The command couldn't be completed successfully; the + * interpreter's result describes what went wrong. + * TCL_RETURN The command requests that the current function return; + * the interpreter's result contains the function's + * return value. + * TCL_BREAK The command requests that the innermost loop be + * exited; the interpreter's result is meaningless. + * TCL_CONTINUE Go on to the next iteration of the current loop; the + * interpreter's result is meaningless. + */ + +#define TCL_OK 0 +#define TCL_ERROR 1 +#define TCL_RETURN 2 +#define TCL_BREAK 3 +#define TCL_CONTINUE 4 + +#define TCL_RESULT_SIZE 200 + +/* + * Flags to control what substitutions are performed by Tcl_SubstObj(): + */ + +#define TCL_SUBST_COMMANDS 001 +#define TCL_SUBST_VARIABLES 002 +#define TCL_SUBST_BACKSLASHES 004 +#define TCL_SUBST_ALL 007 + +/* + * Argument descriptors for math function callbacks in expressions: + */ + +typedef enum { + TCL_INT, TCL_DOUBLE, TCL_EITHER, TCL_WIDE_INT +} Tcl_ValueType; + +typedef struct Tcl_Value { + Tcl_ValueType type; /* Indicates intValue or doubleValue is valid, + * or both. */ + long intValue; /* Integer value. */ + double doubleValue; /* Double-precision floating value. */ + Tcl_WideInt wideValue; /* Wide (min. 64-bit) integer value. */ +} Tcl_Value; + +/* + * Forward declaration of Tcl_Obj to prevent an error when the forward + * reference to Tcl_Obj is encountered in the function types declared below. + */ + +struct Tcl_Obj; + +/* + * Function types defined by Tcl: + */ + +typedef int (Tcl_AppInitProc) _ANSI_ARGS_((Tcl_Interp *interp)); +typedef int (Tcl_AsyncProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int code)); +typedef void (Tcl_ChannelProc) _ANSI_ARGS_((ClientData clientData, int mask)); +typedef void (Tcl_CloseProc) _ANSI_ARGS_((ClientData data)); +typedef void (Tcl_CmdDeleteProc) _ANSI_ARGS_((ClientData clientData)); +typedef int (Tcl_CmdProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int argc, CONST84 char *argv[])); +typedef void (Tcl_CmdTraceProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int level, char *command, Tcl_CmdProc *proc, + ClientData cmdClientData, int argc, CONST84 char *argv[])); +typedef int (Tcl_CmdObjTraceProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int level, CONST char *command, + Tcl_Command commandInfo, int objc, struct Tcl_Obj * CONST * objv)); +typedef void (Tcl_CmdObjTraceDeleteProc) _ANSI_ARGS_((ClientData clientData)); +typedef void (Tcl_DupInternalRepProc) _ANSI_ARGS_((struct Tcl_Obj *srcPtr, + struct Tcl_Obj *dupPtr)); +typedef int (Tcl_EncodingConvertProc)_ANSI_ARGS_((ClientData clientData, + CONST char *src, int srcLen, int flags, Tcl_EncodingState *statePtr, + char *dst, int dstLen, int *srcReadPtr, int *dstWrotePtr, + int *dstCharsPtr)); +typedef void (Tcl_EncodingFreeProc)_ANSI_ARGS_((ClientData clientData)); +typedef int (Tcl_EventProc) _ANSI_ARGS_((Tcl_Event *evPtr, int flags)); +typedef void (Tcl_EventCheckProc) _ANSI_ARGS_((ClientData clientData, + int flags)); +typedef int (Tcl_EventDeleteProc) _ANSI_ARGS_((Tcl_Event *evPtr, + ClientData clientData)); +typedef void (Tcl_EventSetupProc) _ANSI_ARGS_((ClientData clientData, + int flags)); +typedef void (Tcl_ExitProc) _ANSI_ARGS_((ClientData clientData)); +typedef void (Tcl_FileProc) _ANSI_ARGS_((ClientData clientData, int mask)); +typedef void (Tcl_FileFreeProc) _ANSI_ARGS_((ClientData clientData)); +typedef void (Tcl_FreeInternalRepProc) _ANSI_ARGS_((struct Tcl_Obj *objPtr)); +typedef void (Tcl_FreeProc) _ANSI_ARGS_((char *blockPtr)); +typedef void (Tcl_IdleProc) _ANSI_ARGS_((ClientData clientData)); +typedef void (Tcl_InterpDeleteProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp)); +typedef int (Tcl_MathProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, Tcl_Value *args, Tcl_Value *resultPtr)); +typedef void (Tcl_NamespaceDeleteProc) _ANSI_ARGS_((ClientData clientData)); +typedef int (Tcl_ObjCmdProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, int objc, struct Tcl_Obj * CONST * objv)); +typedef int (Tcl_PackageInitProc) _ANSI_ARGS_((Tcl_Interp *interp)); +typedef int (Tcl_PackageUnloadProc) _ANSI_ARGS_((Tcl_Interp *interp, + int flags)); +typedef void (Tcl_PanicProc) _ANSI_ARGS_((CONST char *format, ...)); +typedef void (Tcl_TcpAcceptProc) _ANSI_ARGS_((ClientData callbackData, + Tcl_Channel chan, char *address, int port)); +typedef void (Tcl_TimerProc) _ANSI_ARGS_((ClientData clientData)); +typedef int (Tcl_SetFromAnyProc) _ANSI_ARGS_((Tcl_Interp *interp, + struct Tcl_Obj *objPtr)); +typedef void (Tcl_UpdateStringProc) _ANSI_ARGS_((struct Tcl_Obj *objPtr)); +typedef char *(Tcl_VarTraceProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, CONST84 char *part1, CONST84 char *part2, + int flags)); +typedef void (Tcl_CommandTraceProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, CONST char *oldName, CONST char *newName, + int flags)); +typedef void (Tcl_CreateFileHandlerProc) _ANSI_ARGS_((int fd, int mask, + Tcl_FileProc *proc, ClientData clientData)); +typedef void (Tcl_DeleteFileHandlerProc) _ANSI_ARGS_((int fd)); +typedef void (Tcl_AlertNotifierProc) _ANSI_ARGS_((ClientData clientData)); +typedef void (Tcl_ServiceModeHookProc) _ANSI_ARGS_((int mode)); +typedef ClientData (Tcl_InitNotifierProc) _ANSI_ARGS_((VOID)); +typedef void (Tcl_FinalizeNotifierProc) _ANSI_ARGS_((ClientData clientData)); +typedef void (Tcl_MainLoopProc) _ANSI_ARGS_((void)); + +/* + * The following structure represents a type of object, which is a particular + * internal representation for an object plus a set of functions that provide + * standard operations on objects of that type. + */ + +typedef struct Tcl_ObjType { + char *name; /* Name of the type, e.g. "int". */ + Tcl_FreeInternalRepProc *freeIntRepProc; + /* Called to free any storage for the type's + * internal rep. NULL if the internal rep does + * not need freeing. */ + Tcl_DupInternalRepProc *dupIntRepProc; + /* Called to create a new object as a copy of + * an existing object. */ + Tcl_UpdateStringProc *updateStringProc; + /* Called to update the string rep from the + * type's internal representation. */ + Tcl_SetFromAnyProc *setFromAnyProc; + /* Called to convert the object's internal rep + * to this type. Frees the internal rep of the + * old type. Returns TCL_ERROR on failure. */ +} Tcl_ObjType; + +/* + * One of the following structures exists for each object in the Tcl system. + * An object stores a value as either a string, some internal representation, + * or both. + */ + +typedef struct Tcl_Obj { + int refCount; /* When 0 the object will be freed. */ + char *bytes; /* This points to the first byte of the + * object's string representation. The array + * must be followed by a null byte (i.e., at + * offset length) but may also contain + * embedded null characters. The array's + * storage is allocated by ckalloc. NULL means + * the string rep is invalid and must be + * regenerated from the internal rep. Clients + * should use Tcl_GetStringFromObj or + * Tcl_GetString to get a pointer to the byte + * array as a readonly value. */ + int length; /* The number of bytes at *bytes, not + * including the terminating null. */ + Tcl_ObjType *typePtr; /* Denotes the object's type. Always + * corresponds to the type of the object's + * internal rep. NULL indicates the object has + * no internal rep (has no type). */ + union { /* The internal representation: */ + long longValue; /* - an long integer value. */ + double doubleValue; /* - a double-precision floating value. */ + VOID *otherValuePtr; /* - another, type-specific value. */ + Tcl_WideInt wideValue; /* - a long long value. */ + struct { /* - internal rep as two pointers. */ + VOID *ptr1; + VOID *ptr2; + } twoPtrValue; + struct { /* - internal rep as a wide int, tightly + * packed fields. */ + VOID *ptr; /* Pointer to digits. */ + unsigned long value;/* Alloc, used, and signum packed into a + * single word. */ + } ptrAndLongRep; + } internalRep; +} Tcl_Obj; + +/* + * Macros to increment and decrement a Tcl_Obj's reference count, and to test + * whether an object is shared (i.e. has reference count > 1). Note: clients + * should use Tcl_DecrRefCount() when they are finished using an object, and + * should never call TclFreeObj() directly. TclFreeObj() is only defined and + * made public in tcl.h to support Tcl_DecrRefCount's macro definition. + */ + +void Tcl_IncrRefCount _ANSI_ARGS_((Tcl_Obj *objPtr)); +void Tcl_DecrRefCount _ANSI_ARGS_((Tcl_Obj *objPtr)); +int Tcl_IsShared _ANSI_ARGS_((Tcl_Obj *objPtr)); + +/* + * The following structure contains the state needed by Tcl_SaveResult. No-one + * outside of Tcl should access any of these fields. This structure is + * typically allocated on the stack. + */ + +typedef struct Tcl_SavedResult { + char *result; + Tcl_FreeProc *freeProc; + Tcl_Obj *objResultPtr; + char *appendResult; + int appendAvl; + int appendUsed; + char resultSpace[TCL_RESULT_SIZE+1]; +} Tcl_SavedResult; + +/* + * The following definitions support Tcl's namespace facility. Note: the first + * five fields must match exactly the fields in a Namespace structure (see + * tclInt.h). + */ + +typedef struct Tcl_Namespace { + char *name; /* The namespace's name within its parent + * namespace. This contains no ::'s. The name + * of the global namespace is "" although "::" + * is an synonym. */ + char *fullName; /* The namespace's fully qualified name. This + * starts with ::. */ + ClientData clientData; /* Arbitrary value associated with this + * namespace. */ + Tcl_NamespaceDeleteProc *deleteProc; + /* Function invoked when deleting the + * namespace to, e.g., free clientData. */ + struct Tcl_Namespace *parentPtr; + /* Points to the namespace that contains this + * one. NULL if this is the global + * namespace. */ +} Tcl_Namespace; + +/* + * The following structure represents a call frame, or activation record. A + * call frame defines a naming context for a procedure call: its local scope + * (for local variables) and its namespace scope (used for non-local + * variables; often the global :: namespace). A call frame can also define the + * naming context for a namespace eval or namespace inscope command: the + * namespace in which the command's code should execute. The Tcl_CallFrame + * structures exist only while procedures or namespace eval/inscope's are + * being executed, and provide a Tcl call stack. + * + * A call frame is initialized and pushed using Tcl_PushCallFrame and popped + * using Tcl_PopCallFrame. Storage for a Tcl_CallFrame must be provided by the + * Tcl_PushCallFrame caller, and callers typically allocate them on the C call + * stack for efficiency. For this reason, Tcl_CallFrame is defined as a + * structure and not as an opaque token. However, most Tcl_CallFrame fields + * are hidden since applications should not access them directly; others are + * declared as "dummyX". + * + * WARNING!! The structure definition must be kept consistent with the + * CallFrame structure in tclInt.h. If you change one, change the other. + */ + +typedef struct Tcl_CallFrame { + Tcl_Namespace *nsPtr; + int dummy1; + int dummy2; + VOID *dummy3; + VOID *dummy4; + VOID *dummy5; + int dummy6; + VOID *dummy7; + VOID *dummy8; + int dummy9; + VOID *dummy10; + VOID *dummy11; + VOID *dummy12; + VOID *dummy13; +} Tcl_CallFrame; + +/* + * Information about commands that is returned by Tcl_GetCommandInfo and + * passed to Tcl_SetCommandInfo. objProc is an objc/objv object-based command + * function while proc is a traditional Tcl argc/argv string-based function. + * Tcl_CreateObjCommand and Tcl_CreateCommand ensure that both objProc and + * proc are non-NULL and can be called to execute the command. However, it may + * be faster to call one instead of the other. The member isNativeObjectProc + * is set to 1 if an object-based function was registered by + * Tcl_CreateObjCommand, and to 0 if a string-based function was registered by + * Tcl_CreateCommand. The other function is typically set to a compatibility + * wrapper that does string-to-object or object-to-string argument conversions + * then calls the other function. + */ + +typedef struct Tcl_CmdInfo { + int isNativeObjectProc; /* 1 if objProc was registered by a call to + * Tcl_CreateObjCommand; 0 otherwise. + * Tcl_SetCmdInfo does not modify this + * field. */ + Tcl_ObjCmdProc *objProc; /* Command's object-based function. */ + ClientData objClientData; /* ClientData for object proc. */ + Tcl_CmdProc *proc; /* Command's string-based function. */ + ClientData clientData; /* ClientData for string proc. */ + Tcl_CmdDeleteProc *deleteProc; + /* Function to call when command is + * deleted. */ + ClientData deleteData; /* Value to pass to deleteProc (usually the + * same as clientData). */ + Tcl_Namespace *namespacePtr;/* Points to the namespace that contains this + * command. Note that Tcl_SetCmdInfo will not + * change a command's namespace; use + * TclRenameCommand or Tcl_Eval (of 'rename') + * to do that. */ +} Tcl_CmdInfo; + +/* + * The structure defined below is used to hold dynamic strings. The only + * fields that clients should use are string and length, accessible via the + * macros Tcl_DStringValue and Tcl_DStringLength. + */ + +#define TCL_DSTRING_STATIC_SIZE 200 +typedef struct Tcl_DString { + char *string; /* Points to beginning of string: either + * staticSpace below or a malloced array. */ + int length; /* Number of non-NULL characters in the + * string. */ + int spaceAvl; /* Total number of bytes available for the + * string and its terminating NULL char. */ + char staticSpace[TCL_DSTRING_STATIC_SIZE]; + /* Space to use in common case where string is + * small. */ +} Tcl_DString; + +#define Tcl_DStringLength(dsPtr) ((dsPtr)->length) +#define Tcl_DStringValue(dsPtr) ((dsPtr)->string) +#define Tcl_DStringTrunc Tcl_DStringSetLength + +/* + * Definitions for the maximum number of digits of precision that may be + * specified in the "tcl_precision" variable, and the number of bytes of + * buffer space required by Tcl_PrintDouble. + */ + +#define TCL_MAX_PREC 17 +#define TCL_DOUBLE_SPACE (TCL_MAX_PREC+10) + +/* + * Definition for a number of bytes of buffer space sufficient to hold the + * string representation of an integer in base 10 (assuming the existence of + * 64-bit integers). + */ + +#define TCL_INTEGER_SPACE 24 + +/* + * Flag values passed to Tcl_ConvertElement. + * TCL_DONT_USE_BRACES forces it not to enclose the element in braces, but to + * use backslash quoting instead. + * TCL_DONT_QUOTE_HASH disables the default quoting of the '#' character. It + * is safe to leave the hash unquoted when the element is not the first + * element of a list, and this flag can be used by the caller to indicate + * that condition. + */ + +#define TCL_DONT_USE_BRACES 1 +#define TCL_DONT_QUOTE_HASH 8 + +/* + * Flag that may be passed to Tcl_GetIndexFromObj to force it to disallow + * abbreviated strings. + */ + +#define TCL_EXACT 1 + +/* + * Flag values passed to Tcl_RecordAndEval, Tcl_EvalObj, Tcl_EvalObjv. + * WARNING: these bit choices must not conflict with the bit choices for + * evalFlag bits in tclInt.h! + * + * Meanings: + * TCL_NO_EVAL: Just record this command + * TCL_EVAL_GLOBAL: Execute script in global namespace + * TCL_EVAL_DIRECT: Do not compile this script + * TCL_EVAL_INVOKE: Magical Tcl_EvalObjv mode for aliases/ensembles + * o Run in iPtr->lookupNsPtr or global namespace + * o Cut out of error traces + * o Don't reset the flags controlling ensemble + * error message rewriting. + */ +#define TCL_NO_EVAL 0x10000 +#define TCL_EVAL_GLOBAL 0x20000 +#define TCL_EVAL_DIRECT 0x40000 +#define TCL_EVAL_INVOKE 0x80000 + +/* + * Special freeProc values that may be passed to Tcl_SetResult (see the man + * page for details): + */ + +#define TCL_VOLATILE ((Tcl_FreeProc *) 1) +#define TCL_STATIC ((Tcl_FreeProc *) 0) +#define TCL_DYNAMIC ((Tcl_FreeProc *) 3) + +/* + * Flag values passed to variable-related functions. + */ + +#define TCL_GLOBAL_ONLY 1 +#define TCL_NAMESPACE_ONLY 2 +#define TCL_APPEND_VALUE 4 +#define TCL_LIST_ELEMENT 8 +#define TCL_TRACE_READS 0x10 +#define TCL_TRACE_WRITES 0x20 +#define TCL_TRACE_UNSETS 0x40 +#define TCL_TRACE_DESTROYED 0x80 +#define TCL_INTERP_DESTROYED 0x100 +#define TCL_LEAVE_ERR_MSG 0x200 +#define TCL_TRACE_ARRAY 0x800 +#ifndef TCL_REMOVE_OBSOLETE_TRACES +/* Required to support old variable/vdelete/vinfo traces */ +#define TCL_TRACE_OLD_STYLE 0x1000 +#endif +/* Indicate the semantics of the result of a trace */ +#define TCL_TRACE_RESULT_DYNAMIC 0x8000 +#define TCL_TRACE_RESULT_OBJECT 0x10000 + +/* + * Flag values for ensemble commands. + */ + +#define TCL_ENSEMBLE_PREFIX 0x02/* Flag value to say whether to allow + * unambiguous prefixes of commands or to + * require exact matches for command names. */ + +/* + * Flag values passed to command-related functions. + */ + +#define TCL_TRACE_RENAME 0x2000 +#define TCL_TRACE_DELETE 0x4000 + +#define TCL_ALLOW_INLINE_COMPILATION 0x20000 + +/* + * The TCL_PARSE_PART1 flag is deprecated and has no effect. The part1 is now + * always parsed whenever the part2 is NULL. (This is to avoid a common error + * when converting code to use the new object based APIs and forgetting to + * give the flag) + */ + +#ifndef TCL_NO_DEPRECATED +# define TCL_PARSE_PART1 0x400 +#endif + +/* + * Types for linked variables: + */ + +#define TCL_LINK_INT 1 +#define TCL_LINK_DOUBLE 2 +#define TCL_LINK_BOOLEAN 3 +#define TCL_LINK_STRING 4 +#define TCL_LINK_WIDE_INT 5 +#define TCL_LINK_CHAR 6 +#define TCL_LINK_UCHAR 7 +#define TCL_LINK_SHORT 8 +#define TCL_LINK_USHORT 9 +#define TCL_LINK_UINT 10 +#define TCL_LINK_LONG 11 +#define TCL_LINK_ULONG 12 +#define TCL_LINK_FLOAT 13 +#define TCL_LINK_WIDE_UINT 14 +#define TCL_LINK_READ_ONLY 0x80 + +/* + * Forward declarations of Tcl_HashTable and related types. + */ + +typedef struct Tcl_HashKeyType Tcl_HashKeyType; +typedef struct Tcl_HashTable Tcl_HashTable; +typedef struct Tcl_HashEntry Tcl_HashEntry; + +typedef unsigned int (Tcl_HashKeyProc) _ANSI_ARGS_((Tcl_HashTable *tablePtr, + VOID *keyPtr)); +typedef int (Tcl_CompareHashKeysProc) _ANSI_ARGS_((VOID *keyPtr, + Tcl_HashEntry *hPtr)); +typedef Tcl_HashEntry *(Tcl_AllocHashEntryProc) _ANSI_ARGS_(( + Tcl_HashTable *tablePtr, VOID *keyPtr)); +typedef void (Tcl_FreeHashEntryProc) _ANSI_ARGS_((Tcl_HashEntry *hPtr)); + +/* + * This flag controls whether the hash table stores the hash of a key, or + * recalculates it. There should be no reason for turning this flag off as it + * is completely binary and source compatible unless you directly access the + * bucketPtr member of the Tcl_HashTableEntry structure. This member has been + * removed and the space used to store the hash value. + */ + +#ifndef TCL_HASH_KEY_STORE_HASH +# define TCL_HASH_KEY_STORE_HASH 1 +#endif + +/* + * Structure definition for an entry in a hash table. No-one outside Tcl + * should access any of these fields directly; use the macros defined below. + */ + +struct Tcl_HashEntry { + Tcl_HashEntry *nextPtr; /* Pointer to next entry in this hash bucket, + * or NULL for end of chain. */ + Tcl_HashTable *tablePtr; /* Pointer to table containing entry. */ +#if TCL_HASH_KEY_STORE_HASH + VOID *hash; /* Hash value, stored as pointer to ensure + * that the offsets of the fields in this + * structure are not changed. */ +#else + Tcl_HashEntry **bucketPtr; /* Pointer to bucket that points to first + * entry in this entry's chain: used for + * deleting the entry. */ +#endif + ClientData clientData; /* Application stores something here with + * Tcl_SetHashValue. */ + union { /* Key has one of these forms: */ + char *oneWordValue; /* One-word value for key. */ + Tcl_Obj *objPtr; /* Tcl_Obj * key value. */ + int words[1]; /* Multiple integer words for key. The actual + * size will be as large as necessary for this + * table's keys. */ + char string[4]; /* String for key. The actual size will be as + * large as needed to hold the key. */ + } key; /* MUST BE LAST FIELD IN RECORD!! */ +}; + +/* + * Flags used in Tcl_HashKeyType. + * + * TCL_HASH_KEY_RANDOMIZE_HASH - + * There are some things, pointers for example + * which don't hash well because they do not use + * the lower bits. If this flag is set then the + * hash table will attempt to rectify this by + * randomising the bits and then using the upper + * N bits as the index into the table. + * TCL_HASH_KEY_SYSTEM_HASH - If this flag is set then all memory internally + * allocated for the hash table that is not for an + * entry will use the system heap. + */ + +#define TCL_HASH_KEY_RANDOMIZE_HASH 0x1 +#define TCL_HASH_KEY_SYSTEM_HASH 0x2 + +/* + * Structure definition for the methods associated with a hash table key type. + */ + +#define TCL_HASH_KEY_TYPE_VERSION 1 +struct Tcl_HashKeyType { + int version; /* Version of the table. If this structure is + * extended in future then the version can be + * used to distinguish between different + * structures. */ + int flags; /* Flags, see above for details. */ + Tcl_HashKeyProc *hashKeyProc; + /* Calculates a hash value for the key. If + * this is NULL then the pointer itself is + * used as a hash value. */ + Tcl_CompareHashKeysProc *compareKeysProc; + /* Compares two keys and returns zero if they + * do not match, and non-zero if they do. If + * this is NULL then the pointers are + * compared. */ + Tcl_AllocHashEntryProc *allocEntryProc; + /* Called to allocate memory for a new entry, + * i.e. if the key is a string then this could + * allocate a single block which contains + * enough space for both the entry and the + * string. Only the key field of the allocated + * Tcl_HashEntry structure needs to be filled + * in. If something else needs to be done to + * the key, i.e. incrementing a reference + * count then that should be done by this + * function. If this is NULL then Tcl_Alloc is + * used to allocate enough space for a + * Tcl_HashEntry and the key pointer is + * assigned to key.oneWordValue. */ + Tcl_FreeHashEntryProc *freeEntryProc; + /* Called to free memory associated with an + * entry. If something else needs to be done + * to the key, i.e. decrementing a reference + * count then that should be done by this + * function. If this is NULL then Tcl_Free is + * used to free the Tcl_HashEntry. */ +}; + +/* + * Structure definition for a hash table. Must be in tcl.h so clients can + * allocate space for these structures, but clients should never access any + * fields in this structure. + */ + +#define TCL_SMALL_HASH_TABLE 4 +struct Tcl_HashTable { + Tcl_HashEntry **buckets; /* Pointer to bucket array. Each element + * points to first entry in bucket's hash + * chain, or NULL. */ + Tcl_HashEntry *staticBuckets[TCL_SMALL_HASH_TABLE]; + /* Bucket array used for small tables (to + * avoid mallocs and frees). */ + int numBuckets; /* Total number of buckets allocated at + * **bucketPtr. */ + int numEntries; /* Total number of entries present in + * table. */ + int rebuildSize; /* Enlarge table when numEntries gets to be + * this large. */ + int downShift; /* Shift count used in hashing function. + * Designed to use high-order bits of + * randomized keys. */ + int mask; /* Mask value used in hashing function. */ + int keyType; /* Type of keys used in this table. It's + * either TCL_CUSTOM_KEYS, TCL_STRING_KEYS, + * TCL_ONE_WORD_KEYS, or an integer giving the + * number of ints that is the size of the + * key. */ + Tcl_HashEntry *(*findProc) _ANSI_ARGS_((Tcl_HashTable *tablePtr, + CONST char *key)); + Tcl_HashEntry *(*createProc) _ANSI_ARGS_((Tcl_HashTable *tablePtr, + CONST char *key, int *newPtr)); + Tcl_HashKeyType *typePtr; /* Type of the keys used in the + * Tcl_HashTable. */ +}; + +/* + * Structure definition for information used to keep track of searches through + * hash tables: + */ + +typedef struct Tcl_HashSearch { + Tcl_HashTable *tablePtr; /* Table being searched. */ + int nextIndex; /* Index of next bucket to be enumerated after + * present one. */ + Tcl_HashEntry *nextEntryPtr;/* Next entry to be enumerated in the current + * bucket. */ +} Tcl_HashSearch; + +/* + * Acceptable key types for hash tables: + * + * TCL_STRING_KEYS: The keys are strings, they are copied into the + * entry. + * TCL_ONE_WORD_KEYS: The keys are pointers, the pointer is stored + * in the entry. + * TCL_CUSTOM_TYPE_KEYS: The keys are arbitrary types which are copied + * into the entry. + * TCL_CUSTOM_PTR_KEYS: The keys are pointers to arbitrary types, the + * pointer is stored in the entry. + * + * While maintaining binary compatability the above have to be distinct values + * as they are used to differentiate between old versions of the hash table + * which don't have a typePtr and new ones which do. Once binary compatability + * is discarded in favour of making more wide spread changes TCL_STRING_KEYS + * can be the same as TCL_CUSTOM_TYPE_KEYS, and TCL_ONE_WORD_KEYS can be the + * same as TCL_CUSTOM_PTR_KEYS because they simply determine how the key is + * accessed from the entry and not the behaviour. + */ + +#define TCL_STRING_KEYS 0 +#define TCL_ONE_WORD_KEYS 1 +#define TCL_CUSTOM_TYPE_KEYS -2 +#define TCL_CUSTOM_PTR_KEYS -1 + +/* + * Structure definition for information used to keep track of searches through + * dictionaries. These fields should not be accessed by code outside + * tclDictObj.c + */ + +typedef struct { + void *next; /* Search position for underlying hash + * table. */ + int epoch; /* Epoch marker for dictionary being searched, + * or -1 if search has terminated. */ + Tcl_Dict dictionaryPtr; /* Reference to dictionary being searched. */ +} Tcl_DictSearch; + +/* + * Flag values to pass to Tcl_DoOneEvent to disable searches for some kinds of + * events: + */ + +#define TCL_DONT_WAIT (1<<1) +#define TCL_WINDOW_EVENTS (1<<2) +#define TCL_FILE_EVENTS (1<<3) +#define TCL_TIMER_EVENTS (1<<4) +#define TCL_IDLE_EVENTS (1<<5) /* WAS 0x10 ???? */ +#define TCL_ALL_EVENTS (~TCL_DONT_WAIT) + +/* + * The following structure defines a generic event for the Tcl event system. + * These are the things that are queued in calls to Tcl_QueueEvent and + * serviced later by Tcl_DoOneEvent. There can be many different kinds of + * events with different fields, corresponding to window events, timer events, + * etc. The structure for a particular event consists of a Tcl_Event header + * followed by additional information specific to that event. + */ + +struct Tcl_Event { + Tcl_EventProc *proc; /* Function to call to service this event. */ + struct Tcl_Event *nextPtr; /* Next in list of pending events, or NULL. */ +}; + +/* + * Positions to pass to Tcl_QueueEvent: + */ + +typedef enum { + TCL_QUEUE_TAIL, TCL_QUEUE_HEAD, TCL_QUEUE_MARK +} Tcl_QueuePosition; + +/* + * Values to pass to Tcl_SetServiceMode to specify the behavior of notifier + * event routines. + */ + +#define TCL_SERVICE_NONE 0 +#define TCL_SERVICE_ALL 1 + +/* + * The following structure keeps is used to hold a time value, either as an + * absolute time (the number of seconds from the epoch) or as an elapsed time. + * On Unix systems the epoch is Midnight Jan 1, 1970 GMT. + */ + +typedef struct Tcl_Time { + long sec; /* Seconds. */ + long usec; /* Microseconds. */ +} Tcl_Time; + +typedef void (Tcl_SetTimerProc) _ANSI_ARGS_((Tcl_Time *timePtr)); +typedef int (Tcl_WaitForEventProc) _ANSI_ARGS_((Tcl_Time *timePtr)); + +/* + * TIP #233 (Virtualized Time) + */ + +typedef void (Tcl_GetTimeProc) _ANSI_ARGS_((Tcl_Time *timebuf, + ClientData clientData)); +typedef void (Tcl_ScaleTimeProc) _ANSI_ARGS_((Tcl_Time *timebuf, + ClientData clientData)); + +/* + * Bits to pass to Tcl_CreateFileHandler and Tcl_CreateChannelHandler to + * indicate what sorts of events are of interest: + */ + +#define TCL_READABLE (1<<1) +#define TCL_WRITABLE (1<<2) +#define TCL_EXCEPTION (1<<3) + +/* + * Flag values to pass to Tcl_OpenCommandChannel to indicate the disposition + * of the stdio handles. TCL_STDIN, TCL_STDOUT, TCL_STDERR, are also used in + * Tcl_GetStdChannel. + */ + +#define TCL_STDIN (1<<1) +#define TCL_STDOUT (1<<2) +#define TCL_STDERR (1<<3) +#define TCL_ENFORCE_MODE (1<<4) + +/* + * Bits passed to Tcl_DriverClose2Proc to indicate which side of a channel + * should be closed. + */ + +#define TCL_CLOSE_READ (1<<1) +#define TCL_CLOSE_WRITE (1<<2) + +/* + * Value to use as the closeProc for a channel that supports the close2Proc + * interface. + */ + +#define TCL_CLOSE2PROC ((Tcl_DriverCloseProc *) 1) + +/* + * Channel version tag. This was introduced in 8.3.2/8.4. + */ + +#define TCL_CHANNEL_VERSION_1 ((Tcl_ChannelTypeVersion) 0x1) +#define TCL_CHANNEL_VERSION_2 ((Tcl_ChannelTypeVersion) 0x2) +#define TCL_CHANNEL_VERSION_3 ((Tcl_ChannelTypeVersion) 0x3) +#define TCL_CHANNEL_VERSION_4 ((Tcl_ChannelTypeVersion) 0x4) +#define TCL_CHANNEL_VERSION_5 ((Tcl_ChannelTypeVersion) 0x5) + +/* + * TIP #218: Channel Actions, Ids for Tcl_DriverThreadActionProc. + */ + +#define TCL_CHANNEL_THREAD_INSERT (0) +#define TCL_CHANNEL_THREAD_REMOVE (1) + +/* + * Typedefs for the various operations in a channel type: + */ + +typedef int (Tcl_DriverBlockModeProc) _ANSI_ARGS_(( + ClientData instanceData, int mode)); +typedef int (Tcl_DriverCloseProc) _ANSI_ARGS_((ClientData instanceData, + Tcl_Interp *interp)); +typedef int (Tcl_DriverClose2Proc) _ANSI_ARGS_((ClientData instanceData, + Tcl_Interp *interp, int flags)); +typedef int (Tcl_DriverInputProc) _ANSI_ARGS_((ClientData instanceData, + char *buf, int toRead, int *errorCodePtr)); +typedef int (Tcl_DriverOutputProc) _ANSI_ARGS_((ClientData instanceData, + CONST84 char *buf, int toWrite, int *errorCodePtr)); +typedef int (Tcl_DriverSeekProc) _ANSI_ARGS_((ClientData instanceData, + long offset, int mode, int *errorCodePtr)); +typedef int (Tcl_DriverSetOptionProc) _ANSI_ARGS_(( + ClientData instanceData, Tcl_Interp *interp, + CONST char *optionName, CONST char *value)); +typedef int (Tcl_DriverGetOptionProc) _ANSI_ARGS_(( + ClientData instanceData, Tcl_Interp *interp, + CONST84 char *optionName, Tcl_DString *dsPtr)); +typedef void (Tcl_DriverWatchProc) _ANSI_ARGS_(( + ClientData instanceData, int mask)); +typedef int (Tcl_DriverGetHandleProc) _ANSI_ARGS_(( + ClientData instanceData, int direction, + ClientData *handlePtr)); +typedef int (Tcl_DriverFlushProc) _ANSI_ARGS_((ClientData instanceData)); +typedef int (Tcl_DriverHandlerProc) _ANSI_ARGS_(( + ClientData instanceData, int interestMask)); +typedef Tcl_WideInt (Tcl_DriverWideSeekProc) _ANSI_ARGS_(( + ClientData instanceData, Tcl_WideInt offset, + int mode, int *errorCodePtr)); +/* + * TIP #218, Channel Thread Actions + */ +typedef void (Tcl_DriverThreadActionProc) _ANSI_ARGS_ (( + ClientData instanceData, int action)); +/* + * TIP #208, File Truncation (etc.) + */ +typedef int (Tcl_DriverTruncateProc) _ANSI_ARGS_(( + ClientData instanceData, Tcl_WideInt length)); + +/* + * struct Tcl_ChannelType: + * + * One such structure exists for each type (kind) of channel. It collects + * together in one place all the functions that are part of the specific + * channel type. + * + * It is recommend that the Tcl_Channel* functions are used to access elements + * of this structure, instead of direct accessing. + */ + +typedef struct Tcl_ChannelType { + char *typeName; /* The name of the channel type in Tcl + * commands. This storage is owned by channel + * type. */ + Tcl_ChannelTypeVersion version; + /* Version of the channel type. */ + Tcl_DriverCloseProc *closeProc; + /* Function to call to close the channel, or + * TCL_CLOSE2PROC if the close2Proc should be + * used instead. */ + Tcl_DriverInputProc *inputProc; + /* Function to call for input on channel. */ + Tcl_DriverOutputProc *outputProc; + /* Function to call for output on channel. */ + Tcl_DriverSeekProc *seekProc; + /* Function to call to seek on the channel. + * May be NULL. */ + Tcl_DriverSetOptionProc *setOptionProc; + /* Set an option on a channel. */ + Tcl_DriverGetOptionProc *getOptionProc; + /* Get an option from a channel. */ + Tcl_DriverWatchProc *watchProc; + /* Set up the notifier to watch for events on + * this channel. */ + Tcl_DriverGetHandleProc *getHandleProc; + /* Get an OS handle from the channel or NULL + * if not supported. */ + Tcl_DriverClose2Proc *close2Proc; + /* Function to call to close the channel if + * the device supports closing the read & + * write sides independently. */ + Tcl_DriverBlockModeProc *blockModeProc; + /* Set blocking mode for the raw channel. May + * be NULL. */ + /* + * Only valid in TCL_CHANNEL_VERSION_2 channels or later. + */ + Tcl_DriverFlushProc *flushProc; + /* Function to call to flush a channel. May be + * NULL. */ + Tcl_DriverHandlerProc *handlerProc; + /* Function to call to handle a channel event. + * This will be passed up the stacked channel + * chain. */ + /* + * Only valid in TCL_CHANNEL_VERSION_3 channels or later. + */ + Tcl_DriverWideSeekProc *wideSeekProc; + /* Function to call to seek on the channel + * which can handle 64-bit offsets. May be + * NULL, and must be NULL if seekProc is + * NULL. */ + /* + * Only valid in TCL_CHANNEL_VERSION_4 channels or later. + * TIP #218, Channel Thread Actions. + */ + Tcl_DriverThreadActionProc *threadActionProc; + /* Function to call to notify the driver of + * thread specific activity for a channel. May + * be NULL. */ + + /* + * Only valid in TCL_CHANNEL_VERSION_5 channels or later. + * TIP #208, File Truncation. + */ + Tcl_DriverTruncateProc *truncateProc; + /* Function to call to truncate the underlying + * file to a particular length. May be NULL if + * the channel does not support truncation. */ +} Tcl_ChannelType; + +/* + * The following flags determine whether the blockModeProc above should set + * the channel into blocking or nonblocking mode. They are passed as arguments + * to the blockModeProc function in the above structure. + */ + +#define TCL_MODE_BLOCKING 0 /* Put channel into blocking mode. */ +#define TCL_MODE_NONBLOCKING 1 /* Put channel into nonblocking + * mode. */ + +/* + * Enum for different types of file paths. + */ + +typedef enum Tcl_PathType { + TCL_PATH_ABSOLUTE, + TCL_PATH_RELATIVE, + TCL_PATH_VOLUME_RELATIVE +} Tcl_PathType; + +/* + * The following structure is used to pass glob type data amongst the various + * glob routines and Tcl_FSMatchInDirectory. + */ + +typedef struct Tcl_GlobTypeData { + int type; /* Corresponds to bcdpfls as in 'find -t'. */ + int perm; /* Corresponds to file permissions. */ + Tcl_Obj *macType; /* Acceptable Mac type. */ + Tcl_Obj *macCreator; /* Acceptable Mac creator. */ +} Tcl_GlobTypeData; + +/* + * Type and permission definitions for glob command. + */ + +#define TCL_GLOB_TYPE_BLOCK (1<<0) +#define TCL_GLOB_TYPE_CHAR (1<<1) +#define TCL_GLOB_TYPE_DIR (1<<2) +#define TCL_GLOB_TYPE_PIPE (1<<3) +#define TCL_GLOB_TYPE_FILE (1<<4) +#define TCL_GLOB_TYPE_LINK (1<<5) +#define TCL_GLOB_TYPE_SOCK (1<<6) +#define TCL_GLOB_TYPE_MOUNT (1<<7) + +#define TCL_GLOB_PERM_RONLY (1<<0) +#define TCL_GLOB_PERM_HIDDEN (1<<1) +#define TCL_GLOB_PERM_R (1<<2) +#define TCL_GLOB_PERM_W (1<<3) +#define TCL_GLOB_PERM_X (1<<4) + +/* + * Flags for the unload callback function. + */ + +#define TCL_UNLOAD_DETACH_FROM_INTERPRETER (1<<0) +#define TCL_UNLOAD_DETACH_FROM_PROCESS (1<<1) + +/* + * Typedefs for the various filesystem operations: + */ + +typedef int (Tcl_FSStatProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, Tcl_StatBuf *buf)); +typedef int (Tcl_FSAccessProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, int mode)); +typedef Tcl_Channel (Tcl_FSOpenFileChannelProc) _ANSI_ARGS_(( + Tcl_Interp *interp, Tcl_Obj *pathPtr, int mode, int permissions)); +typedef int (Tcl_FSMatchInDirectoryProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *result, Tcl_Obj *pathPtr, CONST char *pattern, + Tcl_GlobTypeData * types)); +typedef Tcl_Obj * (Tcl_FSGetCwdProc) _ANSI_ARGS_((Tcl_Interp *interp)); +typedef int (Tcl_FSChdirProc) _ANSI_ARGS_((Tcl_Obj *pathPtr)); +typedef int (Tcl_FSLstatProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, + Tcl_StatBuf *buf)); +typedef int (Tcl_FSCreateDirectoryProc) _ANSI_ARGS_((Tcl_Obj *pathPtr)); +typedef int (Tcl_FSDeleteFileProc) _ANSI_ARGS_((Tcl_Obj *pathPtr)); +typedef int (Tcl_FSCopyDirectoryProc) _ANSI_ARGS_((Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr, Tcl_Obj **errorPtr)); +typedef int (Tcl_FSCopyFileProc) _ANSI_ARGS_((Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr)); +typedef int (Tcl_FSRemoveDirectoryProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, + int recursive, Tcl_Obj **errorPtr)); +typedef int (Tcl_FSRenameFileProc) _ANSI_ARGS_((Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr)); +typedef void (Tcl_FSUnloadFileProc) _ANSI_ARGS_((Tcl_LoadHandle loadHandle)); +typedef Tcl_Obj * (Tcl_FSListVolumesProc) _ANSI_ARGS_((void)); +/* We have to declare the utime structure here. */ +struct utimbuf; +typedef int (Tcl_FSUtimeProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, + struct utimbuf *tval)); +typedef int (Tcl_FSNormalizePathProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *pathPtr, int nextCheckpoint)); +typedef int (Tcl_FSFileAttrsGetProc) _ANSI_ARGS_((Tcl_Interp *interp, + int index, Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef)); +typedef CONST char ** (Tcl_FSFileAttrStringsProc) _ANSI_ARGS_(( + Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef)); +typedef int (Tcl_FSFileAttrsSetProc) _ANSI_ARGS_((Tcl_Interp *interp, + int index, Tcl_Obj *pathPtr, Tcl_Obj *objPtr)); +typedef Tcl_Obj * (Tcl_FSLinkProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, + Tcl_Obj *toPtr, int linkType)); +typedef int (Tcl_FSLoadFileProc) _ANSI_ARGS_((Tcl_Interp * interp, + Tcl_Obj *pathPtr, Tcl_LoadHandle *handlePtr, + Tcl_FSUnloadFileProc **unloadProcPtr)); +typedef int (Tcl_FSPathInFilesystemProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, + ClientData *clientDataPtr)); +typedef Tcl_Obj * (Tcl_FSFilesystemPathTypeProc) _ANSI_ARGS_(( + Tcl_Obj *pathPtr)); +typedef Tcl_Obj * (Tcl_FSFilesystemSeparatorProc) _ANSI_ARGS_(( + Tcl_Obj *pathPtr)); +typedef void (Tcl_FSFreeInternalRepProc) _ANSI_ARGS_((ClientData clientData)); +typedef ClientData (Tcl_FSDupInternalRepProc) _ANSI_ARGS_(( + ClientData clientData)); +typedef Tcl_Obj * (Tcl_FSInternalToNormalizedProc) _ANSI_ARGS_(( + ClientData clientData)); +typedef ClientData (Tcl_FSCreateInternalRepProc) _ANSI_ARGS_(( + Tcl_Obj *pathPtr)); + +typedef struct Tcl_FSVersion_ *Tcl_FSVersion; + +/* + *---------------------------------------------------------------- + * Data structures related to hooking into the filesystem + *---------------------------------------------------------------- + */ + +/* + * Filesystem version tag. This was introduced in 8.4. + */ +#define TCL_FILESYSTEM_VERSION_1 ((Tcl_FSVersion) 0x1) + +/* + * struct Tcl_Filesystem: + * + * One such structure exists for each type (kind) of filesystem. It collects + * together in one place all the functions that are part of the specific + * filesystem. Tcl always accesses the filesystem through one of these + * structures. + * + * Not all entries need be non-NULL; any which are NULL are simply ignored. + * However, a complete filesystem should provide all of these functions. The + * explanations in the structure show the importance of each function. + */ + +typedef struct Tcl_Filesystem { + CONST char *typeName; /* The name of the filesystem. */ + int structureLength; /* Length of this structure, so future binary + * compatibility can be assured. */ + Tcl_FSVersion version; /* Version of the filesystem type. */ + Tcl_FSPathInFilesystemProc *pathInFilesystemProc; + /* Function to check whether a path is in this + * filesystem. This is the most important + * filesystem function. */ + Tcl_FSDupInternalRepProc *dupInternalRepProc; + /* Function to duplicate internal fs rep. May + * be NULL (but then fs is less efficient). */ + Tcl_FSFreeInternalRepProc *freeInternalRepProc; + /* Function to free internal fs rep. Must be + * implemented if internal representations + * need freeing, otherwise it can be NULL. */ + Tcl_FSInternalToNormalizedProc *internalToNormalizedProc; + /* Function to convert internal representation + * to a normalized path. Only required if the + * fs creates pure path objects with no + * string/path representation. */ + Tcl_FSCreateInternalRepProc *createInternalRepProc; + /* Function to create a filesystem-specific + * internal representation. May be NULL if + * paths have no internal representation, or + * if the Tcl_FSPathInFilesystemProc for this + * filesystem always immediately creates an + * internal representation for paths it + * accepts. */ + Tcl_FSNormalizePathProc *normalizePathProc; + /* Function to normalize a path. Should be + * implemented for all filesystems which can + * have multiple string representations for + * the same path object. */ + Tcl_FSFilesystemPathTypeProc *filesystemPathTypeProc; + /* Function to determine the type of a path in + * this filesystem. May be NULL. */ + Tcl_FSFilesystemSeparatorProc *filesystemSeparatorProc; + /* Function to return the separator + * character(s) for this filesystem. Must be + * implemented. */ + Tcl_FSStatProc *statProc; /* Function to process a 'Tcl_FSStat()' call. + * Must be implemented for any reasonable + * filesystem. */ + Tcl_FSAccessProc *accessProc; + /* Function to process a 'Tcl_FSAccess()' + * call. Must be implemented for any + * reasonable filesystem. */ + Tcl_FSOpenFileChannelProc *openFileChannelProc; + /* Function to process a + * 'Tcl_FSOpenFileChannel()' call. Must be + * implemented for any reasonable + * filesystem. */ + Tcl_FSMatchInDirectoryProc *matchInDirectoryProc; + /* Function to process a + * 'Tcl_FSMatchInDirectory()'. If not + * implemented, then glob and recursive copy + * functionality will be lacking in the + * filesystem. */ + Tcl_FSUtimeProc *utimeProc; /* Function to process a 'Tcl_FSUtime()' call. + * Required to allow setting (not reading) of + * times with 'file mtime', 'file atime' and + * the open-r/open-w/fcopy implementation of + * 'file copy'. */ + Tcl_FSLinkProc *linkProc; /* Function to process a 'Tcl_FSLink()' call. + * Should be implemented only if the + * filesystem supports links (reading or + * creating). */ + Tcl_FSListVolumesProc *listVolumesProc; + /* Function to list any filesystem volumes + * added by this filesystem. Should be + * implemented only if the filesystem adds + * volumes at the head of the filesystem. */ + Tcl_FSFileAttrStringsProc *fileAttrStringsProc; + /* Function to list all attributes strings + * which are valid for this filesystem. If not + * implemented the filesystem will not support + * the 'file attributes' command. This allows + * arbitrary additional information to be + * attached to files in the filesystem. */ + Tcl_FSFileAttrsGetProc *fileAttrsGetProc; + /* Function to process a + * 'Tcl_FSFileAttrsGet()' call, used by 'file + * attributes'. */ + Tcl_FSFileAttrsSetProc *fileAttrsSetProc; + /* Function to process a + * 'Tcl_FSFileAttrsSet()' call, used by 'file + * attributes'. */ + Tcl_FSCreateDirectoryProc *createDirectoryProc; + /* Function to process a + * 'Tcl_FSCreateDirectory()' call. Should be + * implemented unless the FS is read-only. */ + Tcl_FSRemoveDirectoryProc *removeDirectoryProc; + /* Function to process a + * 'Tcl_FSRemoveDirectory()' call. Should be + * implemented unless the FS is read-only. */ + Tcl_FSDeleteFileProc *deleteFileProc; + /* Function to process a 'Tcl_FSDeleteFile()' + * call. Should be implemented unless the FS + * is read-only. */ + Tcl_FSCopyFileProc *copyFileProc; + /* Function to process a 'Tcl_FSCopyFile()' + * call. If not implemented Tcl will fall back + * on open-r, open-w and fcopy as a copying + * mechanism, for copying actions initiated in + * Tcl (not C). */ + Tcl_FSRenameFileProc *renameFileProc; + /* Function to process a 'Tcl_FSRenameFile()' + * call. If not implemented, Tcl will fall + * back on a copy and delete mechanism, for + * rename actions initiated in Tcl (not C). */ + Tcl_FSCopyDirectoryProc *copyDirectoryProc; + /* Function to process a + * 'Tcl_FSCopyDirectory()' call. If not + * implemented, Tcl will fall back on a + * recursive create-dir, file copy mechanism, + * for copying actions initiated in Tcl (not + * C). */ + Tcl_FSLstatProc *lstatProc; /* Function to process a 'Tcl_FSLstat()' call. + * If not implemented, Tcl will attempt to use + * the 'statProc' defined above instead. */ + Tcl_FSLoadFileProc *loadFileProc; + /* Function to process a 'Tcl_FSLoadFile()' + * call. If not implemented, Tcl will fall + * back on a copy to native-temp followed by a + * Tcl_FSLoadFile on that temporary copy. */ + Tcl_FSGetCwdProc *getCwdProc; + /* Function to process a 'Tcl_FSGetCwd()' + * call. Most filesystems need not implement + * this. It will usually only be called once, + * if 'getcwd' is called before 'chdir'. May + * be NULL. */ + Tcl_FSChdirProc *chdirProc; /* Function to process a 'Tcl_FSChdir()' call. + * If filesystems do not implement this, it + * will be emulated by a series of directory + * access checks. Otherwise, virtual + * filesystems which do implement it need only + * respond with a positive return result if + * the dirName is a valid directory in their + * filesystem. They need not remember the + * result, since that will be automatically + * remembered for use by GetCwd. Real + * filesystems should carry out the correct + * action (i.e. call the correct system + * 'chdir' api). If not implemented, then 'cd' + * and 'pwd' will fail inside the + * filesystem. */ +} Tcl_Filesystem; + +/* + * The following definitions are used as values for the 'linkAction' flag to + * Tcl_FSLink, or the linkProc of any filesystem. Any combination of flags can + * be given. For link creation, the linkProc should create a link which + * matches any of the types given. + * + * TCL_CREATE_SYMBOLIC_LINK - Create a symbolic or soft link. + * TCL_CREATE_HARD_LINK - Create a hard link. + */ + +#define TCL_CREATE_SYMBOLIC_LINK 0x01 +#define TCL_CREATE_HARD_LINK 0x02 + +/* + * The following structure represents the Notifier functions that you can + * override with the Tcl_SetNotifier call. + */ + +typedef struct Tcl_NotifierProcs { + Tcl_SetTimerProc *setTimerProc; + Tcl_WaitForEventProc *waitForEventProc; + Tcl_CreateFileHandlerProc *createFileHandlerProc; + Tcl_DeleteFileHandlerProc *deleteFileHandlerProc; + Tcl_InitNotifierProc *initNotifierProc; + Tcl_FinalizeNotifierProc *finalizeNotifierProc; + Tcl_AlertNotifierProc *alertNotifierProc; + Tcl_ServiceModeHookProc *serviceModeHookProc; +} Tcl_NotifierProcs; + +/* + * The following structure represents a user-defined encoding. It collects + * together all the functions that are used by the specific encoding. + */ + +typedef struct Tcl_EncodingType { + CONST char *encodingName; /* The name of the encoding, e.g. "euc-jp". + * This name is the unique key for this + * encoding type. */ + Tcl_EncodingConvertProc *toUtfProc; + /* Function to convert from external encoding + * into UTF-8. */ + Tcl_EncodingConvertProc *fromUtfProc; + /* Function to convert from UTF-8 into + * external encoding. */ + Tcl_EncodingFreeProc *freeProc; + /* If non-NULL, function to call when this + * encoding is deleted. */ + ClientData clientData; /* Arbitrary value associated with encoding + * type. Passed to conversion functions. */ + int nullSize; /* Number of zero bytes that signify + * end-of-string in this encoding. This number + * is used to determine the source string + * length when the srcLen argument is + * negative. Must be 1 or 2. */ +} Tcl_EncodingType; + +/* + * The following definitions are used as values for the conversion control + * flags argument when converting text from one character set to another: + * + * TCL_ENCODING_START - Signifies that the source buffer is the first + * block in a (potentially multi-block) input + * stream. Tells the conversion function to reset + * to an initial state and perform any + * initialization that needs to occur before the + * first byte is converted. If the source buffer + * contains the entire input stream to be + * converted, this flag should be set. + * TCL_ENCODING_END - Signifies that the source buffer is the last + * block in a (potentially multi-block) input + * stream. Tells the conversion routine to + * perform any finalization that needs to occur + * after the last byte is converted and then to + * reset to an initial state. If the source + * buffer contains the entire input stream to be + * converted, this flag should be set. + * TCL_ENCODING_STOPONERROR - If set, then the converter will return + * immediately upon encountering an invalid byte + * sequence or a source character that has no + * mapping in the target encoding. If clear, then + * the converter will skip the problem, + * substituting one or more "close" characters in + * the destination buffer and then continue to + * convert the source. + */ + +#define TCL_ENCODING_START 0x01 +#define TCL_ENCODING_END 0x02 +#define TCL_ENCODING_STOPONERROR 0x04 + +/* + * The following data structures and declarations are for the new Tcl parser. + */ + +/* + * For each word of a command, and for each piece of a word such as a variable + * reference, one of the following structures is created to describe the + * token. + */ + +typedef struct Tcl_Token { + int type; /* Type of token, such as TCL_TOKEN_WORD; see + * below for valid types. */ + CONST char *start; /* First character in token. */ + int size; /* Number of bytes in token. */ + int numComponents; /* If this token is composed of other tokens, + * this field tells how many of them there are + * (including components of components, etc.). + * The component tokens immediately follow + * this one. */ +} Tcl_Token; + +/* + * Type values defined for Tcl_Token structures. These values are defined as + * mask bits so that it's easy to check for collections of types. + * + * TCL_TOKEN_WORD - The token describes one word of a command, + * from the first non-blank character of the word + * (which may be " or {) up to but not including + * the space, semicolon, or bracket that + * terminates the word. NumComponents counts the + * total number of sub-tokens that make up the + * word. This includes, for example, sub-tokens + * of TCL_TOKEN_VARIABLE tokens. + * TCL_TOKEN_SIMPLE_WORD - This token is just like TCL_TOKEN_WORD except + * that the word is guaranteed to consist of a + * single TCL_TOKEN_TEXT sub-token. + * TCL_TOKEN_TEXT - The token describes a range of literal text + * that is part of a word. NumComponents is + * always 0. + * TCL_TOKEN_BS - The token describes a backslash sequence that + * must be collapsed. NumComponents is always 0. + * TCL_TOKEN_COMMAND - The token describes a command whose result + * must be substituted into the word. The token + * includes the enclosing brackets. NumComponents + * is always 0. + * TCL_TOKEN_VARIABLE - The token describes a variable substitution, + * including the dollar sign, variable name, and + * array index (if there is one) up through the + * right parentheses. NumComponents tells how + * many additional tokens follow to represent the + * variable name. The first token will be a + * TCL_TOKEN_TEXT token that describes the + * variable name. If the variable is an array + * reference then there will be one or more + * additional tokens, of type TCL_TOKEN_TEXT, + * TCL_TOKEN_BS, TCL_TOKEN_COMMAND, and + * TCL_TOKEN_VARIABLE, that describe the array + * index; numComponents counts the total number + * of nested tokens that make up the variable + * reference, including sub-tokens of + * TCL_TOKEN_VARIABLE tokens. + * TCL_TOKEN_SUB_EXPR - The token describes one subexpression of an + * expression, from the first non-blank character + * of the subexpression up to but not including + * the space, brace, or bracket that terminates + * the subexpression. NumComponents counts the + * total number of following subtokens that make + * up the subexpression; this includes all + * subtokens for any nested TCL_TOKEN_SUB_EXPR + * tokens. For example, a numeric value used as a + * primitive operand is described by a + * TCL_TOKEN_SUB_EXPR token followed by a + * TCL_TOKEN_TEXT token. A binary subexpression + * is described by a TCL_TOKEN_SUB_EXPR token + * followed by the TCL_TOKEN_OPERATOR token for + * the operator, then TCL_TOKEN_SUB_EXPR tokens + * for the left then the right operands. + * TCL_TOKEN_OPERATOR - The token describes one expression operator. + * An operator might be the name of a math + * function such as "abs". A TCL_TOKEN_OPERATOR + * token is always preceeded by one + * TCL_TOKEN_SUB_EXPR token for the operator's + * subexpression, and is followed by zero or more + * TCL_TOKEN_SUB_EXPR tokens for the operator's + * operands. NumComponents is always 0. + * TCL_TOKEN_EXPAND_WORD - This token is just like TCL_TOKEN_WORD except + * that it marks a word that began with the + * literal character prefix "{*}". This word is + * marked to be expanded - that is, broken into + * words after substitution is complete. + */ + +#define TCL_TOKEN_WORD 1 +#define TCL_TOKEN_SIMPLE_WORD 2 +#define TCL_TOKEN_TEXT 4 +#define TCL_TOKEN_BS 8 +#define TCL_TOKEN_COMMAND 16 +#define TCL_TOKEN_VARIABLE 32 +#define TCL_TOKEN_SUB_EXPR 64 +#define TCL_TOKEN_OPERATOR 128 +#define TCL_TOKEN_EXPAND_WORD 256 + +/* + * Parsing error types. On any parsing error, one of these values will be + * stored in the error field of the Tcl_Parse structure defined below. + */ + +#define TCL_PARSE_SUCCESS 0 +#define TCL_PARSE_QUOTE_EXTRA 1 +#define TCL_PARSE_BRACE_EXTRA 2 +#define TCL_PARSE_MISSING_BRACE 3 +#define TCL_PARSE_MISSING_BRACKET 4 +#define TCL_PARSE_MISSING_PAREN 5 +#define TCL_PARSE_MISSING_QUOTE 6 +#define TCL_PARSE_MISSING_VAR_BRACE 7 +#define TCL_PARSE_SYNTAX 8 +#define TCL_PARSE_BAD_NUMBER 9 + +/* + * A structure of the following type is filled in by Tcl_ParseCommand. It + * describes a single command parsed from an input string. + */ + +#define NUM_STATIC_TOKENS 20 + +typedef struct Tcl_Parse { + CONST char *commentStart; /* Pointer to # that begins the first of one + * or more comments preceding the command. */ + int commentSize; /* Number of bytes in comments (up through + * newline character that terminates the last + * comment). If there were no comments, this + * field is 0. */ + CONST char *commandStart; /* First character in first word of + * command. */ + int commandSize; /* Number of bytes in command, including first + * character of first word, up through the + * terminating newline, close bracket, or + * semicolon. */ + int numWords; /* Total number of words in command. May be + * 0. */ + Tcl_Token *tokenPtr; /* Pointer to first token representing the + * words of the command. Initially points to + * staticTokens, but may change to point to + * malloc-ed space if command exceeds space in + * staticTokens. */ + int numTokens; /* Total number of tokens in command. */ + int tokensAvailable; /* Total number of tokens available at + * *tokenPtr. */ + int errorType; /* One of the parsing error types defined + * above. */ + + /* + * The fields below are intended only for the private use of the parser. + * They should not be used by functions that invoke Tcl_ParseCommand. + */ + + CONST char *string; /* The original command string passed to + * Tcl_ParseCommand. */ + CONST char *end; /* Points to the character just after the last + * one in the command string. */ + Tcl_Interp *interp; /* Interpreter to use for error reporting, or + * NULL. */ + CONST char *term; /* Points to character in string that + * terminated most recent token. Filled in by + * ParseTokens. If an error occurs, points to + * beginning of region where the error + * occurred (e.g. the open brace if the close + * brace is missing). */ + int incomplete; /* This field is set to 1 by Tcl_ParseCommand + * if the command appears to be incomplete. + * This information is used by + * Tcl_CommandComplete. */ + Tcl_Token staticTokens[NUM_STATIC_TOKENS]; + /* Initial space for tokens for command. This + * space should be large enough to accommodate + * most commands; dynamic space is allocated + * for very large commands that don't fit + * here. */ +} Tcl_Parse; + +/* + * The following definitions are the error codes returned by the conversion + * routines: + * + * TCL_OK - All characters were converted. + * TCL_CONVERT_NOSPACE - The output buffer would not have been large + * enough for all of the converted data; as many + * characters as could fit were converted though. + * TCL_CONVERT_MULTIBYTE - The last few bytes in the source string were + * the beginning of a multibyte sequence, but + * more bytes were needed to complete this + * sequence. A subsequent call to the conversion + * routine should pass the beginning of this + * unconverted sequence plus additional bytes + * from the source stream to properly convert the + * formerly split-up multibyte sequence. + * TCL_CONVERT_SYNTAX - The source stream contained an invalid + * character sequence. This may occur if the + * input stream has been damaged or if the input + * encoding method was misidentified. This error + * is reported only if TCL_ENCODING_STOPONERROR + * was specified. + * TCL_CONVERT_UNKNOWN - The source string contained a character that + * could not be represented in the target + * encoding. This error is reported only if + * TCL_ENCODING_STOPONERROR was specified. + */ + +#define TCL_CONVERT_MULTIBYTE -1 +#define TCL_CONVERT_SYNTAX -2 +#define TCL_CONVERT_UNKNOWN -3 +#define TCL_CONVERT_NOSPACE -4 + +/* + * The maximum number of bytes that are necessary to represent a single + * Unicode character in UTF-8. The valid values should be 3 or 6 (or perhaps 1 + * if we want to support a non-unicode enabled core). If 3, then Tcl_UniChar + * must be 2-bytes in size (UCS-2) (the default). If 6, then Tcl_UniChar must + * be 4-bytes in size (UCS-4). At this time UCS-2 mode is the default and + * recommended mode. UCS-4 is experimental and not recommended. It works for + * the core, but most extensions expect UCS-2. + */ + +#ifndef TCL_UTF_MAX +#define TCL_UTF_MAX 3 +#endif + +/* + * This represents a Unicode character. Any changes to this should also be + * reflected in regcustom.h. + */ + +#if TCL_UTF_MAX > 4 + /* + * unsigned int isn't 100% accurate as it should be a strict 4-byte value + * (perhaps wchar_t). 64-bit systems may have troubles. The size of this + * value must be reflected correctly in regcustom.h and + * in tclEncoding.c. + * XXX: Tcl is currently UCS-2 and planning UTF-16 for the Unicode + * XXX: string rep that Tcl_UniChar represents. Changing the size + * XXX: of Tcl_UniChar is /not/ supported. + */ +typedef unsigned int Tcl_UniChar; +#else +typedef unsigned short Tcl_UniChar; +#endif + +/* + * TIP #59: The following structure is used in calls 'Tcl_RegisterConfig' to + * provide the system with the embedded configuration data. + */ + +typedef struct Tcl_Config { + CONST char *key; /* Configuration key to register. ASCII + * encoded, thus UTF-8. */ + CONST char *value; /* The value associated with the key. System + * encoding. */ +} Tcl_Config; + +/* + * Flags for TIP#143 limits, detailing which limits are active in an + * interpreter. Used for Tcl_{Add,Remove}LimitHandler type argument. + */ + +#define TCL_LIMIT_COMMANDS 0x01 +#define TCL_LIMIT_TIME 0x02 + +/* + * Structure containing information about a limit handler to be called when a + * command- or time-limit is exceeded by an interpreter. + */ + +typedef void (Tcl_LimitHandlerProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp)); +typedef void (Tcl_LimitHandlerDeleteProc) _ANSI_ARGS_((ClientData clientData)); + +typedef struct mp_int mp_int; +#define MP_INT_DECLARED +typedef unsigned int mp_digit; +#define MP_DIGIT_DECLARED + +/* + * The following constant is used to test for older versions of Tcl in the + * stubs tables. + * + * Jan Nijtman's plus patch uses 0xFCA1BACF, so we need to pick a different + * value since the stubs tables don't match. + */ + +#define TCL_STUB_MAGIC ((int) 0xFCA3BACF) + +/* + * The following function is required to be defined in all stubs aware + * extensions. The function is actually implemented in the stub library, not + * the main Tcl library, although there is a trivial implementation in the + * main library in case an extension is statically linked into an application. + */ + +EXTERN CONST char * Tcl_InitStubs _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *version, int exact)); +EXTERN CONST char * TclTomMathInitializeStubs _ANSI_ARGS_(( + Tcl_Interp *interp, CONST char *version, + int epoch, int revision)); + +#ifndef USE_TCL_STUBS + +/* + * When not using stubs, make it a macro. + */ + +#define Tcl_InitStubs(interp, version, exact) \ + Tcl_PkgInitStubsCheck(interp, version, exact) + +#endif + + /* + * TODO - tommath stubs export goes here! + */ + + +/* + * Public functions that are not accessible via the stubs table. + * Tcl_GetMemoryInfo is needed for AOLserver. [Bug 1868171] + */ + +EXTERN void Tcl_Main _ANSI_ARGS_((int argc, char **argv, + Tcl_AppInitProc *appInitProc)); +EXTERN CONST char * Tcl_PkgInitStubsCheck _ANSI_ARGS_((Tcl_Interp *interp, + CONST char *version, int exact)); +#if defined(TCL_THREADS) && defined(USE_THREAD_ALLOC) +EXTERN void Tcl_GetMemoryInfo _ANSI_ARGS_((Tcl_DString *dsPtr)); +#endif + +/* + * Include the public function declarations that are accessible via the stubs + * table. + */ + +#include "tclDecls.h" + +/* + * Include platform specific public function declarations that are accessible + * via the stubs table. + */ + +#include "tclPlatDecls.h" + +/* + * The following declarations either map ckalloc and ckfree to malloc and + * free, or they map them to functions with all sorts of debugging hooks + * defined in tclCkalloc.c. + */ + +#ifdef TCL_MEM_DEBUG + +# define ckalloc(x) Tcl_DbCkalloc(x, __FILE__, __LINE__) +# define ckfree(x) Tcl_DbCkfree(x, __FILE__, __LINE__) +# define ckrealloc(x,y) Tcl_DbCkrealloc((x), (y),__FILE__, __LINE__) +# define attemptckalloc(x) Tcl_AttemptDbCkalloc(x, __FILE__, __LINE__) +# define attemptckrealloc(x,y) Tcl_AttemptDbCkrealloc((x), (y), __FILE__, __LINE__) + +#else /* !TCL_MEM_DEBUG */ + +/* + * If we are not using the debugging allocator, we should call the Tcl_Alloc, + * et al. routines in order to guarantee that every module is using the same + * memory allocator both inside and outside of the Tcl library. + */ + +# define ckalloc(x) Tcl_Alloc(x) +# define ckfree(x) Tcl_Free(x) +# define ckrealloc(x,y) Tcl_Realloc(x,y) +# define attemptckalloc(x) Tcl_AttemptAlloc(x) +# define attemptckrealloc(x,y) Tcl_AttemptRealloc(x,y) +# undef Tcl_InitMemory +# define Tcl_InitMemory(x) +# undef Tcl_DumpActiveMemory +# define Tcl_DumpActiveMemory(x) +# undef Tcl_ValidateAllMemory +# define Tcl_ValidateAllMemory(x,y) + +#endif /* !TCL_MEM_DEBUG */ + +#ifdef TCL_MEM_DEBUG +# define Tcl_IncrRefCount(objPtr) \ + Tcl_DbIncrRefCount(objPtr, __FILE__, __LINE__) +# define Tcl_DecrRefCount(objPtr) \ + Tcl_DbDecrRefCount(objPtr, __FILE__, __LINE__) +# define Tcl_IsShared(objPtr) \ + Tcl_DbIsShared(objPtr, __FILE__, __LINE__) +#else +# define Tcl_IncrRefCount(objPtr) \ + ++(objPtr)->refCount + /* + * Use do/while0 idiom for optimum correctness without compiler warnings. + * http://c2.com/cgi/wiki?TrivialDoWhileLoop + */ +# define Tcl_DecrRefCount(objPtr) \ + do { \ + Tcl_Obj *_objPtr = (objPtr); \ + if (--(_objPtr)->refCount <= 0) { \ + TclFreeObj(_objPtr); \ + } \ + } while(0) +# define Tcl_IsShared(objPtr) \ + ((objPtr)->refCount > 1) +#endif + +/* + * Macros and definitions that help to debug the use of Tcl objects. When + * TCL_MEM_DEBUG is defined, the Tcl_New declarations are overridden to call + * debugging versions of the object creation functions. + */ + +#ifdef TCL_MEM_DEBUG +# undef Tcl_NewBignumObj +# define Tcl_NewBignumObj(val) \ + Tcl_DbNewBignumObj(val, __FILE__, __LINE__) +# undef Tcl_NewBooleanObj +# define Tcl_NewBooleanObj(val) \ + Tcl_DbNewBooleanObj(val, __FILE__, __LINE__) +# undef Tcl_NewByteArrayObj +# define Tcl_NewByteArrayObj(bytes, len) \ + Tcl_DbNewByteArrayObj(bytes, len, __FILE__, __LINE__) +# undef Tcl_NewDoubleObj +# define Tcl_NewDoubleObj(val) \ + Tcl_DbNewDoubleObj(val, __FILE__, __LINE__) +# undef Tcl_NewIntObj +# define Tcl_NewIntObj(val) \ + Tcl_DbNewLongObj(val, __FILE__, __LINE__) +# undef Tcl_NewListObj +# define Tcl_NewListObj(objc, objv) \ + Tcl_DbNewListObj(objc, objv, __FILE__, __LINE__) +# undef Tcl_NewLongObj +# define Tcl_NewLongObj(val) \ + Tcl_DbNewLongObj(val, __FILE__, __LINE__) +# undef Tcl_NewObj +# define Tcl_NewObj() \ + Tcl_DbNewObj(__FILE__, __LINE__) +# undef Tcl_NewStringObj +# define Tcl_NewStringObj(bytes, len) \ + Tcl_DbNewStringObj(bytes, len, __FILE__, __LINE__) +# undef Tcl_NewWideIntObj +# define Tcl_NewWideIntObj(val) \ + Tcl_DbNewWideIntObj(val, __FILE__, __LINE__) +#endif /* TCL_MEM_DEBUG */ + +/* + * Macros for clients to use to access fields of hash entries: + */ + +#define Tcl_GetHashValue(h) ((h)->clientData) +#define Tcl_SetHashValue(h, value) ((h)->clientData = (ClientData) (value)) +#define Tcl_GetHashKey(tablePtr, h) \ + ((char *) (((tablePtr)->keyType == TCL_ONE_WORD_KEYS || \ + (tablePtr)->keyType == TCL_CUSTOM_PTR_KEYS) \ + ? (h)->key.oneWordValue \ + : (h)->key.string)) + +/* + * Macros to use for clients to use to invoke find and create functions for + * hash tables: + */ + +#undef Tcl_FindHashEntry +#define Tcl_FindHashEntry(tablePtr, key) \ + (*((tablePtr)->findProc))(tablePtr, key) +#undef Tcl_CreateHashEntry +#define Tcl_CreateHashEntry(tablePtr, key, newPtr) \ + (*((tablePtr)->createProc))(tablePtr, key, newPtr) + +/* + * Macros that eliminate the overhead of the thread synchronization functions + * when compiling without thread support. + */ + +#ifndef TCL_THREADS +#undef Tcl_MutexLock +#define Tcl_MutexLock(mutexPtr) +#undef Tcl_MutexUnlock +#define Tcl_MutexUnlock(mutexPtr) +#undef Tcl_MutexFinalize +#define Tcl_MutexFinalize(mutexPtr) +#undef Tcl_ConditionNotify +#define Tcl_ConditionNotify(condPtr) +#undef Tcl_ConditionWait +#define Tcl_ConditionWait(condPtr, mutexPtr, timePtr) +#undef Tcl_ConditionFinalize +#define Tcl_ConditionFinalize(condPtr) +#endif /* TCL_THREADS */ + +#ifndef TCL_NO_DEPRECATED + /* + * These function have been renamed. The old names are deprecated, but we + * define these macros for backwards compatibilty. + */ + +# define Tcl_Ckalloc Tcl_Alloc +# define Tcl_Ckfree Tcl_Free +# define Tcl_Ckrealloc Tcl_Realloc +# define Tcl_Return Tcl_SetResult +# define Tcl_TildeSubst Tcl_TranslateFileName +# define panic Tcl_Panic +# define panicVA Tcl_PanicVA +#endif + +/* + * Convenience declaration of Tcl_AppInit for backwards compatibility. This + * function is not *implemented* by the tcl library, so the storage class is + * neither DLLEXPORT nor DLLIMPORT. + */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS + +EXTERN int Tcl_AppInit _ANSI_ARGS_((Tcl_Interp *interp)); + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#endif /* RC_INVOKED */ + +/* + * end block for C++ + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TCL */ + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tclDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tclDecls.h new file mode 100644 index 00000000..20ec35d4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tclDecls.h @@ -0,0 +1,6563 @@ +/* + * tclDecls.h -- + * + * Declarations of functions in the platform independent public Tcl API. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TCLDECLS +#define _TCLDECLS + +#undef TCL_STORAGE_CLASS +#ifdef BUILD_tcl +# define TCL_STORAGE_CLASS DLLEXPORT +#else +# ifdef USE_TCL_STUBS +# define TCL_STORAGE_CLASS +# else +# define TCL_STORAGE_CLASS DLLIMPORT +# endif +#endif + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tcl.decls script. + */ + +/* !BEGIN!: Do not edit below this line. */ + +/* + * Exported function declarations: + */ + +#ifndef Tcl_PkgProvideEx_TCL_DECLARED +#define Tcl_PkgProvideEx_TCL_DECLARED +/* 0 */ +EXTERN int Tcl_PkgProvideEx(Tcl_Interp *interp, + CONST char *name, CONST char *version, + ClientData clientData); +#endif +#ifndef Tcl_PkgRequireEx_TCL_DECLARED +#define Tcl_PkgRequireEx_TCL_DECLARED +/* 1 */ +EXTERN CONST84_RETURN char * Tcl_PkgRequireEx(Tcl_Interp *interp, + CONST char *name, CONST char *version, + int exact, ClientData *clientDataPtr); +#endif +#ifndef Tcl_Panic_TCL_DECLARED +#define Tcl_Panic_TCL_DECLARED +/* 2 */ +EXTERN void Tcl_Panic(CONST char *format, ...); +#endif +#ifndef Tcl_Alloc_TCL_DECLARED +#define Tcl_Alloc_TCL_DECLARED +/* 3 */ +EXTERN char * Tcl_Alloc(unsigned int size); +#endif +#ifndef Tcl_Free_TCL_DECLARED +#define Tcl_Free_TCL_DECLARED +/* 4 */ +EXTERN void Tcl_Free(char *ptr); +#endif +#ifndef Tcl_Realloc_TCL_DECLARED +#define Tcl_Realloc_TCL_DECLARED +/* 5 */ +EXTERN char * Tcl_Realloc(char *ptr, unsigned int size); +#endif +#ifndef Tcl_DbCkalloc_TCL_DECLARED +#define Tcl_DbCkalloc_TCL_DECLARED +/* 6 */ +EXTERN char * Tcl_DbCkalloc(unsigned int size, CONST char *file, + int line); +#endif +#ifndef Tcl_DbCkfree_TCL_DECLARED +#define Tcl_DbCkfree_TCL_DECLARED +/* 7 */ +EXTERN void Tcl_DbCkfree(char *ptr, CONST char *file, int line); +#endif +#ifndef Tcl_DbCkrealloc_TCL_DECLARED +#define Tcl_DbCkrealloc_TCL_DECLARED +/* 8 */ +EXTERN char * Tcl_DbCkrealloc(char *ptr, unsigned int size, + CONST char *file, int line); +#endif +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ +#ifndef Tcl_CreateFileHandler_TCL_DECLARED +#define Tcl_CreateFileHandler_TCL_DECLARED +/* 9 */ +EXTERN void Tcl_CreateFileHandler(int fd, int mask, + Tcl_FileProc *proc, ClientData clientData); +#endif +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#ifndef Tcl_CreateFileHandler_TCL_DECLARED +#define Tcl_CreateFileHandler_TCL_DECLARED +/* 9 */ +EXTERN void Tcl_CreateFileHandler(int fd, int mask, + Tcl_FileProc *proc, ClientData clientData); +#endif +#endif /* MACOSX */ +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ +#ifndef Tcl_DeleteFileHandler_TCL_DECLARED +#define Tcl_DeleteFileHandler_TCL_DECLARED +/* 10 */ +EXTERN void Tcl_DeleteFileHandler(int fd); +#endif +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#ifndef Tcl_DeleteFileHandler_TCL_DECLARED +#define Tcl_DeleteFileHandler_TCL_DECLARED +/* 10 */ +EXTERN void Tcl_DeleteFileHandler(int fd); +#endif +#endif /* MACOSX */ +#ifndef Tcl_SetTimer_TCL_DECLARED +#define Tcl_SetTimer_TCL_DECLARED +/* 11 */ +EXTERN void Tcl_SetTimer(Tcl_Time *timePtr); +#endif +#ifndef Tcl_Sleep_TCL_DECLARED +#define Tcl_Sleep_TCL_DECLARED +/* 12 */ +EXTERN void Tcl_Sleep(int ms); +#endif +#ifndef Tcl_WaitForEvent_TCL_DECLARED +#define Tcl_WaitForEvent_TCL_DECLARED +/* 13 */ +EXTERN int Tcl_WaitForEvent(Tcl_Time *timePtr); +#endif +#ifndef Tcl_AppendAllObjTypes_TCL_DECLARED +#define Tcl_AppendAllObjTypes_TCL_DECLARED +/* 14 */ +EXTERN int Tcl_AppendAllObjTypes(Tcl_Interp *interp, + Tcl_Obj *objPtr); +#endif +#ifndef Tcl_AppendStringsToObj_TCL_DECLARED +#define Tcl_AppendStringsToObj_TCL_DECLARED +/* 15 */ +EXTERN void Tcl_AppendStringsToObj(Tcl_Obj *objPtr, ...); +#endif +#ifndef Tcl_AppendToObj_TCL_DECLARED +#define Tcl_AppendToObj_TCL_DECLARED +/* 16 */ +EXTERN void Tcl_AppendToObj(Tcl_Obj *objPtr, CONST char *bytes, + int length); +#endif +#ifndef Tcl_ConcatObj_TCL_DECLARED +#define Tcl_ConcatObj_TCL_DECLARED +/* 17 */ +EXTERN Tcl_Obj * Tcl_ConcatObj(int objc, Tcl_Obj *CONST objv[]); +#endif +#ifndef Tcl_ConvertToType_TCL_DECLARED +#define Tcl_ConvertToType_TCL_DECLARED +/* 18 */ +EXTERN int Tcl_ConvertToType(Tcl_Interp *interp, + Tcl_Obj *objPtr, Tcl_ObjType *typePtr); +#endif +#ifndef Tcl_DbDecrRefCount_TCL_DECLARED +#define Tcl_DbDecrRefCount_TCL_DECLARED +/* 19 */ +EXTERN void Tcl_DbDecrRefCount(Tcl_Obj *objPtr, CONST char *file, + int line); +#endif +#ifndef Tcl_DbIncrRefCount_TCL_DECLARED +#define Tcl_DbIncrRefCount_TCL_DECLARED +/* 20 */ +EXTERN void Tcl_DbIncrRefCount(Tcl_Obj *objPtr, CONST char *file, + int line); +#endif +#ifndef Tcl_DbIsShared_TCL_DECLARED +#define Tcl_DbIsShared_TCL_DECLARED +/* 21 */ +EXTERN int Tcl_DbIsShared(Tcl_Obj *objPtr, CONST char *file, + int line); +#endif +#ifndef Tcl_DbNewBooleanObj_TCL_DECLARED +#define Tcl_DbNewBooleanObj_TCL_DECLARED +/* 22 */ +EXTERN Tcl_Obj * Tcl_DbNewBooleanObj(int boolValue, CONST char *file, + int line); +#endif +#ifndef Tcl_DbNewByteArrayObj_TCL_DECLARED +#define Tcl_DbNewByteArrayObj_TCL_DECLARED +/* 23 */ +EXTERN Tcl_Obj * Tcl_DbNewByteArrayObj(CONST unsigned char *bytes, + int length, CONST char *file, int line); +#endif +#ifndef Tcl_DbNewDoubleObj_TCL_DECLARED +#define Tcl_DbNewDoubleObj_TCL_DECLARED +/* 24 */ +EXTERN Tcl_Obj * Tcl_DbNewDoubleObj(double doubleValue, + CONST char *file, int line); +#endif +#ifndef Tcl_DbNewListObj_TCL_DECLARED +#define Tcl_DbNewListObj_TCL_DECLARED +/* 25 */ +EXTERN Tcl_Obj * Tcl_DbNewListObj(int objc, Tcl_Obj *CONST *objv, + CONST char *file, int line); +#endif +#ifndef Tcl_DbNewLongObj_TCL_DECLARED +#define Tcl_DbNewLongObj_TCL_DECLARED +/* 26 */ +EXTERN Tcl_Obj * Tcl_DbNewLongObj(long longValue, CONST char *file, + int line); +#endif +#ifndef Tcl_DbNewObj_TCL_DECLARED +#define Tcl_DbNewObj_TCL_DECLARED +/* 27 */ +EXTERN Tcl_Obj * Tcl_DbNewObj(CONST char *file, int line); +#endif +#ifndef Tcl_DbNewStringObj_TCL_DECLARED +#define Tcl_DbNewStringObj_TCL_DECLARED +/* 28 */ +EXTERN Tcl_Obj * Tcl_DbNewStringObj(CONST char *bytes, int length, + CONST char *file, int line); +#endif +#ifndef Tcl_DuplicateObj_TCL_DECLARED +#define Tcl_DuplicateObj_TCL_DECLARED +/* 29 */ +EXTERN Tcl_Obj * Tcl_DuplicateObj(Tcl_Obj *objPtr); +#endif +#ifndef TclFreeObj_TCL_DECLARED +#define TclFreeObj_TCL_DECLARED +/* 30 */ +EXTERN void TclFreeObj(Tcl_Obj *objPtr); +#endif +#ifndef Tcl_GetBoolean_TCL_DECLARED +#define Tcl_GetBoolean_TCL_DECLARED +/* 31 */ +EXTERN int Tcl_GetBoolean(Tcl_Interp *interp, CONST char *src, + int *boolPtr); +#endif +#ifndef Tcl_GetBooleanFromObj_TCL_DECLARED +#define Tcl_GetBooleanFromObj_TCL_DECLARED +/* 32 */ +EXTERN int Tcl_GetBooleanFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, int *boolPtr); +#endif +#ifndef Tcl_GetByteArrayFromObj_TCL_DECLARED +#define Tcl_GetByteArrayFromObj_TCL_DECLARED +/* 33 */ +EXTERN unsigned char * Tcl_GetByteArrayFromObj(Tcl_Obj *objPtr, + int *lengthPtr); +#endif +#ifndef Tcl_GetDouble_TCL_DECLARED +#define Tcl_GetDouble_TCL_DECLARED +/* 34 */ +EXTERN int Tcl_GetDouble(Tcl_Interp *interp, CONST char *src, + double *doublePtr); +#endif +#ifndef Tcl_GetDoubleFromObj_TCL_DECLARED +#define Tcl_GetDoubleFromObj_TCL_DECLARED +/* 35 */ +EXTERN int Tcl_GetDoubleFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, double *doublePtr); +#endif +#ifndef Tcl_GetIndexFromObj_TCL_DECLARED +#define Tcl_GetIndexFromObj_TCL_DECLARED +/* 36 */ +EXTERN int Tcl_GetIndexFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, CONST84 char **tablePtr, + CONST char *msg, int flags, int *indexPtr); +#endif +#ifndef Tcl_GetInt_TCL_DECLARED +#define Tcl_GetInt_TCL_DECLARED +/* 37 */ +EXTERN int Tcl_GetInt(Tcl_Interp *interp, CONST char *src, + int *intPtr); +#endif +#ifndef Tcl_GetIntFromObj_TCL_DECLARED +#define Tcl_GetIntFromObj_TCL_DECLARED +/* 38 */ +EXTERN int Tcl_GetIntFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, int *intPtr); +#endif +#ifndef Tcl_GetLongFromObj_TCL_DECLARED +#define Tcl_GetLongFromObj_TCL_DECLARED +/* 39 */ +EXTERN int Tcl_GetLongFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, long *longPtr); +#endif +#ifndef Tcl_GetObjType_TCL_DECLARED +#define Tcl_GetObjType_TCL_DECLARED +/* 40 */ +EXTERN Tcl_ObjType * Tcl_GetObjType(CONST char *typeName); +#endif +#ifndef Tcl_GetStringFromObj_TCL_DECLARED +#define Tcl_GetStringFromObj_TCL_DECLARED +/* 41 */ +EXTERN char * Tcl_GetStringFromObj(Tcl_Obj *objPtr, int *lengthPtr); +#endif +#ifndef Tcl_InvalidateStringRep_TCL_DECLARED +#define Tcl_InvalidateStringRep_TCL_DECLARED +/* 42 */ +EXTERN void Tcl_InvalidateStringRep(Tcl_Obj *objPtr); +#endif +#ifndef Tcl_ListObjAppendList_TCL_DECLARED +#define Tcl_ListObjAppendList_TCL_DECLARED +/* 43 */ +EXTERN int Tcl_ListObjAppendList(Tcl_Interp *interp, + Tcl_Obj *listPtr, Tcl_Obj *elemListPtr); +#endif +#ifndef Tcl_ListObjAppendElement_TCL_DECLARED +#define Tcl_ListObjAppendElement_TCL_DECLARED +/* 44 */ +EXTERN int Tcl_ListObjAppendElement(Tcl_Interp *interp, + Tcl_Obj *listPtr, Tcl_Obj *objPtr); +#endif +#ifndef Tcl_ListObjGetElements_TCL_DECLARED +#define Tcl_ListObjGetElements_TCL_DECLARED +/* 45 */ +EXTERN int Tcl_ListObjGetElements(Tcl_Interp *interp, + Tcl_Obj *listPtr, int *objcPtr, + Tcl_Obj ***objvPtr); +#endif +#ifndef Tcl_ListObjIndex_TCL_DECLARED +#define Tcl_ListObjIndex_TCL_DECLARED +/* 46 */ +EXTERN int Tcl_ListObjIndex(Tcl_Interp *interp, + Tcl_Obj *listPtr, int index, + Tcl_Obj **objPtrPtr); +#endif +#ifndef Tcl_ListObjLength_TCL_DECLARED +#define Tcl_ListObjLength_TCL_DECLARED +/* 47 */ +EXTERN int Tcl_ListObjLength(Tcl_Interp *interp, + Tcl_Obj *listPtr, int *lengthPtr); +#endif +#ifndef Tcl_ListObjReplace_TCL_DECLARED +#define Tcl_ListObjReplace_TCL_DECLARED +/* 48 */ +EXTERN int Tcl_ListObjReplace(Tcl_Interp *interp, + Tcl_Obj *listPtr, int first, int count, + int objc, Tcl_Obj *CONST objv[]); +#endif +#ifndef Tcl_NewBooleanObj_TCL_DECLARED +#define Tcl_NewBooleanObj_TCL_DECLARED +/* 49 */ +EXTERN Tcl_Obj * Tcl_NewBooleanObj(int boolValue); +#endif +#ifndef Tcl_NewByteArrayObj_TCL_DECLARED +#define Tcl_NewByteArrayObj_TCL_DECLARED +/* 50 */ +EXTERN Tcl_Obj * Tcl_NewByteArrayObj(CONST unsigned char *bytes, + int length); +#endif +#ifndef Tcl_NewDoubleObj_TCL_DECLARED +#define Tcl_NewDoubleObj_TCL_DECLARED +/* 51 */ +EXTERN Tcl_Obj * Tcl_NewDoubleObj(double doubleValue); +#endif +#ifndef Tcl_NewIntObj_TCL_DECLARED +#define Tcl_NewIntObj_TCL_DECLARED +/* 52 */ +EXTERN Tcl_Obj * Tcl_NewIntObj(int intValue); +#endif +#ifndef Tcl_NewListObj_TCL_DECLARED +#define Tcl_NewListObj_TCL_DECLARED +/* 53 */ +EXTERN Tcl_Obj * Tcl_NewListObj(int objc, Tcl_Obj *CONST objv[]); +#endif +#ifndef Tcl_NewLongObj_TCL_DECLARED +#define Tcl_NewLongObj_TCL_DECLARED +/* 54 */ +EXTERN Tcl_Obj * Tcl_NewLongObj(long longValue); +#endif +#ifndef Tcl_NewObj_TCL_DECLARED +#define Tcl_NewObj_TCL_DECLARED +/* 55 */ +EXTERN Tcl_Obj * Tcl_NewObj(void); +#endif +#ifndef Tcl_NewStringObj_TCL_DECLARED +#define Tcl_NewStringObj_TCL_DECLARED +/* 56 */ +EXTERN Tcl_Obj * Tcl_NewStringObj(CONST char *bytes, int length); +#endif +#ifndef Tcl_SetBooleanObj_TCL_DECLARED +#define Tcl_SetBooleanObj_TCL_DECLARED +/* 57 */ +EXTERN void Tcl_SetBooleanObj(Tcl_Obj *objPtr, int boolValue); +#endif +#ifndef Tcl_SetByteArrayLength_TCL_DECLARED +#define Tcl_SetByteArrayLength_TCL_DECLARED +/* 58 */ +EXTERN unsigned char * Tcl_SetByteArrayLength(Tcl_Obj *objPtr, int length); +#endif +#ifndef Tcl_SetByteArrayObj_TCL_DECLARED +#define Tcl_SetByteArrayObj_TCL_DECLARED +/* 59 */ +EXTERN void Tcl_SetByteArrayObj(Tcl_Obj *objPtr, + CONST unsigned char *bytes, int length); +#endif +#ifndef Tcl_SetDoubleObj_TCL_DECLARED +#define Tcl_SetDoubleObj_TCL_DECLARED +/* 60 */ +EXTERN void Tcl_SetDoubleObj(Tcl_Obj *objPtr, double doubleValue); +#endif +#ifndef Tcl_SetIntObj_TCL_DECLARED +#define Tcl_SetIntObj_TCL_DECLARED +/* 61 */ +EXTERN void Tcl_SetIntObj(Tcl_Obj *objPtr, int intValue); +#endif +#ifndef Tcl_SetListObj_TCL_DECLARED +#define Tcl_SetListObj_TCL_DECLARED +/* 62 */ +EXTERN void Tcl_SetListObj(Tcl_Obj *objPtr, int objc, + Tcl_Obj *CONST objv[]); +#endif +#ifndef Tcl_SetLongObj_TCL_DECLARED +#define Tcl_SetLongObj_TCL_DECLARED +/* 63 */ +EXTERN void Tcl_SetLongObj(Tcl_Obj *objPtr, long longValue); +#endif +#ifndef Tcl_SetObjLength_TCL_DECLARED +#define Tcl_SetObjLength_TCL_DECLARED +/* 64 */ +EXTERN void Tcl_SetObjLength(Tcl_Obj *objPtr, int length); +#endif +#ifndef Tcl_SetStringObj_TCL_DECLARED +#define Tcl_SetStringObj_TCL_DECLARED +/* 65 */ +EXTERN void Tcl_SetStringObj(Tcl_Obj *objPtr, CONST char *bytes, + int length); +#endif +#ifndef Tcl_AddErrorInfo_TCL_DECLARED +#define Tcl_AddErrorInfo_TCL_DECLARED +/* 66 */ +EXTERN void Tcl_AddErrorInfo(Tcl_Interp *interp, + CONST char *message); +#endif +#ifndef Tcl_AddObjErrorInfo_TCL_DECLARED +#define Tcl_AddObjErrorInfo_TCL_DECLARED +/* 67 */ +EXTERN void Tcl_AddObjErrorInfo(Tcl_Interp *interp, + CONST char *message, int length); +#endif +#ifndef Tcl_AllowExceptions_TCL_DECLARED +#define Tcl_AllowExceptions_TCL_DECLARED +/* 68 */ +EXTERN void Tcl_AllowExceptions(Tcl_Interp *interp); +#endif +#ifndef Tcl_AppendElement_TCL_DECLARED +#define Tcl_AppendElement_TCL_DECLARED +/* 69 */ +EXTERN void Tcl_AppendElement(Tcl_Interp *interp, + CONST char *element); +#endif +#ifndef Tcl_AppendResult_TCL_DECLARED +#define Tcl_AppendResult_TCL_DECLARED +/* 70 */ +EXTERN void Tcl_AppendResult(Tcl_Interp *interp, ...); +#endif +#ifndef Tcl_AsyncCreate_TCL_DECLARED +#define Tcl_AsyncCreate_TCL_DECLARED +/* 71 */ +EXTERN Tcl_AsyncHandler Tcl_AsyncCreate(Tcl_AsyncProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_AsyncDelete_TCL_DECLARED +#define Tcl_AsyncDelete_TCL_DECLARED +/* 72 */ +EXTERN void Tcl_AsyncDelete(Tcl_AsyncHandler async); +#endif +#ifndef Tcl_AsyncInvoke_TCL_DECLARED +#define Tcl_AsyncInvoke_TCL_DECLARED +/* 73 */ +EXTERN int Tcl_AsyncInvoke(Tcl_Interp *interp, int code); +#endif +#ifndef Tcl_AsyncMark_TCL_DECLARED +#define Tcl_AsyncMark_TCL_DECLARED +/* 74 */ +EXTERN void Tcl_AsyncMark(Tcl_AsyncHandler async); +#endif +#ifndef Tcl_AsyncReady_TCL_DECLARED +#define Tcl_AsyncReady_TCL_DECLARED +/* 75 */ +EXTERN int Tcl_AsyncReady(void); +#endif +#ifndef Tcl_BackgroundError_TCL_DECLARED +#define Tcl_BackgroundError_TCL_DECLARED +/* 76 */ +EXTERN void Tcl_BackgroundError(Tcl_Interp *interp); +#endif +#ifndef Tcl_Backslash_TCL_DECLARED +#define Tcl_Backslash_TCL_DECLARED +/* 77 */ +EXTERN char Tcl_Backslash(CONST char *src, int *readPtr); +#endif +#ifndef Tcl_BadChannelOption_TCL_DECLARED +#define Tcl_BadChannelOption_TCL_DECLARED +/* 78 */ +EXTERN int Tcl_BadChannelOption(Tcl_Interp *interp, + CONST char *optionName, + CONST char *optionList); +#endif +#ifndef Tcl_CallWhenDeleted_TCL_DECLARED +#define Tcl_CallWhenDeleted_TCL_DECLARED +/* 79 */ +EXTERN void Tcl_CallWhenDeleted(Tcl_Interp *interp, + Tcl_InterpDeleteProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_CancelIdleCall_TCL_DECLARED +#define Tcl_CancelIdleCall_TCL_DECLARED +/* 80 */ +EXTERN void Tcl_CancelIdleCall(Tcl_IdleProc *idleProc, + ClientData clientData); +#endif +#ifndef Tcl_Close_TCL_DECLARED +#define Tcl_Close_TCL_DECLARED +/* 81 */ +EXTERN int Tcl_Close(Tcl_Interp *interp, Tcl_Channel chan); +#endif +#ifndef Tcl_CommandComplete_TCL_DECLARED +#define Tcl_CommandComplete_TCL_DECLARED +/* 82 */ +EXTERN int Tcl_CommandComplete(CONST char *cmd); +#endif +#ifndef Tcl_Concat_TCL_DECLARED +#define Tcl_Concat_TCL_DECLARED +/* 83 */ +EXTERN char * Tcl_Concat(int argc, CONST84 char *CONST *argv); +#endif +#ifndef Tcl_ConvertElement_TCL_DECLARED +#define Tcl_ConvertElement_TCL_DECLARED +/* 84 */ +EXTERN int Tcl_ConvertElement(CONST char *src, char *dst, + int flags); +#endif +#ifndef Tcl_ConvertCountedElement_TCL_DECLARED +#define Tcl_ConvertCountedElement_TCL_DECLARED +/* 85 */ +EXTERN int Tcl_ConvertCountedElement(CONST char *src, + int length, char *dst, int flags); +#endif +#ifndef Tcl_CreateAlias_TCL_DECLARED +#define Tcl_CreateAlias_TCL_DECLARED +/* 86 */ +EXTERN int Tcl_CreateAlias(Tcl_Interp *slave, + CONST char *slaveCmd, Tcl_Interp *target, + CONST char *targetCmd, int argc, + CONST84 char *CONST *argv); +#endif +#ifndef Tcl_CreateAliasObj_TCL_DECLARED +#define Tcl_CreateAliasObj_TCL_DECLARED +/* 87 */ +EXTERN int Tcl_CreateAliasObj(Tcl_Interp *slave, + CONST char *slaveCmd, Tcl_Interp *target, + CONST char *targetCmd, int objc, + Tcl_Obj *CONST objv[]); +#endif +#ifndef Tcl_CreateChannel_TCL_DECLARED +#define Tcl_CreateChannel_TCL_DECLARED +/* 88 */ +EXTERN Tcl_Channel Tcl_CreateChannel(Tcl_ChannelType *typePtr, + CONST char *chanName, + ClientData instanceData, int mask); +#endif +#ifndef Tcl_CreateChannelHandler_TCL_DECLARED +#define Tcl_CreateChannelHandler_TCL_DECLARED +/* 89 */ +EXTERN void Tcl_CreateChannelHandler(Tcl_Channel chan, int mask, + Tcl_ChannelProc *proc, ClientData clientData); +#endif +#ifndef Tcl_CreateCloseHandler_TCL_DECLARED +#define Tcl_CreateCloseHandler_TCL_DECLARED +/* 90 */ +EXTERN void Tcl_CreateCloseHandler(Tcl_Channel chan, + Tcl_CloseProc *proc, ClientData clientData); +#endif +#ifndef Tcl_CreateCommand_TCL_DECLARED +#define Tcl_CreateCommand_TCL_DECLARED +/* 91 */ +EXTERN Tcl_Command Tcl_CreateCommand(Tcl_Interp *interp, + CONST char *cmdName, Tcl_CmdProc *proc, + ClientData clientData, + Tcl_CmdDeleteProc *deleteProc); +#endif +#ifndef Tcl_CreateEventSource_TCL_DECLARED +#define Tcl_CreateEventSource_TCL_DECLARED +/* 92 */ +EXTERN void Tcl_CreateEventSource(Tcl_EventSetupProc *setupProc, + Tcl_EventCheckProc *checkProc, + ClientData clientData); +#endif +#ifndef Tcl_CreateExitHandler_TCL_DECLARED +#define Tcl_CreateExitHandler_TCL_DECLARED +/* 93 */ +EXTERN void Tcl_CreateExitHandler(Tcl_ExitProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_CreateInterp_TCL_DECLARED +#define Tcl_CreateInterp_TCL_DECLARED +/* 94 */ +EXTERN Tcl_Interp * Tcl_CreateInterp(void); +#endif +#ifndef Tcl_CreateMathFunc_TCL_DECLARED +#define Tcl_CreateMathFunc_TCL_DECLARED +/* 95 */ +EXTERN void Tcl_CreateMathFunc(Tcl_Interp *interp, + CONST char *name, int numArgs, + Tcl_ValueType *argTypes, Tcl_MathProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_CreateObjCommand_TCL_DECLARED +#define Tcl_CreateObjCommand_TCL_DECLARED +/* 96 */ +EXTERN Tcl_Command Tcl_CreateObjCommand(Tcl_Interp *interp, + CONST char *cmdName, Tcl_ObjCmdProc *proc, + ClientData clientData, + Tcl_CmdDeleteProc *deleteProc); +#endif +#ifndef Tcl_CreateSlave_TCL_DECLARED +#define Tcl_CreateSlave_TCL_DECLARED +/* 97 */ +EXTERN Tcl_Interp * Tcl_CreateSlave(Tcl_Interp *interp, + CONST char *slaveName, int isSafe); +#endif +#ifndef Tcl_CreateTimerHandler_TCL_DECLARED +#define Tcl_CreateTimerHandler_TCL_DECLARED +/* 98 */ +EXTERN Tcl_TimerToken Tcl_CreateTimerHandler(int milliseconds, + Tcl_TimerProc *proc, ClientData clientData); +#endif +#ifndef Tcl_CreateTrace_TCL_DECLARED +#define Tcl_CreateTrace_TCL_DECLARED +/* 99 */ +EXTERN Tcl_Trace Tcl_CreateTrace(Tcl_Interp *interp, int level, + Tcl_CmdTraceProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_DeleteAssocData_TCL_DECLARED +#define Tcl_DeleteAssocData_TCL_DECLARED +/* 100 */ +EXTERN void Tcl_DeleteAssocData(Tcl_Interp *interp, + CONST char *name); +#endif +#ifndef Tcl_DeleteChannelHandler_TCL_DECLARED +#define Tcl_DeleteChannelHandler_TCL_DECLARED +/* 101 */ +EXTERN void Tcl_DeleteChannelHandler(Tcl_Channel chan, + Tcl_ChannelProc *proc, ClientData clientData); +#endif +#ifndef Tcl_DeleteCloseHandler_TCL_DECLARED +#define Tcl_DeleteCloseHandler_TCL_DECLARED +/* 102 */ +EXTERN void Tcl_DeleteCloseHandler(Tcl_Channel chan, + Tcl_CloseProc *proc, ClientData clientData); +#endif +#ifndef Tcl_DeleteCommand_TCL_DECLARED +#define Tcl_DeleteCommand_TCL_DECLARED +/* 103 */ +EXTERN int Tcl_DeleteCommand(Tcl_Interp *interp, + CONST char *cmdName); +#endif +#ifndef Tcl_DeleteCommandFromToken_TCL_DECLARED +#define Tcl_DeleteCommandFromToken_TCL_DECLARED +/* 104 */ +EXTERN int Tcl_DeleteCommandFromToken(Tcl_Interp *interp, + Tcl_Command command); +#endif +#ifndef Tcl_DeleteEvents_TCL_DECLARED +#define Tcl_DeleteEvents_TCL_DECLARED +/* 105 */ +EXTERN void Tcl_DeleteEvents(Tcl_EventDeleteProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_DeleteEventSource_TCL_DECLARED +#define Tcl_DeleteEventSource_TCL_DECLARED +/* 106 */ +EXTERN void Tcl_DeleteEventSource(Tcl_EventSetupProc *setupProc, + Tcl_EventCheckProc *checkProc, + ClientData clientData); +#endif +#ifndef Tcl_DeleteExitHandler_TCL_DECLARED +#define Tcl_DeleteExitHandler_TCL_DECLARED +/* 107 */ +EXTERN void Tcl_DeleteExitHandler(Tcl_ExitProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_DeleteHashEntry_TCL_DECLARED +#define Tcl_DeleteHashEntry_TCL_DECLARED +/* 108 */ +EXTERN void Tcl_DeleteHashEntry(Tcl_HashEntry *entryPtr); +#endif +#ifndef Tcl_DeleteHashTable_TCL_DECLARED +#define Tcl_DeleteHashTable_TCL_DECLARED +/* 109 */ +EXTERN void Tcl_DeleteHashTable(Tcl_HashTable *tablePtr); +#endif +#ifndef Tcl_DeleteInterp_TCL_DECLARED +#define Tcl_DeleteInterp_TCL_DECLARED +/* 110 */ +EXTERN void Tcl_DeleteInterp(Tcl_Interp *interp); +#endif +#ifndef Tcl_DetachPids_TCL_DECLARED +#define Tcl_DetachPids_TCL_DECLARED +/* 111 */ +EXTERN void Tcl_DetachPids(int numPids, Tcl_Pid *pidPtr); +#endif +#ifndef Tcl_DeleteTimerHandler_TCL_DECLARED +#define Tcl_DeleteTimerHandler_TCL_DECLARED +/* 112 */ +EXTERN void Tcl_DeleteTimerHandler(Tcl_TimerToken token); +#endif +#ifndef Tcl_DeleteTrace_TCL_DECLARED +#define Tcl_DeleteTrace_TCL_DECLARED +/* 113 */ +EXTERN void Tcl_DeleteTrace(Tcl_Interp *interp, Tcl_Trace trace); +#endif +#ifndef Tcl_DontCallWhenDeleted_TCL_DECLARED +#define Tcl_DontCallWhenDeleted_TCL_DECLARED +/* 114 */ +EXTERN void Tcl_DontCallWhenDeleted(Tcl_Interp *interp, + Tcl_InterpDeleteProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_DoOneEvent_TCL_DECLARED +#define Tcl_DoOneEvent_TCL_DECLARED +/* 115 */ +EXTERN int Tcl_DoOneEvent(int flags); +#endif +#ifndef Tcl_DoWhenIdle_TCL_DECLARED +#define Tcl_DoWhenIdle_TCL_DECLARED +/* 116 */ +EXTERN void Tcl_DoWhenIdle(Tcl_IdleProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_DStringAppend_TCL_DECLARED +#define Tcl_DStringAppend_TCL_DECLARED +/* 117 */ +EXTERN char * Tcl_DStringAppend(Tcl_DString *dsPtr, + CONST char *bytes, int length); +#endif +#ifndef Tcl_DStringAppendElement_TCL_DECLARED +#define Tcl_DStringAppendElement_TCL_DECLARED +/* 118 */ +EXTERN char * Tcl_DStringAppendElement(Tcl_DString *dsPtr, + CONST char *element); +#endif +#ifndef Tcl_DStringEndSublist_TCL_DECLARED +#define Tcl_DStringEndSublist_TCL_DECLARED +/* 119 */ +EXTERN void Tcl_DStringEndSublist(Tcl_DString *dsPtr); +#endif +#ifndef Tcl_DStringFree_TCL_DECLARED +#define Tcl_DStringFree_TCL_DECLARED +/* 120 */ +EXTERN void Tcl_DStringFree(Tcl_DString *dsPtr); +#endif +#ifndef Tcl_DStringGetResult_TCL_DECLARED +#define Tcl_DStringGetResult_TCL_DECLARED +/* 121 */ +EXTERN void Tcl_DStringGetResult(Tcl_Interp *interp, + Tcl_DString *dsPtr); +#endif +#ifndef Tcl_DStringInit_TCL_DECLARED +#define Tcl_DStringInit_TCL_DECLARED +/* 122 */ +EXTERN void Tcl_DStringInit(Tcl_DString *dsPtr); +#endif +#ifndef Tcl_DStringResult_TCL_DECLARED +#define Tcl_DStringResult_TCL_DECLARED +/* 123 */ +EXTERN void Tcl_DStringResult(Tcl_Interp *interp, + Tcl_DString *dsPtr); +#endif +#ifndef Tcl_DStringSetLength_TCL_DECLARED +#define Tcl_DStringSetLength_TCL_DECLARED +/* 124 */ +EXTERN void Tcl_DStringSetLength(Tcl_DString *dsPtr, int length); +#endif +#ifndef Tcl_DStringStartSublist_TCL_DECLARED +#define Tcl_DStringStartSublist_TCL_DECLARED +/* 125 */ +EXTERN void Tcl_DStringStartSublist(Tcl_DString *dsPtr); +#endif +#ifndef Tcl_Eof_TCL_DECLARED +#define Tcl_Eof_TCL_DECLARED +/* 126 */ +EXTERN int Tcl_Eof(Tcl_Channel chan); +#endif +#ifndef Tcl_ErrnoId_TCL_DECLARED +#define Tcl_ErrnoId_TCL_DECLARED +/* 127 */ +EXTERN CONST84_RETURN char * Tcl_ErrnoId(void); +#endif +#ifndef Tcl_ErrnoMsg_TCL_DECLARED +#define Tcl_ErrnoMsg_TCL_DECLARED +/* 128 */ +EXTERN CONST84_RETURN char * Tcl_ErrnoMsg(int err); +#endif +#ifndef Tcl_Eval_TCL_DECLARED +#define Tcl_Eval_TCL_DECLARED +/* 129 */ +EXTERN int Tcl_Eval(Tcl_Interp *interp, CONST char *script); +#endif +#ifndef Tcl_EvalFile_TCL_DECLARED +#define Tcl_EvalFile_TCL_DECLARED +/* 130 */ +EXTERN int Tcl_EvalFile(Tcl_Interp *interp, + CONST char *fileName); +#endif +#ifndef Tcl_EvalObj_TCL_DECLARED +#define Tcl_EvalObj_TCL_DECLARED +/* 131 */ +EXTERN int Tcl_EvalObj(Tcl_Interp *interp, Tcl_Obj *objPtr); +#endif +#ifndef Tcl_EventuallyFree_TCL_DECLARED +#define Tcl_EventuallyFree_TCL_DECLARED +/* 132 */ +EXTERN void Tcl_EventuallyFree(ClientData clientData, + Tcl_FreeProc *freeProc); +#endif +#ifndef Tcl_Exit_TCL_DECLARED +#define Tcl_Exit_TCL_DECLARED +/* 133 */ +EXTERN void Tcl_Exit(int status); +#endif +#ifndef Tcl_ExposeCommand_TCL_DECLARED +#define Tcl_ExposeCommand_TCL_DECLARED +/* 134 */ +EXTERN int Tcl_ExposeCommand(Tcl_Interp *interp, + CONST char *hiddenCmdToken, + CONST char *cmdName); +#endif +#ifndef Tcl_ExprBoolean_TCL_DECLARED +#define Tcl_ExprBoolean_TCL_DECLARED +/* 135 */ +EXTERN int Tcl_ExprBoolean(Tcl_Interp *interp, CONST char *expr, + int *ptr); +#endif +#ifndef Tcl_ExprBooleanObj_TCL_DECLARED +#define Tcl_ExprBooleanObj_TCL_DECLARED +/* 136 */ +EXTERN int Tcl_ExprBooleanObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, int *ptr); +#endif +#ifndef Tcl_ExprDouble_TCL_DECLARED +#define Tcl_ExprDouble_TCL_DECLARED +/* 137 */ +EXTERN int Tcl_ExprDouble(Tcl_Interp *interp, CONST char *expr, + double *ptr); +#endif +#ifndef Tcl_ExprDoubleObj_TCL_DECLARED +#define Tcl_ExprDoubleObj_TCL_DECLARED +/* 138 */ +EXTERN int Tcl_ExprDoubleObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, double *ptr); +#endif +#ifndef Tcl_ExprLong_TCL_DECLARED +#define Tcl_ExprLong_TCL_DECLARED +/* 139 */ +EXTERN int Tcl_ExprLong(Tcl_Interp *interp, CONST char *expr, + long *ptr); +#endif +#ifndef Tcl_ExprLongObj_TCL_DECLARED +#define Tcl_ExprLongObj_TCL_DECLARED +/* 140 */ +EXTERN int Tcl_ExprLongObj(Tcl_Interp *interp, Tcl_Obj *objPtr, + long *ptr); +#endif +#ifndef Tcl_ExprObj_TCL_DECLARED +#define Tcl_ExprObj_TCL_DECLARED +/* 141 */ +EXTERN int Tcl_ExprObj(Tcl_Interp *interp, Tcl_Obj *objPtr, + Tcl_Obj **resultPtrPtr); +#endif +#ifndef Tcl_ExprString_TCL_DECLARED +#define Tcl_ExprString_TCL_DECLARED +/* 142 */ +EXTERN int Tcl_ExprString(Tcl_Interp *interp, CONST char *expr); +#endif +#ifndef Tcl_Finalize_TCL_DECLARED +#define Tcl_Finalize_TCL_DECLARED +/* 143 */ +EXTERN void Tcl_Finalize(void); +#endif +#ifndef Tcl_FindExecutable_TCL_DECLARED +#define Tcl_FindExecutable_TCL_DECLARED +/* 144 */ +EXTERN void Tcl_FindExecutable(CONST char *argv0); +#endif +#ifndef Tcl_FirstHashEntry_TCL_DECLARED +#define Tcl_FirstHashEntry_TCL_DECLARED +/* 145 */ +EXTERN Tcl_HashEntry * Tcl_FirstHashEntry(Tcl_HashTable *tablePtr, + Tcl_HashSearch *searchPtr); +#endif +#ifndef Tcl_Flush_TCL_DECLARED +#define Tcl_Flush_TCL_DECLARED +/* 146 */ +EXTERN int Tcl_Flush(Tcl_Channel chan); +#endif +#ifndef Tcl_FreeResult_TCL_DECLARED +#define Tcl_FreeResult_TCL_DECLARED +/* 147 */ +EXTERN void Tcl_FreeResult(Tcl_Interp *interp); +#endif +#ifndef Tcl_GetAlias_TCL_DECLARED +#define Tcl_GetAlias_TCL_DECLARED +/* 148 */ +EXTERN int Tcl_GetAlias(Tcl_Interp *interp, + CONST char *slaveCmd, + Tcl_Interp **targetInterpPtr, + CONST84 char **targetCmdPtr, int *argcPtr, + CONST84 char ***argvPtr); +#endif +#ifndef Tcl_GetAliasObj_TCL_DECLARED +#define Tcl_GetAliasObj_TCL_DECLARED +/* 149 */ +EXTERN int Tcl_GetAliasObj(Tcl_Interp *interp, + CONST char *slaveCmd, + Tcl_Interp **targetInterpPtr, + CONST84 char **targetCmdPtr, int *objcPtr, + Tcl_Obj ***objv); +#endif +#ifndef Tcl_GetAssocData_TCL_DECLARED +#define Tcl_GetAssocData_TCL_DECLARED +/* 150 */ +EXTERN ClientData Tcl_GetAssocData(Tcl_Interp *interp, + CONST char *name, + Tcl_InterpDeleteProc **procPtr); +#endif +#ifndef Tcl_GetChannel_TCL_DECLARED +#define Tcl_GetChannel_TCL_DECLARED +/* 151 */ +EXTERN Tcl_Channel Tcl_GetChannel(Tcl_Interp *interp, + CONST char *chanName, int *modePtr); +#endif +#ifndef Tcl_GetChannelBufferSize_TCL_DECLARED +#define Tcl_GetChannelBufferSize_TCL_DECLARED +/* 152 */ +EXTERN int Tcl_GetChannelBufferSize(Tcl_Channel chan); +#endif +#ifndef Tcl_GetChannelHandle_TCL_DECLARED +#define Tcl_GetChannelHandle_TCL_DECLARED +/* 153 */ +EXTERN int Tcl_GetChannelHandle(Tcl_Channel chan, int direction, + ClientData *handlePtr); +#endif +#ifndef Tcl_GetChannelInstanceData_TCL_DECLARED +#define Tcl_GetChannelInstanceData_TCL_DECLARED +/* 154 */ +EXTERN ClientData Tcl_GetChannelInstanceData(Tcl_Channel chan); +#endif +#ifndef Tcl_GetChannelMode_TCL_DECLARED +#define Tcl_GetChannelMode_TCL_DECLARED +/* 155 */ +EXTERN int Tcl_GetChannelMode(Tcl_Channel chan); +#endif +#ifndef Tcl_GetChannelName_TCL_DECLARED +#define Tcl_GetChannelName_TCL_DECLARED +/* 156 */ +EXTERN CONST84_RETURN char * Tcl_GetChannelName(Tcl_Channel chan); +#endif +#ifndef Tcl_GetChannelOption_TCL_DECLARED +#define Tcl_GetChannelOption_TCL_DECLARED +/* 157 */ +EXTERN int Tcl_GetChannelOption(Tcl_Interp *interp, + Tcl_Channel chan, CONST char *optionName, + Tcl_DString *dsPtr); +#endif +#ifndef Tcl_GetChannelType_TCL_DECLARED +#define Tcl_GetChannelType_TCL_DECLARED +/* 158 */ +EXTERN Tcl_ChannelType * Tcl_GetChannelType(Tcl_Channel chan); +#endif +#ifndef Tcl_GetCommandInfo_TCL_DECLARED +#define Tcl_GetCommandInfo_TCL_DECLARED +/* 159 */ +EXTERN int Tcl_GetCommandInfo(Tcl_Interp *interp, + CONST char *cmdName, Tcl_CmdInfo *infoPtr); +#endif +#ifndef Tcl_GetCommandName_TCL_DECLARED +#define Tcl_GetCommandName_TCL_DECLARED +/* 160 */ +EXTERN CONST84_RETURN char * Tcl_GetCommandName(Tcl_Interp *interp, + Tcl_Command command); +#endif +#ifndef Tcl_GetErrno_TCL_DECLARED +#define Tcl_GetErrno_TCL_DECLARED +/* 161 */ +EXTERN int Tcl_GetErrno(void); +#endif +#ifndef Tcl_GetHostName_TCL_DECLARED +#define Tcl_GetHostName_TCL_DECLARED +/* 162 */ +EXTERN CONST84_RETURN char * Tcl_GetHostName(void); +#endif +#ifndef Tcl_GetInterpPath_TCL_DECLARED +#define Tcl_GetInterpPath_TCL_DECLARED +/* 163 */ +EXTERN int Tcl_GetInterpPath(Tcl_Interp *askInterp, + Tcl_Interp *slaveInterp); +#endif +#ifndef Tcl_GetMaster_TCL_DECLARED +#define Tcl_GetMaster_TCL_DECLARED +/* 164 */ +EXTERN Tcl_Interp * Tcl_GetMaster(Tcl_Interp *interp); +#endif +#ifndef Tcl_GetNameOfExecutable_TCL_DECLARED +#define Tcl_GetNameOfExecutable_TCL_DECLARED +/* 165 */ +EXTERN CONST char * Tcl_GetNameOfExecutable(void); +#endif +#ifndef Tcl_GetObjResult_TCL_DECLARED +#define Tcl_GetObjResult_TCL_DECLARED +/* 166 */ +EXTERN Tcl_Obj * Tcl_GetObjResult(Tcl_Interp *interp); +#endif +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ +#ifndef Tcl_GetOpenFile_TCL_DECLARED +#define Tcl_GetOpenFile_TCL_DECLARED +/* 167 */ +EXTERN int Tcl_GetOpenFile(Tcl_Interp *interp, + CONST char *chanID, int forWriting, + int checkUsage, ClientData *filePtr); +#endif +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#ifndef Tcl_GetOpenFile_TCL_DECLARED +#define Tcl_GetOpenFile_TCL_DECLARED +/* 167 */ +EXTERN int Tcl_GetOpenFile(Tcl_Interp *interp, + CONST char *chanID, int forWriting, + int checkUsage, ClientData *filePtr); +#endif +#endif /* MACOSX */ +#ifndef Tcl_GetPathType_TCL_DECLARED +#define Tcl_GetPathType_TCL_DECLARED +/* 168 */ +EXTERN Tcl_PathType Tcl_GetPathType(CONST char *path); +#endif +#ifndef Tcl_Gets_TCL_DECLARED +#define Tcl_Gets_TCL_DECLARED +/* 169 */ +EXTERN int Tcl_Gets(Tcl_Channel chan, Tcl_DString *dsPtr); +#endif +#ifndef Tcl_GetsObj_TCL_DECLARED +#define Tcl_GetsObj_TCL_DECLARED +/* 170 */ +EXTERN int Tcl_GetsObj(Tcl_Channel chan, Tcl_Obj *objPtr); +#endif +#ifndef Tcl_GetServiceMode_TCL_DECLARED +#define Tcl_GetServiceMode_TCL_DECLARED +/* 171 */ +EXTERN int Tcl_GetServiceMode(void); +#endif +#ifndef Tcl_GetSlave_TCL_DECLARED +#define Tcl_GetSlave_TCL_DECLARED +/* 172 */ +EXTERN Tcl_Interp * Tcl_GetSlave(Tcl_Interp *interp, + CONST char *slaveName); +#endif +#ifndef Tcl_GetStdChannel_TCL_DECLARED +#define Tcl_GetStdChannel_TCL_DECLARED +/* 173 */ +EXTERN Tcl_Channel Tcl_GetStdChannel(int type); +#endif +#ifndef Tcl_GetStringResult_TCL_DECLARED +#define Tcl_GetStringResult_TCL_DECLARED +/* 174 */ +EXTERN CONST84_RETURN char * Tcl_GetStringResult(Tcl_Interp *interp); +#endif +#ifndef Tcl_GetVar_TCL_DECLARED +#define Tcl_GetVar_TCL_DECLARED +/* 175 */ +EXTERN CONST84_RETURN char * Tcl_GetVar(Tcl_Interp *interp, + CONST char *varName, int flags); +#endif +#ifndef Tcl_GetVar2_TCL_DECLARED +#define Tcl_GetVar2_TCL_DECLARED +/* 176 */ +EXTERN CONST84_RETURN char * Tcl_GetVar2(Tcl_Interp *interp, + CONST char *part1, CONST char *part2, + int flags); +#endif +#ifndef Tcl_GlobalEval_TCL_DECLARED +#define Tcl_GlobalEval_TCL_DECLARED +/* 177 */ +EXTERN int Tcl_GlobalEval(Tcl_Interp *interp, + CONST char *command); +#endif +#ifndef Tcl_GlobalEvalObj_TCL_DECLARED +#define Tcl_GlobalEvalObj_TCL_DECLARED +/* 178 */ +EXTERN int Tcl_GlobalEvalObj(Tcl_Interp *interp, + Tcl_Obj *objPtr); +#endif +#ifndef Tcl_HideCommand_TCL_DECLARED +#define Tcl_HideCommand_TCL_DECLARED +/* 179 */ +EXTERN int Tcl_HideCommand(Tcl_Interp *interp, + CONST char *cmdName, + CONST char *hiddenCmdToken); +#endif +#ifndef Tcl_Init_TCL_DECLARED +#define Tcl_Init_TCL_DECLARED +/* 180 */ +EXTERN int Tcl_Init(Tcl_Interp *interp); +#endif +#ifndef Tcl_InitHashTable_TCL_DECLARED +#define Tcl_InitHashTable_TCL_DECLARED +/* 181 */ +EXTERN void Tcl_InitHashTable(Tcl_HashTable *tablePtr, + int keyType); +#endif +#ifndef Tcl_InputBlocked_TCL_DECLARED +#define Tcl_InputBlocked_TCL_DECLARED +/* 182 */ +EXTERN int Tcl_InputBlocked(Tcl_Channel chan); +#endif +#ifndef Tcl_InputBuffered_TCL_DECLARED +#define Tcl_InputBuffered_TCL_DECLARED +/* 183 */ +EXTERN int Tcl_InputBuffered(Tcl_Channel chan); +#endif +#ifndef Tcl_InterpDeleted_TCL_DECLARED +#define Tcl_InterpDeleted_TCL_DECLARED +/* 184 */ +EXTERN int Tcl_InterpDeleted(Tcl_Interp *interp); +#endif +#ifndef Tcl_IsSafe_TCL_DECLARED +#define Tcl_IsSafe_TCL_DECLARED +/* 185 */ +EXTERN int Tcl_IsSafe(Tcl_Interp *interp); +#endif +#ifndef Tcl_JoinPath_TCL_DECLARED +#define Tcl_JoinPath_TCL_DECLARED +/* 186 */ +EXTERN char * Tcl_JoinPath(int argc, CONST84 char *CONST *argv, + Tcl_DString *resultPtr); +#endif +#ifndef Tcl_LinkVar_TCL_DECLARED +#define Tcl_LinkVar_TCL_DECLARED +/* 187 */ +EXTERN int Tcl_LinkVar(Tcl_Interp *interp, CONST char *varName, + char *addr, int type); +#endif +/* Slot 188 is reserved */ +#ifndef Tcl_MakeFileChannel_TCL_DECLARED +#define Tcl_MakeFileChannel_TCL_DECLARED +/* 189 */ +EXTERN Tcl_Channel Tcl_MakeFileChannel(ClientData handle, int mode); +#endif +#ifndef Tcl_MakeSafe_TCL_DECLARED +#define Tcl_MakeSafe_TCL_DECLARED +/* 190 */ +EXTERN int Tcl_MakeSafe(Tcl_Interp *interp); +#endif +#ifndef Tcl_MakeTcpClientChannel_TCL_DECLARED +#define Tcl_MakeTcpClientChannel_TCL_DECLARED +/* 191 */ +EXTERN Tcl_Channel Tcl_MakeTcpClientChannel(ClientData tcpSocket); +#endif +#ifndef Tcl_Merge_TCL_DECLARED +#define Tcl_Merge_TCL_DECLARED +/* 192 */ +EXTERN char * Tcl_Merge(int argc, CONST84 char *CONST *argv); +#endif +#ifndef Tcl_NextHashEntry_TCL_DECLARED +#define Tcl_NextHashEntry_TCL_DECLARED +/* 193 */ +EXTERN Tcl_HashEntry * Tcl_NextHashEntry(Tcl_HashSearch *searchPtr); +#endif +#ifndef Tcl_NotifyChannel_TCL_DECLARED +#define Tcl_NotifyChannel_TCL_DECLARED +/* 194 */ +EXTERN void Tcl_NotifyChannel(Tcl_Channel channel, int mask); +#endif +#ifndef Tcl_ObjGetVar2_TCL_DECLARED +#define Tcl_ObjGetVar2_TCL_DECLARED +/* 195 */ +EXTERN Tcl_Obj * Tcl_ObjGetVar2(Tcl_Interp *interp, Tcl_Obj *part1Ptr, + Tcl_Obj *part2Ptr, int flags); +#endif +#ifndef Tcl_ObjSetVar2_TCL_DECLARED +#define Tcl_ObjSetVar2_TCL_DECLARED +/* 196 */ +EXTERN Tcl_Obj * Tcl_ObjSetVar2(Tcl_Interp *interp, Tcl_Obj *part1Ptr, + Tcl_Obj *part2Ptr, Tcl_Obj *newValuePtr, + int flags); +#endif +#ifndef Tcl_OpenCommandChannel_TCL_DECLARED +#define Tcl_OpenCommandChannel_TCL_DECLARED +/* 197 */ +EXTERN Tcl_Channel Tcl_OpenCommandChannel(Tcl_Interp *interp, int argc, + CONST84 char **argv, int flags); +#endif +#ifndef Tcl_OpenFileChannel_TCL_DECLARED +#define Tcl_OpenFileChannel_TCL_DECLARED +/* 198 */ +EXTERN Tcl_Channel Tcl_OpenFileChannel(Tcl_Interp *interp, + CONST char *fileName, CONST char *modeString, + int permissions); +#endif +#ifndef Tcl_OpenTcpClient_TCL_DECLARED +#define Tcl_OpenTcpClient_TCL_DECLARED +/* 199 */ +EXTERN Tcl_Channel Tcl_OpenTcpClient(Tcl_Interp *interp, int port, + CONST char *address, CONST char *myaddr, + int myport, int async); +#endif +#ifndef Tcl_OpenTcpServer_TCL_DECLARED +#define Tcl_OpenTcpServer_TCL_DECLARED +/* 200 */ +EXTERN Tcl_Channel Tcl_OpenTcpServer(Tcl_Interp *interp, int port, + CONST char *host, + Tcl_TcpAcceptProc *acceptProc, + ClientData callbackData); +#endif +#ifndef Tcl_Preserve_TCL_DECLARED +#define Tcl_Preserve_TCL_DECLARED +/* 201 */ +EXTERN void Tcl_Preserve(ClientData data); +#endif +#ifndef Tcl_PrintDouble_TCL_DECLARED +#define Tcl_PrintDouble_TCL_DECLARED +/* 202 */ +EXTERN void Tcl_PrintDouble(Tcl_Interp *interp, double value, + char *dst); +#endif +#ifndef Tcl_PutEnv_TCL_DECLARED +#define Tcl_PutEnv_TCL_DECLARED +/* 203 */ +EXTERN int Tcl_PutEnv(CONST char *assignment); +#endif +#ifndef Tcl_PosixError_TCL_DECLARED +#define Tcl_PosixError_TCL_DECLARED +/* 204 */ +EXTERN CONST84_RETURN char * Tcl_PosixError(Tcl_Interp *interp); +#endif +#ifndef Tcl_QueueEvent_TCL_DECLARED +#define Tcl_QueueEvent_TCL_DECLARED +/* 205 */ +EXTERN void Tcl_QueueEvent(Tcl_Event *evPtr, + Tcl_QueuePosition position); +#endif +#ifndef Tcl_Read_TCL_DECLARED +#define Tcl_Read_TCL_DECLARED +/* 206 */ +EXTERN int Tcl_Read(Tcl_Channel chan, char *bufPtr, int toRead); +#endif +#ifndef Tcl_ReapDetachedProcs_TCL_DECLARED +#define Tcl_ReapDetachedProcs_TCL_DECLARED +/* 207 */ +EXTERN void Tcl_ReapDetachedProcs(void); +#endif +#ifndef Tcl_RecordAndEval_TCL_DECLARED +#define Tcl_RecordAndEval_TCL_DECLARED +/* 208 */ +EXTERN int Tcl_RecordAndEval(Tcl_Interp *interp, + CONST char *cmd, int flags); +#endif +#ifndef Tcl_RecordAndEvalObj_TCL_DECLARED +#define Tcl_RecordAndEvalObj_TCL_DECLARED +/* 209 */ +EXTERN int Tcl_RecordAndEvalObj(Tcl_Interp *interp, + Tcl_Obj *cmdPtr, int flags); +#endif +#ifndef Tcl_RegisterChannel_TCL_DECLARED +#define Tcl_RegisterChannel_TCL_DECLARED +/* 210 */ +EXTERN void Tcl_RegisterChannel(Tcl_Interp *interp, + Tcl_Channel chan); +#endif +#ifndef Tcl_RegisterObjType_TCL_DECLARED +#define Tcl_RegisterObjType_TCL_DECLARED +/* 211 */ +EXTERN void Tcl_RegisterObjType(Tcl_ObjType *typePtr); +#endif +#ifndef Tcl_RegExpCompile_TCL_DECLARED +#define Tcl_RegExpCompile_TCL_DECLARED +/* 212 */ +EXTERN Tcl_RegExp Tcl_RegExpCompile(Tcl_Interp *interp, + CONST char *pattern); +#endif +#ifndef Tcl_RegExpExec_TCL_DECLARED +#define Tcl_RegExpExec_TCL_DECLARED +/* 213 */ +EXTERN int Tcl_RegExpExec(Tcl_Interp *interp, Tcl_RegExp regexp, + CONST char *text, CONST char *start); +#endif +#ifndef Tcl_RegExpMatch_TCL_DECLARED +#define Tcl_RegExpMatch_TCL_DECLARED +/* 214 */ +EXTERN int Tcl_RegExpMatch(Tcl_Interp *interp, CONST char *text, + CONST char *pattern); +#endif +#ifndef Tcl_RegExpRange_TCL_DECLARED +#define Tcl_RegExpRange_TCL_DECLARED +/* 215 */ +EXTERN void Tcl_RegExpRange(Tcl_RegExp regexp, int index, + CONST84 char **startPtr, + CONST84 char **endPtr); +#endif +#ifndef Tcl_Release_TCL_DECLARED +#define Tcl_Release_TCL_DECLARED +/* 216 */ +EXTERN void Tcl_Release(ClientData clientData); +#endif +#ifndef Tcl_ResetResult_TCL_DECLARED +#define Tcl_ResetResult_TCL_DECLARED +/* 217 */ +EXTERN void Tcl_ResetResult(Tcl_Interp *interp); +#endif +#ifndef Tcl_ScanElement_TCL_DECLARED +#define Tcl_ScanElement_TCL_DECLARED +/* 218 */ +EXTERN int Tcl_ScanElement(CONST char *src, int *flagPtr); +#endif +#ifndef Tcl_ScanCountedElement_TCL_DECLARED +#define Tcl_ScanCountedElement_TCL_DECLARED +/* 219 */ +EXTERN int Tcl_ScanCountedElement(CONST char *src, int length, + int *flagPtr); +#endif +#ifndef Tcl_SeekOld_TCL_DECLARED +#define Tcl_SeekOld_TCL_DECLARED +/* 220 */ +EXTERN int Tcl_SeekOld(Tcl_Channel chan, int offset, int mode); +#endif +#ifndef Tcl_ServiceAll_TCL_DECLARED +#define Tcl_ServiceAll_TCL_DECLARED +/* 221 */ +EXTERN int Tcl_ServiceAll(void); +#endif +#ifndef Tcl_ServiceEvent_TCL_DECLARED +#define Tcl_ServiceEvent_TCL_DECLARED +/* 222 */ +EXTERN int Tcl_ServiceEvent(int flags); +#endif +#ifndef Tcl_SetAssocData_TCL_DECLARED +#define Tcl_SetAssocData_TCL_DECLARED +/* 223 */ +EXTERN void Tcl_SetAssocData(Tcl_Interp *interp, + CONST char *name, Tcl_InterpDeleteProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_SetChannelBufferSize_TCL_DECLARED +#define Tcl_SetChannelBufferSize_TCL_DECLARED +/* 224 */ +EXTERN void Tcl_SetChannelBufferSize(Tcl_Channel chan, int sz); +#endif +#ifndef Tcl_SetChannelOption_TCL_DECLARED +#define Tcl_SetChannelOption_TCL_DECLARED +/* 225 */ +EXTERN int Tcl_SetChannelOption(Tcl_Interp *interp, + Tcl_Channel chan, CONST char *optionName, + CONST char *newValue); +#endif +#ifndef Tcl_SetCommandInfo_TCL_DECLARED +#define Tcl_SetCommandInfo_TCL_DECLARED +/* 226 */ +EXTERN int Tcl_SetCommandInfo(Tcl_Interp *interp, + CONST char *cmdName, + CONST Tcl_CmdInfo *infoPtr); +#endif +#ifndef Tcl_SetErrno_TCL_DECLARED +#define Tcl_SetErrno_TCL_DECLARED +/* 227 */ +EXTERN void Tcl_SetErrno(int err); +#endif +#ifndef Tcl_SetErrorCode_TCL_DECLARED +#define Tcl_SetErrorCode_TCL_DECLARED +/* 228 */ +EXTERN void Tcl_SetErrorCode(Tcl_Interp *interp, ...); +#endif +#ifndef Tcl_SetMaxBlockTime_TCL_DECLARED +#define Tcl_SetMaxBlockTime_TCL_DECLARED +/* 229 */ +EXTERN void Tcl_SetMaxBlockTime(Tcl_Time *timePtr); +#endif +#ifndef Tcl_SetPanicProc_TCL_DECLARED +#define Tcl_SetPanicProc_TCL_DECLARED +/* 230 */ +EXTERN void Tcl_SetPanicProc(Tcl_PanicProc *panicProc); +#endif +#ifndef Tcl_SetRecursionLimit_TCL_DECLARED +#define Tcl_SetRecursionLimit_TCL_DECLARED +/* 231 */ +EXTERN int Tcl_SetRecursionLimit(Tcl_Interp *interp, int depth); +#endif +#ifndef Tcl_SetResult_TCL_DECLARED +#define Tcl_SetResult_TCL_DECLARED +/* 232 */ +EXTERN void Tcl_SetResult(Tcl_Interp *interp, char *result, + Tcl_FreeProc *freeProc); +#endif +#ifndef Tcl_SetServiceMode_TCL_DECLARED +#define Tcl_SetServiceMode_TCL_DECLARED +/* 233 */ +EXTERN int Tcl_SetServiceMode(int mode); +#endif +#ifndef Tcl_SetObjErrorCode_TCL_DECLARED +#define Tcl_SetObjErrorCode_TCL_DECLARED +/* 234 */ +EXTERN void Tcl_SetObjErrorCode(Tcl_Interp *interp, + Tcl_Obj *errorObjPtr); +#endif +#ifndef Tcl_SetObjResult_TCL_DECLARED +#define Tcl_SetObjResult_TCL_DECLARED +/* 235 */ +EXTERN void Tcl_SetObjResult(Tcl_Interp *interp, + Tcl_Obj *resultObjPtr); +#endif +#ifndef Tcl_SetStdChannel_TCL_DECLARED +#define Tcl_SetStdChannel_TCL_DECLARED +/* 236 */ +EXTERN void Tcl_SetStdChannel(Tcl_Channel channel, int type); +#endif +#ifndef Tcl_SetVar_TCL_DECLARED +#define Tcl_SetVar_TCL_DECLARED +/* 237 */ +EXTERN CONST84_RETURN char * Tcl_SetVar(Tcl_Interp *interp, + CONST char *varName, CONST char *newValue, + int flags); +#endif +#ifndef Tcl_SetVar2_TCL_DECLARED +#define Tcl_SetVar2_TCL_DECLARED +/* 238 */ +EXTERN CONST84_RETURN char * Tcl_SetVar2(Tcl_Interp *interp, + CONST char *part1, CONST char *part2, + CONST char *newValue, int flags); +#endif +#ifndef Tcl_SignalId_TCL_DECLARED +#define Tcl_SignalId_TCL_DECLARED +/* 239 */ +EXTERN CONST84_RETURN char * Tcl_SignalId(int sig); +#endif +#ifndef Tcl_SignalMsg_TCL_DECLARED +#define Tcl_SignalMsg_TCL_DECLARED +/* 240 */ +EXTERN CONST84_RETURN char * Tcl_SignalMsg(int sig); +#endif +#ifndef Tcl_SourceRCFile_TCL_DECLARED +#define Tcl_SourceRCFile_TCL_DECLARED +/* 241 */ +EXTERN void Tcl_SourceRCFile(Tcl_Interp *interp); +#endif +#ifndef Tcl_SplitList_TCL_DECLARED +#define Tcl_SplitList_TCL_DECLARED +/* 242 */ +EXTERN int Tcl_SplitList(Tcl_Interp *interp, + CONST char *listStr, int *argcPtr, + CONST84 char ***argvPtr); +#endif +#ifndef Tcl_SplitPath_TCL_DECLARED +#define Tcl_SplitPath_TCL_DECLARED +/* 243 */ +EXTERN void Tcl_SplitPath(CONST char *path, int *argcPtr, + CONST84 char ***argvPtr); +#endif +#ifndef Tcl_StaticPackage_TCL_DECLARED +#define Tcl_StaticPackage_TCL_DECLARED +/* 244 */ +EXTERN void Tcl_StaticPackage(Tcl_Interp *interp, + CONST char *pkgName, + Tcl_PackageInitProc *initProc, + Tcl_PackageInitProc *safeInitProc); +#endif +#ifndef Tcl_StringMatch_TCL_DECLARED +#define Tcl_StringMatch_TCL_DECLARED +/* 245 */ +EXTERN int Tcl_StringMatch(CONST char *str, CONST char *pattern); +#endif +#ifndef Tcl_TellOld_TCL_DECLARED +#define Tcl_TellOld_TCL_DECLARED +/* 246 */ +EXTERN int Tcl_TellOld(Tcl_Channel chan); +#endif +#ifndef Tcl_TraceVar_TCL_DECLARED +#define Tcl_TraceVar_TCL_DECLARED +/* 247 */ +EXTERN int Tcl_TraceVar(Tcl_Interp *interp, CONST char *varName, + int flags, Tcl_VarTraceProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_TraceVar2_TCL_DECLARED +#define Tcl_TraceVar2_TCL_DECLARED +/* 248 */ +EXTERN int Tcl_TraceVar2(Tcl_Interp *interp, CONST char *part1, + CONST char *part2, int flags, + Tcl_VarTraceProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_TranslateFileName_TCL_DECLARED +#define Tcl_TranslateFileName_TCL_DECLARED +/* 249 */ +EXTERN char * Tcl_TranslateFileName(Tcl_Interp *interp, + CONST char *name, Tcl_DString *bufferPtr); +#endif +#ifndef Tcl_Ungets_TCL_DECLARED +#define Tcl_Ungets_TCL_DECLARED +/* 250 */ +EXTERN int Tcl_Ungets(Tcl_Channel chan, CONST char *str, + int len, int atHead); +#endif +#ifndef Tcl_UnlinkVar_TCL_DECLARED +#define Tcl_UnlinkVar_TCL_DECLARED +/* 251 */ +EXTERN void Tcl_UnlinkVar(Tcl_Interp *interp, + CONST char *varName); +#endif +#ifndef Tcl_UnregisterChannel_TCL_DECLARED +#define Tcl_UnregisterChannel_TCL_DECLARED +/* 252 */ +EXTERN int Tcl_UnregisterChannel(Tcl_Interp *interp, + Tcl_Channel chan); +#endif +#ifndef Tcl_UnsetVar_TCL_DECLARED +#define Tcl_UnsetVar_TCL_DECLARED +/* 253 */ +EXTERN int Tcl_UnsetVar(Tcl_Interp *interp, CONST char *varName, + int flags); +#endif +#ifndef Tcl_UnsetVar2_TCL_DECLARED +#define Tcl_UnsetVar2_TCL_DECLARED +/* 254 */ +EXTERN int Tcl_UnsetVar2(Tcl_Interp *interp, CONST char *part1, + CONST char *part2, int flags); +#endif +#ifndef Tcl_UntraceVar_TCL_DECLARED +#define Tcl_UntraceVar_TCL_DECLARED +/* 255 */ +EXTERN void Tcl_UntraceVar(Tcl_Interp *interp, + CONST char *varName, int flags, + Tcl_VarTraceProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_UntraceVar2_TCL_DECLARED +#define Tcl_UntraceVar2_TCL_DECLARED +/* 256 */ +EXTERN void Tcl_UntraceVar2(Tcl_Interp *interp, + CONST char *part1, CONST char *part2, + int flags, Tcl_VarTraceProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_UpdateLinkedVar_TCL_DECLARED +#define Tcl_UpdateLinkedVar_TCL_DECLARED +/* 257 */ +EXTERN void Tcl_UpdateLinkedVar(Tcl_Interp *interp, + CONST char *varName); +#endif +#ifndef Tcl_UpVar_TCL_DECLARED +#define Tcl_UpVar_TCL_DECLARED +/* 258 */ +EXTERN int Tcl_UpVar(Tcl_Interp *interp, CONST char *frameName, + CONST char *varName, CONST char *localName, + int flags); +#endif +#ifndef Tcl_UpVar2_TCL_DECLARED +#define Tcl_UpVar2_TCL_DECLARED +/* 259 */ +EXTERN int Tcl_UpVar2(Tcl_Interp *interp, CONST char *frameName, + CONST char *part1, CONST char *part2, + CONST char *localName, int flags); +#endif +#ifndef Tcl_VarEval_TCL_DECLARED +#define Tcl_VarEval_TCL_DECLARED +/* 260 */ +EXTERN int Tcl_VarEval(Tcl_Interp *interp, ...); +#endif +#ifndef Tcl_VarTraceInfo_TCL_DECLARED +#define Tcl_VarTraceInfo_TCL_DECLARED +/* 261 */ +EXTERN ClientData Tcl_VarTraceInfo(Tcl_Interp *interp, + CONST char *varName, int flags, + Tcl_VarTraceProc *procPtr, + ClientData prevClientData); +#endif +#ifndef Tcl_VarTraceInfo2_TCL_DECLARED +#define Tcl_VarTraceInfo2_TCL_DECLARED +/* 262 */ +EXTERN ClientData Tcl_VarTraceInfo2(Tcl_Interp *interp, + CONST char *part1, CONST char *part2, + int flags, Tcl_VarTraceProc *procPtr, + ClientData prevClientData); +#endif +#ifndef Tcl_Write_TCL_DECLARED +#define Tcl_Write_TCL_DECLARED +/* 263 */ +EXTERN int Tcl_Write(Tcl_Channel chan, CONST char *s, int slen); +#endif +#ifndef Tcl_WrongNumArgs_TCL_DECLARED +#define Tcl_WrongNumArgs_TCL_DECLARED +/* 264 */ +EXTERN void Tcl_WrongNumArgs(Tcl_Interp *interp, int objc, + Tcl_Obj *CONST objv[], CONST char *message); +#endif +#ifndef Tcl_DumpActiveMemory_TCL_DECLARED +#define Tcl_DumpActiveMemory_TCL_DECLARED +/* 265 */ +EXTERN int Tcl_DumpActiveMemory(CONST char *fileName); +#endif +#ifndef Tcl_ValidateAllMemory_TCL_DECLARED +#define Tcl_ValidateAllMemory_TCL_DECLARED +/* 266 */ +EXTERN void Tcl_ValidateAllMemory(CONST char *file, int line); +#endif +#ifndef Tcl_AppendResultVA_TCL_DECLARED +#define Tcl_AppendResultVA_TCL_DECLARED +/* 267 */ +EXTERN void Tcl_AppendResultVA(Tcl_Interp *interp, + va_list argList); +#endif +#ifndef Tcl_AppendStringsToObjVA_TCL_DECLARED +#define Tcl_AppendStringsToObjVA_TCL_DECLARED +/* 268 */ +EXTERN void Tcl_AppendStringsToObjVA(Tcl_Obj *objPtr, + va_list argList); +#endif +#ifndef Tcl_HashStats_TCL_DECLARED +#define Tcl_HashStats_TCL_DECLARED +/* 269 */ +EXTERN char * Tcl_HashStats(Tcl_HashTable *tablePtr); +#endif +#ifndef Tcl_ParseVar_TCL_DECLARED +#define Tcl_ParseVar_TCL_DECLARED +/* 270 */ +EXTERN CONST84_RETURN char * Tcl_ParseVar(Tcl_Interp *interp, + CONST char *start, CONST84 char **termPtr); +#endif +#ifndef Tcl_PkgPresent_TCL_DECLARED +#define Tcl_PkgPresent_TCL_DECLARED +/* 271 */ +EXTERN CONST84_RETURN char * Tcl_PkgPresent(Tcl_Interp *interp, + CONST char *name, CONST char *version, + int exact); +#endif +#ifndef Tcl_PkgPresentEx_TCL_DECLARED +#define Tcl_PkgPresentEx_TCL_DECLARED +/* 272 */ +EXTERN CONST84_RETURN char * Tcl_PkgPresentEx(Tcl_Interp *interp, + CONST char *name, CONST char *version, + int exact, ClientData *clientDataPtr); +#endif +#ifndef Tcl_PkgProvide_TCL_DECLARED +#define Tcl_PkgProvide_TCL_DECLARED +/* 273 */ +EXTERN int Tcl_PkgProvide(Tcl_Interp *interp, CONST char *name, + CONST char *version); +#endif +#ifndef Tcl_PkgRequire_TCL_DECLARED +#define Tcl_PkgRequire_TCL_DECLARED +/* 274 */ +EXTERN CONST84_RETURN char * Tcl_PkgRequire(Tcl_Interp *interp, + CONST char *name, CONST char *version, + int exact); +#endif +#ifndef Tcl_SetErrorCodeVA_TCL_DECLARED +#define Tcl_SetErrorCodeVA_TCL_DECLARED +/* 275 */ +EXTERN void Tcl_SetErrorCodeVA(Tcl_Interp *interp, + va_list argList); +#endif +#ifndef Tcl_VarEvalVA_TCL_DECLARED +#define Tcl_VarEvalVA_TCL_DECLARED +/* 276 */ +EXTERN int Tcl_VarEvalVA(Tcl_Interp *interp, va_list argList); +#endif +#ifndef Tcl_WaitPid_TCL_DECLARED +#define Tcl_WaitPid_TCL_DECLARED +/* 277 */ +EXTERN Tcl_Pid Tcl_WaitPid(Tcl_Pid pid, int *statPtr, int options); +#endif +#ifndef Tcl_PanicVA_TCL_DECLARED +#define Tcl_PanicVA_TCL_DECLARED +/* 278 */ +EXTERN void Tcl_PanicVA(CONST char *format, va_list argList); +#endif +#ifndef Tcl_GetVersion_TCL_DECLARED +#define Tcl_GetVersion_TCL_DECLARED +/* 279 */ +EXTERN void Tcl_GetVersion(int *major, int *minor, + int *patchLevel, int *type); +#endif +#ifndef Tcl_InitMemory_TCL_DECLARED +#define Tcl_InitMemory_TCL_DECLARED +/* 280 */ +EXTERN void Tcl_InitMemory(Tcl_Interp *interp); +#endif +#ifndef Tcl_StackChannel_TCL_DECLARED +#define Tcl_StackChannel_TCL_DECLARED +/* 281 */ +EXTERN Tcl_Channel Tcl_StackChannel(Tcl_Interp *interp, + Tcl_ChannelType *typePtr, + ClientData instanceData, int mask, + Tcl_Channel prevChan); +#endif +#ifndef Tcl_UnstackChannel_TCL_DECLARED +#define Tcl_UnstackChannel_TCL_DECLARED +/* 282 */ +EXTERN int Tcl_UnstackChannel(Tcl_Interp *interp, + Tcl_Channel chan); +#endif +#ifndef Tcl_GetStackedChannel_TCL_DECLARED +#define Tcl_GetStackedChannel_TCL_DECLARED +/* 283 */ +EXTERN Tcl_Channel Tcl_GetStackedChannel(Tcl_Channel chan); +#endif +#ifndef Tcl_SetMainLoop_TCL_DECLARED +#define Tcl_SetMainLoop_TCL_DECLARED +/* 284 */ +EXTERN void Tcl_SetMainLoop(Tcl_MainLoopProc *proc); +#endif +/* Slot 285 is reserved */ +#ifndef Tcl_AppendObjToObj_TCL_DECLARED +#define Tcl_AppendObjToObj_TCL_DECLARED +/* 286 */ +EXTERN void Tcl_AppendObjToObj(Tcl_Obj *objPtr, + Tcl_Obj *appendObjPtr); +#endif +#ifndef Tcl_CreateEncoding_TCL_DECLARED +#define Tcl_CreateEncoding_TCL_DECLARED +/* 287 */ +EXTERN Tcl_Encoding Tcl_CreateEncoding(CONST Tcl_EncodingType *typePtr); +#endif +#ifndef Tcl_CreateThreadExitHandler_TCL_DECLARED +#define Tcl_CreateThreadExitHandler_TCL_DECLARED +/* 288 */ +EXTERN void Tcl_CreateThreadExitHandler(Tcl_ExitProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_DeleteThreadExitHandler_TCL_DECLARED +#define Tcl_DeleteThreadExitHandler_TCL_DECLARED +/* 289 */ +EXTERN void Tcl_DeleteThreadExitHandler(Tcl_ExitProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_DiscardResult_TCL_DECLARED +#define Tcl_DiscardResult_TCL_DECLARED +/* 290 */ +EXTERN void Tcl_DiscardResult(Tcl_SavedResult *statePtr); +#endif +#ifndef Tcl_EvalEx_TCL_DECLARED +#define Tcl_EvalEx_TCL_DECLARED +/* 291 */ +EXTERN int Tcl_EvalEx(Tcl_Interp *interp, CONST char *script, + int numBytes, int flags); +#endif +#ifndef Tcl_EvalObjv_TCL_DECLARED +#define Tcl_EvalObjv_TCL_DECLARED +/* 292 */ +EXTERN int Tcl_EvalObjv(Tcl_Interp *interp, int objc, + Tcl_Obj *CONST objv[], int flags); +#endif +#ifndef Tcl_EvalObjEx_TCL_DECLARED +#define Tcl_EvalObjEx_TCL_DECLARED +/* 293 */ +EXTERN int Tcl_EvalObjEx(Tcl_Interp *interp, Tcl_Obj *objPtr, + int flags); +#endif +#ifndef Tcl_ExitThread_TCL_DECLARED +#define Tcl_ExitThread_TCL_DECLARED +/* 294 */ +EXTERN void Tcl_ExitThread(int status); +#endif +#ifndef Tcl_ExternalToUtf_TCL_DECLARED +#define Tcl_ExternalToUtf_TCL_DECLARED +/* 295 */ +EXTERN int Tcl_ExternalToUtf(Tcl_Interp *interp, + Tcl_Encoding encoding, CONST char *src, + int srcLen, int flags, + Tcl_EncodingState *statePtr, char *dst, + int dstLen, int *srcReadPtr, + int *dstWrotePtr, int *dstCharsPtr); +#endif +#ifndef Tcl_ExternalToUtfDString_TCL_DECLARED +#define Tcl_ExternalToUtfDString_TCL_DECLARED +/* 296 */ +EXTERN char * Tcl_ExternalToUtfDString(Tcl_Encoding encoding, + CONST char *src, int srcLen, + Tcl_DString *dsPtr); +#endif +#ifndef Tcl_FinalizeThread_TCL_DECLARED +#define Tcl_FinalizeThread_TCL_DECLARED +/* 297 */ +EXTERN void Tcl_FinalizeThread(void); +#endif +#ifndef Tcl_FinalizeNotifier_TCL_DECLARED +#define Tcl_FinalizeNotifier_TCL_DECLARED +/* 298 */ +EXTERN void Tcl_FinalizeNotifier(ClientData clientData); +#endif +#ifndef Tcl_FreeEncoding_TCL_DECLARED +#define Tcl_FreeEncoding_TCL_DECLARED +/* 299 */ +EXTERN void Tcl_FreeEncoding(Tcl_Encoding encoding); +#endif +#ifndef Tcl_GetCurrentThread_TCL_DECLARED +#define Tcl_GetCurrentThread_TCL_DECLARED +/* 300 */ +EXTERN Tcl_ThreadId Tcl_GetCurrentThread(void); +#endif +#ifndef Tcl_GetEncoding_TCL_DECLARED +#define Tcl_GetEncoding_TCL_DECLARED +/* 301 */ +EXTERN Tcl_Encoding Tcl_GetEncoding(Tcl_Interp *interp, CONST char *name); +#endif +#ifndef Tcl_GetEncodingName_TCL_DECLARED +#define Tcl_GetEncodingName_TCL_DECLARED +/* 302 */ +EXTERN CONST84_RETURN char * Tcl_GetEncodingName(Tcl_Encoding encoding); +#endif +#ifndef Tcl_GetEncodingNames_TCL_DECLARED +#define Tcl_GetEncodingNames_TCL_DECLARED +/* 303 */ +EXTERN void Tcl_GetEncodingNames(Tcl_Interp *interp); +#endif +#ifndef Tcl_GetIndexFromObjStruct_TCL_DECLARED +#define Tcl_GetIndexFromObjStruct_TCL_DECLARED +/* 304 */ +EXTERN int Tcl_GetIndexFromObjStruct(Tcl_Interp *interp, + Tcl_Obj *objPtr, CONST VOID *tablePtr, + int offset, CONST char *msg, int flags, + int *indexPtr); +#endif +#ifndef Tcl_GetThreadData_TCL_DECLARED +#define Tcl_GetThreadData_TCL_DECLARED +/* 305 */ +EXTERN VOID * Tcl_GetThreadData(Tcl_ThreadDataKey *keyPtr, + int size); +#endif +#ifndef Tcl_GetVar2Ex_TCL_DECLARED +#define Tcl_GetVar2Ex_TCL_DECLARED +/* 306 */ +EXTERN Tcl_Obj * Tcl_GetVar2Ex(Tcl_Interp *interp, CONST char *part1, + CONST char *part2, int flags); +#endif +#ifndef Tcl_InitNotifier_TCL_DECLARED +#define Tcl_InitNotifier_TCL_DECLARED +/* 307 */ +EXTERN ClientData Tcl_InitNotifier(void); +#endif +#ifndef Tcl_MutexLock_TCL_DECLARED +#define Tcl_MutexLock_TCL_DECLARED +/* 308 */ +EXTERN void Tcl_MutexLock(Tcl_Mutex *mutexPtr); +#endif +#ifndef Tcl_MutexUnlock_TCL_DECLARED +#define Tcl_MutexUnlock_TCL_DECLARED +/* 309 */ +EXTERN void Tcl_MutexUnlock(Tcl_Mutex *mutexPtr); +#endif +#ifndef Tcl_ConditionNotify_TCL_DECLARED +#define Tcl_ConditionNotify_TCL_DECLARED +/* 310 */ +EXTERN void Tcl_ConditionNotify(Tcl_Condition *condPtr); +#endif +#ifndef Tcl_ConditionWait_TCL_DECLARED +#define Tcl_ConditionWait_TCL_DECLARED +/* 311 */ +EXTERN void Tcl_ConditionWait(Tcl_Condition *condPtr, + Tcl_Mutex *mutexPtr, Tcl_Time *timePtr); +#endif +#ifndef Tcl_NumUtfChars_TCL_DECLARED +#define Tcl_NumUtfChars_TCL_DECLARED +/* 312 */ +EXTERN int Tcl_NumUtfChars(CONST char *src, int length); +#endif +#ifndef Tcl_ReadChars_TCL_DECLARED +#define Tcl_ReadChars_TCL_DECLARED +/* 313 */ +EXTERN int Tcl_ReadChars(Tcl_Channel channel, Tcl_Obj *objPtr, + int charsToRead, int appendFlag); +#endif +#ifndef Tcl_RestoreResult_TCL_DECLARED +#define Tcl_RestoreResult_TCL_DECLARED +/* 314 */ +EXTERN void Tcl_RestoreResult(Tcl_Interp *interp, + Tcl_SavedResult *statePtr); +#endif +#ifndef Tcl_SaveResult_TCL_DECLARED +#define Tcl_SaveResult_TCL_DECLARED +/* 315 */ +EXTERN void Tcl_SaveResult(Tcl_Interp *interp, + Tcl_SavedResult *statePtr); +#endif +#ifndef Tcl_SetSystemEncoding_TCL_DECLARED +#define Tcl_SetSystemEncoding_TCL_DECLARED +/* 316 */ +EXTERN int Tcl_SetSystemEncoding(Tcl_Interp *interp, + CONST char *name); +#endif +#ifndef Tcl_SetVar2Ex_TCL_DECLARED +#define Tcl_SetVar2Ex_TCL_DECLARED +/* 317 */ +EXTERN Tcl_Obj * Tcl_SetVar2Ex(Tcl_Interp *interp, CONST char *part1, + CONST char *part2, Tcl_Obj *newValuePtr, + int flags); +#endif +#ifndef Tcl_ThreadAlert_TCL_DECLARED +#define Tcl_ThreadAlert_TCL_DECLARED +/* 318 */ +EXTERN void Tcl_ThreadAlert(Tcl_ThreadId threadId); +#endif +#ifndef Tcl_ThreadQueueEvent_TCL_DECLARED +#define Tcl_ThreadQueueEvent_TCL_DECLARED +/* 319 */ +EXTERN void Tcl_ThreadQueueEvent(Tcl_ThreadId threadId, + Tcl_Event *evPtr, Tcl_QueuePosition position); +#endif +#ifndef Tcl_UniCharAtIndex_TCL_DECLARED +#define Tcl_UniCharAtIndex_TCL_DECLARED +/* 320 */ +EXTERN Tcl_UniChar Tcl_UniCharAtIndex(CONST char *src, int index); +#endif +#ifndef Tcl_UniCharToLower_TCL_DECLARED +#define Tcl_UniCharToLower_TCL_DECLARED +/* 321 */ +EXTERN Tcl_UniChar Tcl_UniCharToLower(int ch); +#endif +#ifndef Tcl_UniCharToTitle_TCL_DECLARED +#define Tcl_UniCharToTitle_TCL_DECLARED +/* 322 */ +EXTERN Tcl_UniChar Tcl_UniCharToTitle(int ch); +#endif +#ifndef Tcl_UniCharToUpper_TCL_DECLARED +#define Tcl_UniCharToUpper_TCL_DECLARED +/* 323 */ +EXTERN Tcl_UniChar Tcl_UniCharToUpper(int ch); +#endif +#ifndef Tcl_UniCharToUtf_TCL_DECLARED +#define Tcl_UniCharToUtf_TCL_DECLARED +/* 324 */ +EXTERN int Tcl_UniCharToUtf(int ch, char *buf); +#endif +#ifndef Tcl_UtfAtIndex_TCL_DECLARED +#define Tcl_UtfAtIndex_TCL_DECLARED +/* 325 */ +EXTERN CONST84_RETURN char * Tcl_UtfAtIndex(CONST char *src, int index); +#endif +#ifndef Tcl_UtfCharComplete_TCL_DECLARED +#define Tcl_UtfCharComplete_TCL_DECLARED +/* 326 */ +EXTERN int Tcl_UtfCharComplete(CONST char *src, int length); +#endif +#ifndef Tcl_UtfBackslash_TCL_DECLARED +#define Tcl_UtfBackslash_TCL_DECLARED +/* 327 */ +EXTERN int Tcl_UtfBackslash(CONST char *src, int *readPtr, + char *dst); +#endif +#ifndef Tcl_UtfFindFirst_TCL_DECLARED +#define Tcl_UtfFindFirst_TCL_DECLARED +/* 328 */ +EXTERN CONST84_RETURN char * Tcl_UtfFindFirst(CONST char *src, int ch); +#endif +#ifndef Tcl_UtfFindLast_TCL_DECLARED +#define Tcl_UtfFindLast_TCL_DECLARED +/* 329 */ +EXTERN CONST84_RETURN char * Tcl_UtfFindLast(CONST char *src, int ch); +#endif +#ifndef Tcl_UtfNext_TCL_DECLARED +#define Tcl_UtfNext_TCL_DECLARED +/* 330 */ +EXTERN CONST84_RETURN char * Tcl_UtfNext(CONST char *src); +#endif +#ifndef Tcl_UtfPrev_TCL_DECLARED +#define Tcl_UtfPrev_TCL_DECLARED +/* 331 */ +EXTERN CONST84_RETURN char * Tcl_UtfPrev(CONST char *src, CONST char *start); +#endif +#ifndef Tcl_UtfToExternal_TCL_DECLARED +#define Tcl_UtfToExternal_TCL_DECLARED +/* 332 */ +EXTERN int Tcl_UtfToExternal(Tcl_Interp *interp, + Tcl_Encoding encoding, CONST char *src, + int srcLen, int flags, + Tcl_EncodingState *statePtr, char *dst, + int dstLen, int *srcReadPtr, + int *dstWrotePtr, int *dstCharsPtr); +#endif +#ifndef Tcl_UtfToExternalDString_TCL_DECLARED +#define Tcl_UtfToExternalDString_TCL_DECLARED +/* 333 */ +EXTERN char * Tcl_UtfToExternalDString(Tcl_Encoding encoding, + CONST char *src, int srcLen, + Tcl_DString *dsPtr); +#endif +#ifndef Tcl_UtfToLower_TCL_DECLARED +#define Tcl_UtfToLower_TCL_DECLARED +/* 334 */ +EXTERN int Tcl_UtfToLower(char *src); +#endif +#ifndef Tcl_UtfToTitle_TCL_DECLARED +#define Tcl_UtfToTitle_TCL_DECLARED +/* 335 */ +EXTERN int Tcl_UtfToTitle(char *src); +#endif +#ifndef Tcl_UtfToUniChar_TCL_DECLARED +#define Tcl_UtfToUniChar_TCL_DECLARED +/* 336 */ +EXTERN int Tcl_UtfToUniChar(CONST char *src, Tcl_UniChar *chPtr); +#endif +#ifndef Tcl_UtfToUpper_TCL_DECLARED +#define Tcl_UtfToUpper_TCL_DECLARED +/* 337 */ +EXTERN int Tcl_UtfToUpper(char *src); +#endif +#ifndef Tcl_WriteChars_TCL_DECLARED +#define Tcl_WriteChars_TCL_DECLARED +/* 338 */ +EXTERN int Tcl_WriteChars(Tcl_Channel chan, CONST char *src, + int srcLen); +#endif +#ifndef Tcl_WriteObj_TCL_DECLARED +#define Tcl_WriteObj_TCL_DECLARED +/* 339 */ +EXTERN int Tcl_WriteObj(Tcl_Channel chan, Tcl_Obj *objPtr); +#endif +#ifndef Tcl_GetString_TCL_DECLARED +#define Tcl_GetString_TCL_DECLARED +/* 340 */ +EXTERN char * Tcl_GetString(Tcl_Obj *objPtr); +#endif +#ifndef Tcl_GetDefaultEncodingDir_TCL_DECLARED +#define Tcl_GetDefaultEncodingDir_TCL_DECLARED +/* 341 */ +EXTERN CONST84_RETURN char * Tcl_GetDefaultEncodingDir(void); +#endif +#ifndef Tcl_SetDefaultEncodingDir_TCL_DECLARED +#define Tcl_SetDefaultEncodingDir_TCL_DECLARED +/* 342 */ +EXTERN void Tcl_SetDefaultEncodingDir(CONST char *path); +#endif +#ifndef Tcl_AlertNotifier_TCL_DECLARED +#define Tcl_AlertNotifier_TCL_DECLARED +/* 343 */ +EXTERN void Tcl_AlertNotifier(ClientData clientData); +#endif +#ifndef Tcl_ServiceModeHook_TCL_DECLARED +#define Tcl_ServiceModeHook_TCL_DECLARED +/* 344 */ +EXTERN void Tcl_ServiceModeHook(int mode); +#endif +#ifndef Tcl_UniCharIsAlnum_TCL_DECLARED +#define Tcl_UniCharIsAlnum_TCL_DECLARED +/* 345 */ +EXTERN int Tcl_UniCharIsAlnum(int ch); +#endif +#ifndef Tcl_UniCharIsAlpha_TCL_DECLARED +#define Tcl_UniCharIsAlpha_TCL_DECLARED +/* 346 */ +EXTERN int Tcl_UniCharIsAlpha(int ch); +#endif +#ifndef Tcl_UniCharIsDigit_TCL_DECLARED +#define Tcl_UniCharIsDigit_TCL_DECLARED +/* 347 */ +EXTERN int Tcl_UniCharIsDigit(int ch); +#endif +#ifndef Tcl_UniCharIsLower_TCL_DECLARED +#define Tcl_UniCharIsLower_TCL_DECLARED +/* 348 */ +EXTERN int Tcl_UniCharIsLower(int ch); +#endif +#ifndef Tcl_UniCharIsSpace_TCL_DECLARED +#define Tcl_UniCharIsSpace_TCL_DECLARED +/* 349 */ +EXTERN int Tcl_UniCharIsSpace(int ch); +#endif +#ifndef Tcl_UniCharIsUpper_TCL_DECLARED +#define Tcl_UniCharIsUpper_TCL_DECLARED +/* 350 */ +EXTERN int Tcl_UniCharIsUpper(int ch); +#endif +#ifndef Tcl_UniCharIsWordChar_TCL_DECLARED +#define Tcl_UniCharIsWordChar_TCL_DECLARED +/* 351 */ +EXTERN int Tcl_UniCharIsWordChar(int ch); +#endif +#ifndef Tcl_UniCharLen_TCL_DECLARED +#define Tcl_UniCharLen_TCL_DECLARED +/* 352 */ +EXTERN int Tcl_UniCharLen(CONST Tcl_UniChar *uniStr); +#endif +#ifndef Tcl_UniCharNcmp_TCL_DECLARED +#define Tcl_UniCharNcmp_TCL_DECLARED +/* 353 */ +EXTERN int Tcl_UniCharNcmp(CONST Tcl_UniChar *ucs, + CONST Tcl_UniChar *uct, + unsigned long numChars); +#endif +#ifndef Tcl_UniCharToUtfDString_TCL_DECLARED +#define Tcl_UniCharToUtfDString_TCL_DECLARED +/* 354 */ +EXTERN char * Tcl_UniCharToUtfDString(CONST Tcl_UniChar *uniStr, + int uniLength, Tcl_DString *dsPtr); +#endif +#ifndef Tcl_UtfToUniCharDString_TCL_DECLARED +#define Tcl_UtfToUniCharDString_TCL_DECLARED +/* 355 */ +EXTERN Tcl_UniChar * Tcl_UtfToUniCharDString(CONST char *src, int length, + Tcl_DString *dsPtr); +#endif +#ifndef Tcl_GetRegExpFromObj_TCL_DECLARED +#define Tcl_GetRegExpFromObj_TCL_DECLARED +/* 356 */ +EXTERN Tcl_RegExp Tcl_GetRegExpFromObj(Tcl_Interp *interp, + Tcl_Obj *patObj, int flags); +#endif +#ifndef Tcl_EvalTokens_TCL_DECLARED +#define Tcl_EvalTokens_TCL_DECLARED +/* 357 */ +EXTERN Tcl_Obj * Tcl_EvalTokens(Tcl_Interp *interp, + Tcl_Token *tokenPtr, int count); +#endif +#ifndef Tcl_FreeParse_TCL_DECLARED +#define Tcl_FreeParse_TCL_DECLARED +/* 358 */ +EXTERN void Tcl_FreeParse(Tcl_Parse *parsePtr); +#endif +#ifndef Tcl_LogCommandInfo_TCL_DECLARED +#define Tcl_LogCommandInfo_TCL_DECLARED +/* 359 */ +EXTERN void Tcl_LogCommandInfo(Tcl_Interp *interp, + CONST char *script, CONST char *command, + int length); +#endif +#ifndef Tcl_ParseBraces_TCL_DECLARED +#define Tcl_ParseBraces_TCL_DECLARED +/* 360 */ +EXTERN int Tcl_ParseBraces(Tcl_Interp *interp, + CONST char *start, int numBytes, + Tcl_Parse *parsePtr, int append, + CONST84 char **termPtr); +#endif +#ifndef Tcl_ParseCommand_TCL_DECLARED +#define Tcl_ParseCommand_TCL_DECLARED +/* 361 */ +EXTERN int Tcl_ParseCommand(Tcl_Interp *interp, + CONST char *start, int numBytes, int nested, + Tcl_Parse *parsePtr); +#endif +#ifndef Tcl_ParseExpr_TCL_DECLARED +#define Tcl_ParseExpr_TCL_DECLARED +/* 362 */ +EXTERN int Tcl_ParseExpr(Tcl_Interp *interp, CONST char *start, + int numBytes, Tcl_Parse *parsePtr); +#endif +#ifndef Tcl_ParseQuotedString_TCL_DECLARED +#define Tcl_ParseQuotedString_TCL_DECLARED +/* 363 */ +EXTERN int Tcl_ParseQuotedString(Tcl_Interp *interp, + CONST char *start, int numBytes, + Tcl_Parse *parsePtr, int append, + CONST84 char **termPtr); +#endif +#ifndef Tcl_ParseVarName_TCL_DECLARED +#define Tcl_ParseVarName_TCL_DECLARED +/* 364 */ +EXTERN int Tcl_ParseVarName(Tcl_Interp *interp, + CONST char *start, int numBytes, + Tcl_Parse *parsePtr, int append); +#endif +#ifndef Tcl_GetCwd_TCL_DECLARED +#define Tcl_GetCwd_TCL_DECLARED +/* 365 */ +EXTERN char * Tcl_GetCwd(Tcl_Interp *interp, Tcl_DString *cwdPtr); +#endif +#ifndef Tcl_Chdir_TCL_DECLARED +#define Tcl_Chdir_TCL_DECLARED +/* 366 */ +EXTERN int Tcl_Chdir(CONST char *dirName); +#endif +#ifndef Tcl_Access_TCL_DECLARED +#define Tcl_Access_TCL_DECLARED +/* 367 */ +EXTERN int Tcl_Access(CONST char *path, int mode); +#endif +#ifndef Tcl_Stat_TCL_DECLARED +#define Tcl_Stat_TCL_DECLARED +/* 368 */ +EXTERN int Tcl_Stat(CONST char *path, struct stat *bufPtr); +#endif +#ifndef Tcl_UtfNcmp_TCL_DECLARED +#define Tcl_UtfNcmp_TCL_DECLARED +/* 369 */ +EXTERN int Tcl_UtfNcmp(CONST char *s1, CONST char *s2, + unsigned long n); +#endif +#ifndef Tcl_UtfNcasecmp_TCL_DECLARED +#define Tcl_UtfNcasecmp_TCL_DECLARED +/* 370 */ +EXTERN int Tcl_UtfNcasecmp(CONST char *s1, CONST char *s2, + unsigned long n); +#endif +#ifndef Tcl_StringCaseMatch_TCL_DECLARED +#define Tcl_StringCaseMatch_TCL_DECLARED +/* 371 */ +EXTERN int Tcl_StringCaseMatch(CONST char *str, + CONST char *pattern, int nocase); +#endif +#ifndef Tcl_UniCharIsControl_TCL_DECLARED +#define Tcl_UniCharIsControl_TCL_DECLARED +/* 372 */ +EXTERN int Tcl_UniCharIsControl(int ch); +#endif +#ifndef Tcl_UniCharIsGraph_TCL_DECLARED +#define Tcl_UniCharIsGraph_TCL_DECLARED +/* 373 */ +EXTERN int Tcl_UniCharIsGraph(int ch); +#endif +#ifndef Tcl_UniCharIsPrint_TCL_DECLARED +#define Tcl_UniCharIsPrint_TCL_DECLARED +/* 374 */ +EXTERN int Tcl_UniCharIsPrint(int ch); +#endif +#ifndef Tcl_UniCharIsPunct_TCL_DECLARED +#define Tcl_UniCharIsPunct_TCL_DECLARED +/* 375 */ +EXTERN int Tcl_UniCharIsPunct(int ch); +#endif +#ifndef Tcl_RegExpExecObj_TCL_DECLARED +#define Tcl_RegExpExecObj_TCL_DECLARED +/* 376 */ +EXTERN int Tcl_RegExpExecObj(Tcl_Interp *interp, + Tcl_RegExp regexp, Tcl_Obj *textObj, + int offset, int nmatches, int flags); +#endif +#ifndef Tcl_RegExpGetInfo_TCL_DECLARED +#define Tcl_RegExpGetInfo_TCL_DECLARED +/* 377 */ +EXTERN void Tcl_RegExpGetInfo(Tcl_RegExp regexp, + Tcl_RegExpInfo *infoPtr); +#endif +#ifndef Tcl_NewUnicodeObj_TCL_DECLARED +#define Tcl_NewUnicodeObj_TCL_DECLARED +/* 378 */ +EXTERN Tcl_Obj * Tcl_NewUnicodeObj(CONST Tcl_UniChar *unicode, + int numChars); +#endif +#ifndef Tcl_SetUnicodeObj_TCL_DECLARED +#define Tcl_SetUnicodeObj_TCL_DECLARED +/* 379 */ +EXTERN void Tcl_SetUnicodeObj(Tcl_Obj *objPtr, + CONST Tcl_UniChar *unicode, int numChars); +#endif +#ifndef Tcl_GetCharLength_TCL_DECLARED +#define Tcl_GetCharLength_TCL_DECLARED +/* 380 */ +EXTERN int Tcl_GetCharLength(Tcl_Obj *objPtr); +#endif +#ifndef Tcl_GetUniChar_TCL_DECLARED +#define Tcl_GetUniChar_TCL_DECLARED +/* 381 */ +EXTERN Tcl_UniChar Tcl_GetUniChar(Tcl_Obj *objPtr, int index); +#endif +#ifndef Tcl_GetUnicode_TCL_DECLARED +#define Tcl_GetUnicode_TCL_DECLARED +/* 382 */ +EXTERN Tcl_UniChar * Tcl_GetUnicode(Tcl_Obj *objPtr); +#endif +#ifndef Tcl_GetRange_TCL_DECLARED +#define Tcl_GetRange_TCL_DECLARED +/* 383 */ +EXTERN Tcl_Obj * Tcl_GetRange(Tcl_Obj *objPtr, int first, int last); +#endif +#ifndef Tcl_AppendUnicodeToObj_TCL_DECLARED +#define Tcl_AppendUnicodeToObj_TCL_DECLARED +/* 384 */ +EXTERN void Tcl_AppendUnicodeToObj(Tcl_Obj *objPtr, + CONST Tcl_UniChar *unicode, int length); +#endif +#ifndef Tcl_RegExpMatchObj_TCL_DECLARED +#define Tcl_RegExpMatchObj_TCL_DECLARED +/* 385 */ +EXTERN int Tcl_RegExpMatchObj(Tcl_Interp *interp, + Tcl_Obj *textObj, Tcl_Obj *patternObj); +#endif +#ifndef Tcl_SetNotifier_TCL_DECLARED +#define Tcl_SetNotifier_TCL_DECLARED +/* 386 */ +EXTERN void Tcl_SetNotifier(Tcl_NotifierProcs *notifierProcPtr); +#endif +#ifndef Tcl_GetAllocMutex_TCL_DECLARED +#define Tcl_GetAllocMutex_TCL_DECLARED +/* 387 */ +EXTERN Tcl_Mutex * Tcl_GetAllocMutex(void); +#endif +#ifndef Tcl_GetChannelNames_TCL_DECLARED +#define Tcl_GetChannelNames_TCL_DECLARED +/* 388 */ +EXTERN int Tcl_GetChannelNames(Tcl_Interp *interp); +#endif +#ifndef Tcl_GetChannelNamesEx_TCL_DECLARED +#define Tcl_GetChannelNamesEx_TCL_DECLARED +/* 389 */ +EXTERN int Tcl_GetChannelNamesEx(Tcl_Interp *interp, + CONST char *pattern); +#endif +#ifndef Tcl_ProcObjCmd_TCL_DECLARED +#define Tcl_ProcObjCmd_TCL_DECLARED +/* 390 */ +EXTERN int Tcl_ProcObjCmd(ClientData clientData, + Tcl_Interp *interp, int objc, + Tcl_Obj *CONST objv[]); +#endif +#ifndef Tcl_ConditionFinalize_TCL_DECLARED +#define Tcl_ConditionFinalize_TCL_DECLARED +/* 391 */ +EXTERN void Tcl_ConditionFinalize(Tcl_Condition *condPtr); +#endif +#ifndef Tcl_MutexFinalize_TCL_DECLARED +#define Tcl_MutexFinalize_TCL_DECLARED +/* 392 */ +EXTERN void Tcl_MutexFinalize(Tcl_Mutex *mutex); +#endif +#ifndef Tcl_CreateThread_TCL_DECLARED +#define Tcl_CreateThread_TCL_DECLARED +/* 393 */ +EXTERN int Tcl_CreateThread(Tcl_ThreadId *idPtr, + Tcl_ThreadCreateProc proc, + ClientData clientData, int stackSize, + int flags); +#endif +#ifndef Tcl_ReadRaw_TCL_DECLARED +#define Tcl_ReadRaw_TCL_DECLARED +/* 394 */ +EXTERN int Tcl_ReadRaw(Tcl_Channel chan, char *dst, + int bytesToRead); +#endif +#ifndef Tcl_WriteRaw_TCL_DECLARED +#define Tcl_WriteRaw_TCL_DECLARED +/* 395 */ +EXTERN int Tcl_WriteRaw(Tcl_Channel chan, CONST char *src, + int srcLen); +#endif +#ifndef Tcl_GetTopChannel_TCL_DECLARED +#define Tcl_GetTopChannel_TCL_DECLARED +/* 396 */ +EXTERN Tcl_Channel Tcl_GetTopChannel(Tcl_Channel chan); +#endif +#ifndef Tcl_ChannelBuffered_TCL_DECLARED +#define Tcl_ChannelBuffered_TCL_DECLARED +/* 397 */ +EXTERN int Tcl_ChannelBuffered(Tcl_Channel chan); +#endif +#ifndef Tcl_ChannelName_TCL_DECLARED +#define Tcl_ChannelName_TCL_DECLARED +/* 398 */ +EXTERN CONST84_RETURN char * Tcl_ChannelName( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelVersion_TCL_DECLARED +#define Tcl_ChannelVersion_TCL_DECLARED +/* 399 */ +EXTERN Tcl_ChannelTypeVersion Tcl_ChannelVersion( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelBlockModeProc_TCL_DECLARED +#define Tcl_ChannelBlockModeProc_TCL_DECLARED +/* 400 */ +EXTERN Tcl_DriverBlockModeProc * Tcl_ChannelBlockModeProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelCloseProc_TCL_DECLARED +#define Tcl_ChannelCloseProc_TCL_DECLARED +/* 401 */ +EXTERN Tcl_DriverCloseProc * Tcl_ChannelCloseProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelClose2Proc_TCL_DECLARED +#define Tcl_ChannelClose2Proc_TCL_DECLARED +/* 402 */ +EXTERN Tcl_DriverClose2Proc * Tcl_ChannelClose2Proc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelInputProc_TCL_DECLARED +#define Tcl_ChannelInputProc_TCL_DECLARED +/* 403 */ +EXTERN Tcl_DriverInputProc * Tcl_ChannelInputProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelOutputProc_TCL_DECLARED +#define Tcl_ChannelOutputProc_TCL_DECLARED +/* 404 */ +EXTERN Tcl_DriverOutputProc * Tcl_ChannelOutputProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelSeekProc_TCL_DECLARED +#define Tcl_ChannelSeekProc_TCL_DECLARED +/* 405 */ +EXTERN Tcl_DriverSeekProc * Tcl_ChannelSeekProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelSetOptionProc_TCL_DECLARED +#define Tcl_ChannelSetOptionProc_TCL_DECLARED +/* 406 */ +EXTERN Tcl_DriverSetOptionProc * Tcl_ChannelSetOptionProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelGetOptionProc_TCL_DECLARED +#define Tcl_ChannelGetOptionProc_TCL_DECLARED +/* 407 */ +EXTERN Tcl_DriverGetOptionProc * Tcl_ChannelGetOptionProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelWatchProc_TCL_DECLARED +#define Tcl_ChannelWatchProc_TCL_DECLARED +/* 408 */ +EXTERN Tcl_DriverWatchProc * Tcl_ChannelWatchProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelGetHandleProc_TCL_DECLARED +#define Tcl_ChannelGetHandleProc_TCL_DECLARED +/* 409 */ +EXTERN Tcl_DriverGetHandleProc * Tcl_ChannelGetHandleProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelFlushProc_TCL_DECLARED +#define Tcl_ChannelFlushProc_TCL_DECLARED +/* 410 */ +EXTERN Tcl_DriverFlushProc * Tcl_ChannelFlushProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_ChannelHandlerProc_TCL_DECLARED +#define Tcl_ChannelHandlerProc_TCL_DECLARED +/* 411 */ +EXTERN Tcl_DriverHandlerProc * Tcl_ChannelHandlerProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_JoinThread_TCL_DECLARED +#define Tcl_JoinThread_TCL_DECLARED +/* 412 */ +EXTERN int Tcl_JoinThread(Tcl_ThreadId threadId, int *result); +#endif +#ifndef Tcl_IsChannelShared_TCL_DECLARED +#define Tcl_IsChannelShared_TCL_DECLARED +/* 413 */ +EXTERN int Tcl_IsChannelShared(Tcl_Channel channel); +#endif +#ifndef Tcl_IsChannelRegistered_TCL_DECLARED +#define Tcl_IsChannelRegistered_TCL_DECLARED +/* 414 */ +EXTERN int Tcl_IsChannelRegistered(Tcl_Interp *interp, + Tcl_Channel channel); +#endif +#ifndef Tcl_CutChannel_TCL_DECLARED +#define Tcl_CutChannel_TCL_DECLARED +/* 415 */ +EXTERN void Tcl_CutChannel(Tcl_Channel channel); +#endif +#ifndef Tcl_SpliceChannel_TCL_DECLARED +#define Tcl_SpliceChannel_TCL_DECLARED +/* 416 */ +EXTERN void Tcl_SpliceChannel(Tcl_Channel channel); +#endif +#ifndef Tcl_ClearChannelHandlers_TCL_DECLARED +#define Tcl_ClearChannelHandlers_TCL_DECLARED +/* 417 */ +EXTERN void Tcl_ClearChannelHandlers(Tcl_Channel channel); +#endif +#ifndef Tcl_IsChannelExisting_TCL_DECLARED +#define Tcl_IsChannelExisting_TCL_DECLARED +/* 418 */ +EXTERN int Tcl_IsChannelExisting(CONST char *channelName); +#endif +#ifndef Tcl_UniCharNcasecmp_TCL_DECLARED +#define Tcl_UniCharNcasecmp_TCL_DECLARED +/* 419 */ +EXTERN int Tcl_UniCharNcasecmp(CONST Tcl_UniChar *ucs, + CONST Tcl_UniChar *uct, + unsigned long numChars); +#endif +#ifndef Tcl_UniCharCaseMatch_TCL_DECLARED +#define Tcl_UniCharCaseMatch_TCL_DECLARED +/* 420 */ +EXTERN int Tcl_UniCharCaseMatch(CONST Tcl_UniChar *uniStr, + CONST Tcl_UniChar *uniPattern, int nocase); +#endif +#ifndef Tcl_FindHashEntry_TCL_DECLARED +#define Tcl_FindHashEntry_TCL_DECLARED +/* 421 */ +EXTERN Tcl_HashEntry * Tcl_FindHashEntry(Tcl_HashTable *tablePtr, + CONST char *key); +#endif +#ifndef Tcl_CreateHashEntry_TCL_DECLARED +#define Tcl_CreateHashEntry_TCL_DECLARED +/* 422 */ +EXTERN Tcl_HashEntry * Tcl_CreateHashEntry(Tcl_HashTable *tablePtr, + CONST char *key, int *newPtr); +#endif +#ifndef Tcl_InitCustomHashTable_TCL_DECLARED +#define Tcl_InitCustomHashTable_TCL_DECLARED +/* 423 */ +EXTERN void Tcl_InitCustomHashTable(Tcl_HashTable *tablePtr, + int keyType, Tcl_HashKeyType *typePtr); +#endif +#ifndef Tcl_InitObjHashTable_TCL_DECLARED +#define Tcl_InitObjHashTable_TCL_DECLARED +/* 424 */ +EXTERN void Tcl_InitObjHashTable(Tcl_HashTable *tablePtr); +#endif +#ifndef Tcl_CommandTraceInfo_TCL_DECLARED +#define Tcl_CommandTraceInfo_TCL_DECLARED +/* 425 */ +EXTERN ClientData Tcl_CommandTraceInfo(Tcl_Interp *interp, + CONST char *varName, int flags, + Tcl_CommandTraceProc *procPtr, + ClientData prevClientData); +#endif +#ifndef Tcl_TraceCommand_TCL_DECLARED +#define Tcl_TraceCommand_TCL_DECLARED +/* 426 */ +EXTERN int Tcl_TraceCommand(Tcl_Interp *interp, + CONST char *varName, int flags, + Tcl_CommandTraceProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_UntraceCommand_TCL_DECLARED +#define Tcl_UntraceCommand_TCL_DECLARED +/* 427 */ +EXTERN void Tcl_UntraceCommand(Tcl_Interp *interp, + CONST char *varName, int flags, + Tcl_CommandTraceProc *proc, + ClientData clientData); +#endif +#ifndef Tcl_AttemptAlloc_TCL_DECLARED +#define Tcl_AttemptAlloc_TCL_DECLARED +/* 428 */ +EXTERN char * Tcl_AttemptAlloc(unsigned int size); +#endif +#ifndef Tcl_AttemptDbCkalloc_TCL_DECLARED +#define Tcl_AttemptDbCkalloc_TCL_DECLARED +/* 429 */ +EXTERN char * Tcl_AttemptDbCkalloc(unsigned int size, + CONST char *file, int line); +#endif +#ifndef Tcl_AttemptRealloc_TCL_DECLARED +#define Tcl_AttemptRealloc_TCL_DECLARED +/* 430 */ +EXTERN char * Tcl_AttemptRealloc(char *ptr, unsigned int size); +#endif +#ifndef Tcl_AttemptDbCkrealloc_TCL_DECLARED +#define Tcl_AttemptDbCkrealloc_TCL_DECLARED +/* 431 */ +EXTERN char * Tcl_AttemptDbCkrealloc(char *ptr, unsigned int size, + CONST char *file, int line); +#endif +#ifndef Tcl_AttemptSetObjLength_TCL_DECLARED +#define Tcl_AttemptSetObjLength_TCL_DECLARED +/* 432 */ +EXTERN int Tcl_AttemptSetObjLength(Tcl_Obj *objPtr, int length); +#endif +#ifndef Tcl_GetChannelThread_TCL_DECLARED +#define Tcl_GetChannelThread_TCL_DECLARED +/* 433 */ +EXTERN Tcl_ThreadId Tcl_GetChannelThread(Tcl_Channel channel); +#endif +#ifndef Tcl_GetUnicodeFromObj_TCL_DECLARED +#define Tcl_GetUnicodeFromObj_TCL_DECLARED +/* 434 */ +EXTERN Tcl_UniChar * Tcl_GetUnicodeFromObj(Tcl_Obj *objPtr, + int *lengthPtr); +#endif +#ifndef Tcl_GetMathFuncInfo_TCL_DECLARED +#define Tcl_GetMathFuncInfo_TCL_DECLARED +/* 435 */ +EXTERN int Tcl_GetMathFuncInfo(Tcl_Interp *interp, + CONST char *name, int *numArgsPtr, + Tcl_ValueType **argTypesPtr, + Tcl_MathProc **procPtr, + ClientData *clientDataPtr); +#endif +#ifndef Tcl_ListMathFuncs_TCL_DECLARED +#define Tcl_ListMathFuncs_TCL_DECLARED +/* 436 */ +EXTERN Tcl_Obj * Tcl_ListMathFuncs(Tcl_Interp *interp, + CONST char *pattern); +#endif +#ifndef Tcl_SubstObj_TCL_DECLARED +#define Tcl_SubstObj_TCL_DECLARED +/* 437 */ +EXTERN Tcl_Obj * Tcl_SubstObj(Tcl_Interp *interp, Tcl_Obj *objPtr, + int flags); +#endif +#ifndef Tcl_DetachChannel_TCL_DECLARED +#define Tcl_DetachChannel_TCL_DECLARED +/* 438 */ +EXTERN int Tcl_DetachChannel(Tcl_Interp *interp, + Tcl_Channel channel); +#endif +#ifndef Tcl_IsStandardChannel_TCL_DECLARED +#define Tcl_IsStandardChannel_TCL_DECLARED +/* 439 */ +EXTERN int Tcl_IsStandardChannel(Tcl_Channel channel); +#endif +#ifndef Tcl_FSCopyFile_TCL_DECLARED +#define Tcl_FSCopyFile_TCL_DECLARED +/* 440 */ +EXTERN int Tcl_FSCopyFile(Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr); +#endif +#ifndef Tcl_FSCopyDirectory_TCL_DECLARED +#define Tcl_FSCopyDirectory_TCL_DECLARED +/* 441 */ +EXTERN int Tcl_FSCopyDirectory(Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr, Tcl_Obj **errorPtr); +#endif +#ifndef Tcl_FSCreateDirectory_TCL_DECLARED +#define Tcl_FSCreateDirectory_TCL_DECLARED +/* 442 */ +EXTERN int Tcl_FSCreateDirectory(Tcl_Obj *pathPtr); +#endif +#ifndef Tcl_FSDeleteFile_TCL_DECLARED +#define Tcl_FSDeleteFile_TCL_DECLARED +/* 443 */ +EXTERN int Tcl_FSDeleteFile(Tcl_Obj *pathPtr); +#endif +#ifndef Tcl_FSLoadFile_TCL_DECLARED +#define Tcl_FSLoadFile_TCL_DECLARED +/* 444 */ +EXTERN int Tcl_FSLoadFile(Tcl_Interp *interp, Tcl_Obj *pathPtr, + CONST char *sym1, CONST char *sym2, + Tcl_PackageInitProc **proc1Ptr, + Tcl_PackageInitProc **proc2Ptr, + Tcl_LoadHandle *handlePtr, + Tcl_FSUnloadFileProc **unloadProcPtr); +#endif +#ifndef Tcl_FSMatchInDirectory_TCL_DECLARED +#define Tcl_FSMatchInDirectory_TCL_DECLARED +/* 445 */ +EXTERN int Tcl_FSMatchInDirectory(Tcl_Interp *interp, + Tcl_Obj *result, Tcl_Obj *pathPtr, + CONST char *pattern, Tcl_GlobTypeData *types); +#endif +#ifndef Tcl_FSLink_TCL_DECLARED +#define Tcl_FSLink_TCL_DECLARED +/* 446 */ +EXTERN Tcl_Obj * Tcl_FSLink(Tcl_Obj *pathPtr, Tcl_Obj *toPtr, + int linkAction); +#endif +#ifndef Tcl_FSRemoveDirectory_TCL_DECLARED +#define Tcl_FSRemoveDirectory_TCL_DECLARED +/* 447 */ +EXTERN int Tcl_FSRemoveDirectory(Tcl_Obj *pathPtr, + int recursive, Tcl_Obj **errorPtr); +#endif +#ifndef Tcl_FSRenameFile_TCL_DECLARED +#define Tcl_FSRenameFile_TCL_DECLARED +/* 448 */ +EXTERN int Tcl_FSRenameFile(Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr); +#endif +#ifndef Tcl_FSLstat_TCL_DECLARED +#define Tcl_FSLstat_TCL_DECLARED +/* 449 */ +EXTERN int Tcl_FSLstat(Tcl_Obj *pathPtr, Tcl_StatBuf *buf); +#endif +#ifndef Tcl_FSUtime_TCL_DECLARED +#define Tcl_FSUtime_TCL_DECLARED +/* 450 */ +EXTERN int Tcl_FSUtime(Tcl_Obj *pathPtr, struct utimbuf *tval); +#endif +#ifndef Tcl_FSFileAttrsGet_TCL_DECLARED +#define Tcl_FSFileAttrsGet_TCL_DECLARED +/* 451 */ +EXTERN int Tcl_FSFileAttrsGet(Tcl_Interp *interp, int index, + Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef); +#endif +#ifndef Tcl_FSFileAttrsSet_TCL_DECLARED +#define Tcl_FSFileAttrsSet_TCL_DECLARED +/* 452 */ +EXTERN int Tcl_FSFileAttrsSet(Tcl_Interp *interp, int index, + Tcl_Obj *pathPtr, Tcl_Obj *objPtr); +#endif +#ifndef Tcl_FSFileAttrStrings_TCL_DECLARED +#define Tcl_FSFileAttrStrings_TCL_DECLARED +/* 453 */ +EXTERN CONST char ** Tcl_FSFileAttrStrings(Tcl_Obj *pathPtr, + Tcl_Obj **objPtrRef); +#endif +#ifndef Tcl_FSStat_TCL_DECLARED +#define Tcl_FSStat_TCL_DECLARED +/* 454 */ +EXTERN int Tcl_FSStat(Tcl_Obj *pathPtr, Tcl_StatBuf *buf); +#endif +#ifndef Tcl_FSAccess_TCL_DECLARED +#define Tcl_FSAccess_TCL_DECLARED +/* 455 */ +EXTERN int Tcl_FSAccess(Tcl_Obj *pathPtr, int mode); +#endif +#ifndef Tcl_FSOpenFileChannel_TCL_DECLARED +#define Tcl_FSOpenFileChannel_TCL_DECLARED +/* 456 */ +EXTERN Tcl_Channel Tcl_FSOpenFileChannel(Tcl_Interp *interp, + Tcl_Obj *pathPtr, CONST char *modeString, + int permissions); +#endif +#ifndef Tcl_FSGetCwd_TCL_DECLARED +#define Tcl_FSGetCwd_TCL_DECLARED +/* 457 */ +EXTERN Tcl_Obj * Tcl_FSGetCwd(Tcl_Interp *interp); +#endif +#ifndef Tcl_FSChdir_TCL_DECLARED +#define Tcl_FSChdir_TCL_DECLARED +/* 458 */ +EXTERN int Tcl_FSChdir(Tcl_Obj *pathPtr); +#endif +#ifndef Tcl_FSConvertToPathType_TCL_DECLARED +#define Tcl_FSConvertToPathType_TCL_DECLARED +/* 459 */ +EXTERN int Tcl_FSConvertToPathType(Tcl_Interp *interp, + Tcl_Obj *pathPtr); +#endif +#ifndef Tcl_FSJoinPath_TCL_DECLARED +#define Tcl_FSJoinPath_TCL_DECLARED +/* 460 */ +EXTERN Tcl_Obj * Tcl_FSJoinPath(Tcl_Obj *listObj, int elements); +#endif +#ifndef Tcl_FSSplitPath_TCL_DECLARED +#define Tcl_FSSplitPath_TCL_DECLARED +/* 461 */ +EXTERN Tcl_Obj * Tcl_FSSplitPath(Tcl_Obj *pathPtr, int *lenPtr); +#endif +#ifndef Tcl_FSEqualPaths_TCL_DECLARED +#define Tcl_FSEqualPaths_TCL_DECLARED +/* 462 */ +EXTERN int Tcl_FSEqualPaths(Tcl_Obj *firstPtr, + Tcl_Obj *secondPtr); +#endif +#ifndef Tcl_FSGetNormalizedPath_TCL_DECLARED +#define Tcl_FSGetNormalizedPath_TCL_DECLARED +/* 463 */ +EXTERN Tcl_Obj * Tcl_FSGetNormalizedPath(Tcl_Interp *interp, + Tcl_Obj *pathPtr); +#endif +#ifndef Tcl_FSJoinToPath_TCL_DECLARED +#define Tcl_FSJoinToPath_TCL_DECLARED +/* 464 */ +EXTERN Tcl_Obj * Tcl_FSJoinToPath(Tcl_Obj *pathPtr, int objc, + Tcl_Obj *CONST objv[]); +#endif +#ifndef Tcl_FSGetInternalRep_TCL_DECLARED +#define Tcl_FSGetInternalRep_TCL_DECLARED +/* 465 */ +EXTERN ClientData Tcl_FSGetInternalRep(Tcl_Obj *pathPtr, + Tcl_Filesystem *fsPtr); +#endif +#ifndef Tcl_FSGetTranslatedPath_TCL_DECLARED +#define Tcl_FSGetTranslatedPath_TCL_DECLARED +/* 466 */ +EXTERN Tcl_Obj * Tcl_FSGetTranslatedPath(Tcl_Interp *interp, + Tcl_Obj *pathPtr); +#endif +#ifndef Tcl_FSEvalFile_TCL_DECLARED +#define Tcl_FSEvalFile_TCL_DECLARED +/* 467 */ +EXTERN int Tcl_FSEvalFile(Tcl_Interp *interp, Tcl_Obj *fileName); +#endif +#ifndef Tcl_FSNewNativePath_TCL_DECLARED +#define Tcl_FSNewNativePath_TCL_DECLARED +/* 468 */ +EXTERN Tcl_Obj * Tcl_FSNewNativePath(Tcl_Filesystem *fromFilesystem, + ClientData clientData); +#endif +#ifndef Tcl_FSGetNativePath_TCL_DECLARED +#define Tcl_FSGetNativePath_TCL_DECLARED +/* 469 */ +EXTERN CONST char * Tcl_FSGetNativePath(Tcl_Obj *pathPtr); +#endif +#ifndef Tcl_FSFileSystemInfo_TCL_DECLARED +#define Tcl_FSFileSystemInfo_TCL_DECLARED +/* 470 */ +EXTERN Tcl_Obj * Tcl_FSFileSystemInfo(Tcl_Obj *pathPtr); +#endif +#ifndef Tcl_FSPathSeparator_TCL_DECLARED +#define Tcl_FSPathSeparator_TCL_DECLARED +/* 471 */ +EXTERN Tcl_Obj * Tcl_FSPathSeparator(Tcl_Obj *pathPtr); +#endif +#ifndef Tcl_FSListVolumes_TCL_DECLARED +#define Tcl_FSListVolumes_TCL_DECLARED +/* 472 */ +EXTERN Tcl_Obj * Tcl_FSListVolumes(void); +#endif +#ifndef Tcl_FSRegister_TCL_DECLARED +#define Tcl_FSRegister_TCL_DECLARED +/* 473 */ +EXTERN int Tcl_FSRegister(ClientData clientData, + Tcl_Filesystem *fsPtr); +#endif +#ifndef Tcl_FSUnregister_TCL_DECLARED +#define Tcl_FSUnregister_TCL_DECLARED +/* 474 */ +EXTERN int Tcl_FSUnregister(Tcl_Filesystem *fsPtr); +#endif +#ifndef Tcl_FSData_TCL_DECLARED +#define Tcl_FSData_TCL_DECLARED +/* 475 */ +EXTERN ClientData Tcl_FSData(Tcl_Filesystem *fsPtr); +#endif +#ifndef Tcl_FSGetTranslatedStringPath_TCL_DECLARED +#define Tcl_FSGetTranslatedStringPath_TCL_DECLARED +/* 476 */ +EXTERN CONST char * Tcl_FSGetTranslatedStringPath(Tcl_Interp *interp, + Tcl_Obj *pathPtr); +#endif +#ifndef Tcl_FSGetFileSystemForPath_TCL_DECLARED +#define Tcl_FSGetFileSystemForPath_TCL_DECLARED +/* 477 */ +EXTERN Tcl_Filesystem * Tcl_FSGetFileSystemForPath(Tcl_Obj *pathPtr); +#endif +#ifndef Tcl_FSGetPathType_TCL_DECLARED +#define Tcl_FSGetPathType_TCL_DECLARED +/* 478 */ +EXTERN Tcl_PathType Tcl_FSGetPathType(Tcl_Obj *pathPtr); +#endif +#ifndef Tcl_OutputBuffered_TCL_DECLARED +#define Tcl_OutputBuffered_TCL_DECLARED +/* 479 */ +EXTERN int Tcl_OutputBuffered(Tcl_Channel chan); +#endif +#ifndef Tcl_FSMountsChanged_TCL_DECLARED +#define Tcl_FSMountsChanged_TCL_DECLARED +/* 480 */ +EXTERN void Tcl_FSMountsChanged(Tcl_Filesystem *fsPtr); +#endif +#ifndef Tcl_EvalTokensStandard_TCL_DECLARED +#define Tcl_EvalTokensStandard_TCL_DECLARED +/* 481 */ +EXTERN int Tcl_EvalTokensStandard(Tcl_Interp *interp, + Tcl_Token *tokenPtr, int count); +#endif +#ifndef Tcl_GetTime_TCL_DECLARED +#define Tcl_GetTime_TCL_DECLARED +/* 482 */ +EXTERN void Tcl_GetTime(Tcl_Time *timeBuf); +#endif +#ifndef Tcl_CreateObjTrace_TCL_DECLARED +#define Tcl_CreateObjTrace_TCL_DECLARED +/* 483 */ +EXTERN Tcl_Trace Tcl_CreateObjTrace(Tcl_Interp *interp, int level, + int flags, Tcl_CmdObjTraceProc *objProc, + ClientData clientData, + Tcl_CmdObjTraceDeleteProc *delProc); +#endif +#ifndef Tcl_GetCommandInfoFromToken_TCL_DECLARED +#define Tcl_GetCommandInfoFromToken_TCL_DECLARED +/* 484 */ +EXTERN int Tcl_GetCommandInfoFromToken(Tcl_Command token, + Tcl_CmdInfo *infoPtr); +#endif +#ifndef Tcl_SetCommandInfoFromToken_TCL_DECLARED +#define Tcl_SetCommandInfoFromToken_TCL_DECLARED +/* 485 */ +EXTERN int Tcl_SetCommandInfoFromToken(Tcl_Command token, + CONST Tcl_CmdInfo *infoPtr); +#endif +#ifndef Tcl_DbNewWideIntObj_TCL_DECLARED +#define Tcl_DbNewWideIntObj_TCL_DECLARED +/* 486 */ +EXTERN Tcl_Obj * Tcl_DbNewWideIntObj(Tcl_WideInt wideValue, + CONST char *file, int line); +#endif +#ifndef Tcl_GetWideIntFromObj_TCL_DECLARED +#define Tcl_GetWideIntFromObj_TCL_DECLARED +/* 487 */ +EXTERN int Tcl_GetWideIntFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, Tcl_WideInt *widePtr); +#endif +#ifndef Tcl_NewWideIntObj_TCL_DECLARED +#define Tcl_NewWideIntObj_TCL_DECLARED +/* 488 */ +EXTERN Tcl_Obj * Tcl_NewWideIntObj(Tcl_WideInt wideValue); +#endif +#ifndef Tcl_SetWideIntObj_TCL_DECLARED +#define Tcl_SetWideIntObj_TCL_DECLARED +/* 489 */ +EXTERN void Tcl_SetWideIntObj(Tcl_Obj *objPtr, + Tcl_WideInt wideValue); +#endif +#ifndef Tcl_AllocStatBuf_TCL_DECLARED +#define Tcl_AllocStatBuf_TCL_DECLARED +/* 490 */ +EXTERN Tcl_StatBuf * Tcl_AllocStatBuf(void); +#endif +#ifndef Tcl_Seek_TCL_DECLARED +#define Tcl_Seek_TCL_DECLARED +/* 491 */ +EXTERN Tcl_WideInt Tcl_Seek(Tcl_Channel chan, Tcl_WideInt offset, + int mode); +#endif +#ifndef Tcl_Tell_TCL_DECLARED +#define Tcl_Tell_TCL_DECLARED +/* 492 */ +EXTERN Tcl_WideInt Tcl_Tell(Tcl_Channel chan); +#endif +#ifndef Tcl_ChannelWideSeekProc_TCL_DECLARED +#define Tcl_ChannelWideSeekProc_TCL_DECLARED +/* 493 */ +EXTERN Tcl_DriverWideSeekProc * Tcl_ChannelWideSeekProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_DictObjPut_TCL_DECLARED +#define Tcl_DictObjPut_TCL_DECLARED +/* 494 */ +EXTERN int Tcl_DictObjPut(Tcl_Interp *interp, Tcl_Obj *dictPtr, + Tcl_Obj *keyPtr, Tcl_Obj *valuePtr); +#endif +#ifndef Tcl_DictObjGet_TCL_DECLARED +#define Tcl_DictObjGet_TCL_DECLARED +/* 495 */ +EXTERN int Tcl_DictObjGet(Tcl_Interp *interp, Tcl_Obj *dictPtr, + Tcl_Obj *keyPtr, Tcl_Obj **valuePtrPtr); +#endif +#ifndef Tcl_DictObjRemove_TCL_DECLARED +#define Tcl_DictObjRemove_TCL_DECLARED +/* 496 */ +EXTERN int Tcl_DictObjRemove(Tcl_Interp *interp, + Tcl_Obj *dictPtr, Tcl_Obj *keyPtr); +#endif +#ifndef Tcl_DictObjSize_TCL_DECLARED +#define Tcl_DictObjSize_TCL_DECLARED +/* 497 */ +EXTERN int Tcl_DictObjSize(Tcl_Interp *interp, Tcl_Obj *dictPtr, + int *sizePtr); +#endif +#ifndef Tcl_DictObjFirst_TCL_DECLARED +#define Tcl_DictObjFirst_TCL_DECLARED +/* 498 */ +EXTERN int Tcl_DictObjFirst(Tcl_Interp *interp, + Tcl_Obj *dictPtr, Tcl_DictSearch *searchPtr, + Tcl_Obj **keyPtrPtr, Tcl_Obj **valuePtrPtr, + int *donePtr); +#endif +#ifndef Tcl_DictObjNext_TCL_DECLARED +#define Tcl_DictObjNext_TCL_DECLARED +/* 499 */ +EXTERN void Tcl_DictObjNext(Tcl_DictSearch *searchPtr, + Tcl_Obj **keyPtrPtr, Tcl_Obj **valuePtrPtr, + int *donePtr); +#endif +#ifndef Tcl_DictObjDone_TCL_DECLARED +#define Tcl_DictObjDone_TCL_DECLARED +/* 500 */ +EXTERN void Tcl_DictObjDone(Tcl_DictSearch *searchPtr); +#endif +#ifndef Tcl_DictObjPutKeyList_TCL_DECLARED +#define Tcl_DictObjPutKeyList_TCL_DECLARED +/* 501 */ +EXTERN int Tcl_DictObjPutKeyList(Tcl_Interp *interp, + Tcl_Obj *dictPtr, int keyc, + Tcl_Obj *CONST *keyv, Tcl_Obj *valuePtr); +#endif +#ifndef Tcl_DictObjRemoveKeyList_TCL_DECLARED +#define Tcl_DictObjRemoveKeyList_TCL_DECLARED +/* 502 */ +EXTERN int Tcl_DictObjRemoveKeyList(Tcl_Interp *interp, + Tcl_Obj *dictPtr, int keyc, + Tcl_Obj *CONST *keyv); +#endif +#ifndef Tcl_NewDictObj_TCL_DECLARED +#define Tcl_NewDictObj_TCL_DECLARED +/* 503 */ +EXTERN Tcl_Obj * Tcl_NewDictObj(void); +#endif +#ifndef Tcl_DbNewDictObj_TCL_DECLARED +#define Tcl_DbNewDictObj_TCL_DECLARED +/* 504 */ +EXTERN Tcl_Obj * Tcl_DbNewDictObj(CONST char *file, int line); +#endif +#ifndef Tcl_RegisterConfig_TCL_DECLARED +#define Tcl_RegisterConfig_TCL_DECLARED +/* 505 */ +EXTERN void Tcl_RegisterConfig(Tcl_Interp *interp, + CONST char *pkgName, + Tcl_Config *configuration, + CONST char *valEncoding); +#endif +#ifndef Tcl_CreateNamespace_TCL_DECLARED +#define Tcl_CreateNamespace_TCL_DECLARED +/* 506 */ +EXTERN Tcl_Namespace * Tcl_CreateNamespace(Tcl_Interp *interp, + CONST char *name, ClientData clientData, + Tcl_NamespaceDeleteProc *deleteProc); +#endif +#ifndef Tcl_DeleteNamespace_TCL_DECLARED +#define Tcl_DeleteNamespace_TCL_DECLARED +/* 507 */ +EXTERN void Tcl_DeleteNamespace(Tcl_Namespace *nsPtr); +#endif +#ifndef Tcl_AppendExportList_TCL_DECLARED +#define Tcl_AppendExportList_TCL_DECLARED +/* 508 */ +EXTERN int Tcl_AppendExportList(Tcl_Interp *interp, + Tcl_Namespace *nsPtr, Tcl_Obj *objPtr); +#endif +#ifndef Tcl_Export_TCL_DECLARED +#define Tcl_Export_TCL_DECLARED +/* 509 */ +EXTERN int Tcl_Export(Tcl_Interp *interp, Tcl_Namespace *nsPtr, + CONST char *pattern, int resetListFirst); +#endif +#ifndef Tcl_Import_TCL_DECLARED +#define Tcl_Import_TCL_DECLARED +/* 510 */ +EXTERN int Tcl_Import(Tcl_Interp *interp, Tcl_Namespace *nsPtr, + CONST char *pattern, int allowOverwrite); +#endif +#ifndef Tcl_ForgetImport_TCL_DECLARED +#define Tcl_ForgetImport_TCL_DECLARED +/* 511 */ +EXTERN int Tcl_ForgetImport(Tcl_Interp *interp, + Tcl_Namespace *nsPtr, CONST char *pattern); +#endif +#ifndef Tcl_GetCurrentNamespace_TCL_DECLARED +#define Tcl_GetCurrentNamespace_TCL_DECLARED +/* 512 */ +EXTERN Tcl_Namespace * Tcl_GetCurrentNamespace(Tcl_Interp *interp); +#endif +#ifndef Tcl_GetGlobalNamespace_TCL_DECLARED +#define Tcl_GetGlobalNamespace_TCL_DECLARED +/* 513 */ +EXTERN Tcl_Namespace * Tcl_GetGlobalNamespace(Tcl_Interp *interp); +#endif +#ifndef Tcl_FindNamespace_TCL_DECLARED +#define Tcl_FindNamespace_TCL_DECLARED +/* 514 */ +EXTERN Tcl_Namespace * Tcl_FindNamespace(Tcl_Interp *interp, + CONST char *name, + Tcl_Namespace *contextNsPtr, int flags); +#endif +#ifndef Tcl_FindCommand_TCL_DECLARED +#define Tcl_FindCommand_TCL_DECLARED +/* 515 */ +EXTERN Tcl_Command Tcl_FindCommand(Tcl_Interp *interp, CONST char *name, + Tcl_Namespace *contextNsPtr, int flags); +#endif +#ifndef Tcl_GetCommandFromObj_TCL_DECLARED +#define Tcl_GetCommandFromObj_TCL_DECLARED +/* 516 */ +EXTERN Tcl_Command Tcl_GetCommandFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr); +#endif +#ifndef Tcl_GetCommandFullName_TCL_DECLARED +#define Tcl_GetCommandFullName_TCL_DECLARED +/* 517 */ +EXTERN void Tcl_GetCommandFullName(Tcl_Interp *interp, + Tcl_Command command, Tcl_Obj *objPtr); +#endif +#ifndef Tcl_FSEvalFileEx_TCL_DECLARED +#define Tcl_FSEvalFileEx_TCL_DECLARED +/* 518 */ +EXTERN int Tcl_FSEvalFileEx(Tcl_Interp *interp, + Tcl_Obj *fileName, CONST char *encodingName); +#endif +#ifndef Tcl_SetExitProc_TCL_DECLARED +#define Tcl_SetExitProc_TCL_DECLARED +/* 519 */ +EXTERN Tcl_ExitProc * Tcl_SetExitProc(Tcl_ExitProc *proc); +#endif +#ifndef Tcl_LimitAddHandler_TCL_DECLARED +#define Tcl_LimitAddHandler_TCL_DECLARED +/* 520 */ +EXTERN void Tcl_LimitAddHandler(Tcl_Interp *interp, int type, + Tcl_LimitHandlerProc *handlerProc, + ClientData clientData, + Tcl_LimitHandlerDeleteProc *deleteProc); +#endif +#ifndef Tcl_LimitRemoveHandler_TCL_DECLARED +#define Tcl_LimitRemoveHandler_TCL_DECLARED +/* 521 */ +EXTERN void Tcl_LimitRemoveHandler(Tcl_Interp *interp, int type, + Tcl_LimitHandlerProc *handlerProc, + ClientData clientData); +#endif +#ifndef Tcl_LimitReady_TCL_DECLARED +#define Tcl_LimitReady_TCL_DECLARED +/* 522 */ +EXTERN int Tcl_LimitReady(Tcl_Interp *interp); +#endif +#ifndef Tcl_LimitCheck_TCL_DECLARED +#define Tcl_LimitCheck_TCL_DECLARED +/* 523 */ +EXTERN int Tcl_LimitCheck(Tcl_Interp *interp); +#endif +#ifndef Tcl_LimitExceeded_TCL_DECLARED +#define Tcl_LimitExceeded_TCL_DECLARED +/* 524 */ +EXTERN int Tcl_LimitExceeded(Tcl_Interp *interp); +#endif +#ifndef Tcl_LimitSetCommands_TCL_DECLARED +#define Tcl_LimitSetCommands_TCL_DECLARED +/* 525 */ +EXTERN void Tcl_LimitSetCommands(Tcl_Interp *interp, + int commandLimit); +#endif +#ifndef Tcl_LimitSetTime_TCL_DECLARED +#define Tcl_LimitSetTime_TCL_DECLARED +/* 526 */ +EXTERN void Tcl_LimitSetTime(Tcl_Interp *interp, + Tcl_Time *timeLimitPtr); +#endif +#ifndef Tcl_LimitSetGranularity_TCL_DECLARED +#define Tcl_LimitSetGranularity_TCL_DECLARED +/* 527 */ +EXTERN void Tcl_LimitSetGranularity(Tcl_Interp *interp, int type, + int granularity); +#endif +#ifndef Tcl_LimitTypeEnabled_TCL_DECLARED +#define Tcl_LimitTypeEnabled_TCL_DECLARED +/* 528 */ +EXTERN int Tcl_LimitTypeEnabled(Tcl_Interp *interp, int type); +#endif +#ifndef Tcl_LimitTypeExceeded_TCL_DECLARED +#define Tcl_LimitTypeExceeded_TCL_DECLARED +/* 529 */ +EXTERN int Tcl_LimitTypeExceeded(Tcl_Interp *interp, int type); +#endif +#ifndef Tcl_LimitTypeSet_TCL_DECLARED +#define Tcl_LimitTypeSet_TCL_DECLARED +/* 530 */ +EXTERN void Tcl_LimitTypeSet(Tcl_Interp *interp, int type); +#endif +#ifndef Tcl_LimitTypeReset_TCL_DECLARED +#define Tcl_LimitTypeReset_TCL_DECLARED +/* 531 */ +EXTERN void Tcl_LimitTypeReset(Tcl_Interp *interp, int type); +#endif +#ifndef Tcl_LimitGetCommands_TCL_DECLARED +#define Tcl_LimitGetCommands_TCL_DECLARED +/* 532 */ +EXTERN int Tcl_LimitGetCommands(Tcl_Interp *interp); +#endif +#ifndef Tcl_LimitGetTime_TCL_DECLARED +#define Tcl_LimitGetTime_TCL_DECLARED +/* 533 */ +EXTERN void Tcl_LimitGetTime(Tcl_Interp *interp, + Tcl_Time *timeLimitPtr); +#endif +#ifndef Tcl_LimitGetGranularity_TCL_DECLARED +#define Tcl_LimitGetGranularity_TCL_DECLARED +/* 534 */ +EXTERN int Tcl_LimitGetGranularity(Tcl_Interp *interp, int type); +#endif +#ifndef Tcl_SaveInterpState_TCL_DECLARED +#define Tcl_SaveInterpState_TCL_DECLARED +/* 535 */ +EXTERN Tcl_InterpState Tcl_SaveInterpState(Tcl_Interp *interp, int status); +#endif +#ifndef Tcl_RestoreInterpState_TCL_DECLARED +#define Tcl_RestoreInterpState_TCL_DECLARED +/* 536 */ +EXTERN int Tcl_RestoreInterpState(Tcl_Interp *interp, + Tcl_InterpState state); +#endif +#ifndef Tcl_DiscardInterpState_TCL_DECLARED +#define Tcl_DiscardInterpState_TCL_DECLARED +/* 537 */ +EXTERN void Tcl_DiscardInterpState(Tcl_InterpState state); +#endif +#ifndef Tcl_SetReturnOptions_TCL_DECLARED +#define Tcl_SetReturnOptions_TCL_DECLARED +/* 538 */ +EXTERN int Tcl_SetReturnOptions(Tcl_Interp *interp, + Tcl_Obj *options); +#endif +#ifndef Tcl_GetReturnOptions_TCL_DECLARED +#define Tcl_GetReturnOptions_TCL_DECLARED +/* 539 */ +EXTERN Tcl_Obj * Tcl_GetReturnOptions(Tcl_Interp *interp, int result); +#endif +#ifndef Tcl_IsEnsemble_TCL_DECLARED +#define Tcl_IsEnsemble_TCL_DECLARED +/* 540 */ +EXTERN int Tcl_IsEnsemble(Tcl_Command token); +#endif +#ifndef Tcl_CreateEnsemble_TCL_DECLARED +#define Tcl_CreateEnsemble_TCL_DECLARED +/* 541 */ +EXTERN Tcl_Command Tcl_CreateEnsemble(Tcl_Interp *interp, + CONST char *name, + Tcl_Namespace *namespacePtr, int flags); +#endif +#ifndef Tcl_FindEnsemble_TCL_DECLARED +#define Tcl_FindEnsemble_TCL_DECLARED +/* 542 */ +EXTERN Tcl_Command Tcl_FindEnsemble(Tcl_Interp *interp, + Tcl_Obj *cmdNameObj, int flags); +#endif +#ifndef Tcl_SetEnsembleSubcommandList_TCL_DECLARED +#define Tcl_SetEnsembleSubcommandList_TCL_DECLARED +/* 543 */ +EXTERN int Tcl_SetEnsembleSubcommandList(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj *subcmdList); +#endif +#ifndef Tcl_SetEnsembleMappingDict_TCL_DECLARED +#define Tcl_SetEnsembleMappingDict_TCL_DECLARED +/* 544 */ +EXTERN int Tcl_SetEnsembleMappingDict(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj *mapDict); +#endif +#ifndef Tcl_SetEnsembleUnknownHandler_TCL_DECLARED +#define Tcl_SetEnsembleUnknownHandler_TCL_DECLARED +/* 545 */ +EXTERN int Tcl_SetEnsembleUnknownHandler(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj *unknownList); +#endif +#ifndef Tcl_SetEnsembleFlags_TCL_DECLARED +#define Tcl_SetEnsembleFlags_TCL_DECLARED +/* 546 */ +EXTERN int Tcl_SetEnsembleFlags(Tcl_Interp *interp, + Tcl_Command token, int flags); +#endif +#ifndef Tcl_GetEnsembleSubcommandList_TCL_DECLARED +#define Tcl_GetEnsembleSubcommandList_TCL_DECLARED +/* 547 */ +EXTERN int Tcl_GetEnsembleSubcommandList(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj **subcmdListPtr); +#endif +#ifndef Tcl_GetEnsembleMappingDict_TCL_DECLARED +#define Tcl_GetEnsembleMappingDict_TCL_DECLARED +/* 548 */ +EXTERN int Tcl_GetEnsembleMappingDict(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj **mapDictPtr); +#endif +#ifndef Tcl_GetEnsembleUnknownHandler_TCL_DECLARED +#define Tcl_GetEnsembleUnknownHandler_TCL_DECLARED +/* 549 */ +EXTERN int Tcl_GetEnsembleUnknownHandler(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj **unknownListPtr); +#endif +#ifndef Tcl_GetEnsembleFlags_TCL_DECLARED +#define Tcl_GetEnsembleFlags_TCL_DECLARED +/* 550 */ +EXTERN int Tcl_GetEnsembleFlags(Tcl_Interp *interp, + Tcl_Command token, int *flagsPtr); +#endif +#ifndef Tcl_GetEnsembleNamespace_TCL_DECLARED +#define Tcl_GetEnsembleNamespace_TCL_DECLARED +/* 551 */ +EXTERN int Tcl_GetEnsembleNamespace(Tcl_Interp *interp, + Tcl_Command token, + Tcl_Namespace **namespacePtrPtr); +#endif +#ifndef Tcl_SetTimeProc_TCL_DECLARED +#define Tcl_SetTimeProc_TCL_DECLARED +/* 552 */ +EXTERN void Tcl_SetTimeProc(Tcl_GetTimeProc *getProc, + Tcl_ScaleTimeProc *scaleProc, + ClientData clientData); +#endif +#ifndef Tcl_QueryTimeProc_TCL_DECLARED +#define Tcl_QueryTimeProc_TCL_DECLARED +/* 553 */ +EXTERN void Tcl_QueryTimeProc(Tcl_GetTimeProc **getProc, + Tcl_ScaleTimeProc **scaleProc, + ClientData *clientData); +#endif +#ifndef Tcl_ChannelThreadActionProc_TCL_DECLARED +#define Tcl_ChannelThreadActionProc_TCL_DECLARED +/* 554 */ +EXTERN Tcl_DriverThreadActionProc * Tcl_ChannelThreadActionProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_NewBignumObj_TCL_DECLARED +#define Tcl_NewBignumObj_TCL_DECLARED +/* 555 */ +EXTERN Tcl_Obj * Tcl_NewBignumObj(mp_int *value); +#endif +#ifndef Tcl_DbNewBignumObj_TCL_DECLARED +#define Tcl_DbNewBignumObj_TCL_DECLARED +/* 556 */ +EXTERN Tcl_Obj * Tcl_DbNewBignumObj(mp_int *value, CONST char *file, + int line); +#endif +#ifndef Tcl_SetBignumObj_TCL_DECLARED +#define Tcl_SetBignumObj_TCL_DECLARED +/* 557 */ +EXTERN void Tcl_SetBignumObj(Tcl_Obj *obj, mp_int *value); +#endif +#ifndef Tcl_GetBignumFromObj_TCL_DECLARED +#define Tcl_GetBignumFromObj_TCL_DECLARED +/* 558 */ +EXTERN int Tcl_GetBignumFromObj(Tcl_Interp *interp, + Tcl_Obj *obj, mp_int *value); +#endif +#ifndef Tcl_TakeBignumFromObj_TCL_DECLARED +#define Tcl_TakeBignumFromObj_TCL_DECLARED +/* 559 */ +EXTERN int Tcl_TakeBignumFromObj(Tcl_Interp *interp, + Tcl_Obj *obj, mp_int *value); +#endif +#ifndef Tcl_TruncateChannel_TCL_DECLARED +#define Tcl_TruncateChannel_TCL_DECLARED +/* 560 */ +EXTERN int Tcl_TruncateChannel(Tcl_Channel chan, + Tcl_WideInt length); +#endif +#ifndef Tcl_ChannelTruncateProc_TCL_DECLARED +#define Tcl_ChannelTruncateProc_TCL_DECLARED +/* 561 */ +EXTERN Tcl_DriverTruncateProc * Tcl_ChannelTruncateProc( + CONST Tcl_ChannelType *chanTypePtr); +#endif +#ifndef Tcl_SetChannelErrorInterp_TCL_DECLARED +#define Tcl_SetChannelErrorInterp_TCL_DECLARED +/* 562 */ +EXTERN void Tcl_SetChannelErrorInterp(Tcl_Interp *interp, + Tcl_Obj *msg); +#endif +#ifndef Tcl_GetChannelErrorInterp_TCL_DECLARED +#define Tcl_GetChannelErrorInterp_TCL_DECLARED +/* 563 */ +EXTERN void Tcl_GetChannelErrorInterp(Tcl_Interp *interp, + Tcl_Obj **msg); +#endif +#ifndef Tcl_SetChannelError_TCL_DECLARED +#define Tcl_SetChannelError_TCL_DECLARED +/* 564 */ +EXTERN void Tcl_SetChannelError(Tcl_Channel chan, Tcl_Obj *msg); +#endif +#ifndef Tcl_GetChannelError_TCL_DECLARED +#define Tcl_GetChannelError_TCL_DECLARED +/* 565 */ +EXTERN void Tcl_GetChannelError(Tcl_Channel chan, Tcl_Obj **msg); +#endif +#ifndef Tcl_InitBignumFromDouble_TCL_DECLARED +#define Tcl_InitBignumFromDouble_TCL_DECLARED +/* 566 */ +EXTERN int Tcl_InitBignumFromDouble(Tcl_Interp *interp, + double initval, mp_int *toInit); +#endif +#ifndef Tcl_GetNamespaceUnknownHandler_TCL_DECLARED +#define Tcl_GetNamespaceUnknownHandler_TCL_DECLARED +/* 567 */ +EXTERN Tcl_Obj * Tcl_GetNamespaceUnknownHandler(Tcl_Interp *interp, + Tcl_Namespace *nsPtr); +#endif +#ifndef Tcl_SetNamespaceUnknownHandler_TCL_DECLARED +#define Tcl_SetNamespaceUnknownHandler_TCL_DECLARED +/* 568 */ +EXTERN int Tcl_SetNamespaceUnknownHandler(Tcl_Interp *interp, + Tcl_Namespace *nsPtr, Tcl_Obj *handlerPtr); +#endif +#ifndef Tcl_GetEncodingFromObj_TCL_DECLARED +#define Tcl_GetEncodingFromObj_TCL_DECLARED +/* 569 */ +EXTERN int Tcl_GetEncodingFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, Tcl_Encoding *encodingPtr); +#endif +#ifndef Tcl_GetEncodingSearchPath_TCL_DECLARED +#define Tcl_GetEncodingSearchPath_TCL_DECLARED +/* 570 */ +EXTERN Tcl_Obj * Tcl_GetEncodingSearchPath(void); +#endif +#ifndef Tcl_SetEncodingSearchPath_TCL_DECLARED +#define Tcl_SetEncodingSearchPath_TCL_DECLARED +/* 571 */ +EXTERN int Tcl_SetEncodingSearchPath(Tcl_Obj *searchPath); +#endif +#ifndef Tcl_GetEncodingNameFromEnvironment_TCL_DECLARED +#define Tcl_GetEncodingNameFromEnvironment_TCL_DECLARED +/* 572 */ +EXTERN CONST char * Tcl_GetEncodingNameFromEnvironment( + Tcl_DString *bufPtr); +#endif +#ifndef Tcl_PkgRequireProc_TCL_DECLARED +#define Tcl_PkgRequireProc_TCL_DECLARED +/* 573 */ +EXTERN int Tcl_PkgRequireProc(Tcl_Interp *interp, + CONST char *name, int objc, + Tcl_Obj *CONST objv[], + ClientData *clientDataPtr); +#endif +#ifndef Tcl_AppendObjToErrorInfo_TCL_DECLARED +#define Tcl_AppendObjToErrorInfo_TCL_DECLARED +/* 574 */ +EXTERN void Tcl_AppendObjToErrorInfo(Tcl_Interp *interp, + Tcl_Obj *objPtr); +#endif +#ifndef Tcl_AppendLimitedToObj_TCL_DECLARED +#define Tcl_AppendLimitedToObj_TCL_DECLARED +/* 575 */ +EXTERN void Tcl_AppendLimitedToObj(Tcl_Obj *objPtr, + CONST char *bytes, int length, int limit, + CONST char *ellipsis); +#endif +#ifndef Tcl_Format_TCL_DECLARED +#define Tcl_Format_TCL_DECLARED +/* 576 */ +EXTERN Tcl_Obj * Tcl_Format(Tcl_Interp *interp, CONST char *format, + int objc, Tcl_Obj *CONST objv[]); +#endif +#ifndef Tcl_AppendFormatToObj_TCL_DECLARED +#define Tcl_AppendFormatToObj_TCL_DECLARED +/* 577 */ +EXTERN int Tcl_AppendFormatToObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, CONST char *format, + int objc, Tcl_Obj *CONST objv[]); +#endif +#ifndef Tcl_ObjPrintf_TCL_DECLARED +#define Tcl_ObjPrintf_TCL_DECLARED +/* 578 */ +EXTERN Tcl_Obj * Tcl_ObjPrintf(CONST char *format, ...); +#endif +#ifndef Tcl_AppendPrintfToObj_TCL_DECLARED +#define Tcl_AppendPrintfToObj_TCL_DECLARED +/* 579 */ +EXTERN void Tcl_AppendPrintfToObj(Tcl_Obj *objPtr, + CONST char *format, ...); +#endif +/* Slot 580 is reserved */ +/* Slot 581 is reserved */ +/* Slot 582 is reserved */ +/* Slot 583 is reserved */ +/* Slot 584 is reserved */ +/* Slot 585 is reserved */ +/* Slot 586 is reserved */ +/* Slot 587 is reserved */ +/* Slot 588 is reserved */ +/* Slot 589 is reserved */ +/* Slot 590 is reserved */ +/* Slot 591 is reserved */ +/* Slot 592 is reserved */ +/* Slot 593 is reserved */ +/* Slot 594 is reserved */ +/* Slot 595 is reserved */ +/* Slot 596 is reserved */ +/* Slot 597 is reserved */ +/* Slot 598 is reserved */ +/* Slot 599 is reserved */ +/* Slot 600 is reserved */ +/* Slot 601 is reserved */ +/* Slot 602 is reserved */ +/* Slot 603 is reserved */ +/* Slot 604 is reserved */ +/* Slot 605 is reserved */ +/* Slot 606 is reserved */ +/* Slot 607 is reserved */ +/* Slot 608 is reserved */ +/* Slot 609 is reserved */ +/* Slot 610 is reserved */ +/* Slot 611 is reserved */ +/* Slot 612 is reserved */ +/* Slot 613 is reserved */ +/* Slot 614 is reserved */ +/* Slot 615 is reserved */ +/* Slot 616 is reserved */ +/* Slot 617 is reserved */ +/* Slot 618 is reserved */ +/* Slot 619 is reserved */ +/* Slot 620 is reserved */ +/* Slot 621 is reserved */ +/* Slot 622 is reserved */ +/* Slot 623 is reserved */ +/* Slot 624 is reserved */ +/* Slot 625 is reserved */ +/* Slot 626 is reserved */ +/* Slot 627 is reserved */ +/* Slot 628 is reserved */ +/* Slot 629 is reserved */ +#ifndef TclUnusedStubEntry_TCL_DECLARED +#define TclUnusedStubEntry_TCL_DECLARED +/* 630 */ +EXTERN void TclUnusedStubEntry(void); +#endif + +typedef struct TclStubHooks { + struct TclPlatStubs *tclPlatStubs; + struct TclIntStubs *tclIntStubs; + struct TclIntPlatStubs *tclIntPlatStubs; +} TclStubHooks; + +typedef struct TclStubs { + int magic; + struct TclStubHooks *hooks; + + int (*tcl_PkgProvideEx) (Tcl_Interp *interp, CONST char *name, CONST char *version, ClientData clientData); /* 0 */ + CONST84_RETURN char * (*tcl_PkgRequireEx) (Tcl_Interp *interp, CONST char *name, CONST char *version, int exact, ClientData *clientDataPtr); /* 1 */ + void (*tcl_Panic) (CONST char *format, ...); /* 2 */ + char * (*tcl_Alloc) (unsigned int size); /* 3 */ + void (*tcl_Free) (char *ptr); /* 4 */ + char * (*tcl_Realloc) (char *ptr, unsigned int size); /* 5 */ + char * (*tcl_DbCkalloc) (unsigned int size, CONST char *file, int line); /* 6 */ + void (*tcl_DbCkfree) (char *ptr, CONST char *file, int line); /* 7 */ + char * (*tcl_DbCkrealloc) (char *ptr, unsigned int size, CONST char *file, int line); /* 8 */ +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ + void (*tcl_CreateFileHandler) (int fd, int mask, Tcl_FileProc *proc, ClientData clientData); /* 9 */ +#endif /* UNIX */ +#if defined(__WIN32__) /* WIN */ + VOID *reserved9; +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ + void (*tcl_CreateFileHandler) (int fd, int mask, Tcl_FileProc *proc, ClientData clientData); /* 9 */ +#endif /* MACOSX */ +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ + void (*tcl_DeleteFileHandler) (int fd); /* 10 */ +#endif /* UNIX */ +#if defined(__WIN32__) /* WIN */ + VOID *reserved10; +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ + void (*tcl_DeleteFileHandler) (int fd); /* 10 */ +#endif /* MACOSX */ + void (*tcl_SetTimer) (Tcl_Time *timePtr); /* 11 */ + void (*tcl_Sleep) (int ms); /* 12 */ + int (*tcl_WaitForEvent) (Tcl_Time *timePtr); /* 13 */ + int (*tcl_AppendAllObjTypes) (Tcl_Interp *interp, Tcl_Obj *objPtr); /* 14 */ + void (*tcl_AppendStringsToObj) (Tcl_Obj *objPtr, ...); /* 15 */ + void (*tcl_AppendToObj) (Tcl_Obj *objPtr, CONST char *bytes, int length); /* 16 */ + Tcl_Obj * (*tcl_ConcatObj) (int objc, Tcl_Obj *CONST objv[]); /* 17 */ + int (*tcl_ConvertToType) (Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_ObjType *typePtr); /* 18 */ + void (*tcl_DbDecrRefCount) (Tcl_Obj *objPtr, CONST char *file, int line); /* 19 */ + void (*tcl_DbIncrRefCount) (Tcl_Obj *objPtr, CONST char *file, int line); /* 20 */ + int (*tcl_DbIsShared) (Tcl_Obj *objPtr, CONST char *file, int line); /* 21 */ + Tcl_Obj * (*tcl_DbNewBooleanObj) (int boolValue, CONST char *file, int line); /* 22 */ + Tcl_Obj * (*tcl_DbNewByteArrayObj) (CONST unsigned char *bytes, int length, CONST char *file, int line); /* 23 */ + Tcl_Obj * (*tcl_DbNewDoubleObj) (double doubleValue, CONST char *file, int line); /* 24 */ + Tcl_Obj * (*tcl_DbNewListObj) (int objc, Tcl_Obj *CONST *objv, CONST char *file, int line); /* 25 */ + Tcl_Obj * (*tcl_DbNewLongObj) (long longValue, CONST char *file, int line); /* 26 */ + Tcl_Obj * (*tcl_DbNewObj) (CONST char *file, int line); /* 27 */ + Tcl_Obj * (*tcl_DbNewStringObj) (CONST char *bytes, int length, CONST char *file, int line); /* 28 */ + Tcl_Obj * (*tcl_DuplicateObj) (Tcl_Obj *objPtr); /* 29 */ + void (*tclFreeObj) (Tcl_Obj *objPtr); /* 30 */ + int (*tcl_GetBoolean) (Tcl_Interp *interp, CONST char *src, int *boolPtr); /* 31 */ + int (*tcl_GetBooleanFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int *boolPtr); /* 32 */ + unsigned char * (*tcl_GetByteArrayFromObj) (Tcl_Obj *objPtr, int *lengthPtr); /* 33 */ + int (*tcl_GetDouble) (Tcl_Interp *interp, CONST char *src, double *doublePtr); /* 34 */ + int (*tcl_GetDoubleFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, double *doublePtr); /* 35 */ + int (*tcl_GetIndexFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, CONST84 char **tablePtr, CONST char *msg, int flags, int *indexPtr); /* 36 */ + int (*tcl_GetInt) (Tcl_Interp *interp, CONST char *src, int *intPtr); /* 37 */ + int (*tcl_GetIntFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int *intPtr); /* 38 */ + int (*tcl_GetLongFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, long *longPtr); /* 39 */ + Tcl_ObjType * (*tcl_GetObjType) (CONST char *typeName); /* 40 */ + char * (*tcl_GetStringFromObj) (Tcl_Obj *objPtr, int *lengthPtr); /* 41 */ + void (*tcl_InvalidateStringRep) (Tcl_Obj *objPtr); /* 42 */ + int (*tcl_ListObjAppendList) (Tcl_Interp *interp, Tcl_Obj *listPtr, Tcl_Obj *elemListPtr); /* 43 */ + int (*tcl_ListObjAppendElement) (Tcl_Interp *interp, Tcl_Obj *listPtr, Tcl_Obj *objPtr); /* 44 */ + int (*tcl_ListObjGetElements) (Tcl_Interp *interp, Tcl_Obj *listPtr, int *objcPtr, Tcl_Obj ***objvPtr); /* 45 */ + int (*tcl_ListObjIndex) (Tcl_Interp *interp, Tcl_Obj *listPtr, int index, Tcl_Obj **objPtrPtr); /* 46 */ + int (*tcl_ListObjLength) (Tcl_Interp *interp, Tcl_Obj *listPtr, int *lengthPtr); /* 47 */ + int (*tcl_ListObjReplace) (Tcl_Interp *interp, Tcl_Obj *listPtr, int first, int count, int objc, Tcl_Obj *CONST objv[]); /* 48 */ + Tcl_Obj * (*tcl_NewBooleanObj) (int boolValue); /* 49 */ + Tcl_Obj * (*tcl_NewByteArrayObj) (CONST unsigned char *bytes, int length); /* 50 */ + Tcl_Obj * (*tcl_NewDoubleObj) (double doubleValue); /* 51 */ + Tcl_Obj * (*tcl_NewIntObj) (int intValue); /* 52 */ + Tcl_Obj * (*tcl_NewListObj) (int objc, Tcl_Obj *CONST objv[]); /* 53 */ + Tcl_Obj * (*tcl_NewLongObj) (long longValue); /* 54 */ + Tcl_Obj * (*tcl_NewObj) (void); /* 55 */ + Tcl_Obj * (*tcl_NewStringObj) (CONST char *bytes, int length); /* 56 */ + void (*tcl_SetBooleanObj) (Tcl_Obj *objPtr, int boolValue); /* 57 */ + unsigned char * (*tcl_SetByteArrayLength) (Tcl_Obj *objPtr, int length); /* 58 */ + void (*tcl_SetByteArrayObj) (Tcl_Obj *objPtr, CONST unsigned char *bytes, int length); /* 59 */ + void (*tcl_SetDoubleObj) (Tcl_Obj *objPtr, double doubleValue); /* 60 */ + void (*tcl_SetIntObj) (Tcl_Obj *objPtr, int intValue); /* 61 */ + void (*tcl_SetListObj) (Tcl_Obj *objPtr, int objc, Tcl_Obj *CONST objv[]); /* 62 */ + void (*tcl_SetLongObj) (Tcl_Obj *objPtr, long longValue); /* 63 */ + void (*tcl_SetObjLength) (Tcl_Obj *objPtr, int length); /* 64 */ + void (*tcl_SetStringObj) (Tcl_Obj *objPtr, CONST char *bytes, int length); /* 65 */ + void (*tcl_AddErrorInfo) (Tcl_Interp *interp, CONST char *message); /* 66 */ + void (*tcl_AddObjErrorInfo) (Tcl_Interp *interp, CONST char *message, int length); /* 67 */ + void (*tcl_AllowExceptions) (Tcl_Interp *interp); /* 68 */ + void (*tcl_AppendElement) (Tcl_Interp *interp, CONST char *element); /* 69 */ + void (*tcl_AppendResult) (Tcl_Interp *interp, ...); /* 70 */ + Tcl_AsyncHandler (*tcl_AsyncCreate) (Tcl_AsyncProc *proc, ClientData clientData); /* 71 */ + void (*tcl_AsyncDelete) (Tcl_AsyncHandler async); /* 72 */ + int (*tcl_AsyncInvoke) (Tcl_Interp *interp, int code); /* 73 */ + void (*tcl_AsyncMark) (Tcl_AsyncHandler async); /* 74 */ + int (*tcl_AsyncReady) (void); /* 75 */ + void (*tcl_BackgroundError) (Tcl_Interp *interp); /* 76 */ + char (*tcl_Backslash) (CONST char *src, int *readPtr); /* 77 */ + int (*tcl_BadChannelOption) (Tcl_Interp *interp, CONST char *optionName, CONST char *optionList); /* 78 */ + void (*tcl_CallWhenDeleted) (Tcl_Interp *interp, Tcl_InterpDeleteProc *proc, ClientData clientData); /* 79 */ + void (*tcl_CancelIdleCall) (Tcl_IdleProc *idleProc, ClientData clientData); /* 80 */ + int (*tcl_Close) (Tcl_Interp *interp, Tcl_Channel chan); /* 81 */ + int (*tcl_CommandComplete) (CONST char *cmd); /* 82 */ + char * (*tcl_Concat) (int argc, CONST84 char *CONST *argv); /* 83 */ + int (*tcl_ConvertElement) (CONST char *src, char *dst, int flags); /* 84 */ + int (*tcl_ConvertCountedElement) (CONST char *src, int length, char *dst, int flags); /* 85 */ + int (*tcl_CreateAlias) (Tcl_Interp *slave, CONST char *slaveCmd, Tcl_Interp *target, CONST char *targetCmd, int argc, CONST84 char *CONST *argv); /* 86 */ + int (*tcl_CreateAliasObj) (Tcl_Interp *slave, CONST char *slaveCmd, Tcl_Interp *target, CONST char *targetCmd, int objc, Tcl_Obj *CONST objv[]); /* 87 */ + Tcl_Channel (*tcl_CreateChannel) (Tcl_ChannelType *typePtr, CONST char *chanName, ClientData instanceData, int mask); /* 88 */ + void (*tcl_CreateChannelHandler) (Tcl_Channel chan, int mask, Tcl_ChannelProc *proc, ClientData clientData); /* 89 */ + void (*tcl_CreateCloseHandler) (Tcl_Channel chan, Tcl_CloseProc *proc, ClientData clientData); /* 90 */ + Tcl_Command (*tcl_CreateCommand) (Tcl_Interp *interp, CONST char *cmdName, Tcl_CmdProc *proc, ClientData clientData, Tcl_CmdDeleteProc *deleteProc); /* 91 */ + void (*tcl_CreateEventSource) (Tcl_EventSetupProc *setupProc, Tcl_EventCheckProc *checkProc, ClientData clientData); /* 92 */ + void (*tcl_CreateExitHandler) (Tcl_ExitProc *proc, ClientData clientData); /* 93 */ + Tcl_Interp * (*tcl_CreateInterp) (void); /* 94 */ + void (*tcl_CreateMathFunc) (Tcl_Interp *interp, CONST char *name, int numArgs, Tcl_ValueType *argTypes, Tcl_MathProc *proc, ClientData clientData); /* 95 */ + Tcl_Command (*tcl_CreateObjCommand) (Tcl_Interp *interp, CONST char *cmdName, Tcl_ObjCmdProc *proc, ClientData clientData, Tcl_CmdDeleteProc *deleteProc); /* 96 */ + Tcl_Interp * (*tcl_CreateSlave) (Tcl_Interp *interp, CONST char *slaveName, int isSafe); /* 97 */ + Tcl_TimerToken (*tcl_CreateTimerHandler) (int milliseconds, Tcl_TimerProc *proc, ClientData clientData); /* 98 */ + Tcl_Trace (*tcl_CreateTrace) (Tcl_Interp *interp, int level, Tcl_CmdTraceProc *proc, ClientData clientData); /* 99 */ + void (*tcl_DeleteAssocData) (Tcl_Interp *interp, CONST char *name); /* 100 */ + void (*tcl_DeleteChannelHandler) (Tcl_Channel chan, Tcl_ChannelProc *proc, ClientData clientData); /* 101 */ + void (*tcl_DeleteCloseHandler) (Tcl_Channel chan, Tcl_CloseProc *proc, ClientData clientData); /* 102 */ + int (*tcl_DeleteCommand) (Tcl_Interp *interp, CONST char *cmdName); /* 103 */ + int (*tcl_DeleteCommandFromToken) (Tcl_Interp *interp, Tcl_Command command); /* 104 */ + void (*tcl_DeleteEvents) (Tcl_EventDeleteProc *proc, ClientData clientData); /* 105 */ + void (*tcl_DeleteEventSource) (Tcl_EventSetupProc *setupProc, Tcl_EventCheckProc *checkProc, ClientData clientData); /* 106 */ + void (*tcl_DeleteExitHandler) (Tcl_ExitProc *proc, ClientData clientData); /* 107 */ + void (*tcl_DeleteHashEntry) (Tcl_HashEntry *entryPtr); /* 108 */ + void (*tcl_DeleteHashTable) (Tcl_HashTable *tablePtr); /* 109 */ + void (*tcl_DeleteInterp) (Tcl_Interp *interp); /* 110 */ + void (*tcl_DetachPids) (int numPids, Tcl_Pid *pidPtr); /* 111 */ + void (*tcl_DeleteTimerHandler) (Tcl_TimerToken token); /* 112 */ + void (*tcl_DeleteTrace) (Tcl_Interp *interp, Tcl_Trace trace); /* 113 */ + void (*tcl_DontCallWhenDeleted) (Tcl_Interp *interp, Tcl_InterpDeleteProc *proc, ClientData clientData); /* 114 */ + int (*tcl_DoOneEvent) (int flags); /* 115 */ + void (*tcl_DoWhenIdle) (Tcl_IdleProc *proc, ClientData clientData); /* 116 */ + char * (*tcl_DStringAppend) (Tcl_DString *dsPtr, CONST char *bytes, int length); /* 117 */ + char * (*tcl_DStringAppendElement) (Tcl_DString *dsPtr, CONST char *element); /* 118 */ + void (*tcl_DStringEndSublist) (Tcl_DString *dsPtr); /* 119 */ + void (*tcl_DStringFree) (Tcl_DString *dsPtr); /* 120 */ + void (*tcl_DStringGetResult) (Tcl_Interp *interp, Tcl_DString *dsPtr); /* 121 */ + void (*tcl_DStringInit) (Tcl_DString *dsPtr); /* 122 */ + void (*tcl_DStringResult) (Tcl_Interp *interp, Tcl_DString *dsPtr); /* 123 */ + void (*tcl_DStringSetLength) (Tcl_DString *dsPtr, int length); /* 124 */ + void (*tcl_DStringStartSublist) (Tcl_DString *dsPtr); /* 125 */ + int (*tcl_Eof) (Tcl_Channel chan); /* 126 */ + CONST84_RETURN char * (*tcl_ErrnoId) (void); /* 127 */ + CONST84_RETURN char * (*tcl_ErrnoMsg) (int err); /* 128 */ + int (*tcl_Eval) (Tcl_Interp *interp, CONST char *script); /* 129 */ + int (*tcl_EvalFile) (Tcl_Interp *interp, CONST char *fileName); /* 130 */ + int (*tcl_EvalObj) (Tcl_Interp *interp, Tcl_Obj *objPtr); /* 131 */ + void (*tcl_EventuallyFree) (ClientData clientData, Tcl_FreeProc *freeProc); /* 132 */ + void (*tcl_Exit) (int status); /* 133 */ + int (*tcl_ExposeCommand) (Tcl_Interp *interp, CONST char *hiddenCmdToken, CONST char *cmdName); /* 134 */ + int (*tcl_ExprBoolean) (Tcl_Interp *interp, CONST char *expr, int *ptr); /* 135 */ + int (*tcl_ExprBooleanObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int *ptr); /* 136 */ + int (*tcl_ExprDouble) (Tcl_Interp *interp, CONST char *expr, double *ptr); /* 137 */ + int (*tcl_ExprDoubleObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, double *ptr); /* 138 */ + int (*tcl_ExprLong) (Tcl_Interp *interp, CONST char *expr, long *ptr); /* 139 */ + int (*tcl_ExprLongObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, long *ptr); /* 140 */ + int (*tcl_ExprObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Obj **resultPtrPtr); /* 141 */ + int (*tcl_ExprString) (Tcl_Interp *interp, CONST char *expr); /* 142 */ + void (*tcl_Finalize) (void); /* 143 */ + void (*tcl_FindExecutable) (CONST char *argv0); /* 144 */ + Tcl_HashEntry * (*tcl_FirstHashEntry) (Tcl_HashTable *tablePtr, Tcl_HashSearch *searchPtr); /* 145 */ + int (*tcl_Flush) (Tcl_Channel chan); /* 146 */ + void (*tcl_FreeResult) (Tcl_Interp *interp); /* 147 */ + int (*tcl_GetAlias) (Tcl_Interp *interp, CONST char *slaveCmd, Tcl_Interp **targetInterpPtr, CONST84 char **targetCmdPtr, int *argcPtr, CONST84 char ***argvPtr); /* 148 */ + int (*tcl_GetAliasObj) (Tcl_Interp *interp, CONST char *slaveCmd, Tcl_Interp **targetInterpPtr, CONST84 char **targetCmdPtr, int *objcPtr, Tcl_Obj ***objv); /* 149 */ + ClientData (*tcl_GetAssocData) (Tcl_Interp *interp, CONST char *name, Tcl_InterpDeleteProc **procPtr); /* 150 */ + Tcl_Channel (*tcl_GetChannel) (Tcl_Interp *interp, CONST char *chanName, int *modePtr); /* 151 */ + int (*tcl_GetChannelBufferSize) (Tcl_Channel chan); /* 152 */ + int (*tcl_GetChannelHandle) (Tcl_Channel chan, int direction, ClientData *handlePtr); /* 153 */ + ClientData (*tcl_GetChannelInstanceData) (Tcl_Channel chan); /* 154 */ + int (*tcl_GetChannelMode) (Tcl_Channel chan); /* 155 */ + CONST84_RETURN char * (*tcl_GetChannelName) (Tcl_Channel chan); /* 156 */ + int (*tcl_GetChannelOption) (Tcl_Interp *interp, Tcl_Channel chan, CONST char *optionName, Tcl_DString *dsPtr); /* 157 */ + Tcl_ChannelType * (*tcl_GetChannelType) (Tcl_Channel chan); /* 158 */ + int (*tcl_GetCommandInfo) (Tcl_Interp *interp, CONST char *cmdName, Tcl_CmdInfo *infoPtr); /* 159 */ + CONST84_RETURN char * (*tcl_GetCommandName) (Tcl_Interp *interp, Tcl_Command command); /* 160 */ + int (*tcl_GetErrno) (void); /* 161 */ + CONST84_RETURN char * (*tcl_GetHostName) (void); /* 162 */ + int (*tcl_GetInterpPath) (Tcl_Interp *askInterp, Tcl_Interp *slaveInterp); /* 163 */ + Tcl_Interp * (*tcl_GetMaster) (Tcl_Interp *interp); /* 164 */ + CONST char * (*tcl_GetNameOfExecutable) (void); /* 165 */ + Tcl_Obj * (*tcl_GetObjResult) (Tcl_Interp *interp); /* 166 */ +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ + int (*tcl_GetOpenFile) (Tcl_Interp *interp, CONST char *chanID, int forWriting, int checkUsage, ClientData *filePtr); /* 167 */ +#endif /* UNIX */ +#if defined(__WIN32__) /* WIN */ + VOID *reserved167; +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ + int (*tcl_GetOpenFile) (Tcl_Interp *interp, CONST char *chanID, int forWriting, int checkUsage, ClientData *filePtr); /* 167 */ +#endif /* MACOSX */ + Tcl_PathType (*tcl_GetPathType) (CONST char *path); /* 168 */ + int (*tcl_Gets) (Tcl_Channel chan, Tcl_DString *dsPtr); /* 169 */ + int (*tcl_GetsObj) (Tcl_Channel chan, Tcl_Obj *objPtr); /* 170 */ + int (*tcl_GetServiceMode) (void); /* 171 */ + Tcl_Interp * (*tcl_GetSlave) (Tcl_Interp *interp, CONST char *slaveName); /* 172 */ + Tcl_Channel (*tcl_GetStdChannel) (int type); /* 173 */ + CONST84_RETURN char * (*tcl_GetStringResult) (Tcl_Interp *interp); /* 174 */ + CONST84_RETURN char * (*tcl_GetVar) (Tcl_Interp *interp, CONST char *varName, int flags); /* 175 */ + CONST84_RETURN char * (*tcl_GetVar2) (Tcl_Interp *interp, CONST char *part1, CONST char *part2, int flags); /* 176 */ + int (*tcl_GlobalEval) (Tcl_Interp *interp, CONST char *command); /* 177 */ + int (*tcl_GlobalEvalObj) (Tcl_Interp *interp, Tcl_Obj *objPtr); /* 178 */ + int (*tcl_HideCommand) (Tcl_Interp *interp, CONST char *cmdName, CONST char *hiddenCmdToken); /* 179 */ + int (*tcl_Init) (Tcl_Interp *interp); /* 180 */ + void (*tcl_InitHashTable) (Tcl_HashTable *tablePtr, int keyType); /* 181 */ + int (*tcl_InputBlocked) (Tcl_Channel chan); /* 182 */ + int (*tcl_InputBuffered) (Tcl_Channel chan); /* 183 */ + int (*tcl_InterpDeleted) (Tcl_Interp *interp); /* 184 */ + int (*tcl_IsSafe) (Tcl_Interp *interp); /* 185 */ + char * (*tcl_JoinPath) (int argc, CONST84 char *CONST *argv, Tcl_DString *resultPtr); /* 186 */ + int (*tcl_LinkVar) (Tcl_Interp *interp, CONST char *varName, char *addr, int type); /* 187 */ + VOID *reserved188; + Tcl_Channel (*tcl_MakeFileChannel) (ClientData handle, int mode); /* 189 */ + int (*tcl_MakeSafe) (Tcl_Interp *interp); /* 190 */ + Tcl_Channel (*tcl_MakeTcpClientChannel) (ClientData tcpSocket); /* 191 */ + char * (*tcl_Merge) (int argc, CONST84 char *CONST *argv); /* 192 */ + Tcl_HashEntry * (*tcl_NextHashEntry) (Tcl_HashSearch *searchPtr); /* 193 */ + void (*tcl_NotifyChannel) (Tcl_Channel channel, int mask); /* 194 */ + Tcl_Obj * (*tcl_ObjGetVar2) (Tcl_Interp *interp, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, int flags); /* 195 */ + Tcl_Obj * (*tcl_ObjSetVar2) (Tcl_Interp *interp, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, Tcl_Obj *newValuePtr, int flags); /* 196 */ + Tcl_Channel (*tcl_OpenCommandChannel) (Tcl_Interp *interp, int argc, CONST84 char **argv, int flags); /* 197 */ + Tcl_Channel (*tcl_OpenFileChannel) (Tcl_Interp *interp, CONST char *fileName, CONST char *modeString, int permissions); /* 198 */ + Tcl_Channel (*tcl_OpenTcpClient) (Tcl_Interp *interp, int port, CONST char *address, CONST char *myaddr, int myport, int async); /* 199 */ + Tcl_Channel (*tcl_OpenTcpServer) (Tcl_Interp *interp, int port, CONST char *host, Tcl_TcpAcceptProc *acceptProc, ClientData callbackData); /* 200 */ + void (*tcl_Preserve) (ClientData data); /* 201 */ + void (*tcl_PrintDouble) (Tcl_Interp *interp, double value, char *dst); /* 202 */ + int (*tcl_PutEnv) (CONST char *assignment); /* 203 */ + CONST84_RETURN char * (*tcl_PosixError) (Tcl_Interp *interp); /* 204 */ + void (*tcl_QueueEvent) (Tcl_Event *evPtr, Tcl_QueuePosition position); /* 205 */ + int (*tcl_Read) (Tcl_Channel chan, char *bufPtr, int toRead); /* 206 */ + void (*tcl_ReapDetachedProcs) (void); /* 207 */ + int (*tcl_RecordAndEval) (Tcl_Interp *interp, CONST char *cmd, int flags); /* 208 */ + int (*tcl_RecordAndEvalObj) (Tcl_Interp *interp, Tcl_Obj *cmdPtr, int flags); /* 209 */ + void (*tcl_RegisterChannel) (Tcl_Interp *interp, Tcl_Channel chan); /* 210 */ + void (*tcl_RegisterObjType) (Tcl_ObjType *typePtr); /* 211 */ + Tcl_RegExp (*tcl_RegExpCompile) (Tcl_Interp *interp, CONST char *pattern); /* 212 */ + int (*tcl_RegExpExec) (Tcl_Interp *interp, Tcl_RegExp regexp, CONST char *text, CONST char *start); /* 213 */ + int (*tcl_RegExpMatch) (Tcl_Interp *interp, CONST char *text, CONST char *pattern); /* 214 */ + void (*tcl_RegExpRange) (Tcl_RegExp regexp, int index, CONST84 char **startPtr, CONST84 char **endPtr); /* 215 */ + void (*tcl_Release) (ClientData clientData); /* 216 */ + void (*tcl_ResetResult) (Tcl_Interp *interp); /* 217 */ + int (*tcl_ScanElement) (CONST char *src, int *flagPtr); /* 218 */ + int (*tcl_ScanCountedElement) (CONST char *src, int length, int *flagPtr); /* 219 */ + int (*tcl_SeekOld) (Tcl_Channel chan, int offset, int mode); /* 220 */ + int (*tcl_ServiceAll) (void); /* 221 */ + int (*tcl_ServiceEvent) (int flags); /* 222 */ + void (*tcl_SetAssocData) (Tcl_Interp *interp, CONST char *name, Tcl_InterpDeleteProc *proc, ClientData clientData); /* 223 */ + void (*tcl_SetChannelBufferSize) (Tcl_Channel chan, int sz); /* 224 */ + int (*tcl_SetChannelOption) (Tcl_Interp *interp, Tcl_Channel chan, CONST char *optionName, CONST char *newValue); /* 225 */ + int (*tcl_SetCommandInfo) (Tcl_Interp *interp, CONST char *cmdName, CONST Tcl_CmdInfo *infoPtr); /* 226 */ + void (*tcl_SetErrno) (int err); /* 227 */ + void (*tcl_SetErrorCode) (Tcl_Interp *interp, ...); /* 228 */ + void (*tcl_SetMaxBlockTime) (Tcl_Time *timePtr); /* 229 */ + void (*tcl_SetPanicProc) (Tcl_PanicProc *panicProc); /* 230 */ + int (*tcl_SetRecursionLimit) (Tcl_Interp *interp, int depth); /* 231 */ + void (*tcl_SetResult) (Tcl_Interp *interp, char *result, Tcl_FreeProc *freeProc); /* 232 */ + int (*tcl_SetServiceMode) (int mode); /* 233 */ + void (*tcl_SetObjErrorCode) (Tcl_Interp *interp, Tcl_Obj *errorObjPtr); /* 234 */ + void (*tcl_SetObjResult) (Tcl_Interp *interp, Tcl_Obj *resultObjPtr); /* 235 */ + void (*tcl_SetStdChannel) (Tcl_Channel channel, int type); /* 236 */ + CONST84_RETURN char * (*tcl_SetVar) (Tcl_Interp *interp, CONST char *varName, CONST char *newValue, int flags); /* 237 */ + CONST84_RETURN char * (*tcl_SetVar2) (Tcl_Interp *interp, CONST char *part1, CONST char *part2, CONST char *newValue, int flags); /* 238 */ + CONST84_RETURN char * (*tcl_SignalId) (int sig); /* 239 */ + CONST84_RETURN char * (*tcl_SignalMsg) (int sig); /* 240 */ + void (*tcl_SourceRCFile) (Tcl_Interp *interp); /* 241 */ + int (*tcl_SplitList) (Tcl_Interp *interp, CONST char *listStr, int *argcPtr, CONST84 char ***argvPtr); /* 242 */ + void (*tcl_SplitPath) (CONST char *path, int *argcPtr, CONST84 char ***argvPtr); /* 243 */ + void (*tcl_StaticPackage) (Tcl_Interp *interp, CONST char *pkgName, Tcl_PackageInitProc *initProc, Tcl_PackageInitProc *safeInitProc); /* 244 */ + int (*tcl_StringMatch) (CONST char *str, CONST char *pattern); /* 245 */ + int (*tcl_TellOld) (Tcl_Channel chan); /* 246 */ + int (*tcl_TraceVar) (Tcl_Interp *interp, CONST char *varName, int flags, Tcl_VarTraceProc *proc, ClientData clientData); /* 247 */ + int (*tcl_TraceVar2) (Tcl_Interp *interp, CONST char *part1, CONST char *part2, int flags, Tcl_VarTraceProc *proc, ClientData clientData); /* 248 */ + char * (*tcl_TranslateFileName) (Tcl_Interp *interp, CONST char *name, Tcl_DString *bufferPtr); /* 249 */ + int (*tcl_Ungets) (Tcl_Channel chan, CONST char *str, int len, int atHead); /* 250 */ + void (*tcl_UnlinkVar) (Tcl_Interp *interp, CONST char *varName); /* 251 */ + int (*tcl_UnregisterChannel) (Tcl_Interp *interp, Tcl_Channel chan); /* 252 */ + int (*tcl_UnsetVar) (Tcl_Interp *interp, CONST char *varName, int flags); /* 253 */ + int (*tcl_UnsetVar2) (Tcl_Interp *interp, CONST char *part1, CONST char *part2, int flags); /* 254 */ + void (*tcl_UntraceVar) (Tcl_Interp *interp, CONST char *varName, int flags, Tcl_VarTraceProc *proc, ClientData clientData); /* 255 */ + void (*tcl_UntraceVar2) (Tcl_Interp *interp, CONST char *part1, CONST char *part2, int flags, Tcl_VarTraceProc *proc, ClientData clientData); /* 256 */ + void (*tcl_UpdateLinkedVar) (Tcl_Interp *interp, CONST char *varName); /* 257 */ + int (*tcl_UpVar) (Tcl_Interp *interp, CONST char *frameName, CONST char *varName, CONST char *localName, int flags); /* 258 */ + int (*tcl_UpVar2) (Tcl_Interp *interp, CONST char *frameName, CONST char *part1, CONST char *part2, CONST char *localName, int flags); /* 259 */ + int (*tcl_VarEval) (Tcl_Interp *interp, ...); /* 260 */ + ClientData (*tcl_VarTraceInfo) (Tcl_Interp *interp, CONST char *varName, int flags, Tcl_VarTraceProc *procPtr, ClientData prevClientData); /* 261 */ + ClientData (*tcl_VarTraceInfo2) (Tcl_Interp *interp, CONST char *part1, CONST char *part2, int flags, Tcl_VarTraceProc *procPtr, ClientData prevClientData); /* 262 */ + int (*tcl_Write) (Tcl_Channel chan, CONST char *s, int slen); /* 263 */ + void (*tcl_WrongNumArgs) (Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], CONST char *message); /* 264 */ + int (*tcl_DumpActiveMemory) (CONST char *fileName); /* 265 */ + void (*tcl_ValidateAllMemory) (CONST char *file, int line); /* 266 */ + void (*tcl_AppendResultVA) (Tcl_Interp *interp, va_list argList); /* 267 */ + void (*tcl_AppendStringsToObjVA) (Tcl_Obj *objPtr, va_list argList); /* 268 */ + char * (*tcl_HashStats) (Tcl_HashTable *tablePtr); /* 269 */ + CONST84_RETURN char * (*tcl_ParseVar) (Tcl_Interp *interp, CONST char *start, CONST84 char **termPtr); /* 270 */ + CONST84_RETURN char * (*tcl_PkgPresent) (Tcl_Interp *interp, CONST char *name, CONST char *version, int exact); /* 271 */ + CONST84_RETURN char * (*tcl_PkgPresentEx) (Tcl_Interp *interp, CONST char *name, CONST char *version, int exact, ClientData *clientDataPtr); /* 272 */ + int (*tcl_PkgProvide) (Tcl_Interp *interp, CONST char *name, CONST char *version); /* 273 */ + CONST84_RETURN char * (*tcl_PkgRequire) (Tcl_Interp *interp, CONST char *name, CONST char *version, int exact); /* 274 */ + void (*tcl_SetErrorCodeVA) (Tcl_Interp *interp, va_list argList); /* 275 */ + int (*tcl_VarEvalVA) (Tcl_Interp *interp, va_list argList); /* 276 */ + Tcl_Pid (*tcl_WaitPid) (Tcl_Pid pid, int *statPtr, int options); /* 277 */ + void (*tcl_PanicVA) (CONST char *format, va_list argList); /* 278 */ + void (*tcl_GetVersion) (int *major, int *minor, int *patchLevel, int *type); /* 279 */ + void (*tcl_InitMemory) (Tcl_Interp *interp); /* 280 */ + Tcl_Channel (*tcl_StackChannel) (Tcl_Interp *interp, Tcl_ChannelType *typePtr, ClientData instanceData, int mask, Tcl_Channel prevChan); /* 281 */ + int (*tcl_UnstackChannel) (Tcl_Interp *interp, Tcl_Channel chan); /* 282 */ + Tcl_Channel (*tcl_GetStackedChannel) (Tcl_Channel chan); /* 283 */ + void (*tcl_SetMainLoop) (Tcl_MainLoopProc *proc); /* 284 */ + VOID *reserved285; + void (*tcl_AppendObjToObj) (Tcl_Obj *objPtr, Tcl_Obj *appendObjPtr); /* 286 */ + Tcl_Encoding (*tcl_CreateEncoding) (CONST Tcl_EncodingType *typePtr); /* 287 */ + void (*tcl_CreateThreadExitHandler) (Tcl_ExitProc *proc, ClientData clientData); /* 288 */ + void (*tcl_DeleteThreadExitHandler) (Tcl_ExitProc *proc, ClientData clientData); /* 289 */ + void (*tcl_DiscardResult) (Tcl_SavedResult *statePtr); /* 290 */ + int (*tcl_EvalEx) (Tcl_Interp *interp, CONST char *script, int numBytes, int flags); /* 291 */ + int (*tcl_EvalObjv) (Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int flags); /* 292 */ + int (*tcl_EvalObjEx) (Tcl_Interp *interp, Tcl_Obj *objPtr, int flags); /* 293 */ + void (*tcl_ExitThread) (int status); /* 294 */ + int (*tcl_ExternalToUtf) (Tcl_Interp *interp, Tcl_Encoding encoding, CONST char *src, int srcLen, int flags, Tcl_EncodingState *statePtr, char *dst, int dstLen, int *srcReadPtr, int *dstWrotePtr, int *dstCharsPtr); /* 295 */ + char * (*tcl_ExternalToUtfDString) (Tcl_Encoding encoding, CONST char *src, int srcLen, Tcl_DString *dsPtr); /* 296 */ + void (*tcl_FinalizeThread) (void); /* 297 */ + void (*tcl_FinalizeNotifier) (ClientData clientData); /* 298 */ + void (*tcl_FreeEncoding) (Tcl_Encoding encoding); /* 299 */ + Tcl_ThreadId (*tcl_GetCurrentThread) (void); /* 300 */ + Tcl_Encoding (*tcl_GetEncoding) (Tcl_Interp *interp, CONST char *name); /* 301 */ + CONST84_RETURN char * (*tcl_GetEncodingName) (Tcl_Encoding encoding); /* 302 */ + void (*tcl_GetEncodingNames) (Tcl_Interp *interp); /* 303 */ + int (*tcl_GetIndexFromObjStruct) (Tcl_Interp *interp, Tcl_Obj *objPtr, CONST VOID *tablePtr, int offset, CONST char *msg, int flags, int *indexPtr); /* 304 */ + VOID * (*tcl_GetThreadData) (Tcl_ThreadDataKey *keyPtr, int size); /* 305 */ + Tcl_Obj * (*tcl_GetVar2Ex) (Tcl_Interp *interp, CONST char *part1, CONST char *part2, int flags); /* 306 */ + ClientData (*tcl_InitNotifier) (void); /* 307 */ + void (*tcl_MutexLock) (Tcl_Mutex *mutexPtr); /* 308 */ + void (*tcl_MutexUnlock) (Tcl_Mutex *mutexPtr); /* 309 */ + void (*tcl_ConditionNotify) (Tcl_Condition *condPtr); /* 310 */ + void (*tcl_ConditionWait) (Tcl_Condition *condPtr, Tcl_Mutex *mutexPtr, Tcl_Time *timePtr); /* 311 */ + int (*tcl_NumUtfChars) (CONST char *src, int length); /* 312 */ + int (*tcl_ReadChars) (Tcl_Channel channel, Tcl_Obj *objPtr, int charsToRead, int appendFlag); /* 313 */ + void (*tcl_RestoreResult) (Tcl_Interp *interp, Tcl_SavedResult *statePtr); /* 314 */ + void (*tcl_SaveResult) (Tcl_Interp *interp, Tcl_SavedResult *statePtr); /* 315 */ + int (*tcl_SetSystemEncoding) (Tcl_Interp *interp, CONST char *name); /* 316 */ + Tcl_Obj * (*tcl_SetVar2Ex) (Tcl_Interp *interp, CONST char *part1, CONST char *part2, Tcl_Obj *newValuePtr, int flags); /* 317 */ + void (*tcl_ThreadAlert) (Tcl_ThreadId threadId); /* 318 */ + void (*tcl_ThreadQueueEvent) (Tcl_ThreadId threadId, Tcl_Event *evPtr, Tcl_QueuePosition position); /* 319 */ + Tcl_UniChar (*tcl_UniCharAtIndex) (CONST char *src, int index); /* 320 */ + Tcl_UniChar (*tcl_UniCharToLower) (int ch); /* 321 */ + Tcl_UniChar (*tcl_UniCharToTitle) (int ch); /* 322 */ + Tcl_UniChar (*tcl_UniCharToUpper) (int ch); /* 323 */ + int (*tcl_UniCharToUtf) (int ch, char *buf); /* 324 */ + CONST84_RETURN char * (*tcl_UtfAtIndex) (CONST char *src, int index); /* 325 */ + int (*tcl_UtfCharComplete) (CONST char *src, int length); /* 326 */ + int (*tcl_UtfBackslash) (CONST char *src, int *readPtr, char *dst); /* 327 */ + CONST84_RETURN char * (*tcl_UtfFindFirst) (CONST char *src, int ch); /* 328 */ + CONST84_RETURN char * (*tcl_UtfFindLast) (CONST char *src, int ch); /* 329 */ + CONST84_RETURN char * (*tcl_UtfNext) (CONST char *src); /* 330 */ + CONST84_RETURN char * (*tcl_UtfPrev) (CONST char *src, CONST char *start); /* 331 */ + int (*tcl_UtfToExternal) (Tcl_Interp *interp, Tcl_Encoding encoding, CONST char *src, int srcLen, int flags, Tcl_EncodingState *statePtr, char *dst, int dstLen, int *srcReadPtr, int *dstWrotePtr, int *dstCharsPtr); /* 332 */ + char * (*tcl_UtfToExternalDString) (Tcl_Encoding encoding, CONST char *src, int srcLen, Tcl_DString *dsPtr); /* 333 */ + int (*tcl_UtfToLower) (char *src); /* 334 */ + int (*tcl_UtfToTitle) (char *src); /* 335 */ + int (*tcl_UtfToUniChar) (CONST char *src, Tcl_UniChar *chPtr); /* 336 */ + int (*tcl_UtfToUpper) (char *src); /* 337 */ + int (*tcl_WriteChars) (Tcl_Channel chan, CONST char *src, int srcLen); /* 338 */ + int (*tcl_WriteObj) (Tcl_Channel chan, Tcl_Obj *objPtr); /* 339 */ + char * (*tcl_GetString) (Tcl_Obj *objPtr); /* 340 */ + CONST84_RETURN char * (*tcl_GetDefaultEncodingDir) (void); /* 341 */ + void (*tcl_SetDefaultEncodingDir) (CONST char *path); /* 342 */ + void (*tcl_AlertNotifier) (ClientData clientData); /* 343 */ + void (*tcl_ServiceModeHook) (int mode); /* 344 */ + int (*tcl_UniCharIsAlnum) (int ch); /* 345 */ + int (*tcl_UniCharIsAlpha) (int ch); /* 346 */ + int (*tcl_UniCharIsDigit) (int ch); /* 347 */ + int (*tcl_UniCharIsLower) (int ch); /* 348 */ + int (*tcl_UniCharIsSpace) (int ch); /* 349 */ + int (*tcl_UniCharIsUpper) (int ch); /* 350 */ + int (*tcl_UniCharIsWordChar) (int ch); /* 351 */ + int (*tcl_UniCharLen) (CONST Tcl_UniChar *uniStr); /* 352 */ + int (*tcl_UniCharNcmp) (CONST Tcl_UniChar *ucs, CONST Tcl_UniChar *uct, unsigned long numChars); /* 353 */ + char * (*tcl_UniCharToUtfDString) (CONST Tcl_UniChar *uniStr, int uniLength, Tcl_DString *dsPtr); /* 354 */ + Tcl_UniChar * (*tcl_UtfToUniCharDString) (CONST char *src, int length, Tcl_DString *dsPtr); /* 355 */ + Tcl_RegExp (*tcl_GetRegExpFromObj) (Tcl_Interp *interp, Tcl_Obj *patObj, int flags); /* 356 */ + Tcl_Obj * (*tcl_EvalTokens) (Tcl_Interp *interp, Tcl_Token *tokenPtr, int count); /* 357 */ + void (*tcl_FreeParse) (Tcl_Parse *parsePtr); /* 358 */ + void (*tcl_LogCommandInfo) (Tcl_Interp *interp, CONST char *script, CONST char *command, int length); /* 359 */ + int (*tcl_ParseBraces) (Tcl_Interp *interp, CONST char *start, int numBytes, Tcl_Parse *parsePtr, int append, CONST84 char **termPtr); /* 360 */ + int (*tcl_ParseCommand) (Tcl_Interp *interp, CONST char *start, int numBytes, int nested, Tcl_Parse *parsePtr); /* 361 */ + int (*tcl_ParseExpr) (Tcl_Interp *interp, CONST char *start, int numBytes, Tcl_Parse *parsePtr); /* 362 */ + int (*tcl_ParseQuotedString) (Tcl_Interp *interp, CONST char *start, int numBytes, Tcl_Parse *parsePtr, int append, CONST84 char **termPtr); /* 363 */ + int (*tcl_ParseVarName) (Tcl_Interp *interp, CONST char *start, int numBytes, Tcl_Parse *parsePtr, int append); /* 364 */ + char * (*tcl_GetCwd) (Tcl_Interp *interp, Tcl_DString *cwdPtr); /* 365 */ + int (*tcl_Chdir) (CONST char *dirName); /* 366 */ + int (*tcl_Access) (CONST char *path, int mode); /* 367 */ + int (*tcl_Stat) (CONST char *path, struct stat *bufPtr); /* 368 */ + int (*tcl_UtfNcmp) (CONST char *s1, CONST char *s2, unsigned long n); /* 369 */ + int (*tcl_UtfNcasecmp) (CONST char *s1, CONST char *s2, unsigned long n); /* 370 */ + int (*tcl_StringCaseMatch) (CONST char *str, CONST char *pattern, int nocase); /* 371 */ + int (*tcl_UniCharIsControl) (int ch); /* 372 */ + int (*tcl_UniCharIsGraph) (int ch); /* 373 */ + int (*tcl_UniCharIsPrint) (int ch); /* 374 */ + int (*tcl_UniCharIsPunct) (int ch); /* 375 */ + int (*tcl_RegExpExecObj) (Tcl_Interp *interp, Tcl_RegExp regexp, Tcl_Obj *textObj, int offset, int nmatches, int flags); /* 376 */ + void (*tcl_RegExpGetInfo) (Tcl_RegExp regexp, Tcl_RegExpInfo *infoPtr); /* 377 */ + Tcl_Obj * (*tcl_NewUnicodeObj) (CONST Tcl_UniChar *unicode, int numChars); /* 378 */ + void (*tcl_SetUnicodeObj) (Tcl_Obj *objPtr, CONST Tcl_UniChar *unicode, int numChars); /* 379 */ + int (*tcl_GetCharLength) (Tcl_Obj *objPtr); /* 380 */ + Tcl_UniChar (*tcl_GetUniChar) (Tcl_Obj *objPtr, int index); /* 381 */ + Tcl_UniChar * (*tcl_GetUnicode) (Tcl_Obj *objPtr); /* 382 */ + Tcl_Obj * (*tcl_GetRange) (Tcl_Obj *objPtr, int first, int last); /* 383 */ + void (*tcl_AppendUnicodeToObj) (Tcl_Obj *objPtr, CONST Tcl_UniChar *unicode, int length); /* 384 */ + int (*tcl_RegExpMatchObj) (Tcl_Interp *interp, Tcl_Obj *textObj, Tcl_Obj *patternObj); /* 385 */ + void (*tcl_SetNotifier) (Tcl_NotifierProcs *notifierProcPtr); /* 386 */ + Tcl_Mutex * (*tcl_GetAllocMutex) (void); /* 387 */ + int (*tcl_GetChannelNames) (Tcl_Interp *interp); /* 388 */ + int (*tcl_GetChannelNamesEx) (Tcl_Interp *interp, CONST char *pattern); /* 389 */ + int (*tcl_ProcObjCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); /* 390 */ + void (*tcl_ConditionFinalize) (Tcl_Condition *condPtr); /* 391 */ + void (*tcl_MutexFinalize) (Tcl_Mutex *mutex); /* 392 */ + int (*tcl_CreateThread) (Tcl_ThreadId *idPtr, Tcl_ThreadCreateProc proc, ClientData clientData, int stackSize, int flags); /* 393 */ + int (*tcl_ReadRaw) (Tcl_Channel chan, char *dst, int bytesToRead); /* 394 */ + int (*tcl_WriteRaw) (Tcl_Channel chan, CONST char *src, int srcLen); /* 395 */ + Tcl_Channel (*tcl_GetTopChannel) (Tcl_Channel chan); /* 396 */ + int (*tcl_ChannelBuffered) (Tcl_Channel chan); /* 397 */ + CONST84_RETURN char * (*tcl_ChannelName) (CONST Tcl_ChannelType *chanTypePtr); /* 398 */ + Tcl_ChannelTypeVersion (*tcl_ChannelVersion) (CONST Tcl_ChannelType *chanTypePtr); /* 399 */ + Tcl_DriverBlockModeProc * (*tcl_ChannelBlockModeProc) (CONST Tcl_ChannelType *chanTypePtr); /* 400 */ + Tcl_DriverCloseProc * (*tcl_ChannelCloseProc) (CONST Tcl_ChannelType *chanTypePtr); /* 401 */ + Tcl_DriverClose2Proc * (*tcl_ChannelClose2Proc) (CONST Tcl_ChannelType *chanTypePtr); /* 402 */ + Tcl_DriverInputProc * (*tcl_ChannelInputProc) (CONST Tcl_ChannelType *chanTypePtr); /* 403 */ + Tcl_DriverOutputProc * (*tcl_ChannelOutputProc) (CONST Tcl_ChannelType *chanTypePtr); /* 404 */ + Tcl_DriverSeekProc * (*tcl_ChannelSeekProc) (CONST Tcl_ChannelType *chanTypePtr); /* 405 */ + Tcl_DriverSetOptionProc * (*tcl_ChannelSetOptionProc) (CONST Tcl_ChannelType *chanTypePtr); /* 406 */ + Tcl_DriverGetOptionProc * (*tcl_ChannelGetOptionProc) (CONST Tcl_ChannelType *chanTypePtr); /* 407 */ + Tcl_DriverWatchProc * (*tcl_ChannelWatchProc) (CONST Tcl_ChannelType *chanTypePtr); /* 408 */ + Tcl_DriverGetHandleProc * (*tcl_ChannelGetHandleProc) (CONST Tcl_ChannelType *chanTypePtr); /* 409 */ + Tcl_DriverFlushProc * (*tcl_ChannelFlushProc) (CONST Tcl_ChannelType *chanTypePtr); /* 410 */ + Tcl_DriverHandlerProc * (*tcl_ChannelHandlerProc) (CONST Tcl_ChannelType *chanTypePtr); /* 411 */ + int (*tcl_JoinThread) (Tcl_ThreadId threadId, int *result); /* 412 */ + int (*tcl_IsChannelShared) (Tcl_Channel channel); /* 413 */ + int (*tcl_IsChannelRegistered) (Tcl_Interp *interp, Tcl_Channel channel); /* 414 */ + void (*tcl_CutChannel) (Tcl_Channel channel); /* 415 */ + void (*tcl_SpliceChannel) (Tcl_Channel channel); /* 416 */ + void (*tcl_ClearChannelHandlers) (Tcl_Channel channel); /* 417 */ + int (*tcl_IsChannelExisting) (CONST char *channelName); /* 418 */ + int (*tcl_UniCharNcasecmp) (CONST Tcl_UniChar *ucs, CONST Tcl_UniChar *uct, unsigned long numChars); /* 419 */ + int (*tcl_UniCharCaseMatch) (CONST Tcl_UniChar *uniStr, CONST Tcl_UniChar *uniPattern, int nocase); /* 420 */ + Tcl_HashEntry * (*tcl_FindHashEntry) (Tcl_HashTable *tablePtr, CONST char *key); /* 421 */ + Tcl_HashEntry * (*tcl_CreateHashEntry) (Tcl_HashTable *tablePtr, CONST char *key, int *newPtr); /* 422 */ + void (*tcl_InitCustomHashTable) (Tcl_HashTable *tablePtr, int keyType, Tcl_HashKeyType *typePtr); /* 423 */ + void (*tcl_InitObjHashTable) (Tcl_HashTable *tablePtr); /* 424 */ + ClientData (*tcl_CommandTraceInfo) (Tcl_Interp *interp, CONST char *varName, int flags, Tcl_CommandTraceProc *procPtr, ClientData prevClientData); /* 425 */ + int (*tcl_TraceCommand) (Tcl_Interp *interp, CONST char *varName, int flags, Tcl_CommandTraceProc *proc, ClientData clientData); /* 426 */ + void (*tcl_UntraceCommand) (Tcl_Interp *interp, CONST char *varName, int flags, Tcl_CommandTraceProc *proc, ClientData clientData); /* 427 */ + char * (*tcl_AttemptAlloc) (unsigned int size); /* 428 */ + char * (*tcl_AttemptDbCkalloc) (unsigned int size, CONST char *file, int line); /* 429 */ + char * (*tcl_AttemptRealloc) (char *ptr, unsigned int size); /* 430 */ + char * (*tcl_AttemptDbCkrealloc) (char *ptr, unsigned int size, CONST char *file, int line); /* 431 */ + int (*tcl_AttemptSetObjLength) (Tcl_Obj *objPtr, int length); /* 432 */ + Tcl_ThreadId (*tcl_GetChannelThread) (Tcl_Channel channel); /* 433 */ + Tcl_UniChar * (*tcl_GetUnicodeFromObj) (Tcl_Obj *objPtr, int *lengthPtr); /* 434 */ + int (*tcl_GetMathFuncInfo) (Tcl_Interp *interp, CONST char *name, int *numArgsPtr, Tcl_ValueType **argTypesPtr, Tcl_MathProc **procPtr, ClientData *clientDataPtr); /* 435 */ + Tcl_Obj * (*tcl_ListMathFuncs) (Tcl_Interp *interp, CONST char *pattern); /* 436 */ + Tcl_Obj * (*tcl_SubstObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int flags); /* 437 */ + int (*tcl_DetachChannel) (Tcl_Interp *interp, Tcl_Channel channel); /* 438 */ + int (*tcl_IsStandardChannel) (Tcl_Channel channel); /* 439 */ + int (*tcl_FSCopyFile) (Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr); /* 440 */ + int (*tcl_FSCopyDirectory) (Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr, Tcl_Obj **errorPtr); /* 441 */ + int (*tcl_FSCreateDirectory) (Tcl_Obj *pathPtr); /* 442 */ + int (*tcl_FSDeleteFile) (Tcl_Obj *pathPtr); /* 443 */ + int (*tcl_FSLoadFile) (Tcl_Interp *interp, Tcl_Obj *pathPtr, CONST char *sym1, CONST char *sym2, Tcl_PackageInitProc **proc1Ptr, Tcl_PackageInitProc **proc2Ptr, Tcl_LoadHandle *handlePtr, Tcl_FSUnloadFileProc **unloadProcPtr); /* 444 */ + int (*tcl_FSMatchInDirectory) (Tcl_Interp *interp, Tcl_Obj *result, Tcl_Obj *pathPtr, CONST char *pattern, Tcl_GlobTypeData *types); /* 445 */ + Tcl_Obj * (*tcl_FSLink) (Tcl_Obj *pathPtr, Tcl_Obj *toPtr, int linkAction); /* 446 */ + int (*tcl_FSRemoveDirectory) (Tcl_Obj *pathPtr, int recursive, Tcl_Obj **errorPtr); /* 447 */ + int (*tcl_FSRenameFile) (Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr); /* 448 */ + int (*tcl_FSLstat) (Tcl_Obj *pathPtr, Tcl_StatBuf *buf); /* 449 */ + int (*tcl_FSUtime) (Tcl_Obj *pathPtr, struct utimbuf *tval); /* 450 */ + int (*tcl_FSFileAttrsGet) (Tcl_Interp *interp, int index, Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef); /* 451 */ + int (*tcl_FSFileAttrsSet) (Tcl_Interp *interp, int index, Tcl_Obj *pathPtr, Tcl_Obj *objPtr); /* 452 */ + CONST char ** (*tcl_FSFileAttrStrings) (Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef); /* 453 */ + int (*tcl_FSStat) (Tcl_Obj *pathPtr, Tcl_StatBuf *buf); /* 454 */ + int (*tcl_FSAccess) (Tcl_Obj *pathPtr, int mode); /* 455 */ + Tcl_Channel (*tcl_FSOpenFileChannel) (Tcl_Interp *interp, Tcl_Obj *pathPtr, CONST char *modeString, int permissions); /* 456 */ + Tcl_Obj * (*tcl_FSGetCwd) (Tcl_Interp *interp); /* 457 */ + int (*tcl_FSChdir) (Tcl_Obj *pathPtr); /* 458 */ + int (*tcl_FSConvertToPathType) (Tcl_Interp *interp, Tcl_Obj *pathPtr); /* 459 */ + Tcl_Obj * (*tcl_FSJoinPath) (Tcl_Obj *listObj, int elements); /* 460 */ + Tcl_Obj * (*tcl_FSSplitPath) (Tcl_Obj *pathPtr, int *lenPtr); /* 461 */ + int (*tcl_FSEqualPaths) (Tcl_Obj *firstPtr, Tcl_Obj *secondPtr); /* 462 */ + Tcl_Obj * (*tcl_FSGetNormalizedPath) (Tcl_Interp *interp, Tcl_Obj *pathPtr); /* 463 */ + Tcl_Obj * (*tcl_FSJoinToPath) (Tcl_Obj *pathPtr, int objc, Tcl_Obj *CONST objv[]); /* 464 */ + ClientData (*tcl_FSGetInternalRep) (Tcl_Obj *pathPtr, Tcl_Filesystem *fsPtr); /* 465 */ + Tcl_Obj * (*tcl_FSGetTranslatedPath) (Tcl_Interp *interp, Tcl_Obj *pathPtr); /* 466 */ + int (*tcl_FSEvalFile) (Tcl_Interp *interp, Tcl_Obj *fileName); /* 467 */ + Tcl_Obj * (*tcl_FSNewNativePath) (Tcl_Filesystem *fromFilesystem, ClientData clientData); /* 468 */ + CONST char * (*tcl_FSGetNativePath) (Tcl_Obj *pathPtr); /* 469 */ + Tcl_Obj * (*tcl_FSFileSystemInfo) (Tcl_Obj *pathPtr); /* 470 */ + Tcl_Obj * (*tcl_FSPathSeparator) (Tcl_Obj *pathPtr); /* 471 */ + Tcl_Obj * (*tcl_FSListVolumes) (void); /* 472 */ + int (*tcl_FSRegister) (ClientData clientData, Tcl_Filesystem *fsPtr); /* 473 */ + int (*tcl_FSUnregister) (Tcl_Filesystem *fsPtr); /* 474 */ + ClientData (*tcl_FSData) (Tcl_Filesystem *fsPtr); /* 475 */ + CONST char * (*tcl_FSGetTranslatedStringPath) (Tcl_Interp *interp, Tcl_Obj *pathPtr); /* 476 */ + Tcl_Filesystem * (*tcl_FSGetFileSystemForPath) (Tcl_Obj *pathPtr); /* 477 */ + Tcl_PathType (*tcl_FSGetPathType) (Tcl_Obj *pathPtr); /* 478 */ + int (*tcl_OutputBuffered) (Tcl_Channel chan); /* 479 */ + void (*tcl_FSMountsChanged) (Tcl_Filesystem *fsPtr); /* 480 */ + int (*tcl_EvalTokensStandard) (Tcl_Interp *interp, Tcl_Token *tokenPtr, int count); /* 481 */ + void (*tcl_GetTime) (Tcl_Time *timeBuf); /* 482 */ + Tcl_Trace (*tcl_CreateObjTrace) (Tcl_Interp *interp, int level, int flags, Tcl_CmdObjTraceProc *objProc, ClientData clientData, Tcl_CmdObjTraceDeleteProc *delProc); /* 483 */ + int (*tcl_GetCommandInfoFromToken) (Tcl_Command token, Tcl_CmdInfo *infoPtr); /* 484 */ + int (*tcl_SetCommandInfoFromToken) (Tcl_Command token, CONST Tcl_CmdInfo *infoPtr); /* 485 */ + Tcl_Obj * (*tcl_DbNewWideIntObj) (Tcl_WideInt wideValue, CONST char *file, int line); /* 486 */ + int (*tcl_GetWideIntFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_WideInt *widePtr); /* 487 */ + Tcl_Obj * (*tcl_NewWideIntObj) (Tcl_WideInt wideValue); /* 488 */ + void (*tcl_SetWideIntObj) (Tcl_Obj *objPtr, Tcl_WideInt wideValue); /* 489 */ + Tcl_StatBuf * (*tcl_AllocStatBuf) (void); /* 490 */ + Tcl_WideInt (*tcl_Seek) (Tcl_Channel chan, Tcl_WideInt offset, int mode); /* 491 */ + Tcl_WideInt (*tcl_Tell) (Tcl_Channel chan); /* 492 */ + Tcl_DriverWideSeekProc * (*tcl_ChannelWideSeekProc) (CONST Tcl_ChannelType *chanTypePtr); /* 493 */ + int (*tcl_DictObjPut) (Tcl_Interp *interp, Tcl_Obj *dictPtr, Tcl_Obj *keyPtr, Tcl_Obj *valuePtr); /* 494 */ + int (*tcl_DictObjGet) (Tcl_Interp *interp, Tcl_Obj *dictPtr, Tcl_Obj *keyPtr, Tcl_Obj **valuePtrPtr); /* 495 */ + int (*tcl_DictObjRemove) (Tcl_Interp *interp, Tcl_Obj *dictPtr, Tcl_Obj *keyPtr); /* 496 */ + int (*tcl_DictObjSize) (Tcl_Interp *interp, Tcl_Obj *dictPtr, int *sizePtr); /* 497 */ + int (*tcl_DictObjFirst) (Tcl_Interp *interp, Tcl_Obj *dictPtr, Tcl_DictSearch *searchPtr, Tcl_Obj **keyPtrPtr, Tcl_Obj **valuePtrPtr, int *donePtr); /* 498 */ + void (*tcl_DictObjNext) (Tcl_DictSearch *searchPtr, Tcl_Obj **keyPtrPtr, Tcl_Obj **valuePtrPtr, int *donePtr); /* 499 */ + void (*tcl_DictObjDone) (Tcl_DictSearch *searchPtr); /* 500 */ + int (*tcl_DictObjPutKeyList) (Tcl_Interp *interp, Tcl_Obj *dictPtr, int keyc, Tcl_Obj *CONST *keyv, Tcl_Obj *valuePtr); /* 501 */ + int (*tcl_DictObjRemoveKeyList) (Tcl_Interp *interp, Tcl_Obj *dictPtr, int keyc, Tcl_Obj *CONST *keyv); /* 502 */ + Tcl_Obj * (*tcl_NewDictObj) (void); /* 503 */ + Tcl_Obj * (*tcl_DbNewDictObj) (CONST char *file, int line); /* 504 */ + void (*tcl_RegisterConfig) (Tcl_Interp *interp, CONST char *pkgName, Tcl_Config *configuration, CONST char *valEncoding); /* 505 */ + Tcl_Namespace * (*tcl_CreateNamespace) (Tcl_Interp *interp, CONST char *name, ClientData clientData, Tcl_NamespaceDeleteProc *deleteProc); /* 506 */ + void (*tcl_DeleteNamespace) (Tcl_Namespace *nsPtr); /* 507 */ + int (*tcl_AppendExportList) (Tcl_Interp *interp, Tcl_Namespace *nsPtr, Tcl_Obj *objPtr); /* 508 */ + int (*tcl_Export) (Tcl_Interp *interp, Tcl_Namespace *nsPtr, CONST char *pattern, int resetListFirst); /* 509 */ + int (*tcl_Import) (Tcl_Interp *interp, Tcl_Namespace *nsPtr, CONST char *pattern, int allowOverwrite); /* 510 */ + int (*tcl_ForgetImport) (Tcl_Interp *interp, Tcl_Namespace *nsPtr, CONST char *pattern); /* 511 */ + Tcl_Namespace * (*tcl_GetCurrentNamespace) (Tcl_Interp *interp); /* 512 */ + Tcl_Namespace * (*tcl_GetGlobalNamespace) (Tcl_Interp *interp); /* 513 */ + Tcl_Namespace * (*tcl_FindNamespace) (Tcl_Interp *interp, CONST char *name, Tcl_Namespace *contextNsPtr, int flags); /* 514 */ + Tcl_Command (*tcl_FindCommand) (Tcl_Interp *interp, CONST char *name, Tcl_Namespace *contextNsPtr, int flags); /* 515 */ + Tcl_Command (*tcl_GetCommandFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr); /* 516 */ + void (*tcl_GetCommandFullName) (Tcl_Interp *interp, Tcl_Command command, Tcl_Obj *objPtr); /* 517 */ + int (*tcl_FSEvalFileEx) (Tcl_Interp *interp, Tcl_Obj *fileName, CONST char *encodingName); /* 518 */ + Tcl_ExitProc * (*tcl_SetExitProc) (Tcl_ExitProc *proc); /* 519 */ + void (*tcl_LimitAddHandler) (Tcl_Interp *interp, int type, Tcl_LimitHandlerProc *handlerProc, ClientData clientData, Tcl_LimitHandlerDeleteProc *deleteProc); /* 520 */ + void (*tcl_LimitRemoveHandler) (Tcl_Interp *interp, int type, Tcl_LimitHandlerProc *handlerProc, ClientData clientData); /* 521 */ + int (*tcl_LimitReady) (Tcl_Interp *interp); /* 522 */ + int (*tcl_LimitCheck) (Tcl_Interp *interp); /* 523 */ + int (*tcl_LimitExceeded) (Tcl_Interp *interp); /* 524 */ + void (*tcl_LimitSetCommands) (Tcl_Interp *interp, int commandLimit); /* 525 */ + void (*tcl_LimitSetTime) (Tcl_Interp *interp, Tcl_Time *timeLimitPtr); /* 526 */ + void (*tcl_LimitSetGranularity) (Tcl_Interp *interp, int type, int granularity); /* 527 */ + int (*tcl_LimitTypeEnabled) (Tcl_Interp *interp, int type); /* 528 */ + int (*tcl_LimitTypeExceeded) (Tcl_Interp *interp, int type); /* 529 */ + void (*tcl_LimitTypeSet) (Tcl_Interp *interp, int type); /* 530 */ + void (*tcl_LimitTypeReset) (Tcl_Interp *interp, int type); /* 531 */ + int (*tcl_LimitGetCommands) (Tcl_Interp *interp); /* 532 */ + void (*tcl_LimitGetTime) (Tcl_Interp *interp, Tcl_Time *timeLimitPtr); /* 533 */ + int (*tcl_LimitGetGranularity) (Tcl_Interp *interp, int type); /* 534 */ + Tcl_InterpState (*tcl_SaveInterpState) (Tcl_Interp *interp, int status); /* 535 */ + int (*tcl_RestoreInterpState) (Tcl_Interp *interp, Tcl_InterpState state); /* 536 */ + void (*tcl_DiscardInterpState) (Tcl_InterpState state); /* 537 */ + int (*tcl_SetReturnOptions) (Tcl_Interp *interp, Tcl_Obj *options); /* 538 */ + Tcl_Obj * (*tcl_GetReturnOptions) (Tcl_Interp *interp, int result); /* 539 */ + int (*tcl_IsEnsemble) (Tcl_Command token); /* 540 */ + Tcl_Command (*tcl_CreateEnsemble) (Tcl_Interp *interp, CONST char *name, Tcl_Namespace *namespacePtr, int flags); /* 541 */ + Tcl_Command (*tcl_FindEnsemble) (Tcl_Interp *interp, Tcl_Obj *cmdNameObj, int flags); /* 542 */ + int (*tcl_SetEnsembleSubcommandList) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj *subcmdList); /* 543 */ + int (*tcl_SetEnsembleMappingDict) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj *mapDict); /* 544 */ + int (*tcl_SetEnsembleUnknownHandler) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj *unknownList); /* 545 */ + int (*tcl_SetEnsembleFlags) (Tcl_Interp *interp, Tcl_Command token, int flags); /* 546 */ + int (*tcl_GetEnsembleSubcommandList) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj **subcmdListPtr); /* 547 */ + int (*tcl_GetEnsembleMappingDict) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj **mapDictPtr); /* 548 */ + int (*tcl_GetEnsembleUnknownHandler) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj **unknownListPtr); /* 549 */ + int (*tcl_GetEnsembleFlags) (Tcl_Interp *interp, Tcl_Command token, int *flagsPtr); /* 550 */ + int (*tcl_GetEnsembleNamespace) (Tcl_Interp *interp, Tcl_Command token, Tcl_Namespace **namespacePtrPtr); /* 551 */ + void (*tcl_SetTimeProc) (Tcl_GetTimeProc *getProc, Tcl_ScaleTimeProc *scaleProc, ClientData clientData); /* 552 */ + void (*tcl_QueryTimeProc) (Tcl_GetTimeProc **getProc, Tcl_ScaleTimeProc **scaleProc, ClientData *clientData); /* 553 */ + Tcl_DriverThreadActionProc * (*tcl_ChannelThreadActionProc) (CONST Tcl_ChannelType *chanTypePtr); /* 554 */ + Tcl_Obj * (*tcl_NewBignumObj) (mp_int *value); /* 555 */ + Tcl_Obj * (*tcl_DbNewBignumObj) (mp_int *value, CONST char *file, int line); /* 556 */ + void (*tcl_SetBignumObj) (Tcl_Obj *obj, mp_int *value); /* 557 */ + int (*tcl_GetBignumFromObj) (Tcl_Interp *interp, Tcl_Obj *obj, mp_int *value); /* 558 */ + int (*tcl_TakeBignumFromObj) (Tcl_Interp *interp, Tcl_Obj *obj, mp_int *value); /* 559 */ + int (*tcl_TruncateChannel) (Tcl_Channel chan, Tcl_WideInt length); /* 560 */ + Tcl_DriverTruncateProc * (*tcl_ChannelTruncateProc) (CONST Tcl_ChannelType *chanTypePtr); /* 561 */ + void (*tcl_SetChannelErrorInterp) (Tcl_Interp *interp, Tcl_Obj *msg); /* 562 */ + void (*tcl_GetChannelErrorInterp) (Tcl_Interp *interp, Tcl_Obj **msg); /* 563 */ + void (*tcl_SetChannelError) (Tcl_Channel chan, Tcl_Obj *msg); /* 564 */ + void (*tcl_GetChannelError) (Tcl_Channel chan, Tcl_Obj **msg); /* 565 */ + int (*tcl_InitBignumFromDouble) (Tcl_Interp *interp, double initval, mp_int *toInit); /* 566 */ + Tcl_Obj * (*tcl_GetNamespaceUnknownHandler) (Tcl_Interp *interp, Tcl_Namespace *nsPtr); /* 567 */ + int (*tcl_SetNamespaceUnknownHandler) (Tcl_Interp *interp, Tcl_Namespace *nsPtr, Tcl_Obj *handlerPtr); /* 568 */ + int (*tcl_GetEncodingFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Encoding *encodingPtr); /* 569 */ + Tcl_Obj * (*tcl_GetEncodingSearchPath) (void); /* 570 */ + int (*tcl_SetEncodingSearchPath) (Tcl_Obj *searchPath); /* 571 */ + CONST char * (*tcl_GetEncodingNameFromEnvironment) (Tcl_DString *bufPtr); /* 572 */ + int (*tcl_PkgRequireProc) (Tcl_Interp *interp, CONST char *name, int objc, Tcl_Obj *CONST objv[], ClientData *clientDataPtr); /* 573 */ + void (*tcl_AppendObjToErrorInfo) (Tcl_Interp *interp, Tcl_Obj *objPtr); /* 574 */ + void (*tcl_AppendLimitedToObj) (Tcl_Obj *objPtr, CONST char *bytes, int length, int limit, CONST char *ellipsis); /* 575 */ + Tcl_Obj * (*tcl_Format) (Tcl_Interp *interp, CONST char *format, int objc, Tcl_Obj *CONST objv[]); /* 576 */ + int (*tcl_AppendFormatToObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, CONST char *format, int objc, Tcl_Obj *CONST objv[]); /* 577 */ + Tcl_Obj * (*tcl_ObjPrintf) (CONST char *format, ...); /* 578 */ + void (*tcl_AppendPrintfToObj) (Tcl_Obj *objPtr, CONST char *format, ...); /* 579 */ + VOID *reserved580; + VOID *reserved581; + VOID *reserved582; + VOID *reserved583; + VOID *reserved584; + VOID *reserved585; + VOID *reserved586; + VOID *reserved587; + VOID *reserved588; + VOID *reserved589; + VOID *reserved590; + VOID *reserved591; + VOID *reserved592; + VOID *reserved593; + VOID *reserved594; + VOID *reserved595; + VOID *reserved596; + VOID *reserved597; + VOID *reserved598; + VOID *reserved599; + VOID *reserved600; + VOID *reserved601; + VOID *reserved602; + VOID *reserved603; + VOID *reserved604; + VOID *reserved605; + VOID *reserved606; + VOID *reserved607; + VOID *reserved608; + VOID *reserved609; + VOID *reserved610; + VOID *reserved611; + VOID *reserved612; + VOID *reserved613; + VOID *reserved614; + VOID *reserved615; + VOID *reserved616; + VOID *reserved617; + VOID *reserved618; + VOID *reserved619; + VOID *reserved620; + VOID *reserved621; + VOID *reserved622; + VOID *reserved623; + VOID *reserved624; + VOID *reserved625; + VOID *reserved626; + VOID *reserved627; + VOID *reserved628; + VOID *reserved629; + void (*tclUnusedStubEntry) (void); /* 630 */ +} TclStubs; + +#ifdef __cplusplus +extern "C" { +#endif +extern TclStubs *tclStubsPtr; +#ifdef __cplusplus +} +#endif + +#if defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) + +/* + * Inline function declarations: + */ + +#ifndef Tcl_PkgProvideEx +#define Tcl_PkgProvideEx \ + (tclStubsPtr->tcl_PkgProvideEx) /* 0 */ +#endif +#ifndef Tcl_PkgRequireEx +#define Tcl_PkgRequireEx \ + (tclStubsPtr->tcl_PkgRequireEx) /* 1 */ +#endif +#ifndef Tcl_Panic +#define Tcl_Panic \ + (tclStubsPtr->tcl_Panic) /* 2 */ +#endif +#ifndef Tcl_Alloc +#define Tcl_Alloc \ + (tclStubsPtr->tcl_Alloc) /* 3 */ +#endif +#ifndef Tcl_Free +#define Tcl_Free \ + (tclStubsPtr->tcl_Free) /* 4 */ +#endif +#ifndef Tcl_Realloc +#define Tcl_Realloc \ + (tclStubsPtr->tcl_Realloc) /* 5 */ +#endif +#ifndef Tcl_DbCkalloc +#define Tcl_DbCkalloc \ + (tclStubsPtr->tcl_DbCkalloc) /* 6 */ +#endif +#ifndef Tcl_DbCkfree +#define Tcl_DbCkfree \ + (tclStubsPtr->tcl_DbCkfree) /* 7 */ +#endif +#ifndef Tcl_DbCkrealloc +#define Tcl_DbCkrealloc \ + (tclStubsPtr->tcl_DbCkrealloc) /* 8 */ +#endif +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ +#ifndef Tcl_CreateFileHandler +#define Tcl_CreateFileHandler \ + (tclStubsPtr->tcl_CreateFileHandler) /* 9 */ +#endif +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#ifndef Tcl_CreateFileHandler +#define Tcl_CreateFileHandler \ + (tclStubsPtr->tcl_CreateFileHandler) /* 9 */ +#endif +#endif /* MACOSX */ +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ +#ifndef Tcl_DeleteFileHandler +#define Tcl_DeleteFileHandler \ + (tclStubsPtr->tcl_DeleteFileHandler) /* 10 */ +#endif +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#ifndef Tcl_DeleteFileHandler +#define Tcl_DeleteFileHandler \ + (tclStubsPtr->tcl_DeleteFileHandler) /* 10 */ +#endif +#endif /* MACOSX */ +#ifndef Tcl_SetTimer +#define Tcl_SetTimer \ + (tclStubsPtr->tcl_SetTimer) /* 11 */ +#endif +#ifndef Tcl_Sleep +#define Tcl_Sleep \ + (tclStubsPtr->tcl_Sleep) /* 12 */ +#endif +#ifndef Tcl_WaitForEvent +#define Tcl_WaitForEvent \ + (tclStubsPtr->tcl_WaitForEvent) /* 13 */ +#endif +#ifndef Tcl_AppendAllObjTypes +#define Tcl_AppendAllObjTypes \ + (tclStubsPtr->tcl_AppendAllObjTypes) /* 14 */ +#endif +#ifndef Tcl_AppendStringsToObj +#define Tcl_AppendStringsToObj \ + (tclStubsPtr->tcl_AppendStringsToObj) /* 15 */ +#endif +#ifndef Tcl_AppendToObj +#define Tcl_AppendToObj \ + (tclStubsPtr->tcl_AppendToObj) /* 16 */ +#endif +#ifndef Tcl_ConcatObj +#define Tcl_ConcatObj \ + (tclStubsPtr->tcl_ConcatObj) /* 17 */ +#endif +#ifndef Tcl_ConvertToType +#define Tcl_ConvertToType \ + (tclStubsPtr->tcl_ConvertToType) /* 18 */ +#endif +#ifndef Tcl_DbDecrRefCount +#define Tcl_DbDecrRefCount \ + (tclStubsPtr->tcl_DbDecrRefCount) /* 19 */ +#endif +#ifndef Tcl_DbIncrRefCount +#define Tcl_DbIncrRefCount \ + (tclStubsPtr->tcl_DbIncrRefCount) /* 20 */ +#endif +#ifndef Tcl_DbIsShared +#define Tcl_DbIsShared \ + (tclStubsPtr->tcl_DbIsShared) /* 21 */ +#endif +#ifndef Tcl_DbNewBooleanObj +#define Tcl_DbNewBooleanObj \ + (tclStubsPtr->tcl_DbNewBooleanObj) /* 22 */ +#endif +#ifndef Tcl_DbNewByteArrayObj +#define Tcl_DbNewByteArrayObj \ + (tclStubsPtr->tcl_DbNewByteArrayObj) /* 23 */ +#endif +#ifndef Tcl_DbNewDoubleObj +#define Tcl_DbNewDoubleObj \ + (tclStubsPtr->tcl_DbNewDoubleObj) /* 24 */ +#endif +#ifndef Tcl_DbNewListObj +#define Tcl_DbNewListObj \ + (tclStubsPtr->tcl_DbNewListObj) /* 25 */ +#endif +#ifndef Tcl_DbNewLongObj +#define Tcl_DbNewLongObj \ + (tclStubsPtr->tcl_DbNewLongObj) /* 26 */ +#endif +#ifndef Tcl_DbNewObj +#define Tcl_DbNewObj \ + (tclStubsPtr->tcl_DbNewObj) /* 27 */ +#endif +#ifndef Tcl_DbNewStringObj +#define Tcl_DbNewStringObj \ + (tclStubsPtr->tcl_DbNewStringObj) /* 28 */ +#endif +#ifndef Tcl_DuplicateObj +#define Tcl_DuplicateObj \ + (tclStubsPtr->tcl_DuplicateObj) /* 29 */ +#endif +#ifndef TclFreeObj +#define TclFreeObj \ + (tclStubsPtr->tclFreeObj) /* 30 */ +#endif +#ifndef Tcl_GetBoolean +#define Tcl_GetBoolean \ + (tclStubsPtr->tcl_GetBoolean) /* 31 */ +#endif +#ifndef Tcl_GetBooleanFromObj +#define Tcl_GetBooleanFromObj \ + (tclStubsPtr->tcl_GetBooleanFromObj) /* 32 */ +#endif +#ifndef Tcl_GetByteArrayFromObj +#define Tcl_GetByteArrayFromObj \ + (tclStubsPtr->tcl_GetByteArrayFromObj) /* 33 */ +#endif +#ifndef Tcl_GetDouble +#define Tcl_GetDouble \ + (tclStubsPtr->tcl_GetDouble) /* 34 */ +#endif +#ifndef Tcl_GetDoubleFromObj +#define Tcl_GetDoubleFromObj \ + (tclStubsPtr->tcl_GetDoubleFromObj) /* 35 */ +#endif +#ifndef Tcl_GetIndexFromObj +#define Tcl_GetIndexFromObj \ + (tclStubsPtr->tcl_GetIndexFromObj) /* 36 */ +#endif +#ifndef Tcl_GetInt +#define Tcl_GetInt \ + (tclStubsPtr->tcl_GetInt) /* 37 */ +#endif +#ifndef Tcl_GetIntFromObj +#define Tcl_GetIntFromObj \ + (tclStubsPtr->tcl_GetIntFromObj) /* 38 */ +#endif +#ifndef Tcl_GetLongFromObj +#define Tcl_GetLongFromObj \ + (tclStubsPtr->tcl_GetLongFromObj) /* 39 */ +#endif +#ifndef Tcl_GetObjType +#define Tcl_GetObjType \ + (tclStubsPtr->tcl_GetObjType) /* 40 */ +#endif +#ifndef Tcl_GetStringFromObj +#define Tcl_GetStringFromObj \ + (tclStubsPtr->tcl_GetStringFromObj) /* 41 */ +#endif +#ifndef Tcl_InvalidateStringRep +#define Tcl_InvalidateStringRep \ + (tclStubsPtr->tcl_InvalidateStringRep) /* 42 */ +#endif +#ifndef Tcl_ListObjAppendList +#define Tcl_ListObjAppendList \ + (tclStubsPtr->tcl_ListObjAppendList) /* 43 */ +#endif +#ifndef Tcl_ListObjAppendElement +#define Tcl_ListObjAppendElement \ + (tclStubsPtr->tcl_ListObjAppendElement) /* 44 */ +#endif +#ifndef Tcl_ListObjGetElements +#define Tcl_ListObjGetElements \ + (tclStubsPtr->tcl_ListObjGetElements) /* 45 */ +#endif +#ifndef Tcl_ListObjIndex +#define Tcl_ListObjIndex \ + (tclStubsPtr->tcl_ListObjIndex) /* 46 */ +#endif +#ifndef Tcl_ListObjLength +#define Tcl_ListObjLength \ + (tclStubsPtr->tcl_ListObjLength) /* 47 */ +#endif +#ifndef Tcl_ListObjReplace +#define Tcl_ListObjReplace \ + (tclStubsPtr->tcl_ListObjReplace) /* 48 */ +#endif +#ifndef Tcl_NewBooleanObj +#define Tcl_NewBooleanObj \ + (tclStubsPtr->tcl_NewBooleanObj) /* 49 */ +#endif +#ifndef Tcl_NewByteArrayObj +#define Tcl_NewByteArrayObj \ + (tclStubsPtr->tcl_NewByteArrayObj) /* 50 */ +#endif +#ifndef Tcl_NewDoubleObj +#define Tcl_NewDoubleObj \ + (tclStubsPtr->tcl_NewDoubleObj) /* 51 */ +#endif +#ifndef Tcl_NewIntObj +#define Tcl_NewIntObj \ + (tclStubsPtr->tcl_NewIntObj) /* 52 */ +#endif +#ifndef Tcl_NewListObj +#define Tcl_NewListObj \ + (tclStubsPtr->tcl_NewListObj) /* 53 */ +#endif +#ifndef Tcl_NewLongObj +#define Tcl_NewLongObj \ + (tclStubsPtr->tcl_NewLongObj) /* 54 */ +#endif +#ifndef Tcl_NewObj +#define Tcl_NewObj \ + (tclStubsPtr->tcl_NewObj) /* 55 */ +#endif +#ifndef Tcl_NewStringObj +#define Tcl_NewStringObj \ + (tclStubsPtr->tcl_NewStringObj) /* 56 */ +#endif +#ifndef Tcl_SetBooleanObj +#define Tcl_SetBooleanObj \ + (tclStubsPtr->tcl_SetBooleanObj) /* 57 */ +#endif +#ifndef Tcl_SetByteArrayLength +#define Tcl_SetByteArrayLength \ + (tclStubsPtr->tcl_SetByteArrayLength) /* 58 */ +#endif +#ifndef Tcl_SetByteArrayObj +#define Tcl_SetByteArrayObj \ + (tclStubsPtr->tcl_SetByteArrayObj) /* 59 */ +#endif +#ifndef Tcl_SetDoubleObj +#define Tcl_SetDoubleObj \ + (tclStubsPtr->tcl_SetDoubleObj) /* 60 */ +#endif +#ifndef Tcl_SetIntObj +#define Tcl_SetIntObj \ + (tclStubsPtr->tcl_SetIntObj) /* 61 */ +#endif +#ifndef Tcl_SetListObj +#define Tcl_SetListObj \ + (tclStubsPtr->tcl_SetListObj) /* 62 */ +#endif +#ifndef Tcl_SetLongObj +#define Tcl_SetLongObj \ + (tclStubsPtr->tcl_SetLongObj) /* 63 */ +#endif +#ifndef Tcl_SetObjLength +#define Tcl_SetObjLength \ + (tclStubsPtr->tcl_SetObjLength) /* 64 */ +#endif +#ifndef Tcl_SetStringObj +#define Tcl_SetStringObj \ + (tclStubsPtr->tcl_SetStringObj) /* 65 */ +#endif +#ifndef Tcl_AddErrorInfo +#define Tcl_AddErrorInfo \ + (tclStubsPtr->tcl_AddErrorInfo) /* 66 */ +#endif +#ifndef Tcl_AddObjErrorInfo +#define Tcl_AddObjErrorInfo \ + (tclStubsPtr->tcl_AddObjErrorInfo) /* 67 */ +#endif +#ifndef Tcl_AllowExceptions +#define Tcl_AllowExceptions \ + (tclStubsPtr->tcl_AllowExceptions) /* 68 */ +#endif +#ifndef Tcl_AppendElement +#define Tcl_AppendElement \ + (tclStubsPtr->tcl_AppendElement) /* 69 */ +#endif +#ifndef Tcl_AppendResult +#define Tcl_AppendResult \ + (tclStubsPtr->tcl_AppendResult) /* 70 */ +#endif +#ifndef Tcl_AsyncCreate +#define Tcl_AsyncCreate \ + (tclStubsPtr->tcl_AsyncCreate) /* 71 */ +#endif +#ifndef Tcl_AsyncDelete +#define Tcl_AsyncDelete \ + (tclStubsPtr->tcl_AsyncDelete) /* 72 */ +#endif +#ifndef Tcl_AsyncInvoke +#define Tcl_AsyncInvoke \ + (tclStubsPtr->tcl_AsyncInvoke) /* 73 */ +#endif +#ifndef Tcl_AsyncMark +#define Tcl_AsyncMark \ + (tclStubsPtr->tcl_AsyncMark) /* 74 */ +#endif +#ifndef Tcl_AsyncReady +#define Tcl_AsyncReady \ + (tclStubsPtr->tcl_AsyncReady) /* 75 */ +#endif +#ifndef Tcl_BackgroundError +#define Tcl_BackgroundError \ + (tclStubsPtr->tcl_BackgroundError) /* 76 */ +#endif +#ifndef Tcl_Backslash +#define Tcl_Backslash \ + (tclStubsPtr->tcl_Backslash) /* 77 */ +#endif +#ifndef Tcl_BadChannelOption +#define Tcl_BadChannelOption \ + (tclStubsPtr->tcl_BadChannelOption) /* 78 */ +#endif +#ifndef Tcl_CallWhenDeleted +#define Tcl_CallWhenDeleted \ + (tclStubsPtr->tcl_CallWhenDeleted) /* 79 */ +#endif +#ifndef Tcl_CancelIdleCall +#define Tcl_CancelIdleCall \ + (tclStubsPtr->tcl_CancelIdleCall) /* 80 */ +#endif +#ifndef Tcl_Close +#define Tcl_Close \ + (tclStubsPtr->tcl_Close) /* 81 */ +#endif +#ifndef Tcl_CommandComplete +#define Tcl_CommandComplete \ + (tclStubsPtr->tcl_CommandComplete) /* 82 */ +#endif +#ifndef Tcl_Concat +#define Tcl_Concat \ + (tclStubsPtr->tcl_Concat) /* 83 */ +#endif +#ifndef Tcl_ConvertElement +#define Tcl_ConvertElement \ + (tclStubsPtr->tcl_ConvertElement) /* 84 */ +#endif +#ifndef Tcl_ConvertCountedElement +#define Tcl_ConvertCountedElement \ + (tclStubsPtr->tcl_ConvertCountedElement) /* 85 */ +#endif +#ifndef Tcl_CreateAlias +#define Tcl_CreateAlias \ + (tclStubsPtr->tcl_CreateAlias) /* 86 */ +#endif +#ifndef Tcl_CreateAliasObj +#define Tcl_CreateAliasObj \ + (tclStubsPtr->tcl_CreateAliasObj) /* 87 */ +#endif +#ifndef Tcl_CreateChannel +#define Tcl_CreateChannel \ + (tclStubsPtr->tcl_CreateChannel) /* 88 */ +#endif +#ifndef Tcl_CreateChannelHandler +#define Tcl_CreateChannelHandler \ + (tclStubsPtr->tcl_CreateChannelHandler) /* 89 */ +#endif +#ifndef Tcl_CreateCloseHandler +#define Tcl_CreateCloseHandler \ + (tclStubsPtr->tcl_CreateCloseHandler) /* 90 */ +#endif +#ifndef Tcl_CreateCommand +#define Tcl_CreateCommand \ + (tclStubsPtr->tcl_CreateCommand) /* 91 */ +#endif +#ifndef Tcl_CreateEventSource +#define Tcl_CreateEventSource \ + (tclStubsPtr->tcl_CreateEventSource) /* 92 */ +#endif +#ifndef Tcl_CreateExitHandler +#define Tcl_CreateExitHandler \ + (tclStubsPtr->tcl_CreateExitHandler) /* 93 */ +#endif +#ifndef Tcl_CreateInterp +#define Tcl_CreateInterp \ + (tclStubsPtr->tcl_CreateInterp) /* 94 */ +#endif +#ifndef Tcl_CreateMathFunc +#define Tcl_CreateMathFunc \ + (tclStubsPtr->tcl_CreateMathFunc) /* 95 */ +#endif +#ifndef Tcl_CreateObjCommand +#define Tcl_CreateObjCommand \ + (tclStubsPtr->tcl_CreateObjCommand) /* 96 */ +#endif +#ifndef Tcl_CreateSlave +#define Tcl_CreateSlave \ + (tclStubsPtr->tcl_CreateSlave) /* 97 */ +#endif +#ifndef Tcl_CreateTimerHandler +#define Tcl_CreateTimerHandler \ + (tclStubsPtr->tcl_CreateTimerHandler) /* 98 */ +#endif +#ifndef Tcl_CreateTrace +#define Tcl_CreateTrace \ + (tclStubsPtr->tcl_CreateTrace) /* 99 */ +#endif +#ifndef Tcl_DeleteAssocData +#define Tcl_DeleteAssocData \ + (tclStubsPtr->tcl_DeleteAssocData) /* 100 */ +#endif +#ifndef Tcl_DeleteChannelHandler +#define Tcl_DeleteChannelHandler \ + (tclStubsPtr->tcl_DeleteChannelHandler) /* 101 */ +#endif +#ifndef Tcl_DeleteCloseHandler +#define Tcl_DeleteCloseHandler \ + (tclStubsPtr->tcl_DeleteCloseHandler) /* 102 */ +#endif +#ifndef Tcl_DeleteCommand +#define Tcl_DeleteCommand \ + (tclStubsPtr->tcl_DeleteCommand) /* 103 */ +#endif +#ifndef Tcl_DeleteCommandFromToken +#define Tcl_DeleteCommandFromToken \ + (tclStubsPtr->tcl_DeleteCommandFromToken) /* 104 */ +#endif +#ifndef Tcl_DeleteEvents +#define Tcl_DeleteEvents \ + (tclStubsPtr->tcl_DeleteEvents) /* 105 */ +#endif +#ifndef Tcl_DeleteEventSource +#define Tcl_DeleteEventSource \ + (tclStubsPtr->tcl_DeleteEventSource) /* 106 */ +#endif +#ifndef Tcl_DeleteExitHandler +#define Tcl_DeleteExitHandler \ + (tclStubsPtr->tcl_DeleteExitHandler) /* 107 */ +#endif +#ifndef Tcl_DeleteHashEntry +#define Tcl_DeleteHashEntry \ + (tclStubsPtr->tcl_DeleteHashEntry) /* 108 */ +#endif +#ifndef Tcl_DeleteHashTable +#define Tcl_DeleteHashTable \ + (tclStubsPtr->tcl_DeleteHashTable) /* 109 */ +#endif +#ifndef Tcl_DeleteInterp +#define Tcl_DeleteInterp \ + (tclStubsPtr->tcl_DeleteInterp) /* 110 */ +#endif +#ifndef Tcl_DetachPids +#define Tcl_DetachPids \ + (tclStubsPtr->tcl_DetachPids) /* 111 */ +#endif +#ifndef Tcl_DeleteTimerHandler +#define Tcl_DeleteTimerHandler \ + (tclStubsPtr->tcl_DeleteTimerHandler) /* 112 */ +#endif +#ifndef Tcl_DeleteTrace +#define Tcl_DeleteTrace \ + (tclStubsPtr->tcl_DeleteTrace) /* 113 */ +#endif +#ifndef Tcl_DontCallWhenDeleted +#define Tcl_DontCallWhenDeleted \ + (tclStubsPtr->tcl_DontCallWhenDeleted) /* 114 */ +#endif +#ifndef Tcl_DoOneEvent +#define Tcl_DoOneEvent \ + (tclStubsPtr->tcl_DoOneEvent) /* 115 */ +#endif +#ifndef Tcl_DoWhenIdle +#define Tcl_DoWhenIdle \ + (tclStubsPtr->tcl_DoWhenIdle) /* 116 */ +#endif +#ifndef Tcl_DStringAppend +#define Tcl_DStringAppend \ + (tclStubsPtr->tcl_DStringAppend) /* 117 */ +#endif +#ifndef Tcl_DStringAppendElement +#define Tcl_DStringAppendElement \ + (tclStubsPtr->tcl_DStringAppendElement) /* 118 */ +#endif +#ifndef Tcl_DStringEndSublist +#define Tcl_DStringEndSublist \ + (tclStubsPtr->tcl_DStringEndSublist) /* 119 */ +#endif +#ifndef Tcl_DStringFree +#define Tcl_DStringFree \ + (tclStubsPtr->tcl_DStringFree) /* 120 */ +#endif +#ifndef Tcl_DStringGetResult +#define Tcl_DStringGetResult \ + (tclStubsPtr->tcl_DStringGetResult) /* 121 */ +#endif +#ifndef Tcl_DStringInit +#define Tcl_DStringInit \ + (tclStubsPtr->tcl_DStringInit) /* 122 */ +#endif +#ifndef Tcl_DStringResult +#define Tcl_DStringResult \ + (tclStubsPtr->tcl_DStringResult) /* 123 */ +#endif +#ifndef Tcl_DStringSetLength +#define Tcl_DStringSetLength \ + (tclStubsPtr->tcl_DStringSetLength) /* 124 */ +#endif +#ifndef Tcl_DStringStartSublist +#define Tcl_DStringStartSublist \ + (tclStubsPtr->tcl_DStringStartSublist) /* 125 */ +#endif +#ifndef Tcl_Eof +#define Tcl_Eof \ + (tclStubsPtr->tcl_Eof) /* 126 */ +#endif +#ifndef Tcl_ErrnoId +#define Tcl_ErrnoId \ + (tclStubsPtr->tcl_ErrnoId) /* 127 */ +#endif +#ifndef Tcl_ErrnoMsg +#define Tcl_ErrnoMsg \ + (tclStubsPtr->tcl_ErrnoMsg) /* 128 */ +#endif +#ifndef Tcl_Eval +#define Tcl_Eval \ + (tclStubsPtr->tcl_Eval) /* 129 */ +#endif +#ifndef Tcl_EvalFile +#define Tcl_EvalFile \ + (tclStubsPtr->tcl_EvalFile) /* 130 */ +#endif +#ifndef Tcl_EvalObj +#define Tcl_EvalObj \ + (tclStubsPtr->tcl_EvalObj) /* 131 */ +#endif +#ifndef Tcl_EventuallyFree +#define Tcl_EventuallyFree \ + (tclStubsPtr->tcl_EventuallyFree) /* 132 */ +#endif +#ifndef Tcl_Exit +#define Tcl_Exit \ + (tclStubsPtr->tcl_Exit) /* 133 */ +#endif +#ifndef Tcl_ExposeCommand +#define Tcl_ExposeCommand \ + (tclStubsPtr->tcl_ExposeCommand) /* 134 */ +#endif +#ifndef Tcl_ExprBoolean +#define Tcl_ExprBoolean \ + (tclStubsPtr->tcl_ExprBoolean) /* 135 */ +#endif +#ifndef Tcl_ExprBooleanObj +#define Tcl_ExprBooleanObj \ + (tclStubsPtr->tcl_ExprBooleanObj) /* 136 */ +#endif +#ifndef Tcl_ExprDouble +#define Tcl_ExprDouble \ + (tclStubsPtr->tcl_ExprDouble) /* 137 */ +#endif +#ifndef Tcl_ExprDoubleObj +#define Tcl_ExprDoubleObj \ + (tclStubsPtr->tcl_ExprDoubleObj) /* 138 */ +#endif +#ifndef Tcl_ExprLong +#define Tcl_ExprLong \ + (tclStubsPtr->tcl_ExprLong) /* 139 */ +#endif +#ifndef Tcl_ExprLongObj +#define Tcl_ExprLongObj \ + (tclStubsPtr->tcl_ExprLongObj) /* 140 */ +#endif +#ifndef Tcl_ExprObj +#define Tcl_ExprObj \ + (tclStubsPtr->tcl_ExprObj) /* 141 */ +#endif +#ifndef Tcl_ExprString +#define Tcl_ExprString \ + (tclStubsPtr->tcl_ExprString) /* 142 */ +#endif +#ifndef Tcl_Finalize +#define Tcl_Finalize \ + (tclStubsPtr->tcl_Finalize) /* 143 */ +#endif +#ifndef Tcl_FindExecutable +#define Tcl_FindExecutable \ + (tclStubsPtr->tcl_FindExecutable) /* 144 */ +#endif +#ifndef Tcl_FirstHashEntry +#define Tcl_FirstHashEntry \ + (tclStubsPtr->tcl_FirstHashEntry) /* 145 */ +#endif +#ifndef Tcl_Flush +#define Tcl_Flush \ + (tclStubsPtr->tcl_Flush) /* 146 */ +#endif +#ifndef Tcl_FreeResult +#define Tcl_FreeResult \ + (tclStubsPtr->tcl_FreeResult) /* 147 */ +#endif +#ifndef Tcl_GetAlias +#define Tcl_GetAlias \ + (tclStubsPtr->tcl_GetAlias) /* 148 */ +#endif +#ifndef Tcl_GetAliasObj +#define Tcl_GetAliasObj \ + (tclStubsPtr->tcl_GetAliasObj) /* 149 */ +#endif +#ifndef Tcl_GetAssocData +#define Tcl_GetAssocData \ + (tclStubsPtr->tcl_GetAssocData) /* 150 */ +#endif +#ifndef Tcl_GetChannel +#define Tcl_GetChannel \ + (tclStubsPtr->tcl_GetChannel) /* 151 */ +#endif +#ifndef Tcl_GetChannelBufferSize +#define Tcl_GetChannelBufferSize \ + (tclStubsPtr->tcl_GetChannelBufferSize) /* 152 */ +#endif +#ifndef Tcl_GetChannelHandle +#define Tcl_GetChannelHandle \ + (tclStubsPtr->tcl_GetChannelHandle) /* 153 */ +#endif +#ifndef Tcl_GetChannelInstanceData +#define Tcl_GetChannelInstanceData \ + (tclStubsPtr->tcl_GetChannelInstanceData) /* 154 */ +#endif +#ifndef Tcl_GetChannelMode +#define Tcl_GetChannelMode \ + (tclStubsPtr->tcl_GetChannelMode) /* 155 */ +#endif +#ifndef Tcl_GetChannelName +#define Tcl_GetChannelName \ + (tclStubsPtr->tcl_GetChannelName) /* 156 */ +#endif +#ifndef Tcl_GetChannelOption +#define Tcl_GetChannelOption \ + (tclStubsPtr->tcl_GetChannelOption) /* 157 */ +#endif +#ifndef Tcl_GetChannelType +#define Tcl_GetChannelType \ + (tclStubsPtr->tcl_GetChannelType) /* 158 */ +#endif +#ifndef Tcl_GetCommandInfo +#define Tcl_GetCommandInfo \ + (tclStubsPtr->tcl_GetCommandInfo) /* 159 */ +#endif +#ifndef Tcl_GetCommandName +#define Tcl_GetCommandName \ + (tclStubsPtr->tcl_GetCommandName) /* 160 */ +#endif +#ifndef Tcl_GetErrno +#define Tcl_GetErrno \ + (tclStubsPtr->tcl_GetErrno) /* 161 */ +#endif +#ifndef Tcl_GetHostName +#define Tcl_GetHostName \ + (tclStubsPtr->tcl_GetHostName) /* 162 */ +#endif +#ifndef Tcl_GetInterpPath +#define Tcl_GetInterpPath \ + (tclStubsPtr->tcl_GetInterpPath) /* 163 */ +#endif +#ifndef Tcl_GetMaster +#define Tcl_GetMaster \ + (tclStubsPtr->tcl_GetMaster) /* 164 */ +#endif +#ifndef Tcl_GetNameOfExecutable +#define Tcl_GetNameOfExecutable \ + (tclStubsPtr->tcl_GetNameOfExecutable) /* 165 */ +#endif +#ifndef Tcl_GetObjResult +#define Tcl_GetObjResult \ + (tclStubsPtr->tcl_GetObjResult) /* 166 */ +#endif +#if !defined(__WIN32__) && !defined(MAC_OSX_TCL) /* UNIX */ +#ifndef Tcl_GetOpenFile +#define Tcl_GetOpenFile \ + (tclStubsPtr->tcl_GetOpenFile) /* 167 */ +#endif +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#ifndef Tcl_GetOpenFile +#define Tcl_GetOpenFile \ + (tclStubsPtr->tcl_GetOpenFile) /* 167 */ +#endif +#endif /* MACOSX */ +#ifndef Tcl_GetPathType +#define Tcl_GetPathType \ + (tclStubsPtr->tcl_GetPathType) /* 168 */ +#endif +#ifndef Tcl_Gets +#define Tcl_Gets \ + (tclStubsPtr->tcl_Gets) /* 169 */ +#endif +#ifndef Tcl_GetsObj +#define Tcl_GetsObj \ + (tclStubsPtr->tcl_GetsObj) /* 170 */ +#endif +#ifndef Tcl_GetServiceMode +#define Tcl_GetServiceMode \ + (tclStubsPtr->tcl_GetServiceMode) /* 171 */ +#endif +#ifndef Tcl_GetSlave +#define Tcl_GetSlave \ + (tclStubsPtr->tcl_GetSlave) /* 172 */ +#endif +#ifndef Tcl_GetStdChannel +#define Tcl_GetStdChannel \ + (tclStubsPtr->tcl_GetStdChannel) /* 173 */ +#endif +#ifndef Tcl_GetStringResult +#define Tcl_GetStringResult \ + (tclStubsPtr->tcl_GetStringResult) /* 174 */ +#endif +#ifndef Tcl_GetVar +#define Tcl_GetVar \ + (tclStubsPtr->tcl_GetVar) /* 175 */ +#endif +#ifndef Tcl_GetVar2 +#define Tcl_GetVar2 \ + (tclStubsPtr->tcl_GetVar2) /* 176 */ +#endif +#ifndef Tcl_GlobalEval +#define Tcl_GlobalEval \ + (tclStubsPtr->tcl_GlobalEval) /* 177 */ +#endif +#ifndef Tcl_GlobalEvalObj +#define Tcl_GlobalEvalObj \ + (tclStubsPtr->tcl_GlobalEvalObj) /* 178 */ +#endif +#ifndef Tcl_HideCommand +#define Tcl_HideCommand \ + (tclStubsPtr->tcl_HideCommand) /* 179 */ +#endif +#ifndef Tcl_Init +#define Tcl_Init \ + (tclStubsPtr->tcl_Init) /* 180 */ +#endif +#ifndef Tcl_InitHashTable +#define Tcl_InitHashTable \ + (tclStubsPtr->tcl_InitHashTable) /* 181 */ +#endif +#ifndef Tcl_InputBlocked +#define Tcl_InputBlocked \ + (tclStubsPtr->tcl_InputBlocked) /* 182 */ +#endif +#ifndef Tcl_InputBuffered +#define Tcl_InputBuffered \ + (tclStubsPtr->tcl_InputBuffered) /* 183 */ +#endif +#ifndef Tcl_InterpDeleted +#define Tcl_InterpDeleted \ + (tclStubsPtr->tcl_InterpDeleted) /* 184 */ +#endif +#ifndef Tcl_IsSafe +#define Tcl_IsSafe \ + (tclStubsPtr->tcl_IsSafe) /* 185 */ +#endif +#ifndef Tcl_JoinPath +#define Tcl_JoinPath \ + (tclStubsPtr->tcl_JoinPath) /* 186 */ +#endif +#ifndef Tcl_LinkVar +#define Tcl_LinkVar \ + (tclStubsPtr->tcl_LinkVar) /* 187 */ +#endif +/* Slot 188 is reserved */ +#ifndef Tcl_MakeFileChannel +#define Tcl_MakeFileChannel \ + (tclStubsPtr->tcl_MakeFileChannel) /* 189 */ +#endif +#ifndef Tcl_MakeSafe +#define Tcl_MakeSafe \ + (tclStubsPtr->tcl_MakeSafe) /* 190 */ +#endif +#ifndef Tcl_MakeTcpClientChannel +#define Tcl_MakeTcpClientChannel \ + (tclStubsPtr->tcl_MakeTcpClientChannel) /* 191 */ +#endif +#ifndef Tcl_Merge +#define Tcl_Merge \ + (tclStubsPtr->tcl_Merge) /* 192 */ +#endif +#ifndef Tcl_NextHashEntry +#define Tcl_NextHashEntry \ + (tclStubsPtr->tcl_NextHashEntry) /* 193 */ +#endif +#ifndef Tcl_NotifyChannel +#define Tcl_NotifyChannel \ + (tclStubsPtr->tcl_NotifyChannel) /* 194 */ +#endif +#ifndef Tcl_ObjGetVar2 +#define Tcl_ObjGetVar2 \ + (tclStubsPtr->tcl_ObjGetVar2) /* 195 */ +#endif +#ifndef Tcl_ObjSetVar2 +#define Tcl_ObjSetVar2 \ + (tclStubsPtr->tcl_ObjSetVar2) /* 196 */ +#endif +#ifndef Tcl_OpenCommandChannel +#define Tcl_OpenCommandChannel \ + (tclStubsPtr->tcl_OpenCommandChannel) /* 197 */ +#endif +#ifndef Tcl_OpenFileChannel +#define Tcl_OpenFileChannel \ + (tclStubsPtr->tcl_OpenFileChannel) /* 198 */ +#endif +#ifndef Tcl_OpenTcpClient +#define Tcl_OpenTcpClient \ + (tclStubsPtr->tcl_OpenTcpClient) /* 199 */ +#endif +#ifndef Tcl_OpenTcpServer +#define Tcl_OpenTcpServer \ + (tclStubsPtr->tcl_OpenTcpServer) /* 200 */ +#endif +#ifndef Tcl_Preserve +#define Tcl_Preserve \ + (tclStubsPtr->tcl_Preserve) /* 201 */ +#endif +#ifndef Tcl_PrintDouble +#define Tcl_PrintDouble \ + (tclStubsPtr->tcl_PrintDouble) /* 202 */ +#endif +#ifndef Tcl_PutEnv +#define Tcl_PutEnv \ + (tclStubsPtr->tcl_PutEnv) /* 203 */ +#endif +#ifndef Tcl_PosixError +#define Tcl_PosixError \ + (tclStubsPtr->tcl_PosixError) /* 204 */ +#endif +#ifndef Tcl_QueueEvent +#define Tcl_QueueEvent \ + (tclStubsPtr->tcl_QueueEvent) /* 205 */ +#endif +#ifndef Tcl_Read +#define Tcl_Read \ + (tclStubsPtr->tcl_Read) /* 206 */ +#endif +#ifndef Tcl_ReapDetachedProcs +#define Tcl_ReapDetachedProcs \ + (tclStubsPtr->tcl_ReapDetachedProcs) /* 207 */ +#endif +#ifndef Tcl_RecordAndEval +#define Tcl_RecordAndEval \ + (tclStubsPtr->tcl_RecordAndEval) /* 208 */ +#endif +#ifndef Tcl_RecordAndEvalObj +#define Tcl_RecordAndEvalObj \ + (tclStubsPtr->tcl_RecordAndEvalObj) /* 209 */ +#endif +#ifndef Tcl_RegisterChannel +#define Tcl_RegisterChannel \ + (tclStubsPtr->tcl_RegisterChannel) /* 210 */ +#endif +#ifndef Tcl_RegisterObjType +#define Tcl_RegisterObjType \ + (tclStubsPtr->tcl_RegisterObjType) /* 211 */ +#endif +#ifndef Tcl_RegExpCompile +#define Tcl_RegExpCompile \ + (tclStubsPtr->tcl_RegExpCompile) /* 212 */ +#endif +#ifndef Tcl_RegExpExec +#define Tcl_RegExpExec \ + (tclStubsPtr->tcl_RegExpExec) /* 213 */ +#endif +#ifndef Tcl_RegExpMatch +#define Tcl_RegExpMatch \ + (tclStubsPtr->tcl_RegExpMatch) /* 214 */ +#endif +#ifndef Tcl_RegExpRange +#define Tcl_RegExpRange \ + (tclStubsPtr->tcl_RegExpRange) /* 215 */ +#endif +#ifndef Tcl_Release +#define Tcl_Release \ + (tclStubsPtr->tcl_Release) /* 216 */ +#endif +#ifndef Tcl_ResetResult +#define Tcl_ResetResult \ + (tclStubsPtr->tcl_ResetResult) /* 217 */ +#endif +#ifndef Tcl_ScanElement +#define Tcl_ScanElement \ + (tclStubsPtr->tcl_ScanElement) /* 218 */ +#endif +#ifndef Tcl_ScanCountedElement +#define Tcl_ScanCountedElement \ + (tclStubsPtr->tcl_ScanCountedElement) /* 219 */ +#endif +#ifndef Tcl_SeekOld +#define Tcl_SeekOld \ + (tclStubsPtr->tcl_SeekOld) /* 220 */ +#endif +#ifndef Tcl_ServiceAll +#define Tcl_ServiceAll \ + (tclStubsPtr->tcl_ServiceAll) /* 221 */ +#endif +#ifndef Tcl_ServiceEvent +#define Tcl_ServiceEvent \ + (tclStubsPtr->tcl_ServiceEvent) /* 222 */ +#endif +#ifndef Tcl_SetAssocData +#define Tcl_SetAssocData \ + (tclStubsPtr->tcl_SetAssocData) /* 223 */ +#endif +#ifndef Tcl_SetChannelBufferSize +#define Tcl_SetChannelBufferSize \ + (tclStubsPtr->tcl_SetChannelBufferSize) /* 224 */ +#endif +#ifndef Tcl_SetChannelOption +#define Tcl_SetChannelOption \ + (tclStubsPtr->tcl_SetChannelOption) /* 225 */ +#endif +#ifndef Tcl_SetCommandInfo +#define Tcl_SetCommandInfo \ + (tclStubsPtr->tcl_SetCommandInfo) /* 226 */ +#endif +#ifndef Tcl_SetErrno +#define Tcl_SetErrno \ + (tclStubsPtr->tcl_SetErrno) /* 227 */ +#endif +#ifndef Tcl_SetErrorCode +#define Tcl_SetErrorCode \ + (tclStubsPtr->tcl_SetErrorCode) /* 228 */ +#endif +#ifndef Tcl_SetMaxBlockTime +#define Tcl_SetMaxBlockTime \ + (tclStubsPtr->tcl_SetMaxBlockTime) /* 229 */ +#endif +#ifndef Tcl_SetPanicProc +#define Tcl_SetPanicProc \ + (tclStubsPtr->tcl_SetPanicProc) /* 230 */ +#endif +#ifndef Tcl_SetRecursionLimit +#define Tcl_SetRecursionLimit \ + (tclStubsPtr->tcl_SetRecursionLimit) /* 231 */ +#endif +#ifndef Tcl_SetResult +#define Tcl_SetResult \ + (tclStubsPtr->tcl_SetResult) /* 232 */ +#endif +#ifndef Tcl_SetServiceMode +#define Tcl_SetServiceMode \ + (tclStubsPtr->tcl_SetServiceMode) /* 233 */ +#endif +#ifndef Tcl_SetObjErrorCode +#define Tcl_SetObjErrorCode \ + (tclStubsPtr->tcl_SetObjErrorCode) /* 234 */ +#endif +#ifndef Tcl_SetObjResult +#define Tcl_SetObjResult \ + (tclStubsPtr->tcl_SetObjResult) /* 235 */ +#endif +#ifndef Tcl_SetStdChannel +#define Tcl_SetStdChannel \ + (tclStubsPtr->tcl_SetStdChannel) /* 236 */ +#endif +#ifndef Tcl_SetVar +#define Tcl_SetVar \ + (tclStubsPtr->tcl_SetVar) /* 237 */ +#endif +#ifndef Tcl_SetVar2 +#define Tcl_SetVar2 \ + (tclStubsPtr->tcl_SetVar2) /* 238 */ +#endif +#ifndef Tcl_SignalId +#define Tcl_SignalId \ + (tclStubsPtr->tcl_SignalId) /* 239 */ +#endif +#ifndef Tcl_SignalMsg +#define Tcl_SignalMsg \ + (tclStubsPtr->tcl_SignalMsg) /* 240 */ +#endif +#ifndef Tcl_SourceRCFile +#define Tcl_SourceRCFile \ + (tclStubsPtr->tcl_SourceRCFile) /* 241 */ +#endif +#ifndef Tcl_SplitList +#define Tcl_SplitList \ + (tclStubsPtr->tcl_SplitList) /* 242 */ +#endif +#ifndef Tcl_SplitPath +#define Tcl_SplitPath \ + (tclStubsPtr->tcl_SplitPath) /* 243 */ +#endif +#ifndef Tcl_StaticPackage +#define Tcl_StaticPackage \ + (tclStubsPtr->tcl_StaticPackage) /* 244 */ +#endif +#ifndef Tcl_StringMatch +#define Tcl_StringMatch \ + (tclStubsPtr->tcl_StringMatch) /* 245 */ +#endif +#ifndef Tcl_TellOld +#define Tcl_TellOld \ + (tclStubsPtr->tcl_TellOld) /* 246 */ +#endif +#ifndef Tcl_TraceVar +#define Tcl_TraceVar \ + (tclStubsPtr->tcl_TraceVar) /* 247 */ +#endif +#ifndef Tcl_TraceVar2 +#define Tcl_TraceVar2 \ + (tclStubsPtr->tcl_TraceVar2) /* 248 */ +#endif +#ifndef Tcl_TranslateFileName +#define Tcl_TranslateFileName \ + (tclStubsPtr->tcl_TranslateFileName) /* 249 */ +#endif +#ifndef Tcl_Ungets +#define Tcl_Ungets \ + (tclStubsPtr->tcl_Ungets) /* 250 */ +#endif +#ifndef Tcl_UnlinkVar +#define Tcl_UnlinkVar \ + (tclStubsPtr->tcl_UnlinkVar) /* 251 */ +#endif +#ifndef Tcl_UnregisterChannel +#define Tcl_UnregisterChannel \ + (tclStubsPtr->tcl_UnregisterChannel) /* 252 */ +#endif +#ifndef Tcl_UnsetVar +#define Tcl_UnsetVar \ + (tclStubsPtr->tcl_UnsetVar) /* 253 */ +#endif +#ifndef Tcl_UnsetVar2 +#define Tcl_UnsetVar2 \ + (tclStubsPtr->tcl_UnsetVar2) /* 254 */ +#endif +#ifndef Tcl_UntraceVar +#define Tcl_UntraceVar \ + (tclStubsPtr->tcl_UntraceVar) /* 255 */ +#endif +#ifndef Tcl_UntraceVar2 +#define Tcl_UntraceVar2 \ + (tclStubsPtr->tcl_UntraceVar2) /* 256 */ +#endif +#ifndef Tcl_UpdateLinkedVar +#define Tcl_UpdateLinkedVar \ + (tclStubsPtr->tcl_UpdateLinkedVar) /* 257 */ +#endif +#ifndef Tcl_UpVar +#define Tcl_UpVar \ + (tclStubsPtr->tcl_UpVar) /* 258 */ +#endif +#ifndef Tcl_UpVar2 +#define Tcl_UpVar2 \ + (tclStubsPtr->tcl_UpVar2) /* 259 */ +#endif +#ifndef Tcl_VarEval +#define Tcl_VarEval \ + (tclStubsPtr->tcl_VarEval) /* 260 */ +#endif +#ifndef Tcl_VarTraceInfo +#define Tcl_VarTraceInfo \ + (tclStubsPtr->tcl_VarTraceInfo) /* 261 */ +#endif +#ifndef Tcl_VarTraceInfo2 +#define Tcl_VarTraceInfo2 \ + (tclStubsPtr->tcl_VarTraceInfo2) /* 262 */ +#endif +#ifndef Tcl_Write +#define Tcl_Write \ + (tclStubsPtr->tcl_Write) /* 263 */ +#endif +#ifndef Tcl_WrongNumArgs +#define Tcl_WrongNumArgs \ + (tclStubsPtr->tcl_WrongNumArgs) /* 264 */ +#endif +#ifndef Tcl_DumpActiveMemory +#define Tcl_DumpActiveMemory \ + (tclStubsPtr->tcl_DumpActiveMemory) /* 265 */ +#endif +#ifndef Tcl_ValidateAllMemory +#define Tcl_ValidateAllMemory \ + (tclStubsPtr->tcl_ValidateAllMemory) /* 266 */ +#endif +#ifndef Tcl_AppendResultVA +#define Tcl_AppendResultVA \ + (tclStubsPtr->tcl_AppendResultVA) /* 267 */ +#endif +#ifndef Tcl_AppendStringsToObjVA +#define Tcl_AppendStringsToObjVA \ + (tclStubsPtr->tcl_AppendStringsToObjVA) /* 268 */ +#endif +#ifndef Tcl_HashStats +#define Tcl_HashStats \ + (tclStubsPtr->tcl_HashStats) /* 269 */ +#endif +#ifndef Tcl_ParseVar +#define Tcl_ParseVar \ + (tclStubsPtr->tcl_ParseVar) /* 270 */ +#endif +#ifndef Tcl_PkgPresent +#define Tcl_PkgPresent \ + (tclStubsPtr->tcl_PkgPresent) /* 271 */ +#endif +#ifndef Tcl_PkgPresentEx +#define Tcl_PkgPresentEx \ + (tclStubsPtr->tcl_PkgPresentEx) /* 272 */ +#endif +#ifndef Tcl_PkgProvide +#define Tcl_PkgProvide \ + (tclStubsPtr->tcl_PkgProvide) /* 273 */ +#endif +#ifndef Tcl_PkgRequire +#define Tcl_PkgRequire \ + (tclStubsPtr->tcl_PkgRequire) /* 274 */ +#endif +#ifndef Tcl_SetErrorCodeVA +#define Tcl_SetErrorCodeVA \ + (tclStubsPtr->tcl_SetErrorCodeVA) /* 275 */ +#endif +#ifndef Tcl_VarEvalVA +#define Tcl_VarEvalVA \ + (tclStubsPtr->tcl_VarEvalVA) /* 276 */ +#endif +#ifndef Tcl_WaitPid +#define Tcl_WaitPid \ + (tclStubsPtr->tcl_WaitPid) /* 277 */ +#endif +#ifndef Tcl_PanicVA +#define Tcl_PanicVA \ + (tclStubsPtr->tcl_PanicVA) /* 278 */ +#endif +#ifndef Tcl_GetVersion +#define Tcl_GetVersion \ + (tclStubsPtr->tcl_GetVersion) /* 279 */ +#endif +#ifndef Tcl_InitMemory +#define Tcl_InitMemory \ + (tclStubsPtr->tcl_InitMemory) /* 280 */ +#endif +#ifndef Tcl_StackChannel +#define Tcl_StackChannel \ + (tclStubsPtr->tcl_StackChannel) /* 281 */ +#endif +#ifndef Tcl_UnstackChannel +#define Tcl_UnstackChannel \ + (tclStubsPtr->tcl_UnstackChannel) /* 282 */ +#endif +#ifndef Tcl_GetStackedChannel +#define Tcl_GetStackedChannel \ + (tclStubsPtr->tcl_GetStackedChannel) /* 283 */ +#endif +#ifndef Tcl_SetMainLoop +#define Tcl_SetMainLoop \ + (tclStubsPtr->tcl_SetMainLoop) /* 284 */ +#endif +/* Slot 285 is reserved */ +#ifndef Tcl_AppendObjToObj +#define Tcl_AppendObjToObj \ + (tclStubsPtr->tcl_AppendObjToObj) /* 286 */ +#endif +#ifndef Tcl_CreateEncoding +#define Tcl_CreateEncoding \ + (tclStubsPtr->tcl_CreateEncoding) /* 287 */ +#endif +#ifndef Tcl_CreateThreadExitHandler +#define Tcl_CreateThreadExitHandler \ + (tclStubsPtr->tcl_CreateThreadExitHandler) /* 288 */ +#endif +#ifndef Tcl_DeleteThreadExitHandler +#define Tcl_DeleteThreadExitHandler \ + (tclStubsPtr->tcl_DeleteThreadExitHandler) /* 289 */ +#endif +#ifndef Tcl_DiscardResult +#define Tcl_DiscardResult \ + (tclStubsPtr->tcl_DiscardResult) /* 290 */ +#endif +#ifndef Tcl_EvalEx +#define Tcl_EvalEx \ + (tclStubsPtr->tcl_EvalEx) /* 291 */ +#endif +#ifndef Tcl_EvalObjv +#define Tcl_EvalObjv \ + (tclStubsPtr->tcl_EvalObjv) /* 292 */ +#endif +#ifndef Tcl_EvalObjEx +#define Tcl_EvalObjEx \ + (tclStubsPtr->tcl_EvalObjEx) /* 293 */ +#endif +#ifndef Tcl_ExitThread +#define Tcl_ExitThread \ + (tclStubsPtr->tcl_ExitThread) /* 294 */ +#endif +#ifndef Tcl_ExternalToUtf +#define Tcl_ExternalToUtf \ + (tclStubsPtr->tcl_ExternalToUtf) /* 295 */ +#endif +#ifndef Tcl_ExternalToUtfDString +#define Tcl_ExternalToUtfDString \ + (tclStubsPtr->tcl_ExternalToUtfDString) /* 296 */ +#endif +#ifndef Tcl_FinalizeThread +#define Tcl_FinalizeThread \ + (tclStubsPtr->tcl_FinalizeThread) /* 297 */ +#endif +#ifndef Tcl_FinalizeNotifier +#define Tcl_FinalizeNotifier \ + (tclStubsPtr->tcl_FinalizeNotifier) /* 298 */ +#endif +#ifndef Tcl_FreeEncoding +#define Tcl_FreeEncoding \ + (tclStubsPtr->tcl_FreeEncoding) /* 299 */ +#endif +#ifndef Tcl_GetCurrentThread +#define Tcl_GetCurrentThread \ + (tclStubsPtr->tcl_GetCurrentThread) /* 300 */ +#endif +#ifndef Tcl_GetEncoding +#define Tcl_GetEncoding \ + (tclStubsPtr->tcl_GetEncoding) /* 301 */ +#endif +#ifndef Tcl_GetEncodingName +#define Tcl_GetEncodingName \ + (tclStubsPtr->tcl_GetEncodingName) /* 302 */ +#endif +#ifndef Tcl_GetEncodingNames +#define Tcl_GetEncodingNames \ + (tclStubsPtr->tcl_GetEncodingNames) /* 303 */ +#endif +#ifndef Tcl_GetIndexFromObjStruct +#define Tcl_GetIndexFromObjStruct \ + (tclStubsPtr->tcl_GetIndexFromObjStruct) /* 304 */ +#endif +#ifndef Tcl_GetThreadData +#define Tcl_GetThreadData \ + (tclStubsPtr->tcl_GetThreadData) /* 305 */ +#endif +#ifndef Tcl_GetVar2Ex +#define Tcl_GetVar2Ex \ + (tclStubsPtr->tcl_GetVar2Ex) /* 306 */ +#endif +#ifndef Tcl_InitNotifier +#define Tcl_InitNotifier \ + (tclStubsPtr->tcl_InitNotifier) /* 307 */ +#endif +#ifndef Tcl_MutexLock +#define Tcl_MutexLock \ + (tclStubsPtr->tcl_MutexLock) /* 308 */ +#endif +#ifndef Tcl_MutexUnlock +#define Tcl_MutexUnlock \ + (tclStubsPtr->tcl_MutexUnlock) /* 309 */ +#endif +#ifndef Tcl_ConditionNotify +#define Tcl_ConditionNotify \ + (tclStubsPtr->tcl_ConditionNotify) /* 310 */ +#endif +#ifndef Tcl_ConditionWait +#define Tcl_ConditionWait \ + (tclStubsPtr->tcl_ConditionWait) /* 311 */ +#endif +#ifndef Tcl_NumUtfChars +#define Tcl_NumUtfChars \ + (tclStubsPtr->tcl_NumUtfChars) /* 312 */ +#endif +#ifndef Tcl_ReadChars +#define Tcl_ReadChars \ + (tclStubsPtr->tcl_ReadChars) /* 313 */ +#endif +#ifndef Tcl_RestoreResult +#define Tcl_RestoreResult \ + (tclStubsPtr->tcl_RestoreResult) /* 314 */ +#endif +#ifndef Tcl_SaveResult +#define Tcl_SaveResult \ + (tclStubsPtr->tcl_SaveResult) /* 315 */ +#endif +#ifndef Tcl_SetSystemEncoding +#define Tcl_SetSystemEncoding \ + (tclStubsPtr->tcl_SetSystemEncoding) /* 316 */ +#endif +#ifndef Tcl_SetVar2Ex +#define Tcl_SetVar2Ex \ + (tclStubsPtr->tcl_SetVar2Ex) /* 317 */ +#endif +#ifndef Tcl_ThreadAlert +#define Tcl_ThreadAlert \ + (tclStubsPtr->tcl_ThreadAlert) /* 318 */ +#endif +#ifndef Tcl_ThreadQueueEvent +#define Tcl_ThreadQueueEvent \ + (tclStubsPtr->tcl_ThreadQueueEvent) /* 319 */ +#endif +#ifndef Tcl_UniCharAtIndex +#define Tcl_UniCharAtIndex \ + (tclStubsPtr->tcl_UniCharAtIndex) /* 320 */ +#endif +#ifndef Tcl_UniCharToLower +#define Tcl_UniCharToLower \ + (tclStubsPtr->tcl_UniCharToLower) /* 321 */ +#endif +#ifndef Tcl_UniCharToTitle +#define Tcl_UniCharToTitle \ + (tclStubsPtr->tcl_UniCharToTitle) /* 322 */ +#endif +#ifndef Tcl_UniCharToUpper +#define Tcl_UniCharToUpper \ + (tclStubsPtr->tcl_UniCharToUpper) /* 323 */ +#endif +#ifndef Tcl_UniCharToUtf +#define Tcl_UniCharToUtf \ + (tclStubsPtr->tcl_UniCharToUtf) /* 324 */ +#endif +#ifndef Tcl_UtfAtIndex +#define Tcl_UtfAtIndex \ + (tclStubsPtr->tcl_UtfAtIndex) /* 325 */ +#endif +#ifndef Tcl_UtfCharComplete +#define Tcl_UtfCharComplete \ + (tclStubsPtr->tcl_UtfCharComplete) /* 326 */ +#endif +#ifndef Tcl_UtfBackslash +#define Tcl_UtfBackslash \ + (tclStubsPtr->tcl_UtfBackslash) /* 327 */ +#endif +#ifndef Tcl_UtfFindFirst +#define Tcl_UtfFindFirst \ + (tclStubsPtr->tcl_UtfFindFirst) /* 328 */ +#endif +#ifndef Tcl_UtfFindLast +#define Tcl_UtfFindLast \ + (tclStubsPtr->tcl_UtfFindLast) /* 329 */ +#endif +#ifndef Tcl_UtfNext +#define Tcl_UtfNext \ + (tclStubsPtr->tcl_UtfNext) /* 330 */ +#endif +#ifndef Tcl_UtfPrev +#define Tcl_UtfPrev \ + (tclStubsPtr->tcl_UtfPrev) /* 331 */ +#endif +#ifndef Tcl_UtfToExternal +#define Tcl_UtfToExternal \ + (tclStubsPtr->tcl_UtfToExternal) /* 332 */ +#endif +#ifndef Tcl_UtfToExternalDString +#define Tcl_UtfToExternalDString \ + (tclStubsPtr->tcl_UtfToExternalDString) /* 333 */ +#endif +#ifndef Tcl_UtfToLower +#define Tcl_UtfToLower \ + (tclStubsPtr->tcl_UtfToLower) /* 334 */ +#endif +#ifndef Tcl_UtfToTitle +#define Tcl_UtfToTitle \ + (tclStubsPtr->tcl_UtfToTitle) /* 335 */ +#endif +#ifndef Tcl_UtfToUniChar +#define Tcl_UtfToUniChar \ + (tclStubsPtr->tcl_UtfToUniChar) /* 336 */ +#endif +#ifndef Tcl_UtfToUpper +#define Tcl_UtfToUpper \ + (tclStubsPtr->tcl_UtfToUpper) /* 337 */ +#endif +#ifndef Tcl_WriteChars +#define Tcl_WriteChars \ + (tclStubsPtr->tcl_WriteChars) /* 338 */ +#endif +#ifndef Tcl_WriteObj +#define Tcl_WriteObj \ + (tclStubsPtr->tcl_WriteObj) /* 339 */ +#endif +#ifndef Tcl_GetString +#define Tcl_GetString \ + (tclStubsPtr->tcl_GetString) /* 340 */ +#endif +#ifndef Tcl_GetDefaultEncodingDir +#define Tcl_GetDefaultEncodingDir \ + (tclStubsPtr->tcl_GetDefaultEncodingDir) /* 341 */ +#endif +#ifndef Tcl_SetDefaultEncodingDir +#define Tcl_SetDefaultEncodingDir \ + (tclStubsPtr->tcl_SetDefaultEncodingDir) /* 342 */ +#endif +#ifndef Tcl_AlertNotifier +#define Tcl_AlertNotifier \ + (tclStubsPtr->tcl_AlertNotifier) /* 343 */ +#endif +#ifndef Tcl_ServiceModeHook +#define Tcl_ServiceModeHook \ + (tclStubsPtr->tcl_ServiceModeHook) /* 344 */ +#endif +#ifndef Tcl_UniCharIsAlnum +#define Tcl_UniCharIsAlnum \ + (tclStubsPtr->tcl_UniCharIsAlnum) /* 345 */ +#endif +#ifndef Tcl_UniCharIsAlpha +#define Tcl_UniCharIsAlpha \ + (tclStubsPtr->tcl_UniCharIsAlpha) /* 346 */ +#endif +#ifndef Tcl_UniCharIsDigit +#define Tcl_UniCharIsDigit \ + (tclStubsPtr->tcl_UniCharIsDigit) /* 347 */ +#endif +#ifndef Tcl_UniCharIsLower +#define Tcl_UniCharIsLower \ + (tclStubsPtr->tcl_UniCharIsLower) /* 348 */ +#endif +#ifndef Tcl_UniCharIsSpace +#define Tcl_UniCharIsSpace \ + (tclStubsPtr->tcl_UniCharIsSpace) /* 349 */ +#endif +#ifndef Tcl_UniCharIsUpper +#define Tcl_UniCharIsUpper \ + (tclStubsPtr->tcl_UniCharIsUpper) /* 350 */ +#endif +#ifndef Tcl_UniCharIsWordChar +#define Tcl_UniCharIsWordChar \ + (tclStubsPtr->tcl_UniCharIsWordChar) /* 351 */ +#endif +#ifndef Tcl_UniCharLen +#define Tcl_UniCharLen \ + (tclStubsPtr->tcl_UniCharLen) /* 352 */ +#endif +#ifndef Tcl_UniCharNcmp +#define Tcl_UniCharNcmp \ + (tclStubsPtr->tcl_UniCharNcmp) /* 353 */ +#endif +#ifndef Tcl_UniCharToUtfDString +#define Tcl_UniCharToUtfDString \ + (tclStubsPtr->tcl_UniCharToUtfDString) /* 354 */ +#endif +#ifndef Tcl_UtfToUniCharDString +#define Tcl_UtfToUniCharDString \ + (tclStubsPtr->tcl_UtfToUniCharDString) /* 355 */ +#endif +#ifndef Tcl_GetRegExpFromObj +#define Tcl_GetRegExpFromObj \ + (tclStubsPtr->tcl_GetRegExpFromObj) /* 356 */ +#endif +#ifndef Tcl_EvalTokens +#define Tcl_EvalTokens \ + (tclStubsPtr->tcl_EvalTokens) /* 357 */ +#endif +#ifndef Tcl_FreeParse +#define Tcl_FreeParse \ + (tclStubsPtr->tcl_FreeParse) /* 358 */ +#endif +#ifndef Tcl_LogCommandInfo +#define Tcl_LogCommandInfo \ + (tclStubsPtr->tcl_LogCommandInfo) /* 359 */ +#endif +#ifndef Tcl_ParseBraces +#define Tcl_ParseBraces \ + (tclStubsPtr->tcl_ParseBraces) /* 360 */ +#endif +#ifndef Tcl_ParseCommand +#define Tcl_ParseCommand \ + (tclStubsPtr->tcl_ParseCommand) /* 361 */ +#endif +#ifndef Tcl_ParseExpr +#define Tcl_ParseExpr \ + (tclStubsPtr->tcl_ParseExpr) /* 362 */ +#endif +#ifndef Tcl_ParseQuotedString +#define Tcl_ParseQuotedString \ + (tclStubsPtr->tcl_ParseQuotedString) /* 363 */ +#endif +#ifndef Tcl_ParseVarName +#define Tcl_ParseVarName \ + (tclStubsPtr->tcl_ParseVarName) /* 364 */ +#endif +#ifndef Tcl_GetCwd +#define Tcl_GetCwd \ + (tclStubsPtr->tcl_GetCwd) /* 365 */ +#endif +#ifndef Tcl_Chdir +#define Tcl_Chdir \ + (tclStubsPtr->tcl_Chdir) /* 366 */ +#endif +#ifndef Tcl_Access +#define Tcl_Access \ + (tclStubsPtr->tcl_Access) /* 367 */ +#endif +#ifndef Tcl_Stat +#define Tcl_Stat \ + (tclStubsPtr->tcl_Stat) /* 368 */ +#endif +#ifndef Tcl_UtfNcmp +#define Tcl_UtfNcmp \ + (tclStubsPtr->tcl_UtfNcmp) /* 369 */ +#endif +#ifndef Tcl_UtfNcasecmp +#define Tcl_UtfNcasecmp \ + (tclStubsPtr->tcl_UtfNcasecmp) /* 370 */ +#endif +#ifndef Tcl_StringCaseMatch +#define Tcl_StringCaseMatch \ + (tclStubsPtr->tcl_StringCaseMatch) /* 371 */ +#endif +#ifndef Tcl_UniCharIsControl +#define Tcl_UniCharIsControl \ + (tclStubsPtr->tcl_UniCharIsControl) /* 372 */ +#endif +#ifndef Tcl_UniCharIsGraph +#define Tcl_UniCharIsGraph \ + (tclStubsPtr->tcl_UniCharIsGraph) /* 373 */ +#endif +#ifndef Tcl_UniCharIsPrint +#define Tcl_UniCharIsPrint \ + (tclStubsPtr->tcl_UniCharIsPrint) /* 374 */ +#endif +#ifndef Tcl_UniCharIsPunct +#define Tcl_UniCharIsPunct \ + (tclStubsPtr->tcl_UniCharIsPunct) /* 375 */ +#endif +#ifndef Tcl_RegExpExecObj +#define Tcl_RegExpExecObj \ + (tclStubsPtr->tcl_RegExpExecObj) /* 376 */ +#endif +#ifndef Tcl_RegExpGetInfo +#define Tcl_RegExpGetInfo \ + (tclStubsPtr->tcl_RegExpGetInfo) /* 377 */ +#endif +#ifndef Tcl_NewUnicodeObj +#define Tcl_NewUnicodeObj \ + (tclStubsPtr->tcl_NewUnicodeObj) /* 378 */ +#endif +#ifndef Tcl_SetUnicodeObj +#define Tcl_SetUnicodeObj \ + (tclStubsPtr->tcl_SetUnicodeObj) /* 379 */ +#endif +#ifndef Tcl_GetCharLength +#define Tcl_GetCharLength \ + (tclStubsPtr->tcl_GetCharLength) /* 380 */ +#endif +#ifndef Tcl_GetUniChar +#define Tcl_GetUniChar \ + (tclStubsPtr->tcl_GetUniChar) /* 381 */ +#endif +#ifndef Tcl_GetUnicode +#define Tcl_GetUnicode \ + (tclStubsPtr->tcl_GetUnicode) /* 382 */ +#endif +#ifndef Tcl_GetRange +#define Tcl_GetRange \ + (tclStubsPtr->tcl_GetRange) /* 383 */ +#endif +#ifndef Tcl_AppendUnicodeToObj +#define Tcl_AppendUnicodeToObj \ + (tclStubsPtr->tcl_AppendUnicodeToObj) /* 384 */ +#endif +#ifndef Tcl_RegExpMatchObj +#define Tcl_RegExpMatchObj \ + (tclStubsPtr->tcl_RegExpMatchObj) /* 385 */ +#endif +#ifndef Tcl_SetNotifier +#define Tcl_SetNotifier \ + (tclStubsPtr->tcl_SetNotifier) /* 386 */ +#endif +#ifndef Tcl_GetAllocMutex +#define Tcl_GetAllocMutex \ + (tclStubsPtr->tcl_GetAllocMutex) /* 387 */ +#endif +#ifndef Tcl_GetChannelNames +#define Tcl_GetChannelNames \ + (tclStubsPtr->tcl_GetChannelNames) /* 388 */ +#endif +#ifndef Tcl_GetChannelNamesEx +#define Tcl_GetChannelNamesEx \ + (tclStubsPtr->tcl_GetChannelNamesEx) /* 389 */ +#endif +#ifndef Tcl_ProcObjCmd +#define Tcl_ProcObjCmd \ + (tclStubsPtr->tcl_ProcObjCmd) /* 390 */ +#endif +#ifndef Tcl_ConditionFinalize +#define Tcl_ConditionFinalize \ + (tclStubsPtr->tcl_ConditionFinalize) /* 391 */ +#endif +#ifndef Tcl_MutexFinalize +#define Tcl_MutexFinalize \ + (tclStubsPtr->tcl_MutexFinalize) /* 392 */ +#endif +#ifndef Tcl_CreateThread +#define Tcl_CreateThread \ + (tclStubsPtr->tcl_CreateThread) /* 393 */ +#endif +#ifndef Tcl_ReadRaw +#define Tcl_ReadRaw \ + (tclStubsPtr->tcl_ReadRaw) /* 394 */ +#endif +#ifndef Tcl_WriteRaw +#define Tcl_WriteRaw \ + (tclStubsPtr->tcl_WriteRaw) /* 395 */ +#endif +#ifndef Tcl_GetTopChannel +#define Tcl_GetTopChannel \ + (tclStubsPtr->tcl_GetTopChannel) /* 396 */ +#endif +#ifndef Tcl_ChannelBuffered +#define Tcl_ChannelBuffered \ + (tclStubsPtr->tcl_ChannelBuffered) /* 397 */ +#endif +#ifndef Tcl_ChannelName +#define Tcl_ChannelName \ + (tclStubsPtr->tcl_ChannelName) /* 398 */ +#endif +#ifndef Tcl_ChannelVersion +#define Tcl_ChannelVersion \ + (tclStubsPtr->tcl_ChannelVersion) /* 399 */ +#endif +#ifndef Tcl_ChannelBlockModeProc +#define Tcl_ChannelBlockModeProc \ + (tclStubsPtr->tcl_ChannelBlockModeProc) /* 400 */ +#endif +#ifndef Tcl_ChannelCloseProc +#define Tcl_ChannelCloseProc \ + (tclStubsPtr->tcl_ChannelCloseProc) /* 401 */ +#endif +#ifndef Tcl_ChannelClose2Proc +#define Tcl_ChannelClose2Proc \ + (tclStubsPtr->tcl_ChannelClose2Proc) /* 402 */ +#endif +#ifndef Tcl_ChannelInputProc +#define Tcl_ChannelInputProc \ + (tclStubsPtr->tcl_ChannelInputProc) /* 403 */ +#endif +#ifndef Tcl_ChannelOutputProc +#define Tcl_ChannelOutputProc \ + (tclStubsPtr->tcl_ChannelOutputProc) /* 404 */ +#endif +#ifndef Tcl_ChannelSeekProc +#define Tcl_ChannelSeekProc \ + (tclStubsPtr->tcl_ChannelSeekProc) /* 405 */ +#endif +#ifndef Tcl_ChannelSetOptionProc +#define Tcl_ChannelSetOptionProc \ + (tclStubsPtr->tcl_ChannelSetOptionProc) /* 406 */ +#endif +#ifndef Tcl_ChannelGetOptionProc +#define Tcl_ChannelGetOptionProc \ + (tclStubsPtr->tcl_ChannelGetOptionProc) /* 407 */ +#endif +#ifndef Tcl_ChannelWatchProc +#define Tcl_ChannelWatchProc \ + (tclStubsPtr->tcl_ChannelWatchProc) /* 408 */ +#endif +#ifndef Tcl_ChannelGetHandleProc +#define Tcl_ChannelGetHandleProc \ + (tclStubsPtr->tcl_ChannelGetHandleProc) /* 409 */ +#endif +#ifndef Tcl_ChannelFlushProc +#define Tcl_ChannelFlushProc \ + (tclStubsPtr->tcl_ChannelFlushProc) /* 410 */ +#endif +#ifndef Tcl_ChannelHandlerProc +#define Tcl_ChannelHandlerProc \ + (tclStubsPtr->tcl_ChannelHandlerProc) /* 411 */ +#endif +#ifndef Tcl_JoinThread +#define Tcl_JoinThread \ + (tclStubsPtr->tcl_JoinThread) /* 412 */ +#endif +#ifndef Tcl_IsChannelShared +#define Tcl_IsChannelShared \ + (tclStubsPtr->tcl_IsChannelShared) /* 413 */ +#endif +#ifndef Tcl_IsChannelRegistered +#define Tcl_IsChannelRegistered \ + (tclStubsPtr->tcl_IsChannelRegistered) /* 414 */ +#endif +#ifndef Tcl_CutChannel +#define Tcl_CutChannel \ + (tclStubsPtr->tcl_CutChannel) /* 415 */ +#endif +#ifndef Tcl_SpliceChannel +#define Tcl_SpliceChannel \ + (tclStubsPtr->tcl_SpliceChannel) /* 416 */ +#endif +#ifndef Tcl_ClearChannelHandlers +#define Tcl_ClearChannelHandlers \ + (tclStubsPtr->tcl_ClearChannelHandlers) /* 417 */ +#endif +#ifndef Tcl_IsChannelExisting +#define Tcl_IsChannelExisting \ + (tclStubsPtr->tcl_IsChannelExisting) /* 418 */ +#endif +#ifndef Tcl_UniCharNcasecmp +#define Tcl_UniCharNcasecmp \ + (tclStubsPtr->tcl_UniCharNcasecmp) /* 419 */ +#endif +#ifndef Tcl_UniCharCaseMatch +#define Tcl_UniCharCaseMatch \ + (tclStubsPtr->tcl_UniCharCaseMatch) /* 420 */ +#endif +#ifndef Tcl_FindHashEntry +#define Tcl_FindHashEntry \ + (tclStubsPtr->tcl_FindHashEntry) /* 421 */ +#endif +#ifndef Tcl_CreateHashEntry +#define Tcl_CreateHashEntry \ + (tclStubsPtr->tcl_CreateHashEntry) /* 422 */ +#endif +#ifndef Tcl_InitCustomHashTable +#define Tcl_InitCustomHashTable \ + (tclStubsPtr->tcl_InitCustomHashTable) /* 423 */ +#endif +#ifndef Tcl_InitObjHashTable +#define Tcl_InitObjHashTable \ + (tclStubsPtr->tcl_InitObjHashTable) /* 424 */ +#endif +#ifndef Tcl_CommandTraceInfo +#define Tcl_CommandTraceInfo \ + (tclStubsPtr->tcl_CommandTraceInfo) /* 425 */ +#endif +#ifndef Tcl_TraceCommand +#define Tcl_TraceCommand \ + (tclStubsPtr->tcl_TraceCommand) /* 426 */ +#endif +#ifndef Tcl_UntraceCommand +#define Tcl_UntraceCommand \ + (tclStubsPtr->tcl_UntraceCommand) /* 427 */ +#endif +#ifndef Tcl_AttemptAlloc +#define Tcl_AttemptAlloc \ + (tclStubsPtr->tcl_AttemptAlloc) /* 428 */ +#endif +#ifndef Tcl_AttemptDbCkalloc +#define Tcl_AttemptDbCkalloc \ + (tclStubsPtr->tcl_AttemptDbCkalloc) /* 429 */ +#endif +#ifndef Tcl_AttemptRealloc +#define Tcl_AttemptRealloc \ + (tclStubsPtr->tcl_AttemptRealloc) /* 430 */ +#endif +#ifndef Tcl_AttemptDbCkrealloc +#define Tcl_AttemptDbCkrealloc \ + (tclStubsPtr->tcl_AttemptDbCkrealloc) /* 431 */ +#endif +#ifndef Tcl_AttemptSetObjLength +#define Tcl_AttemptSetObjLength \ + (tclStubsPtr->tcl_AttemptSetObjLength) /* 432 */ +#endif +#ifndef Tcl_GetChannelThread +#define Tcl_GetChannelThread \ + (tclStubsPtr->tcl_GetChannelThread) /* 433 */ +#endif +#ifndef Tcl_GetUnicodeFromObj +#define Tcl_GetUnicodeFromObj \ + (tclStubsPtr->tcl_GetUnicodeFromObj) /* 434 */ +#endif +#ifndef Tcl_GetMathFuncInfo +#define Tcl_GetMathFuncInfo \ + (tclStubsPtr->tcl_GetMathFuncInfo) /* 435 */ +#endif +#ifndef Tcl_ListMathFuncs +#define Tcl_ListMathFuncs \ + (tclStubsPtr->tcl_ListMathFuncs) /* 436 */ +#endif +#ifndef Tcl_SubstObj +#define Tcl_SubstObj \ + (tclStubsPtr->tcl_SubstObj) /* 437 */ +#endif +#ifndef Tcl_DetachChannel +#define Tcl_DetachChannel \ + (tclStubsPtr->tcl_DetachChannel) /* 438 */ +#endif +#ifndef Tcl_IsStandardChannel +#define Tcl_IsStandardChannel \ + (tclStubsPtr->tcl_IsStandardChannel) /* 439 */ +#endif +#ifndef Tcl_FSCopyFile +#define Tcl_FSCopyFile \ + (tclStubsPtr->tcl_FSCopyFile) /* 440 */ +#endif +#ifndef Tcl_FSCopyDirectory +#define Tcl_FSCopyDirectory \ + (tclStubsPtr->tcl_FSCopyDirectory) /* 441 */ +#endif +#ifndef Tcl_FSCreateDirectory +#define Tcl_FSCreateDirectory \ + (tclStubsPtr->tcl_FSCreateDirectory) /* 442 */ +#endif +#ifndef Tcl_FSDeleteFile +#define Tcl_FSDeleteFile \ + (tclStubsPtr->tcl_FSDeleteFile) /* 443 */ +#endif +#ifndef Tcl_FSLoadFile +#define Tcl_FSLoadFile \ + (tclStubsPtr->tcl_FSLoadFile) /* 444 */ +#endif +#ifndef Tcl_FSMatchInDirectory +#define Tcl_FSMatchInDirectory \ + (tclStubsPtr->tcl_FSMatchInDirectory) /* 445 */ +#endif +#ifndef Tcl_FSLink +#define Tcl_FSLink \ + (tclStubsPtr->tcl_FSLink) /* 446 */ +#endif +#ifndef Tcl_FSRemoveDirectory +#define Tcl_FSRemoveDirectory \ + (tclStubsPtr->tcl_FSRemoveDirectory) /* 447 */ +#endif +#ifndef Tcl_FSRenameFile +#define Tcl_FSRenameFile \ + (tclStubsPtr->tcl_FSRenameFile) /* 448 */ +#endif +#ifndef Tcl_FSLstat +#define Tcl_FSLstat \ + (tclStubsPtr->tcl_FSLstat) /* 449 */ +#endif +#ifndef Tcl_FSUtime +#define Tcl_FSUtime \ + (tclStubsPtr->tcl_FSUtime) /* 450 */ +#endif +#ifndef Tcl_FSFileAttrsGet +#define Tcl_FSFileAttrsGet \ + (tclStubsPtr->tcl_FSFileAttrsGet) /* 451 */ +#endif +#ifndef Tcl_FSFileAttrsSet +#define Tcl_FSFileAttrsSet \ + (tclStubsPtr->tcl_FSFileAttrsSet) /* 452 */ +#endif +#ifndef Tcl_FSFileAttrStrings +#define Tcl_FSFileAttrStrings \ + (tclStubsPtr->tcl_FSFileAttrStrings) /* 453 */ +#endif +#ifndef Tcl_FSStat +#define Tcl_FSStat \ + (tclStubsPtr->tcl_FSStat) /* 454 */ +#endif +#ifndef Tcl_FSAccess +#define Tcl_FSAccess \ + (tclStubsPtr->tcl_FSAccess) /* 455 */ +#endif +#ifndef Tcl_FSOpenFileChannel +#define Tcl_FSOpenFileChannel \ + (tclStubsPtr->tcl_FSOpenFileChannel) /* 456 */ +#endif +#ifndef Tcl_FSGetCwd +#define Tcl_FSGetCwd \ + (tclStubsPtr->tcl_FSGetCwd) /* 457 */ +#endif +#ifndef Tcl_FSChdir +#define Tcl_FSChdir \ + (tclStubsPtr->tcl_FSChdir) /* 458 */ +#endif +#ifndef Tcl_FSConvertToPathType +#define Tcl_FSConvertToPathType \ + (tclStubsPtr->tcl_FSConvertToPathType) /* 459 */ +#endif +#ifndef Tcl_FSJoinPath +#define Tcl_FSJoinPath \ + (tclStubsPtr->tcl_FSJoinPath) /* 460 */ +#endif +#ifndef Tcl_FSSplitPath +#define Tcl_FSSplitPath \ + (tclStubsPtr->tcl_FSSplitPath) /* 461 */ +#endif +#ifndef Tcl_FSEqualPaths +#define Tcl_FSEqualPaths \ + (tclStubsPtr->tcl_FSEqualPaths) /* 462 */ +#endif +#ifndef Tcl_FSGetNormalizedPath +#define Tcl_FSGetNormalizedPath \ + (tclStubsPtr->tcl_FSGetNormalizedPath) /* 463 */ +#endif +#ifndef Tcl_FSJoinToPath +#define Tcl_FSJoinToPath \ + (tclStubsPtr->tcl_FSJoinToPath) /* 464 */ +#endif +#ifndef Tcl_FSGetInternalRep +#define Tcl_FSGetInternalRep \ + (tclStubsPtr->tcl_FSGetInternalRep) /* 465 */ +#endif +#ifndef Tcl_FSGetTranslatedPath +#define Tcl_FSGetTranslatedPath \ + (tclStubsPtr->tcl_FSGetTranslatedPath) /* 466 */ +#endif +#ifndef Tcl_FSEvalFile +#define Tcl_FSEvalFile \ + (tclStubsPtr->tcl_FSEvalFile) /* 467 */ +#endif +#ifndef Tcl_FSNewNativePath +#define Tcl_FSNewNativePath \ + (tclStubsPtr->tcl_FSNewNativePath) /* 468 */ +#endif +#ifndef Tcl_FSGetNativePath +#define Tcl_FSGetNativePath \ + (tclStubsPtr->tcl_FSGetNativePath) /* 469 */ +#endif +#ifndef Tcl_FSFileSystemInfo +#define Tcl_FSFileSystemInfo \ + (tclStubsPtr->tcl_FSFileSystemInfo) /* 470 */ +#endif +#ifndef Tcl_FSPathSeparator +#define Tcl_FSPathSeparator \ + (tclStubsPtr->tcl_FSPathSeparator) /* 471 */ +#endif +#ifndef Tcl_FSListVolumes +#define Tcl_FSListVolumes \ + (tclStubsPtr->tcl_FSListVolumes) /* 472 */ +#endif +#ifndef Tcl_FSRegister +#define Tcl_FSRegister \ + (tclStubsPtr->tcl_FSRegister) /* 473 */ +#endif +#ifndef Tcl_FSUnregister +#define Tcl_FSUnregister \ + (tclStubsPtr->tcl_FSUnregister) /* 474 */ +#endif +#ifndef Tcl_FSData +#define Tcl_FSData \ + (tclStubsPtr->tcl_FSData) /* 475 */ +#endif +#ifndef Tcl_FSGetTranslatedStringPath +#define Tcl_FSGetTranslatedStringPath \ + (tclStubsPtr->tcl_FSGetTranslatedStringPath) /* 476 */ +#endif +#ifndef Tcl_FSGetFileSystemForPath +#define Tcl_FSGetFileSystemForPath \ + (tclStubsPtr->tcl_FSGetFileSystemForPath) /* 477 */ +#endif +#ifndef Tcl_FSGetPathType +#define Tcl_FSGetPathType \ + (tclStubsPtr->tcl_FSGetPathType) /* 478 */ +#endif +#ifndef Tcl_OutputBuffered +#define Tcl_OutputBuffered \ + (tclStubsPtr->tcl_OutputBuffered) /* 479 */ +#endif +#ifndef Tcl_FSMountsChanged +#define Tcl_FSMountsChanged \ + (tclStubsPtr->tcl_FSMountsChanged) /* 480 */ +#endif +#ifndef Tcl_EvalTokensStandard +#define Tcl_EvalTokensStandard \ + (tclStubsPtr->tcl_EvalTokensStandard) /* 481 */ +#endif +#ifndef Tcl_GetTime +#define Tcl_GetTime \ + (tclStubsPtr->tcl_GetTime) /* 482 */ +#endif +#ifndef Tcl_CreateObjTrace +#define Tcl_CreateObjTrace \ + (tclStubsPtr->tcl_CreateObjTrace) /* 483 */ +#endif +#ifndef Tcl_GetCommandInfoFromToken +#define Tcl_GetCommandInfoFromToken \ + (tclStubsPtr->tcl_GetCommandInfoFromToken) /* 484 */ +#endif +#ifndef Tcl_SetCommandInfoFromToken +#define Tcl_SetCommandInfoFromToken \ + (tclStubsPtr->tcl_SetCommandInfoFromToken) /* 485 */ +#endif +#ifndef Tcl_DbNewWideIntObj +#define Tcl_DbNewWideIntObj \ + (tclStubsPtr->tcl_DbNewWideIntObj) /* 486 */ +#endif +#ifndef Tcl_GetWideIntFromObj +#define Tcl_GetWideIntFromObj \ + (tclStubsPtr->tcl_GetWideIntFromObj) /* 487 */ +#endif +#ifndef Tcl_NewWideIntObj +#define Tcl_NewWideIntObj \ + (tclStubsPtr->tcl_NewWideIntObj) /* 488 */ +#endif +#ifndef Tcl_SetWideIntObj +#define Tcl_SetWideIntObj \ + (tclStubsPtr->tcl_SetWideIntObj) /* 489 */ +#endif +#ifndef Tcl_AllocStatBuf +#define Tcl_AllocStatBuf \ + (tclStubsPtr->tcl_AllocStatBuf) /* 490 */ +#endif +#ifndef Tcl_Seek +#define Tcl_Seek \ + (tclStubsPtr->tcl_Seek) /* 491 */ +#endif +#ifndef Tcl_Tell +#define Tcl_Tell \ + (tclStubsPtr->tcl_Tell) /* 492 */ +#endif +#ifndef Tcl_ChannelWideSeekProc +#define Tcl_ChannelWideSeekProc \ + (tclStubsPtr->tcl_ChannelWideSeekProc) /* 493 */ +#endif +#ifndef Tcl_DictObjPut +#define Tcl_DictObjPut \ + (tclStubsPtr->tcl_DictObjPut) /* 494 */ +#endif +#ifndef Tcl_DictObjGet +#define Tcl_DictObjGet \ + (tclStubsPtr->tcl_DictObjGet) /* 495 */ +#endif +#ifndef Tcl_DictObjRemove +#define Tcl_DictObjRemove \ + (tclStubsPtr->tcl_DictObjRemove) /* 496 */ +#endif +#ifndef Tcl_DictObjSize +#define Tcl_DictObjSize \ + (tclStubsPtr->tcl_DictObjSize) /* 497 */ +#endif +#ifndef Tcl_DictObjFirst +#define Tcl_DictObjFirst \ + (tclStubsPtr->tcl_DictObjFirst) /* 498 */ +#endif +#ifndef Tcl_DictObjNext +#define Tcl_DictObjNext \ + (tclStubsPtr->tcl_DictObjNext) /* 499 */ +#endif +#ifndef Tcl_DictObjDone +#define Tcl_DictObjDone \ + (tclStubsPtr->tcl_DictObjDone) /* 500 */ +#endif +#ifndef Tcl_DictObjPutKeyList +#define Tcl_DictObjPutKeyList \ + (tclStubsPtr->tcl_DictObjPutKeyList) /* 501 */ +#endif +#ifndef Tcl_DictObjRemoveKeyList +#define Tcl_DictObjRemoveKeyList \ + (tclStubsPtr->tcl_DictObjRemoveKeyList) /* 502 */ +#endif +#ifndef Tcl_NewDictObj +#define Tcl_NewDictObj \ + (tclStubsPtr->tcl_NewDictObj) /* 503 */ +#endif +#ifndef Tcl_DbNewDictObj +#define Tcl_DbNewDictObj \ + (tclStubsPtr->tcl_DbNewDictObj) /* 504 */ +#endif +#ifndef Tcl_RegisterConfig +#define Tcl_RegisterConfig \ + (tclStubsPtr->tcl_RegisterConfig) /* 505 */ +#endif +#ifndef Tcl_CreateNamespace +#define Tcl_CreateNamespace \ + (tclStubsPtr->tcl_CreateNamespace) /* 506 */ +#endif +#ifndef Tcl_DeleteNamespace +#define Tcl_DeleteNamespace \ + (tclStubsPtr->tcl_DeleteNamespace) /* 507 */ +#endif +#ifndef Tcl_AppendExportList +#define Tcl_AppendExportList \ + (tclStubsPtr->tcl_AppendExportList) /* 508 */ +#endif +#ifndef Tcl_Export +#define Tcl_Export \ + (tclStubsPtr->tcl_Export) /* 509 */ +#endif +#ifndef Tcl_Import +#define Tcl_Import \ + (tclStubsPtr->tcl_Import) /* 510 */ +#endif +#ifndef Tcl_ForgetImport +#define Tcl_ForgetImport \ + (tclStubsPtr->tcl_ForgetImport) /* 511 */ +#endif +#ifndef Tcl_GetCurrentNamespace +#define Tcl_GetCurrentNamespace \ + (tclStubsPtr->tcl_GetCurrentNamespace) /* 512 */ +#endif +#ifndef Tcl_GetGlobalNamespace +#define Tcl_GetGlobalNamespace \ + (tclStubsPtr->tcl_GetGlobalNamespace) /* 513 */ +#endif +#ifndef Tcl_FindNamespace +#define Tcl_FindNamespace \ + (tclStubsPtr->tcl_FindNamespace) /* 514 */ +#endif +#ifndef Tcl_FindCommand +#define Tcl_FindCommand \ + (tclStubsPtr->tcl_FindCommand) /* 515 */ +#endif +#ifndef Tcl_GetCommandFromObj +#define Tcl_GetCommandFromObj \ + (tclStubsPtr->tcl_GetCommandFromObj) /* 516 */ +#endif +#ifndef Tcl_GetCommandFullName +#define Tcl_GetCommandFullName \ + (tclStubsPtr->tcl_GetCommandFullName) /* 517 */ +#endif +#ifndef Tcl_FSEvalFileEx +#define Tcl_FSEvalFileEx \ + (tclStubsPtr->tcl_FSEvalFileEx) /* 518 */ +#endif +#ifndef Tcl_SetExitProc +#define Tcl_SetExitProc \ + (tclStubsPtr->tcl_SetExitProc) /* 519 */ +#endif +#ifndef Tcl_LimitAddHandler +#define Tcl_LimitAddHandler \ + (tclStubsPtr->tcl_LimitAddHandler) /* 520 */ +#endif +#ifndef Tcl_LimitRemoveHandler +#define Tcl_LimitRemoveHandler \ + (tclStubsPtr->tcl_LimitRemoveHandler) /* 521 */ +#endif +#ifndef Tcl_LimitReady +#define Tcl_LimitReady \ + (tclStubsPtr->tcl_LimitReady) /* 522 */ +#endif +#ifndef Tcl_LimitCheck +#define Tcl_LimitCheck \ + (tclStubsPtr->tcl_LimitCheck) /* 523 */ +#endif +#ifndef Tcl_LimitExceeded +#define Tcl_LimitExceeded \ + (tclStubsPtr->tcl_LimitExceeded) /* 524 */ +#endif +#ifndef Tcl_LimitSetCommands +#define Tcl_LimitSetCommands \ + (tclStubsPtr->tcl_LimitSetCommands) /* 525 */ +#endif +#ifndef Tcl_LimitSetTime +#define Tcl_LimitSetTime \ + (tclStubsPtr->tcl_LimitSetTime) /* 526 */ +#endif +#ifndef Tcl_LimitSetGranularity +#define Tcl_LimitSetGranularity \ + (tclStubsPtr->tcl_LimitSetGranularity) /* 527 */ +#endif +#ifndef Tcl_LimitTypeEnabled +#define Tcl_LimitTypeEnabled \ + (tclStubsPtr->tcl_LimitTypeEnabled) /* 528 */ +#endif +#ifndef Tcl_LimitTypeExceeded +#define Tcl_LimitTypeExceeded \ + (tclStubsPtr->tcl_LimitTypeExceeded) /* 529 */ +#endif +#ifndef Tcl_LimitTypeSet +#define Tcl_LimitTypeSet \ + (tclStubsPtr->tcl_LimitTypeSet) /* 530 */ +#endif +#ifndef Tcl_LimitTypeReset +#define Tcl_LimitTypeReset \ + (tclStubsPtr->tcl_LimitTypeReset) /* 531 */ +#endif +#ifndef Tcl_LimitGetCommands +#define Tcl_LimitGetCommands \ + (tclStubsPtr->tcl_LimitGetCommands) /* 532 */ +#endif +#ifndef Tcl_LimitGetTime +#define Tcl_LimitGetTime \ + (tclStubsPtr->tcl_LimitGetTime) /* 533 */ +#endif +#ifndef Tcl_LimitGetGranularity +#define Tcl_LimitGetGranularity \ + (tclStubsPtr->tcl_LimitGetGranularity) /* 534 */ +#endif +#ifndef Tcl_SaveInterpState +#define Tcl_SaveInterpState \ + (tclStubsPtr->tcl_SaveInterpState) /* 535 */ +#endif +#ifndef Tcl_RestoreInterpState +#define Tcl_RestoreInterpState \ + (tclStubsPtr->tcl_RestoreInterpState) /* 536 */ +#endif +#ifndef Tcl_DiscardInterpState +#define Tcl_DiscardInterpState \ + (tclStubsPtr->tcl_DiscardInterpState) /* 537 */ +#endif +#ifndef Tcl_SetReturnOptions +#define Tcl_SetReturnOptions \ + (tclStubsPtr->tcl_SetReturnOptions) /* 538 */ +#endif +#ifndef Tcl_GetReturnOptions +#define Tcl_GetReturnOptions \ + (tclStubsPtr->tcl_GetReturnOptions) /* 539 */ +#endif +#ifndef Tcl_IsEnsemble +#define Tcl_IsEnsemble \ + (tclStubsPtr->tcl_IsEnsemble) /* 540 */ +#endif +#ifndef Tcl_CreateEnsemble +#define Tcl_CreateEnsemble \ + (tclStubsPtr->tcl_CreateEnsemble) /* 541 */ +#endif +#ifndef Tcl_FindEnsemble +#define Tcl_FindEnsemble \ + (tclStubsPtr->tcl_FindEnsemble) /* 542 */ +#endif +#ifndef Tcl_SetEnsembleSubcommandList +#define Tcl_SetEnsembleSubcommandList \ + (tclStubsPtr->tcl_SetEnsembleSubcommandList) /* 543 */ +#endif +#ifndef Tcl_SetEnsembleMappingDict +#define Tcl_SetEnsembleMappingDict \ + (tclStubsPtr->tcl_SetEnsembleMappingDict) /* 544 */ +#endif +#ifndef Tcl_SetEnsembleUnknownHandler +#define Tcl_SetEnsembleUnknownHandler \ + (tclStubsPtr->tcl_SetEnsembleUnknownHandler) /* 545 */ +#endif +#ifndef Tcl_SetEnsembleFlags +#define Tcl_SetEnsembleFlags \ + (tclStubsPtr->tcl_SetEnsembleFlags) /* 546 */ +#endif +#ifndef Tcl_GetEnsembleSubcommandList +#define Tcl_GetEnsembleSubcommandList \ + (tclStubsPtr->tcl_GetEnsembleSubcommandList) /* 547 */ +#endif +#ifndef Tcl_GetEnsembleMappingDict +#define Tcl_GetEnsembleMappingDict \ + (tclStubsPtr->tcl_GetEnsembleMappingDict) /* 548 */ +#endif +#ifndef Tcl_GetEnsembleUnknownHandler +#define Tcl_GetEnsembleUnknownHandler \ + (tclStubsPtr->tcl_GetEnsembleUnknownHandler) /* 549 */ +#endif +#ifndef Tcl_GetEnsembleFlags +#define Tcl_GetEnsembleFlags \ + (tclStubsPtr->tcl_GetEnsembleFlags) /* 550 */ +#endif +#ifndef Tcl_GetEnsembleNamespace +#define Tcl_GetEnsembleNamespace \ + (tclStubsPtr->tcl_GetEnsembleNamespace) /* 551 */ +#endif +#ifndef Tcl_SetTimeProc +#define Tcl_SetTimeProc \ + (tclStubsPtr->tcl_SetTimeProc) /* 552 */ +#endif +#ifndef Tcl_QueryTimeProc +#define Tcl_QueryTimeProc \ + (tclStubsPtr->tcl_QueryTimeProc) /* 553 */ +#endif +#ifndef Tcl_ChannelThreadActionProc +#define Tcl_ChannelThreadActionProc \ + (tclStubsPtr->tcl_ChannelThreadActionProc) /* 554 */ +#endif +#ifndef Tcl_NewBignumObj +#define Tcl_NewBignumObj \ + (tclStubsPtr->tcl_NewBignumObj) /* 555 */ +#endif +#ifndef Tcl_DbNewBignumObj +#define Tcl_DbNewBignumObj \ + (tclStubsPtr->tcl_DbNewBignumObj) /* 556 */ +#endif +#ifndef Tcl_SetBignumObj +#define Tcl_SetBignumObj \ + (tclStubsPtr->tcl_SetBignumObj) /* 557 */ +#endif +#ifndef Tcl_GetBignumFromObj +#define Tcl_GetBignumFromObj \ + (tclStubsPtr->tcl_GetBignumFromObj) /* 558 */ +#endif +#ifndef Tcl_TakeBignumFromObj +#define Tcl_TakeBignumFromObj \ + (tclStubsPtr->tcl_TakeBignumFromObj) /* 559 */ +#endif +#ifndef Tcl_TruncateChannel +#define Tcl_TruncateChannel \ + (tclStubsPtr->tcl_TruncateChannel) /* 560 */ +#endif +#ifndef Tcl_ChannelTruncateProc +#define Tcl_ChannelTruncateProc \ + (tclStubsPtr->tcl_ChannelTruncateProc) /* 561 */ +#endif +#ifndef Tcl_SetChannelErrorInterp +#define Tcl_SetChannelErrorInterp \ + (tclStubsPtr->tcl_SetChannelErrorInterp) /* 562 */ +#endif +#ifndef Tcl_GetChannelErrorInterp +#define Tcl_GetChannelErrorInterp \ + (tclStubsPtr->tcl_GetChannelErrorInterp) /* 563 */ +#endif +#ifndef Tcl_SetChannelError +#define Tcl_SetChannelError \ + (tclStubsPtr->tcl_SetChannelError) /* 564 */ +#endif +#ifndef Tcl_GetChannelError +#define Tcl_GetChannelError \ + (tclStubsPtr->tcl_GetChannelError) /* 565 */ +#endif +#ifndef Tcl_InitBignumFromDouble +#define Tcl_InitBignumFromDouble \ + (tclStubsPtr->tcl_InitBignumFromDouble) /* 566 */ +#endif +#ifndef Tcl_GetNamespaceUnknownHandler +#define Tcl_GetNamespaceUnknownHandler \ + (tclStubsPtr->tcl_GetNamespaceUnknownHandler) /* 567 */ +#endif +#ifndef Tcl_SetNamespaceUnknownHandler +#define Tcl_SetNamespaceUnknownHandler \ + (tclStubsPtr->tcl_SetNamespaceUnknownHandler) /* 568 */ +#endif +#ifndef Tcl_GetEncodingFromObj +#define Tcl_GetEncodingFromObj \ + (tclStubsPtr->tcl_GetEncodingFromObj) /* 569 */ +#endif +#ifndef Tcl_GetEncodingSearchPath +#define Tcl_GetEncodingSearchPath \ + (tclStubsPtr->tcl_GetEncodingSearchPath) /* 570 */ +#endif +#ifndef Tcl_SetEncodingSearchPath +#define Tcl_SetEncodingSearchPath \ + (tclStubsPtr->tcl_SetEncodingSearchPath) /* 571 */ +#endif +#ifndef Tcl_GetEncodingNameFromEnvironment +#define Tcl_GetEncodingNameFromEnvironment \ + (tclStubsPtr->tcl_GetEncodingNameFromEnvironment) /* 572 */ +#endif +#ifndef Tcl_PkgRequireProc +#define Tcl_PkgRequireProc \ + (tclStubsPtr->tcl_PkgRequireProc) /* 573 */ +#endif +#ifndef Tcl_AppendObjToErrorInfo +#define Tcl_AppendObjToErrorInfo \ + (tclStubsPtr->tcl_AppendObjToErrorInfo) /* 574 */ +#endif +#ifndef Tcl_AppendLimitedToObj +#define Tcl_AppendLimitedToObj \ + (tclStubsPtr->tcl_AppendLimitedToObj) /* 575 */ +#endif +#ifndef Tcl_Format +#define Tcl_Format \ + (tclStubsPtr->tcl_Format) /* 576 */ +#endif +#ifndef Tcl_AppendFormatToObj +#define Tcl_AppendFormatToObj \ + (tclStubsPtr->tcl_AppendFormatToObj) /* 577 */ +#endif +#ifndef Tcl_ObjPrintf +#define Tcl_ObjPrintf \ + (tclStubsPtr->tcl_ObjPrintf) /* 578 */ +#endif +#ifndef Tcl_AppendPrintfToObj +#define Tcl_AppendPrintfToObj \ + (tclStubsPtr->tcl_AppendPrintfToObj) /* 579 */ +#endif +/* Slot 580 is reserved */ +/* Slot 581 is reserved */ +/* Slot 582 is reserved */ +/* Slot 583 is reserved */ +/* Slot 584 is reserved */ +/* Slot 585 is reserved */ +/* Slot 586 is reserved */ +/* Slot 587 is reserved */ +/* Slot 588 is reserved */ +/* Slot 589 is reserved */ +/* Slot 590 is reserved */ +/* Slot 591 is reserved */ +/* Slot 592 is reserved */ +/* Slot 593 is reserved */ +/* Slot 594 is reserved */ +/* Slot 595 is reserved */ +/* Slot 596 is reserved */ +/* Slot 597 is reserved */ +/* Slot 598 is reserved */ +/* Slot 599 is reserved */ +/* Slot 600 is reserved */ +/* Slot 601 is reserved */ +/* Slot 602 is reserved */ +/* Slot 603 is reserved */ +/* Slot 604 is reserved */ +/* Slot 605 is reserved */ +/* Slot 606 is reserved */ +/* Slot 607 is reserved */ +/* Slot 608 is reserved */ +/* Slot 609 is reserved */ +/* Slot 610 is reserved */ +/* Slot 611 is reserved */ +/* Slot 612 is reserved */ +/* Slot 613 is reserved */ +/* Slot 614 is reserved */ +/* Slot 615 is reserved */ +/* Slot 616 is reserved */ +/* Slot 617 is reserved */ +/* Slot 618 is reserved */ +/* Slot 619 is reserved */ +/* Slot 620 is reserved */ +/* Slot 621 is reserved */ +/* Slot 622 is reserved */ +/* Slot 623 is reserved */ +/* Slot 624 is reserved */ +/* Slot 625 is reserved */ +/* Slot 626 is reserved */ +/* Slot 627 is reserved */ +/* Slot 628 is reserved */ +/* Slot 629 is reserved */ +#ifndef TclUnusedStubEntry +#define TclUnusedStubEntry \ + (tclStubsPtr->tclUnusedStubEntry) /* 630 */ +#endif + +#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */ + +/* !END!: Do not edit above this line. */ + +#undef TclUnusedStubEntry + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +/* + * Deprecated Tcl procedures: + */ +#if defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) +# undef Tcl_EvalObj +# define Tcl_EvalObj(interp,objPtr) \ + Tcl_EvalObjEx((interp),(objPtr),0) +# undef Tcl_GlobalEvalObj +# define Tcl_GlobalEvalObj(interp,objPtr) \ + Tcl_EvalObjEx((interp),(objPtr),TCL_EVAL_GLOBAL) +#endif + +#endif /* _TCLDECLS */ + diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tclPlatDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tclPlatDecls.h new file mode 100644 index 00000000..8652e8d7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tclPlatDecls.h @@ -0,0 +1,134 @@ +/* + * tclPlatDecls.h -- + * + * Declarations of platform specific Tcl APIs. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * All rights reserved. + */ + +#ifndef _TCLPLATDECLS +#define _TCLPLATDECLS + +#undef TCL_STORAGE_CLASS +#ifdef BUILD_tcl +# define TCL_STORAGE_CLASS DLLEXPORT +#else +# ifdef USE_TCL_STUBS +# define TCL_STORAGE_CLASS +# else +# define TCL_STORAGE_CLASS DLLIMPORT +# endif +#endif + +/* + * TCHAR is needed here for win32, so if it is not defined yet do it here. + * This way, we don't need to include just for one define. + */ +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(_TCHAR_DEFINED) +# if defined(_UNICODE) + typedef wchar_t TCHAR; +# else + typedef char TCHAR; +# endif +# define _TCHAR_DEFINED +#endif + +/* !BEGIN!: Do not edit below this line. */ + +/* + * Exported function declarations: + */ + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ +#ifndef Tcl_WinUtfToTChar_TCL_DECLARED +#define Tcl_WinUtfToTChar_TCL_DECLARED +/* 0 */ +EXTERN TCHAR * Tcl_WinUtfToTChar(CONST char *str, int len, + Tcl_DString *dsPtr); +#endif +#ifndef Tcl_WinTCharToUtf_TCL_DECLARED +#define Tcl_WinTCharToUtf_TCL_DECLARED +/* 1 */ +EXTERN char * Tcl_WinTCharToUtf(CONST TCHAR *str, int len, + Tcl_DString *dsPtr); +#endif +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#ifndef Tcl_MacOSXOpenBundleResources_TCL_DECLARED +#define Tcl_MacOSXOpenBundleResources_TCL_DECLARED +/* 0 */ +EXTERN int Tcl_MacOSXOpenBundleResources(Tcl_Interp *interp, + CONST char *bundleName, int hasResourceFile, + int maxPathLen, char *libraryPath); +#endif +#ifndef Tcl_MacOSXOpenVersionedBundleResources_TCL_DECLARED +#define Tcl_MacOSXOpenVersionedBundleResources_TCL_DECLARED +/* 1 */ +EXTERN int Tcl_MacOSXOpenVersionedBundleResources( + Tcl_Interp *interp, CONST char *bundleName, + CONST char *bundleVersion, + int hasResourceFile, int maxPathLen, + char *libraryPath); +#endif +#endif /* MACOSX */ + +typedef struct TclPlatStubs { + int magic; + struct TclPlatStubHooks *hooks; + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ + TCHAR * (*tcl_WinUtfToTChar) (CONST char *str, int len, Tcl_DString *dsPtr); /* 0 */ + char * (*tcl_WinTCharToUtf) (CONST TCHAR *str, int len, Tcl_DString *dsPtr); /* 1 */ +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ + int (*tcl_MacOSXOpenBundleResources) (Tcl_Interp *interp, CONST char *bundleName, int hasResourceFile, int maxPathLen, char *libraryPath); /* 0 */ + int (*tcl_MacOSXOpenVersionedBundleResources) (Tcl_Interp *interp, CONST char *bundleName, CONST char *bundleVersion, int hasResourceFile, int maxPathLen, char *libraryPath); /* 1 */ +#endif /* MACOSX */ +} TclPlatStubs; + +#ifdef __cplusplus +extern "C" { +#endif +extern TclPlatStubs *tclPlatStubsPtr; +#ifdef __cplusplus +} +#endif + +#if defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) + +/* + * Inline function declarations: + */ + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ +#ifndef Tcl_WinUtfToTChar +#define Tcl_WinUtfToTChar \ + (tclPlatStubsPtr->tcl_WinUtfToTChar) /* 0 */ +#endif +#ifndef Tcl_WinTCharToUtf +#define Tcl_WinTCharToUtf \ + (tclPlatStubsPtr->tcl_WinTCharToUtf) /* 1 */ +#endif +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#ifndef Tcl_MacOSXOpenBundleResources +#define Tcl_MacOSXOpenBundleResources \ + (tclPlatStubsPtr->tcl_MacOSXOpenBundleResources) /* 0 */ +#endif +#ifndef Tcl_MacOSXOpenVersionedBundleResources +#define Tcl_MacOSXOpenVersionedBundleResources \ + (tclPlatStubsPtr->tcl_MacOSXOpenVersionedBundleResources) /* 1 */ +#endif +#endif /* MACOSX */ + +#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */ + +/* !END!: Do not edit above this line. */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#endif /* _TCLPLATDECLS */ + + diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tk.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tk.h new file mode 100644 index 00000000..e356ce5d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tk.h @@ -0,0 +1,1610 @@ +/* + * tk.h -- + * + * Declarations for Tk-related things that are visible outside of the Tk + * module itself. + * + * Copyright (c) 1989-1994 The Regents of the University of California. + * Copyright (c) 1994 The Australian National University. + * Copyright (c) 1994-1998 Sun Microsystems, Inc. + * Copyright (c) 1998-2000 Ajuba Solutions. + * + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TK +#define _TK + +#include +#if (TCL_MAJOR_VERSION != 8) || (TCL_MINOR_VERSION < 5) +# error Tk 8.5 must be compiled with tcl.h from Tcl 8.5 or better +#endif + +#ifndef _ANSI_ARGS_ +# ifndef NO_PROTOTYPES +# define _ANSI_ARGS_(x) x +# else +# define _ANSI_ARGS_(x) () +# endif +#endif + +/* + * For C++ compilers, use extern "C" + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * When version numbers change here, you must also go into the following files + * and update the version numbers: + * + * library/tk.tcl (1 LOC patch) + * unix/configure.in (2 LOC Major, 2 LOC minor, 1 LOC patch) + * win/configure.in (as above) + * README (sections 0 and 1) + * macosx/Wish.xcode/project.pbxproj (not patchlevel) 1 LOC + * macosx/Wish-Common.xcconfig (not patchlevel) 1 LOC + * win/README (not patchlevel) + * unix/README (not patchlevel) + * unix/tk.spec (1 LOC patch) + * win/tcl.m4 (not patchlevel) + * + * You may also need to update some of these files when the numbers change for + * the version of Tcl that this release of Tk is compiled against. + */ + +#define TK_MAJOR_VERSION 8 +#define TK_MINOR_VERSION 5 +#define TK_RELEASE_LEVEL TCL_FINAL_RELEASE +#define TK_RELEASE_SERIAL 18 + +#define TK_VERSION "8.5" +#define TK_PATCH_LEVEL "8.5.18" + +/* + * A special definition used to allow this header file to be included from + * windows or mac resource files so that they can obtain version information. + * RC_INVOKED is defined by default by the windows RC tool and manually set + * for macintosh. + * + * Resource compilers don't like all the C stuff, like typedefs and procedure + * declarations, that occur below, so block them out. + */ + +#ifndef RC_INVOKED + +#ifndef _XLIB_H +# include +# ifdef MAC_OSX_TK +# include +# endif +#endif +#ifdef __STDC__ +# include +#endif + +#ifdef BUILD_tk +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLEXPORT +#endif + +/* + *---------------------------------------------------------------------- + * + * Decide whether or not to use input methods. + */ + +#ifdef XNQueryInputStyle +#define TK_USE_INPUT_METHODS +#endif + +/* + * Dummy types that are used by clients: + */ + +typedef struct Tk_BindingTable_ *Tk_BindingTable; +typedef struct Tk_Canvas_ *Tk_Canvas; +typedef struct Tk_Cursor_ *Tk_Cursor; +typedef struct Tk_ErrorHandler_ *Tk_ErrorHandler; +typedef struct Tk_Font_ *Tk_Font; +typedef struct Tk_Image__ *Tk_Image; +typedef struct Tk_ImageMaster_ *Tk_ImageMaster; +typedef struct Tk_OptionTable_ *Tk_OptionTable; +typedef struct Tk_PostscriptInfo_ *Tk_PostscriptInfo; +typedef struct Tk_TextLayout_ *Tk_TextLayout; +typedef struct Tk_Window_ *Tk_Window; +typedef struct Tk_3DBorder_ *Tk_3DBorder; +typedef struct Tk_Style_ *Tk_Style; +typedef struct Tk_StyleEngine_ *Tk_StyleEngine; +typedef struct Tk_StyledElement_ *Tk_StyledElement; + +/* + * Additional types exported to clients. + */ + +typedef const char *Tk_Uid; + +/* + *---------------------------------------------------------------------- + * + * The enum below defines the valid types for Tk configuration options as + * implemented by Tk_InitOptions, Tk_SetOptions, etc. + */ + +typedef enum { + TK_OPTION_BOOLEAN, + TK_OPTION_INT, + TK_OPTION_DOUBLE, + TK_OPTION_STRING, + TK_OPTION_STRING_TABLE, + TK_OPTION_COLOR, + TK_OPTION_FONT, + TK_OPTION_BITMAP, + TK_OPTION_BORDER, + TK_OPTION_RELIEF, + TK_OPTION_CURSOR, + TK_OPTION_JUSTIFY, + TK_OPTION_ANCHOR, + TK_OPTION_SYNONYM, + TK_OPTION_PIXELS, + TK_OPTION_WINDOW, + TK_OPTION_END, + TK_OPTION_CUSTOM, + TK_OPTION_STYLE +} Tk_OptionType; + +/* + * Structures of the following type are used by widgets to specify their + * configuration options. Typically each widget has a static array of these + * structures, where each element of the array describes a single + * configuration option. The array is passed to Tk_CreateOptionTable. + */ + +typedef struct Tk_OptionSpec { + Tk_OptionType type; /* Type of option, such as TK_OPTION_COLOR; + * see definitions above. Last option in table + * must have type TK_OPTION_END. */ + const char *optionName; /* Name used to specify option in Tcl + * commands. */ + const char *dbName; /* Name for option in option database. */ + const char *dbClass; /* Class for option in database. */ + const char *defValue; /* Default value for option if not specified + * in command line, the option database, or + * the system. */ + int objOffset; /* Where in record to store a Tcl_Obj * that + * holds the value of this option, specified + * as an offset in bytes from the start of the + * record. Use the Tk_Offset macro to generate + * values for this. -1 means don't store the + * Tcl_Obj in the record. */ + int internalOffset; /* Where in record to store the internal + * representation of the value of this option, + * such as an int or XColor *. This field is + * specified as an offset in bytes from the + * start of the record. Use the Tk_Offset + * macro to generate values for it. -1 means + * don't store the internal representation in + * the record. */ + int flags; /* Any combination of the values defined + * below. */ + ClientData clientData; /* An alternate place to put option-specific + * data. Used for the monochrome default value + * for colors, etc. */ + int typeMask; /* An arbitrary bit mask defined by the class + * manager; typically bits correspond to + * certain kinds of options such as all those + * that require a redisplay when they change. + * Tk_SetOptions returns the bit-wise OR of + * the typeMasks of all options that were + * changed. */ +} Tk_OptionSpec; + +/* + * Flag values for Tk_OptionSpec structures. These flags are shared by + * Tk_ConfigSpec structures, so be sure to coordinate any changes carefully. + */ + +#define TK_OPTION_NULL_OK (1 << 0) +#define TK_OPTION_DONT_SET_DEFAULT (1 << 3) + +/* + * The following structure and function types are used by TK_OPTION_CUSTOM + * options; the structure holds pointers to the functions needed by the Tk + * option config code to handle a custom option. + */ + +typedef int (Tk_CustomOptionSetProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj **value, char *widgRec, + int offset, char *saveInternalPtr, int flags)); +typedef Tcl_Obj *(Tk_CustomOptionGetProc) _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *widgRec, int offset)); +typedef void (Tk_CustomOptionRestoreProc) _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *internalPtr, char *saveInternalPtr)); +typedef void (Tk_CustomOptionFreeProc) _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *internalPtr)); + +typedef struct Tk_ObjCustomOption { + const char *name; /* Name of the custom option. */ + Tk_CustomOptionSetProc *setProc; + /* Function to use to set a record's option + * value from a Tcl_Obj */ + Tk_CustomOptionGetProc *getProc; + /* Function to use to get a Tcl_Obj + * representation from an internal + * representation of an option. */ + Tk_CustomOptionRestoreProc *restoreProc; + /* Function to use to restore a saved value + * for the internal representation. */ + Tk_CustomOptionFreeProc *freeProc; + /* Function to use to free the internal + * representation of an option. */ + ClientData clientData; /* Arbitrary one-word value passed to the + * handling procs. */ +} Tk_ObjCustomOption; + +/* + * Macro to use to fill in "offset" fields of the Tk_OptionSpec structure. + * Computes number of bytes from beginning of structure to a given field. + */ + +#ifdef offsetof +#define Tk_Offset(type, field) ((int) offsetof(type, field)) +#else +#define Tk_Offset(type, field) ((int) ((char *) &((type *) 0)->field)) +#endif + +/* + * The following two structures are used for error handling. When config + * options are being modified, the old values are saved in a Tk_SavedOptions + * structure. If an error occurs, then the contents of the structure can be + * used to restore all of the old values. The contents of this structure are + * for the private use Tk. No-one outside Tk should ever read or write any of + * the fields of these structures. + */ + +typedef struct Tk_SavedOption { + struct TkOption *optionPtr; /* Points to information that describes the + * option. */ + Tcl_Obj *valuePtr; /* The old value of the option, in the form of + * a Tcl object; may be NULL if the value was + * not saved as an object. */ + double internalForm; /* The old value of the option, in some + * internal representation such as an int or + * (XColor *). Valid only if the field + * optionPtr->specPtr->objOffset is < 0. The + * space must be large enough to accommodate a + * double, a long, or a pointer; right now it + * looks like a double (i.e., 8 bytes) is big + * enough. Also, using a double guarantees + * that the field is properly aligned for + * storing large values. */ +} Tk_SavedOption; + +#ifdef TCL_MEM_DEBUG +# define TK_NUM_SAVED_OPTIONS 2 +#else +# define TK_NUM_SAVED_OPTIONS 20 +#endif + +typedef struct Tk_SavedOptions { + char *recordPtr; /* The data structure in which to restore + * configuration options. */ + Tk_Window tkwin; /* Window associated with recordPtr; needed to + * restore certain options. */ + int numItems; /* The number of valid items in items field. */ + Tk_SavedOption items[TK_NUM_SAVED_OPTIONS]; + /* Items used to hold old values. */ + struct Tk_SavedOptions *nextPtr; + /* Points to next structure in list; needed if + * too many options changed to hold all the + * old values in a single structure. NULL + * means no more structures. */ +} Tk_SavedOptions; + +/* + * Structure used to describe application-specific configuration options: + * indicates procedures to call to parse an option and to return a text string + * describing an option. THESE ARE DEPRECATED; PLEASE USE THE NEW STRUCTURES + * LISTED ABOVE. + */ + +/* + * This is a temporary flag used while tkObjConfig and new widgets are in + * development. + */ + +#ifndef __NO_OLD_CONFIG + +typedef int (Tk_OptionParseProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, CONST84 char *value, char *widgRec, + int offset)); +typedef char *(Tk_OptionPrintProc) _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *widgRec, int offset, + Tcl_FreeProc **freeProcPtr)); + +typedef struct Tk_CustomOption { + Tk_OptionParseProc *parseProc; + /* Procedure to call to parse an option and + * store it in converted form. */ + Tk_OptionPrintProc *printProc; + /* Procedure to return a printable string + * describing an existing option. */ + ClientData clientData; /* Arbitrary one-word value used by option + * parser: passed to parseProc and + * printProc. */ +} Tk_CustomOption; + +/* + * Structure used to specify information for Tk_ConfigureWidget. Each + * structure gives complete information for one option, including how the + * option is specified on the command line, where it appears in the option + * database, etc. + */ + +typedef struct Tk_ConfigSpec { + int type; /* Type of option, such as TK_CONFIG_COLOR; + * see definitions below. Last option in table + * must have type TK_CONFIG_END. */ + char *argvName; /* Switch used to specify option in argv. NULL + * means this spec is part of a group. */ + Tk_Uid dbName; /* Name for option in option database. */ + Tk_Uid dbClass; /* Class for option in database. */ + Tk_Uid defValue; /* Default value for option if not specified + * in command line or database. */ + int offset; /* Where in widget record to store value; use + * Tk_Offset macro to generate values for + * this. */ + int specFlags; /* Any combination of the values defined + * below; other bits are used internally by + * tkConfig.c. */ + Tk_CustomOption *customPtr; /* If type is TK_CONFIG_CUSTOM then this is a + * pointer to info about how to parse and + * print the option. Otherwise it is + * irrelevant. */ +} Tk_ConfigSpec; + +/* + * Type values for Tk_ConfigSpec structures. See the user documentation for + * details. + */ + +typedef enum { + TK_CONFIG_BOOLEAN, TK_CONFIG_INT, TK_CONFIG_DOUBLE, TK_CONFIG_STRING, + TK_CONFIG_UID, TK_CONFIG_COLOR, TK_CONFIG_FONT, TK_CONFIG_BITMAP, + TK_CONFIG_BORDER, TK_CONFIG_RELIEF, TK_CONFIG_CURSOR, + TK_CONFIG_ACTIVE_CURSOR, TK_CONFIG_JUSTIFY, TK_CONFIG_ANCHOR, + TK_CONFIG_SYNONYM, TK_CONFIG_CAP_STYLE, TK_CONFIG_JOIN_STYLE, + TK_CONFIG_PIXELS, TK_CONFIG_MM, TK_CONFIG_WINDOW, TK_CONFIG_CUSTOM, + TK_CONFIG_END +} Tk_ConfigTypes; + +/* + * Possible values for flags argument to Tk_ConfigureWidget: + */ + +#define TK_CONFIG_ARGV_ONLY 1 +#define TK_CONFIG_OBJS 0x80 + +/* + * Possible flag values for Tk_ConfigSpec structures. Any bits at or above + * TK_CONFIG_USER_BIT may be used by clients for selecting certain entries. + * Before changing any values here, coordinate with tkOldConfig.c + * (internal-use-only flags are defined there). + */ + +#define TK_CONFIG_NULL_OK (1 << 0) +#define TK_CONFIG_COLOR_ONLY (1 << 1) +#define TK_CONFIG_MONO_ONLY (1 << 2) +#define TK_CONFIG_DONT_SET_DEFAULT (1 << 3) +#define TK_CONFIG_OPTION_SPECIFIED (1 << 4) +#define TK_CONFIG_USER_BIT 0x100 +#endif /* __NO_OLD_CONFIG */ + +/* + * Structure used to specify how to handle argv options. + */ + +typedef struct { + char *key; /* The key string that flags the option in the + * argv array. */ + int type; /* Indicates option type; see below. */ + char *src; /* Value to be used in setting dst; usage + * depends on type. */ + char *dst; /* Address of value to be modified; usage + * depends on type. */ + char *help; /* Documentation message describing this + * option. */ +} Tk_ArgvInfo; + +/* + * Legal values for the type field of a Tk_ArgvInfo: see the user + * documentation for details. + */ + +#define TK_ARGV_CONSTANT 15 +#define TK_ARGV_INT 16 +#define TK_ARGV_STRING 17 +#define TK_ARGV_UID 18 +#define TK_ARGV_REST 19 +#define TK_ARGV_FLOAT 20 +#define TK_ARGV_FUNC 21 +#define TK_ARGV_GENFUNC 22 +#define TK_ARGV_HELP 23 +#define TK_ARGV_CONST_OPTION 24 +#define TK_ARGV_OPTION_VALUE 25 +#define TK_ARGV_OPTION_NAME_VALUE 26 +#define TK_ARGV_END 27 + +/* + * Flag bits for passing to Tk_ParseArgv: + */ + +#define TK_ARGV_NO_DEFAULTS 0x1 +#define TK_ARGV_NO_LEFTOVERS 0x2 +#define TK_ARGV_NO_ABBREV 0x4 +#define TK_ARGV_DONT_SKIP_FIRST_ARG 0x8 + +/* + * Enumerated type for describing actions to be taken in response to a + * restrictProc established by Tk_RestrictEvents. + */ + +typedef enum { + TK_DEFER_EVENT, TK_PROCESS_EVENT, TK_DISCARD_EVENT +} Tk_RestrictAction; + +/* + * Priority levels to pass to Tk_AddOption: + */ + +#define TK_WIDGET_DEFAULT_PRIO 20 +#define TK_STARTUP_FILE_PRIO 40 +#define TK_USER_DEFAULT_PRIO 60 +#define TK_INTERACTIVE_PRIO 80 +#define TK_MAX_PRIO 100 + +/* + * Relief values returned by Tk_GetRelief: + */ + +#define TK_RELIEF_NULL -1 +#define TK_RELIEF_FLAT 0 +#define TK_RELIEF_GROOVE 1 +#define TK_RELIEF_RAISED 2 +#define TK_RELIEF_RIDGE 3 +#define TK_RELIEF_SOLID 4 +#define TK_RELIEF_SUNKEN 5 + +/* + * "Which" argument values for Tk_3DBorderGC: + */ + +#define TK_3D_FLAT_GC 1 +#define TK_3D_LIGHT_GC 2 +#define TK_3D_DARK_GC 3 + +/* + * Special EnterNotify/LeaveNotify "mode" for use in events generated by + * tkShare.c. Pick a high enough value that it's unlikely to conflict with + * existing values (like NotifyNormal) or any new values defined in the + * future. + */ + +#define TK_NOTIFY_SHARE 20 + +/* + * Enumerated type for describing a point by which to anchor something: + */ + +typedef enum { + TK_ANCHOR_N, TK_ANCHOR_NE, TK_ANCHOR_E, TK_ANCHOR_SE, + TK_ANCHOR_S, TK_ANCHOR_SW, TK_ANCHOR_W, TK_ANCHOR_NW, + TK_ANCHOR_CENTER +} Tk_Anchor; + +/* + * Enumerated type for describing a style of justification: + */ + +typedef enum { + TK_JUSTIFY_LEFT, TK_JUSTIFY_RIGHT, TK_JUSTIFY_CENTER +} Tk_Justify; + +/* + * The following structure is used by Tk_GetFontMetrics() to return + * information about the properties of a Tk_Font. + */ + +typedef struct Tk_FontMetrics { + int ascent; /* The amount in pixels that the tallest + * letter sticks up above the baseline, plus + * any extra blank space added by the designer + * of the font. */ + int descent; /* The largest amount in pixels that any + * letter sticks below the baseline, plus any + * extra blank space added by the designer of + * the font. */ + int linespace; /* The sum of the ascent and descent. How far + * apart two lines of text in the same font + * should be placed so that none of the + * characters in one line overlap any of the + * characters in the other line. */ +} Tk_FontMetrics; + +/* + * Flags passed to Tk_MeasureChars: + */ + +#define TK_WHOLE_WORDS 1 +#define TK_AT_LEAST_ONE 2 +#define TK_PARTIAL_OK 4 + +/* + * Flags passed to Tk_ComputeTextLayout: + */ + +#define TK_IGNORE_TABS 8 +#define TK_IGNORE_NEWLINES 16 + +/* + * Widget class procedures used to implement platform specific widget + * behavior. + */ + +typedef Window (Tk_ClassCreateProc) _ANSI_ARGS_((Tk_Window tkwin, + Window parent, ClientData instanceData)); +typedef void (Tk_ClassWorldChangedProc) _ANSI_ARGS_((ClientData instanceData)); +typedef void (Tk_ClassModalProc) _ANSI_ARGS_((Tk_Window tkwin, + XEvent *eventPtr)); + +typedef struct Tk_ClassProcs { + unsigned int size; + Tk_ClassWorldChangedProc *worldChangedProc; + /* Procedure to invoke when the widget needs + * to respond in some way to a change in the + * world (font changes, etc.) */ + Tk_ClassCreateProc *createProc; + /* Procedure to invoke when the platform- + * dependent window needs to be created. */ + Tk_ClassModalProc *modalProc; + /* Procedure to invoke after all bindings on a + * widget have been triggered in order to + * handle a modal loop. */ +} Tk_ClassProcs; + +/* + * Simple accessor for Tk_ClassProcs structure. Checks that the structure is + * not NULL, then checks the size field and returns either the requested + * field, if present, or NULL if the structure is too small to have the field + * (or NULL if the structure is NULL). + * + * A more general version of this function may be useful if other + * size-versioned structure pop up in the future: + * + * #define Tk_GetField(name, who, which) \ + * (((who) == NULL) ? NULL : + * (((who)->size <= Tk_Offset(name, which)) ? NULL :(name)->which)) + */ + +#define Tk_GetClassProc(procs, which) \ + (((procs) == NULL) ? NULL : \ + (((procs)->size <= Tk_Offset(Tk_ClassProcs, which)) ? NULL:(procs)->which)) + +/* + * Each geometry manager (the packer, the placer, etc.) is represented by a + * structure of the following form, which indicates procedures to invoke in + * the geometry manager to carry out certain functions. + */ + +typedef void (Tk_GeomRequestProc) _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin)); +typedef void (Tk_GeomLostSlaveProc) _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin)); + +typedef struct Tk_GeomMgr { + const char *name; /* Name of the geometry manager (command used + * to invoke it, or name of widget class that + * allows embedded widgets). */ + Tk_GeomRequestProc *requestProc; + /* Procedure to invoke when a slave's + * requested geometry changes. */ + Tk_GeomLostSlaveProc *lostSlaveProc; + /* Procedure to invoke when a slave is taken + * away from one geometry manager by another. + * NULL means geometry manager doesn't care + * when slaves are lost. */ +} Tk_GeomMgr; + +/* + * Result values returned by Tk_GetScrollInfo: + */ + +#define TK_SCROLL_MOVETO 1 +#define TK_SCROLL_PAGES 2 +#define TK_SCROLL_UNITS 3 +#define TK_SCROLL_ERROR 4 + +/* + *---------------------------------------------------------------------- + * + * Extensions to the X event set + * + *---------------------------------------------------------------------- + */ + +#define VirtualEvent (MappingNotify + 1) +#define ActivateNotify (MappingNotify + 2) +#define DeactivateNotify (MappingNotify + 3) +#define MouseWheelEvent (MappingNotify + 4) +#define TK_LASTEVENT (MappingNotify + 5) + +#define MouseWheelMask (1L << 28) +#define ActivateMask (1L << 29) +#define VirtualEventMask (1L << 30) + +/* + * A virtual event shares most of its fields with the XKeyEvent and + * XButtonEvent structures. 99% of the time a virtual event will be an + * abstraction of a key or button event, so this structure provides the most + * information to the user. The only difference is the changing of the detail + * field for a virtual event so that it holds the name of the virtual event + * being triggered. + * + * When using this structure, you should ensure that you zero out all the + * fields first using memset() or bzero(). + */ + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server. */ + Bool send_event; /* True if this came from a SendEvent + * request. */ + Display *display; /* Display the event was read from. */ + Window event; /* Window on which event was requested. */ + Window root; /* Root window that the event occured on. */ + Window subwindow; /* Child window. */ + Time time; /* Milliseconds. */ + int x, y; /* Pointer x, y coordinates in event + * window. */ + int x_root, y_root; /* Coordinates relative to root. */ + unsigned int state; /* Key or button mask */ + Tk_Uid name; /* Name of virtual event. */ + Bool same_screen; /* Same screen flag. */ + Tcl_Obj *user_data; /* Application-specific data reference; Tk + * will decrement the reference count *once* + * when it has finished processing the + * event. */ +} XVirtualEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server. */ + Bool send_event; /* True if this came from a SendEvent + * request. */ + Display *display; /* Display the event was read from. */ + Window window; /* Window in which event occurred. */ +} XActivateDeactivateEvent; +typedef XActivateDeactivateEvent XActivateEvent; +typedef XActivateDeactivateEvent XDeactivateEvent; + +/* + *---------------------------------------------------------------------- + * + * Macros for querying Tk_Window structures. See the manual entries for + * documentation. + * + *---------------------------------------------------------------------- + */ + +#define Tk_Display(tkwin) (((Tk_FakeWin *) (tkwin))->display) +#define Tk_ScreenNumber(tkwin) (((Tk_FakeWin *) (tkwin))->screenNum) +#define Tk_Screen(tkwin) \ + (ScreenOfDisplay(Tk_Display(tkwin), Tk_ScreenNumber(tkwin))) +#define Tk_Depth(tkwin) (((Tk_FakeWin *) (tkwin))->depth) +#define Tk_Visual(tkwin) (((Tk_FakeWin *) (tkwin))->visual) +#define Tk_WindowId(tkwin) (((Tk_FakeWin *) (tkwin))->window) +#define Tk_PathName(tkwin) (((Tk_FakeWin *) (tkwin))->pathName) +#define Tk_Name(tkwin) (((Tk_FakeWin *) (tkwin))->nameUid) +#define Tk_Class(tkwin) (((Tk_FakeWin *) (tkwin))->classUid) +#define Tk_X(tkwin) (((Tk_FakeWin *) (tkwin))->changes.x) +#define Tk_Y(tkwin) (((Tk_FakeWin *) (tkwin))->changes.y) +#define Tk_Width(tkwin) (((Tk_FakeWin *) (tkwin))->changes.width) +#define Tk_Height(tkwin) \ + (((Tk_FakeWin *) (tkwin))->changes.height) +#define Tk_Changes(tkwin) (&((Tk_FakeWin *) (tkwin))->changes) +#define Tk_Attributes(tkwin) (&((Tk_FakeWin *) (tkwin))->atts) +#define Tk_IsEmbedded(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_EMBEDDED) +#define Tk_IsContainer(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_CONTAINER) +#define Tk_IsMapped(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_MAPPED) +#define Tk_IsTopLevel(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_TOP_LEVEL) +#define Tk_HasWrapper(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_HAS_WRAPPER) +#define Tk_WinManaged(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_WIN_MANAGED) +#define Tk_TopWinHierarchy(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_TOP_HIERARCHY) +#define Tk_IsManageable(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_WM_MANAGEABLE) +#define Tk_ReqWidth(tkwin) (((Tk_FakeWin *) (tkwin))->reqWidth) +#define Tk_ReqHeight(tkwin) (((Tk_FakeWin *) (tkwin))->reqHeight) +/* Tk_InternalBorderWidth is deprecated */ +#define Tk_InternalBorderWidth(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderLeft) +#define Tk_InternalBorderLeft(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderLeft) +#define Tk_InternalBorderRight(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderRight) +#define Tk_InternalBorderTop(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderTop) +#define Tk_InternalBorderBottom(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderBottom) +#define Tk_MinReqWidth(tkwin) (((Tk_FakeWin *) (tkwin))->minReqWidth) +#define Tk_MinReqHeight(tkwin) (((Tk_FakeWin *) (tkwin))->minReqHeight) +#define Tk_Parent(tkwin) (((Tk_FakeWin *) (tkwin))->parentPtr) +#define Tk_Colormap(tkwin) (((Tk_FakeWin *) (tkwin))->atts.colormap) + +/* + * The structure below is needed by the macros above so that they can access + * the fields of a Tk_Window. The fields not needed by the macros are declared + * as "dummyX". The structure has its own type in order to prevent apps from + * accessing Tk_Window fields except using official macros. WARNING!! The + * structure definition must be kept consistent with the TkWindow structure in + * tkInt.h. If you change one, then change the other. See the declaration in + * tkInt.h for documentation on what the fields are used for internally. + */ + +typedef struct Tk_FakeWin { + Display *display; + char *dummy1; /* dispPtr */ + int screenNum; + Visual *visual; + int depth; + Window window; + char *dummy2; /* childList */ + char *dummy3; /* lastChildPtr */ + Tk_Window parentPtr; /* parentPtr */ + char *dummy4; /* nextPtr */ + char *dummy5; /* mainPtr */ + char *pathName; + Tk_Uid nameUid; + Tk_Uid classUid; + XWindowChanges changes; + unsigned int dummy6; /* dirtyChanges */ + XSetWindowAttributes atts; + unsigned long dummy7; /* dirtyAtts */ + unsigned int flags; + char *dummy8; /* handlerList */ +#ifdef TK_USE_INPUT_METHODS + XIC dummy9; /* inputContext */ +#endif /* TK_USE_INPUT_METHODS */ + ClientData *dummy10; /* tagPtr */ + int dummy11; /* numTags */ + int dummy12; /* optionLevel */ + char *dummy13; /* selHandlerList */ + char *dummy14; /* geomMgrPtr */ + ClientData dummy15; /* geomData */ + int reqWidth, reqHeight; + int internalBorderLeft; + char *dummy16; /* wmInfoPtr */ + char *dummy17; /* classProcPtr */ + ClientData dummy18; /* instanceData */ + char *dummy19; /* privatePtr */ + int internalBorderRight; + int internalBorderTop; + int internalBorderBottom; + int minReqWidth; + int minReqHeight; +} Tk_FakeWin; + +/* + * Flag values for TkWindow (and Tk_FakeWin) structures are: + * + * TK_MAPPED: 1 means window is currently mapped, + * 0 means unmapped. + * TK_TOP_LEVEL: 1 means this is a top-level widget. + * TK_ALREADY_DEAD: 1 means the window is in the process of + * being destroyed already. + * TK_NEED_CONFIG_NOTIFY: 1 means that the window has been reconfigured + * before it was made to exist. At the time of + * making it exist a ConfigureNotify event needs + * to be generated. + * TK_GRAB_FLAG: Used to manage grabs. See tkGrab.c for details + * TK_CHECKED_IC: 1 means we've already tried to get an input + * context for this window; if the ic field is + * NULL it means that there isn't a context for + * the field. + * TK_DONT_DESTROY_WINDOW: 1 means that Tk_DestroyWindow should not + * invoke XDestroyWindow to destroy this widget's + * X window. The flag is set when the window has + * already been destroyed elsewhere (e.g. by + * another application) or when it will be + * destroyed later (e.g. by destroying its parent) + * TK_WM_COLORMAP_WINDOW: 1 means that this window has at some time + * appeared in the WM_COLORMAP_WINDOWS property + * for its toplevel, so we have to remove it from + * that property if the window is deleted and the + * toplevel isn't. + * TK_EMBEDDED: 1 means that this window (which must be a + * toplevel) is not a free-standing window but + * rather is embedded in some other application. + * TK_CONTAINER: 1 means that this window is a container, and + * that some other application (either in this + * process or elsewhere) may be embedding itself + * inside the window. + * TK_BOTH_HALVES: 1 means that this window is used for + * application embedding (either as container or + * embedded application), and both the containing + * and embedded halves are associated with + * windows in this particular process. + * TK_DEFER_MODAL: 1 means that this window has deferred a modal + * loop until all of the bindings for the current + * event have been invoked. + * TK_WRAPPER: 1 means that this window is the extra wrapper + * window created around a toplevel to hold the + * menubar under Unix. See tkUnixWm.c for more + * information. + * TK_REPARENTED: 1 means that this window has been reparented + * so that as far as the window system is + * concerned it isn't a child of its Tk parent. + * Initially this is used only for special Unix + * menubar windows. + * TK_ANONYMOUS_WINDOW: 1 means that this window has no name, and is + * thus not accessible from Tk. + * TK_HAS_WRAPPER 1 means that this window has a wrapper window + * TK_WIN_MANAGED 1 means that this window is a child of the root + * window, and is managed by the window manager. + * TK_TOP_HIERARCHY 1 means this window is at the top of a physical + * window hierarchy within this process, i.e. the + * window's parent either doesn't exist or is not + * owned by this Tk application. + * TK_PROP_PROPCHANGE 1 means that PropertyNotify events in the + * window's children should propagate up to this + * window. + * TK_WM_MANAGEABLE 1 marks a window as capable of being converted + * into a toplevel using [wm manage]. + */ + +#define TK_MAPPED 1 +#define TK_TOP_LEVEL 2 +#define TK_ALREADY_DEAD 4 +#define TK_NEED_CONFIG_NOTIFY 8 +#define TK_GRAB_FLAG 0x10 +#define TK_CHECKED_IC 0x20 +#define TK_DONT_DESTROY_WINDOW 0x40 +#define TK_WM_COLORMAP_WINDOW 0x80 +#define TK_EMBEDDED 0x100 +#define TK_CONTAINER 0x200 +#define TK_BOTH_HALVES 0x400 +#define TK_DEFER_MODAL 0x800 +#define TK_WRAPPER 0x1000 +#define TK_REPARENTED 0x2000 +#define TK_ANONYMOUS_WINDOW 0x4000 +#define TK_HAS_WRAPPER 0x8000 +#define TK_WIN_MANAGED 0x10000 +#define TK_TOP_HIERARCHY 0x20000 +#define TK_PROP_PROPCHANGE 0x40000 +#define TK_WM_MANAGEABLE 0x80000 + +/* + *---------------------------------------------------------------------- + * + * Procedure prototypes and structures used for defining new canvas items: + * + *---------------------------------------------------------------------- + */ + +typedef enum { + TK_STATE_NULL = -1, TK_STATE_ACTIVE, TK_STATE_DISABLED, + TK_STATE_NORMAL, TK_STATE_HIDDEN +} Tk_State; + +typedef struct Tk_SmoothMethod { + char *name; + int (*coordProc) _ANSI_ARGS_((Tk_Canvas canvas, + double *pointPtr, int numPoints, int numSteps, + XPoint xPoints[], double dblPoints[])); + void (*postscriptProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, double *coordPtr, + int numPoints, int numSteps)); +} Tk_SmoothMethod; + +/* + * For each item in a canvas widget there exists one record with the following + * structure. Each actual item is represented by a record with the following + * stuff at its beginning, plus additional type-specific stuff after that. + */ + +#define TK_TAG_SPACE 3 + +typedef struct Tk_Item { + int id; /* Unique identifier for this item (also + * serves as first tag for item). */ + struct Tk_Item *nextPtr; /* Next in display list of all items in this + * canvas. Later items in list are drawn on + * top of earlier ones. */ + Tk_Uid staticTagSpace[TK_TAG_SPACE]; + /* Built-in space for limited # of tags. */ + Tk_Uid *tagPtr; /* Pointer to array of tags. Usually points to + * staticTagSpace, but may point to malloc-ed + * space if there are lots of tags. */ + int tagSpace; /* Total amount of tag space available at + * tagPtr. */ + int numTags; /* Number of tag slots actually used at + * *tagPtr. */ + struct Tk_ItemType *typePtr;/* Table of procedures that implement this + * type of item. */ + int x1, y1, x2, y2; /* Bounding box for item, in integer canvas + * units. Set by item-specific code and + * guaranteed to contain every pixel drawn in + * item. Item area includes x1 and y1 but not + * x2 and y2. */ + struct Tk_Item *prevPtr; /* Previous in display list of all items in + * this canvas. Later items in list are drawn + * just below earlier ones. */ + Tk_State state; /* State of item. */ + char *reserved1; /* reserved for future use */ + int redraw_flags; /* Some flags used in the canvas */ + + /* + *------------------------------------------------------------------ + * Starting here is additional type-specific stuff; see the declarations + * for individual types to see what is part of each type. The actual space + * below is determined by the "itemInfoSize" of the type's Tk_ItemType + * record. + *------------------------------------------------------------------ + */ +} Tk_Item; + +/* + * Flag bits for canvases (redraw_flags): + * + * TK_ITEM_STATE_DEPENDANT - 1 means that object needs to be redrawn if the + * canvas state changes. + * TK_ITEM_DONT_REDRAW - 1 means that the object redraw is already been + * prepared, so the general canvas code doesn't + * need to do that any more. + */ + +#define TK_ITEM_STATE_DEPENDANT 1 +#define TK_ITEM_DONT_REDRAW 2 + +/* + * Records of the following type are used to describe a type of item (e.g. + * lines, circles, etc.) that can form part of a canvas widget. + */ + +#ifdef USE_OLD_CANVAS +typedef int Tk_ItemCreateProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int argc, + char **argv)); +typedef int Tk_ItemConfigureProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int argc, + char **argv, int flags)); +typedef int Tk_ItemCoordProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int argc, + char **argv)); +#else +typedef int Tk_ItemCreateProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int argc, + Tcl_Obj *const objv[])); +typedef int Tk_ItemConfigureProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int argc, + Tcl_Obj *const objv[], int flags)); +typedef int Tk_ItemCoordProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int argc, + Tcl_Obj *const argv[])); +#endif +typedef void Tk_ItemDeleteProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, Display *display)); +typedef void Tk_ItemDisplayProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, Display *display, Drawable dst, + int x, int y, int width, int height)); +typedef double Tk_ItemPointProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, double *pointPtr)); +typedef int Tk_ItemAreaProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, double *rectPtr)); +typedef int Tk_ItemPostscriptProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, int prepass)); +typedef void Tk_ItemScaleProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, double originX, double originY, + double scaleX, double scaleY)); +typedef void Tk_ItemTranslateProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, double deltaX, double deltaY)); +typedef int Tk_ItemIndexProc _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Canvas canvas, Tk_Item *itemPtr, char *indexString, + int *indexPtr)); +typedef void Tk_ItemCursorProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, int index)); +typedef int Tk_ItemSelectionProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, int offset, char *buffer, + int maxBytes)); +typedef void Tk_ItemInsertProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, int beforeThis, char *string)); +typedef void Tk_ItemDCharsProc _ANSI_ARGS_((Tk_Canvas canvas, + Tk_Item *itemPtr, int first, int last)); + +#ifndef __NO_OLD_CONFIG + +typedef struct Tk_ItemType { + char *name; /* The name of this type of item, such as + * "line". */ + int itemSize; /* Total amount of space needed for item's + * record. */ + Tk_ItemCreateProc *createProc; + /* Procedure to create a new item of this + * type. */ + Tk_ConfigSpec *configSpecs; /* Pointer to array of configuration specs for + * this type. Used for returning configuration + * info. */ + Tk_ItemConfigureProc *configProc; + /* Procedure to call to change configuration + * options. */ + Tk_ItemCoordProc *coordProc;/* Procedure to call to get and set the item's + * coordinates. */ + Tk_ItemDeleteProc *deleteProc; + /* Procedure to delete existing item of this + * type. */ + Tk_ItemDisplayProc *displayProc; + /* Procedure to display items of this type. */ + int alwaysRedraw; /* Non-zero means displayProc should be called + * even when the item has been moved + * off-screen. */ + Tk_ItemPointProc *pointProc;/* Computes distance from item to a given + * point. */ + Tk_ItemAreaProc *areaProc; /* Computes whether item is inside, outside, + * or overlapping an area. */ + Tk_ItemPostscriptProc *postscriptProc; + /* Procedure to write a Postscript description + * for items of this type. */ + Tk_ItemScaleProc *scaleProc;/* Procedure to rescale items of this type. */ + Tk_ItemTranslateProc *translateProc; + /* Procedure to translate items of this + * type. */ + Tk_ItemIndexProc *indexProc;/* Procedure to determine index of indicated + * character. NULL if item doesn't support + * indexing. */ + Tk_ItemCursorProc *icursorProc; + /* Procedure to set insert cursor posn to just + * before a given position. */ + Tk_ItemSelectionProc *selectionProc; + /* Procedure to return selection (in STRING + * format) when it is in this item. */ + Tk_ItemInsertProc *insertProc; + /* Procedure to insert something into an + * item. */ + Tk_ItemDCharsProc *dCharsProc; + /* Procedure to delete characters from an + * item. */ + struct Tk_ItemType *nextPtr;/* Used to link types together into a list. */ + char *reserved1; /* Reserved for future extension. */ + int reserved2; /* Carefully compatible with */ + char *reserved3; /* Jan Nijtmans dash patch */ + char *reserved4; +} Tk_ItemType; + +#endif + +/* + * The following structure provides information about the selection and the + * insertion cursor. It is needed by only a few items, such as those that + * display text. It is shared by the generic canvas code and the item-specific + * code, but most of the fields should be written only by the canvas generic + * code. + */ + +typedef struct Tk_CanvasTextInfo { + Tk_3DBorder selBorder; /* Border and background for selected + * characters. Read-only to items.*/ + int selBorderWidth; /* Width of border around selection. Read-only + * to items. */ + XColor *selFgColorPtr; /* Foreground color for selected text. + * Read-only to items. */ + Tk_Item *selItemPtr; /* Pointer to selected item. NULL means + * selection isn't in this canvas. Writable by + * items. */ + int selectFirst; /* Character index of first selected + * character. Writable by items. */ + int selectLast; /* Character index of last selected character. + * Writable by items. */ + Tk_Item *anchorItemPtr; /* Item corresponding to "selectAnchor": not + * necessarily selItemPtr. Read-only to + * items. */ + int selectAnchor; /* Character index of fixed end of selection + * (i.e. "select to" operation will use this + * as one end of the selection). Writable by + * items. */ + Tk_3DBorder insertBorder; /* Used to draw vertical bar for insertion + * cursor. Read-only to items. */ + int insertWidth; /* Total width of insertion cursor. Read-only + * to items. */ + int insertBorderWidth; /* Width of 3-D border around insert cursor. + * Read-only to items. */ + Tk_Item *focusItemPtr; /* Item that currently has the input focus, or + * NULL if no such item. Read-only to items. */ + int gotFocus; /* Non-zero means that the canvas widget has + * the input focus. Read-only to items.*/ + int cursorOn; /* Non-zero means that an insertion cursor + * should be displayed in focusItemPtr. + * Read-only to items.*/ +} Tk_CanvasTextInfo; + +/* + * Structures used for Dashing and Outline. + */ + +typedef struct Tk_Dash { + int number; + union { + char *pt; + char array[sizeof(char *)]; + } pattern; +} Tk_Dash; + +typedef struct Tk_TSOffset { + int flags; /* Flags; see below for possible values */ + int xoffset; /* x offset */ + int yoffset; /* y offset */ +} Tk_TSOffset; + +/* + * Bit fields in Tk_Offset->flags: + */ + +#define TK_OFFSET_INDEX 1 +#define TK_OFFSET_RELATIVE 2 +#define TK_OFFSET_LEFT 4 +#define TK_OFFSET_CENTER 8 +#define TK_OFFSET_RIGHT 16 +#define TK_OFFSET_TOP 32 +#define TK_OFFSET_MIDDLE 64 +#define TK_OFFSET_BOTTOM 128 + +typedef struct Tk_Outline { + GC gc; /* Graphics context. */ + double width; /* Width of outline. */ + double activeWidth; /* Width of outline. */ + double disabledWidth; /* Width of outline. */ + int offset; /* Dash offset. */ + Tk_Dash dash; /* Dash pattern. */ + Tk_Dash activeDash; /* Dash pattern if state is active. */ + Tk_Dash disabledDash; /* Dash pattern if state is disabled. */ + VOID *reserved1; /* Reserved for future expansion. */ + VOID *reserved2; + VOID *reserved3; + Tk_TSOffset tsoffset; /* Stipple offset for outline. */ + XColor *color; /* Outline color. */ + XColor *activeColor; /* Outline color if state is active. */ + XColor *disabledColor; /* Outline color if state is disabled. */ + Pixmap stipple; /* Outline Stipple pattern. */ + Pixmap activeStipple; /* Outline Stipple pattern if state is + * active. */ + Pixmap disabledStipple; /* Outline Stipple pattern if state is + * disabled. */ +} Tk_Outline; + +/* + *---------------------------------------------------------------------- + * + * Procedure prototypes and structures used for managing images: + * + *---------------------------------------------------------------------- + */ + +typedef struct Tk_ImageType Tk_ImageType; +#ifdef USE_OLD_IMAGE +typedef int (Tk_ImageCreateProc) _ANSI_ARGS_((Tcl_Interp *interp, + char *name, int argc, char **argv, Tk_ImageType *typePtr, + Tk_ImageMaster master, ClientData *masterDataPtr)); +#else +typedef int (Tk_ImageCreateProc) _ANSI_ARGS_((Tcl_Interp *interp, + char *name, int objc, Tcl_Obj *const objv[], Tk_ImageType *typePtr, + Tk_ImageMaster master, ClientData *masterDataPtr)); +#endif +typedef ClientData (Tk_ImageGetProc) _ANSI_ARGS_((Tk_Window tkwin, + ClientData masterData)); +typedef void (Tk_ImageDisplayProc) _ANSI_ARGS_((ClientData instanceData, + Display *display, Drawable drawable, int imageX, int imageY, + int width, int height, int drawableX, int drawableY)); +typedef void (Tk_ImageFreeProc) _ANSI_ARGS_((ClientData instanceData, + Display *display)); +typedef void (Tk_ImageDeleteProc) _ANSI_ARGS_((ClientData masterData)); +typedef void (Tk_ImageChangedProc) _ANSI_ARGS_((ClientData clientData, + int x, int y, int width, int height, int imageWidth, + int imageHeight)); +typedef int (Tk_ImagePostscriptProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, Tk_PostscriptInfo psinfo, + int x, int y, int width, int height, int prepass)); + +/* + * The following structure represents a particular type of image (bitmap, xpm + * image, etc.). It provides information common to all images of that type, + * such as the type name and a collection of procedures in the image manager + * that respond to various events. Each image manager is represented by one of + * these structures. + */ + +struct Tk_ImageType { + char *name; /* Name of image type. */ + Tk_ImageCreateProc *createProc; + /* Procedure to call to create a new image of + * this type. */ + Tk_ImageGetProc *getProc; /* Procedure to call the first time + * Tk_GetImage is called in a new way (new + * visual or screen). */ + Tk_ImageDisplayProc *displayProc; + /* Call to draw image, in response to + * Tk_RedrawImage calls. */ + Tk_ImageFreeProc *freeProc; /* Procedure to call whenever Tk_FreeImage is + * called to release an instance of an + * image. */ + Tk_ImageDeleteProc *deleteProc; + /* Procedure to call to delete image. It will + * not be called until after freeProc has been + * called for each instance of the image. */ + Tk_ImagePostscriptProc *postscriptProc; + /* Procedure to call to produce postscript + * output for the image. */ + struct Tk_ImageType *nextPtr; + /* Next in list of all image types currently + * known. Filled in by Tk, not by image + * manager. */ + char *reserved; /* reserved for future expansion */ +}; + +/* + *---------------------------------------------------------------------- + * + * Additional definitions used to manage images of type "photo". + * + *---------------------------------------------------------------------- + */ + +/* + * The following type is used to identify a particular photo image to be + * manipulated: + */ + +typedef void *Tk_PhotoHandle; + +/* + * The following structure describes a block of pixels in memory: + */ + +typedef struct Tk_PhotoImageBlock { + unsigned char *pixelPtr; /* Pointer to the first pixel. */ + int width; /* Width of block, in pixels. */ + int height; /* Height of block, in pixels. */ + int pitch; /* Address difference between corresponding + * pixels in successive lines. */ + int pixelSize; /* Address difference between successive + * pixels in the same line. */ + int offset[4]; /* Address differences between the red, green, + * blue and alpha components of the pixel and + * the pixel as a whole. */ +} Tk_PhotoImageBlock; + +/* + * The following values control how blocks are combined into photo images when + * the alpha component of a pixel is not 255, a.k.a. the compositing rule. + */ + +#define TK_PHOTO_COMPOSITE_OVERLAY 0 +#define TK_PHOTO_COMPOSITE_SET 1 + +/* + * Procedure prototypes and structures used in reading and writing photo + * images: + */ + +typedef struct Tk_PhotoImageFormat Tk_PhotoImageFormat; +#ifdef USE_OLD_IMAGE +typedef int (Tk_ImageFileMatchProc) _ANSI_ARGS_((Tcl_Channel chan, + char *fileName, char *formatString, int *widthPtr, int *heightPtr)); +typedef int (Tk_ImageStringMatchProc) _ANSI_ARGS_((char *string, + char *formatString, int *widthPtr, int *heightPtr)); +typedef int (Tk_ImageFileReadProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Channel chan, char *fileName, char *formatString, + Tk_PhotoHandle imageHandle, int destX, int destY, + int width, int height, int srcX, int srcY)); +typedef int (Tk_ImageStringReadProc) _ANSI_ARGS_((Tcl_Interp *interp, + char *string, char *formatString, Tk_PhotoHandle imageHandle, + int destX, int destY, int width, int height, int srcX, int srcY)); +typedef int (Tk_ImageFileWriteProc) _ANSI_ARGS_((Tcl_Interp *interp, + char *fileName, char *formatString, Tk_PhotoImageBlock *blockPtr)); +typedef int (Tk_ImageStringWriteProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_DString *dataPtr, char *formatString, + Tk_PhotoImageBlock *blockPtr)); +#else +typedef int (Tk_ImageFileMatchProc) _ANSI_ARGS_((Tcl_Channel chan, + const char *fileName, Tcl_Obj *format, int *widthPtr, + int *heightPtr, Tcl_Interp *interp)); +typedef int (Tk_ImageStringMatchProc) _ANSI_ARGS_((Tcl_Obj *dataObj, + Tcl_Obj *format, int *widthPtr, int *heightPtr, + Tcl_Interp *interp)); +typedef int (Tk_ImageFileReadProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Channel chan, const char *fileName, Tcl_Obj *format, + Tk_PhotoHandle imageHandle, int destX, int destY, + int width, int height, int srcX, int srcY)); +typedef int (Tk_ImageStringReadProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *dataObj, Tcl_Obj *format, Tk_PhotoHandle imageHandle, + int destX, int destY, int width, int height, int srcX, int srcY)); +typedef int (Tk_ImageFileWriteProc) _ANSI_ARGS_((Tcl_Interp *interp, + const char *fileName, Tcl_Obj *format, Tk_PhotoImageBlock *blockPtr)); +typedef int (Tk_ImageStringWriteProc) _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *format, Tk_PhotoImageBlock *blockPtr)); +#endif + +/* + * The following structure represents a particular file format for storing + * images (e.g., PPM, GIF, JPEG, etc.). It provides information to allow image + * files of that format to be recognized and read into a photo image. + */ + +struct Tk_PhotoImageFormat { + char *name; /* Name of image file format */ + Tk_ImageFileMatchProc *fileMatchProc; + /* Procedure to call to determine whether an + * image file matches this format. */ + Tk_ImageStringMatchProc *stringMatchProc; + /* Procedure to call to determine whether the + * data in a string matches this format. */ + Tk_ImageFileReadProc *fileReadProc; + /* Procedure to call to read data from an + * image file into a photo image. */ + Tk_ImageStringReadProc *stringReadProc; + /* Procedure to call to read data from a + * string into a photo image. */ + Tk_ImageFileWriteProc *fileWriteProc; + /* Procedure to call to write data from a + * photo image to a file. */ + Tk_ImageStringWriteProc *stringWriteProc; + /* Procedure to call to obtain a string + * representation of the data in a photo + * image.*/ + struct Tk_PhotoImageFormat *nextPtr; + /* Next in list of all photo image formats + * currently known. Filled in by Tk, not by + * image format handler. */ +}; + +/* + *---------------------------------------------------------------------- + * + * Procedure prototypes and structures used for managing styles: + * + *---------------------------------------------------------------------- + */ + +/* + * Style support version tag. + */ + +#define TK_STYLE_VERSION_1 0x1 +#define TK_STYLE_VERSION TK_STYLE_VERSION_1 + +/* + * The following structures and prototypes are used as static templates to + * declare widget elements. + */ + +typedef void (Tk_GetElementSizeProc) _ANSI_ARGS_((ClientData clientData, + char *recordPtr, const Tk_OptionSpec **optionsPtr, Tk_Window tkwin, + int width, int height, int inner, int *widthPtr, int *heightPtr)); +typedef void (Tk_GetElementBoxProc) _ANSI_ARGS_((ClientData clientData, + char *recordPtr, const Tk_OptionSpec **optionsPtr, Tk_Window tkwin, + int x, int y, int width, int height, int inner, int *xPtr, int *yPtr, + int *widthPtr, int *heightPtr)); +typedef int (Tk_GetElementBorderWidthProc) _ANSI_ARGS_((ClientData clientData, + char *recordPtr, const Tk_OptionSpec **optionsPtr, Tk_Window tkwin)); +typedef void (Tk_DrawElementProc) _ANSI_ARGS_((ClientData clientData, + char *recordPtr, const Tk_OptionSpec **optionsPtr, Tk_Window tkwin, + Drawable d, int x, int y, int width, int height, int state)); + +typedef struct Tk_ElementOptionSpec { + char *name; /* Name of the required option. */ + Tk_OptionType type; /* Accepted option type. TK_OPTION_END means + * any. */ +} Tk_ElementOptionSpec; + +typedef struct Tk_ElementSpec { + int version; /* Version of the style support. */ + char *name; /* Name of element. */ + Tk_ElementOptionSpec *options; + /* List of required options. Last one's name + * must be NULL. */ + Tk_GetElementSizeProc *getSize; + /* Compute the external (resp. internal) size + * of the element from its desired internal + * (resp. external) size. */ + Tk_GetElementBoxProc *getBox; + /* Compute the inscribed or bounding boxes + * within a given area. */ + Tk_GetElementBorderWidthProc *getBorderWidth; + /* Return the element's internal border width. + * Mostly useful for widgets. */ + Tk_DrawElementProc *draw; /* Draw the element in the given bounding + * box. */ +} Tk_ElementSpec; + +/* + * Element state flags. Can be OR'ed. + */ + +#define TK_ELEMENT_STATE_ACTIVE 1<<0 +#define TK_ELEMENT_STATE_DISABLED 1<<1 +#define TK_ELEMENT_STATE_FOCUS 1<<2 +#define TK_ELEMENT_STATE_PRESSED 1<<3 + +/* + *---------------------------------------------------------------------- + * + * The definitions below provide backward compatibility for functions and + * types related to event handling that used to be in Tk but have moved to + * Tcl. + * + *---------------------------------------------------------------------- + */ + +#define TK_READABLE TCL_READABLE +#define TK_WRITABLE TCL_WRITABLE +#define TK_EXCEPTION TCL_EXCEPTION + +#define TK_DONT_WAIT TCL_DONT_WAIT +#define TK_X_EVENTS TCL_WINDOW_EVENTS +#define TK_WINDOW_EVENTS TCL_WINDOW_EVENTS +#define TK_FILE_EVENTS TCL_FILE_EVENTS +#define TK_TIMER_EVENTS TCL_TIMER_EVENTS +#define TK_IDLE_EVENTS TCL_IDLE_EVENTS +#define TK_ALL_EVENTS TCL_ALL_EVENTS + +#define Tk_IdleProc Tcl_IdleProc +#define Tk_FileProc Tcl_FileProc +#define Tk_TimerProc Tcl_TimerProc +#define Tk_TimerToken Tcl_TimerToken + +#define Tk_BackgroundError Tcl_BackgroundError +#define Tk_CancelIdleCall Tcl_CancelIdleCall +#define Tk_CreateFileHandler Tcl_CreateFileHandler +#define Tk_CreateTimerHandler Tcl_CreateTimerHandler +#define Tk_DeleteFileHandler Tcl_DeleteFileHandler +#define Tk_DeleteTimerHandler Tcl_DeleteTimerHandler +#define Tk_DoOneEvent Tcl_DoOneEvent +#define Tk_DoWhenIdle Tcl_DoWhenIdle +#define Tk_Sleep Tcl_Sleep + +/* Additional stuff that has moved to Tcl: */ + +#define Tk_EventuallyFree Tcl_EventuallyFree +#define Tk_FreeProc Tcl_FreeProc +#define Tk_Preserve Tcl_Preserve +#define Tk_Release Tcl_Release + +/* Removed Tk_Main, use macro instead */ +#define Tk_Main(argc, argv, proc) \ + Tk_MainEx(argc, argv, proc, Tcl_CreateInterp()) + +const char * Tk_InitStubs _ANSI_ARGS_((Tcl_Interp *interp, + const char *version, int exact)); +EXTERN const char * Tk_PkgInitStubsCheck _ANSI_ARGS_((Tcl_Interp *interp, + const char *version, int exact)); + +#ifndef USE_TK_STUBS +#define Tk_InitStubs(interp, version, exact) \ + Tk_PkgInitStubsCheck(interp, version, exact) +#endif /* USE_TK_STUBS */ + +#define Tk_InitImageArgs(interp, argc, argv) /**/ + +/* + *---------------------------------------------------------------------- + * + * Additional procedure types defined by Tk. + * + *---------------------------------------------------------------------- + */ + +typedef int (Tk_ErrorProc) _ANSI_ARGS_((ClientData clientData, + XErrorEvent *errEventPtr)); +typedef void (Tk_EventProc) _ANSI_ARGS_((ClientData clientData, + XEvent *eventPtr)); +typedef int (Tk_GenericProc) _ANSI_ARGS_((ClientData clientData, + XEvent *eventPtr)); +typedef int (Tk_ClientMessageProc) _ANSI_ARGS_((Tk_Window tkwin, + XEvent *eventPtr)); +typedef int (Tk_GetSelProc) _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, char *portion)); +typedef void (Tk_LostSelProc) _ANSI_ARGS_((ClientData clientData)); +typedef Tk_RestrictAction (Tk_RestrictProc) _ANSI_ARGS_(( + ClientData clientData, XEvent *eventPtr)); +typedef int (Tk_SelectionProc) _ANSI_ARGS_((ClientData clientData, + int offset, char *buffer, int maxBytes)); + +/* + *---------------------------------------------------------------------- + * + * Platform independent exported procedures and variables. + * + *---------------------------------------------------------------------- + */ + +#include "tkDecls.h" + +#ifdef USE_OLD_IMAGE +#undef Tk_CreateImageType +#define Tk_CreateImageType Tk_CreateOldImageType +#undef Tk_CreatePhotoImageFormat +#define Tk_CreatePhotoImageFormat Tk_CreateOldPhotoImageFormat +#endif /* USE_OLD_IMAGE */ + +/* + *---------------------------------------------------------------------- + * + * Allow users to say that they don't want to alter their source to add extra + * arguments to Tk_PhotoPutBlock() et al; DO NOT DEFINE THIS WHEN BUILDING TK. + * + * This goes after the inclusion of the stubbed-decls so that the declarations + * of what is actually there can be correct. + */ + +#ifdef USE_COMPOSITELESS_PHOTO_PUT_BLOCK +# ifdef Tk_PhotoPutBlock +# undef Tk_PhotoPutBlock +# endif +# define Tk_PhotoPutBlock Tk_PhotoPutBlock_NoComposite +# ifdef Tk_PhotoPutZoomedBlock +# undef Tk_PhotoPutZoomedBlock +# endif +# define Tk_PhotoPutZoomedBlock Tk_PhotoPutZoomedBlock_NoComposite +# define USE_PANIC_ON_PHOTO_ALLOC_FAILURE +#else /* !USE_COMPOSITELESS_PHOTO_PUT_BLOCK */ +# ifdef USE_PANIC_ON_PHOTO_ALLOC_FAILURE +# ifdef Tk_PhotoPutBlock +# undef Tk_PhotoPutBlock +# endif +# define Tk_PhotoPutBlock Tk_PhotoPutBlock_Panic +# ifdef Tk_PhotoPutZoomedBlock +# undef Tk_PhotoPutZoomedBlock +# endif +# define Tk_PhotoPutZoomedBlock Tk_PhotoPutZoomedBlock_Panic +# endif /* USE_PANIC_ON_PHOTO_ALLOC_FAILURE */ +#endif /* USE_COMPOSITELESS_PHOTO_PUT_BLOCK */ +#ifdef USE_PANIC_ON_PHOTO_ALLOC_FAILURE +# ifdef Tk_PhotoExpand +# undef Tk_PhotoExpand +# endif +# define Tk_PhotoExpand Tk_PhotoExpand_Panic +# ifdef Tk_PhotoSetSize +# undef Tk_PhotoSetSize +# endif +# define Tk_PhotoSetSize Tk_PhotoSetSize_Panic +#endif /* USE_PANIC_ON_PHOTO_ALLOC_FAILURE */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#endif /* RC_INVOKED */ + +/* + * end block for C++ + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TK */ + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tkDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tkDecls.h new file mode 100644 index 00000000..00a3dde6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tkDecls.h @@ -0,0 +1,3095 @@ +/* + * tkDecls.h -- + * + * Declarations of functions in the platform independent public Tcl API. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TKDECLS +#define _TKDECLS + +#ifdef BUILD_tk +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLEXPORT +#endif + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tk.decls script. + */ + +/* !BEGIN!: Do not edit below this line. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Exported function declarations: + */ + +#ifndef Tk_MainLoop_TCL_DECLARED +#define Tk_MainLoop_TCL_DECLARED +/* 0 */ +EXTERN void Tk_MainLoop(void); +#endif +#ifndef Tk_3DBorderColor_TCL_DECLARED +#define Tk_3DBorderColor_TCL_DECLARED +/* 1 */ +EXTERN XColor * Tk_3DBorderColor(Tk_3DBorder border); +#endif +#ifndef Tk_3DBorderGC_TCL_DECLARED +#define Tk_3DBorderGC_TCL_DECLARED +/* 2 */ +EXTERN GC Tk_3DBorderGC(Tk_Window tkwin, Tk_3DBorder border, + int which); +#endif +#ifndef Tk_3DHorizontalBevel_TCL_DECLARED +#define Tk_3DHorizontalBevel_TCL_DECLARED +/* 3 */ +EXTERN void Tk_3DHorizontalBevel(Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, int x, + int y, int width, int height, int leftIn, + int rightIn, int topBevel, int relief); +#endif +#ifndef Tk_3DVerticalBevel_TCL_DECLARED +#define Tk_3DVerticalBevel_TCL_DECLARED +/* 4 */ +EXTERN void Tk_3DVerticalBevel(Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, int x, + int y, int width, int height, int leftBevel, + int relief); +#endif +#ifndef Tk_AddOption_TCL_DECLARED +#define Tk_AddOption_TCL_DECLARED +/* 5 */ +EXTERN void Tk_AddOption(Tk_Window tkwin, CONST char *name, + CONST char *value, int priority); +#endif +#ifndef Tk_BindEvent_TCL_DECLARED +#define Tk_BindEvent_TCL_DECLARED +/* 6 */ +EXTERN void Tk_BindEvent(Tk_BindingTable bindingTable, + XEvent *eventPtr, Tk_Window tkwin, + int numObjects, ClientData *objectPtr); +#endif +#ifndef Tk_CanvasDrawableCoords_TCL_DECLARED +#define Tk_CanvasDrawableCoords_TCL_DECLARED +/* 7 */ +EXTERN void Tk_CanvasDrawableCoords(Tk_Canvas canvas, double x, + double y, short *drawableXPtr, + short *drawableYPtr); +#endif +#ifndef Tk_CanvasEventuallyRedraw_TCL_DECLARED +#define Tk_CanvasEventuallyRedraw_TCL_DECLARED +/* 8 */ +EXTERN void Tk_CanvasEventuallyRedraw(Tk_Canvas canvas, int x1, + int y1, int x2, int y2); +#endif +#ifndef Tk_CanvasGetCoord_TCL_DECLARED +#define Tk_CanvasGetCoord_TCL_DECLARED +/* 9 */ +EXTERN int Tk_CanvasGetCoord(Tcl_Interp *interp, + Tk_Canvas canvas, CONST char *str, + double *doublePtr); +#endif +#ifndef Tk_CanvasGetTextInfo_TCL_DECLARED +#define Tk_CanvasGetTextInfo_TCL_DECLARED +/* 10 */ +EXTERN Tk_CanvasTextInfo * Tk_CanvasGetTextInfo(Tk_Canvas canvas); +#endif +#ifndef Tk_CanvasPsBitmap_TCL_DECLARED +#define Tk_CanvasPsBitmap_TCL_DECLARED +/* 11 */ +EXTERN int Tk_CanvasPsBitmap(Tcl_Interp *interp, + Tk_Canvas canvas, Pixmap bitmap, int x, + int y, int width, int height); +#endif +#ifndef Tk_CanvasPsColor_TCL_DECLARED +#define Tk_CanvasPsColor_TCL_DECLARED +/* 12 */ +EXTERN int Tk_CanvasPsColor(Tcl_Interp *interp, + Tk_Canvas canvas, XColor *colorPtr); +#endif +#ifndef Tk_CanvasPsFont_TCL_DECLARED +#define Tk_CanvasPsFont_TCL_DECLARED +/* 13 */ +EXTERN int Tk_CanvasPsFont(Tcl_Interp *interp, Tk_Canvas canvas, + Tk_Font font); +#endif +#ifndef Tk_CanvasPsPath_TCL_DECLARED +#define Tk_CanvasPsPath_TCL_DECLARED +/* 14 */ +EXTERN void Tk_CanvasPsPath(Tcl_Interp *interp, Tk_Canvas canvas, + double *coordPtr, int numPoints); +#endif +#ifndef Tk_CanvasPsStipple_TCL_DECLARED +#define Tk_CanvasPsStipple_TCL_DECLARED +/* 15 */ +EXTERN int Tk_CanvasPsStipple(Tcl_Interp *interp, + Tk_Canvas canvas, Pixmap bitmap); +#endif +#ifndef Tk_CanvasPsY_TCL_DECLARED +#define Tk_CanvasPsY_TCL_DECLARED +/* 16 */ +EXTERN double Tk_CanvasPsY(Tk_Canvas canvas, double y); +#endif +#ifndef Tk_CanvasSetStippleOrigin_TCL_DECLARED +#define Tk_CanvasSetStippleOrigin_TCL_DECLARED +/* 17 */ +EXTERN void Tk_CanvasSetStippleOrigin(Tk_Canvas canvas, GC gc); +#endif +#ifndef Tk_CanvasTagsParseProc_TCL_DECLARED +#define Tk_CanvasTagsParseProc_TCL_DECLARED +/* 18 */ +EXTERN int Tk_CanvasTagsParseProc(ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, + CONST char *value, char *widgRec, int offset); +#endif +#ifndef Tk_CanvasTagsPrintProc_TCL_DECLARED +#define Tk_CanvasTagsPrintProc_TCL_DECLARED +/* 19 */ +EXTERN char * Tk_CanvasTagsPrintProc(ClientData clientData, + Tk_Window tkwin, char *widgRec, int offset, + Tcl_FreeProc **freeProcPtr); +#endif +#ifndef Tk_CanvasTkwin_TCL_DECLARED +#define Tk_CanvasTkwin_TCL_DECLARED +/* 20 */ +EXTERN Tk_Window Tk_CanvasTkwin(Tk_Canvas canvas); +#endif +#ifndef Tk_CanvasWindowCoords_TCL_DECLARED +#define Tk_CanvasWindowCoords_TCL_DECLARED +/* 21 */ +EXTERN void Tk_CanvasWindowCoords(Tk_Canvas canvas, double x, + double y, short *screenXPtr, + short *screenYPtr); +#endif +#ifndef Tk_ChangeWindowAttributes_TCL_DECLARED +#define Tk_ChangeWindowAttributes_TCL_DECLARED +/* 22 */ +EXTERN void Tk_ChangeWindowAttributes(Tk_Window tkwin, + unsigned long valueMask, + XSetWindowAttributes *attsPtr); +#endif +#ifndef Tk_CharBbox_TCL_DECLARED +#define Tk_CharBbox_TCL_DECLARED +/* 23 */ +EXTERN int Tk_CharBbox(Tk_TextLayout layout, int index, + int *xPtr, int *yPtr, int *widthPtr, + int *heightPtr); +#endif +#ifndef Tk_ClearSelection_TCL_DECLARED +#define Tk_ClearSelection_TCL_DECLARED +/* 24 */ +EXTERN void Tk_ClearSelection(Tk_Window tkwin, Atom selection); +#endif +#ifndef Tk_ClipboardAppend_TCL_DECLARED +#define Tk_ClipboardAppend_TCL_DECLARED +/* 25 */ +EXTERN int Tk_ClipboardAppend(Tcl_Interp *interp, + Tk_Window tkwin, Atom target, Atom format, + char *buffer); +#endif +#ifndef Tk_ClipboardClear_TCL_DECLARED +#define Tk_ClipboardClear_TCL_DECLARED +/* 26 */ +EXTERN int Tk_ClipboardClear(Tcl_Interp *interp, + Tk_Window tkwin); +#endif +#ifndef Tk_ConfigureInfo_TCL_DECLARED +#define Tk_ConfigureInfo_TCL_DECLARED +/* 27 */ +EXTERN int Tk_ConfigureInfo(Tcl_Interp *interp, Tk_Window tkwin, + Tk_ConfigSpec *specs, char *widgRec, + CONST char *argvName, int flags); +#endif +#ifndef Tk_ConfigureValue_TCL_DECLARED +#define Tk_ConfigureValue_TCL_DECLARED +/* 28 */ +EXTERN int Tk_ConfigureValue(Tcl_Interp *interp, + Tk_Window tkwin, Tk_ConfigSpec *specs, + char *widgRec, CONST char *argvName, + int flags); +#endif +#ifndef Tk_ConfigureWidget_TCL_DECLARED +#define Tk_ConfigureWidget_TCL_DECLARED +/* 29 */ +EXTERN int Tk_ConfigureWidget(Tcl_Interp *interp, + Tk_Window tkwin, Tk_ConfigSpec *specs, + int argc, CONST84 char **argv, char *widgRec, + int flags); +#endif +#ifndef Tk_ConfigureWindow_TCL_DECLARED +#define Tk_ConfigureWindow_TCL_DECLARED +/* 30 */ +EXTERN void Tk_ConfigureWindow(Tk_Window tkwin, + unsigned int valueMask, + XWindowChanges *valuePtr); +#endif +#ifndef Tk_ComputeTextLayout_TCL_DECLARED +#define Tk_ComputeTextLayout_TCL_DECLARED +/* 31 */ +EXTERN Tk_TextLayout Tk_ComputeTextLayout(Tk_Font font, CONST char *str, + int numChars, int wrapLength, + Tk_Justify justify, int flags, int *widthPtr, + int *heightPtr); +#endif +#ifndef Tk_CoordsToWindow_TCL_DECLARED +#define Tk_CoordsToWindow_TCL_DECLARED +/* 32 */ +EXTERN Tk_Window Tk_CoordsToWindow(int rootX, int rootY, + Tk_Window tkwin); +#endif +#ifndef Tk_CreateBinding_TCL_DECLARED +#define Tk_CreateBinding_TCL_DECLARED +/* 33 */ +EXTERN unsigned long Tk_CreateBinding(Tcl_Interp *interp, + Tk_BindingTable bindingTable, + ClientData object, CONST char *eventStr, + CONST char *command, int append); +#endif +#ifndef Tk_CreateBindingTable_TCL_DECLARED +#define Tk_CreateBindingTable_TCL_DECLARED +/* 34 */ +EXTERN Tk_BindingTable Tk_CreateBindingTable(Tcl_Interp *interp); +#endif +#ifndef Tk_CreateErrorHandler_TCL_DECLARED +#define Tk_CreateErrorHandler_TCL_DECLARED +/* 35 */ +EXTERN Tk_ErrorHandler Tk_CreateErrorHandler(Display *display, int errNum, + int request, int minorCode, + Tk_ErrorProc *errorProc, + ClientData clientData); +#endif +#ifndef Tk_CreateEventHandler_TCL_DECLARED +#define Tk_CreateEventHandler_TCL_DECLARED +/* 36 */ +EXTERN void Tk_CreateEventHandler(Tk_Window token, + unsigned long mask, Tk_EventProc *proc, + ClientData clientData); +#endif +#ifndef Tk_CreateGenericHandler_TCL_DECLARED +#define Tk_CreateGenericHandler_TCL_DECLARED +/* 37 */ +EXTERN void Tk_CreateGenericHandler(Tk_GenericProc *proc, + ClientData clientData); +#endif +#ifndef Tk_CreateImageType_TCL_DECLARED +#define Tk_CreateImageType_TCL_DECLARED +/* 38 */ +EXTERN void Tk_CreateImageType(Tk_ImageType *typePtr); +#endif +#ifndef Tk_CreateItemType_TCL_DECLARED +#define Tk_CreateItemType_TCL_DECLARED +/* 39 */ +EXTERN void Tk_CreateItemType(Tk_ItemType *typePtr); +#endif +#ifndef Tk_CreatePhotoImageFormat_TCL_DECLARED +#define Tk_CreatePhotoImageFormat_TCL_DECLARED +/* 40 */ +EXTERN void Tk_CreatePhotoImageFormat( + Tk_PhotoImageFormat *formatPtr); +#endif +#ifndef Tk_CreateSelHandler_TCL_DECLARED +#define Tk_CreateSelHandler_TCL_DECLARED +/* 41 */ +EXTERN void Tk_CreateSelHandler(Tk_Window tkwin, Atom selection, + Atom target, Tk_SelectionProc *proc, + ClientData clientData, Atom format); +#endif +#ifndef Tk_CreateWindow_TCL_DECLARED +#define Tk_CreateWindow_TCL_DECLARED +/* 42 */ +EXTERN Tk_Window Tk_CreateWindow(Tcl_Interp *interp, Tk_Window parent, + CONST char *name, CONST char *screenName); +#endif +#ifndef Tk_CreateWindowFromPath_TCL_DECLARED +#define Tk_CreateWindowFromPath_TCL_DECLARED +/* 43 */ +EXTERN Tk_Window Tk_CreateWindowFromPath(Tcl_Interp *interp, + Tk_Window tkwin, CONST char *pathName, + CONST char *screenName); +#endif +#ifndef Tk_DefineBitmap_TCL_DECLARED +#define Tk_DefineBitmap_TCL_DECLARED +/* 44 */ +EXTERN int Tk_DefineBitmap(Tcl_Interp *interp, CONST char *name, + CONST char *source, int width, int height); +#endif +#ifndef Tk_DefineCursor_TCL_DECLARED +#define Tk_DefineCursor_TCL_DECLARED +/* 45 */ +EXTERN void Tk_DefineCursor(Tk_Window window, Tk_Cursor cursor); +#endif +#ifndef Tk_DeleteAllBindings_TCL_DECLARED +#define Tk_DeleteAllBindings_TCL_DECLARED +/* 46 */ +EXTERN void Tk_DeleteAllBindings(Tk_BindingTable bindingTable, + ClientData object); +#endif +#ifndef Tk_DeleteBinding_TCL_DECLARED +#define Tk_DeleteBinding_TCL_DECLARED +/* 47 */ +EXTERN int Tk_DeleteBinding(Tcl_Interp *interp, + Tk_BindingTable bindingTable, + ClientData object, CONST char *eventStr); +#endif +#ifndef Tk_DeleteBindingTable_TCL_DECLARED +#define Tk_DeleteBindingTable_TCL_DECLARED +/* 48 */ +EXTERN void Tk_DeleteBindingTable(Tk_BindingTable bindingTable); +#endif +#ifndef Tk_DeleteErrorHandler_TCL_DECLARED +#define Tk_DeleteErrorHandler_TCL_DECLARED +/* 49 */ +EXTERN void Tk_DeleteErrorHandler(Tk_ErrorHandler handler); +#endif +#ifndef Tk_DeleteEventHandler_TCL_DECLARED +#define Tk_DeleteEventHandler_TCL_DECLARED +/* 50 */ +EXTERN void Tk_DeleteEventHandler(Tk_Window token, + unsigned long mask, Tk_EventProc *proc, + ClientData clientData); +#endif +#ifndef Tk_DeleteGenericHandler_TCL_DECLARED +#define Tk_DeleteGenericHandler_TCL_DECLARED +/* 51 */ +EXTERN void Tk_DeleteGenericHandler(Tk_GenericProc *proc, + ClientData clientData); +#endif +#ifndef Tk_DeleteImage_TCL_DECLARED +#define Tk_DeleteImage_TCL_DECLARED +/* 52 */ +EXTERN void Tk_DeleteImage(Tcl_Interp *interp, CONST char *name); +#endif +#ifndef Tk_DeleteSelHandler_TCL_DECLARED +#define Tk_DeleteSelHandler_TCL_DECLARED +/* 53 */ +EXTERN void Tk_DeleteSelHandler(Tk_Window tkwin, Atom selection, + Atom target); +#endif +#ifndef Tk_DestroyWindow_TCL_DECLARED +#define Tk_DestroyWindow_TCL_DECLARED +/* 54 */ +EXTERN void Tk_DestroyWindow(Tk_Window tkwin); +#endif +#ifndef Tk_DisplayName_TCL_DECLARED +#define Tk_DisplayName_TCL_DECLARED +/* 55 */ +EXTERN CONST84_RETURN char * Tk_DisplayName(Tk_Window tkwin); +#endif +#ifndef Tk_DistanceToTextLayout_TCL_DECLARED +#define Tk_DistanceToTextLayout_TCL_DECLARED +/* 56 */ +EXTERN int Tk_DistanceToTextLayout(Tk_TextLayout layout, int x, + int y); +#endif +#ifndef Tk_Draw3DPolygon_TCL_DECLARED +#define Tk_Draw3DPolygon_TCL_DECLARED +/* 57 */ +EXTERN void Tk_Draw3DPolygon(Tk_Window tkwin, Drawable drawable, + Tk_3DBorder border, XPoint *pointPtr, + int numPoints, int borderWidth, + int leftRelief); +#endif +#ifndef Tk_Draw3DRectangle_TCL_DECLARED +#define Tk_Draw3DRectangle_TCL_DECLARED +/* 58 */ +EXTERN void Tk_Draw3DRectangle(Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, int x, + int y, int width, int height, + int borderWidth, int relief); +#endif +#ifndef Tk_DrawChars_TCL_DECLARED +#define Tk_DrawChars_TCL_DECLARED +/* 59 */ +EXTERN void Tk_DrawChars(Display *display, Drawable drawable, + GC gc, Tk_Font tkfont, CONST char *source, + int numBytes, int x, int y); +#endif +#ifndef Tk_DrawFocusHighlight_TCL_DECLARED +#define Tk_DrawFocusHighlight_TCL_DECLARED +/* 60 */ +EXTERN void Tk_DrawFocusHighlight(Tk_Window tkwin, GC gc, + int width, Drawable drawable); +#endif +#ifndef Tk_DrawTextLayout_TCL_DECLARED +#define Tk_DrawTextLayout_TCL_DECLARED +/* 61 */ +EXTERN void Tk_DrawTextLayout(Display *display, + Drawable drawable, GC gc, + Tk_TextLayout layout, int x, int y, + int firstChar, int lastChar); +#endif +#ifndef Tk_Fill3DPolygon_TCL_DECLARED +#define Tk_Fill3DPolygon_TCL_DECLARED +/* 62 */ +EXTERN void Tk_Fill3DPolygon(Tk_Window tkwin, Drawable drawable, + Tk_3DBorder border, XPoint *pointPtr, + int numPoints, int borderWidth, + int leftRelief); +#endif +#ifndef Tk_Fill3DRectangle_TCL_DECLARED +#define Tk_Fill3DRectangle_TCL_DECLARED +/* 63 */ +EXTERN void Tk_Fill3DRectangle(Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, int x, + int y, int width, int height, + int borderWidth, int relief); +#endif +#ifndef Tk_FindPhoto_TCL_DECLARED +#define Tk_FindPhoto_TCL_DECLARED +/* 64 */ +EXTERN Tk_PhotoHandle Tk_FindPhoto(Tcl_Interp *interp, + CONST char *imageName); +#endif +#ifndef Tk_FontId_TCL_DECLARED +#define Tk_FontId_TCL_DECLARED +/* 65 */ +EXTERN Font Tk_FontId(Tk_Font font); +#endif +#ifndef Tk_Free3DBorder_TCL_DECLARED +#define Tk_Free3DBorder_TCL_DECLARED +/* 66 */ +EXTERN void Tk_Free3DBorder(Tk_3DBorder border); +#endif +#ifndef Tk_FreeBitmap_TCL_DECLARED +#define Tk_FreeBitmap_TCL_DECLARED +/* 67 */ +EXTERN void Tk_FreeBitmap(Display *display, Pixmap bitmap); +#endif +#ifndef Tk_FreeColor_TCL_DECLARED +#define Tk_FreeColor_TCL_DECLARED +/* 68 */ +EXTERN void Tk_FreeColor(XColor *colorPtr); +#endif +#ifndef Tk_FreeColormap_TCL_DECLARED +#define Tk_FreeColormap_TCL_DECLARED +/* 69 */ +EXTERN void Tk_FreeColormap(Display *display, Colormap colormap); +#endif +#ifndef Tk_FreeCursor_TCL_DECLARED +#define Tk_FreeCursor_TCL_DECLARED +/* 70 */ +EXTERN void Tk_FreeCursor(Display *display, Tk_Cursor cursor); +#endif +#ifndef Tk_FreeFont_TCL_DECLARED +#define Tk_FreeFont_TCL_DECLARED +/* 71 */ +EXTERN void Tk_FreeFont(Tk_Font f); +#endif +#ifndef Tk_FreeGC_TCL_DECLARED +#define Tk_FreeGC_TCL_DECLARED +/* 72 */ +EXTERN void Tk_FreeGC(Display *display, GC gc); +#endif +#ifndef Tk_FreeImage_TCL_DECLARED +#define Tk_FreeImage_TCL_DECLARED +/* 73 */ +EXTERN void Tk_FreeImage(Tk_Image image); +#endif +#ifndef Tk_FreeOptions_TCL_DECLARED +#define Tk_FreeOptions_TCL_DECLARED +/* 74 */ +EXTERN void Tk_FreeOptions(Tk_ConfigSpec *specs, char *widgRec, + Display *display, int needFlags); +#endif +#ifndef Tk_FreePixmap_TCL_DECLARED +#define Tk_FreePixmap_TCL_DECLARED +/* 75 */ +EXTERN void Tk_FreePixmap(Display *display, Pixmap pixmap); +#endif +#ifndef Tk_FreeTextLayout_TCL_DECLARED +#define Tk_FreeTextLayout_TCL_DECLARED +/* 76 */ +EXTERN void Tk_FreeTextLayout(Tk_TextLayout textLayout); +#endif +#ifndef Tk_FreeXId_TCL_DECLARED +#define Tk_FreeXId_TCL_DECLARED +/* 77 */ +EXTERN void Tk_FreeXId(Display *display, XID xid); +#endif +#ifndef Tk_GCForColor_TCL_DECLARED +#define Tk_GCForColor_TCL_DECLARED +/* 78 */ +EXTERN GC Tk_GCForColor(XColor *colorPtr, Drawable drawable); +#endif +#ifndef Tk_GeometryRequest_TCL_DECLARED +#define Tk_GeometryRequest_TCL_DECLARED +/* 79 */ +EXTERN void Tk_GeometryRequest(Tk_Window tkwin, int reqWidth, + int reqHeight); +#endif +#ifndef Tk_Get3DBorder_TCL_DECLARED +#define Tk_Get3DBorder_TCL_DECLARED +/* 80 */ +EXTERN Tk_3DBorder Tk_Get3DBorder(Tcl_Interp *interp, Tk_Window tkwin, + Tk_Uid colorName); +#endif +#ifndef Tk_GetAllBindings_TCL_DECLARED +#define Tk_GetAllBindings_TCL_DECLARED +/* 81 */ +EXTERN void Tk_GetAllBindings(Tcl_Interp *interp, + Tk_BindingTable bindingTable, + ClientData object); +#endif +#ifndef Tk_GetAnchor_TCL_DECLARED +#define Tk_GetAnchor_TCL_DECLARED +/* 82 */ +EXTERN int Tk_GetAnchor(Tcl_Interp *interp, CONST char *str, + Tk_Anchor *anchorPtr); +#endif +#ifndef Tk_GetAtomName_TCL_DECLARED +#define Tk_GetAtomName_TCL_DECLARED +/* 83 */ +EXTERN CONST84_RETURN char * Tk_GetAtomName(Tk_Window tkwin, Atom atom); +#endif +#ifndef Tk_GetBinding_TCL_DECLARED +#define Tk_GetBinding_TCL_DECLARED +/* 84 */ +EXTERN CONST84_RETURN char * Tk_GetBinding(Tcl_Interp *interp, + Tk_BindingTable bindingTable, + ClientData object, CONST char *eventStr); +#endif +#ifndef Tk_GetBitmap_TCL_DECLARED +#define Tk_GetBitmap_TCL_DECLARED +/* 85 */ +EXTERN Pixmap Tk_GetBitmap(Tcl_Interp *interp, Tk_Window tkwin, + CONST char *str); +#endif +#ifndef Tk_GetBitmapFromData_TCL_DECLARED +#define Tk_GetBitmapFromData_TCL_DECLARED +/* 86 */ +EXTERN Pixmap Tk_GetBitmapFromData(Tcl_Interp *interp, + Tk_Window tkwin, CONST char *source, + int width, int height); +#endif +#ifndef Tk_GetCapStyle_TCL_DECLARED +#define Tk_GetCapStyle_TCL_DECLARED +/* 87 */ +EXTERN int Tk_GetCapStyle(Tcl_Interp *interp, CONST char *str, + int *capPtr); +#endif +#ifndef Tk_GetColor_TCL_DECLARED +#define Tk_GetColor_TCL_DECLARED +/* 88 */ +EXTERN XColor * Tk_GetColor(Tcl_Interp *interp, Tk_Window tkwin, + Tk_Uid name); +#endif +#ifndef Tk_GetColorByValue_TCL_DECLARED +#define Tk_GetColorByValue_TCL_DECLARED +/* 89 */ +EXTERN XColor * Tk_GetColorByValue(Tk_Window tkwin, XColor *colorPtr); +#endif +#ifndef Tk_GetColormap_TCL_DECLARED +#define Tk_GetColormap_TCL_DECLARED +/* 90 */ +EXTERN Colormap Tk_GetColormap(Tcl_Interp *interp, Tk_Window tkwin, + CONST char *str); +#endif +#ifndef Tk_GetCursor_TCL_DECLARED +#define Tk_GetCursor_TCL_DECLARED +/* 91 */ +EXTERN Tk_Cursor Tk_GetCursor(Tcl_Interp *interp, Tk_Window tkwin, + Tk_Uid str); +#endif +#ifndef Tk_GetCursorFromData_TCL_DECLARED +#define Tk_GetCursorFromData_TCL_DECLARED +/* 92 */ +EXTERN Tk_Cursor Tk_GetCursorFromData(Tcl_Interp *interp, + Tk_Window tkwin, CONST char *source, + CONST char *mask, int width, int height, + int xHot, int yHot, Tk_Uid fg, Tk_Uid bg); +#endif +#ifndef Tk_GetFont_TCL_DECLARED +#define Tk_GetFont_TCL_DECLARED +/* 93 */ +EXTERN Tk_Font Tk_GetFont(Tcl_Interp *interp, Tk_Window tkwin, + CONST char *str); +#endif +#ifndef Tk_GetFontFromObj_TCL_DECLARED +#define Tk_GetFontFromObj_TCL_DECLARED +/* 94 */ +EXTERN Tk_Font Tk_GetFontFromObj(Tk_Window tkwin, Tcl_Obj *objPtr); +#endif +#ifndef Tk_GetFontMetrics_TCL_DECLARED +#define Tk_GetFontMetrics_TCL_DECLARED +/* 95 */ +EXTERN void Tk_GetFontMetrics(Tk_Font font, + Tk_FontMetrics *fmPtr); +#endif +#ifndef Tk_GetGC_TCL_DECLARED +#define Tk_GetGC_TCL_DECLARED +/* 96 */ +EXTERN GC Tk_GetGC(Tk_Window tkwin, unsigned long valueMask, + XGCValues *valuePtr); +#endif +#ifndef Tk_GetImage_TCL_DECLARED +#define Tk_GetImage_TCL_DECLARED +/* 97 */ +EXTERN Tk_Image Tk_GetImage(Tcl_Interp *interp, Tk_Window tkwin, + CONST char *name, + Tk_ImageChangedProc *changeProc, + ClientData clientData); +#endif +#ifndef Tk_GetImageMasterData_TCL_DECLARED +#define Tk_GetImageMasterData_TCL_DECLARED +/* 98 */ +EXTERN ClientData Tk_GetImageMasterData(Tcl_Interp *interp, + CONST char *name, Tk_ImageType **typePtrPtr); +#endif +#ifndef Tk_GetItemTypes_TCL_DECLARED +#define Tk_GetItemTypes_TCL_DECLARED +/* 99 */ +EXTERN Tk_ItemType * Tk_GetItemTypes(void); +#endif +#ifndef Tk_GetJoinStyle_TCL_DECLARED +#define Tk_GetJoinStyle_TCL_DECLARED +/* 100 */ +EXTERN int Tk_GetJoinStyle(Tcl_Interp *interp, CONST char *str, + int *joinPtr); +#endif +#ifndef Tk_GetJustify_TCL_DECLARED +#define Tk_GetJustify_TCL_DECLARED +/* 101 */ +EXTERN int Tk_GetJustify(Tcl_Interp *interp, CONST char *str, + Tk_Justify *justifyPtr); +#endif +#ifndef Tk_GetNumMainWindows_TCL_DECLARED +#define Tk_GetNumMainWindows_TCL_DECLARED +/* 102 */ +EXTERN int Tk_GetNumMainWindows(void); +#endif +#ifndef Tk_GetOption_TCL_DECLARED +#define Tk_GetOption_TCL_DECLARED +/* 103 */ +EXTERN Tk_Uid Tk_GetOption(Tk_Window tkwin, CONST char *name, + CONST char *className); +#endif +#ifndef Tk_GetPixels_TCL_DECLARED +#define Tk_GetPixels_TCL_DECLARED +/* 104 */ +EXTERN int Tk_GetPixels(Tcl_Interp *interp, Tk_Window tkwin, + CONST char *str, int *intPtr); +#endif +#ifndef Tk_GetPixmap_TCL_DECLARED +#define Tk_GetPixmap_TCL_DECLARED +/* 105 */ +EXTERN Pixmap Tk_GetPixmap(Display *display, Drawable d, int width, + int height, int depth); +#endif +#ifndef Tk_GetRelief_TCL_DECLARED +#define Tk_GetRelief_TCL_DECLARED +/* 106 */ +EXTERN int Tk_GetRelief(Tcl_Interp *interp, CONST char *name, + int *reliefPtr); +#endif +#ifndef Tk_GetRootCoords_TCL_DECLARED +#define Tk_GetRootCoords_TCL_DECLARED +/* 107 */ +EXTERN void Tk_GetRootCoords(Tk_Window tkwin, int *xPtr, + int *yPtr); +#endif +#ifndef Tk_GetScrollInfo_TCL_DECLARED +#define Tk_GetScrollInfo_TCL_DECLARED +/* 108 */ +EXTERN int Tk_GetScrollInfo(Tcl_Interp *interp, int argc, + CONST84 char **argv, double *dblPtr, + int *intPtr); +#endif +#ifndef Tk_GetScreenMM_TCL_DECLARED +#define Tk_GetScreenMM_TCL_DECLARED +/* 109 */ +EXTERN int Tk_GetScreenMM(Tcl_Interp *interp, Tk_Window tkwin, + CONST char *str, double *doublePtr); +#endif +#ifndef Tk_GetSelection_TCL_DECLARED +#define Tk_GetSelection_TCL_DECLARED +/* 110 */ +EXTERN int Tk_GetSelection(Tcl_Interp *interp, Tk_Window tkwin, + Atom selection, Atom target, + Tk_GetSelProc *proc, ClientData clientData); +#endif +#ifndef Tk_GetUid_TCL_DECLARED +#define Tk_GetUid_TCL_DECLARED +/* 111 */ +EXTERN Tk_Uid Tk_GetUid(CONST char *str); +#endif +#ifndef Tk_GetVisual_TCL_DECLARED +#define Tk_GetVisual_TCL_DECLARED +/* 112 */ +EXTERN Visual * Tk_GetVisual(Tcl_Interp *interp, Tk_Window tkwin, + CONST char *str, int *depthPtr, + Colormap *colormapPtr); +#endif +#ifndef Tk_GetVRootGeometry_TCL_DECLARED +#define Tk_GetVRootGeometry_TCL_DECLARED +/* 113 */ +EXTERN void Tk_GetVRootGeometry(Tk_Window tkwin, int *xPtr, + int *yPtr, int *widthPtr, int *heightPtr); +#endif +#ifndef Tk_Grab_TCL_DECLARED +#define Tk_Grab_TCL_DECLARED +/* 114 */ +EXTERN int Tk_Grab(Tcl_Interp *interp, Tk_Window tkwin, + int grabGlobal); +#endif +#ifndef Tk_HandleEvent_TCL_DECLARED +#define Tk_HandleEvent_TCL_DECLARED +/* 115 */ +EXTERN void Tk_HandleEvent(XEvent *eventPtr); +#endif +#ifndef Tk_IdToWindow_TCL_DECLARED +#define Tk_IdToWindow_TCL_DECLARED +/* 116 */ +EXTERN Tk_Window Tk_IdToWindow(Display *display, Window window); +#endif +#ifndef Tk_ImageChanged_TCL_DECLARED +#define Tk_ImageChanged_TCL_DECLARED +/* 117 */ +EXTERN void Tk_ImageChanged(Tk_ImageMaster master, int x, int y, + int width, int height, int imageWidth, + int imageHeight); +#endif +#ifndef Tk_Init_TCL_DECLARED +#define Tk_Init_TCL_DECLARED +/* 118 */ +EXTERN int Tk_Init(Tcl_Interp *interp); +#endif +#ifndef Tk_InternAtom_TCL_DECLARED +#define Tk_InternAtom_TCL_DECLARED +/* 119 */ +EXTERN Atom Tk_InternAtom(Tk_Window tkwin, CONST char *name); +#endif +#ifndef Tk_IntersectTextLayout_TCL_DECLARED +#define Tk_IntersectTextLayout_TCL_DECLARED +/* 120 */ +EXTERN int Tk_IntersectTextLayout(Tk_TextLayout layout, int x, + int y, int width, int height); +#endif +#ifndef Tk_MaintainGeometry_TCL_DECLARED +#define Tk_MaintainGeometry_TCL_DECLARED +/* 121 */ +EXTERN void Tk_MaintainGeometry(Tk_Window slave, + Tk_Window master, int x, int y, int width, + int height); +#endif +#ifndef Tk_MainWindow_TCL_DECLARED +#define Tk_MainWindow_TCL_DECLARED +/* 122 */ +EXTERN Tk_Window Tk_MainWindow(Tcl_Interp *interp); +#endif +#ifndef Tk_MakeWindowExist_TCL_DECLARED +#define Tk_MakeWindowExist_TCL_DECLARED +/* 123 */ +EXTERN void Tk_MakeWindowExist(Tk_Window tkwin); +#endif +#ifndef Tk_ManageGeometry_TCL_DECLARED +#define Tk_ManageGeometry_TCL_DECLARED +/* 124 */ +EXTERN void Tk_ManageGeometry(Tk_Window tkwin, + CONST Tk_GeomMgr *mgrPtr, + ClientData clientData); +#endif +#ifndef Tk_MapWindow_TCL_DECLARED +#define Tk_MapWindow_TCL_DECLARED +/* 125 */ +EXTERN void Tk_MapWindow(Tk_Window tkwin); +#endif +#ifndef Tk_MeasureChars_TCL_DECLARED +#define Tk_MeasureChars_TCL_DECLARED +/* 126 */ +EXTERN int Tk_MeasureChars(Tk_Font tkfont, CONST char *source, + int numBytes, int maxPixels, int flags, + int *lengthPtr); +#endif +#ifndef Tk_MoveResizeWindow_TCL_DECLARED +#define Tk_MoveResizeWindow_TCL_DECLARED +/* 127 */ +EXTERN void Tk_MoveResizeWindow(Tk_Window tkwin, int x, int y, + int width, int height); +#endif +#ifndef Tk_MoveWindow_TCL_DECLARED +#define Tk_MoveWindow_TCL_DECLARED +/* 128 */ +EXTERN void Tk_MoveWindow(Tk_Window tkwin, int x, int y); +#endif +#ifndef Tk_MoveToplevelWindow_TCL_DECLARED +#define Tk_MoveToplevelWindow_TCL_DECLARED +/* 129 */ +EXTERN void Tk_MoveToplevelWindow(Tk_Window tkwin, int x, int y); +#endif +#ifndef Tk_NameOf3DBorder_TCL_DECLARED +#define Tk_NameOf3DBorder_TCL_DECLARED +/* 130 */ +EXTERN CONST84_RETURN char * Tk_NameOf3DBorder(Tk_3DBorder border); +#endif +#ifndef Tk_NameOfAnchor_TCL_DECLARED +#define Tk_NameOfAnchor_TCL_DECLARED +/* 131 */ +EXTERN CONST84_RETURN char * Tk_NameOfAnchor(Tk_Anchor anchor); +#endif +#ifndef Tk_NameOfBitmap_TCL_DECLARED +#define Tk_NameOfBitmap_TCL_DECLARED +/* 132 */ +EXTERN CONST84_RETURN char * Tk_NameOfBitmap(Display *display, Pixmap bitmap); +#endif +#ifndef Tk_NameOfCapStyle_TCL_DECLARED +#define Tk_NameOfCapStyle_TCL_DECLARED +/* 133 */ +EXTERN CONST84_RETURN char * Tk_NameOfCapStyle(int cap); +#endif +#ifndef Tk_NameOfColor_TCL_DECLARED +#define Tk_NameOfColor_TCL_DECLARED +/* 134 */ +EXTERN CONST84_RETURN char * Tk_NameOfColor(XColor *colorPtr); +#endif +#ifndef Tk_NameOfCursor_TCL_DECLARED +#define Tk_NameOfCursor_TCL_DECLARED +/* 135 */ +EXTERN CONST84_RETURN char * Tk_NameOfCursor(Display *display, + Tk_Cursor cursor); +#endif +#ifndef Tk_NameOfFont_TCL_DECLARED +#define Tk_NameOfFont_TCL_DECLARED +/* 136 */ +EXTERN CONST84_RETURN char * Tk_NameOfFont(Tk_Font font); +#endif +#ifndef Tk_NameOfImage_TCL_DECLARED +#define Tk_NameOfImage_TCL_DECLARED +/* 137 */ +EXTERN CONST84_RETURN char * Tk_NameOfImage(Tk_ImageMaster imageMaster); +#endif +#ifndef Tk_NameOfJoinStyle_TCL_DECLARED +#define Tk_NameOfJoinStyle_TCL_DECLARED +/* 138 */ +EXTERN CONST84_RETURN char * Tk_NameOfJoinStyle(int join); +#endif +#ifndef Tk_NameOfJustify_TCL_DECLARED +#define Tk_NameOfJustify_TCL_DECLARED +/* 139 */ +EXTERN CONST84_RETURN char * Tk_NameOfJustify(Tk_Justify justify); +#endif +#ifndef Tk_NameOfRelief_TCL_DECLARED +#define Tk_NameOfRelief_TCL_DECLARED +/* 140 */ +EXTERN CONST84_RETURN char * Tk_NameOfRelief(int relief); +#endif +#ifndef Tk_NameToWindow_TCL_DECLARED +#define Tk_NameToWindow_TCL_DECLARED +/* 141 */ +EXTERN Tk_Window Tk_NameToWindow(Tcl_Interp *interp, + CONST char *pathName, Tk_Window tkwin); +#endif +#ifndef Tk_OwnSelection_TCL_DECLARED +#define Tk_OwnSelection_TCL_DECLARED +/* 142 */ +EXTERN void Tk_OwnSelection(Tk_Window tkwin, Atom selection, + Tk_LostSelProc *proc, ClientData clientData); +#endif +#ifndef Tk_ParseArgv_TCL_DECLARED +#define Tk_ParseArgv_TCL_DECLARED +/* 143 */ +EXTERN int Tk_ParseArgv(Tcl_Interp *interp, Tk_Window tkwin, + int *argcPtr, CONST84 char **argv, + Tk_ArgvInfo *argTable, int flags); +#endif +#ifndef Tk_PhotoPutBlock_NoComposite_TCL_DECLARED +#define Tk_PhotoPutBlock_NoComposite_TCL_DECLARED +/* 144 */ +EXTERN void Tk_PhotoPutBlock_NoComposite(Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height); +#endif +#ifndef Tk_PhotoPutZoomedBlock_NoComposite_TCL_DECLARED +#define Tk_PhotoPutZoomedBlock_NoComposite_TCL_DECLARED +/* 145 */ +EXTERN void Tk_PhotoPutZoomedBlock_NoComposite( + Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int zoomX, int zoomY, + int subsampleX, int subsampleY); +#endif +#ifndef Tk_PhotoGetImage_TCL_DECLARED +#define Tk_PhotoGetImage_TCL_DECLARED +/* 146 */ +EXTERN int Tk_PhotoGetImage(Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr); +#endif +#ifndef Tk_PhotoBlank_TCL_DECLARED +#define Tk_PhotoBlank_TCL_DECLARED +/* 147 */ +EXTERN void Tk_PhotoBlank(Tk_PhotoHandle handle); +#endif +#ifndef Tk_PhotoExpand_Panic_TCL_DECLARED +#define Tk_PhotoExpand_Panic_TCL_DECLARED +/* 148 */ +EXTERN void Tk_PhotoExpand_Panic(Tk_PhotoHandle handle, + int width, int height); +#endif +#ifndef Tk_PhotoGetSize_TCL_DECLARED +#define Tk_PhotoGetSize_TCL_DECLARED +/* 149 */ +EXTERN void Tk_PhotoGetSize(Tk_PhotoHandle handle, int *widthPtr, + int *heightPtr); +#endif +#ifndef Tk_PhotoSetSize_Panic_TCL_DECLARED +#define Tk_PhotoSetSize_Panic_TCL_DECLARED +/* 150 */ +EXTERN void Tk_PhotoSetSize_Panic(Tk_PhotoHandle handle, + int width, int height); +#endif +#ifndef Tk_PointToChar_TCL_DECLARED +#define Tk_PointToChar_TCL_DECLARED +/* 151 */ +EXTERN int Tk_PointToChar(Tk_TextLayout layout, int x, int y); +#endif +#ifndef Tk_PostscriptFontName_TCL_DECLARED +#define Tk_PostscriptFontName_TCL_DECLARED +/* 152 */ +EXTERN int Tk_PostscriptFontName(Tk_Font tkfont, + Tcl_DString *dsPtr); +#endif +#ifndef Tk_PreserveColormap_TCL_DECLARED +#define Tk_PreserveColormap_TCL_DECLARED +/* 153 */ +EXTERN void Tk_PreserveColormap(Display *display, + Colormap colormap); +#endif +#ifndef Tk_QueueWindowEvent_TCL_DECLARED +#define Tk_QueueWindowEvent_TCL_DECLARED +/* 154 */ +EXTERN void Tk_QueueWindowEvent(XEvent *eventPtr, + Tcl_QueuePosition position); +#endif +#ifndef Tk_RedrawImage_TCL_DECLARED +#define Tk_RedrawImage_TCL_DECLARED +/* 155 */ +EXTERN void Tk_RedrawImage(Tk_Image image, int imageX, + int imageY, int width, int height, + Drawable drawable, int drawableX, + int drawableY); +#endif +#ifndef Tk_ResizeWindow_TCL_DECLARED +#define Tk_ResizeWindow_TCL_DECLARED +/* 156 */ +EXTERN void Tk_ResizeWindow(Tk_Window tkwin, int width, + int height); +#endif +#ifndef Tk_RestackWindow_TCL_DECLARED +#define Tk_RestackWindow_TCL_DECLARED +/* 157 */ +EXTERN int Tk_RestackWindow(Tk_Window tkwin, int aboveBelow, + Tk_Window other); +#endif +#ifndef Tk_RestrictEvents_TCL_DECLARED +#define Tk_RestrictEvents_TCL_DECLARED +/* 158 */ +EXTERN Tk_RestrictProc * Tk_RestrictEvents(Tk_RestrictProc *proc, + ClientData arg, ClientData *prevArgPtr); +#endif +#ifndef Tk_SafeInit_TCL_DECLARED +#define Tk_SafeInit_TCL_DECLARED +/* 159 */ +EXTERN int Tk_SafeInit(Tcl_Interp *interp); +#endif +#ifndef Tk_SetAppName_TCL_DECLARED +#define Tk_SetAppName_TCL_DECLARED +/* 160 */ +EXTERN CONST char * Tk_SetAppName(Tk_Window tkwin, CONST char *name); +#endif +#ifndef Tk_SetBackgroundFromBorder_TCL_DECLARED +#define Tk_SetBackgroundFromBorder_TCL_DECLARED +/* 161 */ +EXTERN void Tk_SetBackgroundFromBorder(Tk_Window tkwin, + Tk_3DBorder border); +#endif +#ifndef Tk_SetClass_TCL_DECLARED +#define Tk_SetClass_TCL_DECLARED +/* 162 */ +EXTERN void Tk_SetClass(Tk_Window tkwin, CONST char *className); +#endif +#ifndef Tk_SetGrid_TCL_DECLARED +#define Tk_SetGrid_TCL_DECLARED +/* 163 */ +EXTERN void Tk_SetGrid(Tk_Window tkwin, int reqWidth, + int reqHeight, int gridWidth, int gridHeight); +#endif +#ifndef Tk_SetInternalBorder_TCL_DECLARED +#define Tk_SetInternalBorder_TCL_DECLARED +/* 164 */ +EXTERN void Tk_SetInternalBorder(Tk_Window tkwin, int width); +#endif +#ifndef Tk_SetWindowBackground_TCL_DECLARED +#define Tk_SetWindowBackground_TCL_DECLARED +/* 165 */ +EXTERN void Tk_SetWindowBackground(Tk_Window tkwin, + unsigned long pixel); +#endif +#ifndef Tk_SetWindowBackgroundPixmap_TCL_DECLARED +#define Tk_SetWindowBackgroundPixmap_TCL_DECLARED +/* 166 */ +EXTERN void Tk_SetWindowBackgroundPixmap(Tk_Window tkwin, + Pixmap pixmap); +#endif +#ifndef Tk_SetWindowBorder_TCL_DECLARED +#define Tk_SetWindowBorder_TCL_DECLARED +/* 167 */ +EXTERN void Tk_SetWindowBorder(Tk_Window tkwin, + unsigned long pixel); +#endif +#ifndef Tk_SetWindowBorderWidth_TCL_DECLARED +#define Tk_SetWindowBorderWidth_TCL_DECLARED +/* 168 */ +EXTERN void Tk_SetWindowBorderWidth(Tk_Window tkwin, int width); +#endif +#ifndef Tk_SetWindowBorderPixmap_TCL_DECLARED +#define Tk_SetWindowBorderPixmap_TCL_DECLARED +/* 169 */ +EXTERN void Tk_SetWindowBorderPixmap(Tk_Window tkwin, + Pixmap pixmap); +#endif +#ifndef Tk_SetWindowColormap_TCL_DECLARED +#define Tk_SetWindowColormap_TCL_DECLARED +/* 170 */ +EXTERN void Tk_SetWindowColormap(Tk_Window tkwin, + Colormap colormap); +#endif +#ifndef Tk_SetWindowVisual_TCL_DECLARED +#define Tk_SetWindowVisual_TCL_DECLARED +/* 171 */ +EXTERN int Tk_SetWindowVisual(Tk_Window tkwin, Visual *visual, + int depth, Colormap colormap); +#endif +#ifndef Tk_SizeOfBitmap_TCL_DECLARED +#define Tk_SizeOfBitmap_TCL_DECLARED +/* 172 */ +EXTERN void Tk_SizeOfBitmap(Display *display, Pixmap bitmap, + int *widthPtr, int *heightPtr); +#endif +#ifndef Tk_SizeOfImage_TCL_DECLARED +#define Tk_SizeOfImage_TCL_DECLARED +/* 173 */ +EXTERN void Tk_SizeOfImage(Tk_Image image, int *widthPtr, + int *heightPtr); +#endif +#ifndef Tk_StrictMotif_TCL_DECLARED +#define Tk_StrictMotif_TCL_DECLARED +/* 174 */ +EXTERN int Tk_StrictMotif(Tk_Window tkwin); +#endif +#ifndef Tk_TextLayoutToPostscript_TCL_DECLARED +#define Tk_TextLayoutToPostscript_TCL_DECLARED +/* 175 */ +EXTERN void Tk_TextLayoutToPostscript(Tcl_Interp *interp, + Tk_TextLayout layout); +#endif +#ifndef Tk_TextWidth_TCL_DECLARED +#define Tk_TextWidth_TCL_DECLARED +/* 176 */ +EXTERN int Tk_TextWidth(Tk_Font font, CONST char *str, + int numBytes); +#endif +#ifndef Tk_UndefineCursor_TCL_DECLARED +#define Tk_UndefineCursor_TCL_DECLARED +/* 177 */ +EXTERN void Tk_UndefineCursor(Tk_Window window); +#endif +#ifndef Tk_UnderlineChars_TCL_DECLARED +#define Tk_UnderlineChars_TCL_DECLARED +/* 178 */ +EXTERN void Tk_UnderlineChars(Display *display, + Drawable drawable, GC gc, Tk_Font tkfont, + CONST char *source, int x, int y, + int firstByte, int lastByte); +#endif +#ifndef Tk_UnderlineTextLayout_TCL_DECLARED +#define Tk_UnderlineTextLayout_TCL_DECLARED +/* 179 */ +EXTERN void Tk_UnderlineTextLayout(Display *display, + Drawable drawable, GC gc, + Tk_TextLayout layout, int x, int y, + int underline); +#endif +#ifndef Tk_Ungrab_TCL_DECLARED +#define Tk_Ungrab_TCL_DECLARED +/* 180 */ +EXTERN void Tk_Ungrab(Tk_Window tkwin); +#endif +#ifndef Tk_UnmaintainGeometry_TCL_DECLARED +#define Tk_UnmaintainGeometry_TCL_DECLARED +/* 181 */ +EXTERN void Tk_UnmaintainGeometry(Tk_Window slave, + Tk_Window master); +#endif +#ifndef Tk_UnmapWindow_TCL_DECLARED +#define Tk_UnmapWindow_TCL_DECLARED +/* 182 */ +EXTERN void Tk_UnmapWindow(Tk_Window tkwin); +#endif +#ifndef Tk_UnsetGrid_TCL_DECLARED +#define Tk_UnsetGrid_TCL_DECLARED +/* 183 */ +EXTERN void Tk_UnsetGrid(Tk_Window tkwin); +#endif +#ifndef Tk_UpdatePointer_TCL_DECLARED +#define Tk_UpdatePointer_TCL_DECLARED +/* 184 */ +EXTERN void Tk_UpdatePointer(Tk_Window tkwin, int x, int y, + int state); +#endif +#ifndef Tk_AllocBitmapFromObj_TCL_DECLARED +#define Tk_AllocBitmapFromObj_TCL_DECLARED +/* 185 */ +EXTERN Pixmap Tk_AllocBitmapFromObj(Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr); +#endif +#ifndef Tk_Alloc3DBorderFromObj_TCL_DECLARED +#define Tk_Alloc3DBorderFromObj_TCL_DECLARED +/* 186 */ +EXTERN Tk_3DBorder Tk_Alloc3DBorderFromObj(Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr); +#endif +#ifndef Tk_AllocColorFromObj_TCL_DECLARED +#define Tk_AllocColorFromObj_TCL_DECLARED +/* 187 */ +EXTERN XColor * Tk_AllocColorFromObj(Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr); +#endif +#ifndef Tk_AllocCursorFromObj_TCL_DECLARED +#define Tk_AllocCursorFromObj_TCL_DECLARED +/* 188 */ +EXTERN Tk_Cursor Tk_AllocCursorFromObj(Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr); +#endif +#ifndef Tk_AllocFontFromObj_TCL_DECLARED +#define Tk_AllocFontFromObj_TCL_DECLARED +/* 189 */ +EXTERN Tk_Font Tk_AllocFontFromObj(Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr); +#endif +#ifndef Tk_CreateOptionTable_TCL_DECLARED +#define Tk_CreateOptionTable_TCL_DECLARED +/* 190 */ +EXTERN Tk_OptionTable Tk_CreateOptionTable(Tcl_Interp *interp, + CONST Tk_OptionSpec *templatePtr); +#endif +#ifndef Tk_DeleteOptionTable_TCL_DECLARED +#define Tk_DeleteOptionTable_TCL_DECLARED +/* 191 */ +EXTERN void Tk_DeleteOptionTable(Tk_OptionTable optionTable); +#endif +#ifndef Tk_Free3DBorderFromObj_TCL_DECLARED +#define Tk_Free3DBorderFromObj_TCL_DECLARED +/* 192 */ +EXTERN void Tk_Free3DBorderFromObj(Tk_Window tkwin, + Tcl_Obj *objPtr); +#endif +#ifndef Tk_FreeBitmapFromObj_TCL_DECLARED +#define Tk_FreeBitmapFromObj_TCL_DECLARED +/* 193 */ +EXTERN void Tk_FreeBitmapFromObj(Tk_Window tkwin, + Tcl_Obj *objPtr); +#endif +#ifndef Tk_FreeColorFromObj_TCL_DECLARED +#define Tk_FreeColorFromObj_TCL_DECLARED +/* 194 */ +EXTERN void Tk_FreeColorFromObj(Tk_Window tkwin, Tcl_Obj *objPtr); +#endif +#ifndef Tk_FreeConfigOptions_TCL_DECLARED +#define Tk_FreeConfigOptions_TCL_DECLARED +/* 195 */ +EXTERN void Tk_FreeConfigOptions(char *recordPtr, + Tk_OptionTable optionToken, Tk_Window tkwin); +#endif +#ifndef Tk_FreeSavedOptions_TCL_DECLARED +#define Tk_FreeSavedOptions_TCL_DECLARED +/* 196 */ +EXTERN void Tk_FreeSavedOptions(Tk_SavedOptions *savePtr); +#endif +#ifndef Tk_FreeCursorFromObj_TCL_DECLARED +#define Tk_FreeCursorFromObj_TCL_DECLARED +/* 197 */ +EXTERN void Tk_FreeCursorFromObj(Tk_Window tkwin, + Tcl_Obj *objPtr); +#endif +#ifndef Tk_FreeFontFromObj_TCL_DECLARED +#define Tk_FreeFontFromObj_TCL_DECLARED +/* 198 */ +EXTERN void Tk_FreeFontFromObj(Tk_Window tkwin, Tcl_Obj *objPtr); +#endif +#ifndef Tk_Get3DBorderFromObj_TCL_DECLARED +#define Tk_Get3DBorderFromObj_TCL_DECLARED +/* 199 */ +EXTERN Tk_3DBorder Tk_Get3DBorderFromObj(Tk_Window tkwin, + Tcl_Obj *objPtr); +#endif +#ifndef Tk_GetAnchorFromObj_TCL_DECLARED +#define Tk_GetAnchorFromObj_TCL_DECLARED +/* 200 */ +EXTERN int Tk_GetAnchorFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, Tk_Anchor *anchorPtr); +#endif +#ifndef Tk_GetBitmapFromObj_TCL_DECLARED +#define Tk_GetBitmapFromObj_TCL_DECLARED +/* 201 */ +EXTERN Pixmap Tk_GetBitmapFromObj(Tk_Window tkwin, Tcl_Obj *objPtr); +#endif +#ifndef Tk_GetColorFromObj_TCL_DECLARED +#define Tk_GetColorFromObj_TCL_DECLARED +/* 202 */ +EXTERN XColor * Tk_GetColorFromObj(Tk_Window tkwin, Tcl_Obj *objPtr); +#endif +#ifndef Tk_GetCursorFromObj_TCL_DECLARED +#define Tk_GetCursorFromObj_TCL_DECLARED +/* 203 */ +EXTERN Tk_Cursor Tk_GetCursorFromObj(Tk_Window tkwin, Tcl_Obj *objPtr); +#endif +#ifndef Tk_GetOptionInfo_TCL_DECLARED +#define Tk_GetOptionInfo_TCL_DECLARED +/* 204 */ +EXTERN Tcl_Obj * Tk_GetOptionInfo(Tcl_Interp *interp, char *recordPtr, + Tk_OptionTable optionTable, Tcl_Obj *namePtr, + Tk_Window tkwin); +#endif +#ifndef Tk_GetOptionValue_TCL_DECLARED +#define Tk_GetOptionValue_TCL_DECLARED +/* 205 */ +EXTERN Tcl_Obj * Tk_GetOptionValue(Tcl_Interp *interp, + char *recordPtr, Tk_OptionTable optionTable, + Tcl_Obj *namePtr, Tk_Window tkwin); +#endif +#ifndef Tk_GetJustifyFromObj_TCL_DECLARED +#define Tk_GetJustifyFromObj_TCL_DECLARED +/* 206 */ +EXTERN int Tk_GetJustifyFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, Tk_Justify *justifyPtr); +#endif +#ifndef Tk_GetMMFromObj_TCL_DECLARED +#define Tk_GetMMFromObj_TCL_DECLARED +/* 207 */ +EXTERN int Tk_GetMMFromObj(Tcl_Interp *interp, Tk_Window tkwin, + Tcl_Obj *objPtr, double *doublePtr); +#endif +#ifndef Tk_GetPixelsFromObj_TCL_DECLARED +#define Tk_GetPixelsFromObj_TCL_DECLARED +/* 208 */ +EXTERN int Tk_GetPixelsFromObj(Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr, + int *intPtr); +#endif +#ifndef Tk_GetReliefFromObj_TCL_DECLARED +#define Tk_GetReliefFromObj_TCL_DECLARED +/* 209 */ +EXTERN int Tk_GetReliefFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, int *resultPtr); +#endif +#ifndef Tk_GetScrollInfoObj_TCL_DECLARED +#define Tk_GetScrollInfoObj_TCL_DECLARED +/* 210 */ +EXTERN int Tk_GetScrollInfoObj(Tcl_Interp *interp, int objc, + Tcl_Obj *CONST objv[], double *dblPtr, + int *intPtr); +#endif +#ifndef Tk_InitOptions_TCL_DECLARED +#define Tk_InitOptions_TCL_DECLARED +/* 211 */ +EXTERN int Tk_InitOptions(Tcl_Interp *interp, char *recordPtr, + Tk_OptionTable optionToken, Tk_Window tkwin); +#endif +#ifndef Tk_MainEx_TCL_DECLARED +#define Tk_MainEx_TCL_DECLARED +/* 212 */ +EXTERN void Tk_MainEx(int argc, char **argv, + Tcl_AppInitProc *appInitProc, + Tcl_Interp *interp); +#endif +#ifndef Tk_RestoreSavedOptions_TCL_DECLARED +#define Tk_RestoreSavedOptions_TCL_DECLARED +/* 213 */ +EXTERN void Tk_RestoreSavedOptions(Tk_SavedOptions *savePtr); +#endif +#ifndef Tk_SetOptions_TCL_DECLARED +#define Tk_SetOptions_TCL_DECLARED +/* 214 */ +EXTERN int Tk_SetOptions(Tcl_Interp *interp, char *recordPtr, + Tk_OptionTable optionTable, int objc, + Tcl_Obj *CONST objv[], Tk_Window tkwin, + Tk_SavedOptions *savePtr, int *maskPtr); +#endif +#ifndef Tk_InitConsoleChannels_TCL_DECLARED +#define Tk_InitConsoleChannels_TCL_DECLARED +/* 215 */ +EXTERN void Tk_InitConsoleChannels(Tcl_Interp *interp); +#endif +#ifndef Tk_CreateConsoleWindow_TCL_DECLARED +#define Tk_CreateConsoleWindow_TCL_DECLARED +/* 216 */ +EXTERN int Tk_CreateConsoleWindow(Tcl_Interp *interp); +#endif +#ifndef Tk_CreateSmoothMethod_TCL_DECLARED +#define Tk_CreateSmoothMethod_TCL_DECLARED +/* 217 */ +EXTERN void Tk_CreateSmoothMethod(Tcl_Interp *interp, + Tk_SmoothMethod *method); +#endif +/* Slot 218 is reserved */ +/* Slot 219 is reserved */ +#ifndef Tk_GetDash_TCL_DECLARED +#define Tk_GetDash_TCL_DECLARED +/* 220 */ +EXTERN int Tk_GetDash(Tcl_Interp *interp, CONST char *value, + Tk_Dash *dash); +#endif +#ifndef Tk_CreateOutline_TCL_DECLARED +#define Tk_CreateOutline_TCL_DECLARED +/* 221 */ +EXTERN void Tk_CreateOutline(Tk_Outline *outline); +#endif +#ifndef Tk_DeleteOutline_TCL_DECLARED +#define Tk_DeleteOutline_TCL_DECLARED +/* 222 */ +EXTERN void Tk_DeleteOutline(Display *display, + Tk_Outline *outline); +#endif +#ifndef Tk_ConfigOutlineGC_TCL_DECLARED +#define Tk_ConfigOutlineGC_TCL_DECLARED +/* 223 */ +EXTERN int Tk_ConfigOutlineGC(XGCValues *gcValues, + Tk_Canvas canvas, Tk_Item *item, + Tk_Outline *outline); +#endif +#ifndef Tk_ChangeOutlineGC_TCL_DECLARED +#define Tk_ChangeOutlineGC_TCL_DECLARED +/* 224 */ +EXTERN int Tk_ChangeOutlineGC(Tk_Canvas canvas, Tk_Item *item, + Tk_Outline *outline); +#endif +#ifndef Tk_ResetOutlineGC_TCL_DECLARED +#define Tk_ResetOutlineGC_TCL_DECLARED +/* 225 */ +EXTERN int Tk_ResetOutlineGC(Tk_Canvas canvas, Tk_Item *item, + Tk_Outline *outline); +#endif +#ifndef Tk_CanvasPsOutline_TCL_DECLARED +#define Tk_CanvasPsOutline_TCL_DECLARED +/* 226 */ +EXTERN int Tk_CanvasPsOutline(Tk_Canvas canvas, Tk_Item *item, + Tk_Outline *outline); +#endif +#ifndef Tk_SetTSOrigin_TCL_DECLARED +#define Tk_SetTSOrigin_TCL_DECLARED +/* 227 */ +EXTERN void Tk_SetTSOrigin(Tk_Window tkwin, GC gc, int x, int y); +#endif +#ifndef Tk_CanvasGetCoordFromObj_TCL_DECLARED +#define Tk_CanvasGetCoordFromObj_TCL_DECLARED +/* 228 */ +EXTERN int Tk_CanvasGetCoordFromObj(Tcl_Interp *interp, + Tk_Canvas canvas, Tcl_Obj *obj, + double *doublePtr); +#endif +#ifndef Tk_CanvasSetOffset_TCL_DECLARED +#define Tk_CanvasSetOffset_TCL_DECLARED +/* 229 */ +EXTERN void Tk_CanvasSetOffset(Tk_Canvas canvas, GC gc, + Tk_TSOffset *offset); +#endif +#ifndef Tk_DitherPhoto_TCL_DECLARED +#define Tk_DitherPhoto_TCL_DECLARED +/* 230 */ +EXTERN void Tk_DitherPhoto(Tk_PhotoHandle handle, int x, int y, + int width, int height); +#endif +#ifndef Tk_PostscriptBitmap_TCL_DECLARED +#define Tk_PostscriptBitmap_TCL_DECLARED +/* 231 */ +EXTERN int Tk_PostscriptBitmap(Tcl_Interp *interp, + Tk_Window tkwin, Tk_PostscriptInfo psInfo, + Pixmap bitmap, int startX, int startY, + int width, int height); +#endif +#ifndef Tk_PostscriptColor_TCL_DECLARED +#define Tk_PostscriptColor_TCL_DECLARED +/* 232 */ +EXTERN int Tk_PostscriptColor(Tcl_Interp *interp, + Tk_PostscriptInfo psInfo, XColor *colorPtr); +#endif +#ifndef Tk_PostscriptFont_TCL_DECLARED +#define Tk_PostscriptFont_TCL_DECLARED +/* 233 */ +EXTERN int Tk_PostscriptFont(Tcl_Interp *interp, + Tk_PostscriptInfo psInfo, Tk_Font font); +#endif +#ifndef Tk_PostscriptImage_TCL_DECLARED +#define Tk_PostscriptImage_TCL_DECLARED +/* 234 */ +EXTERN int Tk_PostscriptImage(Tk_Image image, + Tcl_Interp *interp, Tk_Window tkwin, + Tk_PostscriptInfo psinfo, int x, int y, + int width, int height, int prepass); +#endif +#ifndef Tk_PostscriptPath_TCL_DECLARED +#define Tk_PostscriptPath_TCL_DECLARED +/* 235 */ +EXTERN void Tk_PostscriptPath(Tcl_Interp *interp, + Tk_PostscriptInfo psInfo, double *coordPtr, + int numPoints); +#endif +#ifndef Tk_PostscriptStipple_TCL_DECLARED +#define Tk_PostscriptStipple_TCL_DECLARED +/* 236 */ +EXTERN int Tk_PostscriptStipple(Tcl_Interp *interp, + Tk_Window tkwin, Tk_PostscriptInfo psInfo, + Pixmap bitmap); +#endif +#ifndef Tk_PostscriptY_TCL_DECLARED +#define Tk_PostscriptY_TCL_DECLARED +/* 237 */ +EXTERN double Tk_PostscriptY(double y, Tk_PostscriptInfo psInfo); +#endif +#ifndef Tk_PostscriptPhoto_TCL_DECLARED +#define Tk_PostscriptPhoto_TCL_DECLARED +/* 238 */ +EXTERN int Tk_PostscriptPhoto(Tcl_Interp *interp, + Tk_PhotoImageBlock *blockPtr, + Tk_PostscriptInfo psInfo, int width, + int height); +#endif +#ifndef Tk_CreateClientMessageHandler_TCL_DECLARED +#define Tk_CreateClientMessageHandler_TCL_DECLARED +/* 239 */ +EXTERN void Tk_CreateClientMessageHandler( + Tk_ClientMessageProc *proc); +#endif +#ifndef Tk_DeleteClientMessageHandler_TCL_DECLARED +#define Tk_DeleteClientMessageHandler_TCL_DECLARED +/* 240 */ +EXTERN void Tk_DeleteClientMessageHandler( + Tk_ClientMessageProc *proc); +#endif +#ifndef Tk_CreateAnonymousWindow_TCL_DECLARED +#define Tk_CreateAnonymousWindow_TCL_DECLARED +/* 241 */ +EXTERN Tk_Window Tk_CreateAnonymousWindow(Tcl_Interp *interp, + Tk_Window parent, CONST char *screenName); +#endif +#ifndef Tk_SetClassProcs_TCL_DECLARED +#define Tk_SetClassProcs_TCL_DECLARED +/* 242 */ +EXTERN void Tk_SetClassProcs(Tk_Window tkwin, + Tk_ClassProcs *procs, + ClientData instanceData); +#endif +#ifndef Tk_SetInternalBorderEx_TCL_DECLARED +#define Tk_SetInternalBorderEx_TCL_DECLARED +/* 243 */ +EXTERN void Tk_SetInternalBorderEx(Tk_Window tkwin, int left, + int right, int top, int bottom); +#endif +#ifndef Tk_SetMinimumRequestSize_TCL_DECLARED +#define Tk_SetMinimumRequestSize_TCL_DECLARED +/* 244 */ +EXTERN void Tk_SetMinimumRequestSize(Tk_Window tkwin, + int minWidth, int minHeight); +#endif +#ifndef Tk_SetCaretPos_TCL_DECLARED +#define Tk_SetCaretPos_TCL_DECLARED +/* 245 */ +EXTERN void Tk_SetCaretPos(Tk_Window tkwin, int x, int y, + int height); +#endif +#ifndef Tk_PhotoPutBlock_Panic_TCL_DECLARED +#define Tk_PhotoPutBlock_Panic_TCL_DECLARED +/* 246 */ +EXTERN void Tk_PhotoPutBlock_Panic(Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int compRule); +#endif +#ifndef Tk_PhotoPutZoomedBlock_Panic_TCL_DECLARED +#define Tk_PhotoPutZoomedBlock_Panic_TCL_DECLARED +/* 247 */ +EXTERN void Tk_PhotoPutZoomedBlock_Panic(Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int zoomX, int zoomY, + int subsampleX, int subsampleY, int compRule); +#endif +#ifndef Tk_CollapseMotionEvents_TCL_DECLARED +#define Tk_CollapseMotionEvents_TCL_DECLARED +/* 248 */ +EXTERN int Tk_CollapseMotionEvents(Display *display, + int collapse); +#endif +#ifndef Tk_RegisterStyleEngine_TCL_DECLARED +#define Tk_RegisterStyleEngine_TCL_DECLARED +/* 249 */ +EXTERN Tk_StyleEngine Tk_RegisterStyleEngine(CONST char *name, + Tk_StyleEngine parent); +#endif +#ifndef Tk_GetStyleEngine_TCL_DECLARED +#define Tk_GetStyleEngine_TCL_DECLARED +/* 250 */ +EXTERN Tk_StyleEngine Tk_GetStyleEngine(CONST char *name); +#endif +#ifndef Tk_RegisterStyledElement_TCL_DECLARED +#define Tk_RegisterStyledElement_TCL_DECLARED +/* 251 */ +EXTERN int Tk_RegisterStyledElement(Tk_StyleEngine engine, + Tk_ElementSpec *templatePtr); +#endif +#ifndef Tk_GetElementId_TCL_DECLARED +#define Tk_GetElementId_TCL_DECLARED +/* 252 */ +EXTERN int Tk_GetElementId(CONST char *name); +#endif +#ifndef Tk_CreateStyle_TCL_DECLARED +#define Tk_CreateStyle_TCL_DECLARED +/* 253 */ +EXTERN Tk_Style Tk_CreateStyle(CONST char *name, + Tk_StyleEngine engine, ClientData clientData); +#endif +#ifndef Tk_GetStyle_TCL_DECLARED +#define Tk_GetStyle_TCL_DECLARED +/* 254 */ +EXTERN Tk_Style Tk_GetStyle(Tcl_Interp *interp, CONST char *name); +#endif +#ifndef Tk_FreeStyle_TCL_DECLARED +#define Tk_FreeStyle_TCL_DECLARED +/* 255 */ +EXTERN void Tk_FreeStyle(Tk_Style style); +#endif +#ifndef Tk_NameOfStyle_TCL_DECLARED +#define Tk_NameOfStyle_TCL_DECLARED +/* 256 */ +EXTERN CONST char * Tk_NameOfStyle(Tk_Style style); +#endif +#ifndef Tk_AllocStyleFromObj_TCL_DECLARED +#define Tk_AllocStyleFromObj_TCL_DECLARED +/* 257 */ +EXTERN Tk_Style Tk_AllocStyleFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr); +#endif +#ifndef Tk_GetStyleFromObj_TCL_DECLARED +#define Tk_GetStyleFromObj_TCL_DECLARED +/* 258 */ +EXTERN Tk_Style Tk_GetStyleFromObj(Tcl_Obj *objPtr); +#endif +#ifndef Tk_FreeStyleFromObj_TCL_DECLARED +#define Tk_FreeStyleFromObj_TCL_DECLARED +/* 259 */ +EXTERN void Tk_FreeStyleFromObj(Tcl_Obj *objPtr); +#endif +#ifndef Tk_GetStyledElement_TCL_DECLARED +#define Tk_GetStyledElement_TCL_DECLARED +/* 260 */ +EXTERN Tk_StyledElement Tk_GetStyledElement(Tk_Style style, int elementId, + Tk_OptionTable optionTable); +#endif +#ifndef Tk_GetElementSize_TCL_DECLARED +#define Tk_GetElementSize_TCL_DECLARED +/* 261 */ +EXTERN void Tk_GetElementSize(Tk_Style style, + Tk_StyledElement element, char *recordPtr, + Tk_Window tkwin, int width, int height, + int inner, int *widthPtr, int *heightPtr); +#endif +#ifndef Tk_GetElementBox_TCL_DECLARED +#define Tk_GetElementBox_TCL_DECLARED +/* 262 */ +EXTERN void Tk_GetElementBox(Tk_Style style, + Tk_StyledElement element, char *recordPtr, + Tk_Window tkwin, int x, int y, int width, + int height, int inner, int *xPtr, int *yPtr, + int *widthPtr, int *heightPtr); +#endif +#ifndef Tk_GetElementBorderWidth_TCL_DECLARED +#define Tk_GetElementBorderWidth_TCL_DECLARED +/* 263 */ +EXTERN int Tk_GetElementBorderWidth(Tk_Style style, + Tk_StyledElement element, char *recordPtr, + Tk_Window tkwin); +#endif +#ifndef Tk_DrawElement_TCL_DECLARED +#define Tk_DrawElement_TCL_DECLARED +/* 264 */ +EXTERN void Tk_DrawElement(Tk_Style style, + Tk_StyledElement element, char *recordPtr, + Tk_Window tkwin, Drawable d, int x, int y, + int width, int height, int state); +#endif +#ifndef Tk_PhotoExpand_TCL_DECLARED +#define Tk_PhotoExpand_TCL_DECLARED +/* 265 */ +EXTERN int Tk_PhotoExpand(Tcl_Interp *interp, + Tk_PhotoHandle handle, int width, int height); +#endif +#ifndef Tk_PhotoPutBlock_TCL_DECLARED +#define Tk_PhotoPutBlock_TCL_DECLARED +/* 266 */ +EXTERN int Tk_PhotoPutBlock(Tcl_Interp *interp, + Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int compRule); +#endif +#ifndef Tk_PhotoPutZoomedBlock_TCL_DECLARED +#define Tk_PhotoPutZoomedBlock_TCL_DECLARED +/* 267 */ +EXTERN int Tk_PhotoPutZoomedBlock(Tcl_Interp *interp, + Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int zoomX, int zoomY, + int subsampleX, int subsampleY, int compRule); +#endif +#ifndef Tk_PhotoSetSize_TCL_DECLARED +#define Tk_PhotoSetSize_TCL_DECLARED +/* 268 */ +EXTERN int Tk_PhotoSetSize(Tcl_Interp *interp, + Tk_PhotoHandle handle, int width, int height); +#endif +#ifndef Tk_GetUserInactiveTime_TCL_DECLARED +#define Tk_GetUserInactiveTime_TCL_DECLARED +/* 269 */ +EXTERN long Tk_GetUserInactiveTime(Display *dpy); +#endif +#ifndef Tk_ResetUserInactiveTime_TCL_DECLARED +#define Tk_ResetUserInactiveTime_TCL_DECLARED +/* 270 */ +EXTERN void Tk_ResetUserInactiveTime(Display *dpy); +#endif +#ifndef Tk_Interp_TCL_DECLARED +#define Tk_Interp_TCL_DECLARED +/* 271 */ +EXTERN Tcl_Interp * Tk_Interp(Tk_Window tkwin); +#endif +#ifndef Tk_CreateOldImageType_TCL_DECLARED +#define Tk_CreateOldImageType_TCL_DECLARED +/* 272 */ +EXTERN void Tk_CreateOldImageType(Tk_ImageType *typePtr); +#endif +#ifndef Tk_CreateOldPhotoImageFormat_TCL_DECLARED +#define Tk_CreateOldPhotoImageFormat_TCL_DECLARED +/* 273 */ +EXTERN void Tk_CreateOldPhotoImageFormat( + Tk_PhotoImageFormat *formatPtr); +#endif +/* Slot 274 is reserved */ +#ifndef TkUnusedStubEntry_TCL_DECLARED +#define TkUnusedStubEntry_TCL_DECLARED +/* 275 */ +EXTERN void TkUnusedStubEntry(void); +#endif + +typedef struct TkStubHooks { + struct TkPlatStubs *tkPlatStubs; + struct TkIntStubs *tkIntStubs; + struct TkIntPlatStubs *tkIntPlatStubs; + struct TkIntXlibStubs *tkIntXlibStubs; +} TkStubHooks; + +typedef struct TkStubs { + int magic; + struct TkStubHooks *hooks; + + void (*tk_MainLoop) (void); /* 0 */ + XColor * (*tk_3DBorderColor) (Tk_3DBorder border); /* 1 */ + GC (*tk_3DBorderGC) (Tk_Window tkwin, Tk_3DBorder border, int which); /* 2 */ + void (*tk_3DHorizontalBevel) (Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height, int leftIn, int rightIn, int topBevel, int relief); /* 3 */ + void (*tk_3DVerticalBevel) (Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height, int leftBevel, int relief); /* 4 */ + void (*tk_AddOption) (Tk_Window tkwin, CONST char *name, CONST char *value, int priority); /* 5 */ + void (*tk_BindEvent) (Tk_BindingTable bindingTable, XEvent *eventPtr, Tk_Window tkwin, int numObjects, ClientData *objectPtr); /* 6 */ + void (*tk_CanvasDrawableCoords) (Tk_Canvas canvas, double x, double y, short *drawableXPtr, short *drawableYPtr); /* 7 */ + void (*tk_CanvasEventuallyRedraw) (Tk_Canvas canvas, int x1, int y1, int x2, int y2); /* 8 */ + int (*tk_CanvasGetCoord) (Tcl_Interp *interp, Tk_Canvas canvas, CONST char *str, double *doublePtr); /* 9 */ + Tk_CanvasTextInfo * (*tk_CanvasGetTextInfo) (Tk_Canvas canvas); /* 10 */ + int (*tk_CanvasPsBitmap) (Tcl_Interp *interp, Tk_Canvas canvas, Pixmap bitmap, int x, int y, int width, int height); /* 11 */ + int (*tk_CanvasPsColor) (Tcl_Interp *interp, Tk_Canvas canvas, XColor *colorPtr); /* 12 */ + int (*tk_CanvasPsFont) (Tcl_Interp *interp, Tk_Canvas canvas, Tk_Font font); /* 13 */ + void (*tk_CanvasPsPath) (Tcl_Interp *interp, Tk_Canvas canvas, double *coordPtr, int numPoints); /* 14 */ + int (*tk_CanvasPsStipple) (Tcl_Interp *interp, Tk_Canvas canvas, Pixmap bitmap); /* 15 */ + double (*tk_CanvasPsY) (Tk_Canvas canvas, double y); /* 16 */ + void (*tk_CanvasSetStippleOrigin) (Tk_Canvas canvas, GC gc); /* 17 */ + int (*tk_CanvasTagsParseProc) (ClientData clientData, Tcl_Interp *interp, Tk_Window tkwin, CONST char *value, char *widgRec, int offset); /* 18 */ + char * (*tk_CanvasTagsPrintProc) (ClientData clientData, Tk_Window tkwin, char *widgRec, int offset, Tcl_FreeProc **freeProcPtr); /* 19 */ + Tk_Window (*tk_CanvasTkwin) (Tk_Canvas canvas); /* 20 */ + void (*tk_CanvasWindowCoords) (Tk_Canvas canvas, double x, double y, short *screenXPtr, short *screenYPtr); /* 21 */ + void (*tk_ChangeWindowAttributes) (Tk_Window tkwin, unsigned long valueMask, XSetWindowAttributes *attsPtr); /* 22 */ + int (*tk_CharBbox) (Tk_TextLayout layout, int index, int *xPtr, int *yPtr, int *widthPtr, int *heightPtr); /* 23 */ + void (*tk_ClearSelection) (Tk_Window tkwin, Atom selection); /* 24 */ + int (*tk_ClipboardAppend) (Tcl_Interp *interp, Tk_Window tkwin, Atom target, Atom format, char *buffer); /* 25 */ + int (*tk_ClipboardClear) (Tcl_Interp *interp, Tk_Window tkwin); /* 26 */ + int (*tk_ConfigureInfo) (Tcl_Interp *interp, Tk_Window tkwin, Tk_ConfigSpec *specs, char *widgRec, CONST char *argvName, int flags); /* 27 */ + int (*tk_ConfigureValue) (Tcl_Interp *interp, Tk_Window tkwin, Tk_ConfigSpec *specs, char *widgRec, CONST char *argvName, int flags); /* 28 */ + int (*tk_ConfigureWidget) (Tcl_Interp *interp, Tk_Window tkwin, Tk_ConfigSpec *specs, int argc, CONST84 char **argv, char *widgRec, int flags); /* 29 */ + void (*tk_ConfigureWindow) (Tk_Window tkwin, unsigned int valueMask, XWindowChanges *valuePtr); /* 30 */ + Tk_TextLayout (*tk_ComputeTextLayout) (Tk_Font font, CONST char *str, int numChars, int wrapLength, Tk_Justify justify, int flags, int *widthPtr, int *heightPtr); /* 31 */ + Tk_Window (*tk_CoordsToWindow) (int rootX, int rootY, Tk_Window tkwin); /* 32 */ + unsigned long (*tk_CreateBinding) (Tcl_Interp *interp, Tk_BindingTable bindingTable, ClientData object, CONST char *eventStr, CONST char *command, int append); /* 33 */ + Tk_BindingTable (*tk_CreateBindingTable) (Tcl_Interp *interp); /* 34 */ + Tk_ErrorHandler (*tk_CreateErrorHandler) (Display *display, int errNum, int request, int minorCode, Tk_ErrorProc *errorProc, ClientData clientData); /* 35 */ + void (*tk_CreateEventHandler) (Tk_Window token, unsigned long mask, Tk_EventProc *proc, ClientData clientData); /* 36 */ + void (*tk_CreateGenericHandler) (Tk_GenericProc *proc, ClientData clientData); /* 37 */ + void (*tk_CreateImageType) (Tk_ImageType *typePtr); /* 38 */ + void (*tk_CreateItemType) (Tk_ItemType *typePtr); /* 39 */ + void (*tk_CreatePhotoImageFormat) (Tk_PhotoImageFormat *formatPtr); /* 40 */ + void (*tk_CreateSelHandler) (Tk_Window tkwin, Atom selection, Atom target, Tk_SelectionProc *proc, ClientData clientData, Atom format); /* 41 */ + Tk_Window (*tk_CreateWindow) (Tcl_Interp *interp, Tk_Window parent, CONST char *name, CONST char *screenName); /* 42 */ + Tk_Window (*tk_CreateWindowFromPath) (Tcl_Interp *interp, Tk_Window tkwin, CONST char *pathName, CONST char *screenName); /* 43 */ + int (*tk_DefineBitmap) (Tcl_Interp *interp, CONST char *name, CONST char *source, int width, int height); /* 44 */ + void (*tk_DefineCursor) (Tk_Window window, Tk_Cursor cursor); /* 45 */ + void (*tk_DeleteAllBindings) (Tk_BindingTable bindingTable, ClientData object); /* 46 */ + int (*tk_DeleteBinding) (Tcl_Interp *interp, Tk_BindingTable bindingTable, ClientData object, CONST char *eventStr); /* 47 */ + void (*tk_DeleteBindingTable) (Tk_BindingTable bindingTable); /* 48 */ + void (*tk_DeleteErrorHandler) (Tk_ErrorHandler handler); /* 49 */ + void (*tk_DeleteEventHandler) (Tk_Window token, unsigned long mask, Tk_EventProc *proc, ClientData clientData); /* 50 */ + void (*tk_DeleteGenericHandler) (Tk_GenericProc *proc, ClientData clientData); /* 51 */ + void (*tk_DeleteImage) (Tcl_Interp *interp, CONST char *name); /* 52 */ + void (*tk_DeleteSelHandler) (Tk_Window tkwin, Atom selection, Atom target); /* 53 */ + void (*tk_DestroyWindow) (Tk_Window tkwin); /* 54 */ + CONST84_RETURN char * (*tk_DisplayName) (Tk_Window tkwin); /* 55 */ + int (*tk_DistanceToTextLayout) (Tk_TextLayout layout, int x, int y); /* 56 */ + void (*tk_Draw3DPolygon) (Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, XPoint *pointPtr, int numPoints, int borderWidth, int leftRelief); /* 57 */ + void (*tk_Draw3DRectangle) (Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height, int borderWidth, int relief); /* 58 */ + void (*tk_DrawChars) (Display *display, Drawable drawable, GC gc, Tk_Font tkfont, CONST char *source, int numBytes, int x, int y); /* 59 */ + void (*tk_DrawFocusHighlight) (Tk_Window tkwin, GC gc, int width, Drawable drawable); /* 60 */ + void (*tk_DrawTextLayout) (Display *display, Drawable drawable, GC gc, Tk_TextLayout layout, int x, int y, int firstChar, int lastChar); /* 61 */ + void (*tk_Fill3DPolygon) (Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, XPoint *pointPtr, int numPoints, int borderWidth, int leftRelief); /* 62 */ + void (*tk_Fill3DRectangle) (Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height, int borderWidth, int relief); /* 63 */ + Tk_PhotoHandle (*tk_FindPhoto) (Tcl_Interp *interp, CONST char *imageName); /* 64 */ + Font (*tk_FontId) (Tk_Font font); /* 65 */ + void (*tk_Free3DBorder) (Tk_3DBorder border); /* 66 */ + void (*tk_FreeBitmap) (Display *display, Pixmap bitmap); /* 67 */ + void (*tk_FreeColor) (XColor *colorPtr); /* 68 */ + void (*tk_FreeColormap) (Display *display, Colormap colormap); /* 69 */ + void (*tk_FreeCursor) (Display *display, Tk_Cursor cursor); /* 70 */ + void (*tk_FreeFont) (Tk_Font f); /* 71 */ + void (*tk_FreeGC) (Display *display, GC gc); /* 72 */ + void (*tk_FreeImage) (Tk_Image image); /* 73 */ + void (*tk_FreeOptions) (Tk_ConfigSpec *specs, char *widgRec, Display *display, int needFlags); /* 74 */ + void (*tk_FreePixmap) (Display *display, Pixmap pixmap); /* 75 */ + void (*tk_FreeTextLayout) (Tk_TextLayout textLayout); /* 76 */ + void (*tk_FreeXId) (Display *display, XID xid); /* 77 */ + GC (*tk_GCForColor) (XColor *colorPtr, Drawable drawable); /* 78 */ + void (*tk_GeometryRequest) (Tk_Window tkwin, int reqWidth, int reqHeight); /* 79 */ + Tk_3DBorder (*tk_Get3DBorder) (Tcl_Interp *interp, Tk_Window tkwin, Tk_Uid colorName); /* 80 */ + void (*tk_GetAllBindings) (Tcl_Interp *interp, Tk_BindingTable bindingTable, ClientData object); /* 81 */ + int (*tk_GetAnchor) (Tcl_Interp *interp, CONST char *str, Tk_Anchor *anchorPtr); /* 82 */ + CONST84_RETURN char * (*tk_GetAtomName) (Tk_Window tkwin, Atom atom); /* 83 */ + CONST84_RETURN char * (*tk_GetBinding) (Tcl_Interp *interp, Tk_BindingTable bindingTable, ClientData object, CONST char *eventStr); /* 84 */ + Pixmap (*tk_GetBitmap) (Tcl_Interp *interp, Tk_Window tkwin, CONST char *str); /* 85 */ + Pixmap (*tk_GetBitmapFromData) (Tcl_Interp *interp, Tk_Window tkwin, CONST char *source, int width, int height); /* 86 */ + int (*tk_GetCapStyle) (Tcl_Interp *interp, CONST char *str, int *capPtr); /* 87 */ + XColor * (*tk_GetColor) (Tcl_Interp *interp, Tk_Window tkwin, Tk_Uid name); /* 88 */ + XColor * (*tk_GetColorByValue) (Tk_Window tkwin, XColor *colorPtr); /* 89 */ + Colormap (*tk_GetColormap) (Tcl_Interp *interp, Tk_Window tkwin, CONST char *str); /* 90 */ + Tk_Cursor (*tk_GetCursor) (Tcl_Interp *interp, Tk_Window tkwin, Tk_Uid str); /* 91 */ + Tk_Cursor (*tk_GetCursorFromData) (Tcl_Interp *interp, Tk_Window tkwin, CONST char *source, CONST char *mask, int width, int height, int xHot, int yHot, Tk_Uid fg, Tk_Uid bg); /* 92 */ + Tk_Font (*tk_GetFont) (Tcl_Interp *interp, Tk_Window tkwin, CONST char *str); /* 93 */ + Tk_Font (*tk_GetFontFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 94 */ + void (*tk_GetFontMetrics) (Tk_Font font, Tk_FontMetrics *fmPtr); /* 95 */ + GC (*tk_GetGC) (Tk_Window tkwin, unsigned long valueMask, XGCValues *valuePtr); /* 96 */ + Tk_Image (*tk_GetImage) (Tcl_Interp *interp, Tk_Window tkwin, CONST char *name, Tk_ImageChangedProc *changeProc, ClientData clientData); /* 97 */ + ClientData (*tk_GetImageMasterData) (Tcl_Interp *interp, CONST char *name, Tk_ImageType **typePtrPtr); /* 98 */ + Tk_ItemType * (*tk_GetItemTypes) (void); /* 99 */ + int (*tk_GetJoinStyle) (Tcl_Interp *interp, CONST char *str, int *joinPtr); /* 100 */ + int (*tk_GetJustify) (Tcl_Interp *interp, CONST char *str, Tk_Justify *justifyPtr); /* 101 */ + int (*tk_GetNumMainWindows) (void); /* 102 */ + Tk_Uid (*tk_GetOption) (Tk_Window tkwin, CONST char *name, CONST char *className); /* 103 */ + int (*tk_GetPixels) (Tcl_Interp *interp, Tk_Window tkwin, CONST char *str, int *intPtr); /* 104 */ + Pixmap (*tk_GetPixmap) (Display *display, Drawable d, int width, int height, int depth); /* 105 */ + int (*tk_GetRelief) (Tcl_Interp *interp, CONST char *name, int *reliefPtr); /* 106 */ + void (*tk_GetRootCoords) (Tk_Window tkwin, int *xPtr, int *yPtr); /* 107 */ + int (*tk_GetScrollInfo) (Tcl_Interp *interp, int argc, CONST84 char **argv, double *dblPtr, int *intPtr); /* 108 */ + int (*tk_GetScreenMM) (Tcl_Interp *interp, Tk_Window tkwin, CONST char *str, double *doublePtr); /* 109 */ + int (*tk_GetSelection) (Tcl_Interp *interp, Tk_Window tkwin, Atom selection, Atom target, Tk_GetSelProc *proc, ClientData clientData); /* 110 */ + Tk_Uid (*tk_GetUid) (CONST char *str); /* 111 */ + Visual * (*tk_GetVisual) (Tcl_Interp *interp, Tk_Window tkwin, CONST char *str, int *depthPtr, Colormap *colormapPtr); /* 112 */ + void (*tk_GetVRootGeometry) (Tk_Window tkwin, int *xPtr, int *yPtr, int *widthPtr, int *heightPtr); /* 113 */ + int (*tk_Grab) (Tcl_Interp *interp, Tk_Window tkwin, int grabGlobal); /* 114 */ + void (*tk_HandleEvent) (XEvent *eventPtr); /* 115 */ + Tk_Window (*tk_IdToWindow) (Display *display, Window window); /* 116 */ + void (*tk_ImageChanged) (Tk_ImageMaster master, int x, int y, int width, int height, int imageWidth, int imageHeight); /* 117 */ + int (*tk_Init) (Tcl_Interp *interp); /* 118 */ + Atom (*tk_InternAtom) (Tk_Window tkwin, CONST char *name); /* 119 */ + int (*tk_IntersectTextLayout) (Tk_TextLayout layout, int x, int y, int width, int height); /* 120 */ + void (*tk_MaintainGeometry) (Tk_Window slave, Tk_Window master, int x, int y, int width, int height); /* 121 */ + Tk_Window (*tk_MainWindow) (Tcl_Interp *interp); /* 122 */ + void (*tk_MakeWindowExist) (Tk_Window tkwin); /* 123 */ + void (*tk_ManageGeometry) (Tk_Window tkwin, CONST Tk_GeomMgr *mgrPtr, ClientData clientData); /* 124 */ + void (*tk_MapWindow) (Tk_Window tkwin); /* 125 */ + int (*tk_MeasureChars) (Tk_Font tkfont, CONST char *source, int numBytes, int maxPixels, int flags, int *lengthPtr); /* 126 */ + void (*tk_MoveResizeWindow) (Tk_Window tkwin, int x, int y, int width, int height); /* 127 */ + void (*tk_MoveWindow) (Tk_Window tkwin, int x, int y); /* 128 */ + void (*tk_MoveToplevelWindow) (Tk_Window tkwin, int x, int y); /* 129 */ + CONST84_RETURN char * (*tk_NameOf3DBorder) (Tk_3DBorder border); /* 130 */ + CONST84_RETURN char * (*tk_NameOfAnchor) (Tk_Anchor anchor); /* 131 */ + CONST84_RETURN char * (*tk_NameOfBitmap) (Display *display, Pixmap bitmap); /* 132 */ + CONST84_RETURN char * (*tk_NameOfCapStyle) (int cap); /* 133 */ + CONST84_RETURN char * (*tk_NameOfColor) (XColor *colorPtr); /* 134 */ + CONST84_RETURN char * (*tk_NameOfCursor) (Display *display, Tk_Cursor cursor); /* 135 */ + CONST84_RETURN char * (*tk_NameOfFont) (Tk_Font font); /* 136 */ + CONST84_RETURN char * (*tk_NameOfImage) (Tk_ImageMaster imageMaster); /* 137 */ + CONST84_RETURN char * (*tk_NameOfJoinStyle) (int join); /* 138 */ + CONST84_RETURN char * (*tk_NameOfJustify) (Tk_Justify justify); /* 139 */ + CONST84_RETURN char * (*tk_NameOfRelief) (int relief); /* 140 */ + Tk_Window (*tk_NameToWindow) (Tcl_Interp *interp, CONST char *pathName, Tk_Window tkwin); /* 141 */ + void (*tk_OwnSelection) (Tk_Window tkwin, Atom selection, Tk_LostSelProc *proc, ClientData clientData); /* 142 */ + int (*tk_ParseArgv) (Tcl_Interp *interp, Tk_Window tkwin, int *argcPtr, CONST84 char **argv, Tk_ArgvInfo *argTable, int flags); /* 143 */ + void (*tk_PhotoPutBlock_NoComposite) (Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height); /* 144 */ + void (*tk_PhotoPutZoomedBlock_NoComposite) (Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY); /* 145 */ + int (*tk_PhotoGetImage) (Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr); /* 146 */ + void (*tk_PhotoBlank) (Tk_PhotoHandle handle); /* 147 */ + void (*tk_PhotoExpand_Panic) (Tk_PhotoHandle handle, int width, int height); /* 148 */ + void (*tk_PhotoGetSize) (Tk_PhotoHandle handle, int *widthPtr, int *heightPtr); /* 149 */ + void (*tk_PhotoSetSize_Panic) (Tk_PhotoHandle handle, int width, int height); /* 150 */ + int (*tk_PointToChar) (Tk_TextLayout layout, int x, int y); /* 151 */ + int (*tk_PostscriptFontName) (Tk_Font tkfont, Tcl_DString *dsPtr); /* 152 */ + void (*tk_PreserveColormap) (Display *display, Colormap colormap); /* 153 */ + void (*tk_QueueWindowEvent) (XEvent *eventPtr, Tcl_QueuePosition position); /* 154 */ + void (*tk_RedrawImage) (Tk_Image image, int imageX, int imageY, int width, int height, Drawable drawable, int drawableX, int drawableY); /* 155 */ + void (*tk_ResizeWindow) (Tk_Window tkwin, int width, int height); /* 156 */ + int (*tk_RestackWindow) (Tk_Window tkwin, int aboveBelow, Tk_Window other); /* 157 */ + Tk_RestrictProc * (*tk_RestrictEvents) (Tk_RestrictProc *proc, ClientData arg, ClientData *prevArgPtr); /* 158 */ + int (*tk_SafeInit) (Tcl_Interp *interp); /* 159 */ + CONST char * (*tk_SetAppName) (Tk_Window tkwin, CONST char *name); /* 160 */ + void (*tk_SetBackgroundFromBorder) (Tk_Window tkwin, Tk_3DBorder border); /* 161 */ + void (*tk_SetClass) (Tk_Window tkwin, CONST char *className); /* 162 */ + void (*tk_SetGrid) (Tk_Window tkwin, int reqWidth, int reqHeight, int gridWidth, int gridHeight); /* 163 */ + void (*tk_SetInternalBorder) (Tk_Window tkwin, int width); /* 164 */ + void (*tk_SetWindowBackground) (Tk_Window tkwin, unsigned long pixel); /* 165 */ + void (*tk_SetWindowBackgroundPixmap) (Tk_Window tkwin, Pixmap pixmap); /* 166 */ + void (*tk_SetWindowBorder) (Tk_Window tkwin, unsigned long pixel); /* 167 */ + void (*tk_SetWindowBorderWidth) (Tk_Window tkwin, int width); /* 168 */ + void (*tk_SetWindowBorderPixmap) (Tk_Window tkwin, Pixmap pixmap); /* 169 */ + void (*tk_SetWindowColormap) (Tk_Window tkwin, Colormap colormap); /* 170 */ + int (*tk_SetWindowVisual) (Tk_Window tkwin, Visual *visual, int depth, Colormap colormap); /* 171 */ + void (*tk_SizeOfBitmap) (Display *display, Pixmap bitmap, int *widthPtr, int *heightPtr); /* 172 */ + void (*tk_SizeOfImage) (Tk_Image image, int *widthPtr, int *heightPtr); /* 173 */ + int (*tk_StrictMotif) (Tk_Window tkwin); /* 174 */ + void (*tk_TextLayoutToPostscript) (Tcl_Interp *interp, Tk_TextLayout layout); /* 175 */ + int (*tk_TextWidth) (Tk_Font font, CONST char *str, int numBytes); /* 176 */ + void (*tk_UndefineCursor) (Tk_Window window); /* 177 */ + void (*tk_UnderlineChars) (Display *display, Drawable drawable, GC gc, Tk_Font tkfont, CONST char *source, int x, int y, int firstByte, int lastByte); /* 178 */ + void (*tk_UnderlineTextLayout) (Display *display, Drawable drawable, GC gc, Tk_TextLayout layout, int x, int y, int underline); /* 179 */ + void (*tk_Ungrab) (Tk_Window tkwin); /* 180 */ + void (*tk_UnmaintainGeometry) (Tk_Window slave, Tk_Window master); /* 181 */ + void (*tk_UnmapWindow) (Tk_Window tkwin); /* 182 */ + void (*tk_UnsetGrid) (Tk_Window tkwin); /* 183 */ + void (*tk_UpdatePointer) (Tk_Window tkwin, int x, int y, int state); /* 184 */ + Pixmap (*tk_AllocBitmapFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr); /* 185 */ + Tk_3DBorder (*tk_Alloc3DBorderFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr); /* 186 */ + XColor * (*tk_AllocColorFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr); /* 187 */ + Tk_Cursor (*tk_AllocCursorFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr); /* 188 */ + Tk_Font (*tk_AllocFontFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr); /* 189 */ + Tk_OptionTable (*tk_CreateOptionTable) (Tcl_Interp *interp, CONST Tk_OptionSpec *templatePtr); /* 190 */ + void (*tk_DeleteOptionTable) (Tk_OptionTable optionTable); /* 191 */ + void (*tk_Free3DBorderFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 192 */ + void (*tk_FreeBitmapFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 193 */ + void (*tk_FreeColorFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 194 */ + void (*tk_FreeConfigOptions) (char *recordPtr, Tk_OptionTable optionToken, Tk_Window tkwin); /* 195 */ + void (*tk_FreeSavedOptions) (Tk_SavedOptions *savePtr); /* 196 */ + void (*tk_FreeCursorFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 197 */ + void (*tk_FreeFontFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 198 */ + Tk_3DBorder (*tk_Get3DBorderFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 199 */ + int (*tk_GetAnchorFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, Tk_Anchor *anchorPtr); /* 200 */ + Pixmap (*tk_GetBitmapFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 201 */ + XColor * (*tk_GetColorFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 202 */ + Tk_Cursor (*tk_GetCursorFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 203 */ + Tcl_Obj * (*tk_GetOptionInfo) (Tcl_Interp *interp, char *recordPtr, Tk_OptionTable optionTable, Tcl_Obj *namePtr, Tk_Window tkwin); /* 204 */ + Tcl_Obj * (*tk_GetOptionValue) (Tcl_Interp *interp, char *recordPtr, Tk_OptionTable optionTable, Tcl_Obj *namePtr, Tk_Window tkwin); /* 205 */ + int (*tk_GetJustifyFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, Tk_Justify *justifyPtr); /* 206 */ + int (*tk_GetMMFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr, double *doublePtr); /* 207 */ + int (*tk_GetPixelsFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr, int *intPtr); /* 208 */ + int (*tk_GetReliefFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int *resultPtr); /* 209 */ + int (*tk_GetScrollInfoObj) (Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], double *dblPtr, int *intPtr); /* 210 */ + int (*tk_InitOptions) (Tcl_Interp *interp, char *recordPtr, Tk_OptionTable optionToken, Tk_Window tkwin); /* 211 */ + void (*tk_MainEx) (int argc, char **argv, Tcl_AppInitProc *appInitProc, Tcl_Interp *interp); /* 212 */ + void (*tk_RestoreSavedOptions) (Tk_SavedOptions *savePtr); /* 213 */ + int (*tk_SetOptions) (Tcl_Interp *interp, char *recordPtr, Tk_OptionTable optionTable, int objc, Tcl_Obj *CONST objv[], Tk_Window tkwin, Tk_SavedOptions *savePtr, int *maskPtr); /* 214 */ + void (*tk_InitConsoleChannels) (Tcl_Interp *interp); /* 215 */ + int (*tk_CreateConsoleWindow) (Tcl_Interp *interp); /* 216 */ + void (*tk_CreateSmoothMethod) (Tcl_Interp *interp, Tk_SmoothMethod *method); /* 217 */ + VOID *reserved218; + VOID *reserved219; + int (*tk_GetDash) (Tcl_Interp *interp, CONST char *value, Tk_Dash *dash); /* 220 */ + void (*tk_CreateOutline) (Tk_Outline *outline); /* 221 */ + void (*tk_DeleteOutline) (Display *display, Tk_Outline *outline); /* 222 */ + int (*tk_ConfigOutlineGC) (XGCValues *gcValues, Tk_Canvas canvas, Tk_Item *item, Tk_Outline *outline); /* 223 */ + int (*tk_ChangeOutlineGC) (Tk_Canvas canvas, Tk_Item *item, Tk_Outline *outline); /* 224 */ + int (*tk_ResetOutlineGC) (Tk_Canvas canvas, Tk_Item *item, Tk_Outline *outline); /* 225 */ + int (*tk_CanvasPsOutline) (Tk_Canvas canvas, Tk_Item *item, Tk_Outline *outline); /* 226 */ + void (*tk_SetTSOrigin) (Tk_Window tkwin, GC gc, int x, int y); /* 227 */ + int (*tk_CanvasGetCoordFromObj) (Tcl_Interp *interp, Tk_Canvas canvas, Tcl_Obj *obj, double *doublePtr); /* 228 */ + void (*tk_CanvasSetOffset) (Tk_Canvas canvas, GC gc, Tk_TSOffset *offset); /* 229 */ + void (*tk_DitherPhoto) (Tk_PhotoHandle handle, int x, int y, int width, int height); /* 230 */ + int (*tk_PostscriptBitmap) (Tcl_Interp *interp, Tk_Window tkwin, Tk_PostscriptInfo psInfo, Pixmap bitmap, int startX, int startY, int width, int height); /* 231 */ + int (*tk_PostscriptColor) (Tcl_Interp *interp, Tk_PostscriptInfo psInfo, XColor *colorPtr); /* 232 */ + int (*tk_PostscriptFont) (Tcl_Interp *interp, Tk_PostscriptInfo psInfo, Tk_Font font); /* 233 */ + int (*tk_PostscriptImage) (Tk_Image image, Tcl_Interp *interp, Tk_Window tkwin, Tk_PostscriptInfo psinfo, int x, int y, int width, int height, int prepass); /* 234 */ + void (*tk_PostscriptPath) (Tcl_Interp *interp, Tk_PostscriptInfo psInfo, double *coordPtr, int numPoints); /* 235 */ + int (*tk_PostscriptStipple) (Tcl_Interp *interp, Tk_Window tkwin, Tk_PostscriptInfo psInfo, Pixmap bitmap); /* 236 */ + double (*tk_PostscriptY) (double y, Tk_PostscriptInfo psInfo); /* 237 */ + int (*tk_PostscriptPhoto) (Tcl_Interp *interp, Tk_PhotoImageBlock *blockPtr, Tk_PostscriptInfo psInfo, int width, int height); /* 238 */ + void (*tk_CreateClientMessageHandler) (Tk_ClientMessageProc *proc); /* 239 */ + void (*tk_DeleteClientMessageHandler) (Tk_ClientMessageProc *proc); /* 240 */ + Tk_Window (*tk_CreateAnonymousWindow) (Tcl_Interp *interp, Tk_Window parent, CONST char *screenName); /* 241 */ + void (*tk_SetClassProcs) (Tk_Window tkwin, Tk_ClassProcs *procs, ClientData instanceData); /* 242 */ + void (*tk_SetInternalBorderEx) (Tk_Window tkwin, int left, int right, int top, int bottom); /* 243 */ + void (*tk_SetMinimumRequestSize) (Tk_Window tkwin, int minWidth, int minHeight); /* 244 */ + void (*tk_SetCaretPos) (Tk_Window tkwin, int x, int y, int height); /* 245 */ + void (*tk_PhotoPutBlock_Panic) (Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int compRule); /* 246 */ + void (*tk_PhotoPutZoomedBlock_Panic) (Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY, int compRule); /* 247 */ + int (*tk_CollapseMotionEvents) (Display *display, int collapse); /* 248 */ + Tk_StyleEngine (*tk_RegisterStyleEngine) (CONST char *name, Tk_StyleEngine parent); /* 249 */ + Tk_StyleEngine (*tk_GetStyleEngine) (CONST char *name); /* 250 */ + int (*tk_RegisterStyledElement) (Tk_StyleEngine engine, Tk_ElementSpec *templatePtr); /* 251 */ + int (*tk_GetElementId) (CONST char *name); /* 252 */ + Tk_Style (*tk_CreateStyle) (CONST char *name, Tk_StyleEngine engine, ClientData clientData); /* 253 */ + Tk_Style (*tk_GetStyle) (Tcl_Interp *interp, CONST char *name); /* 254 */ + void (*tk_FreeStyle) (Tk_Style style); /* 255 */ + CONST char * (*tk_NameOfStyle) (Tk_Style style); /* 256 */ + Tk_Style (*tk_AllocStyleFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr); /* 257 */ + Tk_Style (*tk_GetStyleFromObj) (Tcl_Obj *objPtr); /* 258 */ + void (*tk_FreeStyleFromObj) (Tcl_Obj *objPtr); /* 259 */ + Tk_StyledElement (*tk_GetStyledElement) (Tk_Style style, int elementId, Tk_OptionTable optionTable); /* 260 */ + void (*tk_GetElementSize) (Tk_Style style, Tk_StyledElement element, char *recordPtr, Tk_Window tkwin, int width, int height, int inner, int *widthPtr, int *heightPtr); /* 261 */ + void (*tk_GetElementBox) (Tk_Style style, Tk_StyledElement element, char *recordPtr, Tk_Window tkwin, int x, int y, int width, int height, int inner, int *xPtr, int *yPtr, int *widthPtr, int *heightPtr); /* 262 */ + int (*tk_GetElementBorderWidth) (Tk_Style style, Tk_StyledElement element, char *recordPtr, Tk_Window tkwin); /* 263 */ + void (*tk_DrawElement) (Tk_Style style, Tk_StyledElement element, char *recordPtr, Tk_Window tkwin, Drawable d, int x, int y, int width, int height, int state); /* 264 */ + int (*tk_PhotoExpand) (Tcl_Interp *interp, Tk_PhotoHandle handle, int width, int height); /* 265 */ + int (*tk_PhotoPutBlock) (Tcl_Interp *interp, Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int compRule); /* 266 */ + int (*tk_PhotoPutZoomedBlock) (Tcl_Interp *interp, Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY, int compRule); /* 267 */ + int (*tk_PhotoSetSize) (Tcl_Interp *interp, Tk_PhotoHandle handle, int width, int height); /* 268 */ + long (*tk_GetUserInactiveTime) (Display *dpy); /* 269 */ + void (*tk_ResetUserInactiveTime) (Display *dpy); /* 270 */ + Tcl_Interp * (*tk_Interp) (Tk_Window tkwin); /* 271 */ + void (*tk_CreateOldImageType) (Tk_ImageType *typePtr); /* 272 */ + void (*tk_CreateOldPhotoImageFormat) (Tk_PhotoImageFormat *formatPtr); /* 273 */ + VOID *reserved274; + void (*tkUnusedStubEntry) (void); /* 275 */ +} TkStubs; + +extern TkStubs *tkStubsPtr; + +#ifdef __cplusplus +} +#endif + +#if defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) + +/* + * Inline function declarations: + */ + +#ifndef Tk_MainLoop +#define Tk_MainLoop \ + (tkStubsPtr->tk_MainLoop) /* 0 */ +#endif +#ifndef Tk_3DBorderColor +#define Tk_3DBorderColor \ + (tkStubsPtr->tk_3DBorderColor) /* 1 */ +#endif +#ifndef Tk_3DBorderGC +#define Tk_3DBorderGC \ + (tkStubsPtr->tk_3DBorderGC) /* 2 */ +#endif +#ifndef Tk_3DHorizontalBevel +#define Tk_3DHorizontalBevel \ + (tkStubsPtr->tk_3DHorizontalBevel) /* 3 */ +#endif +#ifndef Tk_3DVerticalBevel +#define Tk_3DVerticalBevel \ + (tkStubsPtr->tk_3DVerticalBevel) /* 4 */ +#endif +#ifndef Tk_AddOption +#define Tk_AddOption \ + (tkStubsPtr->tk_AddOption) /* 5 */ +#endif +#ifndef Tk_BindEvent +#define Tk_BindEvent \ + (tkStubsPtr->tk_BindEvent) /* 6 */ +#endif +#ifndef Tk_CanvasDrawableCoords +#define Tk_CanvasDrawableCoords \ + (tkStubsPtr->tk_CanvasDrawableCoords) /* 7 */ +#endif +#ifndef Tk_CanvasEventuallyRedraw +#define Tk_CanvasEventuallyRedraw \ + (tkStubsPtr->tk_CanvasEventuallyRedraw) /* 8 */ +#endif +#ifndef Tk_CanvasGetCoord +#define Tk_CanvasGetCoord \ + (tkStubsPtr->tk_CanvasGetCoord) /* 9 */ +#endif +#ifndef Tk_CanvasGetTextInfo +#define Tk_CanvasGetTextInfo \ + (tkStubsPtr->tk_CanvasGetTextInfo) /* 10 */ +#endif +#ifndef Tk_CanvasPsBitmap +#define Tk_CanvasPsBitmap \ + (tkStubsPtr->tk_CanvasPsBitmap) /* 11 */ +#endif +#ifndef Tk_CanvasPsColor +#define Tk_CanvasPsColor \ + (tkStubsPtr->tk_CanvasPsColor) /* 12 */ +#endif +#ifndef Tk_CanvasPsFont +#define Tk_CanvasPsFont \ + (tkStubsPtr->tk_CanvasPsFont) /* 13 */ +#endif +#ifndef Tk_CanvasPsPath +#define Tk_CanvasPsPath \ + (tkStubsPtr->tk_CanvasPsPath) /* 14 */ +#endif +#ifndef Tk_CanvasPsStipple +#define Tk_CanvasPsStipple \ + (tkStubsPtr->tk_CanvasPsStipple) /* 15 */ +#endif +#ifndef Tk_CanvasPsY +#define Tk_CanvasPsY \ + (tkStubsPtr->tk_CanvasPsY) /* 16 */ +#endif +#ifndef Tk_CanvasSetStippleOrigin +#define Tk_CanvasSetStippleOrigin \ + (tkStubsPtr->tk_CanvasSetStippleOrigin) /* 17 */ +#endif +#ifndef Tk_CanvasTagsParseProc +#define Tk_CanvasTagsParseProc \ + (tkStubsPtr->tk_CanvasTagsParseProc) /* 18 */ +#endif +#ifndef Tk_CanvasTagsPrintProc +#define Tk_CanvasTagsPrintProc \ + (tkStubsPtr->tk_CanvasTagsPrintProc) /* 19 */ +#endif +#ifndef Tk_CanvasTkwin +#define Tk_CanvasTkwin \ + (tkStubsPtr->tk_CanvasTkwin) /* 20 */ +#endif +#ifndef Tk_CanvasWindowCoords +#define Tk_CanvasWindowCoords \ + (tkStubsPtr->tk_CanvasWindowCoords) /* 21 */ +#endif +#ifndef Tk_ChangeWindowAttributes +#define Tk_ChangeWindowAttributes \ + (tkStubsPtr->tk_ChangeWindowAttributes) /* 22 */ +#endif +#ifndef Tk_CharBbox +#define Tk_CharBbox \ + (tkStubsPtr->tk_CharBbox) /* 23 */ +#endif +#ifndef Tk_ClearSelection +#define Tk_ClearSelection \ + (tkStubsPtr->tk_ClearSelection) /* 24 */ +#endif +#ifndef Tk_ClipboardAppend +#define Tk_ClipboardAppend \ + (tkStubsPtr->tk_ClipboardAppend) /* 25 */ +#endif +#ifndef Tk_ClipboardClear +#define Tk_ClipboardClear \ + (tkStubsPtr->tk_ClipboardClear) /* 26 */ +#endif +#ifndef Tk_ConfigureInfo +#define Tk_ConfigureInfo \ + (tkStubsPtr->tk_ConfigureInfo) /* 27 */ +#endif +#ifndef Tk_ConfigureValue +#define Tk_ConfigureValue \ + (tkStubsPtr->tk_ConfigureValue) /* 28 */ +#endif +#ifndef Tk_ConfigureWidget +#define Tk_ConfigureWidget \ + (tkStubsPtr->tk_ConfigureWidget) /* 29 */ +#endif +#ifndef Tk_ConfigureWindow +#define Tk_ConfigureWindow \ + (tkStubsPtr->tk_ConfigureWindow) /* 30 */ +#endif +#ifndef Tk_ComputeTextLayout +#define Tk_ComputeTextLayout \ + (tkStubsPtr->tk_ComputeTextLayout) /* 31 */ +#endif +#ifndef Tk_CoordsToWindow +#define Tk_CoordsToWindow \ + (tkStubsPtr->tk_CoordsToWindow) /* 32 */ +#endif +#ifndef Tk_CreateBinding +#define Tk_CreateBinding \ + (tkStubsPtr->tk_CreateBinding) /* 33 */ +#endif +#ifndef Tk_CreateBindingTable +#define Tk_CreateBindingTable \ + (tkStubsPtr->tk_CreateBindingTable) /* 34 */ +#endif +#ifndef Tk_CreateErrorHandler +#define Tk_CreateErrorHandler \ + (tkStubsPtr->tk_CreateErrorHandler) /* 35 */ +#endif +#ifndef Tk_CreateEventHandler +#define Tk_CreateEventHandler \ + (tkStubsPtr->tk_CreateEventHandler) /* 36 */ +#endif +#ifndef Tk_CreateGenericHandler +#define Tk_CreateGenericHandler \ + (tkStubsPtr->tk_CreateGenericHandler) /* 37 */ +#endif +#ifndef Tk_CreateImageType +#define Tk_CreateImageType \ + (tkStubsPtr->tk_CreateImageType) /* 38 */ +#endif +#ifndef Tk_CreateItemType +#define Tk_CreateItemType \ + (tkStubsPtr->tk_CreateItemType) /* 39 */ +#endif +#ifndef Tk_CreatePhotoImageFormat +#define Tk_CreatePhotoImageFormat \ + (tkStubsPtr->tk_CreatePhotoImageFormat) /* 40 */ +#endif +#ifndef Tk_CreateSelHandler +#define Tk_CreateSelHandler \ + (tkStubsPtr->tk_CreateSelHandler) /* 41 */ +#endif +#ifndef Tk_CreateWindow +#define Tk_CreateWindow \ + (tkStubsPtr->tk_CreateWindow) /* 42 */ +#endif +#ifndef Tk_CreateWindowFromPath +#define Tk_CreateWindowFromPath \ + (tkStubsPtr->tk_CreateWindowFromPath) /* 43 */ +#endif +#ifndef Tk_DefineBitmap +#define Tk_DefineBitmap \ + (tkStubsPtr->tk_DefineBitmap) /* 44 */ +#endif +#ifndef Tk_DefineCursor +#define Tk_DefineCursor \ + (tkStubsPtr->tk_DefineCursor) /* 45 */ +#endif +#ifndef Tk_DeleteAllBindings +#define Tk_DeleteAllBindings \ + (tkStubsPtr->tk_DeleteAllBindings) /* 46 */ +#endif +#ifndef Tk_DeleteBinding +#define Tk_DeleteBinding \ + (tkStubsPtr->tk_DeleteBinding) /* 47 */ +#endif +#ifndef Tk_DeleteBindingTable +#define Tk_DeleteBindingTable \ + (tkStubsPtr->tk_DeleteBindingTable) /* 48 */ +#endif +#ifndef Tk_DeleteErrorHandler +#define Tk_DeleteErrorHandler \ + (tkStubsPtr->tk_DeleteErrorHandler) /* 49 */ +#endif +#ifndef Tk_DeleteEventHandler +#define Tk_DeleteEventHandler \ + (tkStubsPtr->tk_DeleteEventHandler) /* 50 */ +#endif +#ifndef Tk_DeleteGenericHandler +#define Tk_DeleteGenericHandler \ + (tkStubsPtr->tk_DeleteGenericHandler) /* 51 */ +#endif +#ifndef Tk_DeleteImage +#define Tk_DeleteImage \ + (tkStubsPtr->tk_DeleteImage) /* 52 */ +#endif +#ifndef Tk_DeleteSelHandler +#define Tk_DeleteSelHandler \ + (tkStubsPtr->tk_DeleteSelHandler) /* 53 */ +#endif +#ifndef Tk_DestroyWindow +#define Tk_DestroyWindow \ + (tkStubsPtr->tk_DestroyWindow) /* 54 */ +#endif +#ifndef Tk_DisplayName +#define Tk_DisplayName \ + (tkStubsPtr->tk_DisplayName) /* 55 */ +#endif +#ifndef Tk_DistanceToTextLayout +#define Tk_DistanceToTextLayout \ + (tkStubsPtr->tk_DistanceToTextLayout) /* 56 */ +#endif +#ifndef Tk_Draw3DPolygon +#define Tk_Draw3DPolygon \ + (tkStubsPtr->tk_Draw3DPolygon) /* 57 */ +#endif +#ifndef Tk_Draw3DRectangle +#define Tk_Draw3DRectangle \ + (tkStubsPtr->tk_Draw3DRectangle) /* 58 */ +#endif +#ifndef Tk_DrawChars +#define Tk_DrawChars \ + (tkStubsPtr->tk_DrawChars) /* 59 */ +#endif +#ifndef Tk_DrawFocusHighlight +#define Tk_DrawFocusHighlight \ + (tkStubsPtr->tk_DrawFocusHighlight) /* 60 */ +#endif +#ifndef Tk_DrawTextLayout +#define Tk_DrawTextLayout \ + (tkStubsPtr->tk_DrawTextLayout) /* 61 */ +#endif +#ifndef Tk_Fill3DPolygon +#define Tk_Fill3DPolygon \ + (tkStubsPtr->tk_Fill3DPolygon) /* 62 */ +#endif +#ifndef Tk_Fill3DRectangle +#define Tk_Fill3DRectangle \ + (tkStubsPtr->tk_Fill3DRectangle) /* 63 */ +#endif +#ifndef Tk_FindPhoto +#define Tk_FindPhoto \ + (tkStubsPtr->tk_FindPhoto) /* 64 */ +#endif +#ifndef Tk_FontId +#define Tk_FontId \ + (tkStubsPtr->tk_FontId) /* 65 */ +#endif +#ifndef Tk_Free3DBorder +#define Tk_Free3DBorder \ + (tkStubsPtr->tk_Free3DBorder) /* 66 */ +#endif +#ifndef Tk_FreeBitmap +#define Tk_FreeBitmap \ + (tkStubsPtr->tk_FreeBitmap) /* 67 */ +#endif +#ifndef Tk_FreeColor +#define Tk_FreeColor \ + (tkStubsPtr->tk_FreeColor) /* 68 */ +#endif +#ifndef Tk_FreeColormap +#define Tk_FreeColormap \ + (tkStubsPtr->tk_FreeColormap) /* 69 */ +#endif +#ifndef Tk_FreeCursor +#define Tk_FreeCursor \ + (tkStubsPtr->tk_FreeCursor) /* 70 */ +#endif +#ifndef Tk_FreeFont +#define Tk_FreeFont \ + (tkStubsPtr->tk_FreeFont) /* 71 */ +#endif +#ifndef Tk_FreeGC +#define Tk_FreeGC \ + (tkStubsPtr->tk_FreeGC) /* 72 */ +#endif +#ifndef Tk_FreeImage +#define Tk_FreeImage \ + (tkStubsPtr->tk_FreeImage) /* 73 */ +#endif +#ifndef Tk_FreeOptions +#define Tk_FreeOptions \ + (tkStubsPtr->tk_FreeOptions) /* 74 */ +#endif +#ifndef Tk_FreePixmap +#define Tk_FreePixmap \ + (tkStubsPtr->tk_FreePixmap) /* 75 */ +#endif +#ifndef Tk_FreeTextLayout +#define Tk_FreeTextLayout \ + (tkStubsPtr->tk_FreeTextLayout) /* 76 */ +#endif +#ifndef Tk_FreeXId +#define Tk_FreeXId \ + (tkStubsPtr->tk_FreeXId) /* 77 */ +#endif +#ifndef Tk_GCForColor +#define Tk_GCForColor \ + (tkStubsPtr->tk_GCForColor) /* 78 */ +#endif +#ifndef Tk_GeometryRequest +#define Tk_GeometryRequest \ + (tkStubsPtr->tk_GeometryRequest) /* 79 */ +#endif +#ifndef Tk_Get3DBorder +#define Tk_Get3DBorder \ + (tkStubsPtr->tk_Get3DBorder) /* 80 */ +#endif +#ifndef Tk_GetAllBindings +#define Tk_GetAllBindings \ + (tkStubsPtr->tk_GetAllBindings) /* 81 */ +#endif +#ifndef Tk_GetAnchor +#define Tk_GetAnchor \ + (tkStubsPtr->tk_GetAnchor) /* 82 */ +#endif +#ifndef Tk_GetAtomName +#define Tk_GetAtomName \ + (tkStubsPtr->tk_GetAtomName) /* 83 */ +#endif +#ifndef Tk_GetBinding +#define Tk_GetBinding \ + (tkStubsPtr->tk_GetBinding) /* 84 */ +#endif +#ifndef Tk_GetBitmap +#define Tk_GetBitmap \ + (tkStubsPtr->tk_GetBitmap) /* 85 */ +#endif +#ifndef Tk_GetBitmapFromData +#define Tk_GetBitmapFromData \ + (tkStubsPtr->tk_GetBitmapFromData) /* 86 */ +#endif +#ifndef Tk_GetCapStyle +#define Tk_GetCapStyle \ + (tkStubsPtr->tk_GetCapStyle) /* 87 */ +#endif +#ifndef Tk_GetColor +#define Tk_GetColor \ + (tkStubsPtr->tk_GetColor) /* 88 */ +#endif +#ifndef Tk_GetColorByValue +#define Tk_GetColorByValue \ + (tkStubsPtr->tk_GetColorByValue) /* 89 */ +#endif +#ifndef Tk_GetColormap +#define Tk_GetColormap \ + (tkStubsPtr->tk_GetColormap) /* 90 */ +#endif +#ifndef Tk_GetCursor +#define Tk_GetCursor \ + (tkStubsPtr->tk_GetCursor) /* 91 */ +#endif +#ifndef Tk_GetCursorFromData +#define Tk_GetCursorFromData \ + (tkStubsPtr->tk_GetCursorFromData) /* 92 */ +#endif +#ifndef Tk_GetFont +#define Tk_GetFont \ + (tkStubsPtr->tk_GetFont) /* 93 */ +#endif +#ifndef Tk_GetFontFromObj +#define Tk_GetFontFromObj \ + (tkStubsPtr->tk_GetFontFromObj) /* 94 */ +#endif +#ifndef Tk_GetFontMetrics +#define Tk_GetFontMetrics \ + (tkStubsPtr->tk_GetFontMetrics) /* 95 */ +#endif +#ifndef Tk_GetGC +#define Tk_GetGC \ + (tkStubsPtr->tk_GetGC) /* 96 */ +#endif +#ifndef Tk_GetImage +#define Tk_GetImage \ + (tkStubsPtr->tk_GetImage) /* 97 */ +#endif +#ifndef Tk_GetImageMasterData +#define Tk_GetImageMasterData \ + (tkStubsPtr->tk_GetImageMasterData) /* 98 */ +#endif +#ifndef Tk_GetItemTypes +#define Tk_GetItemTypes \ + (tkStubsPtr->tk_GetItemTypes) /* 99 */ +#endif +#ifndef Tk_GetJoinStyle +#define Tk_GetJoinStyle \ + (tkStubsPtr->tk_GetJoinStyle) /* 100 */ +#endif +#ifndef Tk_GetJustify +#define Tk_GetJustify \ + (tkStubsPtr->tk_GetJustify) /* 101 */ +#endif +#ifndef Tk_GetNumMainWindows +#define Tk_GetNumMainWindows \ + (tkStubsPtr->tk_GetNumMainWindows) /* 102 */ +#endif +#ifndef Tk_GetOption +#define Tk_GetOption \ + (tkStubsPtr->tk_GetOption) /* 103 */ +#endif +#ifndef Tk_GetPixels +#define Tk_GetPixels \ + (tkStubsPtr->tk_GetPixels) /* 104 */ +#endif +#ifndef Tk_GetPixmap +#define Tk_GetPixmap \ + (tkStubsPtr->tk_GetPixmap) /* 105 */ +#endif +#ifndef Tk_GetRelief +#define Tk_GetRelief \ + (tkStubsPtr->tk_GetRelief) /* 106 */ +#endif +#ifndef Tk_GetRootCoords +#define Tk_GetRootCoords \ + (tkStubsPtr->tk_GetRootCoords) /* 107 */ +#endif +#ifndef Tk_GetScrollInfo +#define Tk_GetScrollInfo \ + (tkStubsPtr->tk_GetScrollInfo) /* 108 */ +#endif +#ifndef Tk_GetScreenMM +#define Tk_GetScreenMM \ + (tkStubsPtr->tk_GetScreenMM) /* 109 */ +#endif +#ifndef Tk_GetSelection +#define Tk_GetSelection \ + (tkStubsPtr->tk_GetSelection) /* 110 */ +#endif +#ifndef Tk_GetUid +#define Tk_GetUid \ + (tkStubsPtr->tk_GetUid) /* 111 */ +#endif +#ifndef Tk_GetVisual +#define Tk_GetVisual \ + (tkStubsPtr->tk_GetVisual) /* 112 */ +#endif +#ifndef Tk_GetVRootGeometry +#define Tk_GetVRootGeometry \ + (tkStubsPtr->tk_GetVRootGeometry) /* 113 */ +#endif +#ifndef Tk_Grab +#define Tk_Grab \ + (tkStubsPtr->tk_Grab) /* 114 */ +#endif +#ifndef Tk_HandleEvent +#define Tk_HandleEvent \ + (tkStubsPtr->tk_HandleEvent) /* 115 */ +#endif +#ifndef Tk_IdToWindow +#define Tk_IdToWindow \ + (tkStubsPtr->tk_IdToWindow) /* 116 */ +#endif +#ifndef Tk_ImageChanged +#define Tk_ImageChanged \ + (tkStubsPtr->tk_ImageChanged) /* 117 */ +#endif +#ifndef Tk_Init +#define Tk_Init \ + (tkStubsPtr->tk_Init) /* 118 */ +#endif +#ifndef Tk_InternAtom +#define Tk_InternAtom \ + (tkStubsPtr->tk_InternAtom) /* 119 */ +#endif +#ifndef Tk_IntersectTextLayout +#define Tk_IntersectTextLayout \ + (tkStubsPtr->tk_IntersectTextLayout) /* 120 */ +#endif +#ifndef Tk_MaintainGeometry +#define Tk_MaintainGeometry \ + (tkStubsPtr->tk_MaintainGeometry) /* 121 */ +#endif +#ifndef Tk_MainWindow +#define Tk_MainWindow \ + (tkStubsPtr->tk_MainWindow) /* 122 */ +#endif +#ifndef Tk_MakeWindowExist +#define Tk_MakeWindowExist \ + (tkStubsPtr->tk_MakeWindowExist) /* 123 */ +#endif +#ifndef Tk_ManageGeometry +#define Tk_ManageGeometry \ + (tkStubsPtr->tk_ManageGeometry) /* 124 */ +#endif +#ifndef Tk_MapWindow +#define Tk_MapWindow \ + (tkStubsPtr->tk_MapWindow) /* 125 */ +#endif +#ifndef Tk_MeasureChars +#define Tk_MeasureChars \ + (tkStubsPtr->tk_MeasureChars) /* 126 */ +#endif +#ifndef Tk_MoveResizeWindow +#define Tk_MoveResizeWindow \ + (tkStubsPtr->tk_MoveResizeWindow) /* 127 */ +#endif +#ifndef Tk_MoveWindow +#define Tk_MoveWindow \ + (tkStubsPtr->tk_MoveWindow) /* 128 */ +#endif +#ifndef Tk_MoveToplevelWindow +#define Tk_MoveToplevelWindow \ + (tkStubsPtr->tk_MoveToplevelWindow) /* 129 */ +#endif +#ifndef Tk_NameOf3DBorder +#define Tk_NameOf3DBorder \ + (tkStubsPtr->tk_NameOf3DBorder) /* 130 */ +#endif +#ifndef Tk_NameOfAnchor +#define Tk_NameOfAnchor \ + (tkStubsPtr->tk_NameOfAnchor) /* 131 */ +#endif +#ifndef Tk_NameOfBitmap +#define Tk_NameOfBitmap \ + (tkStubsPtr->tk_NameOfBitmap) /* 132 */ +#endif +#ifndef Tk_NameOfCapStyle +#define Tk_NameOfCapStyle \ + (tkStubsPtr->tk_NameOfCapStyle) /* 133 */ +#endif +#ifndef Tk_NameOfColor +#define Tk_NameOfColor \ + (tkStubsPtr->tk_NameOfColor) /* 134 */ +#endif +#ifndef Tk_NameOfCursor +#define Tk_NameOfCursor \ + (tkStubsPtr->tk_NameOfCursor) /* 135 */ +#endif +#ifndef Tk_NameOfFont +#define Tk_NameOfFont \ + (tkStubsPtr->tk_NameOfFont) /* 136 */ +#endif +#ifndef Tk_NameOfImage +#define Tk_NameOfImage \ + (tkStubsPtr->tk_NameOfImage) /* 137 */ +#endif +#ifndef Tk_NameOfJoinStyle +#define Tk_NameOfJoinStyle \ + (tkStubsPtr->tk_NameOfJoinStyle) /* 138 */ +#endif +#ifndef Tk_NameOfJustify +#define Tk_NameOfJustify \ + (tkStubsPtr->tk_NameOfJustify) /* 139 */ +#endif +#ifndef Tk_NameOfRelief +#define Tk_NameOfRelief \ + (tkStubsPtr->tk_NameOfRelief) /* 140 */ +#endif +#ifndef Tk_NameToWindow +#define Tk_NameToWindow \ + (tkStubsPtr->tk_NameToWindow) /* 141 */ +#endif +#ifndef Tk_OwnSelection +#define Tk_OwnSelection \ + (tkStubsPtr->tk_OwnSelection) /* 142 */ +#endif +#ifndef Tk_ParseArgv +#define Tk_ParseArgv \ + (tkStubsPtr->tk_ParseArgv) /* 143 */ +#endif +#ifndef Tk_PhotoPutBlock_NoComposite +#define Tk_PhotoPutBlock_NoComposite \ + (tkStubsPtr->tk_PhotoPutBlock_NoComposite) /* 144 */ +#endif +#ifndef Tk_PhotoPutZoomedBlock_NoComposite +#define Tk_PhotoPutZoomedBlock_NoComposite \ + (tkStubsPtr->tk_PhotoPutZoomedBlock_NoComposite) /* 145 */ +#endif +#ifndef Tk_PhotoGetImage +#define Tk_PhotoGetImage \ + (tkStubsPtr->tk_PhotoGetImage) /* 146 */ +#endif +#ifndef Tk_PhotoBlank +#define Tk_PhotoBlank \ + (tkStubsPtr->tk_PhotoBlank) /* 147 */ +#endif +#ifndef Tk_PhotoExpand_Panic +#define Tk_PhotoExpand_Panic \ + (tkStubsPtr->tk_PhotoExpand_Panic) /* 148 */ +#endif +#ifndef Tk_PhotoGetSize +#define Tk_PhotoGetSize \ + (tkStubsPtr->tk_PhotoGetSize) /* 149 */ +#endif +#ifndef Tk_PhotoSetSize_Panic +#define Tk_PhotoSetSize_Panic \ + (tkStubsPtr->tk_PhotoSetSize_Panic) /* 150 */ +#endif +#ifndef Tk_PointToChar +#define Tk_PointToChar \ + (tkStubsPtr->tk_PointToChar) /* 151 */ +#endif +#ifndef Tk_PostscriptFontName +#define Tk_PostscriptFontName \ + (tkStubsPtr->tk_PostscriptFontName) /* 152 */ +#endif +#ifndef Tk_PreserveColormap +#define Tk_PreserveColormap \ + (tkStubsPtr->tk_PreserveColormap) /* 153 */ +#endif +#ifndef Tk_QueueWindowEvent +#define Tk_QueueWindowEvent \ + (tkStubsPtr->tk_QueueWindowEvent) /* 154 */ +#endif +#ifndef Tk_RedrawImage +#define Tk_RedrawImage \ + (tkStubsPtr->tk_RedrawImage) /* 155 */ +#endif +#ifndef Tk_ResizeWindow +#define Tk_ResizeWindow \ + (tkStubsPtr->tk_ResizeWindow) /* 156 */ +#endif +#ifndef Tk_RestackWindow +#define Tk_RestackWindow \ + (tkStubsPtr->tk_RestackWindow) /* 157 */ +#endif +#ifndef Tk_RestrictEvents +#define Tk_RestrictEvents \ + (tkStubsPtr->tk_RestrictEvents) /* 158 */ +#endif +#ifndef Tk_SafeInit +#define Tk_SafeInit \ + (tkStubsPtr->tk_SafeInit) /* 159 */ +#endif +#ifndef Tk_SetAppName +#define Tk_SetAppName \ + (tkStubsPtr->tk_SetAppName) /* 160 */ +#endif +#ifndef Tk_SetBackgroundFromBorder +#define Tk_SetBackgroundFromBorder \ + (tkStubsPtr->tk_SetBackgroundFromBorder) /* 161 */ +#endif +#ifndef Tk_SetClass +#define Tk_SetClass \ + (tkStubsPtr->tk_SetClass) /* 162 */ +#endif +#ifndef Tk_SetGrid +#define Tk_SetGrid \ + (tkStubsPtr->tk_SetGrid) /* 163 */ +#endif +#ifndef Tk_SetInternalBorder +#define Tk_SetInternalBorder \ + (tkStubsPtr->tk_SetInternalBorder) /* 164 */ +#endif +#ifndef Tk_SetWindowBackground +#define Tk_SetWindowBackground \ + (tkStubsPtr->tk_SetWindowBackground) /* 165 */ +#endif +#ifndef Tk_SetWindowBackgroundPixmap +#define Tk_SetWindowBackgroundPixmap \ + (tkStubsPtr->tk_SetWindowBackgroundPixmap) /* 166 */ +#endif +#ifndef Tk_SetWindowBorder +#define Tk_SetWindowBorder \ + (tkStubsPtr->tk_SetWindowBorder) /* 167 */ +#endif +#ifndef Tk_SetWindowBorderWidth +#define Tk_SetWindowBorderWidth \ + (tkStubsPtr->tk_SetWindowBorderWidth) /* 168 */ +#endif +#ifndef Tk_SetWindowBorderPixmap +#define Tk_SetWindowBorderPixmap \ + (tkStubsPtr->tk_SetWindowBorderPixmap) /* 169 */ +#endif +#ifndef Tk_SetWindowColormap +#define Tk_SetWindowColormap \ + (tkStubsPtr->tk_SetWindowColormap) /* 170 */ +#endif +#ifndef Tk_SetWindowVisual +#define Tk_SetWindowVisual \ + (tkStubsPtr->tk_SetWindowVisual) /* 171 */ +#endif +#ifndef Tk_SizeOfBitmap +#define Tk_SizeOfBitmap \ + (tkStubsPtr->tk_SizeOfBitmap) /* 172 */ +#endif +#ifndef Tk_SizeOfImage +#define Tk_SizeOfImage \ + (tkStubsPtr->tk_SizeOfImage) /* 173 */ +#endif +#ifndef Tk_StrictMotif +#define Tk_StrictMotif \ + (tkStubsPtr->tk_StrictMotif) /* 174 */ +#endif +#ifndef Tk_TextLayoutToPostscript +#define Tk_TextLayoutToPostscript \ + (tkStubsPtr->tk_TextLayoutToPostscript) /* 175 */ +#endif +#ifndef Tk_TextWidth +#define Tk_TextWidth \ + (tkStubsPtr->tk_TextWidth) /* 176 */ +#endif +#ifndef Tk_UndefineCursor +#define Tk_UndefineCursor \ + (tkStubsPtr->tk_UndefineCursor) /* 177 */ +#endif +#ifndef Tk_UnderlineChars +#define Tk_UnderlineChars \ + (tkStubsPtr->tk_UnderlineChars) /* 178 */ +#endif +#ifndef Tk_UnderlineTextLayout +#define Tk_UnderlineTextLayout \ + (tkStubsPtr->tk_UnderlineTextLayout) /* 179 */ +#endif +#ifndef Tk_Ungrab +#define Tk_Ungrab \ + (tkStubsPtr->tk_Ungrab) /* 180 */ +#endif +#ifndef Tk_UnmaintainGeometry +#define Tk_UnmaintainGeometry \ + (tkStubsPtr->tk_UnmaintainGeometry) /* 181 */ +#endif +#ifndef Tk_UnmapWindow +#define Tk_UnmapWindow \ + (tkStubsPtr->tk_UnmapWindow) /* 182 */ +#endif +#ifndef Tk_UnsetGrid +#define Tk_UnsetGrid \ + (tkStubsPtr->tk_UnsetGrid) /* 183 */ +#endif +#ifndef Tk_UpdatePointer +#define Tk_UpdatePointer \ + (tkStubsPtr->tk_UpdatePointer) /* 184 */ +#endif +#ifndef Tk_AllocBitmapFromObj +#define Tk_AllocBitmapFromObj \ + (tkStubsPtr->tk_AllocBitmapFromObj) /* 185 */ +#endif +#ifndef Tk_Alloc3DBorderFromObj +#define Tk_Alloc3DBorderFromObj \ + (tkStubsPtr->tk_Alloc3DBorderFromObj) /* 186 */ +#endif +#ifndef Tk_AllocColorFromObj +#define Tk_AllocColorFromObj \ + (tkStubsPtr->tk_AllocColorFromObj) /* 187 */ +#endif +#ifndef Tk_AllocCursorFromObj +#define Tk_AllocCursorFromObj \ + (tkStubsPtr->tk_AllocCursorFromObj) /* 188 */ +#endif +#ifndef Tk_AllocFontFromObj +#define Tk_AllocFontFromObj \ + (tkStubsPtr->tk_AllocFontFromObj) /* 189 */ +#endif +#ifndef Tk_CreateOptionTable +#define Tk_CreateOptionTable \ + (tkStubsPtr->tk_CreateOptionTable) /* 190 */ +#endif +#ifndef Tk_DeleteOptionTable +#define Tk_DeleteOptionTable \ + (tkStubsPtr->tk_DeleteOptionTable) /* 191 */ +#endif +#ifndef Tk_Free3DBorderFromObj +#define Tk_Free3DBorderFromObj \ + (tkStubsPtr->tk_Free3DBorderFromObj) /* 192 */ +#endif +#ifndef Tk_FreeBitmapFromObj +#define Tk_FreeBitmapFromObj \ + (tkStubsPtr->tk_FreeBitmapFromObj) /* 193 */ +#endif +#ifndef Tk_FreeColorFromObj +#define Tk_FreeColorFromObj \ + (tkStubsPtr->tk_FreeColorFromObj) /* 194 */ +#endif +#ifndef Tk_FreeConfigOptions +#define Tk_FreeConfigOptions \ + (tkStubsPtr->tk_FreeConfigOptions) /* 195 */ +#endif +#ifndef Tk_FreeSavedOptions +#define Tk_FreeSavedOptions \ + (tkStubsPtr->tk_FreeSavedOptions) /* 196 */ +#endif +#ifndef Tk_FreeCursorFromObj +#define Tk_FreeCursorFromObj \ + (tkStubsPtr->tk_FreeCursorFromObj) /* 197 */ +#endif +#ifndef Tk_FreeFontFromObj +#define Tk_FreeFontFromObj \ + (tkStubsPtr->tk_FreeFontFromObj) /* 198 */ +#endif +#ifndef Tk_Get3DBorderFromObj +#define Tk_Get3DBorderFromObj \ + (tkStubsPtr->tk_Get3DBorderFromObj) /* 199 */ +#endif +#ifndef Tk_GetAnchorFromObj +#define Tk_GetAnchorFromObj \ + (tkStubsPtr->tk_GetAnchorFromObj) /* 200 */ +#endif +#ifndef Tk_GetBitmapFromObj +#define Tk_GetBitmapFromObj \ + (tkStubsPtr->tk_GetBitmapFromObj) /* 201 */ +#endif +#ifndef Tk_GetColorFromObj +#define Tk_GetColorFromObj \ + (tkStubsPtr->tk_GetColorFromObj) /* 202 */ +#endif +#ifndef Tk_GetCursorFromObj +#define Tk_GetCursorFromObj \ + (tkStubsPtr->tk_GetCursorFromObj) /* 203 */ +#endif +#ifndef Tk_GetOptionInfo +#define Tk_GetOptionInfo \ + (tkStubsPtr->tk_GetOptionInfo) /* 204 */ +#endif +#ifndef Tk_GetOptionValue +#define Tk_GetOptionValue \ + (tkStubsPtr->tk_GetOptionValue) /* 205 */ +#endif +#ifndef Tk_GetJustifyFromObj +#define Tk_GetJustifyFromObj \ + (tkStubsPtr->tk_GetJustifyFromObj) /* 206 */ +#endif +#ifndef Tk_GetMMFromObj +#define Tk_GetMMFromObj \ + (tkStubsPtr->tk_GetMMFromObj) /* 207 */ +#endif +#ifndef Tk_GetPixelsFromObj +#define Tk_GetPixelsFromObj \ + (tkStubsPtr->tk_GetPixelsFromObj) /* 208 */ +#endif +#ifndef Tk_GetReliefFromObj +#define Tk_GetReliefFromObj \ + (tkStubsPtr->tk_GetReliefFromObj) /* 209 */ +#endif +#ifndef Tk_GetScrollInfoObj +#define Tk_GetScrollInfoObj \ + (tkStubsPtr->tk_GetScrollInfoObj) /* 210 */ +#endif +#ifndef Tk_InitOptions +#define Tk_InitOptions \ + (tkStubsPtr->tk_InitOptions) /* 211 */ +#endif +#ifndef Tk_MainEx +#define Tk_MainEx \ + (tkStubsPtr->tk_MainEx) /* 212 */ +#endif +#ifndef Tk_RestoreSavedOptions +#define Tk_RestoreSavedOptions \ + (tkStubsPtr->tk_RestoreSavedOptions) /* 213 */ +#endif +#ifndef Tk_SetOptions +#define Tk_SetOptions \ + (tkStubsPtr->tk_SetOptions) /* 214 */ +#endif +#ifndef Tk_InitConsoleChannels +#define Tk_InitConsoleChannels \ + (tkStubsPtr->tk_InitConsoleChannels) /* 215 */ +#endif +#ifndef Tk_CreateConsoleWindow +#define Tk_CreateConsoleWindow \ + (tkStubsPtr->tk_CreateConsoleWindow) /* 216 */ +#endif +#ifndef Tk_CreateSmoothMethod +#define Tk_CreateSmoothMethod \ + (tkStubsPtr->tk_CreateSmoothMethod) /* 217 */ +#endif +/* Slot 218 is reserved */ +/* Slot 219 is reserved */ +#ifndef Tk_GetDash +#define Tk_GetDash \ + (tkStubsPtr->tk_GetDash) /* 220 */ +#endif +#ifndef Tk_CreateOutline +#define Tk_CreateOutline \ + (tkStubsPtr->tk_CreateOutline) /* 221 */ +#endif +#ifndef Tk_DeleteOutline +#define Tk_DeleteOutline \ + (tkStubsPtr->tk_DeleteOutline) /* 222 */ +#endif +#ifndef Tk_ConfigOutlineGC +#define Tk_ConfigOutlineGC \ + (tkStubsPtr->tk_ConfigOutlineGC) /* 223 */ +#endif +#ifndef Tk_ChangeOutlineGC +#define Tk_ChangeOutlineGC \ + (tkStubsPtr->tk_ChangeOutlineGC) /* 224 */ +#endif +#ifndef Tk_ResetOutlineGC +#define Tk_ResetOutlineGC \ + (tkStubsPtr->tk_ResetOutlineGC) /* 225 */ +#endif +#ifndef Tk_CanvasPsOutline +#define Tk_CanvasPsOutline \ + (tkStubsPtr->tk_CanvasPsOutline) /* 226 */ +#endif +#ifndef Tk_SetTSOrigin +#define Tk_SetTSOrigin \ + (tkStubsPtr->tk_SetTSOrigin) /* 227 */ +#endif +#ifndef Tk_CanvasGetCoordFromObj +#define Tk_CanvasGetCoordFromObj \ + (tkStubsPtr->tk_CanvasGetCoordFromObj) /* 228 */ +#endif +#ifndef Tk_CanvasSetOffset +#define Tk_CanvasSetOffset \ + (tkStubsPtr->tk_CanvasSetOffset) /* 229 */ +#endif +#ifndef Tk_DitherPhoto +#define Tk_DitherPhoto \ + (tkStubsPtr->tk_DitherPhoto) /* 230 */ +#endif +#ifndef Tk_PostscriptBitmap +#define Tk_PostscriptBitmap \ + (tkStubsPtr->tk_PostscriptBitmap) /* 231 */ +#endif +#ifndef Tk_PostscriptColor +#define Tk_PostscriptColor \ + (tkStubsPtr->tk_PostscriptColor) /* 232 */ +#endif +#ifndef Tk_PostscriptFont +#define Tk_PostscriptFont \ + (tkStubsPtr->tk_PostscriptFont) /* 233 */ +#endif +#ifndef Tk_PostscriptImage +#define Tk_PostscriptImage \ + (tkStubsPtr->tk_PostscriptImage) /* 234 */ +#endif +#ifndef Tk_PostscriptPath +#define Tk_PostscriptPath \ + (tkStubsPtr->tk_PostscriptPath) /* 235 */ +#endif +#ifndef Tk_PostscriptStipple +#define Tk_PostscriptStipple \ + (tkStubsPtr->tk_PostscriptStipple) /* 236 */ +#endif +#ifndef Tk_PostscriptY +#define Tk_PostscriptY \ + (tkStubsPtr->tk_PostscriptY) /* 237 */ +#endif +#ifndef Tk_PostscriptPhoto +#define Tk_PostscriptPhoto \ + (tkStubsPtr->tk_PostscriptPhoto) /* 238 */ +#endif +#ifndef Tk_CreateClientMessageHandler +#define Tk_CreateClientMessageHandler \ + (tkStubsPtr->tk_CreateClientMessageHandler) /* 239 */ +#endif +#ifndef Tk_DeleteClientMessageHandler +#define Tk_DeleteClientMessageHandler \ + (tkStubsPtr->tk_DeleteClientMessageHandler) /* 240 */ +#endif +#ifndef Tk_CreateAnonymousWindow +#define Tk_CreateAnonymousWindow \ + (tkStubsPtr->tk_CreateAnonymousWindow) /* 241 */ +#endif +#ifndef Tk_SetClassProcs +#define Tk_SetClassProcs \ + (tkStubsPtr->tk_SetClassProcs) /* 242 */ +#endif +#ifndef Tk_SetInternalBorderEx +#define Tk_SetInternalBorderEx \ + (tkStubsPtr->tk_SetInternalBorderEx) /* 243 */ +#endif +#ifndef Tk_SetMinimumRequestSize +#define Tk_SetMinimumRequestSize \ + (tkStubsPtr->tk_SetMinimumRequestSize) /* 244 */ +#endif +#ifndef Tk_SetCaretPos +#define Tk_SetCaretPos \ + (tkStubsPtr->tk_SetCaretPos) /* 245 */ +#endif +#ifndef Tk_PhotoPutBlock_Panic +#define Tk_PhotoPutBlock_Panic \ + (tkStubsPtr->tk_PhotoPutBlock_Panic) /* 246 */ +#endif +#ifndef Tk_PhotoPutZoomedBlock_Panic +#define Tk_PhotoPutZoomedBlock_Panic \ + (tkStubsPtr->tk_PhotoPutZoomedBlock_Panic) /* 247 */ +#endif +#ifndef Tk_CollapseMotionEvents +#define Tk_CollapseMotionEvents \ + (tkStubsPtr->tk_CollapseMotionEvents) /* 248 */ +#endif +#ifndef Tk_RegisterStyleEngine +#define Tk_RegisterStyleEngine \ + (tkStubsPtr->tk_RegisterStyleEngine) /* 249 */ +#endif +#ifndef Tk_GetStyleEngine +#define Tk_GetStyleEngine \ + (tkStubsPtr->tk_GetStyleEngine) /* 250 */ +#endif +#ifndef Tk_RegisterStyledElement +#define Tk_RegisterStyledElement \ + (tkStubsPtr->tk_RegisterStyledElement) /* 251 */ +#endif +#ifndef Tk_GetElementId +#define Tk_GetElementId \ + (tkStubsPtr->tk_GetElementId) /* 252 */ +#endif +#ifndef Tk_CreateStyle +#define Tk_CreateStyle \ + (tkStubsPtr->tk_CreateStyle) /* 253 */ +#endif +#ifndef Tk_GetStyle +#define Tk_GetStyle \ + (tkStubsPtr->tk_GetStyle) /* 254 */ +#endif +#ifndef Tk_FreeStyle +#define Tk_FreeStyle \ + (tkStubsPtr->tk_FreeStyle) /* 255 */ +#endif +#ifndef Tk_NameOfStyle +#define Tk_NameOfStyle \ + (tkStubsPtr->tk_NameOfStyle) /* 256 */ +#endif +#ifndef Tk_AllocStyleFromObj +#define Tk_AllocStyleFromObj \ + (tkStubsPtr->tk_AllocStyleFromObj) /* 257 */ +#endif +#ifndef Tk_GetStyleFromObj +#define Tk_GetStyleFromObj \ + (tkStubsPtr->tk_GetStyleFromObj) /* 258 */ +#endif +#ifndef Tk_FreeStyleFromObj +#define Tk_FreeStyleFromObj \ + (tkStubsPtr->tk_FreeStyleFromObj) /* 259 */ +#endif +#ifndef Tk_GetStyledElement +#define Tk_GetStyledElement \ + (tkStubsPtr->tk_GetStyledElement) /* 260 */ +#endif +#ifndef Tk_GetElementSize +#define Tk_GetElementSize \ + (tkStubsPtr->tk_GetElementSize) /* 261 */ +#endif +#ifndef Tk_GetElementBox +#define Tk_GetElementBox \ + (tkStubsPtr->tk_GetElementBox) /* 262 */ +#endif +#ifndef Tk_GetElementBorderWidth +#define Tk_GetElementBorderWidth \ + (tkStubsPtr->tk_GetElementBorderWidth) /* 263 */ +#endif +#ifndef Tk_DrawElement +#define Tk_DrawElement \ + (tkStubsPtr->tk_DrawElement) /* 264 */ +#endif +#ifndef Tk_PhotoExpand +#define Tk_PhotoExpand \ + (tkStubsPtr->tk_PhotoExpand) /* 265 */ +#endif +#ifndef Tk_PhotoPutBlock +#define Tk_PhotoPutBlock \ + (tkStubsPtr->tk_PhotoPutBlock) /* 266 */ +#endif +#ifndef Tk_PhotoPutZoomedBlock +#define Tk_PhotoPutZoomedBlock \ + (tkStubsPtr->tk_PhotoPutZoomedBlock) /* 267 */ +#endif +#ifndef Tk_PhotoSetSize +#define Tk_PhotoSetSize \ + (tkStubsPtr->tk_PhotoSetSize) /* 268 */ +#endif +#ifndef Tk_GetUserInactiveTime +#define Tk_GetUserInactiveTime \ + (tkStubsPtr->tk_GetUserInactiveTime) /* 269 */ +#endif +#ifndef Tk_ResetUserInactiveTime +#define Tk_ResetUserInactiveTime \ + (tkStubsPtr->tk_ResetUserInactiveTime) /* 270 */ +#endif +#ifndef Tk_Interp +#define Tk_Interp \ + (tkStubsPtr->tk_Interp) /* 271 */ +#endif +#ifndef Tk_CreateOldImageType +#define Tk_CreateOldImageType \ + (tkStubsPtr->tk_CreateOldImageType) /* 272 */ +#endif +#ifndef Tk_CreateOldPhotoImageFormat +#define Tk_CreateOldPhotoImageFormat \ + (tkStubsPtr->tk_CreateOldPhotoImageFormat) /* 273 */ +#endif +/* Slot 274 is reserved */ +#ifndef TkUnusedStubEntry +#define TkUnusedStubEntry \ + (tkStubsPtr->tkUnusedStubEntry) /* 275 */ +#endif + +#endif /* defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) */ + +/* !END!: Do not edit above this line. */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#undef TkUnusedStubEntry + +#endif /* _TKDECLS */ + diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tkPlatDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tkPlatDecls.h new file mode 100644 index 00000000..eb3d74da --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.5/tkPlatDecls.h @@ -0,0 +1,253 @@ +/* + * tkPlatDecls.h -- + * + * Declarations of functions in the platform-specific public Tcl API. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TKPLATDECLS +#define _TKPLATDECLS + +#ifdef BUILD_tk +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLEXPORT +#endif + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tk.decls script. + */ + +/* !BEGIN!: Do not edit below this line. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Exported function declarations: + */ + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ +#ifndef Tk_AttachHWND_TCL_DECLARED +#define Tk_AttachHWND_TCL_DECLARED +/* 0 */ +EXTERN Window Tk_AttachHWND(Tk_Window tkwin, HWND hwnd); +#endif +#ifndef Tk_GetHINSTANCE_TCL_DECLARED +#define Tk_GetHINSTANCE_TCL_DECLARED +/* 1 */ +EXTERN HINSTANCE Tk_GetHINSTANCE(void); +#endif +#ifndef Tk_GetHWND_TCL_DECLARED +#define Tk_GetHWND_TCL_DECLARED +/* 2 */ +EXTERN HWND Tk_GetHWND(Window window); +#endif +#ifndef Tk_HWNDToWindow_TCL_DECLARED +#define Tk_HWNDToWindow_TCL_DECLARED +/* 3 */ +EXTERN Tk_Window Tk_HWNDToWindow(HWND hwnd); +#endif +#ifndef Tk_PointerEvent_TCL_DECLARED +#define Tk_PointerEvent_TCL_DECLARED +/* 4 */ +EXTERN void Tk_PointerEvent(HWND hwnd, int x, int y); +#endif +#ifndef Tk_TranslateWinEvent_TCL_DECLARED +#define Tk_TranslateWinEvent_TCL_DECLARED +/* 5 */ +EXTERN int Tk_TranslateWinEvent(HWND hwnd, UINT message, + WPARAM wParam, LPARAM lParam, + LRESULT *result); +#endif +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ +#ifndef Tk_MacOSXSetEmbedHandler_TCL_DECLARED +#define Tk_MacOSXSetEmbedHandler_TCL_DECLARED +/* 0 */ +EXTERN void Tk_MacOSXSetEmbedHandler( + Tk_MacOSXEmbedRegisterWinProc *registerWinProcPtr, + Tk_MacOSXEmbedGetGrafPortProc *getPortProcPtr, + Tk_MacOSXEmbedMakeContainerExistProc *containerExistProcPtr, + Tk_MacOSXEmbedGetClipProc *getClipProc, + Tk_MacOSXEmbedGetOffsetInParentProc *getOffsetProc); +#endif +#ifndef Tk_MacOSXTurnOffMenus_TCL_DECLARED +#define Tk_MacOSXTurnOffMenus_TCL_DECLARED +/* 1 */ +EXTERN void Tk_MacOSXTurnOffMenus(void); +#endif +#ifndef Tk_MacOSXTkOwnsCursor_TCL_DECLARED +#define Tk_MacOSXTkOwnsCursor_TCL_DECLARED +/* 2 */ +EXTERN void Tk_MacOSXTkOwnsCursor(int tkOwnsIt); +#endif +#ifndef TkMacOSXInitMenus_TCL_DECLARED +#define TkMacOSXInitMenus_TCL_DECLARED +/* 3 */ +EXTERN void TkMacOSXInitMenus(Tcl_Interp *interp); +#endif +#ifndef TkMacOSXInitAppleEvents_TCL_DECLARED +#define TkMacOSXInitAppleEvents_TCL_DECLARED +/* 4 */ +EXTERN void TkMacOSXInitAppleEvents(Tcl_Interp *interp); +#endif +#ifndef TkGenWMConfigureEvent_TCL_DECLARED +#define TkGenWMConfigureEvent_TCL_DECLARED +/* 5 */ +EXTERN void TkGenWMConfigureEvent(Tk_Window tkwin, int x, int y, + int width, int height, int flags); +#endif +#ifndef TkMacOSXInvalClipRgns_TCL_DECLARED +#define TkMacOSXInvalClipRgns_TCL_DECLARED +/* 6 */ +EXTERN void TkMacOSXInvalClipRgns(Tk_Window tkwin); +#endif +#ifndef TkMacOSXGetDrawablePort_TCL_DECLARED +#define TkMacOSXGetDrawablePort_TCL_DECLARED +/* 7 */ +EXTERN VOID * TkMacOSXGetDrawablePort(Drawable drawable); +#endif +#ifndef TkMacOSXGetRootControl_TCL_DECLARED +#define TkMacOSXGetRootControl_TCL_DECLARED +/* 8 */ +EXTERN VOID * TkMacOSXGetRootControl(Drawable drawable); +#endif +#ifndef Tk_MacOSXSetupTkNotifier_TCL_DECLARED +#define Tk_MacOSXSetupTkNotifier_TCL_DECLARED +/* 9 */ +EXTERN void Tk_MacOSXSetupTkNotifier(void); +#endif +#ifndef Tk_MacOSXIsAppInFront_TCL_DECLARED +#define Tk_MacOSXIsAppInFront_TCL_DECLARED +/* 10 */ +EXTERN int Tk_MacOSXIsAppInFront(void); +#endif +#endif /* AQUA */ + +typedef struct TkPlatStubs { + int magic; + struct TkPlatStubHooks *hooks; + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ + Window (*tk_AttachHWND) (Tk_Window tkwin, HWND hwnd); /* 0 */ + HINSTANCE (*tk_GetHINSTANCE) (void); /* 1 */ + HWND (*tk_GetHWND) (Window window); /* 2 */ + Tk_Window (*tk_HWNDToWindow) (HWND hwnd); /* 3 */ + void (*tk_PointerEvent) (HWND hwnd, int x, int y); /* 4 */ + int (*tk_TranslateWinEvent) (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT *result); /* 5 */ +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ + void (*tk_MacOSXSetEmbedHandler) (Tk_MacOSXEmbedRegisterWinProc *registerWinProcPtr, Tk_MacOSXEmbedGetGrafPortProc *getPortProcPtr, Tk_MacOSXEmbedMakeContainerExistProc *containerExistProcPtr, Tk_MacOSXEmbedGetClipProc *getClipProc, Tk_MacOSXEmbedGetOffsetInParentProc *getOffsetProc); /* 0 */ + void (*tk_MacOSXTurnOffMenus) (void); /* 1 */ + void (*tk_MacOSXTkOwnsCursor) (int tkOwnsIt); /* 2 */ + void (*tkMacOSXInitMenus) (Tcl_Interp *interp); /* 3 */ + void (*tkMacOSXInitAppleEvents) (Tcl_Interp *interp); /* 4 */ + void (*tkGenWMConfigureEvent) (Tk_Window tkwin, int x, int y, int width, int height, int flags); /* 5 */ + void (*tkMacOSXInvalClipRgns) (Tk_Window tkwin); /* 6 */ + VOID * (*tkMacOSXGetDrawablePort) (Drawable drawable); /* 7 */ + VOID * (*tkMacOSXGetRootControl) (Drawable drawable); /* 8 */ + void (*tk_MacOSXSetupTkNotifier) (void); /* 9 */ + int (*tk_MacOSXIsAppInFront) (void); /* 10 */ +#endif /* AQUA */ +} TkPlatStubs; + +extern TkPlatStubs *tkPlatStubsPtr; + +#ifdef __cplusplus +} +#endif + +#if defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) + +/* + * Inline function declarations: + */ + +#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ +#ifndef Tk_AttachHWND +#define Tk_AttachHWND \ + (tkPlatStubsPtr->tk_AttachHWND) /* 0 */ +#endif +#ifndef Tk_GetHINSTANCE +#define Tk_GetHINSTANCE \ + (tkPlatStubsPtr->tk_GetHINSTANCE) /* 1 */ +#endif +#ifndef Tk_GetHWND +#define Tk_GetHWND \ + (tkPlatStubsPtr->tk_GetHWND) /* 2 */ +#endif +#ifndef Tk_HWNDToWindow +#define Tk_HWNDToWindow \ + (tkPlatStubsPtr->tk_HWNDToWindow) /* 3 */ +#endif +#ifndef Tk_PointerEvent +#define Tk_PointerEvent \ + (tkPlatStubsPtr->tk_PointerEvent) /* 4 */ +#endif +#ifndef Tk_TranslateWinEvent +#define Tk_TranslateWinEvent \ + (tkPlatStubsPtr->tk_TranslateWinEvent) /* 5 */ +#endif +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ +#ifndef Tk_MacOSXSetEmbedHandler +#define Tk_MacOSXSetEmbedHandler \ + (tkPlatStubsPtr->tk_MacOSXSetEmbedHandler) /* 0 */ +#endif +#ifndef Tk_MacOSXTurnOffMenus +#define Tk_MacOSXTurnOffMenus \ + (tkPlatStubsPtr->tk_MacOSXTurnOffMenus) /* 1 */ +#endif +#ifndef Tk_MacOSXTkOwnsCursor +#define Tk_MacOSXTkOwnsCursor \ + (tkPlatStubsPtr->tk_MacOSXTkOwnsCursor) /* 2 */ +#endif +#ifndef TkMacOSXInitMenus +#define TkMacOSXInitMenus \ + (tkPlatStubsPtr->tkMacOSXInitMenus) /* 3 */ +#endif +#ifndef TkMacOSXInitAppleEvents +#define TkMacOSXInitAppleEvents \ + (tkPlatStubsPtr->tkMacOSXInitAppleEvents) /* 4 */ +#endif +#ifndef TkGenWMConfigureEvent +#define TkGenWMConfigureEvent \ + (tkPlatStubsPtr->tkGenWMConfigureEvent) /* 5 */ +#endif +#ifndef TkMacOSXInvalClipRgns +#define TkMacOSXInvalClipRgns \ + (tkPlatStubsPtr->tkMacOSXInvalClipRgns) /* 6 */ +#endif +#ifndef TkMacOSXGetDrawablePort +#define TkMacOSXGetDrawablePort \ + (tkPlatStubsPtr->tkMacOSXGetDrawablePort) /* 7 */ +#endif +#ifndef TkMacOSXGetRootControl +#define TkMacOSXGetRootControl \ + (tkPlatStubsPtr->tkMacOSXGetRootControl) /* 8 */ +#endif +#ifndef Tk_MacOSXSetupTkNotifier +#define Tk_MacOSXSetupTkNotifier \ + (tkPlatStubsPtr->tk_MacOSXSetupTkNotifier) /* 9 */ +#endif +#ifndef Tk_MacOSXIsAppInFront +#define Tk_MacOSXIsAppInFront \ + (tkPlatStubsPtr->tk_MacOSXIsAppInFront) /* 10 */ +#endif +#endif /* AQUA */ + +#endif /* defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) */ + +/* !END!: Do not edit above this line. */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#endif /* _TKPLATDECLS */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/X.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/X.h new file mode 100644 index 00000000..daf22830 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/X.h @@ -0,0 +1,677 @@ +/* + * $XConsortium: X.h,v 1.66 88/09/06 15:55:56 jim Exp $ + */ + +/* Definitions for the X window system likely to be used by applications */ + +#ifndef X_H +#define X_H + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ +#define X_PROTOCOL 11 /* current protocol version */ +#define X_PROTOCOL_REVISION 0 /* current minor version */ + +#if defined(MAC_OSX_TK) +# define Cursor XCursor +# define Region XRegion +#endif + +/* Resources */ + +#ifdef _WIN64 +typedef __int64 XID; +#else +typedef unsigned long XID; +#endif + +typedef XID Window; +typedef XID Drawable; +typedef XID Font; +typedef XID Pixmap; +typedef XID Cursor; +typedef XID Colormap; +typedef XID GContext; +typedef XID KeySym; + +typedef unsigned long Mask; + +typedef unsigned long Atom; + +typedef unsigned long VisualID; + +typedef unsigned long Time; + +typedef unsigned long KeyCode; /* In order to use IME, the Macintosh needs + * to pack 3 bytes into the keyCode field in + * the XEvent. In the real X.h, a KeyCode is + * defined as a short, which wouldn't be big + * enough. */ + +/***************************************************************** + * RESERVED RESOURCE AND CONSTANT DEFINITIONS + *****************************************************************/ + +#define None 0L /* universal null resource or null atom */ + +#define ParentRelative 1L /* background pixmap in CreateWindow + and ChangeWindowAttributes */ + +#define CopyFromParent 0L /* border pixmap in CreateWindow + and ChangeWindowAttributes + special VisualID and special window + class passed to CreateWindow */ + +#define PointerWindow 0L /* destination window in SendEvent */ +#define InputFocus 1L /* destination window in SendEvent */ + +#define PointerRoot 1L /* focus window in SetInputFocus */ + +#define AnyPropertyType 0L /* special Atom, passed to GetProperty */ + +#define AnyKey 0L /* special Key Code, passed to GrabKey */ + +#define AnyButton 0L /* special Button Code, passed to GrabButton */ + +#define AllTemporary 0L /* special Resource ID passed to KillClient */ + +#define CurrentTime 0L /* special Time */ + +#define NoSymbol 0L /* special KeySym */ + +/***************************************************************** + * EVENT DEFINITIONS + *****************************************************************/ + +/* Input Event Masks. Used as event-mask window attribute and as arguments + to Grab requests. Not to be confused with event names. */ + +#define NoEventMask 0L +#define KeyPressMask (1L<<0) +#define KeyReleaseMask (1L<<1) +#define ButtonPressMask (1L<<2) +#define ButtonReleaseMask (1L<<3) +#define EnterWindowMask (1L<<4) +#define LeaveWindowMask (1L<<5) +#define PointerMotionMask (1L<<6) +#define PointerMotionHintMask (1L<<7) +#define Button1MotionMask (1L<<8) +#define Button2MotionMask (1L<<9) +#define Button3MotionMask (1L<<10) +#define Button4MotionMask (1L<<11) +#define Button5MotionMask (1L<<12) +#define ButtonMotionMask (1L<<13) +#define KeymapStateMask (1L<<14) +#define ExposureMask (1L<<15) +#define VisibilityChangeMask (1L<<16) +#define StructureNotifyMask (1L<<17) +#define ResizeRedirectMask (1L<<18) +#define SubstructureNotifyMask (1L<<19) +#define SubstructureRedirectMask (1L<<20) +#define FocusChangeMask (1L<<21) +#define PropertyChangeMask (1L<<22) +#define ColormapChangeMask (1L<<23) +#define OwnerGrabButtonMask (1L<<24) + +/* Event names. Used in "type" field in XEvent structures. Not to be +confused with event masks above. They start from 2 because 0 and 1 +are reserved in the protocol for errors and replies. */ + +#define KeyPress 2 +#define KeyRelease 3 +#define ButtonPress 4 +#define ButtonRelease 5 +#define MotionNotify 6 +#define EnterNotify 7 +#define LeaveNotify 8 +#define FocusIn 9 +#define FocusOut 10 +#define KeymapNotify 11 +#define Expose 12 +#define GraphicsExpose 13 +#define NoExpose 14 +#define VisibilityNotify 15 +#define CreateNotify 16 +#define DestroyNotify 17 +#define UnmapNotify 18 +#define MapNotify 19 +#define MapRequest 20 +#define ReparentNotify 21 +#define ConfigureNotify 22 +#define ConfigureRequest 23 +#define GravityNotify 24 +#define ResizeRequest 25 +#define CirculateNotify 26 +#define CirculateRequest 27 +#define PropertyNotify 28 +#define SelectionClear 29 +#define SelectionRequest 30 +#define SelectionNotify 31 +#define ColormapNotify 32 +#define ClientMessage 33 +#define MappingNotify 34 +#define LASTEvent 35 /* must be bigger than any event # */ + + +/* Key masks. Used as modifiers to GrabButton and GrabKey, results of QueryPointer, + state in various key-, mouse-, and button-related events. */ + +#define ShiftMask (1<<0) +#define LockMask (1<<1) +#define ControlMask (1<<2) +#define Mod1Mask (1<<3) +#define Mod2Mask (1<<4) +#define Mod3Mask (1<<5) +#define Mod4Mask (1<<6) +#define Mod5Mask (1<<7) + +/* modifier names. Used to build a SetModifierMapping request or + to read a GetModifierMapping request. These correspond to the + masks defined above. */ +#define ShiftMapIndex 0 +#define LockMapIndex 1 +#define ControlMapIndex 2 +#define Mod1MapIndex 3 +#define Mod2MapIndex 4 +#define Mod3MapIndex 5 +#define Mod4MapIndex 6 +#define Mod5MapIndex 7 + + +/* button masks. Used in same manner as Key masks above. Not to be confused + with button names below. */ + +#define Button1Mask (1<<8) +#define Button2Mask (1<<9) +#define Button3Mask (1<<10) +#define Button4Mask (1<<11) +#define Button5Mask (1<<12) + +#define AnyModifier (1<<15) /* used in GrabButton, GrabKey */ + + +/* button names. Used as arguments to GrabButton and as detail in ButtonPress + and ButtonRelease events. Not to be confused with button masks above. + Note that 0 is already defined above as "AnyButton". */ + +#define Button1 1 +#define Button2 2 +#define Button3 3 +#define Button4 4 +#define Button5 5 + +/* Notify modes */ + +#define NotifyNormal 0 +#define NotifyGrab 1 +#define NotifyUngrab 2 +#define NotifyWhileGrabbed 3 + +#define NotifyHint 1 /* for MotionNotify events */ + +/* Notify detail */ + +#define NotifyAncestor 0 +#define NotifyVirtual 1 +#define NotifyInferior 2 +#define NotifyNonlinear 3 +#define NotifyNonlinearVirtual 4 +#define NotifyPointer 5 +#define NotifyPointerRoot 6 +#define NotifyDetailNone 7 + +/* Visibility notify */ + +#define VisibilityUnobscured 0 +#define VisibilityPartiallyObscured 1 +#define VisibilityFullyObscured 2 + +/* Circulation request */ + +#define PlaceOnTop 0 +#define PlaceOnBottom 1 + +/* protocol families */ + +#define FamilyInternet 0 +#define FamilyDECnet 1 +#define FamilyChaos 2 + +/* Property notification */ + +#define PropertyNewValue 0 +#define PropertyDelete 1 + +/* Color Map notification */ + +#define ColormapUninstalled 0 +#define ColormapInstalled 1 + +/* GrabPointer, GrabButton, GrabKeyboard, GrabKey Modes */ + +#define GrabModeSync 0 +#define GrabModeAsync 1 + +/* GrabPointer, GrabKeyboard reply status */ + +#define GrabSuccess 0 +#define AlreadyGrabbed 1 +#define GrabInvalidTime 2 +#define GrabNotViewable 3 +#define GrabFrozen 4 + +/* AllowEvents modes */ + +#define AsyncPointer 0 +#define SyncPointer 1 +#define ReplayPointer 2 +#define AsyncKeyboard 3 +#define SyncKeyboard 4 +#define ReplayKeyboard 5 +#define AsyncBoth 6 +#define SyncBoth 7 + +/* Used in SetInputFocus, GetInputFocus */ + +#define RevertToNone (int)None +#define RevertToPointerRoot (int)PointerRoot +#define RevertToParent 2 + +/***************************************************************** + * ERROR CODES + *****************************************************************/ + +#define Success 0 /* everything's okay */ +#define BadRequest 1 /* bad request code */ +#define BadValue 2 /* int parameter out of range */ +#define BadWindow 3 /* parameter not a Window */ +#define BadPixmap 4 /* parameter not a Pixmap */ +#define BadAtom 5 /* parameter not an Atom */ +#define BadCursor 6 /* parameter not a Cursor */ +#define BadFont 7 /* parameter not a Font */ +#define BadMatch 8 /* parameter mismatch */ +#define BadDrawable 9 /* parameter not a Pixmap or Window */ +#define BadAccess 10 /* depending on context: + - key/button already grabbed + - attempt to free an illegal + cmap entry + - attempt to store into a read-only + color map entry. + - attempt to modify the access control + list from other than the local host. + */ +#define BadAlloc 11 /* insufficient resources */ +#define BadColor 12 /* no such colormap */ +#define BadGC 13 /* parameter not a GC */ +#define BadIDChoice 14 /* choice not in range or already used */ +#define BadName 15 /* font or color name doesn't exist */ +#define BadLength 16 /* Request length incorrect */ +#define BadImplementation 17 /* server is defective */ + +#define FirstExtensionError 128 +#define LastExtensionError 255 + +/***************************************************************** + * WINDOW DEFINITIONS + *****************************************************************/ + +/* Window classes used by CreateWindow */ +/* Note that CopyFromParent is already defined as 0 above */ + +#define InputOutput 1 +#define InputOnly 2 + +/* Window attributes for CreateWindow and ChangeWindowAttributes */ + +#define CWBackPixmap (1L<<0) +#define CWBackPixel (1L<<1) +#define CWBorderPixmap (1L<<2) +#define CWBorderPixel (1L<<3) +#define CWBitGravity (1L<<4) +#define CWWinGravity (1L<<5) +#define CWBackingStore (1L<<6) +#define CWBackingPlanes (1L<<7) +#define CWBackingPixel (1L<<8) +#define CWOverrideRedirect (1L<<9) +#define CWSaveUnder (1L<<10) +#define CWEventMask (1L<<11) +#define CWDontPropagate (1L<<12) +#define CWColormap (1L<<13) +#define CWCursor (1L<<14) + +/* ConfigureWindow structure */ + +#define CWX (1<<0) +#define CWY (1<<1) +#define CWWidth (1<<2) +#define CWHeight (1<<3) +#define CWBorderWidth (1<<4) +#define CWSibling (1<<5) +#define CWStackMode (1<<6) + + +/* Bit Gravity */ + +#define ForgetGravity 0 +#define NorthWestGravity 1 +#define NorthGravity 2 +#define NorthEastGravity 3 +#define WestGravity 4 +#define CenterGravity 5 +#define EastGravity 6 +#define SouthWestGravity 7 +#define SouthGravity 8 +#define SouthEastGravity 9 +#define StaticGravity 10 + +/* Window gravity + bit gravity above */ + +#define UnmapGravity 0 + +/* Used in CreateWindow for backing-store hint */ + +#define NotUseful 0 +#define WhenMapped 1 +#define Always 2 + +/* Used in GetWindowAttributes reply */ + +#define IsUnmapped 0 +#define IsUnviewable 1 +#define IsViewable 2 + +/* Used in ChangeSaveSet */ + +#define SetModeInsert 0 +#define SetModeDelete 1 + +/* Used in ChangeCloseDownMode */ + +#define DestroyAll 0 +#define RetainPermanent 1 +#define RetainTemporary 2 + +/* Window stacking method (in configureWindow) */ + +#define Above 0 +#define Below 1 +#define TopIf 2 +#define BottomIf 3 +#define Opposite 4 + +/* Circulation direction */ + +#define RaiseLowest 0 +#define LowerHighest 1 + +/* Property modes */ + +#define PropModeReplace 0 +#define PropModePrepend 1 +#define PropModeAppend 2 + +/***************************************************************** + * GRAPHICS DEFINITIONS + *****************************************************************/ + +/* graphics functions, as in GC.alu */ + +#define GXclear 0x0 /* 0 */ +#define GXand 0x1 /* src AND dst */ +#define GXandReverse 0x2 /* src AND NOT dst */ +#define GXcopy 0x3 /* src */ +#define GXandInverted 0x4 /* NOT src AND dst */ +#define GXnoop 0x5 /* dst */ +#define GXxor 0x6 /* src XOR dst */ +#define GXor 0x7 /* src OR dst */ +#define GXnor 0x8 /* NOT src AND NOT dst */ +#define GXequiv 0x9 /* NOT src XOR dst */ +#define GXinvert 0xa /* NOT dst */ +#define GXorReverse 0xb /* src OR NOT dst */ +#define GXcopyInverted 0xc /* NOT src */ +#define GXorInverted 0xd /* NOT src OR dst */ +#define GXnand 0xe /* NOT src OR NOT dst */ +#define GXset 0xf /* 1 */ + +/* LineStyle */ + +#define LineSolid 0 +#define LineOnOffDash 1 +#define LineDoubleDash 2 + +/* capStyle */ + +#define CapNotLast 0 +#define CapButt 1 +#define CapRound 2 +#define CapProjecting 3 + +/* joinStyle */ + +#define JoinMiter 0 +#define JoinRound 1 +#define JoinBevel 2 + +/* fillStyle */ + +#define FillSolid 0 +#define FillTiled 1 +#define FillStippled 2 +#define FillOpaqueStippled 3 + +/* fillRule */ + +#define EvenOddRule 0 +#define WindingRule 1 + +/* subwindow mode */ + +#define ClipByChildren 0 +#define IncludeInferiors 1 + +/* SetClipRectangles ordering */ + +#define Unsorted 0 +#define YSorted 1 +#define YXSorted 2 +#define YXBanded 3 + +/* CoordinateMode for drawing routines */ + +#define CoordModeOrigin 0 /* relative to the origin */ +#define CoordModePrevious 1 /* relative to previous point */ + +/* Polygon shapes */ + +#define Complex 0 /* paths may intersect */ +#define Nonconvex 1 /* no paths intersect, but not convex */ +#define Convex 2 /* wholly convex */ + +/* Arc modes for PolyFillArc */ + +#define ArcChord 0 /* join endpoints of arc */ +#define ArcPieSlice 1 /* join endpoints to center of arc */ + +/* GC components: masks used in CreateGC, CopyGC, ChangeGC, OR'ed into + GC.stateChanges */ + +#define GCFunction (1L<<0) +#define GCPlaneMask (1L<<1) +#define GCForeground (1L<<2) +#define GCBackground (1L<<3) +#define GCLineWidth (1L<<4) +#define GCLineStyle (1L<<5) +#define GCCapStyle (1L<<6) +#define GCJoinStyle (1L<<7) +#define GCFillStyle (1L<<8) +#define GCFillRule (1L<<9) +#define GCTile (1L<<10) +#define GCStipple (1L<<11) +#define GCTileStipXOrigin (1L<<12) +#define GCTileStipYOrigin (1L<<13) +#define GCFont (1L<<14) +#define GCSubwindowMode (1L<<15) +#define GCGraphicsExposures (1L<<16) +#define GCClipXOrigin (1L<<17) +#define GCClipYOrigin (1L<<18) +#define GCClipMask (1L<<19) +#define GCDashOffset (1L<<20) +#define GCDashList (1L<<21) +#define GCArcMode (1L<<22) + +#define GCLastBit 22 +/***************************************************************** + * FONTS + *****************************************************************/ + +/* used in QueryFont -- draw direction */ + +#define FontLeftToRight 0 +#define FontRightToLeft 1 + +#define FontChange 255 + +/***************************************************************** + * IMAGING + *****************************************************************/ + +/* ImageFormat -- PutImage, GetImage */ + +#define XYBitmap 0 /* depth 1, XYFormat */ +#define XYPixmap 1 /* depth == drawable depth */ +#define ZPixmap 2 /* depth == drawable depth */ + +/***************************************************************** + * COLOR MAP STUFF + *****************************************************************/ + +/* For CreateColormap */ + +#define AllocNone 0 /* create map with no entries */ +#define AllocAll 1 /* allocate entire map writeable */ + + +/* Flags used in StoreNamedColor, StoreColors */ + +#define DoRed (1<<0) +#define DoGreen (1<<1) +#define DoBlue (1<<2) + +/***************************************************************** + * CURSOR STUFF + *****************************************************************/ + +/* QueryBestSize Class */ + +#define CursorShape 0 /* largest size that can be displayed */ +#define TileShape 1 /* size tiled fastest */ +#define StippleShape 2 /* size stippled fastest */ + +/***************************************************************** + * KEYBOARD/POINTER STUFF + *****************************************************************/ + +#define AutoRepeatModeOff 0 +#define AutoRepeatModeOn 1 +#define AutoRepeatModeDefault 2 + +#define LedModeOff 0 +#define LedModeOn 1 + +/* masks for ChangeKeyboardControl */ + +#define KBKeyClickPercent (1L<<0) +#define KBBellPercent (1L<<1) +#define KBBellPitch (1L<<2) +#define KBBellDuration (1L<<3) +#define KBLed (1L<<4) +#define KBLedMode (1L<<5) +#define KBKey (1L<<6) +#define KBAutoRepeatMode (1L<<7) + +#define MappingSuccess 0 +#define MappingBusy 1 +#define MappingFailed 2 + +#define MappingModifier 0 +#define MappingKeyboard 1 +#define MappingPointer 2 + +/***************************************************************** + * SCREEN SAVER STUFF + *****************************************************************/ + +#define DontPreferBlanking 0 +#define PreferBlanking 1 +#define DefaultBlanking 2 + +#define DisableScreenSaver 0 +#define DisableScreenInterval 0 + +#define DontAllowExposures 0 +#define AllowExposures 1 +#define DefaultExposures 2 + +/* for ForceScreenSaver */ + +#define ScreenSaverReset 0 +#define ScreenSaverActive 1 + +/***************************************************************** + * HOSTS AND CONNECTIONS + *****************************************************************/ + +/* for ChangeHosts */ + +#define HostInsert 0 +#define HostDelete 1 + +/* for ChangeAccessControl */ + +#define EnableAccess 1 +#define DisableAccess 0 + +/* Display classes used in opening the connection + * Note that the statically allocated ones are even numbered and the + * dynamically changeable ones are odd numbered */ + +#define StaticGray 0 +#define GrayScale 1 +#define StaticColor 2 +#define PseudoColor 3 +#define TrueColor 4 +#define DirectColor 5 + + +/* Byte order used in imageByteOrder and bitmapBitOrder */ + +#define LSBFirst 0 +#define MSBFirst 1 + +#if defined(MAC_OSX_TK) +# undef Cursor +# undef Region +#endif + +#endif /* X_H */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xatom.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xatom.h new file mode 100644 index 00000000..485a4236 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xatom.h @@ -0,0 +1,79 @@ +#ifndef XATOM_H +#define XATOM_H 1 + +/* THIS IS A GENERATED FILE + * + * Do not change! Changing this file implies a protocol change! + */ + +#define XA_PRIMARY ((Atom) 1) +#define XA_SECONDARY ((Atom) 2) +#define XA_ARC ((Atom) 3) +#define XA_ATOM ((Atom) 4) +#define XA_BITMAP ((Atom) 5) +#define XA_CARDINAL ((Atom) 6) +#define XA_COLORMAP ((Atom) 7) +#define XA_CURSOR ((Atom) 8) +#define XA_CUT_BUFFER0 ((Atom) 9) +#define XA_CUT_BUFFER1 ((Atom) 10) +#define XA_CUT_BUFFER2 ((Atom) 11) +#define XA_CUT_BUFFER3 ((Atom) 12) +#define XA_CUT_BUFFER4 ((Atom) 13) +#define XA_CUT_BUFFER5 ((Atom) 14) +#define XA_CUT_BUFFER6 ((Atom) 15) +#define XA_CUT_BUFFER7 ((Atom) 16) +#define XA_DRAWABLE ((Atom) 17) +#define XA_FONT ((Atom) 18) +#define XA_INTEGER ((Atom) 19) +#define XA_PIXMAP ((Atom) 20) +#define XA_POINT ((Atom) 21) +#define XA_RECTANGLE ((Atom) 22) +#define XA_RESOURCE_MANAGER ((Atom) 23) +#define XA_RGB_COLOR_MAP ((Atom) 24) +#define XA_RGB_BEST_MAP ((Atom) 25) +#define XA_RGB_BLUE_MAP ((Atom) 26) +#define XA_RGB_DEFAULT_MAP ((Atom) 27) +#define XA_RGB_GRAY_MAP ((Atom) 28) +#define XA_RGB_GREEN_MAP ((Atom) 29) +#define XA_RGB_RED_MAP ((Atom) 30) +#define XA_STRING ((Atom) 31) +#define XA_VISUALID ((Atom) 32) +#define XA_WINDOW ((Atom) 33) +#define XA_WM_COMMAND ((Atom) 34) +#define XA_WM_HINTS ((Atom) 35) +#define XA_WM_CLIENT_MACHINE ((Atom) 36) +#define XA_WM_ICON_NAME ((Atom) 37) +#define XA_WM_ICON_SIZE ((Atom) 38) +#define XA_WM_NAME ((Atom) 39) +#define XA_WM_NORMAL_HINTS ((Atom) 40) +#define XA_WM_SIZE_HINTS ((Atom) 41) +#define XA_WM_ZOOM_HINTS ((Atom) 42) +#define XA_MIN_SPACE ((Atom) 43) +#define XA_NORM_SPACE ((Atom) 44) +#define XA_MAX_SPACE ((Atom) 45) +#define XA_END_SPACE ((Atom) 46) +#define XA_SUPERSCRIPT_X ((Atom) 47) +#define XA_SUPERSCRIPT_Y ((Atom) 48) +#define XA_SUBSCRIPT_X ((Atom) 49) +#define XA_SUBSCRIPT_Y ((Atom) 50) +#define XA_UNDERLINE_POSITION ((Atom) 51) +#define XA_UNDERLINE_THICKNESS ((Atom) 52) +#define XA_STRIKEOUT_ASCENT ((Atom) 53) +#define XA_STRIKEOUT_DESCENT ((Atom) 54) +#define XA_ITALIC_ANGLE ((Atom) 55) +#define XA_X_HEIGHT ((Atom) 56) +#define XA_QUAD_WIDTH ((Atom) 57) +#define XA_WEIGHT ((Atom) 58) +#define XA_POINT_SIZE ((Atom) 59) +#define XA_RESOLUTION ((Atom) 60) +#define XA_COPYRIGHT ((Atom) 61) +#define XA_NOTICE ((Atom) 62) +#define XA_FONT_NAME ((Atom) 63) +#define XA_FAMILY_NAME ((Atom) 64) +#define XA_FULL_NAME ((Atom) 65) +#define XA_CAP_HEIGHT ((Atom) 66) +#define XA_WM_CLASS ((Atom) 67) +#define XA_WM_TRANSIENT_FOR ((Atom) 68) + +#define XA_LAST_PREDEFINED ((Atom) 68) +#endif /* XATOM_H */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xfuncproto.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xfuncproto.h new file mode 100644 index 00000000..6d63002e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xfuncproto.h @@ -0,0 +1,60 @@ +/* $XConsortium: Xfuncproto.h,v 1.7 91/05/13 20:49:21 rws Exp $ */ +/* + * Copyright 1989, 1991 by the Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + */ + +/* Definitions to make function prototypes manageable */ + +#ifndef _XFUNCPROTO_H_ +#define _XFUNCPROTO_H_ + +#ifndef NeedFunctionPrototypes +#define NeedFunctionPrototypes 1 +#endif /* NeedFunctionPrototypes */ + +#ifndef NeedVarargsPrototypes +#define NeedVarargsPrototypes 0 +#endif /* NeedVarargsPrototypes */ + +#if NeedFunctionPrototypes + +#ifndef NeedNestedPrototypes +#define NeedNestedPrototypes 1 +#endif /* NeedNestedPrototypes */ + +#ifndef _Xconst +#define _Xconst const +#endif /* _Xconst */ + +#ifndef NeedWidePrototypes +#ifdef NARROWPROTO +#define NeedWidePrototypes 0 +#else +#define NeedWidePrototypes 1 /* default to make interropt. easier */ +#endif +#endif /* NeedWidePrototypes */ + +#endif /* NeedFunctionPrototypes */ + +#ifdef __cplusplus +#define _XFUNCPROTOBEGIN extern "C" { +#define _XFUNCPROTOEND } +#endif + +#ifndef _XFUNCPROTOBEGIN +#define _XFUNCPROTOBEGIN +#define _XFUNCPROTOEND +#endif /* _XFUNCPROTOBEGIN */ + +#endif /* _XFUNCPROTO_H_ */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xlib.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xlib.h new file mode 100644 index 00000000..667bdc77 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xlib.h @@ -0,0 +1,1205 @@ +/* $XConsortium: Xlib.h,v 11.221 93/07/02 14:13:28 gildea Exp $ */ +/* + * Copyright 1985, 1986, 1987, 1991 by the Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * X Window System is a Trademark of MIT. + * + */ + + +/* + * Xlib.h - Header definition and support file for the C subroutine + * interface library (Xlib) to the X Window System Protocol (V11). + * Structures and symbols starting with "_" are private to the library. + */ +#ifndef _XLIB_H_ +#define _XLIB_H_ + +#define XlibSpecificationRelease 5 + +#if !defined(MAC_OSX_TK) +# include +#endif +#ifdef MAC_OSX_TK +# include +# define Cursor XCursor +# define Region XRegion +#endif + +/* applications should not depend on these two headers being included! */ +#include + +#ifndef X_WCHAR +#ifdef X_NOT_STDC_ENV +#define X_WCHAR +#endif +#endif + +#ifndef X_WCHAR +#include +#else +/* replace this with #include or typedef appropriate for your system */ +typedef unsigned long wchar_t; +#endif + +typedef char *XPointer; + +#define Bool int +#if defined(MAC_OSX_TK) +/* Use define rather than typedef, since may need to undefine this later */ +#define Status int +#else +typedef int Status; +#endif +#define True 1 +#define False 0 + +#define QueuedAlready 0 +#define QueuedAfterReading 1 +#define QueuedAfterFlush 2 + +#define ConnectionNumber(dpy) ((dpy)->fd) +#define RootWindow(dpy, scr) (((dpy)->screens[(scr)]).root) +#define DefaultScreen(dpy) ((dpy)->default_screen) +#define DefaultRootWindow(dpy) (((dpy)->screens[(dpy)->default_screen]).root) +#define DefaultVisual(dpy, scr) (((dpy)->screens[(scr)]).root_visual) +#define DefaultGC(dpy, scr) (((dpy)->screens[(scr)]).default_gc) +#define BlackPixel(dpy, scr) (((dpy)->screens[(scr)]).black_pixel) +#define WhitePixel(dpy, scr) (((dpy)->screens[(scr)]).white_pixel) +#define AllPlanes ((unsigned long)~0L) +#define QLength(dpy) ((dpy)->qlen) +#define DisplayWidth(dpy, scr) (((dpy)->screens[(scr)]).width) +#define DisplayHeight(dpy, scr) (((dpy)->screens[(scr)]).height) +#define DisplayWidthMM(dpy, scr)(((dpy)->screens[(scr)]).mwidth) +#define DisplayHeightMM(dpy, scr)(((dpy)->screens[(scr)]).mheight) +#define DisplayPlanes(dpy, scr) (((dpy)->screens[(scr)]).root_depth) +#define DisplayCells(dpy, scr) (DefaultVisual((dpy), (scr))->map_entries) +#define ScreenCount(dpy) ((dpy)->nscreens) +#define ServerVendor(dpy) ((dpy)->vendor) +#define ProtocolVersion(dpy) ((dpy)->proto_major_version) +#define ProtocolRevision(dpy) ((dpy)->proto_minor_version) +#define VendorRelease(dpy) ((dpy)->release) +#define DisplayString(dpy) ((dpy)->display_name) +#define DefaultDepth(dpy, scr) (((dpy)->screens[(scr)]).root_depth) +#define DefaultColormap(dpy, scr)(((dpy)->screens[(scr)]).cmap) +#define BitmapUnit(dpy) ((dpy)->bitmap_unit) +#define BitmapBitOrder(dpy) ((dpy)->bitmap_bit_order) +#define BitmapPad(dpy) ((dpy)->bitmap_pad) +#define ImageByteOrder(dpy) ((dpy)->byte_order) +#define NextRequest(dpy) ((dpy)->request + 1) +#define LastKnownRequestProcessed(dpy) ((dpy)->request) + +/* macros for screen oriented applications (toolkit) */ +#define ScreenOfDisplay(dpy, scr)(&((dpy)->screens[(scr)])) +#define DefaultScreenOfDisplay(dpy) (&((dpy)->screens[(dpy)->default_screen])) +#define DisplayOfScreen(s) ((s)->display) +#define RootWindowOfScreen(s) ((s)->root) +#define BlackPixelOfScreen(s) ((s)->black_pixel) +#define WhitePixelOfScreen(s) ((s)->white_pixel) +#define DefaultColormapOfScreen(s)((s)->cmap) +#define DefaultDepthOfScreen(s) ((s)->root_depth) +#define DefaultGCOfScreen(s) ((s)->default_gc) +#define DefaultVisualOfScreen(s)((s)->root_visual) +#define WidthOfScreen(s) ((s)->width) +#define HeightOfScreen(s) ((s)->height) +#define WidthMMOfScreen(s) ((s)->mwidth) +#define HeightMMOfScreen(s) ((s)->mheight) +#define PlanesOfScreen(s) ((s)->root_depth) +#define CellsOfScreen(s) (DefaultVisualOfScreen((s))->map_entries) +#define MinCmapsOfScreen(s) ((s)->min_maps) +#define MaxCmapsOfScreen(s) ((s)->max_maps) +#define DoesSaveUnders(s) ((s)->save_unders) +#define DoesBackingStore(s) ((s)->backing_store) +#define EventMaskOfScreen(s) ((s)->root_input_mask) + +/* + * Extensions need a way to hang private data on some structures. + */ +typedef struct _XExtData { + int number; /* number returned by XRegisterExtension */ + struct _XExtData *next; /* next item on list of data for structure */ + int (*free_private)(); /* called to free private storage */ + XPointer private_data; /* data private to this extension. */ +} XExtData; + +/* + * This file contains structures used by the extension mechanism. + */ +typedef struct { /* public to extension, cannot be changed */ + int extension; /* extension number */ + int major_opcode; /* major op-code assigned by server */ + int first_event; /* first event number for the extension */ + int first_error; /* first error number for the extension */ +} XExtCodes; + +/* + * Data structure for retrieving info about pixmap formats. + */ + +typedef struct { + int depth; + int bits_per_pixel; + int scanline_pad; +} XPixmapFormatValues; + + +/* + * Data structure for setting graphics context. + */ +typedef struct { + int function; /* logical operation */ + unsigned long plane_mask;/* plane mask */ + unsigned long foreground;/* foreground pixel */ + unsigned long background;/* background pixel */ + int line_width; /* line width */ + int line_style; /* LineSolid, LineOnOffDash, LineDoubleDash */ + int cap_style; /* CapNotLast, CapButt, + CapRound, CapProjecting */ + int join_style; /* JoinMiter, JoinRound, JoinBevel */ + int fill_style; /* FillSolid, FillTiled, + FillStippled, FillOpaeueStippled */ + int fill_rule; /* EvenOddRule, WindingRule */ + int arc_mode; /* ArcChord, ArcPieSlice */ + Pixmap tile; /* tile pixmap for tiling operations */ + Pixmap stipple; /* stipple 1 plane pixmap for stipping */ + int ts_x_origin; /* offset for tile or stipple operations */ + int ts_y_origin; + Font font; /* default text font for text operations */ + int subwindow_mode; /* ClipByChildren, IncludeInferiors */ + Bool graphics_exposures;/* boolean, should exposures be generated */ + int clip_x_origin; /* origin for clipping */ + int clip_y_origin; + Pixmap clip_mask; /* bitmap clipping; other calls for rects */ + int dash_offset; /* patterned/dashed line information */ + char dashes; +} XGCValues; + +/* + * Graphics context. The contents of this structure are implementation + * dependent. A GC should be treated as opaque by application code. + */ + +typedef XGCValues *GC; + +/* + * Visual structure; contains information about colormapping possible. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + VisualID visualid; /* visual id of this visual */ +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ class of screen (monochrome, etc.) */ +#else + int class; /* class of screen (monochrome, etc.) */ +#endif + unsigned long red_mask, green_mask, blue_mask; /* mask values */ + int bits_per_rgb; /* log base 2 of distinct color values */ + int map_entries; /* color map entries */ +} Visual; + +/* + * Depth structure; contains information for each possible depth. + */ +typedef struct { + int depth; /* this depth (Z) of the depth */ + int nvisuals; /* number of Visual types at this depth */ + Visual *visuals; /* list of visuals possible at this depth */ +} Depth; + +/* + * Information about the screen. The contents of this structure are + * implementation dependent. A Screen should be treated as opaque + * by application code. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + struct _XDisplay *display;/* back pointer to display structure */ + Window root; /* Root window id. */ + int width, height; /* width and height of screen */ + int mwidth, mheight; /* width and height of in millimeters */ + int ndepths; /* number of depths possible */ + Depth *depths; /* list of allowable depths on the screen */ + int root_depth; /* bits per pixel */ + Visual *root_visual; /* root visual */ + GC default_gc; /* GC for the root root visual */ + Colormap cmap; /* default color map */ + unsigned long white_pixel; + unsigned long black_pixel; /* White and Black pixel values */ + int max_maps, min_maps; /* max and min color maps */ + int backing_store; /* Never, WhenMapped, Always */ + Bool save_unders; + long root_input_mask; /* initial root input mask */ +} Screen; + +/* + * Format structure; describes ZFormat data the screen will understand. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + int depth; /* depth of this image format */ + int bits_per_pixel; /* bits/pixel at this depth */ + int scanline_pad; /* scanline must padded to this multiple */ +} ScreenFormat; + +/* + * Data structure for setting window attributes. + */ +typedef struct { + Pixmap background_pixmap; /* background or None or ParentRelative */ + unsigned long background_pixel; /* background pixel */ + Pixmap border_pixmap; /* border of the window */ + unsigned long border_pixel; /* border pixel value */ + int bit_gravity; /* one of bit gravity values */ + int win_gravity; /* one of the window gravity values */ + int backing_store; /* NotUseful, WhenMapped, Always */ + unsigned long backing_planes;/* planes to be preseved if possible */ + unsigned long backing_pixel;/* value to use in restoring planes */ + Bool save_under; /* should bits under be saved? (popups) */ + long event_mask; /* set of events that should be saved */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Colormap colormap; /* color map to be associated with window */ + Cursor cursor; /* cursor to be displayed (or None) */ +} XSetWindowAttributes; + +typedef struct { + int x, y; /* location of window */ + int width, height; /* width and height of window */ + int border_width; /* border width of window */ + int depth; /* depth of window */ + Visual *visual; /* the associated visual structure */ + Window root; /* root of screen containing window */ +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ InputOutput, InputOnly*/ +#else + int class; /* InputOutput, InputOnly*/ +#endif + int bit_gravity; /* one of bit gravity values */ + int win_gravity; /* one of the window gravity values */ + int backing_store; /* NotUseful, WhenMapped, Always */ + unsigned long backing_planes;/* planes to be preserved if possible */ + unsigned long backing_pixel;/* value to be used when restoring planes */ + Bool save_under; /* boolean, should bits under be saved? */ + Colormap colormap; /* color map to be associated with window */ + Bool map_installed; /* boolean, is color map currently installed*/ + int map_state; /* IsUnmapped, IsUnviewable, IsViewable */ + long all_event_masks; /* set of events all people have interest in*/ + long your_event_mask; /* my event mask */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Screen *screen; /* back pointer to correct screen */ +} XWindowAttributes; + +/* + * Data structure for host setting; getting routines. + * + */ + +typedef struct { + int family; /* for example FamilyInternet */ + int length; /* length of address, in bytes */ + char *address; /* pointer to where to find the bytes */ +} XHostAddress; + +/* + * Data structure for "image" data, used by image manipulation routines. + */ +typedef struct _XImage { + int width, height; /* size of image */ + int xoffset; /* number of pixels offset in X direction */ + int format; /* XYBitmap, XYPixmap, ZPixmap */ + char *data; /* pointer to image data */ + int byte_order; /* data byte order, LSBFirst, MSBFirst */ + int bitmap_unit; /* quant. of scanline 8, 16, 32 */ + int bitmap_bit_order; /* LSBFirst, MSBFirst */ + int bitmap_pad; /* 8, 16, 32 either XY or ZPixmap */ + int depth; /* depth of image */ + int bytes_per_line; /* accelarator to next line */ + int bits_per_pixel; /* bits per pixel (ZPixmap) */ + unsigned long red_mask; /* bits in z arrangment */ + unsigned long green_mask; + unsigned long blue_mask; + XPointer obdata; /* hook for the object routines to hang on */ + struct funcs { /* image manipulation routines */ + struct _XImage *(*create_image)(); +#if NeedFunctionPrototypes + int (*destroy_image) (struct _XImage *); + unsigned long (*get_pixel) (struct _XImage *, int, int); + int (*put_pixel) (struct _XImage *, int, int, unsigned long); + struct _XImage *(*sub_image)(struct _XImage *, int, int, unsigned int, unsigned int); + int (*add_pixel) (struct _XImage *, long); +#else + int (*destroy_image)(); + unsigned long (*get_pixel)(); + int (*put_pixel)(); + struct _XImage *(*sub_image)(); + int (*add_pixel)(); +#endif + } f; +} XImage; + +/* + * Data structure for XReconfigureWindow + */ +typedef struct { + int x, y; + int width, height; + int border_width; + Window sibling; + int stack_mode; +} XWindowChanges; + +/* + * Data structure used by color operations + */ +typedef struct { + unsigned long pixel; + unsigned short red, green, blue; + char flags; /* do_red, do_green, do_blue */ + char pad; +} XColor; + +/* + * Data structures for graphics operations. On most machines, these are + * congruent with the wire protocol structures, so reformatting the data + * can be avoided on these architectures. + */ +typedef struct { + short x1, y1, x2, y2; +} XSegment; + +typedef struct { + short x, y; +} XPoint; + +typedef struct { + short x, y; + unsigned short width, height; +} XRectangle; + +typedef struct { + short x, y; + unsigned short width, height; + short angle1, angle2; +} XArc; + + +/* Data structure for XChangeKeyboardControl */ + +typedef struct { + int key_click_percent; + int bell_percent; + int bell_pitch; + int bell_duration; + int led; + int led_mode; + int key; + int auto_repeat_mode; /* On, Off, Default */ +} XKeyboardControl; + +/* Data structure for XGetKeyboardControl */ + +typedef struct { + int key_click_percent; + int bell_percent; + unsigned int bell_pitch, bell_duration; + unsigned long led_mask; + int global_auto_repeat; + char auto_repeats[32]; +} XKeyboardState; + +/* Data structure for XGetMotionEvents. */ + +typedef struct { + Time time; + short x, y; +} XTimeCoord; + +/* Data structure for X{Set,Get}ModifierMapping */ + +typedef struct { + int max_keypermod; /* The server's max # of keys per modifier */ + KeyCode *modifiermap; /* An 8 by max_keypermod array of modifiers */ +} XModifierKeymap; + + +/* + * Display datatype maintaining display specific data. + * The contents of this structure are implementation dependent. + * A Display should be treated as opaque by application code. + */ +typedef struct _XDisplay { + XExtData *ext_data; /* hook for extension to hang data */ + struct _XFreeFuncs *free_funcs; /* internal free functions */ + int fd; /* Network socket. */ + int conn_checker; /* ugly thing used by _XEventsQueued */ + int proto_major_version;/* maj. version of server's X protocol */ + int proto_minor_version;/* minor version of servers X protocol */ + char *vendor; /* vendor of the server hardware */ + XID resource_base; /* resource ID base */ + XID resource_mask; /* resource ID mask bits */ + XID resource_id; /* allocator current ID */ + int resource_shift; /* allocator shift to correct bits */ + XID (*resource_alloc)(); /* allocator function */ + int byte_order; /* screen byte order, LSBFirst, MSBFirst */ + int bitmap_unit; /* padding and data requirements */ + int bitmap_pad; /* padding requirements on bitmaps */ + int bitmap_bit_order; /* LeastSignificant or MostSignificant */ + int nformats; /* number of pixmap formats in list */ + ScreenFormat *pixmap_format; /* pixmap format list */ + int vnumber; /* Xlib's X protocol version number. */ + int release; /* release of the server */ + struct _XSQEvent *head, *tail; /* Input event queue. */ + int qlen; /* Length of input event queue */ + unsigned long request; /* sequence number of last request. */ + char *last_req; /* beginning of last request, or dummy */ + char *buffer; /* Output buffer starting address. */ + char *bufptr; /* Output buffer index pointer. */ + char *bufmax; /* Output buffer maximum+1 address. */ + unsigned max_request_size; /* maximum number 32 bit words in request*/ + struct _XrmHashBucketRec *db; + int (*synchandler)(); /* Synchronization handler */ + char *display_name; /* "host:display" string used on this connect*/ + int default_screen; /* default screen for operations */ + int nscreens; /* number of screens on this server*/ + Screen *screens; /* pointer to list of screens */ + unsigned long motion_buffer; /* size of motion buffer */ + unsigned long flags; /* internal connection flags */ + int min_keycode; /* minimum defined keycode */ + int max_keycode; /* maximum defined keycode */ + KeySym *keysyms; /* This server's keysyms */ + XModifierKeymap *modifiermap; /* This server's modifier keymap */ + int keysyms_per_keycode;/* number of rows */ + char *xdefaults; /* contents of defaults from server */ + char *scratch_buffer; /* place to hang scratch buffer */ + unsigned long scratch_length; /* length of scratch buffer */ + int ext_number; /* extension number on this display */ + struct _XExten *ext_procs; /* extensions initialized on this display */ + /* + * the following can be fixed size, as the protocol defines how + * much address space is available. + * While this could be done using the extension vector, there + * may be MANY events processed, so a search through the extension + * list to find the right procedure for each event might be + * expensive if many extensions are being used. + */ + Bool (*event_vec[128])(); /* vector for wire to event */ + Status (*wire_vec[128])(); /* vector for event to wire */ + KeySym lock_meaning; /* for XLookupString */ + struct _XLockInfo *lock; /* multi-thread state, display lock */ + struct _XInternalAsync *async_handlers; /* for internal async */ + unsigned long bigreq_size; /* max size of big requests */ + struct _XLockPtrs *lock_fns; /* pointers to threads functions */ + /* things above this line should not move, for binary compatibility */ + struct _XKeytrans *key_bindings; /* for XLookupString */ + Font cursor_font; /* for XCreateFontCursor */ + struct _XDisplayAtoms *atoms; /* for XInternAtom */ + unsigned int mode_switch; /* keyboard group modifiers */ + struct _XContextDB *context_db; /* context database */ + Bool (**error_vec)(); /* vector for wire to error */ + /* + * Xcms information + */ + struct { + XPointer defaultCCCs; /* pointer to an array of default XcmsCCC */ + XPointer clientCmaps; /* pointer to linked list of XcmsCmapRec */ + XPointer perVisualIntensityMaps; + /* linked list of XcmsIntensityMap */ + } cms; + struct _XIMFilter *im_filters; + struct _XSQEvent *qfree; /* unallocated event queue elements */ + unsigned long next_event_serial_num; /* inserted into next queue elt */ + int (*savedsynchandler)(); /* user synchandler when Xlib usurps */ +} Display; + +#if NeedFunctionPrototypes /* prototypes require event type definitions */ +#undef _XEVENT_ +#endif +#ifndef _XEVENT_ + +#define XMaxTransChars 4 + +/* + * Definitions of specific events. + */ +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window it is reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int keycode; /* detail */ + Bool same_screen; /* same screen flag */ + char trans_chars[XMaxTransChars]; + /* translated characters */ + int nbytes; +} XKeyEvent; +typedef XKeyEvent XKeyPressedEvent; +typedef XKeyEvent XKeyReleasedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window it is reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int button; /* detail */ + Bool same_screen; /* same screen flag */ +} XButtonEvent; +typedef XButtonEvent XButtonPressedEvent; +typedef XButtonEvent XButtonReleasedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + char is_hint; /* detail */ + Bool same_screen; /* same screen flag */ +} XMotionEvent; +typedef XMotionEvent XPointerMovedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonlinear,NotifyNonlinearVirtual + */ + Bool same_screen; /* same screen flag */ + Bool focus; /* boolean focus */ + unsigned int state; /* key or button mask */ +} XCrossingEvent; +typedef XCrossingEvent XEnterWindowEvent; +typedef XCrossingEvent XLeaveWindowEvent; + +typedef struct { + int type; /* FocusIn or FocusOut */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window of event */ + int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonlinear,NotifyNonlinearVirtual, NotifyPointer, + * NotifyPointerRoot, NotifyDetailNone + */ +} XFocusChangeEvent; +typedef XFocusChangeEvent XFocusInEvent; +typedef XFocusChangeEvent XFocusOutEvent; + +/* generated on EnterWindow and FocusIn when KeyMapState selected */ +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + char key_vector[32]; +} XKeymapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int x, y; + int width, height; + int count; /* if non-zero, at least this many more */ +} XExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; + int x, y; + int width, height; + int count; /* if non-zero, at least this many more */ + int major_code; /* core is CopyArea or CopyPlane */ + int minor_code; /* not defined in the core */ +} XGraphicsExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; + int major_code; /* core is CopyArea or CopyPlane */ + int minor_code; /* not defined in the core */ +} XNoExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int state; /* Visibility state */ +} XVisibilityEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; /* parent of the window */ + Window window; /* window id of window created */ + int x, y; /* window location */ + int width, height; /* size of window */ + int border_width; /* border width */ + Bool override_redirect; /* creation should be overridden */ +} XCreateWindowEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; +} XDestroyWindowEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Bool from_configure; +} XUnmapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Bool override_redirect; /* boolean, is override set... */ +} XMapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; +} XMapRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Window parent; + int x, y; + Bool override_redirect; +} XReparentEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int x, y; + int width, height; + int border_width; + Window above; + Bool override_redirect; +} XConfigureEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int x, y; +} XGravityEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int width, height; +} XResizeRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; + int x, y; + int width, height; + int border_width; + Window above; + int detail; /* Above, Below, TopIf, BottomIf, Opposite */ + unsigned long value_mask; +} XConfigureRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int place; /* PlaceOnTop, PlaceOnBottom */ +} XCirculateEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; + int place; /* PlaceOnTop, PlaceOnBottom */ +} XCirculateRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom atom; + Time time; + int state; /* NewValue, Deleted */ +} XPropertyEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom selection; + Time time; +} XSelectionClearEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window owner; + Window requestor; + Atom selection; + Atom target; + Atom property; + Time time; +} XSelectionRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window requestor; + Atom selection; + Atom target; + Atom property; /* ATOM or None */ + Time time; +} XSelectionEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Colormap colormap; /* COLORMAP or None */ +#if defined(__cplusplus) || defined(c_plusplus) + Bool c_new; /* C++ */ +#else + Bool new; +#endif + int state; /* ColormapInstalled, ColormapUninstalled */ +} XColormapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom message_type; + int format; + union { + char b[20]; + short s[10]; + long l[5]; + } data; +} XClientMessageEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* unused */ + int request; /* one of MappingModifier, MappingKeyboard, + MappingPointer */ + int first_keycode; /* first keycode */ + int count; /* defines range of change w. first_keycode*/ +} XMappingEvent; + +typedef struct { + int type; + Display *display; /* Display the event was read from */ + XID resourceid; /* resource id */ + unsigned long serial; /* serial number of failed request */ + unsigned char error_code; /* error code of failed request */ + unsigned char request_code; /* Major op-code of failed request */ + unsigned char minor_code; /* Minor op-code of failed request */ +} XErrorEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display;/* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ +} XAnyEvent; + +/* + * this union is defined so Xlib can always use the same sized + * event structure internally, to avoid memory fragmentation. + */ +typedef union _XEvent { + int type; /* must not be changed; first element */ + XAnyEvent xany; + XKeyEvent xkey; + XButtonEvent xbutton; + XMotionEvent xmotion; + XCrossingEvent xcrossing; + XFocusChangeEvent xfocus; + XExposeEvent xexpose; + XGraphicsExposeEvent xgraphicsexpose; + XNoExposeEvent xnoexpose; + XVisibilityEvent xvisibility; + XCreateWindowEvent xcreatewindow; + XDestroyWindowEvent xdestroywindow; + XUnmapEvent xunmap; + XMapEvent xmap; + XMapRequestEvent xmaprequest; + XReparentEvent xreparent; + XConfigureEvent xconfigure; + XGravityEvent xgravity; + XResizeRequestEvent xresizerequest; + XConfigureRequestEvent xconfigurerequest; + XCirculateEvent xcirculate; + XCirculateRequestEvent xcirculaterequest; + XPropertyEvent xproperty; + XSelectionClearEvent xselectionclear; + XSelectionRequestEvent xselectionrequest; + XSelectionEvent xselection; + XColormapEvent xcolormap; + XClientMessageEvent xclient; + XMappingEvent xmapping; + XErrorEvent xerror; + XKeymapEvent xkeymap; + long pad[24]; +} XEvent; +#endif + +#define XAllocID(dpy) ((*(dpy)->resource_alloc)((dpy))) + +/* + * per character font metric information. + */ +typedef struct { + short lbearing; /* origin to left edge of raster */ + short rbearing; /* origin to right edge of raster */ + short width; /* advance to next char's origin */ + short ascent; /* baseline to top edge of raster */ + short descent; /* baseline to bottom edge of raster */ + unsigned short attributes; /* per char flags (not predefined) */ +} XCharStruct; + +/* + * To allow arbitrary information with fonts, there are additional properties + * returned. + */ +typedef struct { + Atom name; + unsigned long card32; +} XFontProp; + +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + Font fid; /* Font id for this font */ + unsigned direction; /* hint about direction the font is painted */ + unsigned min_char_or_byte2;/* first character */ + unsigned max_char_or_byte2;/* last character */ + unsigned min_byte1; /* first row that exists */ + unsigned max_byte1; /* last row that exists */ + Bool all_chars_exist;/* flag if all characters have non-zero size*/ + unsigned default_char; /* char to print for undefined character */ + int n_properties; /* how many properties there are */ + XFontProp *properties; /* pointer to array of additional properties*/ + XCharStruct min_bounds; /* minimum bounds over all existing char*/ + XCharStruct max_bounds; /* maximum bounds over all existing char*/ + XCharStruct *per_char; /* first_char to last_char information */ + int ascent; /* log. extent above baseline for spacing */ + int descent; /* log. descent below baseline for spacing */ +} XFontStruct; + +/* + * PolyText routines take these as arguments. + */ +typedef struct { + char *chars; /* pointer to string */ + int nchars; /* number of characters */ + int delta; /* delta between strings */ + Font font; /* font to print it in, None don't change */ +} XTextItem; + +typedef struct { /* normal 16 bit characters are two bytes */ + unsigned char byte1; + unsigned char byte2; +} XChar2b; + +typedef struct { + XChar2b *chars; /* two byte characters */ + int nchars; /* number of characters */ + int delta; /* delta between strings */ + Font font; /* font to print it in, None don't change */ +} XTextItem16; + + +typedef union { Display *display; + GC gc; + Visual *visual; + Screen *screen; + ScreenFormat *pixmap_format; + XFontStruct *font; } XEDataObject; + +typedef struct { + XRectangle max_ink_extent; + XRectangle max_logical_extent; +} XFontSetExtents; + +typedef struct _XFontSet *XFontSet; + +typedef struct { + char *chars; + int nchars; + int delta; + XFontSet font_set; +} XmbTextItem; + +typedef struct { + wchar_t *chars; + int nchars; + int delta; + XFontSet font_set; +} XwcTextItem; + +typedef void (*XIMProc)(); + +typedef struct _XIM *XIM; +typedef struct _XIC *XIC; + +typedef unsigned long XIMStyle; + +typedef struct { + unsigned short count_styles; + XIMStyle *supported_styles; +} XIMStyles; + +#define XIMPreeditArea 0x0001L +#define XIMPreeditCallbacks 0x0002L +#define XIMPreeditPosition 0x0004L +#define XIMPreeditNothing 0x0008L +#define XIMPreeditNone 0x0010L +#define XIMStatusArea 0x0100L +#define XIMStatusCallbacks 0x0200L +#define XIMStatusNothing 0x0400L +#define XIMStatusNone 0x0800L + +#define XNVaNestedList "XNVaNestedList" +#define XNClientWindow "clientWindow" +#define XNInputStyle "inputStyle" +#define XNFocusWindow "focusWindow" +#define XNResourceName "resourceName" +#define XNResourceClass "resourceClass" +#define XNGeometryCallback "geometryCallback" +#define XNFilterEvents "filterEvents" +#define XNPreeditStartCallback "preeditStartCallback" +#define XNPreeditDoneCallback "preeditDoneCallback" +#define XNPreeditDrawCallback "preeditDrawCallback" +#define XNPreeditCaretCallback "preeditCaretCallback" +#define XNPreeditAttributes "preeditAttributes" +#define XNStatusStartCallback "statusStartCallback" +#define XNStatusDoneCallback "statusDoneCallback" +#define XNStatusDrawCallback "statusDrawCallback" +#define XNStatusAttributes "statusAttributes" +#define XNArea "area" +#define XNAreaNeeded "areaNeeded" +#define XNSpotLocation "spotLocation" +#define XNColormap "colorMap" +#define XNStdColormap "stdColorMap" +#define XNForeground "foreground" +#define XNBackground "background" +#define XNBackgroundPixmap "backgroundPixmap" +#define XNFontSet "fontSet" +#define XNLineSpace "lineSpace" +#define XNCursor "cursor" + +#define XBufferOverflow -1 +#define XLookupNone 1 +#define XLookupChars 2 +#define XLookupKeySym 3 +#define XLookupBoth 4 + +#if NeedFunctionPrototypes +typedef void *XVaNestedList; +#else +typedef XPointer XVaNestedList; +#endif + +typedef struct { + XPointer client_data; + XIMProc callback; +} XIMCallback; + +typedef unsigned long XIMFeedback; + +#define XIMReverse 1 +#define XIMUnderline (1<<1) +#define XIMHighlight (1<<2) +#define XIMPrimary (1<<5) +#define XIMSecondary (1<<6) +#define XIMTertiary (1<<7) + +typedef struct _XIMText { + unsigned short length; + XIMFeedback *feedback; + Bool encoding_is_wchar; + union { + char *multi_byte; + wchar_t *wide_char; + } string; +} XIMText; + +typedef struct _XIMPreeditDrawCallbackStruct { + int caret; /* Cursor offset within pre-edit string */ + int chg_first; /* Starting change position */ + int chg_length; /* Length of the change in character count */ + XIMText *text; +} XIMPreeditDrawCallbackStruct; + +typedef enum { + XIMForwardChar, XIMBackwardChar, + XIMForwardWord, XIMBackwardWord, + XIMCaretUp, XIMCaretDown, + XIMNextLine, XIMPreviousLine, + XIMLineStart, XIMLineEnd, + XIMAbsolutePosition, + XIMDontChange +} XIMCaretDirection; + +typedef enum { + XIMIsInvisible, /* Disable caret feedback */ + XIMIsPrimary, /* UI defined caret feedback */ + XIMIsSecondary /* UI defined caret feedback */ +} XIMCaretStyle; + +typedef struct _XIMPreeditCaretCallbackStruct { + int position; /* Caret offset within pre-edit string */ + XIMCaretDirection direction; /* Caret moves direction */ + XIMCaretStyle style; /* Feedback of the caret */ +} XIMPreeditCaretCallbackStruct; + +typedef enum { + XIMTextType, + XIMBitmapType +} XIMStatusDataType; + +typedef struct _XIMStatusDrawCallbackStruct { + XIMStatusDataType type; + union { + XIMText *text; + Pixmap bitmap; + } data; +} XIMStatusDrawCallbackStruct; + +typedef int (*XErrorHandler) ( /* WARNING, this type not in Xlib spec */ +#if NeedFunctionPrototypes + Display* /* display */, + XErrorEvent* /* error_event */ +#endif +); + +_XFUNCPROTOBEGIN + + + +#include "tkIntXlibDecls.h" + +_XFUNCPROTOEND + +#if defined(MAC_OSX_TK) +# undef Cursor +# undef Region +#endif + +#endif /* _XLIB_H_ */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xutil.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xutil.h new file mode 100644 index 00000000..58124b04 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/Xutil.h @@ -0,0 +1,855 @@ +/* $XConsortium: Xutil.h,v 11.73 91/07/30 16:21:37 rws Exp $ */ + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ + +#ifndef _XUTIL_H_ +#define _XUTIL_H_ + +/* You must include before including this file */ + +#if defined(MAC_OSX_TK) +# define Region XRegion +#endif + +/* + * Bitmask returned by XParseGeometry(). Each bit tells if the corresponding + * value (x, y, width, height) was found in the parsed string. + */ +#define NoValue 0x0000 +#define XValue 0x0001 +#define YValue 0x0002 +#define WidthValue 0x0004 +#define HeightValue 0x0008 +#define AllValues 0x000F +#define XNegative 0x0010 +#define YNegative 0x0020 + +/* + * new version containing base_width, base_height, and win_gravity fields; + * used with WM_NORMAL_HINTS. + */ +typedef struct { + long flags; /* marks which fields in this structure are defined */ + int x, y; /* obsolete for new window mgrs, but clients */ + int width, height; /* should set so old wm's don't mess up */ + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; + struct { + int x; /* numerator */ + int y; /* denominator */ + } min_aspect, max_aspect; + int base_width, base_height; /* added by ICCCM version 1 */ + int win_gravity; /* added by ICCCM version 1 */ +} XSizeHints; + +/* + * The next block of definitions are for window manager properties that + * clients and applications use for communication. + */ + +/* flags argument in size hints */ +#define USPosition (1L << 0) /* user specified x, y */ +#define USSize (1L << 1) /* user specified width, height */ + +#define PPosition (1L << 2) /* program specified position */ +#define PSize (1L << 3) /* program specified size */ +#define PMinSize (1L << 4) /* program specified minimum size */ +#define PMaxSize (1L << 5) /* program specified maximum size */ +#define PResizeInc (1L << 6) /* program specified resize increments */ +#define PAspect (1L << 7) /* program specified min and max aspect ratios */ +#define PBaseSize (1L << 8) /* program specified base for incrementing */ +#define PWinGravity (1L << 9) /* program specified window gravity */ + +/* obsolete */ +#define PAllHints (PPosition|PSize|PMinSize|PMaxSize|PResizeInc|PAspect) + + + +typedef struct { + long flags; /* marks which fields in this structure are defined */ + Bool input; /* does this application rely on the window manager to + get keyboard input? */ + int initial_state; /* see below */ + Pixmap icon_pixmap; /* pixmap to be used as icon */ + Window icon_window; /* window to be used as icon */ + int icon_x, icon_y; /* initial position of icon */ + Pixmap icon_mask; /* icon mask bitmap */ + XID window_group; /* id of related window group */ + /* this structure may be extended in the future */ +} XWMHints; + +/* definition for flags of XWMHints */ + +#define InputHint (1L << 0) +#define StateHint (1L << 1) +#define IconPixmapHint (1L << 2) +#define IconWindowHint (1L << 3) +#define IconPositionHint (1L << 4) +#define IconMaskHint (1L << 5) +#define WindowGroupHint (1L << 6) +#define AllHints (InputHint|StateHint|IconPixmapHint|IconWindowHint| \ +IconPositionHint|IconMaskHint|WindowGroupHint) + +/* definitions for initial window state */ +#define WithdrawnState 0 /* for windows that are not mapped */ +#define NormalState 1 /* most applications want to start this way */ +#define IconicState 3 /* application wants to start as an icon */ + +/* + * Obsolete states no longer defined by ICCCM + */ +#define DontCareState 0 /* don't know or care */ +#define ZoomState 2 /* application wants to start zoomed */ +#define InactiveState 4 /* application believes it is seldom used; */ + /* some wm's may put it on inactive menu */ + + +/* + * new structure for manipulating TEXT properties; used with WM_NAME, + * WM_ICON_NAME, WM_CLIENT_MACHINE, and WM_COMMAND. + */ +typedef struct { + unsigned char *value; /* same as Property routines */ + Atom encoding; /* prop type */ + int format; /* prop data format: 8, 16, or 32 */ + unsigned long nitems; /* number of data items in value */ +} XTextProperty; + +#define XNoMemory -1 +#define XLocaleNotSupported -2 +#define XConverterNotFound -3 + +typedef enum { + XStringStyle, /* STRING */ + XCompoundTextStyle, /* COMPOUND_TEXT */ + XTextStyle, /* text in owner's encoding (current locale)*/ + XStdICCTextStyle /* STRING, else COMPOUND_TEXT */ +} XICCEncodingStyle; + +typedef struct { + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; +} XIconSize; + +typedef struct { + char *res_name; + char *res_class; +} XClassHint; + +/* + * These macros are used to give some sugar to the image routines so that + * naive people are more comfortable with them. + */ +#define XDestroyImage(ximage) \ + ((*((ximage)->f.destroy_image))((ximage))) +#define XGetPixel(ximage, x, y) \ + ((*((ximage)->f.get_pixel))((ximage), (x), (y))) +#define XPutPixel(ximage, x, y, pixel) \ + ((*((ximage)->f.put_pixel))((ximage), (x), (y), (pixel))) +#define XSubImage(ximage, x, y, width, height) \ + ((*((ximage)->f.sub_image))((ximage), (x), (y), (width), (height))) +#define XAddPixel(ximage, value) \ + ((*((ximage)->f.add_pixel))((ximage), (value))) + +/* + * Compose sequence status structure, used in calling XLookupString. + */ +typedef struct _XComposeStatus { + XPointer compose_ptr; /* state table pointer */ + int chars_matched; /* match state */ +} XComposeStatus; + +/* + * Keysym macros, used on Keysyms to test for classes of symbols + */ +#define IsKeypadKey(keysym) \ + (((unsigned)(keysym) >= XK_KP_Space) && ((unsigned)(keysym) <= XK_KP_Equal)) + +#define IsCursorKey(keysym) \ + (((unsigned)(keysym) >= XK_Home) && ((unsigned)(keysym) < XK_Select)) + +#define IsPFKey(keysym) \ + (((unsigned)(keysym) >= XK_KP_F1) && ((unsigned)(keysym) <= XK_KP_F4)) + +#define IsFunctionKey(keysym) \ + (((unsigned)(keysym) >= XK_F1) && ((unsigned)(keysym) <= XK_F35)) + +#define IsMiscFunctionKey(keysym) \ + (((unsigned)(keysym) >= XK_Select) && ((unsigned)(keysym) <= XK_Break)) + +#define IsModifierKey(keysym) \ + ((((unsigned)(keysym) >= XK_Shift_L) && ((unsigned)(keysym) <= XK_Hyper_R)) \ + || ((unsigned)(keysym) == XK_Mode_switch) \ + || ((unsigned)(keysym) == XK_Num_Lock)) +/* + * opaque reference to Region data type + */ +typedef struct _XRegion *Region; + +/* Return values from XRectInRegion() */ + +#define RectangleOut 0 +#define RectangleIn 1 +#define RectanglePart 2 + + +/* + * Information used by the visual utility routines to find desired visual + * type from the many visuals a display may support. + */ + +typedef struct { + Visual *visual; + VisualID visualid; + int screen; + int depth; +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ */ +#else + int class; +#endif + unsigned long red_mask; + unsigned long green_mask; + unsigned long blue_mask; + int colormap_size; + int bits_per_rgb; +} XVisualInfo; + +#define VisualNoMask 0x0 +#define VisualIDMask 0x1 +#define VisualScreenMask 0x2 +#define VisualDepthMask 0x4 +#define VisualClassMask 0x8 +#define VisualRedMaskMask 0x10 +#define VisualGreenMaskMask 0x20 +#define VisualBlueMaskMask 0x40 +#define VisualColormapSizeMask 0x80 +#define VisualBitsPerRGBMask 0x100 +#define VisualAllMask 0x1FF + +/* + * This defines a window manager property that clients may use to + * share standard color maps of type RGB_COLOR_MAP: + */ +typedef struct { + Colormap colormap; + unsigned long red_max; + unsigned long red_mult; + unsigned long green_max; + unsigned long green_mult; + unsigned long blue_max; + unsigned long blue_mult; + unsigned long base_pixel; + VisualID visualid; /* added by ICCCM version 1 */ + XID killid; /* added by ICCCM version 1 */ +} XStandardColormap; + +#define ReleaseByFreeingColormap ((XID) 1L) /* for killid field above */ + + +/* + * return codes for XReadBitmapFile and XWriteBitmapFile + */ +#define BitmapSuccess 0 +#define BitmapOpenFailed 1 +#define BitmapFileInvalid 2 +#define BitmapNoMemory 3 + +/**************************************************************** + * + * Context Management + * + ****************************************************************/ + + +/* Associative lookup table return codes */ + +#define XCSUCCESS 0 /* No error. */ +#define XCNOMEM 1 /* Out of memory */ +#define XCNOENT 2 /* No entry in table */ + +typedef int XContext; + +#define XUniqueContext() ((XContext) XrmUniqueQuark()) +#define XStringToContext(string) ((XContext) XrmStringToQuark(string)) + +_XFUNCPROTOBEGIN + +/* The following declarations are alphabetized. */ + +extern XClassHint *XAllocClassHint ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XIconSize *XAllocIconSize ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XSizeHints *XAllocSizeHints ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XStandardColormap *XAllocStandardColormap ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XWMHints *XAllocWMHints ( +#if NeedFunctionPrototypes + void +#endif +); + +extern void XClipBox( +#if NeedFunctionPrototypes + Region /* r */, + XRectangle* /* rect_return */ +#endif +); + +extern Region XCreateRegion( +#if NeedFunctionPrototypes + void +#endif +); + +extern char *XDefaultString( +#if NeedFunctionPrototypes + void +#endif +); + +extern int XDeleteContext( +#if NeedFunctionPrototypes + Display* /* display */, + XID /* rid */, + XContext /* context */ +#endif +); + +extern void XDestroyRegion( +#if NeedFunctionPrototypes + Region /* r */ +#endif +); + +extern Bool XEmptyRegion( +#if NeedFunctionPrototypes + Region /* r */ +#endif +); + +extern Bool XEqualRegion( +#if NeedFunctionPrototypes + Region /* r1 */, + Region /* r2 */ +#endif +); + +extern int XFindContext( +#if NeedFunctionPrototypes + Display* /* display */, + XID /* rid */, + XContext /* context */, + XPointer* /* data_return */ +#endif +); + +extern Status XGetClassHint( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XClassHint* /* class_hints_return */ +#endif +); + +extern Status XGetIconSizes( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XIconSize** /* size_list_return */, + int* /* count_return */ +#endif +); + +extern Status XGetNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */ +#endif +); + +extern Status XGetRGBColormaps( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap** /* stdcmap_return */, + int* /* count_return */, + Atom /* property */ +#endif +); + +extern Status XGetSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + Atom /* property */ +#endif +); + +extern Status XGetStandardColormap( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap* /* colormap_return */, + Atom /* property */ +#endif +); + +extern Status XGetTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* window */, + XTextProperty* /* text_prop_return */, + Atom /* property */ +#endif +); + + +extern Status XGetWMClientMachine( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern XWMHints *XGetWMHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */ +#endif +); + +extern Status XGetWMIconName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern Status XGetWMName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern Status XGetWMNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + long* /* supplied_return */ +#endif +); + +extern Status XGetWMSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + long* /* supplied_return */, + Atom /* property */ +#endif +); + +extern Status XGetZoomHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* zhints_return */ +#endif +); + +extern void XIntersectRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +extern int XLookupString( +#if NeedFunctionPrototypes + XKeyEvent* /* event_struct */, + char* /* buffer_return */, + int /* bytes_buffer */, + KeySym* /* keysym_return */, + XComposeStatus* /* status_in_out */ +#endif +); + +extern Status XMatchVisualInfo( +#if NeedFunctionPrototypes + Display* /* display */, + int /* screen */, + int /* depth */, + int /* class */, + XVisualInfo* /* vinfo_return */ +#endif +); + +extern void XOffsetRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* dx */, + int /* dy */ +#endif +); + +extern Bool XPointInRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* x */, + int /* y */ +#endif +); + +extern Region XPolygonRegion( +#if NeedFunctionPrototypes + XPoint* /* points */, + int /* n */, + int /* fill_rule */ +#endif +); + +extern int XRectInRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */ +#endif +); + +extern int XSaveContext( +#if NeedFunctionPrototypes + Display* /* display */, + XID /* rid */, + XContext /* context */, + _Xconst char* /* data */ +#endif +); + +extern void XSetClassHint( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XClassHint* /* class_hints */ +#endif +); + +extern void XSetIconSizes( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XIconSize* /* size_list */, + int /* count */ +#endif +); + +extern void XSetNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */ +#endif +); + +extern void XSetRGBColormaps( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap* /* stdcmaps */, + int /* count */, + Atom /* property */ +#endif +); + +extern void XSetSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */, + Atom /* property */ +#endif +); + +extern void XSetStandardProperties( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + Pixmap /* icon_pixmap */, + char** /* argv */, + int /* argc */, + XSizeHints* /* hints */ +#endif +); + +extern void XSetTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */, + Atom /* property */ +#endif +); + +extern void XSetWMHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XWMHints* /* wm_hints */ +#endif +); + +extern void XSetWMIconName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +#endif +); + +extern void XSetWMName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +#endif +); + +extern void XSetWMNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */ +#endif +); + +extern void XSetWMProperties( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* window_name */, + XTextProperty* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +#endif +); + +extern void XmbSetWMProperties( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +#endif +); + +extern void XSetWMSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */, + Atom /* property */ +#endif +); + +extern void XSetRegion( +#if NeedFunctionPrototypes + Display* /* display */, + GC /* gc */, + Region /* r */ +#endif +); + +extern void XSetStandardColormap( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap* /* colormap */, + Atom /* property */ +#endif +); + +extern void XSetZoomHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* zhints */ +#endif +); + +extern void XShrinkRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* dx */, + int /* dy */ +#endif +); + +extern void XSubtractRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +extern int XmbTextListToTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + char** /* list */, + int /* count */, + XICCEncodingStyle /* style */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern int XwcTextListToTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + wchar_t** /* list */, + int /* count */, + XICCEncodingStyle /* style */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern void XwcFreeStringList( +#if NeedFunctionPrototypes + wchar_t** /* list */ +#endif +); + +extern Status XTextPropertyToStringList( +#if NeedFunctionPrototypes + XTextProperty* /* text_prop */, + char*** /* list_return */, + int* /* count_return */ +#endif +); + +extern int XmbTextPropertyToTextList( +#if NeedFunctionPrototypes + Display* /* display */, + XTextProperty* /* text_prop */, + char*** /* list_return */, + int* /* count_return */ +#endif +); + +extern int XwcTextPropertyToTextList( +#if NeedFunctionPrototypes + Display* /* display */, + XTextProperty* /* text_prop */, + wchar_t*** /* list_return */, + int* /* count_return */ +#endif +); + +extern void XUnionRectWithRegion( +#if NeedFunctionPrototypes + XRectangle* /* rectangle */, + Region /* src_region */, + Region /* dest_region_return */ +#endif +); + +extern void XUnionRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +extern int XWMGeometry( +#if NeedFunctionPrototypes + Display* /* display */, + int /* screen_number */, + _Xconst char* /* user_geometry */, + _Xconst char* /* default_geometry */, + unsigned int /* border_width */, + XSizeHints* /* hints */, + int* /* x_return */, + int* /* y_return */, + int* /* width_return */, + int* /* height_return */, + int* /* gravity_return */ +#endif +); + +extern void XXorRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +_XFUNCPROTOEND + +#if defined(MAC_OSX_TK) +# undef Region +#endif + +#endif /* _XUTIL_H_ */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/cursorfont.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/cursorfont.h new file mode 100644 index 00000000..617274fa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/cursorfont.h @@ -0,0 +1,79 @@ +/* $XConsortium: cursorfont.h,v 1.2 88/09/06 16:44:27 jim Exp $ */ +#define XC_num_glyphs 154 +#define XC_X_cursor 0 +#define XC_arrow 2 +#define XC_based_arrow_down 4 +#define XC_based_arrow_up 6 +#define XC_boat 8 +#define XC_bogosity 10 +#define XC_bottom_left_corner 12 +#define XC_bottom_right_corner 14 +#define XC_bottom_side 16 +#define XC_bottom_tee 18 +#define XC_box_spiral 20 +#define XC_center_ptr 22 +#define XC_circle 24 +#define XC_clock 26 +#define XC_coffee_mug 28 +#define XC_cross 30 +#define XC_cross_reverse 32 +#define XC_crosshair 34 +#define XC_diamond_cross 36 +#define XC_dot 38 +#define XC_dotbox 40 +#define XC_double_arrow 42 +#define XC_draft_large 44 +#define XC_draft_small 46 +#define XC_draped_box 48 +#define XC_exchange 50 +#define XC_fleur 52 +#define XC_gobbler 54 +#define XC_gumby 56 +#define XC_hand1 58 +#define XC_hand2 60 +#define XC_heart 62 +#define XC_icon 64 +#define XC_iron_cross 66 +#define XC_left_ptr 68 +#define XC_left_side 70 +#define XC_left_tee 72 +#define XC_leftbutton 74 +#define XC_ll_angle 76 +#define XC_lr_angle 78 +#define XC_man 80 +#define XC_middlebutton 82 +#define XC_mouse 84 +#define XC_pencil 86 +#define XC_pirate 88 +#define XC_plus 90 +#define XC_question_arrow 92 +#define XC_right_ptr 94 +#define XC_right_side 96 +#define XC_right_tee 98 +#define XC_rightbutton 100 +#define XC_rtl_logo 102 +#define XC_sailboat 104 +#define XC_sb_down_arrow 106 +#define XC_sb_h_double_arrow 108 +#define XC_sb_left_arrow 110 +#define XC_sb_right_arrow 112 +#define XC_sb_up_arrow 114 +#define XC_sb_v_double_arrow 116 +#define XC_shuttle 118 +#define XC_sizing 120 +#define XC_spider 122 +#define XC_spraycan 124 +#define XC_star 126 +#define XC_target 128 +#define XC_tcross 130 +#define XC_top_left_arrow 132 +#define XC_top_left_corner 134 +#define XC_top_right_corner 136 +#define XC_top_side 138 +#define XC_top_tee 140 +#define XC_trek 142 +#define XC_ul_angle 144 +#define XC_umbrella 146 +#define XC_ur_angle 148 +#define XC_watch 150 +#define XC_xterm 152 diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/keysym.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/keysym.h new file mode 100644 index 00000000..550b76db --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/keysym.h @@ -0,0 +1,35 @@ +/* $XConsortium: keysym.h,v 1.13 91/03/13 20:09:49 rws Exp $ */ + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ + +/* default keysyms */ +#define XK_MISCELLANY +#define XK_LATIN1 +#define XK_LATIN2 +#define XK_LATIN3 +#define XK_LATIN4 +#define XK_GREEK + +#include diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/keysymdef.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/keysymdef.h new file mode 100644 index 00000000..b22d41b3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/keysymdef.h @@ -0,0 +1,1169 @@ +/* $XConsortium: keysymdef.h,v 1.15 93/04/02 10:57:36 rws Exp $ */ + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ + +#define XK_VoidSymbol 0xFFFFFF /* void symbol */ + +#ifdef XK_MISCELLANY +/* + * TTY Functions, cleverly chosen to map to ascii, for convenience of + * programming, but could have been arbitrary (at the cost of lookup + * tables in client code. + */ + +#define XK_BackSpace 0xFF08 /* back space, back char */ +#define XK_Tab 0xFF09 +#define XK_Linefeed 0xFF0A /* Linefeed, LF */ +#define XK_Clear 0xFF0B +#define XK_Return 0xFF0D /* Return, enter */ +#define XK_Pause 0xFF13 /* Pause, hold */ +#define XK_Scroll_Lock 0xFF14 +#define XK_Sys_Req 0xFF15 +#define XK_Escape 0xFF1B +#define XK_Delete 0xFFFF /* Delete, rubout */ + + + +/* International & multi-key character composition */ + +#define XK_Multi_key 0xFF20 /* Multi-key character compose */ + +/* Japanese keyboard support */ + +#define XK_Kanji 0xFF21 /* Kanji, Kanji convert */ +#define XK_Muhenkan 0xFF22 /* Cancel Conversion */ +#define XK_Henkan_Mode 0xFF23 /* Start/Stop Conversion */ +#define XK_Henkan 0xFF23 /* Alias for Henkan_Mode */ +#define XK_Romaji 0xFF24 /* to Romaji */ +#define XK_Hiragana 0xFF25 /* to Hiragana */ +#define XK_Katakana 0xFF26 /* to Katakana */ +#define XK_Hiragana_Katakana 0xFF27 /* Hiragana/Katakana toggle */ +#define XK_Zenkaku 0xFF28 /* to Zenkaku */ +#define XK_Hankaku 0xFF29 /* to Hankaku */ +#define XK_Zenkaku_Hankaku 0xFF2A /* Zenkaku/Hankaku toggle */ +#define XK_Touroku 0xFF2B /* Add to Dictionary */ +#define XK_Massyo 0xFF2C /* Delete from Dictionary */ +#define XK_Kana_Lock 0xFF2D /* Kana Lock */ +#define XK_Kana_Shift 0xFF2E /* Kana Shift */ +#define XK_Eisu_Shift 0xFF2F /* Alphanumeric Shift */ +#define XK_Eisu_toggle 0xFF30 /* Alphanumeric toggle */ + +/* Cursor control & motion */ + +#define XK_Home 0xFF50 +#define XK_Left 0xFF51 /* Move left, left arrow */ +#define XK_Up 0xFF52 /* Move up, up arrow */ +#define XK_Right 0xFF53 /* Move right, right arrow */ +#define XK_Down 0xFF54 /* Move down, down arrow */ +#define XK_Prior 0xFF55 /* Prior, previous */ +#define XK_Page_Up 0xFF55 +#define XK_Next 0xFF56 /* Next */ +#define XK_Page_Down 0xFF56 +#define XK_End 0xFF57 /* EOL */ +#define XK_Begin 0xFF58 /* BOL */ + +/* Special Windows keyboard keys */ + +#define XK_Win_L 0xFF5B /* Left-hand Windows */ +#define XK_Win_R 0xFF5C /* Right-hand Windows */ +#define XK_App 0xFF5D /* Menu key */ + +/* Misc Functions */ + +#define XK_Select 0xFF60 /* Select, mark */ +#define XK_Print 0xFF61 +#define XK_Execute 0xFF62 /* Execute, run, do */ +#define XK_Insert 0xFF63 /* Insert, insert here */ +#define XK_Undo 0xFF65 /* Undo, oops */ +#define XK_Redo 0xFF66 /* redo, again */ +#define XK_Menu 0xFF67 +#define XK_Find 0xFF68 /* Find, search */ +#define XK_Cancel 0xFF69 /* Cancel, stop, abort, exit */ +#define XK_Help 0xFF6A /* Help, ? */ +#define XK_Break 0xFF6B +#define XK_Mode_switch 0xFF7E /* Character set switch */ +#define XK_script_switch 0xFF7E /* Alias for mode_switch */ +#define XK_Num_Lock 0xFF7F + +/* Keypad Functions, keypad numbers cleverly chosen to map to ascii */ + +#define XK_KP_Space 0xFF80 /* space */ +#define XK_KP_Tab 0xFF89 +#define XK_KP_Enter 0xFF8D /* enter */ +#define XK_KP_F1 0xFF91 /* PF1, KP_A, ... */ +#define XK_KP_F2 0xFF92 +#define XK_KP_F3 0xFF93 +#define XK_KP_F4 0xFF94 +#define XK_KP_Home 0xFF95 +#define XK_KP_Left 0xFF96 +#define XK_KP_Up 0xFF97 +#define XK_KP_Right 0xFF98 +#define XK_KP_Down 0xFF99 +#define XK_KP_Prior 0xFF9A +#define XK_KP_Page_Up 0xFF9A +#define XK_KP_Next 0xFF9B +#define XK_KP_Page_Down 0xFF9B +#define XK_KP_End 0xFF9C +#define XK_KP_Begin 0xFF9D +#define XK_KP_Insert 0xFF9E +#define XK_KP_Delete 0xFF9F +#define XK_KP_Equal 0xFFBD /* equals */ +#define XK_KP_Multiply 0xFFAA +#define XK_KP_Add 0xFFAB +#define XK_KP_Separator 0xFFAC /* separator, often comma */ +#define XK_KP_Subtract 0xFFAD +#define XK_KP_Decimal 0xFFAE +#define XK_KP_Divide 0xFFAF + +#define XK_KP_0 0xFFB0 +#define XK_KP_1 0xFFB1 +#define XK_KP_2 0xFFB2 +#define XK_KP_3 0xFFB3 +#define XK_KP_4 0xFFB4 +#define XK_KP_5 0xFFB5 +#define XK_KP_6 0xFFB6 +#define XK_KP_7 0xFFB7 +#define XK_KP_8 0xFFB8 +#define XK_KP_9 0xFFB9 + + + +/* + * Auxilliary Functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufactures have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + +#define XK_F1 0xFFBE +#define XK_F2 0xFFBF +#define XK_F3 0xFFC0 +#define XK_F4 0xFFC1 +#define XK_F5 0xFFC2 +#define XK_F6 0xFFC3 +#define XK_F7 0xFFC4 +#define XK_F8 0xFFC5 +#define XK_F9 0xFFC6 +#define XK_F10 0xFFC7 +#define XK_F11 0xFFC8 +#define XK_L1 0xFFC8 +#define XK_F12 0xFFC9 +#define XK_L2 0xFFC9 +#define XK_F13 0xFFCA +#define XK_L3 0xFFCA +#define XK_F14 0xFFCB +#define XK_L4 0xFFCB +#define XK_F15 0xFFCC +#define XK_L5 0xFFCC +#define XK_F16 0xFFCD +#define XK_L6 0xFFCD +#define XK_F17 0xFFCE +#define XK_L7 0xFFCE +#define XK_F18 0xFFCF +#define XK_L8 0xFFCF +#define XK_F19 0xFFD0 +#define XK_L9 0xFFD0 +#define XK_F20 0xFFD1 +#define XK_L10 0xFFD1 +#define XK_F21 0xFFD2 +#define XK_R1 0xFFD2 +#define XK_F22 0xFFD3 +#define XK_R2 0xFFD3 +#define XK_F23 0xFFD4 +#define XK_R3 0xFFD4 +#define XK_F24 0xFFD5 +#define XK_R4 0xFFD5 +#define XK_F25 0xFFD6 +#define XK_R5 0xFFD6 +#define XK_F26 0xFFD7 +#define XK_R6 0xFFD7 +#define XK_F27 0xFFD8 +#define XK_R7 0xFFD8 +#define XK_F28 0xFFD9 +#define XK_R8 0xFFD9 +#define XK_F29 0xFFDA +#define XK_R9 0xFFDA +#define XK_F30 0xFFDB +#define XK_R10 0xFFDB +#define XK_F31 0xFFDC +#define XK_R11 0xFFDC +#define XK_F32 0xFFDD +#define XK_R12 0xFFDD +#define XK_F33 0xFFDE +#define XK_R13 0xFFDE +#define XK_F34 0xFFDF +#define XK_R14 0xFFDF +#define XK_F35 0xFFE0 +#define XK_R15 0xFFE0 + +/* Modifiers */ + +#define XK_Shift_L 0xFFE1 /* Left shift */ +#define XK_Shift_R 0xFFE2 /* Right shift */ +#define XK_Control_L 0xFFE3 /* Left control */ +#define XK_Control_R 0xFFE4 /* Right control */ +#define XK_Caps_Lock 0xFFE5 /* Caps lock */ +#define XK_Shift_Lock 0xFFE6 /* Shift lock */ + +#define XK_Meta_L 0xFFE7 /* Left meta */ +#define XK_Meta_R 0xFFE8 /* Right meta */ +#define XK_Alt_L 0xFFE9 /* Left alt */ +#define XK_Alt_R 0xFFEA /* Right alt */ +#define XK_Super_L 0xFFEB /* Left super */ +#define XK_Super_R 0xFFEC /* Right super */ +#define XK_Hyper_L 0xFFED /* Left hyper */ +#define XK_Hyper_R 0xFFEE /* Right hyper */ +#endif /* XK_MISCELLANY */ + +/* + * Latin 1 + * Byte 3 = 0 + */ +#ifdef XK_LATIN1 +#define XK_space 0x020 +#define XK_exclam 0x021 +#define XK_quotedbl 0x022 +#define XK_numbersign 0x023 +#define XK_dollar 0x024 +#define XK_percent 0x025 +#define XK_ampersand 0x026 +#define XK_apostrophe 0x027 +#define XK_quoteright 0x027 /* deprecated */ +#define XK_parenleft 0x028 +#define XK_parenright 0x029 +#define XK_asterisk 0x02a +#define XK_plus 0x02b +#define XK_comma 0x02c +#define XK_minus 0x02d +#define XK_period 0x02e +#define XK_slash 0x02f +#define XK_0 0x030 +#define XK_1 0x031 +#define XK_2 0x032 +#define XK_3 0x033 +#define XK_4 0x034 +#define XK_5 0x035 +#define XK_6 0x036 +#define XK_7 0x037 +#define XK_8 0x038 +#define XK_9 0x039 +#define XK_colon 0x03a +#define XK_semicolon 0x03b +#define XK_less 0x03c +#define XK_equal 0x03d +#define XK_greater 0x03e +#define XK_question 0x03f +#define XK_at 0x040 +#define XK_A 0x041 +#define XK_B 0x042 +#define XK_C 0x043 +#define XK_D 0x044 +#define XK_E 0x045 +#define XK_F 0x046 +#define XK_G 0x047 +#define XK_H 0x048 +#define XK_I 0x049 +#define XK_J 0x04a +#define XK_K 0x04b +#define XK_L 0x04c +#define XK_M 0x04d +#define XK_N 0x04e +#define XK_O 0x04f +#define XK_P 0x050 +#define XK_Q 0x051 +#define XK_R 0x052 +#define XK_S 0x053 +#define XK_T 0x054 +#define XK_U 0x055 +#define XK_V 0x056 +#define XK_W 0x057 +#define XK_X 0x058 +#define XK_Y 0x059 +#define XK_Z 0x05a +#define XK_bracketleft 0x05b +#define XK_backslash 0x05c +#define XK_bracketright 0x05d +#define XK_asciicircum 0x05e +#define XK_underscore 0x05f +#define XK_grave 0x060 +#define XK_quoteleft 0x060 /* deprecated */ +#define XK_a 0x061 +#define XK_b 0x062 +#define XK_c 0x063 +#define XK_d 0x064 +#define XK_e 0x065 +#define XK_f 0x066 +#define XK_g 0x067 +#define XK_h 0x068 +#define XK_i 0x069 +#define XK_j 0x06a +#define XK_k 0x06b +#define XK_l 0x06c +#define XK_m 0x06d +#define XK_n 0x06e +#define XK_o 0x06f +#define XK_p 0x070 +#define XK_q 0x071 +#define XK_r 0x072 +#define XK_s 0x073 +#define XK_t 0x074 +#define XK_u 0x075 +#define XK_v 0x076 +#define XK_w 0x077 +#define XK_x 0x078 +#define XK_y 0x079 +#define XK_z 0x07a +#define XK_braceleft 0x07b +#define XK_bar 0x07c +#define XK_braceright 0x07d +#define XK_asciitilde 0x07e + +#define XK_nobreakspace 0x0a0 +#define XK_exclamdown 0x0a1 +#define XK_cent 0x0a2 +#define XK_sterling 0x0a3 +#define XK_currency 0x0a4 +#define XK_yen 0x0a5 +#define XK_brokenbar 0x0a6 +#define XK_section 0x0a7 +#define XK_diaeresis 0x0a8 +#define XK_copyright 0x0a9 +#define XK_ordfeminine 0x0aa +#define XK_guillemotleft 0x0ab /* left angle quotation mark */ +#define XK_notsign 0x0ac +#define XK_hyphen 0x0ad +#define XK_registered 0x0ae +#define XK_macron 0x0af +#define XK_degree 0x0b0 +#define XK_plusminus 0x0b1 +#define XK_twosuperior 0x0b2 +#define XK_threesuperior 0x0b3 +#define XK_acute 0x0b4 +#define XK_mu 0x0b5 +#define XK_paragraph 0x0b6 +#define XK_periodcentered 0x0b7 +#define XK_cedilla 0x0b8 +#define XK_onesuperior 0x0b9 +#define XK_masculine 0x0ba +#define XK_guillemotright 0x0bb /* right angle quotation mark */ +#define XK_onequarter 0x0bc +#define XK_onehalf 0x0bd +#define XK_threequarters 0x0be +#define XK_questiondown 0x0bf +#define XK_Agrave 0x0c0 +#define XK_Aacute 0x0c1 +#define XK_Acircumflex 0x0c2 +#define XK_Atilde 0x0c3 +#define XK_Adiaeresis 0x0c4 +#define XK_Aring 0x0c5 +#define XK_AE 0x0c6 +#define XK_Ccedilla 0x0c7 +#define XK_Egrave 0x0c8 +#define XK_Eacute 0x0c9 +#define XK_Ecircumflex 0x0ca +#define XK_Ediaeresis 0x0cb +#define XK_Igrave 0x0cc +#define XK_Iacute 0x0cd +#define XK_Icircumflex 0x0ce +#define XK_Idiaeresis 0x0cf +#define XK_ETH 0x0d0 +#define XK_Eth 0x0d0 /* deprecated */ +#define XK_Ntilde 0x0d1 +#define XK_Ograve 0x0d2 +#define XK_Oacute 0x0d3 +#define XK_Ocircumflex 0x0d4 +#define XK_Otilde 0x0d5 +#define XK_Odiaeresis 0x0d6 +#define XK_multiply 0x0d7 +#define XK_Ooblique 0x0d8 +#define XK_Ugrave 0x0d9 +#define XK_Uacute 0x0da +#define XK_Ucircumflex 0x0db +#define XK_Udiaeresis 0x0dc +#define XK_Yacute 0x0dd +#define XK_THORN 0x0de +#define XK_Thorn 0x0de /* deprecated */ +#define XK_ssharp 0x0df +#define XK_agrave 0x0e0 +#define XK_aacute 0x0e1 +#define XK_acircumflex 0x0e2 +#define XK_atilde 0x0e3 +#define XK_adiaeresis 0x0e4 +#define XK_aring 0x0e5 +#define XK_ae 0x0e6 +#define XK_ccedilla 0x0e7 +#define XK_egrave 0x0e8 +#define XK_eacute 0x0e9 +#define XK_ecircumflex 0x0ea +#define XK_ediaeresis 0x0eb +#define XK_igrave 0x0ec +#define XK_iacute 0x0ed +#define XK_icircumflex 0x0ee +#define XK_idiaeresis 0x0ef +#define XK_eth 0x0f0 +#define XK_ntilde 0x0f1 +#define XK_ograve 0x0f2 +#define XK_oacute 0x0f3 +#define XK_ocircumflex 0x0f4 +#define XK_otilde 0x0f5 +#define XK_odiaeresis 0x0f6 +#define XK_division 0x0f7 +#define XK_oslash 0x0f8 +#define XK_ugrave 0x0f9 +#define XK_uacute 0x0fa +#define XK_ucircumflex 0x0fb +#define XK_udiaeresis 0x0fc +#define XK_yacute 0x0fd +#define XK_thorn 0x0fe +#define XK_ydiaeresis 0x0ff +#endif /* XK_LATIN1 */ + +/* + * Latin 2 + * Byte 3 = 1 + */ + +#ifdef XK_LATIN2 +#define XK_Aogonek 0x1a1 +#define XK_breve 0x1a2 +#define XK_Lstroke 0x1a3 +#define XK_Lcaron 0x1a5 +#define XK_Sacute 0x1a6 +#define XK_Scaron 0x1a9 +#define XK_Scedilla 0x1aa +#define XK_Tcaron 0x1ab +#define XK_Zacute 0x1ac +#define XK_Zcaron 0x1ae +#define XK_Zabovedot 0x1af +#define XK_aogonek 0x1b1 +#define XK_ogonek 0x1b2 +#define XK_lstroke 0x1b3 +#define XK_lcaron 0x1b5 +#define XK_sacute 0x1b6 +#define XK_caron 0x1b7 +#define XK_scaron 0x1b9 +#define XK_scedilla 0x1ba +#define XK_tcaron 0x1bb +#define XK_zacute 0x1bc +#define XK_doubleacute 0x1bd +#define XK_zcaron 0x1be +#define XK_zabovedot 0x1bf +#define XK_Racute 0x1c0 +#define XK_Abreve 0x1c3 +#define XK_Lacute 0x1c5 +#define XK_Cacute 0x1c6 +#define XK_Ccaron 0x1c8 +#define XK_Eogonek 0x1ca +#define XK_Ecaron 0x1cc +#define XK_Dcaron 0x1cf +#define XK_Dstroke 0x1d0 +#define XK_Nacute 0x1d1 +#define XK_Ncaron 0x1d2 +#define XK_Odoubleacute 0x1d5 +#define XK_Rcaron 0x1d8 +#define XK_Uring 0x1d9 +#define XK_Udoubleacute 0x1db +#define XK_Tcedilla 0x1de +#define XK_racute 0x1e0 +#define XK_abreve 0x1e3 +#define XK_lacute 0x1e5 +#define XK_cacute 0x1e6 +#define XK_ccaron 0x1e8 +#define XK_eogonek 0x1ea +#define XK_ecaron 0x1ec +#define XK_dcaron 0x1ef +#define XK_dstroke 0x1f0 +#define XK_nacute 0x1f1 +#define XK_ncaron 0x1f2 +#define XK_odoubleacute 0x1f5 +#define XK_udoubleacute 0x1fb +#define XK_rcaron 0x1f8 +#define XK_uring 0x1f9 +#define XK_tcedilla 0x1fe +#define XK_abovedot 0x1ff +#endif /* XK_LATIN2 */ + +/* + * Latin 3 + * Byte 3 = 2 + */ + +#ifdef XK_LATIN3 +#define XK_Hstroke 0x2a1 +#define XK_Hcircumflex 0x2a6 +#define XK_Iabovedot 0x2a9 +#define XK_Gbreve 0x2ab +#define XK_Jcircumflex 0x2ac +#define XK_hstroke 0x2b1 +#define XK_hcircumflex 0x2b6 +#define XK_idotless 0x2b9 +#define XK_gbreve 0x2bb +#define XK_jcircumflex 0x2bc +#define XK_Cabovedot 0x2c5 +#define XK_Ccircumflex 0x2c6 +#define XK_Gabovedot 0x2d5 +#define XK_Gcircumflex 0x2d8 +#define XK_Ubreve 0x2dd +#define XK_Scircumflex 0x2de +#define XK_cabovedot 0x2e5 +#define XK_ccircumflex 0x2e6 +#define XK_gabovedot 0x2f5 +#define XK_gcircumflex 0x2f8 +#define XK_ubreve 0x2fd +#define XK_scircumflex 0x2fe +#endif /* XK_LATIN3 */ + + +/* + * Latin 4 + * Byte 3 = 3 + */ + +#ifdef XK_LATIN4 +#define XK_kra 0x3a2 +#define XK_kappa 0x3a2 /* deprecated */ +#define XK_Rcedilla 0x3a3 +#define XK_Itilde 0x3a5 +#define XK_Lcedilla 0x3a6 +#define XK_Emacron 0x3aa +#define XK_Gcedilla 0x3ab +#define XK_Tslash 0x3ac +#define XK_rcedilla 0x3b3 +#define XK_itilde 0x3b5 +#define XK_lcedilla 0x3b6 +#define XK_emacron 0x3ba +#define XK_gcedilla 0x3bb +#define XK_tslash 0x3bc +#define XK_ENG 0x3bd +#define XK_eng 0x3bf +#define XK_Amacron 0x3c0 +#define XK_Iogonek 0x3c7 +#define XK_Eabovedot 0x3cc +#define XK_Imacron 0x3cf +#define XK_Ncedilla 0x3d1 +#define XK_Omacron 0x3d2 +#define XK_Kcedilla 0x3d3 +#define XK_Uogonek 0x3d9 +#define XK_Utilde 0x3dd +#define XK_Umacron 0x3de +#define XK_amacron 0x3e0 +#define XK_iogonek 0x3e7 +#define XK_eabovedot 0x3ec +#define XK_imacron 0x3ef +#define XK_ncedilla 0x3f1 +#define XK_omacron 0x3f2 +#define XK_kcedilla 0x3f3 +#define XK_uogonek 0x3f9 +#define XK_utilde 0x3fd +#define XK_umacron 0x3fe +#endif /* XK_LATIN4 */ + +/* + * Katakana + * Byte 3 = 4 + */ + +#ifdef XK_KATAKANA +#define XK_overline 0x47e +#define XK_kana_fullstop 0x4a1 +#define XK_kana_openingbracket 0x4a2 +#define XK_kana_closingbracket 0x4a3 +#define XK_kana_comma 0x4a4 +#define XK_kana_conjunctive 0x4a5 +#define XK_kana_middledot 0x4a5 /* deprecated */ +#define XK_kana_WO 0x4a6 +#define XK_kana_a 0x4a7 +#define XK_kana_i 0x4a8 +#define XK_kana_u 0x4a9 +#define XK_kana_e 0x4aa +#define XK_kana_o 0x4ab +#define XK_kana_ya 0x4ac +#define XK_kana_yu 0x4ad +#define XK_kana_yo 0x4ae +#define XK_kana_tsu 0x4af +#define XK_kana_tu 0x4af /* deprecated */ +#define XK_prolongedsound 0x4b0 +#define XK_kana_A 0x4b1 +#define XK_kana_I 0x4b2 +#define XK_kana_U 0x4b3 +#define XK_kana_E 0x4b4 +#define XK_kana_O 0x4b5 +#define XK_kana_KA 0x4b6 +#define XK_kana_KI 0x4b7 +#define XK_kana_KU 0x4b8 +#define XK_kana_KE 0x4b9 +#define XK_kana_KO 0x4ba +#define XK_kana_SA 0x4bb +#define XK_kana_SHI 0x4bc +#define XK_kana_SU 0x4bd +#define XK_kana_SE 0x4be +#define XK_kana_SO 0x4bf +#define XK_kana_TA 0x4c0 +#define XK_kana_CHI 0x4c1 +#define XK_kana_TI 0x4c1 /* deprecated */ +#define XK_kana_TSU 0x4c2 +#define XK_kana_TU 0x4c2 /* deprecated */ +#define XK_kana_TE 0x4c3 +#define XK_kana_TO 0x4c4 +#define XK_kana_NA 0x4c5 +#define XK_kana_NI 0x4c6 +#define XK_kana_NU 0x4c7 +#define XK_kana_NE 0x4c8 +#define XK_kana_NO 0x4c9 +#define XK_kana_HA 0x4ca +#define XK_kana_HI 0x4cb +#define XK_kana_FU 0x4cc +#define XK_kana_HU 0x4cc /* deprecated */ +#define XK_kana_HE 0x4cd +#define XK_kana_HO 0x4ce +#define XK_kana_MA 0x4cf +#define XK_kana_MI 0x4d0 +#define XK_kana_MU 0x4d1 +#define XK_kana_ME 0x4d2 +#define XK_kana_MO 0x4d3 +#define XK_kana_YA 0x4d4 +#define XK_kana_YU 0x4d5 +#define XK_kana_YO 0x4d6 +#define XK_kana_RA 0x4d7 +#define XK_kana_RI 0x4d8 +#define XK_kana_RU 0x4d9 +#define XK_kana_RE 0x4da +#define XK_kana_RO 0x4db +#define XK_kana_WA 0x4dc +#define XK_kana_N 0x4dd +#define XK_voicedsound 0x4de +#define XK_semivoicedsound 0x4df +#define XK_kana_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_KATAKANA */ + +/* + * Arabic + * Byte 3 = 5 + */ + +#ifdef XK_ARABIC +#define XK_Arabic_comma 0x5ac +#define XK_Arabic_semicolon 0x5bb +#define XK_Arabic_question_mark 0x5bf +#define XK_Arabic_hamza 0x5c1 +#define XK_Arabic_maddaonalef 0x5c2 +#define XK_Arabic_hamzaonalef 0x5c3 +#define XK_Arabic_hamzaonwaw 0x5c4 +#define XK_Arabic_hamzaunderalef 0x5c5 +#define XK_Arabic_hamzaonyeh 0x5c6 +#define XK_Arabic_alef 0x5c7 +#define XK_Arabic_beh 0x5c8 +#define XK_Arabic_tehmarbuta 0x5c9 +#define XK_Arabic_teh 0x5ca +#define XK_Arabic_theh 0x5cb +#define XK_Arabic_jeem 0x5cc +#define XK_Arabic_hah 0x5cd +#define XK_Arabic_khah 0x5ce +#define XK_Arabic_dal 0x5cf +#define XK_Arabic_thal 0x5d0 +#define XK_Arabic_ra 0x5d1 +#define XK_Arabic_zain 0x5d2 +#define XK_Arabic_seen 0x5d3 +#define XK_Arabic_sheen 0x5d4 +#define XK_Arabic_sad 0x5d5 +#define XK_Arabic_dad 0x5d6 +#define XK_Arabic_tah 0x5d7 +#define XK_Arabic_zah 0x5d8 +#define XK_Arabic_ain 0x5d9 +#define XK_Arabic_ghain 0x5da +#define XK_Arabic_tatweel 0x5e0 +#define XK_Arabic_feh 0x5e1 +#define XK_Arabic_qaf 0x5e2 +#define XK_Arabic_kaf 0x5e3 +#define XK_Arabic_lam 0x5e4 +#define XK_Arabic_meem 0x5e5 +#define XK_Arabic_noon 0x5e6 +#define XK_Arabic_ha 0x5e7 +#define XK_Arabic_heh 0x5e7 /* deprecated */ +#define XK_Arabic_waw 0x5e8 +#define XK_Arabic_alefmaksura 0x5e9 +#define XK_Arabic_yeh 0x5ea +#define XK_Arabic_fathatan 0x5eb +#define XK_Arabic_dammatan 0x5ec +#define XK_Arabic_kasratan 0x5ed +#define XK_Arabic_fatha 0x5ee +#define XK_Arabic_damma 0x5ef +#define XK_Arabic_kasra 0x5f0 +#define XK_Arabic_shadda 0x5f1 +#define XK_Arabic_sukun 0x5f2 +#define XK_Arabic_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_ARABIC */ + +/* + * Cyrillic + * Byte 3 = 6 + */ +#ifdef XK_CYRILLIC +#define XK_Serbian_dje 0x6a1 +#define XK_Macedonia_gje 0x6a2 +#define XK_Cyrillic_io 0x6a3 +#define XK_Ukrainian_ie 0x6a4 +#define XK_Ukranian_je 0x6a4 /* deprecated */ +#define XK_Macedonia_dse 0x6a5 +#define XK_Ukrainian_i 0x6a6 +#define XK_Ukranian_i 0x6a6 /* deprecated */ +#define XK_Ukrainian_yi 0x6a7 +#define XK_Ukranian_yi 0x6a7 /* deprecated */ +#define XK_Cyrillic_je 0x6a8 +#define XK_Serbian_je 0x6a8 /* deprecated */ +#define XK_Cyrillic_lje 0x6a9 +#define XK_Serbian_lje 0x6a9 /* deprecated */ +#define XK_Cyrillic_nje 0x6aa +#define XK_Serbian_nje 0x6aa /* deprecated */ +#define XK_Serbian_tshe 0x6ab +#define XK_Macedonia_kje 0x6ac +#define XK_Byelorussian_shortu 0x6ae +#define XK_Cyrillic_dzhe 0x6af +#define XK_Serbian_dze 0x6af /* deprecated */ +#define XK_numerosign 0x6b0 +#define XK_Serbian_DJE 0x6b1 +#define XK_Macedonia_GJE 0x6b2 +#define XK_Cyrillic_IO 0x6b3 +#define XK_Ukrainian_IE 0x6b4 +#define XK_Ukranian_JE 0x6b4 /* deprecated */ +#define XK_Macedonia_DSE 0x6b5 +#define XK_Ukrainian_I 0x6b6 +#define XK_Ukranian_I 0x6b6 /* deprecated */ +#define XK_Ukrainian_YI 0x6b7 +#define XK_Ukranian_YI 0x6b7 /* deprecated */ +#define XK_Cyrillic_JE 0x6b8 +#define XK_Serbian_JE 0x6b8 /* deprecated */ +#define XK_Cyrillic_LJE 0x6b9 +#define XK_Serbian_LJE 0x6b9 /* deprecated */ +#define XK_Cyrillic_NJE 0x6ba +#define XK_Serbian_NJE 0x6ba /* deprecated */ +#define XK_Serbian_TSHE 0x6bb +#define XK_Macedonia_KJE 0x6bc +#define XK_Byelorussian_SHORTU 0x6be +#define XK_Cyrillic_DZHE 0x6bf +#define XK_Serbian_DZE 0x6bf /* deprecated */ +#define XK_Cyrillic_yu 0x6c0 +#define XK_Cyrillic_a 0x6c1 +#define XK_Cyrillic_be 0x6c2 +#define XK_Cyrillic_tse 0x6c3 +#define XK_Cyrillic_de 0x6c4 +#define XK_Cyrillic_ie 0x6c5 +#define XK_Cyrillic_ef 0x6c6 +#define XK_Cyrillic_ghe 0x6c7 +#define XK_Cyrillic_ha 0x6c8 +#define XK_Cyrillic_i 0x6c9 +#define XK_Cyrillic_shorti 0x6ca +#define XK_Cyrillic_ka 0x6cb +#define XK_Cyrillic_el 0x6cc +#define XK_Cyrillic_em 0x6cd +#define XK_Cyrillic_en 0x6ce +#define XK_Cyrillic_o 0x6cf +#define XK_Cyrillic_pe 0x6d0 +#define XK_Cyrillic_ya 0x6d1 +#define XK_Cyrillic_er 0x6d2 +#define XK_Cyrillic_es 0x6d3 +#define XK_Cyrillic_te 0x6d4 +#define XK_Cyrillic_u 0x6d5 +#define XK_Cyrillic_zhe 0x6d6 +#define XK_Cyrillic_ve 0x6d7 +#define XK_Cyrillic_softsign 0x6d8 +#define XK_Cyrillic_yeru 0x6d9 +#define XK_Cyrillic_ze 0x6da +#define XK_Cyrillic_sha 0x6db +#define XK_Cyrillic_e 0x6dc +#define XK_Cyrillic_shcha 0x6dd +#define XK_Cyrillic_che 0x6de +#define XK_Cyrillic_hardsign 0x6df +#define XK_Cyrillic_YU 0x6e0 +#define XK_Cyrillic_A 0x6e1 +#define XK_Cyrillic_BE 0x6e2 +#define XK_Cyrillic_TSE 0x6e3 +#define XK_Cyrillic_DE 0x6e4 +#define XK_Cyrillic_IE 0x6e5 +#define XK_Cyrillic_EF 0x6e6 +#define XK_Cyrillic_GHE 0x6e7 +#define XK_Cyrillic_HA 0x6e8 +#define XK_Cyrillic_I 0x6e9 +#define XK_Cyrillic_SHORTI 0x6ea +#define XK_Cyrillic_KA 0x6eb +#define XK_Cyrillic_EL 0x6ec +#define XK_Cyrillic_EM 0x6ed +#define XK_Cyrillic_EN 0x6ee +#define XK_Cyrillic_O 0x6ef +#define XK_Cyrillic_PE 0x6f0 +#define XK_Cyrillic_YA 0x6f1 +#define XK_Cyrillic_ER 0x6f2 +#define XK_Cyrillic_ES 0x6f3 +#define XK_Cyrillic_TE 0x6f4 +#define XK_Cyrillic_U 0x6f5 +#define XK_Cyrillic_ZHE 0x6f6 +#define XK_Cyrillic_VE 0x6f7 +#define XK_Cyrillic_SOFTSIGN 0x6f8 +#define XK_Cyrillic_YERU 0x6f9 +#define XK_Cyrillic_ZE 0x6fa +#define XK_Cyrillic_SHA 0x6fb +#define XK_Cyrillic_E 0x6fc +#define XK_Cyrillic_SHCHA 0x6fd +#define XK_Cyrillic_CHE 0x6fe +#define XK_Cyrillic_HARDSIGN 0x6ff +#endif /* XK_CYRILLIC */ + +/* + * Greek + * Byte 3 = 7 + */ + +#ifdef XK_GREEK +#define XK_Greek_ALPHAaccent 0x7a1 +#define XK_Greek_EPSILONaccent 0x7a2 +#define XK_Greek_ETAaccent 0x7a3 +#define XK_Greek_IOTAaccent 0x7a4 +#define XK_Greek_IOTAdiaeresis 0x7a5 +#define XK_Greek_OMICRONaccent 0x7a7 +#define XK_Greek_UPSILONaccent 0x7a8 +#define XK_Greek_UPSILONdieresis 0x7a9 +#define XK_Greek_OMEGAaccent 0x7ab +#define XK_Greek_accentdieresis 0x7ae +#define XK_Greek_horizbar 0x7af +#define XK_Greek_alphaaccent 0x7b1 +#define XK_Greek_epsilonaccent 0x7b2 +#define XK_Greek_etaaccent 0x7b3 +#define XK_Greek_iotaaccent 0x7b4 +#define XK_Greek_iotadieresis 0x7b5 +#define XK_Greek_iotaaccentdieresis 0x7b6 +#define XK_Greek_omicronaccent 0x7b7 +#define XK_Greek_upsilonaccent 0x7b8 +#define XK_Greek_upsilondieresis 0x7b9 +#define XK_Greek_upsilonaccentdieresis 0x7ba +#define XK_Greek_omegaaccent 0x7bb +#define XK_Greek_ALPHA 0x7c1 +#define XK_Greek_BETA 0x7c2 +#define XK_Greek_GAMMA 0x7c3 +#define XK_Greek_DELTA 0x7c4 +#define XK_Greek_EPSILON 0x7c5 +#define XK_Greek_ZETA 0x7c6 +#define XK_Greek_ETA 0x7c7 +#define XK_Greek_THETA 0x7c8 +#define XK_Greek_IOTA 0x7c9 +#define XK_Greek_KAPPA 0x7ca +#define XK_Greek_LAMDA 0x7cb +#define XK_Greek_LAMBDA 0x7cb +#define XK_Greek_MU 0x7cc +#define XK_Greek_NU 0x7cd +#define XK_Greek_XI 0x7ce +#define XK_Greek_OMICRON 0x7cf +#define XK_Greek_PI 0x7d0 +#define XK_Greek_RHO 0x7d1 +#define XK_Greek_SIGMA 0x7d2 +#define XK_Greek_TAU 0x7d4 +#define XK_Greek_UPSILON 0x7d5 +#define XK_Greek_PHI 0x7d6 +#define XK_Greek_CHI 0x7d7 +#define XK_Greek_PSI 0x7d8 +#define XK_Greek_OMEGA 0x7d9 +#define XK_Greek_alpha 0x7e1 +#define XK_Greek_beta 0x7e2 +#define XK_Greek_gamma 0x7e3 +#define XK_Greek_delta 0x7e4 +#define XK_Greek_epsilon 0x7e5 +#define XK_Greek_zeta 0x7e6 +#define XK_Greek_eta 0x7e7 +#define XK_Greek_theta 0x7e8 +#define XK_Greek_iota 0x7e9 +#define XK_Greek_kappa 0x7ea +#define XK_Greek_lamda 0x7eb +#define XK_Greek_lambda 0x7eb +#define XK_Greek_mu 0x7ec +#define XK_Greek_nu 0x7ed +#define XK_Greek_xi 0x7ee +#define XK_Greek_omicron 0x7ef +#define XK_Greek_pi 0x7f0 +#define XK_Greek_rho 0x7f1 +#define XK_Greek_sigma 0x7f2 +#define XK_Greek_finalsmallsigma 0x7f3 +#define XK_Greek_tau 0x7f4 +#define XK_Greek_upsilon 0x7f5 +#define XK_Greek_phi 0x7f6 +#define XK_Greek_chi 0x7f7 +#define XK_Greek_psi 0x7f8 +#define XK_Greek_omega 0x7f9 +#define XK_Greek_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_GREEK */ + +/* + * Technical + * Byte 3 = 8 + */ + +#ifdef XK_TECHNICAL +#define XK_leftradical 0x8a1 +#define XK_topleftradical 0x8a2 +#define XK_horizconnector 0x8a3 +#define XK_topintegral 0x8a4 +#define XK_botintegral 0x8a5 +#define XK_vertconnector 0x8a6 +#define XK_topleftsqbracket 0x8a7 +#define XK_botleftsqbracket 0x8a8 +#define XK_toprightsqbracket 0x8a9 +#define XK_botrightsqbracket 0x8aa +#define XK_topleftparens 0x8ab +#define XK_botleftparens 0x8ac +#define XK_toprightparens 0x8ad +#define XK_botrightparens 0x8ae +#define XK_leftmiddlecurlybrace 0x8af +#define XK_rightmiddlecurlybrace 0x8b0 +#define XK_topleftsummation 0x8b1 +#define XK_botleftsummation 0x8b2 +#define XK_topvertsummationconnector 0x8b3 +#define XK_botvertsummationconnector 0x8b4 +#define XK_toprightsummation 0x8b5 +#define XK_botrightsummation 0x8b6 +#define XK_rightmiddlesummation 0x8b7 +#define XK_lessthanequal 0x8bc +#define XK_notequal 0x8bd +#define XK_greaterthanequal 0x8be +#define XK_integral 0x8bf +#define XK_therefore 0x8c0 +#define XK_variation 0x8c1 +#define XK_infinity 0x8c2 +#define XK_nabla 0x8c5 +#define XK_approximate 0x8c8 +#define XK_similarequal 0x8c9 +#define XK_ifonlyif 0x8cd +#define XK_implies 0x8ce +#define XK_identical 0x8cf +#define XK_radical 0x8d6 +#define XK_includedin 0x8da +#define XK_includes 0x8db +#define XK_intersection 0x8dc +#define XK_union 0x8dd +#define XK_logicaland 0x8de +#define XK_logicalor 0x8df +#define XK_partialderivative 0x8ef +#define XK_function 0x8f6 +#define XK_leftarrow 0x8fb +#define XK_uparrow 0x8fc +#define XK_rightarrow 0x8fd +#define XK_downarrow 0x8fe +#endif /* XK_TECHNICAL */ + +/* + * Special + * Byte 3 = 9 + */ + +#ifdef XK_SPECIAL +#define XK_blank 0x9df +#define XK_soliddiamond 0x9e0 +#define XK_checkerboard 0x9e1 +#define XK_ht 0x9e2 +#define XK_ff 0x9e3 +#define XK_cr 0x9e4 +#define XK_lf 0x9e5 +#define XK_nl 0x9e8 +#define XK_vt 0x9e9 +#define XK_lowrightcorner 0x9ea +#define XK_uprightcorner 0x9eb +#define XK_upleftcorner 0x9ec +#define XK_lowleftcorner 0x9ed +#define XK_crossinglines 0x9ee +#define XK_horizlinescan1 0x9ef +#define XK_horizlinescan3 0x9f0 +#define XK_horizlinescan5 0x9f1 +#define XK_horizlinescan7 0x9f2 +#define XK_horizlinescan9 0x9f3 +#define XK_leftt 0x9f4 +#define XK_rightt 0x9f5 +#define XK_bott 0x9f6 +#define XK_topt 0x9f7 +#define XK_vertbar 0x9f8 +#endif /* XK_SPECIAL */ + +/* + * Publishing + * Byte 3 = a + */ + +#ifdef XK_PUBLISHING +#define XK_emspace 0xaa1 +#define XK_enspace 0xaa2 +#define XK_em3space 0xaa3 +#define XK_em4space 0xaa4 +#define XK_digitspace 0xaa5 +#define XK_punctspace 0xaa6 +#define XK_thinspace 0xaa7 +#define XK_hairspace 0xaa8 +#define XK_emdash 0xaa9 +#define XK_endash 0xaaa +#define XK_signifblank 0xaac +#define XK_ellipsis 0xaae +#define XK_doubbaselinedot 0xaaf +#define XK_onethird 0xab0 +#define XK_twothirds 0xab1 +#define XK_onefifth 0xab2 +#define XK_twofifths 0xab3 +#define XK_threefifths 0xab4 +#define XK_fourfifths 0xab5 +#define XK_onesixth 0xab6 +#define XK_fivesixths 0xab7 +#define XK_careof 0xab8 +#define XK_figdash 0xabb +#define XK_leftanglebracket 0xabc +#define XK_decimalpoint 0xabd +#define XK_rightanglebracket 0xabe +#define XK_marker 0xabf +#define XK_oneeighth 0xac3 +#define XK_threeeighths 0xac4 +#define XK_fiveeighths 0xac5 +#define XK_seveneighths 0xac6 +#define XK_trademark 0xac9 +#define XK_signaturemark 0xaca +#define XK_trademarkincircle 0xacb +#define XK_leftopentriangle 0xacc +#define XK_rightopentriangle 0xacd +#define XK_emopencircle 0xace +#define XK_emopenrectangle 0xacf +#define XK_leftsinglequotemark 0xad0 +#define XK_rightsinglequotemark 0xad1 +#define XK_leftdoublequotemark 0xad2 +#define XK_rightdoublequotemark 0xad3 +#define XK_prescription 0xad4 +#define XK_minutes 0xad6 +#define XK_seconds 0xad7 +#define XK_latincross 0xad9 +#define XK_hexagram 0xada +#define XK_filledrectbullet 0xadb +#define XK_filledlefttribullet 0xadc +#define XK_filledrighttribullet 0xadd +#define XK_emfilledcircle 0xade +#define XK_emfilledrect 0xadf +#define XK_enopencircbullet 0xae0 +#define XK_enopensquarebullet 0xae1 +#define XK_openrectbullet 0xae2 +#define XK_opentribulletup 0xae3 +#define XK_opentribulletdown 0xae4 +#define XK_openstar 0xae5 +#define XK_enfilledcircbullet 0xae6 +#define XK_enfilledsqbullet 0xae7 +#define XK_filledtribulletup 0xae8 +#define XK_filledtribulletdown 0xae9 +#define XK_leftpointer 0xaea +#define XK_rightpointer 0xaeb +#define XK_club 0xaec +#define XK_diamond 0xaed +#define XK_heart 0xaee +#define XK_maltesecross 0xaf0 +#define XK_dagger 0xaf1 +#define XK_doubledagger 0xaf2 +#define XK_checkmark 0xaf3 +#define XK_ballotcross 0xaf4 +#define XK_musicalsharp 0xaf5 +#define XK_musicalflat 0xaf6 +#define XK_malesymbol 0xaf7 +#define XK_femalesymbol 0xaf8 +#define XK_telephone 0xaf9 +#define XK_telephonerecorder 0xafa +#define XK_phonographcopyright 0xafb +#define XK_caret 0xafc +#define XK_singlelowquotemark 0xafd +#define XK_doublelowquotemark 0xafe +#define XK_cursor 0xaff +#endif /* XK_PUBLISHING */ + +/* + * APL + * Byte 3 = b + */ + +#ifdef XK_APL +#define XK_leftcaret 0xba3 +#define XK_rightcaret 0xba6 +#define XK_downcaret 0xba8 +#define XK_upcaret 0xba9 +#define XK_overbar 0xbc0 +#define XK_downtack 0xbc2 +#define XK_upshoe 0xbc3 +#define XK_downstile 0xbc4 +#define XK_underbar 0xbc6 +#define XK_jot 0xbca +#define XK_quad 0xbcc +#define XK_uptack 0xbce +#define XK_circle 0xbcf +#define XK_upstile 0xbd3 +#define XK_downshoe 0xbd6 +#define XK_rightshoe 0xbd8 +#define XK_leftshoe 0xbda +#define XK_lefttack 0xbdc +#define XK_righttack 0xbfc +#endif /* XK_APL */ + +/* + * Hebrew + * Byte 3 = c + */ + +#ifdef XK_HEBREW +#define XK_hebrew_doublelowline 0xcdf +#define XK_hebrew_aleph 0xce0 +#define XK_hebrew_bet 0xce1 +#define XK_hebrew_beth 0xce1 /* deprecated */ +#define XK_hebrew_gimel 0xce2 +#define XK_hebrew_gimmel 0xce2 /* deprecated */ +#define XK_hebrew_dalet 0xce3 +#define XK_hebrew_daleth 0xce3 /* deprecated */ +#define XK_hebrew_he 0xce4 +#define XK_hebrew_waw 0xce5 +#define XK_hebrew_zain 0xce6 +#define XK_hebrew_zayin 0xce6 /* deprecated */ +#define XK_hebrew_chet 0xce7 +#define XK_hebrew_het 0xce7 /* deprecated */ +#define XK_hebrew_tet 0xce8 +#define XK_hebrew_teth 0xce8 /* deprecated */ +#define XK_hebrew_yod 0xce9 +#define XK_hebrew_finalkaph 0xcea +#define XK_hebrew_kaph 0xceb +#define XK_hebrew_lamed 0xcec +#define XK_hebrew_finalmem 0xced +#define XK_hebrew_mem 0xcee +#define XK_hebrew_finalnun 0xcef +#define XK_hebrew_nun 0xcf0 +#define XK_hebrew_samech 0xcf1 +#define XK_hebrew_samekh 0xcf1 /* deprecated */ +#define XK_hebrew_ayin 0xcf2 +#define XK_hebrew_finalpe 0xcf3 +#define XK_hebrew_pe 0xcf4 +#define XK_hebrew_finalzade 0xcf5 +#define XK_hebrew_finalzadi 0xcf5 /* deprecated */ +#define XK_hebrew_zade 0xcf6 +#define XK_hebrew_zadi 0xcf6 /* deprecated */ +#define XK_hebrew_qoph 0xcf7 +#define XK_hebrew_kuf 0xcf7 /* deprecated */ +#define XK_hebrew_resh 0xcf8 +#define XK_hebrew_shin 0xcf9 +#define XK_hebrew_taw 0xcfa +#define XK_hebrew_taf 0xcfa /* deprecated */ +#define XK_Hebrew_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_HEBREW */ + diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/tkIntXlibDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/tkIntXlibDecls.h new file mode 100644 index 00000000..6ac7ccbd --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/X11/tkIntXlibDecls.h @@ -0,0 +1,1279 @@ +/* + * tkIntXlibDecls.h -- + * + * This file contains the declarations for all platform dependent + * unsupported functions that are exported by the Tk library. These + * interfaces are not guaranteed to remain the same between + * versions. Use at your own risk. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * All rights reserved. + */ + +#ifndef _TKINTXLIBDECLS +#define _TKINTXLIBDECLS + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tkInt.decls script. + */ + +#ifndef _TCL +# include +#endif + +#include "X11/Xutil.h" + +#ifdef BUILD_tk +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLEXPORT +#endif + +typedef int (*XAfterFunction) ( /* WARNING, this type not in Xlib spec */ + Display* /* display */ +); + +/* !BEGIN!: Do not edit below this line. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Exported function declarations: + */ + +#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */ +/* 0 */ +EXTERN int XSetDashes(Display *display, GC gc, int dash_offset, + _Xconst char *dash_list, int n); +/* 1 */ +EXTERN XModifierKeymap * XGetModifierMapping(Display *d); +/* 2 */ +EXTERN XImage * XCreateImage(Display *d, Visual *v, unsigned int ui1, + int i1, int i2, char *cp, unsigned int ui2, + unsigned int ui3, int i3, int i4); +/* 3 */ +EXTERN XImage * XGetImage(Display *d, Drawable dr, int i1, int i2, + unsigned int ui1, unsigned int ui2, + unsigned long ul, int i3); +/* 4 */ +EXTERN char * XGetAtomName(Display *d, Atom a); +/* 5 */ +EXTERN char * XKeysymToString(KeySym k); +/* 6 */ +EXTERN Colormap XCreateColormap(Display *d, Window w, Visual *v, + int i); +/* 7 */ +EXTERN Cursor XCreatePixmapCursor(Display *d, Pixmap p1, Pixmap p2, + XColor *x1, XColor *x2, unsigned int ui1, + unsigned int ui2); +/* 8 */ +EXTERN Cursor XCreateGlyphCursor(Display *d, Font f1, Font f2, + unsigned int ui1, unsigned int ui2, + XColor _Xconst *x1, XColor _Xconst *x2); +/* 9 */ +EXTERN GContext XGContextFromGC(GC g); +/* 10 */ +EXTERN XHostAddress * XListHosts(Display *d, int *i, Bool *b); +/* 11 */ +EXTERN KeySym XKeycodeToKeysym(Display *d, unsigned int k, int i); +/* 12 */ +EXTERN KeySym XStringToKeysym(_Xconst char *c); +/* 13 */ +EXTERN Window XRootWindow(Display *d, int i); +/* 14 */ +EXTERN XErrorHandler XSetErrorHandler(XErrorHandler x); +/* 15 */ +EXTERN Status XIconifyWindow(Display *d, Window w, int i); +/* 16 */ +EXTERN Status XWithdrawWindow(Display *d, Window w, int i); +/* 17 */ +EXTERN Status XGetWMColormapWindows(Display *d, Window w, + Window **wpp, int *ip); +/* 18 */ +EXTERN Status XAllocColor(Display *d, Colormap c, XColor *xp); +/* 19 */ +EXTERN int XBell(Display *d, int i); +/* 20 */ +EXTERN int XChangeProperty(Display *d, Window w, Atom a1, + Atom a2, int i1, int i2, + _Xconst unsigned char *c, int i3); +/* 21 */ +EXTERN int XChangeWindowAttributes(Display *d, Window w, + unsigned long ul, XSetWindowAttributes *x); +/* 22 */ +EXTERN int XClearWindow(Display *d, Window w); +/* 23 */ +EXTERN int XConfigureWindow(Display *d, Window w, + unsigned int i, XWindowChanges *x); +/* 24 */ +EXTERN int XCopyArea(Display *d, Drawable dr1, Drawable dr2, + GC g, int i1, int i2, unsigned int ui1, + unsigned int ui2, int i3, int i4); +/* 25 */ +EXTERN int XCopyPlane(Display *d, Drawable dr1, Drawable dr2, + GC g, int i1, int i2, unsigned int ui1, + unsigned int ui2, int i3, int i4, + unsigned long ul); +/* 26 */ +EXTERN Pixmap XCreateBitmapFromData(Display *display, Drawable d, + _Xconst char *data, unsigned int width, + unsigned int height); +/* 27 */ +EXTERN int XDefineCursor(Display *d, Window w, Cursor c); +/* 28 */ +EXTERN int XDeleteProperty(Display *d, Window w, Atom a); +/* 29 */ +EXTERN int XDestroyWindow(Display *d, Window w); +/* 30 */ +EXTERN int XDrawArc(Display *d, Drawable dr, GC g, int i1, + int i2, unsigned int ui1, unsigned int ui2, + int i3, int i4); +/* 31 */ +EXTERN int XDrawLines(Display *d, Drawable dr, GC g, XPoint *x, + int i1, int i2); +/* 32 */ +EXTERN int XDrawRectangle(Display *d, Drawable dr, GC g, int i1, + int i2, unsigned int ui1, unsigned int ui2); +/* 33 */ +EXTERN int XFillArc(Display *d, Drawable dr, GC g, int i1, + int i2, unsigned int ui1, unsigned int ui2, + int i3, int i4); +/* 34 */ +EXTERN int XFillPolygon(Display *d, Drawable dr, GC g, + XPoint *x, int i1, int i2, int i3); +/* 35 */ +EXTERN int XFillRectangles(Display *d, Drawable dr, GC g, + XRectangle *x, int i); +/* 36 */ +EXTERN int XForceScreenSaver(Display *d, int i); +/* 37 */ +EXTERN int XFreeColormap(Display *d, Colormap c); +/* 38 */ +EXTERN int XFreeColors(Display *d, Colormap c, + unsigned long *ulp, int i, unsigned long ul); +/* 39 */ +EXTERN int XFreeCursor(Display *d, Cursor c); +/* 40 */ +EXTERN int XFreeModifiermap(XModifierKeymap *x); +/* 41 */ +EXTERN Status XGetGeometry(Display *d, Drawable dr, Window *w, + int *i1, int *i2, unsigned int *ui1, + unsigned int *ui2, unsigned int *ui3, + unsigned int *ui4); +/* 42 */ +EXTERN int XGetInputFocus(Display *d, Window *w, int *i); +/* 43 */ +EXTERN int XGetWindowProperty(Display *d, Window w, Atom a1, + long l1, long l2, Bool b, Atom a2, Atom *ap, + int *ip, unsigned long *ulp1, + unsigned long *ulp2, unsigned char **cpp); +/* 44 */ +EXTERN Status XGetWindowAttributes(Display *d, Window w, + XWindowAttributes *x); +/* 45 */ +EXTERN int XGrabKeyboard(Display *d, Window w, Bool b, int i1, + int i2, Time t); +/* 46 */ +EXTERN int XGrabPointer(Display *d, Window w1, Bool b, + unsigned int ui, int i1, int i2, Window w2, + Cursor c, Time t); +/* 47 */ +EXTERN KeyCode XKeysymToKeycode(Display *d, KeySym k); +/* 48 */ +EXTERN Status XLookupColor(Display *d, Colormap c1, + _Xconst char *c2, XColor *x1, XColor *x2); +/* 49 */ +EXTERN int XMapWindow(Display *d, Window w); +/* 50 */ +EXTERN int XMoveResizeWindow(Display *d, Window w, int i1, + int i2, unsigned int ui1, unsigned int ui2); +/* 51 */ +EXTERN int XMoveWindow(Display *d, Window w, int i1, int i2); +/* 52 */ +EXTERN int XNextEvent(Display *d, XEvent *x); +/* 53 */ +EXTERN int XPutBackEvent(Display *d, XEvent *x); +/* 54 */ +EXTERN int XQueryColors(Display *d, Colormap c, XColor *x, + int i); +/* 55 */ +EXTERN Bool XQueryPointer(Display *d, Window w1, Window *w2, + Window *w3, int *i1, int *i2, int *i3, + int *i4, unsigned int *ui); +/* 56 */ +EXTERN Status XQueryTree(Display *d, Window w1, Window *w2, + Window *w3, Window **w4, unsigned int *ui); +/* 57 */ +EXTERN int XRaiseWindow(Display *d, Window w); +/* 58 */ +EXTERN int XRefreshKeyboardMapping(XMappingEvent *x); +/* 59 */ +EXTERN int XResizeWindow(Display *d, Window w, unsigned int ui1, + unsigned int ui2); +/* 60 */ +EXTERN int XSelectInput(Display *d, Window w, long l); +/* 61 */ +EXTERN Status XSendEvent(Display *d, Window w, Bool b, long l, + XEvent *x); +/* 62 */ +EXTERN int XSetCommand(Display *d, Window w, char **c, int i); +/* 63 */ +EXTERN int XSetIconName(Display *d, Window w, _Xconst char *c); +/* 64 */ +EXTERN int XSetInputFocus(Display *d, Window w, int i, Time t); +/* 65 */ +EXTERN int XSetSelectionOwner(Display *d, Atom a, Window w, + Time t); +/* 66 */ +EXTERN int XSetWindowBackground(Display *d, Window w, + unsigned long ul); +/* 67 */ +EXTERN int XSetWindowBackgroundPixmap(Display *d, Window w, + Pixmap p); +/* 68 */ +EXTERN int XSetWindowBorder(Display *d, Window w, + unsigned long ul); +/* 69 */ +EXTERN int XSetWindowBorderPixmap(Display *d, Window w, + Pixmap p); +/* 70 */ +EXTERN int XSetWindowBorderWidth(Display *d, Window w, + unsigned int ui); +/* 71 */ +EXTERN int XSetWindowColormap(Display *d, Window w, Colormap c); +/* 72 */ +EXTERN Bool XTranslateCoordinates(Display *d, Window w1, + Window w2, int i1, int i2, int *i3, int *i4, + Window *w3); +/* 73 */ +EXTERN int XUngrabKeyboard(Display *d, Time t); +/* 74 */ +EXTERN int XUngrabPointer(Display *d, Time t); +/* 75 */ +EXTERN int XUnmapWindow(Display *d, Window w); +/* 76 */ +EXTERN int XWindowEvent(Display *d, Window w, long l, XEvent *x); +/* 77 */ +EXTERN void XDestroyIC(XIC x); +/* 78 */ +EXTERN Bool XFilterEvent(XEvent *x, Window w); +/* 79 */ +EXTERN int XmbLookupString(XIC xi, XKeyPressedEvent *xk, + char *c, int i, KeySym *k, Status *s); +/* 80 */ +EXTERN int TkPutImage(unsigned long *colors, int ncolors, + Display *display, Drawable d, GC gc, + XImage *image, int src_x, int src_y, + int dest_x, int dest_y, unsigned int width, + unsigned int height); +/* Slot 81 is reserved */ +/* 82 */ +EXTERN Status XParseColor(Display *display, Colormap map, + _Xconst char *spec, XColor *colorPtr); +/* 83 */ +EXTERN GC XCreateGC(Display *display, Drawable d, + unsigned long valuemask, XGCValues *values); +/* 84 */ +EXTERN int XFreeGC(Display *display, GC gc); +/* 85 */ +EXTERN Atom XInternAtom(Display *display, + _Xconst char *atom_name, Bool only_if_exists); +/* 86 */ +EXTERN int XSetBackground(Display *display, GC gc, + unsigned long foreground); +/* 87 */ +EXTERN int XSetForeground(Display *display, GC gc, + unsigned long foreground); +/* 88 */ +EXTERN int XSetClipMask(Display *display, GC gc, Pixmap pixmap); +/* 89 */ +EXTERN int XSetClipOrigin(Display *display, GC gc, + int clip_x_origin, int clip_y_origin); +/* 90 */ +EXTERN int XSetTSOrigin(Display *display, GC gc, + int ts_x_origin, int ts_y_origin); +/* 91 */ +EXTERN int XChangeGC(Display *d, GC gc, unsigned long mask, + XGCValues *values); +/* 92 */ +EXTERN int XSetFont(Display *display, GC gc, Font font); +/* 93 */ +EXTERN int XSetArcMode(Display *display, GC gc, int arc_mode); +/* 94 */ +EXTERN int XSetStipple(Display *display, GC gc, Pixmap stipple); +/* 95 */ +EXTERN int XSetFillRule(Display *display, GC gc, int fill_rule); +/* 96 */ +EXTERN int XSetFillStyle(Display *display, GC gc, + int fill_style); +/* 97 */ +EXTERN int XSetFunction(Display *display, GC gc, int function); +/* 98 */ +EXTERN int XSetLineAttributes(Display *display, GC gc, + unsigned int line_width, int line_style, + int cap_style, int join_style); +/* 99 */ +EXTERN int _XInitImageFuncPtrs(XImage *image); +/* 100 */ +EXTERN XIC XCreateIC(XIM xim, ...); +/* 101 */ +EXTERN XVisualInfo * XGetVisualInfo(Display *display, long vinfo_mask, + XVisualInfo *vinfo_template, + int *nitems_return); +/* 102 */ +EXTERN void XSetWMClientMachine(Display *display, Window w, + XTextProperty *text_prop); +/* 103 */ +EXTERN Status XStringListToTextProperty(char **list, int count, + XTextProperty *text_prop_return); +/* 104 */ +EXTERN int XDrawLine(Display *d, Drawable dr, GC g, int x1, + int y1, int x2, int y2); +/* 105 */ +EXTERN int XWarpPointer(Display *d, Window s, Window dw, int sx, + int sy, unsigned int sw, unsigned int sh, + int dx, int dy); +/* 106 */ +EXTERN int XFillRectangle(Display *display, Drawable d, GC gc, + int x, int y, unsigned int width, + unsigned int height); +/* 107 */ +EXTERN int XFlush(Display *display); +/* 108 */ +EXTERN int XGrabServer(Display *display); +/* 109 */ +EXTERN int XUngrabServer(Display *display); +/* 110 */ +EXTERN int XFree(void *data); +/* 111 */ +EXTERN int XNoOp(Display *display); +/* 112 */ +EXTERN XAfterFunction XSynchronize(Display *display, Bool onoff); +/* 113 */ +EXTERN int XSync(Display *display, Bool discard); +/* 114 */ +EXTERN VisualID XVisualIDFromVisual(Visual *visual); +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ +/* 0 */ +EXTERN int XSetDashes(Display *display, GC gc, int dash_offset, + _Xconst char *dash_list, int n); +/* 1 */ +EXTERN XModifierKeymap * XGetModifierMapping(Display *d); +/* 2 */ +EXTERN XImage * XCreateImage(Display *d, Visual *v, unsigned int ui1, + int i1, int i2, char *cp, unsigned int ui2, + unsigned int ui3, int i3, int i4); +/* 3 */ +EXTERN XImage * XGetImage(Display *d, Drawable dr, int i1, int i2, + unsigned int ui1, unsigned int ui2, + unsigned long ul, int i3); +/* 4 */ +EXTERN char * XGetAtomName(Display *d, Atom a); +/* 5 */ +EXTERN char * XKeysymToString(KeySym k); +/* 6 */ +EXTERN Colormap XCreateColormap(Display *d, Window w, Visual *v, + int i); +/* 7 */ +EXTERN GContext XGContextFromGC(GC g); +/* 8 */ +EXTERN KeySym XKeycodeToKeysym(Display *d, KeyCode k, int i); +/* 9 */ +EXTERN KeySym XStringToKeysym(_Xconst char *c); +/* 10 */ +EXTERN Window XRootWindow(Display *d, int i); +/* 11 */ +EXTERN XErrorHandler XSetErrorHandler(XErrorHandler x); +/* 12 */ +EXTERN Status XAllocColor(Display *d, Colormap c, XColor *xp); +/* 13 */ +EXTERN int XBell(Display *d, int i); +/* 14 */ +EXTERN void XChangeProperty(Display *d, Window w, Atom a1, + Atom a2, int i1, int i2, + _Xconst unsigned char *c, int i3); +/* 15 */ +EXTERN void XChangeWindowAttributes(Display *d, Window w, + unsigned long ul, XSetWindowAttributes *x); +/* 16 */ +EXTERN void XConfigureWindow(Display *d, Window w, + unsigned int i, XWindowChanges *x); +/* 17 */ +EXTERN void XCopyArea(Display *d, Drawable dr1, Drawable dr2, + GC g, int i1, int i2, unsigned int ui1, + unsigned int ui2, int i3, int i4); +/* 18 */ +EXTERN void XCopyPlane(Display *d, Drawable dr1, Drawable dr2, + GC g, int i1, int i2, unsigned int ui1, + unsigned int ui2, int i3, int i4, + unsigned long ul); +/* 19 */ +EXTERN Pixmap XCreateBitmapFromData(Display *display, Drawable d, + _Xconst char *data, unsigned int width, + unsigned int height); +/* 20 */ +EXTERN int XDefineCursor(Display *d, Window w, Cursor c); +/* 21 */ +EXTERN void XDestroyWindow(Display *d, Window w); +/* 22 */ +EXTERN void XDrawArc(Display *d, Drawable dr, GC g, int i1, + int i2, unsigned int ui1, unsigned int ui2, + int i3, int i4); +/* 23 */ +EXTERN int XDrawLines(Display *d, Drawable dr, GC g, XPoint *x, + int i1, int i2); +/* 24 */ +EXTERN void XDrawRectangle(Display *d, Drawable dr, GC g, int i1, + int i2, unsigned int ui1, unsigned int ui2); +/* 25 */ +EXTERN void XFillArc(Display *d, Drawable dr, GC g, int i1, + int i2, unsigned int ui1, unsigned int ui2, + int i3, int i4); +/* 26 */ +EXTERN void XFillPolygon(Display *d, Drawable dr, GC g, + XPoint *x, int i1, int i2, int i3); +/* 27 */ +EXTERN int XFillRectangles(Display *d, Drawable dr, GC g, + XRectangle *x, int i); +/* 28 */ +EXTERN int XFreeColormap(Display *d, Colormap c); +/* 29 */ +EXTERN int XFreeColors(Display *d, Colormap c, + unsigned long *ulp, int i, unsigned long ul); +/* 30 */ +EXTERN int XFreeModifiermap(XModifierKeymap *x); +/* 31 */ +EXTERN Status XGetGeometry(Display *d, Drawable dr, Window *w, + int *i1, int *i2, unsigned int *ui1, + unsigned int *ui2, unsigned int *ui3, + unsigned int *ui4); +/* 32 */ +EXTERN int XGetWindowProperty(Display *d, Window w, Atom a1, + long l1, long l2, Bool b, Atom a2, Atom *ap, + int *ip, unsigned long *ulp1, + unsigned long *ulp2, unsigned char **cpp); +/* 33 */ +EXTERN int XGrabKeyboard(Display *d, Window w, Bool b, int i1, + int i2, Time t); +/* 34 */ +EXTERN int XGrabPointer(Display *d, Window w1, Bool b, + unsigned int ui, int i1, int i2, Window w2, + Cursor c, Time t); +/* 35 */ +EXTERN KeyCode XKeysymToKeycode(Display *d, KeySym k); +/* 36 */ +EXTERN void XMapWindow(Display *d, Window w); +/* 37 */ +EXTERN void XMoveResizeWindow(Display *d, Window w, int i1, + int i2, unsigned int ui1, unsigned int ui2); +/* 38 */ +EXTERN void XMoveWindow(Display *d, Window w, int i1, int i2); +/* 39 */ +EXTERN Bool XQueryPointer(Display *d, Window w1, Window *w2, + Window *w3, int *i1, int *i2, int *i3, + int *i4, unsigned int *ui); +/* 40 */ +EXTERN void XRaiseWindow(Display *d, Window w); +/* 41 */ +EXTERN void XRefreshKeyboardMapping(XMappingEvent *x); +/* 42 */ +EXTERN void XResizeWindow(Display *d, Window w, unsigned int ui1, + unsigned int ui2); +/* 43 */ +EXTERN void XSelectInput(Display *d, Window w, long l); +/* 44 */ +EXTERN Status XSendEvent(Display *d, Window w, Bool b, long l, + XEvent *x); +/* 45 */ +EXTERN void XSetIconName(Display *d, Window w, _Xconst char *c); +/* 46 */ +EXTERN void XSetInputFocus(Display *d, Window w, int i, Time t); +/* 47 */ +EXTERN int XSetSelectionOwner(Display *d, Atom a, Window w, + Time t); +/* 48 */ +EXTERN void XSetWindowBackground(Display *d, Window w, + unsigned long ul); +/* 49 */ +EXTERN void XSetWindowBackgroundPixmap(Display *d, Window w, + Pixmap p); +/* 50 */ +EXTERN void XSetWindowBorder(Display *d, Window w, + unsigned long ul); +/* 51 */ +EXTERN void XSetWindowBorderPixmap(Display *d, Window w, + Pixmap p); +/* 52 */ +EXTERN void XSetWindowBorderWidth(Display *d, Window w, + unsigned int ui); +/* 53 */ +EXTERN void XSetWindowColormap(Display *d, Window w, Colormap c); +/* 54 */ +EXTERN void XUngrabKeyboard(Display *d, Time t); +/* 55 */ +EXTERN int XUngrabPointer(Display *d, Time t); +/* 56 */ +EXTERN void XUnmapWindow(Display *d, Window w); +/* 57 */ +EXTERN int TkPutImage(unsigned long *colors, int ncolors, + Display *display, Drawable d, GC gc, + XImage *image, int src_x, int src_y, + int dest_x, int dest_y, unsigned int width, + unsigned int height); +/* 58 */ +EXTERN Status XParseColor(Display *display, Colormap map, + _Xconst char *spec, XColor *colorPtr); +/* 59 */ +EXTERN GC XCreateGC(Display *display, Drawable d, + unsigned long valuemask, XGCValues *values); +/* 60 */ +EXTERN int XFreeGC(Display *display, GC gc); +/* 61 */ +EXTERN Atom XInternAtom(Display *display, + _Xconst char *atom_name, Bool only_if_exists); +/* 62 */ +EXTERN int XSetBackground(Display *display, GC gc, + unsigned long foreground); +/* 63 */ +EXTERN int XSetForeground(Display *display, GC gc, + unsigned long foreground); +/* 64 */ +EXTERN int XSetClipMask(Display *display, GC gc, Pixmap pixmap); +/* 65 */ +EXTERN int XSetClipOrigin(Display *display, GC gc, + int clip_x_origin, int clip_y_origin); +/* 66 */ +EXTERN int XSetTSOrigin(Display *display, GC gc, + int ts_x_origin, int ts_y_origin); +/* 67 */ +EXTERN int XChangeGC(Display *d, GC gc, unsigned long mask, + XGCValues *values); +/* 68 */ +EXTERN int XSetFont(Display *display, GC gc, Font font); +/* 69 */ +EXTERN int XSetArcMode(Display *display, GC gc, int arc_mode); +/* 70 */ +EXTERN int XSetStipple(Display *display, GC gc, Pixmap stipple); +/* 71 */ +EXTERN int XSetFillRule(Display *display, GC gc, int fill_rule); +/* 72 */ +EXTERN int XSetFillStyle(Display *display, GC gc, + int fill_style); +/* 73 */ +EXTERN int XSetFunction(Display *display, GC gc, int function); +/* 74 */ +EXTERN int XSetLineAttributes(Display *display, GC gc, + unsigned int line_width, int line_style, + int cap_style, int join_style); +/* 75 */ +EXTERN int _XInitImageFuncPtrs(XImage *image); +/* 76 */ +EXTERN XIC XCreateIC(void); +/* 77 */ +EXTERN XVisualInfo * XGetVisualInfo(Display *display, long vinfo_mask, + XVisualInfo *vinfo_template, + int *nitems_return); +/* 78 */ +EXTERN void XSetWMClientMachine(Display *display, Window w, + XTextProperty *text_prop); +/* 79 */ +EXTERN Status XStringListToTextProperty(char **list, int count, + XTextProperty *text_prop_return); +/* 80 */ +EXTERN void XDrawSegments(Display *display, Drawable d, GC gc, + XSegment *segments, int nsegments); +/* 81 */ +EXTERN void XForceScreenSaver(Display *display, int mode); +/* 82 */ +EXTERN int XDrawLine(Display *d, Drawable dr, GC g, int x1, + int y1, int x2, int y2); +/* 83 */ +EXTERN int XFillRectangle(Display *display, Drawable d, GC gc, + int x, int y, unsigned int width, + unsigned int height); +/* 84 */ +EXTERN void XClearWindow(Display *d, Window w); +/* 85 */ +EXTERN void XDrawPoint(Display *display, Drawable d, GC gc, + int x, int y); +/* 86 */ +EXTERN void XDrawPoints(Display *display, Drawable d, GC gc, + XPoint *points, int npoints, int mode); +/* 87 */ +EXTERN int XWarpPointer(Display *display, Window src_w, + Window dest_w, int src_x, int src_y, + unsigned int src_width, + unsigned int src_height, int dest_x, + int dest_y); +/* 88 */ +EXTERN void XQueryColor(Display *display, Colormap colormap, + XColor *def_in_out); +/* 89 */ +EXTERN void XQueryColors(Display *display, Colormap colormap, + XColor *defs_in_out, int ncolors); +/* 90 */ +EXTERN Status XQueryTree(Display *d, Window w1, Window *w2, + Window *w3, Window **w4, unsigned int *ui); +/* 91 */ +EXTERN int XSync(Display *display, Bool flag); +#endif /* AQUA */ + +typedef struct TkIntXlibStubs { + int magic; + void *hooks; + +#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */ + int (*xSetDashes) (Display *display, GC gc, int dash_offset, _Xconst char *dash_list, int n); /* 0 */ + XModifierKeymap * (*xGetModifierMapping) (Display *d); /* 1 */ + XImage * (*xCreateImage) (Display *d, Visual *v, unsigned int ui1, int i1, int i2, char *cp, unsigned int ui2, unsigned int ui3, int i3, int i4); /* 2 */ + XImage * (*xGetImage) (Display *d, Drawable dr, int i1, int i2, unsigned int ui1, unsigned int ui2, unsigned long ul, int i3); /* 3 */ + char * (*xGetAtomName) (Display *d, Atom a); /* 4 */ + char * (*xKeysymToString) (KeySym k); /* 5 */ + Colormap (*xCreateColormap) (Display *d, Window w, Visual *v, int i); /* 6 */ + Cursor (*xCreatePixmapCursor) (Display *d, Pixmap p1, Pixmap p2, XColor *x1, XColor *x2, unsigned int ui1, unsigned int ui2); /* 7 */ + Cursor (*xCreateGlyphCursor) (Display *d, Font f1, Font f2, unsigned int ui1, unsigned int ui2, XColor _Xconst *x1, XColor _Xconst *x2); /* 8 */ + GContext (*xGContextFromGC) (GC g); /* 9 */ + XHostAddress * (*xListHosts) (Display *d, int *i, Bool *b); /* 10 */ + KeySym (*xKeycodeToKeysym) (Display *d, unsigned int k, int i); /* 11 */ + KeySym (*xStringToKeysym) (_Xconst char *c); /* 12 */ + Window (*xRootWindow) (Display *d, int i); /* 13 */ + XErrorHandler (*xSetErrorHandler) (XErrorHandler x); /* 14 */ + Status (*xIconifyWindow) (Display *d, Window w, int i); /* 15 */ + Status (*xWithdrawWindow) (Display *d, Window w, int i); /* 16 */ + Status (*xGetWMColormapWindows) (Display *d, Window w, Window **wpp, int *ip); /* 17 */ + Status (*xAllocColor) (Display *d, Colormap c, XColor *xp); /* 18 */ + int (*xBell) (Display *d, int i); /* 19 */ + int (*xChangeProperty) (Display *d, Window w, Atom a1, Atom a2, int i1, int i2, _Xconst unsigned char *c, int i3); /* 20 */ + int (*xChangeWindowAttributes) (Display *d, Window w, unsigned long ul, XSetWindowAttributes *x); /* 21 */ + int (*xClearWindow) (Display *d, Window w); /* 22 */ + int (*xConfigureWindow) (Display *d, Window w, unsigned int i, XWindowChanges *x); /* 23 */ + int (*xCopyArea) (Display *d, Drawable dr1, Drawable dr2, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4); /* 24 */ + int (*xCopyPlane) (Display *d, Drawable dr1, Drawable dr2, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4, unsigned long ul); /* 25 */ + Pixmap (*xCreateBitmapFromData) (Display *display, Drawable d, _Xconst char *data, unsigned int width, unsigned int height); /* 26 */ + int (*xDefineCursor) (Display *d, Window w, Cursor c); /* 27 */ + int (*xDeleteProperty) (Display *d, Window w, Atom a); /* 28 */ + int (*xDestroyWindow) (Display *d, Window w); /* 29 */ + int (*xDrawArc) (Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4); /* 30 */ + int (*xDrawLines) (Display *d, Drawable dr, GC g, XPoint *x, int i1, int i2); /* 31 */ + int (*xDrawRectangle) (Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2); /* 32 */ + int (*xFillArc) (Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4); /* 33 */ + int (*xFillPolygon) (Display *d, Drawable dr, GC g, XPoint *x, int i1, int i2, int i3); /* 34 */ + int (*xFillRectangles) (Display *d, Drawable dr, GC g, XRectangle *x, int i); /* 35 */ + int (*xForceScreenSaver) (Display *d, int i); /* 36 */ + int (*xFreeColormap) (Display *d, Colormap c); /* 37 */ + int (*xFreeColors) (Display *d, Colormap c, unsigned long *ulp, int i, unsigned long ul); /* 38 */ + int (*xFreeCursor) (Display *d, Cursor c); /* 39 */ + int (*xFreeModifiermap) (XModifierKeymap *x); /* 40 */ + Status (*xGetGeometry) (Display *d, Drawable dr, Window *w, int *i1, int *i2, unsigned int *ui1, unsigned int *ui2, unsigned int *ui3, unsigned int *ui4); /* 41 */ + int (*xGetInputFocus) (Display *d, Window *w, int *i); /* 42 */ + int (*xGetWindowProperty) (Display *d, Window w, Atom a1, long l1, long l2, Bool b, Atom a2, Atom *ap, int *ip, unsigned long *ulp1, unsigned long *ulp2, unsigned char **cpp); /* 43 */ + Status (*xGetWindowAttributes) (Display *d, Window w, XWindowAttributes *x); /* 44 */ + int (*xGrabKeyboard) (Display *d, Window w, Bool b, int i1, int i2, Time t); /* 45 */ + int (*xGrabPointer) (Display *d, Window w1, Bool b, unsigned int ui, int i1, int i2, Window w2, Cursor c, Time t); /* 46 */ + KeyCode (*xKeysymToKeycode) (Display *d, KeySym k); /* 47 */ + Status (*xLookupColor) (Display *d, Colormap c1, _Xconst char *c2, XColor *x1, XColor *x2); /* 48 */ + int (*xMapWindow) (Display *d, Window w); /* 49 */ + int (*xMoveResizeWindow) (Display *d, Window w, int i1, int i2, unsigned int ui1, unsigned int ui2); /* 50 */ + int (*xMoveWindow) (Display *d, Window w, int i1, int i2); /* 51 */ + int (*xNextEvent) (Display *d, XEvent *x); /* 52 */ + int (*xPutBackEvent) (Display *d, XEvent *x); /* 53 */ + int (*xQueryColors) (Display *d, Colormap c, XColor *x, int i); /* 54 */ + Bool (*xQueryPointer) (Display *d, Window w1, Window *w2, Window *w3, int *i1, int *i2, int *i3, int *i4, unsigned int *ui); /* 55 */ + Status (*xQueryTree) (Display *d, Window w1, Window *w2, Window *w3, Window **w4, unsigned int *ui); /* 56 */ + int (*xRaiseWindow) (Display *d, Window w); /* 57 */ + int (*xRefreshKeyboardMapping) (XMappingEvent *x); /* 58 */ + int (*xResizeWindow) (Display *d, Window w, unsigned int ui1, unsigned int ui2); /* 59 */ + int (*xSelectInput) (Display *d, Window w, long l); /* 60 */ + Status (*xSendEvent) (Display *d, Window w, Bool b, long l, XEvent *x); /* 61 */ + int (*xSetCommand) (Display *d, Window w, char **c, int i); /* 62 */ + int (*xSetIconName) (Display *d, Window w, _Xconst char *c); /* 63 */ + int (*xSetInputFocus) (Display *d, Window w, int i, Time t); /* 64 */ + int (*xSetSelectionOwner) (Display *d, Atom a, Window w, Time t); /* 65 */ + int (*xSetWindowBackground) (Display *d, Window w, unsigned long ul); /* 66 */ + int (*xSetWindowBackgroundPixmap) (Display *d, Window w, Pixmap p); /* 67 */ + int (*xSetWindowBorder) (Display *d, Window w, unsigned long ul); /* 68 */ + int (*xSetWindowBorderPixmap) (Display *d, Window w, Pixmap p); /* 69 */ + int (*xSetWindowBorderWidth) (Display *d, Window w, unsigned int ui); /* 70 */ + int (*xSetWindowColormap) (Display *d, Window w, Colormap c); /* 71 */ + Bool (*xTranslateCoordinates) (Display *d, Window w1, Window w2, int i1, int i2, int *i3, int *i4, Window *w3); /* 72 */ + int (*xUngrabKeyboard) (Display *d, Time t); /* 73 */ + int (*xUngrabPointer) (Display *d, Time t); /* 74 */ + int (*xUnmapWindow) (Display *d, Window w); /* 75 */ + int (*xWindowEvent) (Display *d, Window w, long l, XEvent *x); /* 76 */ + void (*xDestroyIC) (XIC x); /* 77 */ + Bool (*xFilterEvent) (XEvent *x, Window w); /* 78 */ + int (*xmbLookupString) (XIC xi, XKeyPressedEvent *xk, char *c, int i, KeySym *k, Status *s); /* 79 */ + int (*tkPutImage) (unsigned long *colors, int ncolors, Display *display, Drawable d, GC gc, XImage *image, int src_x, int src_y, int dest_x, int dest_y, unsigned int width, unsigned int height); /* 80 */ + void (*reserved81)(void); + Status (*xParseColor) (Display *display, Colormap map, _Xconst char *spec, XColor *colorPtr); /* 82 */ + GC (*xCreateGC) (Display *display, Drawable d, unsigned long valuemask, XGCValues *values); /* 83 */ + int (*xFreeGC) (Display *display, GC gc); /* 84 */ + Atom (*xInternAtom) (Display *display, _Xconst char *atom_name, Bool only_if_exists); /* 85 */ + int (*xSetBackground) (Display *display, GC gc, unsigned long foreground); /* 86 */ + int (*xSetForeground) (Display *display, GC gc, unsigned long foreground); /* 87 */ + int (*xSetClipMask) (Display *display, GC gc, Pixmap pixmap); /* 88 */ + int (*xSetClipOrigin) (Display *display, GC gc, int clip_x_origin, int clip_y_origin); /* 89 */ + int (*xSetTSOrigin) (Display *display, GC gc, int ts_x_origin, int ts_y_origin); /* 90 */ + int (*xChangeGC) (Display *d, GC gc, unsigned long mask, XGCValues *values); /* 91 */ + int (*xSetFont) (Display *display, GC gc, Font font); /* 92 */ + int (*xSetArcMode) (Display *display, GC gc, int arc_mode); /* 93 */ + int (*xSetStipple) (Display *display, GC gc, Pixmap stipple); /* 94 */ + int (*xSetFillRule) (Display *display, GC gc, int fill_rule); /* 95 */ + int (*xSetFillStyle) (Display *display, GC gc, int fill_style); /* 96 */ + int (*xSetFunction) (Display *display, GC gc, int function); /* 97 */ + int (*xSetLineAttributes) (Display *display, GC gc, unsigned int line_width, int line_style, int cap_style, int join_style); /* 98 */ + int (*_XInitImageFuncPtrs) (XImage *image); /* 99 */ + XIC (*xCreateIC) (XIM xim, ...); /* 100 */ + XVisualInfo * (*xGetVisualInfo) (Display *display, long vinfo_mask, XVisualInfo *vinfo_template, int *nitems_return); /* 101 */ + void (*xSetWMClientMachine) (Display *display, Window w, XTextProperty *text_prop); /* 102 */ + Status (*xStringListToTextProperty) (char **list, int count, XTextProperty *text_prop_return); /* 103 */ + int (*xDrawLine) (Display *d, Drawable dr, GC g, int x1, int y1, int x2, int y2); /* 104 */ + int (*xWarpPointer) (Display *d, Window s, Window dw, int sx, int sy, unsigned int sw, unsigned int sh, int dx, int dy); /* 105 */ + int (*xFillRectangle) (Display *display, Drawable d, GC gc, int x, int y, unsigned int width, unsigned int height); /* 106 */ + int (*xFlush) (Display *display); /* 107 */ + int (*xGrabServer) (Display *display); /* 108 */ + int (*xUngrabServer) (Display *display); /* 109 */ + int (*xFree) (void *data); /* 110 */ + int (*xNoOp) (Display *display); /* 111 */ + XAfterFunction (*xSynchronize) (Display *display, Bool onoff); /* 112 */ + int (*xSync) (Display *display, Bool discard); /* 113 */ + VisualID (*xVisualIDFromVisual) (Visual *visual); /* 114 */ +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ + int (*xSetDashes) (Display *display, GC gc, int dash_offset, _Xconst char *dash_list, int n); /* 0 */ + XModifierKeymap * (*xGetModifierMapping) (Display *d); /* 1 */ + XImage * (*xCreateImage) (Display *d, Visual *v, unsigned int ui1, int i1, int i2, char *cp, unsigned int ui2, unsigned int ui3, int i3, int i4); /* 2 */ + XImage * (*xGetImage) (Display *d, Drawable dr, int i1, int i2, unsigned int ui1, unsigned int ui2, unsigned long ul, int i3); /* 3 */ + char * (*xGetAtomName) (Display *d, Atom a); /* 4 */ + char * (*xKeysymToString) (KeySym k); /* 5 */ + Colormap (*xCreateColormap) (Display *d, Window w, Visual *v, int i); /* 6 */ + GContext (*xGContextFromGC) (GC g); /* 7 */ + KeySym (*xKeycodeToKeysym) (Display *d, KeyCode k, int i); /* 8 */ + KeySym (*xStringToKeysym) (_Xconst char *c); /* 9 */ + Window (*xRootWindow) (Display *d, int i); /* 10 */ + XErrorHandler (*xSetErrorHandler) (XErrorHandler x); /* 11 */ + Status (*xAllocColor) (Display *d, Colormap c, XColor *xp); /* 12 */ + int (*xBell) (Display *d, int i); /* 13 */ + void (*xChangeProperty) (Display *d, Window w, Atom a1, Atom a2, int i1, int i2, _Xconst unsigned char *c, int i3); /* 14 */ + void (*xChangeWindowAttributes) (Display *d, Window w, unsigned long ul, XSetWindowAttributes *x); /* 15 */ + void (*xConfigureWindow) (Display *d, Window w, unsigned int i, XWindowChanges *x); /* 16 */ + void (*xCopyArea) (Display *d, Drawable dr1, Drawable dr2, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4); /* 17 */ + void (*xCopyPlane) (Display *d, Drawable dr1, Drawable dr2, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4, unsigned long ul); /* 18 */ + Pixmap (*xCreateBitmapFromData) (Display *display, Drawable d, _Xconst char *data, unsigned int width, unsigned int height); /* 19 */ + int (*xDefineCursor) (Display *d, Window w, Cursor c); /* 20 */ + void (*xDestroyWindow) (Display *d, Window w); /* 21 */ + void (*xDrawArc) (Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4); /* 22 */ + int (*xDrawLines) (Display *d, Drawable dr, GC g, XPoint *x, int i1, int i2); /* 23 */ + void (*xDrawRectangle) (Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2); /* 24 */ + void (*xFillArc) (Display *d, Drawable dr, GC g, int i1, int i2, unsigned int ui1, unsigned int ui2, int i3, int i4); /* 25 */ + void (*xFillPolygon) (Display *d, Drawable dr, GC g, XPoint *x, int i1, int i2, int i3); /* 26 */ + int (*xFillRectangles) (Display *d, Drawable dr, GC g, XRectangle *x, int i); /* 27 */ + int (*xFreeColormap) (Display *d, Colormap c); /* 28 */ + int (*xFreeColors) (Display *d, Colormap c, unsigned long *ulp, int i, unsigned long ul); /* 29 */ + int (*xFreeModifiermap) (XModifierKeymap *x); /* 30 */ + Status (*xGetGeometry) (Display *d, Drawable dr, Window *w, int *i1, int *i2, unsigned int *ui1, unsigned int *ui2, unsigned int *ui3, unsigned int *ui4); /* 31 */ + int (*xGetWindowProperty) (Display *d, Window w, Atom a1, long l1, long l2, Bool b, Atom a2, Atom *ap, int *ip, unsigned long *ulp1, unsigned long *ulp2, unsigned char **cpp); /* 32 */ + int (*xGrabKeyboard) (Display *d, Window w, Bool b, int i1, int i2, Time t); /* 33 */ + int (*xGrabPointer) (Display *d, Window w1, Bool b, unsigned int ui, int i1, int i2, Window w2, Cursor c, Time t); /* 34 */ + KeyCode (*xKeysymToKeycode) (Display *d, KeySym k); /* 35 */ + void (*xMapWindow) (Display *d, Window w); /* 36 */ + void (*xMoveResizeWindow) (Display *d, Window w, int i1, int i2, unsigned int ui1, unsigned int ui2); /* 37 */ + void (*xMoveWindow) (Display *d, Window w, int i1, int i2); /* 38 */ + Bool (*xQueryPointer) (Display *d, Window w1, Window *w2, Window *w3, int *i1, int *i2, int *i3, int *i4, unsigned int *ui); /* 39 */ + void (*xRaiseWindow) (Display *d, Window w); /* 40 */ + void (*xRefreshKeyboardMapping) (XMappingEvent *x); /* 41 */ + void (*xResizeWindow) (Display *d, Window w, unsigned int ui1, unsigned int ui2); /* 42 */ + void (*xSelectInput) (Display *d, Window w, long l); /* 43 */ + Status (*xSendEvent) (Display *d, Window w, Bool b, long l, XEvent *x); /* 44 */ + void (*xSetIconName) (Display *d, Window w, _Xconst char *c); /* 45 */ + void (*xSetInputFocus) (Display *d, Window w, int i, Time t); /* 46 */ + int (*xSetSelectionOwner) (Display *d, Atom a, Window w, Time t); /* 47 */ + void (*xSetWindowBackground) (Display *d, Window w, unsigned long ul); /* 48 */ + void (*xSetWindowBackgroundPixmap) (Display *d, Window w, Pixmap p); /* 49 */ + void (*xSetWindowBorder) (Display *d, Window w, unsigned long ul); /* 50 */ + void (*xSetWindowBorderPixmap) (Display *d, Window w, Pixmap p); /* 51 */ + void (*xSetWindowBorderWidth) (Display *d, Window w, unsigned int ui); /* 52 */ + void (*xSetWindowColormap) (Display *d, Window w, Colormap c); /* 53 */ + void (*xUngrabKeyboard) (Display *d, Time t); /* 54 */ + int (*xUngrabPointer) (Display *d, Time t); /* 55 */ + void (*xUnmapWindow) (Display *d, Window w); /* 56 */ + int (*tkPutImage) (unsigned long *colors, int ncolors, Display *display, Drawable d, GC gc, XImage *image, int src_x, int src_y, int dest_x, int dest_y, unsigned int width, unsigned int height); /* 57 */ + Status (*xParseColor) (Display *display, Colormap map, _Xconst char *spec, XColor *colorPtr); /* 58 */ + GC (*xCreateGC) (Display *display, Drawable d, unsigned long valuemask, XGCValues *values); /* 59 */ + int (*xFreeGC) (Display *display, GC gc); /* 60 */ + Atom (*xInternAtom) (Display *display, _Xconst char *atom_name, Bool only_if_exists); /* 61 */ + int (*xSetBackground) (Display *display, GC gc, unsigned long foreground); /* 62 */ + int (*xSetForeground) (Display *display, GC gc, unsigned long foreground); /* 63 */ + int (*xSetClipMask) (Display *display, GC gc, Pixmap pixmap); /* 64 */ + int (*xSetClipOrigin) (Display *display, GC gc, int clip_x_origin, int clip_y_origin); /* 65 */ + int (*xSetTSOrigin) (Display *display, GC gc, int ts_x_origin, int ts_y_origin); /* 66 */ + int (*xChangeGC) (Display *d, GC gc, unsigned long mask, XGCValues *values); /* 67 */ + int (*xSetFont) (Display *display, GC gc, Font font); /* 68 */ + int (*xSetArcMode) (Display *display, GC gc, int arc_mode); /* 69 */ + int (*xSetStipple) (Display *display, GC gc, Pixmap stipple); /* 70 */ + int (*xSetFillRule) (Display *display, GC gc, int fill_rule); /* 71 */ + int (*xSetFillStyle) (Display *display, GC gc, int fill_style); /* 72 */ + int (*xSetFunction) (Display *display, GC gc, int function); /* 73 */ + int (*xSetLineAttributes) (Display *display, GC gc, unsigned int line_width, int line_style, int cap_style, int join_style); /* 74 */ + int (*_XInitImageFuncPtrs) (XImage *image); /* 75 */ + XIC (*xCreateIC) (void); /* 76 */ + XVisualInfo * (*xGetVisualInfo) (Display *display, long vinfo_mask, XVisualInfo *vinfo_template, int *nitems_return); /* 77 */ + void (*xSetWMClientMachine) (Display *display, Window w, XTextProperty *text_prop); /* 78 */ + Status (*xStringListToTextProperty) (char **list, int count, XTextProperty *text_prop_return); /* 79 */ + void (*xDrawSegments) (Display *display, Drawable d, GC gc, XSegment *segments, int nsegments); /* 80 */ + void (*xForceScreenSaver) (Display *display, int mode); /* 81 */ + int (*xDrawLine) (Display *d, Drawable dr, GC g, int x1, int y1, int x2, int y2); /* 82 */ + int (*xFillRectangle) (Display *display, Drawable d, GC gc, int x, int y, unsigned int width, unsigned int height); /* 83 */ + void (*xClearWindow) (Display *d, Window w); /* 84 */ + void (*xDrawPoint) (Display *display, Drawable d, GC gc, int x, int y); /* 85 */ + void (*xDrawPoints) (Display *display, Drawable d, GC gc, XPoint *points, int npoints, int mode); /* 86 */ + int (*xWarpPointer) (Display *display, Window src_w, Window dest_w, int src_x, int src_y, unsigned int src_width, unsigned int src_height, int dest_x, int dest_y); /* 87 */ + void (*xQueryColor) (Display *display, Colormap colormap, XColor *def_in_out); /* 88 */ + void (*xQueryColors) (Display *display, Colormap colormap, XColor *defs_in_out, int ncolors); /* 89 */ + Status (*xQueryTree) (Display *d, Window w1, Window *w2, Window *w3, Window **w4, unsigned int *ui); /* 90 */ + int (*xSync) (Display *display, Bool flag); /* 91 */ +#endif /* AQUA */ +} TkIntXlibStubs; + +extern const TkIntXlibStubs *tkIntXlibStubsPtr; + +#ifdef __cplusplus +} +#endif + +#if defined(USE_TK_STUBS) + +/* + * Inline function declarations: + */ + +#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */ +#define XSetDashes \ + (tkIntXlibStubsPtr->xSetDashes) /* 0 */ +#define XGetModifierMapping \ + (tkIntXlibStubsPtr->xGetModifierMapping) /* 1 */ +#define XCreateImage \ + (tkIntXlibStubsPtr->xCreateImage) /* 2 */ +#define XGetImage \ + (tkIntXlibStubsPtr->xGetImage) /* 3 */ +#define XGetAtomName \ + (tkIntXlibStubsPtr->xGetAtomName) /* 4 */ +#define XKeysymToString \ + (tkIntXlibStubsPtr->xKeysymToString) /* 5 */ +#define XCreateColormap \ + (tkIntXlibStubsPtr->xCreateColormap) /* 6 */ +#define XCreatePixmapCursor \ + (tkIntXlibStubsPtr->xCreatePixmapCursor) /* 7 */ +#define XCreateGlyphCursor \ + (tkIntXlibStubsPtr->xCreateGlyphCursor) /* 8 */ +#define XGContextFromGC \ + (tkIntXlibStubsPtr->xGContextFromGC) /* 9 */ +#define XListHosts \ + (tkIntXlibStubsPtr->xListHosts) /* 10 */ +#define XKeycodeToKeysym \ + (tkIntXlibStubsPtr->xKeycodeToKeysym) /* 11 */ +#define XStringToKeysym \ + (tkIntXlibStubsPtr->xStringToKeysym) /* 12 */ +#define XRootWindow \ + (tkIntXlibStubsPtr->xRootWindow) /* 13 */ +#define XSetErrorHandler \ + (tkIntXlibStubsPtr->xSetErrorHandler) /* 14 */ +#define XIconifyWindow \ + (tkIntXlibStubsPtr->xIconifyWindow) /* 15 */ +#define XWithdrawWindow \ + (tkIntXlibStubsPtr->xWithdrawWindow) /* 16 */ +#define XGetWMColormapWindows \ + (tkIntXlibStubsPtr->xGetWMColormapWindows) /* 17 */ +#define XAllocColor \ + (tkIntXlibStubsPtr->xAllocColor) /* 18 */ +#define XBell \ + (tkIntXlibStubsPtr->xBell) /* 19 */ +#define XChangeProperty \ + (tkIntXlibStubsPtr->xChangeProperty) /* 20 */ +#define XChangeWindowAttributes \ + (tkIntXlibStubsPtr->xChangeWindowAttributes) /* 21 */ +#define XClearWindow \ + (tkIntXlibStubsPtr->xClearWindow) /* 22 */ +#define XConfigureWindow \ + (tkIntXlibStubsPtr->xConfigureWindow) /* 23 */ +#define XCopyArea \ + (tkIntXlibStubsPtr->xCopyArea) /* 24 */ +#define XCopyPlane \ + (tkIntXlibStubsPtr->xCopyPlane) /* 25 */ +#define XCreateBitmapFromData \ + (tkIntXlibStubsPtr->xCreateBitmapFromData) /* 26 */ +#define XDefineCursor \ + (tkIntXlibStubsPtr->xDefineCursor) /* 27 */ +#define XDeleteProperty \ + (tkIntXlibStubsPtr->xDeleteProperty) /* 28 */ +#define XDestroyWindow \ + (tkIntXlibStubsPtr->xDestroyWindow) /* 29 */ +#define XDrawArc \ + (tkIntXlibStubsPtr->xDrawArc) /* 30 */ +#define XDrawLines \ + (tkIntXlibStubsPtr->xDrawLines) /* 31 */ +#define XDrawRectangle \ + (tkIntXlibStubsPtr->xDrawRectangle) /* 32 */ +#define XFillArc \ + (tkIntXlibStubsPtr->xFillArc) /* 33 */ +#define XFillPolygon \ + (tkIntXlibStubsPtr->xFillPolygon) /* 34 */ +#define XFillRectangles \ + (tkIntXlibStubsPtr->xFillRectangles) /* 35 */ +#define XForceScreenSaver \ + (tkIntXlibStubsPtr->xForceScreenSaver) /* 36 */ +#define XFreeColormap \ + (tkIntXlibStubsPtr->xFreeColormap) /* 37 */ +#define XFreeColors \ + (tkIntXlibStubsPtr->xFreeColors) /* 38 */ +#define XFreeCursor \ + (tkIntXlibStubsPtr->xFreeCursor) /* 39 */ +#define XFreeModifiermap \ + (tkIntXlibStubsPtr->xFreeModifiermap) /* 40 */ +#define XGetGeometry \ + (tkIntXlibStubsPtr->xGetGeometry) /* 41 */ +#define XGetInputFocus \ + (tkIntXlibStubsPtr->xGetInputFocus) /* 42 */ +#define XGetWindowProperty \ + (tkIntXlibStubsPtr->xGetWindowProperty) /* 43 */ +#define XGetWindowAttributes \ + (tkIntXlibStubsPtr->xGetWindowAttributes) /* 44 */ +#define XGrabKeyboard \ + (tkIntXlibStubsPtr->xGrabKeyboard) /* 45 */ +#define XGrabPointer \ + (tkIntXlibStubsPtr->xGrabPointer) /* 46 */ +#define XKeysymToKeycode \ + (tkIntXlibStubsPtr->xKeysymToKeycode) /* 47 */ +#define XLookupColor \ + (tkIntXlibStubsPtr->xLookupColor) /* 48 */ +#define XMapWindow \ + (tkIntXlibStubsPtr->xMapWindow) /* 49 */ +#define XMoveResizeWindow \ + (tkIntXlibStubsPtr->xMoveResizeWindow) /* 50 */ +#define XMoveWindow \ + (tkIntXlibStubsPtr->xMoveWindow) /* 51 */ +#define XNextEvent \ + (tkIntXlibStubsPtr->xNextEvent) /* 52 */ +#define XPutBackEvent \ + (tkIntXlibStubsPtr->xPutBackEvent) /* 53 */ +#define XQueryColors \ + (tkIntXlibStubsPtr->xQueryColors) /* 54 */ +#define XQueryPointer \ + (tkIntXlibStubsPtr->xQueryPointer) /* 55 */ +#define XQueryTree \ + (tkIntXlibStubsPtr->xQueryTree) /* 56 */ +#define XRaiseWindow \ + (tkIntXlibStubsPtr->xRaiseWindow) /* 57 */ +#define XRefreshKeyboardMapping \ + (tkIntXlibStubsPtr->xRefreshKeyboardMapping) /* 58 */ +#define XResizeWindow \ + (tkIntXlibStubsPtr->xResizeWindow) /* 59 */ +#define XSelectInput \ + (tkIntXlibStubsPtr->xSelectInput) /* 60 */ +#define XSendEvent \ + (tkIntXlibStubsPtr->xSendEvent) /* 61 */ +#define XSetCommand \ + (tkIntXlibStubsPtr->xSetCommand) /* 62 */ +#define XSetIconName \ + (tkIntXlibStubsPtr->xSetIconName) /* 63 */ +#define XSetInputFocus \ + (tkIntXlibStubsPtr->xSetInputFocus) /* 64 */ +#define XSetSelectionOwner \ + (tkIntXlibStubsPtr->xSetSelectionOwner) /* 65 */ +#define XSetWindowBackground \ + (tkIntXlibStubsPtr->xSetWindowBackground) /* 66 */ +#define XSetWindowBackgroundPixmap \ + (tkIntXlibStubsPtr->xSetWindowBackgroundPixmap) /* 67 */ +#define XSetWindowBorder \ + (tkIntXlibStubsPtr->xSetWindowBorder) /* 68 */ +#define XSetWindowBorderPixmap \ + (tkIntXlibStubsPtr->xSetWindowBorderPixmap) /* 69 */ +#define XSetWindowBorderWidth \ + (tkIntXlibStubsPtr->xSetWindowBorderWidth) /* 70 */ +#define XSetWindowColormap \ + (tkIntXlibStubsPtr->xSetWindowColormap) /* 71 */ +#define XTranslateCoordinates \ + (tkIntXlibStubsPtr->xTranslateCoordinates) /* 72 */ +#define XUngrabKeyboard \ + (tkIntXlibStubsPtr->xUngrabKeyboard) /* 73 */ +#define XUngrabPointer \ + (tkIntXlibStubsPtr->xUngrabPointer) /* 74 */ +#define XUnmapWindow \ + (tkIntXlibStubsPtr->xUnmapWindow) /* 75 */ +#define XWindowEvent \ + (tkIntXlibStubsPtr->xWindowEvent) /* 76 */ +#define XDestroyIC \ + (tkIntXlibStubsPtr->xDestroyIC) /* 77 */ +#define XFilterEvent \ + (tkIntXlibStubsPtr->xFilterEvent) /* 78 */ +#define XmbLookupString \ + (tkIntXlibStubsPtr->xmbLookupString) /* 79 */ +#define TkPutImage \ + (tkIntXlibStubsPtr->tkPutImage) /* 80 */ +/* Slot 81 is reserved */ +#define XParseColor \ + (tkIntXlibStubsPtr->xParseColor) /* 82 */ +#define XCreateGC \ + (tkIntXlibStubsPtr->xCreateGC) /* 83 */ +#define XFreeGC \ + (tkIntXlibStubsPtr->xFreeGC) /* 84 */ +#define XInternAtom \ + (tkIntXlibStubsPtr->xInternAtom) /* 85 */ +#define XSetBackground \ + (tkIntXlibStubsPtr->xSetBackground) /* 86 */ +#define XSetForeground \ + (tkIntXlibStubsPtr->xSetForeground) /* 87 */ +#define XSetClipMask \ + (tkIntXlibStubsPtr->xSetClipMask) /* 88 */ +#define XSetClipOrigin \ + (tkIntXlibStubsPtr->xSetClipOrigin) /* 89 */ +#define XSetTSOrigin \ + (tkIntXlibStubsPtr->xSetTSOrigin) /* 90 */ +#define XChangeGC \ + (tkIntXlibStubsPtr->xChangeGC) /* 91 */ +#define XSetFont \ + (tkIntXlibStubsPtr->xSetFont) /* 92 */ +#define XSetArcMode \ + (tkIntXlibStubsPtr->xSetArcMode) /* 93 */ +#define XSetStipple \ + (tkIntXlibStubsPtr->xSetStipple) /* 94 */ +#define XSetFillRule \ + (tkIntXlibStubsPtr->xSetFillRule) /* 95 */ +#define XSetFillStyle \ + (tkIntXlibStubsPtr->xSetFillStyle) /* 96 */ +#define XSetFunction \ + (tkIntXlibStubsPtr->xSetFunction) /* 97 */ +#define XSetLineAttributes \ + (tkIntXlibStubsPtr->xSetLineAttributes) /* 98 */ +#define _XInitImageFuncPtrs \ + (tkIntXlibStubsPtr->_XInitImageFuncPtrs) /* 99 */ +#define XCreateIC \ + (tkIntXlibStubsPtr->xCreateIC) /* 100 */ +#define XGetVisualInfo \ + (tkIntXlibStubsPtr->xGetVisualInfo) /* 101 */ +#define XSetWMClientMachine \ + (tkIntXlibStubsPtr->xSetWMClientMachine) /* 102 */ +#define XStringListToTextProperty \ + (tkIntXlibStubsPtr->xStringListToTextProperty) /* 103 */ +#define XDrawLine \ + (tkIntXlibStubsPtr->xDrawLine) /* 104 */ +#define XWarpPointer \ + (tkIntXlibStubsPtr->xWarpPointer) /* 105 */ +#define XFillRectangle \ + (tkIntXlibStubsPtr->xFillRectangle) /* 106 */ +#define XFlush \ + (tkIntXlibStubsPtr->xFlush) /* 107 */ +#define XGrabServer \ + (tkIntXlibStubsPtr->xGrabServer) /* 108 */ +#define XUngrabServer \ + (tkIntXlibStubsPtr->xUngrabServer) /* 109 */ +#define XFree \ + (tkIntXlibStubsPtr->xFree) /* 110 */ +#define XNoOp \ + (tkIntXlibStubsPtr->xNoOp) /* 111 */ +#define XSynchronize \ + (tkIntXlibStubsPtr->xSynchronize) /* 112 */ +#define XSync \ + (tkIntXlibStubsPtr->xSync) /* 113 */ +#define XVisualIDFromVisual \ + (tkIntXlibStubsPtr->xVisualIDFromVisual) /* 114 */ +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ +#define XSetDashes \ + (tkIntXlibStubsPtr->xSetDashes) /* 0 */ +#define XGetModifierMapping \ + (tkIntXlibStubsPtr->xGetModifierMapping) /* 1 */ +#define XCreateImage \ + (tkIntXlibStubsPtr->xCreateImage) /* 2 */ +#define XGetImage \ + (tkIntXlibStubsPtr->xGetImage) /* 3 */ +#define XGetAtomName \ + (tkIntXlibStubsPtr->xGetAtomName) /* 4 */ +#define XKeysymToString \ + (tkIntXlibStubsPtr->xKeysymToString) /* 5 */ +#define XCreateColormap \ + (tkIntXlibStubsPtr->xCreateColormap) /* 6 */ +#define XGContextFromGC \ + (tkIntXlibStubsPtr->xGContextFromGC) /* 7 */ +#define XKeycodeToKeysym \ + (tkIntXlibStubsPtr->xKeycodeToKeysym) /* 8 */ +#define XStringToKeysym \ + (tkIntXlibStubsPtr->xStringToKeysym) /* 9 */ +#define XRootWindow \ + (tkIntXlibStubsPtr->xRootWindow) /* 10 */ +#define XSetErrorHandler \ + (tkIntXlibStubsPtr->xSetErrorHandler) /* 11 */ +#define XAllocColor \ + (tkIntXlibStubsPtr->xAllocColor) /* 12 */ +#define XBell \ + (tkIntXlibStubsPtr->xBell) /* 13 */ +#define XChangeProperty \ + (tkIntXlibStubsPtr->xChangeProperty) /* 14 */ +#define XChangeWindowAttributes \ + (tkIntXlibStubsPtr->xChangeWindowAttributes) /* 15 */ +#define XConfigureWindow \ + (tkIntXlibStubsPtr->xConfigureWindow) /* 16 */ +#define XCopyArea \ + (tkIntXlibStubsPtr->xCopyArea) /* 17 */ +#define XCopyPlane \ + (tkIntXlibStubsPtr->xCopyPlane) /* 18 */ +#define XCreateBitmapFromData \ + (tkIntXlibStubsPtr->xCreateBitmapFromData) /* 19 */ +#define XDefineCursor \ + (tkIntXlibStubsPtr->xDefineCursor) /* 20 */ +#define XDestroyWindow \ + (tkIntXlibStubsPtr->xDestroyWindow) /* 21 */ +#define XDrawArc \ + (tkIntXlibStubsPtr->xDrawArc) /* 22 */ +#define XDrawLines \ + (tkIntXlibStubsPtr->xDrawLines) /* 23 */ +#define XDrawRectangle \ + (tkIntXlibStubsPtr->xDrawRectangle) /* 24 */ +#define XFillArc \ + (tkIntXlibStubsPtr->xFillArc) /* 25 */ +#define XFillPolygon \ + (tkIntXlibStubsPtr->xFillPolygon) /* 26 */ +#define XFillRectangles \ + (tkIntXlibStubsPtr->xFillRectangles) /* 27 */ +#define XFreeColormap \ + (tkIntXlibStubsPtr->xFreeColormap) /* 28 */ +#define XFreeColors \ + (tkIntXlibStubsPtr->xFreeColors) /* 29 */ +#define XFreeModifiermap \ + (tkIntXlibStubsPtr->xFreeModifiermap) /* 30 */ +#define XGetGeometry \ + (tkIntXlibStubsPtr->xGetGeometry) /* 31 */ +#define XGetWindowProperty \ + (tkIntXlibStubsPtr->xGetWindowProperty) /* 32 */ +#define XGrabKeyboard \ + (tkIntXlibStubsPtr->xGrabKeyboard) /* 33 */ +#define XGrabPointer \ + (tkIntXlibStubsPtr->xGrabPointer) /* 34 */ +#define XKeysymToKeycode \ + (tkIntXlibStubsPtr->xKeysymToKeycode) /* 35 */ +#define XMapWindow \ + (tkIntXlibStubsPtr->xMapWindow) /* 36 */ +#define XMoveResizeWindow \ + (tkIntXlibStubsPtr->xMoveResizeWindow) /* 37 */ +#define XMoveWindow \ + (tkIntXlibStubsPtr->xMoveWindow) /* 38 */ +#define XQueryPointer \ + (tkIntXlibStubsPtr->xQueryPointer) /* 39 */ +#define XRaiseWindow \ + (tkIntXlibStubsPtr->xRaiseWindow) /* 40 */ +#define XRefreshKeyboardMapping \ + (tkIntXlibStubsPtr->xRefreshKeyboardMapping) /* 41 */ +#define XResizeWindow \ + (tkIntXlibStubsPtr->xResizeWindow) /* 42 */ +#define XSelectInput \ + (tkIntXlibStubsPtr->xSelectInput) /* 43 */ +#define XSendEvent \ + (tkIntXlibStubsPtr->xSendEvent) /* 44 */ +#define XSetIconName \ + (tkIntXlibStubsPtr->xSetIconName) /* 45 */ +#define XSetInputFocus \ + (tkIntXlibStubsPtr->xSetInputFocus) /* 46 */ +#define XSetSelectionOwner \ + (tkIntXlibStubsPtr->xSetSelectionOwner) /* 47 */ +#define XSetWindowBackground \ + (tkIntXlibStubsPtr->xSetWindowBackground) /* 48 */ +#define XSetWindowBackgroundPixmap \ + (tkIntXlibStubsPtr->xSetWindowBackgroundPixmap) /* 49 */ +#define XSetWindowBorder \ + (tkIntXlibStubsPtr->xSetWindowBorder) /* 50 */ +#define XSetWindowBorderPixmap \ + (tkIntXlibStubsPtr->xSetWindowBorderPixmap) /* 51 */ +#define XSetWindowBorderWidth \ + (tkIntXlibStubsPtr->xSetWindowBorderWidth) /* 52 */ +#define XSetWindowColormap \ + (tkIntXlibStubsPtr->xSetWindowColormap) /* 53 */ +#define XUngrabKeyboard \ + (tkIntXlibStubsPtr->xUngrabKeyboard) /* 54 */ +#define XUngrabPointer \ + (tkIntXlibStubsPtr->xUngrabPointer) /* 55 */ +#define XUnmapWindow \ + (tkIntXlibStubsPtr->xUnmapWindow) /* 56 */ +#define TkPutImage \ + (tkIntXlibStubsPtr->tkPutImage) /* 57 */ +#define XParseColor \ + (tkIntXlibStubsPtr->xParseColor) /* 58 */ +#define XCreateGC \ + (tkIntXlibStubsPtr->xCreateGC) /* 59 */ +#define XFreeGC \ + (tkIntXlibStubsPtr->xFreeGC) /* 60 */ +#define XInternAtom \ + (tkIntXlibStubsPtr->xInternAtom) /* 61 */ +#define XSetBackground \ + (tkIntXlibStubsPtr->xSetBackground) /* 62 */ +#define XSetForeground \ + (tkIntXlibStubsPtr->xSetForeground) /* 63 */ +#define XSetClipMask \ + (tkIntXlibStubsPtr->xSetClipMask) /* 64 */ +#define XSetClipOrigin \ + (tkIntXlibStubsPtr->xSetClipOrigin) /* 65 */ +#define XSetTSOrigin \ + (tkIntXlibStubsPtr->xSetTSOrigin) /* 66 */ +#define XChangeGC \ + (tkIntXlibStubsPtr->xChangeGC) /* 67 */ +#define XSetFont \ + (tkIntXlibStubsPtr->xSetFont) /* 68 */ +#define XSetArcMode \ + (tkIntXlibStubsPtr->xSetArcMode) /* 69 */ +#define XSetStipple \ + (tkIntXlibStubsPtr->xSetStipple) /* 70 */ +#define XSetFillRule \ + (tkIntXlibStubsPtr->xSetFillRule) /* 71 */ +#define XSetFillStyle \ + (tkIntXlibStubsPtr->xSetFillStyle) /* 72 */ +#define XSetFunction \ + (tkIntXlibStubsPtr->xSetFunction) /* 73 */ +#define XSetLineAttributes \ + (tkIntXlibStubsPtr->xSetLineAttributes) /* 74 */ +#define _XInitImageFuncPtrs \ + (tkIntXlibStubsPtr->_XInitImageFuncPtrs) /* 75 */ +#define XCreateIC \ + (tkIntXlibStubsPtr->xCreateIC) /* 76 */ +#define XGetVisualInfo \ + (tkIntXlibStubsPtr->xGetVisualInfo) /* 77 */ +#define XSetWMClientMachine \ + (tkIntXlibStubsPtr->xSetWMClientMachine) /* 78 */ +#define XStringListToTextProperty \ + (tkIntXlibStubsPtr->xStringListToTextProperty) /* 79 */ +#define XDrawSegments \ + (tkIntXlibStubsPtr->xDrawSegments) /* 80 */ +#define XForceScreenSaver \ + (tkIntXlibStubsPtr->xForceScreenSaver) /* 81 */ +#define XDrawLine \ + (tkIntXlibStubsPtr->xDrawLine) /* 82 */ +#define XFillRectangle \ + (tkIntXlibStubsPtr->xFillRectangle) /* 83 */ +#define XClearWindow \ + (tkIntXlibStubsPtr->xClearWindow) /* 84 */ +#define XDrawPoint \ + (tkIntXlibStubsPtr->xDrawPoint) /* 85 */ +#define XDrawPoints \ + (tkIntXlibStubsPtr->xDrawPoints) /* 86 */ +#define XWarpPointer \ + (tkIntXlibStubsPtr->xWarpPointer) /* 87 */ +#define XQueryColor \ + (tkIntXlibStubsPtr->xQueryColor) /* 88 */ +#define XQueryColors \ + (tkIntXlibStubsPtr->xQueryColors) /* 89 */ +#define XQueryTree \ + (tkIntXlibStubsPtr->xQueryTree) /* 90 */ +#define XSync \ + (tkIntXlibStubsPtr->xSync) /* 91 */ +#endif /* AQUA */ + +#endif /* defined(USE_TK_STUBS) */ + +/* !END!: Do not edit above this line. */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#endif /* _TKINTXLIBDECLS */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tcl.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tcl.h new file mode 100644 index 00000000..297b42c1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tcl.h @@ -0,0 +1,2652 @@ +/* + * tcl.h -- + * + * This header file describes the externally-visible facilities of the + * Tcl interpreter. + * + * Copyright (c) 1987-1994 The Regents of the University of California. + * Copyright (c) 1993-1996 Lucent Technologies. + * Copyright (c) 1994-1998 Sun Microsystems, Inc. + * Copyright (c) 1998-2000 by Scriptics Corporation. + * Copyright (c) 2002 by Kevin B. Kenny. All rights reserved. + * + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TCL +#define _TCL + +/* + * For C++ compilers, use extern "C" + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The following defines are used to indicate the various release levels. + */ + +#define TCL_ALPHA_RELEASE 0 +#define TCL_BETA_RELEASE 1 +#define TCL_FINAL_RELEASE 2 + +/* + * When version numbers change here, must also go into the following files and + * update the version numbers: + * + * library/init.tcl (1 LOC patch) + * unix/configure.in (2 LOC Major, 2 LOC minor, 1 LOC patch) + * win/configure.in (as above) + * win/tcl.m4 (not patchlevel) + * win/makefile.bc (not patchlevel) 2 LOC + * README (sections 0 and 2, with and without separator) + * macosx/Tcl.pbproj/project.pbxproj (not patchlevel) 1 LOC + * macosx/Tcl.pbproj/default.pbxuser (not patchlevel) 1 LOC + * macosx/Tcl.xcode/project.pbxproj (not patchlevel) 2 LOC + * macosx/Tcl.xcode/default.pbxuser (not patchlevel) 1 LOC + * macosx/Tcl-Common.xcconfig (not patchlevel) 1 LOC + * win/README (not patchlevel) (sections 0 and 2) + * unix/tcl.spec (1 LOC patch) + * tools/tcl.hpj.in (not patchlevel, for windows installer) + */ + +#define TCL_MAJOR_VERSION 8 +#define TCL_MINOR_VERSION 6 +#define TCL_RELEASE_LEVEL TCL_FINAL_RELEASE +#define TCL_RELEASE_SERIAL 4 + +#define TCL_VERSION "8.6" +#define TCL_PATCH_LEVEL "8.6.4" + +/* + *---------------------------------------------------------------------------- + * The following definitions set up the proper options for Windows compilers. + * We use this method because there is no autoconf equivalent. + */ + +#ifdef _WIN32 +# ifndef __WIN32__ +# define __WIN32__ +# endif +# ifndef WIN32 +# define WIN32 +# endif +#endif + +/* + * Utility macros: STRINGIFY takes an argument and wraps it in "" (double + * quotation marks), JOIN joins two arguments. + */ + +#ifndef STRINGIFY +# define STRINGIFY(x) STRINGIFY1(x) +# define STRINGIFY1(x) #x +#endif +#ifndef JOIN +# define JOIN(a,b) JOIN1(a,b) +# define JOIN1(a,b) a##b +#endif + +/* + * A special definition used to allow this header file to be included from + * windows resource files so that they can obtain version information. + * RC_INVOKED is defined by default by the windows RC tool. + * + * Resource compilers don't like all the C stuff, like typedefs and function + * declarations, that occur below, so block them out. + */ + +#ifndef RC_INVOKED + +/* + * Special macro to define mutexes, that doesn't do anything if we are not + * using threads. + */ + +#ifdef TCL_THREADS +#define TCL_DECLARE_MUTEX(name) static Tcl_Mutex name; +#else +#define TCL_DECLARE_MUTEX(name) +#endif + +/* + * Tcl's public routine Tcl_FSSeek() uses the values SEEK_SET, SEEK_CUR, and + * SEEK_END, all #define'd by stdio.h . + * + * Also, many extensions need stdio.h, and they've grown accustomed to tcl.h + * providing it for them rather than #include-ing it themselves as they + * should, so also for their sake, we keep the #include to be consistent with + * prior Tcl releases. + */ + +#include + +/* + *---------------------------------------------------------------------------- + * Support for functions with a variable number of arguments. + * + * The following TCL_VARARGS* macros are to support old extensions + * written for older versions of Tcl where the macros permitted + * support for the varargs.h system as well as stdarg.h . + * + * New code should just directly be written to use stdarg.h conventions. + */ + +#include +#ifndef TCL_NO_DEPRECATED +# define TCL_VARARGS(type, name) (type name, ...) +# define TCL_VARARGS_DEF(type, name) (type name, ...) +# define TCL_VARARGS_START(type, name, list) (va_start(list, name), name) +#endif +#if defined(__GNUC__) && (__GNUC__ > 2) +# define TCL_FORMAT_PRINTF(a,b) __attribute__ ((__format__ (__printf__, a, b))) +#else +# define TCL_FORMAT_PRINTF(a,b) +#endif + +/* + * Allow a part of Tcl's API to be explicitly marked as deprecated. + * + * Used to make TIP 330/336 generate moans even if people use the + * compatibility macros. Change your code, guys! We won't support you forever. + */ + +#if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) +# if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) +# define TCL_DEPRECATED_API(msg) __attribute__ ((__deprecated__ (msg))) +# else +# define TCL_DEPRECATED_API(msg) __attribute__ ((__deprecated__)) +# endif +#else +# define TCL_DEPRECATED_API(msg) /* nothing portable */ +#endif + +/* + *---------------------------------------------------------------------------- + * Macros used to declare a function to be exported by a DLL. Used by Windows, + * maps to no-op declarations on non-Windows systems. The default build on + * windows is for a DLL, which causes the DLLIMPORT and DLLEXPORT macros to be + * nonempty. To build a static library, the macro STATIC_BUILD should be + * defined. + * + * Note: when building static but linking dynamically to MSVCRT we must still + * correctly decorate the C library imported function. Use CRTIMPORT + * for this purpose. _DLL is defined by the compiler when linking to + * MSVCRT. + */ + +#if (defined(_WIN32) && (defined(_MSC_VER) || (defined(__BORLANDC__) && (__BORLANDC__ >= 0x0550)) || defined(__LCC__) || defined(__WATCOMC__) || (defined(__GNUC__) && defined(__declspec)))) +# define HAVE_DECLSPEC 1 +# ifdef STATIC_BUILD +# define DLLIMPORT +# define DLLEXPORT +# ifdef _DLL +# define CRTIMPORT __declspec(dllimport) +# else +# define CRTIMPORT +# endif +# else +# define DLLIMPORT __declspec(dllimport) +# define DLLEXPORT __declspec(dllexport) +# define CRTIMPORT __declspec(dllimport) +# endif +#else +# define DLLIMPORT +# if defined(__GNUC__) && __GNUC__ > 3 +# define DLLEXPORT __attribute__ ((visibility("default"))) +# else +# define DLLEXPORT +# endif +# define CRTIMPORT +#endif + +/* + * These macros are used to control whether functions are being declared for + * import or export. If a function is being declared while it is being built + * to be included in a shared library, then it should have the DLLEXPORT + * storage class. If is being declared for use by a module that is going to + * link against the shared library, then it should have the DLLIMPORT storage + * class. If the symbol is beind declared for a static build or for use from a + * stub library, then the storage class should be empty. + * + * The convention is that a macro called BUILD_xxxx, where xxxx is the name of + * a library we are building, is set on the compile line for sources that are + * to be placed in the library. When this macro is set, the storage class will + * be set to DLLEXPORT. At the end of the header file, the storage class will + * be reset to DLLIMPORT. + */ + +#undef TCL_STORAGE_CLASS +#ifdef BUILD_tcl +# define TCL_STORAGE_CLASS DLLEXPORT +#else +# ifdef USE_TCL_STUBS +# define TCL_STORAGE_CLASS +# else +# define TCL_STORAGE_CLASS DLLIMPORT +# endif +#endif + +/* + * The following _ANSI_ARGS_ macro is to support old extensions + * written for older versions of Tcl where it permitted support + * for compilers written in the pre-prototype era of C. + * + * New code should use prototypes. + */ + +#ifndef TCL_NO_DEPRECATED +# undef _ANSI_ARGS_ +# define _ANSI_ARGS_(x) x +#endif + +/* + * Definitions that allow this header file to be used either with or without + * ANSI C features. + */ + +#ifndef INLINE +# define INLINE +#endif + +#ifdef NO_CONST +# ifndef const +# define const +# endif +#endif +#ifndef CONST +# define CONST const +#endif + +#ifdef USE_NON_CONST +# ifdef USE_COMPAT_CONST +# error define at most one of USE_NON_CONST and USE_COMPAT_CONST +# endif +# define CONST84 +# define CONST84_RETURN +#else +# ifdef USE_COMPAT_CONST +# define CONST84 +# define CONST84_RETURN const +# else +# define CONST84 const +# define CONST84_RETURN const +# endif +#endif + +#ifndef CONST86 +# define CONST86 CONST84 +#endif + +/* + * Make sure EXTERN isn't defined elsewhere. + */ + +#ifdef EXTERN +# undef EXTERN +#endif /* EXTERN */ + +#ifdef __cplusplus +# define EXTERN extern "C" TCL_STORAGE_CLASS +#else +# define EXTERN extern TCL_STORAGE_CLASS +#endif + +/* + *---------------------------------------------------------------------------- + * The following code is copied from winnt.h. If we don't replicate it here, + * then can't be included after tcl.h, since tcl.h also defines + * VOID. This block is skipped under Cygwin and Mingw. + */ + +#if defined(_WIN32) && !defined(HAVE_WINNT_IGNORE_VOID) +#ifndef VOID +#define VOID void +typedef char CHAR; +typedef short SHORT; +typedef long LONG; +#endif +#endif /* _WIN32 && !HAVE_WINNT_IGNORE_VOID */ + +/* + * Macro to use instead of "void" for arguments that must have type "void *" + * in ANSI C; maps them to type "char *" in non-ANSI systems. + */ + +#ifndef __VXWORKS__ +# ifndef NO_VOID +# define VOID void +# else +# define VOID char +# endif +#endif + +/* + * Miscellaneous declarations. + */ + +#ifndef _CLIENTDATA +# ifndef NO_VOID + typedef void *ClientData; +# else + typedef int *ClientData; +# endif +# define _CLIENTDATA +#endif + +/* + * Darwin specific configure overrides (to support fat compiles, where + * configure runs only once for multiple architectures): + */ + +#ifdef __APPLE__ +# ifdef __LP64__ +# undef TCL_WIDE_INT_TYPE +# define TCL_WIDE_INT_IS_LONG 1 +# define TCL_CFG_DO64BIT 1 +# else /* !__LP64__ */ +# define TCL_WIDE_INT_TYPE long long +# undef TCL_WIDE_INT_IS_LONG +# undef TCL_CFG_DO64BIT +# endif /* __LP64__ */ +# undef HAVE_STRUCT_STAT64 +#endif /* __APPLE__ */ + +/* + * Define Tcl_WideInt to be a type that is (at least) 64-bits wide, and define + * Tcl_WideUInt to be the unsigned variant of that type (assuming that where + * we have one, we can have the other.) + * + * Also defines the following macros: + * TCL_WIDE_INT_IS_LONG - if wide ints are really longs (i.e. we're on a real + * 64-bit system.) + * Tcl_WideAsLong - forgetful converter from wideInt to long. + * Tcl_LongAsWide - sign-extending converter from long to wideInt. + * Tcl_WideAsDouble - converter from wideInt to double. + * Tcl_DoubleAsWide - converter from double to wideInt. + * + * The following invariant should hold for any long value 'longVal': + * longVal == Tcl_WideAsLong(Tcl_LongAsWide(longVal)) + * + * Note on converting between Tcl_WideInt and strings. This implementation (in + * tclObj.c) depends on the function + * sprintf(...,"%" TCL_LL_MODIFIER "d",...). + */ + +#if !defined(TCL_WIDE_INT_TYPE)&&!defined(TCL_WIDE_INT_IS_LONG) +# if defined(_WIN32) +# define TCL_WIDE_INT_TYPE __int64 +# ifdef __BORLANDC__ +# define TCL_LL_MODIFIER "L" +# else /* __BORLANDC__ */ +# define TCL_LL_MODIFIER "I64" +# endif /* __BORLANDC__ */ +# elif defined(__GNUC__) +# define TCL_WIDE_INT_TYPE long long +# define TCL_LL_MODIFIER "ll" +# else /* ! _WIN32 && ! __GNUC__ */ +/* + * Don't know what platform it is and configure hasn't discovered what is + * going on for us. Try to guess... + */ +# include +# if (INT_MAX < LONG_MAX) +# define TCL_WIDE_INT_IS_LONG 1 +# else +# define TCL_WIDE_INT_TYPE long long +# endif +# endif /* _WIN32 */ +#endif /* !TCL_WIDE_INT_TYPE & !TCL_WIDE_INT_IS_LONG */ +#ifdef TCL_WIDE_INT_IS_LONG +# undef TCL_WIDE_INT_TYPE +# define TCL_WIDE_INT_TYPE long +#endif /* TCL_WIDE_INT_IS_LONG */ + +typedef TCL_WIDE_INT_TYPE Tcl_WideInt; +typedef unsigned TCL_WIDE_INT_TYPE Tcl_WideUInt; + +#ifdef TCL_WIDE_INT_IS_LONG +# define Tcl_WideAsLong(val) ((long)(val)) +# define Tcl_LongAsWide(val) ((long)(val)) +# define Tcl_WideAsDouble(val) ((double)((long)(val))) +# define Tcl_DoubleAsWide(val) ((long)((double)(val))) +# ifndef TCL_LL_MODIFIER +# define TCL_LL_MODIFIER "l" +# endif /* !TCL_LL_MODIFIER */ +#else /* TCL_WIDE_INT_IS_LONG */ +/* + * The next short section of defines are only done when not running on Windows + * or some other strange platform. + */ +# ifndef TCL_LL_MODIFIER +# define TCL_LL_MODIFIER "ll" +# endif /* !TCL_LL_MODIFIER */ +# define Tcl_WideAsLong(val) ((long)((Tcl_WideInt)(val))) +# define Tcl_LongAsWide(val) ((Tcl_WideInt)((long)(val))) +# define Tcl_WideAsDouble(val) ((double)((Tcl_WideInt)(val))) +# define Tcl_DoubleAsWide(val) ((Tcl_WideInt)((double)(val))) +#endif /* TCL_WIDE_INT_IS_LONG */ + +#if defined(_WIN32) +# ifdef __BORLANDC__ + typedef struct stati64 Tcl_StatBuf; +# elif defined(_WIN64) + typedef struct __stat64 Tcl_StatBuf; +# elif (defined(_MSC_VER) && (_MSC_VER < 1400)) || defined(_USE_32BIT_TIME_T) + typedef struct _stati64 Tcl_StatBuf; +# else + typedef struct _stat32i64 Tcl_StatBuf; +# endif /* _MSC_VER < 1400 */ +#elif defined(__CYGWIN__) + typedef struct { + dev_t st_dev; + unsigned short st_ino; + unsigned short st_mode; + short st_nlink; + short st_uid; + short st_gid; + /* Here is a 2-byte gap */ + dev_t st_rdev; + /* Here is a 4-byte gap */ + long long st_size; + struct {long tv_sec;} st_atim; + struct {long tv_sec;} st_mtim; + struct {long tv_sec;} st_ctim; + /* Here is a 4-byte gap */ + } Tcl_StatBuf; +#elif defined(HAVE_STRUCT_STAT64) && !defined(__APPLE__) + typedef struct stat64 Tcl_StatBuf; +#else + typedef struct stat Tcl_StatBuf; +#endif + +/* + *---------------------------------------------------------------------------- + * Data structures defined opaquely in this module. The definitions below just + * provide dummy types. A few fields are made visible in Tcl_Interp + * structures, namely those used for returning a string result from commands. + * Direct access to the result field is discouraged in Tcl 8.0. The + * interpreter result is either an object or a string, and the two values are + * kept consistent unless some C code sets interp->result directly. + * Programmers should use either the function Tcl_GetObjResult() or + * Tcl_GetStringResult() to read the interpreter's result. See the SetResult + * man page for details. + * + * Note: any change to the Tcl_Interp definition below must be mirrored in the + * "real" definition in tclInt.h. + * + * Note: Tcl_ObjCmdProc functions do not directly set result and freeProc. + * Instead, they set a Tcl_Obj member in the "real" structure that can be + * accessed with Tcl_GetObjResult() and Tcl_SetObjResult(). + */ + +typedef struct Tcl_Interp +#ifndef TCL_NO_DEPRECATED +{ + /* TIP #330: Strongly discourage extensions from using the string + * result. */ +#ifdef USE_INTERP_RESULT + char *result TCL_DEPRECATED_API("use Tcl_GetStringResult/Tcl_SetResult"); + /* If the last command returned a string + * result, this points to it. */ + void (*freeProc) (char *blockPtr) + TCL_DEPRECATED_API("use Tcl_GetStringResult/Tcl_SetResult"); + /* Zero means the string result is statically + * allocated. TCL_DYNAMIC means it was + * allocated with ckalloc and should be freed + * with ckfree. Other values give the address + * of function to invoke to free the result. + * Tcl_Eval must free it before executing next + * command. */ +#else + char *resultDontUse; /* Don't use in extensions! */ + void (*freeProcDontUse) (char *); /* Don't use in extensions! */ +#endif +#ifdef USE_INTERP_ERRORLINE + int errorLine TCL_DEPRECATED_API("use Tcl_GetErrorLine/Tcl_SetErrorLine"); + /* When TCL_ERROR is returned, this gives the + * line number within the command where the + * error occurred (1 if first line). */ +#else + int errorLineDontUse; /* Don't use in extensions! */ +#endif +} +#endif /* TCL_NO_DEPRECATED */ +Tcl_Interp; + +typedef struct Tcl_AsyncHandler_ *Tcl_AsyncHandler; +typedef struct Tcl_Channel_ *Tcl_Channel; +typedef struct Tcl_ChannelTypeVersion_ *Tcl_ChannelTypeVersion; +typedef struct Tcl_Command_ *Tcl_Command; +typedef struct Tcl_Condition_ *Tcl_Condition; +typedef struct Tcl_Dict_ *Tcl_Dict; +typedef struct Tcl_EncodingState_ *Tcl_EncodingState; +typedef struct Tcl_Encoding_ *Tcl_Encoding; +typedef struct Tcl_Event Tcl_Event; +typedef struct Tcl_InterpState_ *Tcl_InterpState; +typedef struct Tcl_LoadHandle_ *Tcl_LoadHandle; +typedef struct Tcl_Mutex_ *Tcl_Mutex; +typedef struct Tcl_Pid_ *Tcl_Pid; +typedef struct Tcl_RegExp_ *Tcl_RegExp; +typedef struct Tcl_ThreadDataKey_ *Tcl_ThreadDataKey; +typedef struct Tcl_ThreadId_ *Tcl_ThreadId; +typedef struct Tcl_TimerToken_ *Tcl_TimerToken; +typedef struct Tcl_Trace_ *Tcl_Trace; +typedef struct Tcl_Var_ *Tcl_Var; +typedef struct Tcl_ZLibStream_ *Tcl_ZlibStream; + +/* + *---------------------------------------------------------------------------- + * Definition of the interface to functions implementing threads. A function + * following this definition is given to each call of 'Tcl_CreateThread' and + * will be called as the main fuction of the new thread created by that call. + */ + +#if defined _WIN32 +typedef unsigned (__stdcall Tcl_ThreadCreateProc) (ClientData clientData); +#else +typedef void (Tcl_ThreadCreateProc) (ClientData clientData); +#endif + +/* + * Threading function return types used for abstracting away platform + * differences when writing a Tcl_ThreadCreateProc. See the NewThread function + * in generic/tclThreadTest.c for it's usage. + */ + +#if defined _WIN32 +# define Tcl_ThreadCreateType unsigned __stdcall +# define TCL_THREAD_CREATE_RETURN return 0 +#else +# define Tcl_ThreadCreateType void +# define TCL_THREAD_CREATE_RETURN +#endif + +/* + * Definition of values for default stacksize and the possible flags to be + * given to Tcl_CreateThread. + */ + +#define TCL_THREAD_STACK_DEFAULT (0) /* Use default size for stack. */ +#define TCL_THREAD_NOFLAGS (0000) /* Standard flags, default + * behaviour. */ +#define TCL_THREAD_JOINABLE (0001) /* Mark the thread as joinable. */ + +/* + * Flag values passed to Tcl_StringCaseMatch. + */ + +#define TCL_MATCH_NOCASE (1<<0) + +/* + * Flag values passed to Tcl_GetRegExpFromObj. + */ + +#define TCL_REG_BASIC 000000 /* BREs (convenience). */ +#define TCL_REG_EXTENDED 000001 /* EREs. */ +#define TCL_REG_ADVF 000002 /* Advanced features in EREs. */ +#define TCL_REG_ADVANCED 000003 /* AREs (which are also EREs). */ +#define TCL_REG_QUOTE 000004 /* No special characters, none. */ +#define TCL_REG_NOCASE 000010 /* Ignore case. */ +#define TCL_REG_NOSUB 000020 /* Don't care about subexpressions. */ +#define TCL_REG_EXPANDED 000040 /* Expanded format, white space & + * comments. */ +#define TCL_REG_NLSTOP 000100 /* \n doesn't match . or [^ ] */ +#define TCL_REG_NLANCH 000200 /* ^ matches after \n, $ before. */ +#define TCL_REG_NEWLINE 000300 /* Newlines are line terminators. */ +#define TCL_REG_CANMATCH 001000 /* Report details on partial/limited + * matches. */ + +/* + * Flags values passed to Tcl_RegExpExecObj. + */ + +#define TCL_REG_NOTBOL 0001 /* Beginning of string does not match ^. */ +#define TCL_REG_NOTEOL 0002 /* End of string does not match $. */ + +/* + * Structures filled in by Tcl_RegExpInfo. Note that all offset values are + * relative to the start of the match string, not the beginning of the entire + * string. + */ + +typedef struct Tcl_RegExpIndices { + long start; /* Character offset of first character in + * match. */ + long end; /* Character offset of first character after + * the match. */ +} Tcl_RegExpIndices; + +typedef struct Tcl_RegExpInfo { + int nsubs; /* Number of subexpressions in the compiled + * expression. */ + Tcl_RegExpIndices *matches; /* Array of nsubs match offset pairs. */ + long extendStart; /* The offset at which a subsequent match + * might begin. */ + long reserved; /* Reserved for later use. */ +} Tcl_RegExpInfo; + +/* + * Picky compilers complain if this typdef doesn't appear before the struct's + * reference in tclDecls.h. + */ + +typedef Tcl_StatBuf *Tcl_Stat_; +typedef struct stat *Tcl_OldStat_; + +/* + *---------------------------------------------------------------------------- + * When a TCL command returns, the interpreter contains a result from the + * command. Programmers are strongly encouraged to use one of the functions + * Tcl_GetObjResult() or Tcl_GetStringResult() to read the interpreter's + * result. See the SetResult man page for details. Besides this result, the + * command function returns an integer code, which is one of the following: + * + * TCL_OK Command completed normally; the interpreter's result + * contains the command's result. + * TCL_ERROR The command couldn't be completed successfully; the + * interpreter's result describes what went wrong. + * TCL_RETURN The command requests that the current function return; + * the interpreter's result contains the function's + * return value. + * TCL_BREAK The command requests that the innermost loop be + * exited; the interpreter's result is meaningless. + * TCL_CONTINUE Go on to the next iteration of the current loop; the + * interpreter's result is meaningless. + */ + +#define TCL_OK 0 +#define TCL_ERROR 1 +#define TCL_RETURN 2 +#define TCL_BREAK 3 +#define TCL_CONTINUE 4 + +#define TCL_RESULT_SIZE 200 + +/* + *---------------------------------------------------------------------------- + * Flags to control what substitutions are performed by Tcl_SubstObj(): + */ + +#define TCL_SUBST_COMMANDS 001 +#define TCL_SUBST_VARIABLES 002 +#define TCL_SUBST_BACKSLASHES 004 +#define TCL_SUBST_ALL 007 + +/* + * Argument descriptors for math function callbacks in expressions: + */ + +typedef enum { + TCL_INT, TCL_DOUBLE, TCL_EITHER, TCL_WIDE_INT +} Tcl_ValueType; + +typedef struct Tcl_Value { + Tcl_ValueType type; /* Indicates intValue or doubleValue is valid, + * or both. */ + long intValue; /* Integer value. */ + double doubleValue; /* Double-precision floating value. */ + Tcl_WideInt wideValue; /* Wide (min. 64-bit) integer value. */ +} Tcl_Value; + +/* + * Forward declaration of Tcl_Obj to prevent an error when the forward + * reference to Tcl_Obj is encountered in the function types declared below. + */ + +struct Tcl_Obj; + +/* + *---------------------------------------------------------------------------- + * Function types defined by Tcl: + */ + +typedef int (Tcl_AppInitProc) (Tcl_Interp *interp); +typedef int (Tcl_AsyncProc) (ClientData clientData, Tcl_Interp *interp, + int code); +typedef void (Tcl_ChannelProc) (ClientData clientData, int mask); +typedef void (Tcl_CloseProc) (ClientData data); +typedef void (Tcl_CmdDeleteProc) (ClientData clientData); +typedef int (Tcl_CmdProc) (ClientData clientData, Tcl_Interp *interp, + int argc, CONST84 char *argv[]); +typedef void (Tcl_CmdTraceProc) (ClientData clientData, Tcl_Interp *interp, + int level, char *command, Tcl_CmdProc *proc, + ClientData cmdClientData, int argc, CONST84 char *argv[]); +typedef int (Tcl_CmdObjTraceProc) (ClientData clientData, Tcl_Interp *interp, + int level, const char *command, Tcl_Command commandInfo, int objc, + struct Tcl_Obj *const *objv); +typedef void (Tcl_CmdObjTraceDeleteProc) (ClientData clientData); +typedef void (Tcl_DupInternalRepProc) (struct Tcl_Obj *srcPtr, + struct Tcl_Obj *dupPtr); +typedef int (Tcl_EncodingConvertProc) (ClientData clientData, const char *src, + int srcLen, int flags, Tcl_EncodingState *statePtr, char *dst, + int dstLen, int *srcReadPtr, int *dstWrotePtr, int *dstCharsPtr); +typedef void (Tcl_EncodingFreeProc) (ClientData clientData); +typedef int (Tcl_EventProc) (Tcl_Event *evPtr, int flags); +typedef void (Tcl_EventCheckProc) (ClientData clientData, int flags); +typedef int (Tcl_EventDeleteProc) (Tcl_Event *evPtr, ClientData clientData); +typedef void (Tcl_EventSetupProc) (ClientData clientData, int flags); +typedef void (Tcl_ExitProc) (ClientData clientData); +typedef void (Tcl_FileProc) (ClientData clientData, int mask); +typedef void (Tcl_FileFreeProc) (ClientData clientData); +typedef void (Tcl_FreeInternalRepProc) (struct Tcl_Obj *objPtr); +typedef void (Tcl_FreeProc) (char *blockPtr); +typedef void (Tcl_IdleProc) (ClientData clientData); +typedef void (Tcl_InterpDeleteProc) (ClientData clientData, + Tcl_Interp *interp); +typedef int (Tcl_MathProc) (ClientData clientData, Tcl_Interp *interp, + Tcl_Value *args, Tcl_Value *resultPtr); +typedef void (Tcl_NamespaceDeleteProc) (ClientData clientData); +typedef int (Tcl_ObjCmdProc) (ClientData clientData, Tcl_Interp *interp, + int objc, struct Tcl_Obj *const *objv); +typedef int (Tcl_PackageInitProc) (Tcl_Interp *interp); +typedef int (Tcl_PackageUnloadProc) (Tcl_Interp *interp, int flags); +typedef void (Tcl_PanicProc) (const char *format, ...); +typedef void (Tcl_TcpAcceptProc) (ClientData callbackData, Tcl_Channel chan, + char *address, int port); +typedef void (Tcl_TimerProc) (ClientData clientData); +typedef int (Tcl_SetFromAnyProc) (Tcl_Interp *interp, struct Tcl_Obj *objPtr); +typedef void (Tcl_UpdateStringProc) (struct Tcl_Obj *objPtr); +typedef char * (Tcl_VarTraceProc) (ClientData clientData, Tcl_Interp *interp, + CONST84 char *part1, CONST84 char *part2, int flags); +typedef void (Tcl_CommandTraceProc) (ClientData clientData, Tcl_Interp *interp, + const char *oldName, const char *newName, int flags); +typedef void (Tcl_CreateFileHandlerProc) (int fd, int mask, Tcl_FileProc *proc, + ClientData clientData); +typedef void (Tcl_DeleteFileHandlerProc) (int fd); +typedef void (Tcl_AlertNotifierProc) (ClientData clientData); +typedef void (Tcl_ServiceModeHookProc) (int mode); +typedef ClientData (Tcl_InitNotifierProc) (void); +typedef void (Tcl_FinalizeNotifierProc) (ClientData clientData); +typedef void (Tcl_MainLoopProc) (void); + +/* + *---------------------------------------------------------------------------- + * The following structure represents a type of object, which is a particular + * internal representation for an object plus a set of functions that provide + * standard operations on objects of that type. + */ + +typedef struct Tcl_ObjType { + const char *name; /* Name of the type, e.g. "int". */ + Tcl_FreeInternalRepProc *freeIntRepProc; + /* Called to free any storage for the type's + * internal rep. NULL if the internal rep does + * not need freeing. */ + Tcl_DupInternalRepProc *dupIntRepProc; + /* Called to create a new object as a copy of + * an existing object. */ + Tcl_UpdateStringProc *updateStringProc; + /* Called to update the string rep from the + * type's internal representation. */ + Tcl_SetFromAnyProc *setFromAnyProc; + /* Called to convert the object's internal rep + * to this type. Frees the internal rep of the + * old type. Returns TCL_ERROR on failure. */ +} Tcl_ObjType; + +/* + * One of the following structures exists for each object in the Tcl system. + * An object stores a value as either a string, some internal representation, + * or both. + */ + +typedef struct Tcl_Obj { + int refCount; /* When 0 the object will be freed. */ + char *bytes; /* This points to the first byte of the + * object's string representation. The array + * must be followed by a null byte (i.e., at + * offset length) but may also contain + * embedded null characters. The array's + * storage is allocated by ckalloc. NULL means + * the string rep is invalid and must be + * regenerated from the internal rep. Clients + * should use Tcl_GetStringFromObj or + * Tcl_GetString to get a pointer to the byte + * array as a readonly value. */ + int length; /* The number of bytes at *bytes, not + * including the terminating null. */ + const Tcl_ObjType *typePtr; /* Denotes the object's type. Always + * corresponds to the type of the object's + * internal rep. NULL indicates the object has + * no internal rep (has no type). */ + union { /* The internal representation: */ + long longValue; /* - an long integer value. */ + double doubleValue; /* - a double-precision floating value. */ + void *otherValuePtr; /* - another, type-specific value. */ + Tcl_WideInt wideValue; /* - a long long value. */ + struct { /* - internal rep as two pointers. */ + void *ptr1; + void *ptr2; + } twoPtrValue; + struct { /* - internal rep as a pointer and a long, + * the main use of which is a bignum's + * tightly packed fields, where the alloc, + * used and signum flags are packed into a + * single word with everything else hung + * off the pointer. */ + void *ptr; + unsigned long value; + } ptrAndLongRep; + } internalRep; +} Tcl_Obj; + +/* + * Macros to increment and decrement a Tcl_Obj's reference count, and to test + * whether an object is shared (i.e. has reference count > 1). Note: clients + * should use Tcl_DecrRefCount() when they are finished using an object, and + * should never call TclFreeObj() directly. TclFreeObj() is only defined and + * made public in tcl.h to support Tcl_DecrRefCount's macro definition. + */ + +void Tcl_IncrRefCount(Tcl_Obj *objPtr); +void Tcl_DecrRefCount(Tcl_Obj *objPtr); +int Tcl_IsShared(Tcl_Obj *objPtr); + +/* + *---------------------------------------------------------------------------- + * The following structure contains the state needed by Tcl_SaveResult. No-one + * outside of Tcl should access any of these fields. This structure is + * typically allocated on the stack. + */ + +typedef struct Tcl_SavedResult { + char *result; + Tcl_FreeProc *freeProc; + Tcl_Obj *objResultPtr; + char *appendResult; + int appendAvl; + int appendUsed; + char resultSpace[TCL_RESULT_SIZE+1]; +} Tcl_SavedResult; + +/* + *---------------------------------------------------------------------------- + * The following definitions support Tcl's namespace facility. Note: the first + * five fields must match exactly the fields in a Namespace structure (see + * tclInt.h). + */ + +typedef struct Tcl_Namespace { + char *name; /* The namespace's name within its parent + * namespace. This contains no ::'s. The name + * of the global namespace is "" although "::" + * is an synonym. */ + char *fullName; /* The namespace's fully qualified name. This + * starts with ::. */ + ClientData clientData; /* Arbitrary value associated with this + * namespace. */ + Tcl_NamespaceDeleteProc *deleteProc; + /* Function invoked when deleting the + * namespace to, e.g., free clientData. */ + struct Tcl_Namespace *parentPtr; + /* Points to the namespace that contains this + * one. NULL if this is the global + * namespace. */ +} Tcl_Namespace; + +/* + *---------------------------------------------------------------------------- + * The following structure represents a call frame, or activation record. A + * call frame defines a naming context for a procedure call: its local scope + * (for local variables) and its namespace scope (used for non-local + * variables; often the global :: namespace). A call frame can also define the + * naming context for a namespace eval or namespace inscope command: the + * namespace in which the command's code should execute. The Tcl_CallFrame + * structures exist only while procedures or namespace eval/inscope's are + * being executed, and provide a Tcl call stack. + * + * A call frame is initialized and pushed using Tcl_PushCallFrame and popped + * using Tcl_PopCallFrame. Storage for a Tcl_CallFrame must be provided by the + * Tcl_PushCallFrame caller, and callers typically allocate them on the C call + * stack for efficiency. For this reason, Tcl_CallFrame is defined as a + * structure and not as an opaque token. However, most Tcl_CallFrame fields + * are hidden since applications should not access them directly; others are + * declared as "dummyX". + * + * WARNING!! The structure definition must be kept consistent with the + * CallFrame structure in tclInt.h. If you change one, change the other. + */ + +typedef struct Tcl_CallFrame { + Tcl_Namespace *nsPtr; + int dummy1; + int dummy2; + void *dummy3; + void *dummy4; + void *dummy5; + int dummy6; + void *dummy7; + void *dummy8; + int dummy9; + void *dummy10; + void *dummy11; + void *dummy12; + void *dummy13; +} Tcl_CallFrame; + +/* + *---------------------------------------------------------------------------- + * Information about commands that is returned by Tcl_GetCommandInfo and + * passed to Tcl_SetCommandInfo. objProc is an objc/objv object-based command + * function while proc is a traditional Tcl argc/argv string-based function. + * Tcl_CreateObjCommand and Tcl_CreateCommand ensure that both objProc and + * proc are non-NULL and can be called to execute the command. However, it may + * be faster to call one instead of the other. The member isNativeObjectProc + * is set to 1 if an object-based function was registered by + * Tcl_CreateObjCommand, and to 0 if a string-based function was registered by + * Tcl_CreateCommand. The other function is typically set to a compatibility + * wrapper that does string-to-object or object-to-string argument conversions + * then calls the other function. + */ + +typedef struct Tcl_CmdInfo { + int isNativeObjectProc; /* 1 if objProc was registered by a call to + * Tcl_CreateObjCommand; 0 otherwise. + * Tcl_SetCmdInfo does not modify this + * field. */ + Tcl_ObjCmdProc *objProc; /* Command's object-based function. */ + ClientData objClientData; /* ClientData for object proc. */ + Tcl_CmdProc *proc; /* Command's string-based function. */ + ClientData clientData; /* ClientData for string proc. */ + Tcl_CmdDeleteProc *deleteProc; + /* Function to call when command is + * deleted. */ + ClientData deleteData; /* Value to pass to deleteProc (usually the + * same as clientData). */ + Tcl_Namespace *namespacePtr;/* Points to the namespace that contains this + * command. Note that Tcl_SetCmdInfo will not + * change a command's namespace; use + * TclRenameCommand or Tcl_Eval (of 'rename') + * to do that. */ +} Tcl_CmdInfo; + +/* + *---------------------------------------------------------------------------- + * The structure defined below is used to hold dynamic strings. The only + * fields that clients should use are string and length, accessible via the + * macros Tcl_DStringValue and Tcl_DStringLength. + */ + +#define TCL_DSTRING_STATIC_SIZE 200 +typedef struct Tcl_DString { + char *string; /* Points to beginning of string: either + * staticSpace below or a malloced array. */ + int length; /* Number of non-NULL characters in the + * string. */ + int spaceAvl; /* Total number of bytes available for the + * string and its terminating NULL char. */ + char staticSpace[TCL_DSTRING_STATIC_SIZE]; + /* Space to use in common case where string is + * small. */ +} Tcl_DString; + +#define Tcl_DStringLength(dsPtr) ((dsPtr)->length) +#define Tcl_DStringValue(dsPtr) ((dsPtr)->string) +#define Tcl_DStringTrunc Tcl_DStringSetLength + +/* + * Definitions for the maximum number of digits of precision that may be + * specified in the "tcl_precision" variable, and the number of bytes of + * buffer space required by Tcl_PrintDouble. + */ + +#define TCL_MAX_PREC 17 +#define TCL_DOUBLE_SPACE (TCL_MAX_PREC+10) + +/* + * Definition for a number of bytes of buffer space sufficient to hold the + * string representation of an integer in base 10 (assuming the existence of + * 64-bit integers). + */ + +#define TCL_INTEGER_SPACE 24 + +/* + * Flag values passed to Tcl_ConvertElement. + * TCL_DONT_USE_BRACES forces it not to enclose the element in braces, but to + * use backslash quoting instead. + * TCL_DONT_QUOTE_HASH disables the default quoting of the '#' character. It + * is safe to leave the hash unquoted when the element is not the first + * element of a list, and this flag can be used by the caller to indicate + * that condition. + */ + +#define TCL_DONT_USE_BRACES 1 +#define TCL_DONT_QUOTE_HASH 8 + +/* + * Flag that may be passed to Tcl_GetIndexFromObj to force it to disallow + * abbreviated strings. + */ + +#define TCL_EXACT 1 + +/* + *---------------------------------------------------------------------------- + * Flag values passed to Tcl_RecordAndEval, Tcl_EvalObj, Tcl_EvalObjv. + * WARNING: these bit choices must not conflict with the bit choices for + * evalFlag bits in tclInt.h! + * + * Meanings: + * TCL_NO_EVAL: Just record this command + * TCL_EVAL_GLOBAL: Execute script in global namespace + * TCL_EVAL_DIRECT: Do not compile this script + * TCL_EVAL_INVOKE: Magical Tcl_EvalObjv mode for aliases/ensembles + * o Run in iPtr->lookupNsPtr or global namespace + * o Cut out of error traces + * o Don't reset the flags controlling ensemble + * error message rewriting. + * TCL_CANCEL_UNWIND: Magical Tcl_CancelEval mode that causes the + * stack for the script in progress to be + * completely unwound. + * TCL_EVAL_NOERR: Do no exception reporting at all, just return + * as the caller will report. + */ + +#define TCL_NO_EVAL 0x010000 +#define TCL_EVAL_GLOBAL 0x020000 +#define TCL_EVAL_DIRECT 0x040000 +#define TCL_EVAL_INVOKE 0x080000 +#define TCL_CANCEL_UNWIND 0x100000 +#define TCL_EVAL_NOERR 0x200000 + +/* + * Special freeProc values that may be passed to Tcl_SetResult (see the man + * page for details): + */ + +#define TCL_VOLATILE ((Tcl_FreeProc *) 1) +#define TCL_STATIC ((Tcl_FreeProc *) 0) +#define TCL_DYNAMIC ((Tcl_FreeProc *) 3) + +/* + * Flag values passed to variable-related functions. + * WARNING: these bit choices must not conflict with the bit choice for + * TCL_CANCEL_UNWIND, above. + */ + +#define TCL_GLOBAL_ONLY 1 +#define TCL_NAMESPACE_ONLY 2 +#define TCL_APPEND_VALUE 4 +#define TCL_LIST_ELEMENT 8 +#define TCL_TRACE_READS 0x10 +#define TCL_TRACE_WRITES 0x20 +#define TCL_TRACE_UNSETS 0x40 +#define TCL_TRACE_DESTROYED 0x80 +#define TCL_INTERP_DESTROYED 0x100 +#define TCL_LEAVE_ERR_MSG 0x200 +#define TCL_TRACE_ARRAY 0x800 +#ifndef TCL_REMOVE_OBSOLETE_TRACES +/* Required to support old variable/vdelete/vinfo traces. */ +#define TCL_TRACE_OLD_STYLE 0x1000 +#endif +/* Indicate the semantics of the result of a trace. */ +#define TCL_TRACE_RESULT_DYNAMIC 0x8000 +#define TCL_TRACE_RESULT_OBJECT 0x10000 + +/* + * Flag values for ensemble commands. + */ + +#define TCL_ENSEMBLE_PREFIX 0x02/* Flag value to say whether to allow + * unambiguous prefixes of commands or to + * require exact matches for command names. */ + +/* + * Flag values passed to command-related functions. + */ + +#define TCL_TRACE_RENAME 0x2000 +#define TCL_TRACE_DELETE 0x4000 + +#define TCL_ALLOW_INLINE_COMPILATION 0x20000 + +/* + * The TCL_PARSE_PART1 flag is deprecated and has no effect. The part1 is now + * always parsed whenever the part2 is NULL. (This is to avoid a common error + * when converting code to use the new object based APIs and forgetting to + * give the flag) + */ + +#ifndef TCL_NO_DEPRECATED +# define TCL_PARSE_PART1 0x400 +#endif + +/* + * Types for linked variables: + */ + +#define TCL_LINK_INT 1 +#define TCL_LINK_DOUBLE 2 +#define TCL_LINK_BOOLEAN 3 +#define TCL_LINK_STRING 4 +#define TCL_LINK_WIDE_INT 5 +#define TCL_LINK_CHAR 6 +#define TCL_LINK_UCHAR 7 +#define TCL_LINK_SHORT 8 +#define TCL_LINK_USHORT 9 +#define TCL_LINK_UINT 10 +#define TCL_LINK_LONG 11 +#define TCL_LINK_ULONG 12 +#define TCL_LINK_FLOAT 13 +#define TCL_LINK_WIDE_UINT 14 +#define TCL_LINK_READ_ONLY 0x80 + +/* + *---------------------------------------------------------------------------- + * Forward declarations of Tcl_HashTable and related types. + */ + +typedef struct Tcl_HashKeyType Tcl_HashKeyType; +typedef struct Tcl_HashTable Tcl_HashTable; +typedef struct Tcl_HashEntry Tcl_HashEntry; + +typedef unsigned (Tcl_HashKeyProc) (Tcl_HashTable *tablePtr, void *keyPtr); +typedef int (Tcl_CompareHashKeysProc) (void *keyPtr, Tcl_HashEntry *hPtr); +typedef Tcl_HashEntry * (Tcl_AllocHashEntryProc) (Tcl_HashTable *tablePtr, + void *keyPtr); +typedef void (Tcl_FreeHashEntryProc) (Tcl_HashEntry *hPtr); + +/* + * This flag controls whether the hash table stores the hash of a key, or + * recalculates it. There should be no reason for turning this flag off as it + * is completely binary and source compatible unless you directly access the + * bucketPtr member of the Tcl_HashTableEntry structure. This member has been + * removed and the space used to store the hash value. + */ + +#ifndef TCL_HASH_KEY_STORE_HASH +# define TCL_HASH_KEY_STORE_HASH 1 +#endif + +/* + * Structure definition for an entry in a hash table. No-one outside Tcl + * should access any of these fields directly; use the macros defined below. + */ + +struct Tcl_HashEntry { + Tcl_HashEntry *nextPtr; /* Pointer to next entry in this hash bucket, + * or NULL for end of chain. */ + Tcl_HashTable *tablePtr; /* Pointer to table containing entry. */ +#if TCL_HASH_KEY_STORE_HASH + void *hash; /* Hash value, stored as pointer to ensure + * that the offsets of the fields in this + * structure are not changed. */ +#else + Tcl_HashEntry **bucketPtr; /* Pointer to bucket that points to first + * entry in this entry's chain: used for + * deleting the entry. */ +#endif + ClientData clientData; /* Application stores something here with + * Tcl_SetHashValue. */ + union { /* Key has one of these forms: */ + char *oneWordValue; /* One-word value for key. */ + Tcl_Obj *objPtr; /* Tcl_Obj * key value. */ + int words[1]; /* Multiple integer words for key. The actual + * size will be as large as necessary for this + * table's keys. */ + char string[1]; /* String for key. The actual size will be as + * large as needed to hold the key. */ + } key; /* MUST BE LAST FIELD IN RECORD!! */ +}; + +/* + * Flags used in Tcl_HashKeyType. + * + * TCL_HASH_KEY_RANDOMIZE_HASH - + * There are some things, pointers for example + * which don't hash well because they do not use + * the lower bits. If this flag is set then the + * hash table will attempt to rectify this by + * randomising the bits and then using the upper + * N bits as the index into the table. + * TCL_HASH_KEY_SYSTEM_HASH - If this flag is set then all memory internally + * allocated for the hash table that is not for an + * entry will use the system heap. + */ + +#define TCL_HASH_KEY_RANDOMIZE_HASH 0x1 +#define TCL_HASH_KEY_SYSTEM_HASH 0x2 + +/* + * Structure definition for the methods associated with a hash table key type. + */ + +#define TCL_HASH_KEY_TYPE_VERSION 1 +struct Tcl_HashKeyType { + int version; /* Version of the table. If this structure is + * extended in future then the version can be + * used to distinguish between different + * structures. */ + int flags; /* Flags, see above for details. */ + Tcl_HashKeyProc *hashKeyProc; + /* Calculates a hash value for the key. If + * this is NULL then the pointer itself is + * used as a hash value. */ + Tcl_CompareHashKeysProc *compareKeysProc; + /* Compares two keys and returns zero if they + * do not match, and non-zero if they do. If + * this is NULL then the pointers are + * compared. */ + Tcl_AllocHashEntryProc *allocEntryProc; + /* Called to allocate memory for a new entry, + * i.e. if the key is a string then this could + * allocate a single block which contains + * enough space for both the entry and the + * string. Only the key field of the allocated + * Tcl_HashEntry structure needs to be filled + * in. If something else needs to be done to + * the key, i.e. incrementing a reference + * count then that should be done by this + * function. If this is NULL then Tcl_Alloc is + * used to allocate enough space for a + * Tcl_HashEntry and the key pointer is + * assigned to key.oneWordValue. */ + Tcl_FreeHashEntryProc *freeEntryProc; + /* Called to free memory associated with an + * entry. If something else needs to be done + * to the key, i.e. decrementing a reference + * count then that should be done by this + * function. If this is NULL then Tcl_Free is + * used to free the Tcl_HashEntry. */ +}; + +/* + * Structure definition for a hash table. Must be in tcl.h so clients can + * allocate space for these structures, but clients should never access any + * fields in this structure. + */ + +#define TCL_SMALL_HASH_TABLE 4 +struct Tcl_HashTable { + Tcl_HashEntry **buckets; /* Pointer to bucket array. Each element + * points to first entry in bucket's hash + * chain, or NULL. */ + Tcl_HashEntry *staticBuckets[TCL_SMALL_HASH_TABLE]; + /* Bucket array used for small tables (to + * avoid mallocs and frees). */ + int numBuckets; /* Total number of buckets allocated at + * **bucketPtr. */ + int numEntries; /* Total number of entries present in + * table. */ + int rebuildSize; /* Enlarge table when numEntries gets to be + * this large. */ + int downShift; /* Shift count used in hashing function. + * Designed to use high-order bits of + * randomized keys. */ + int mask; /* Mask value used in hashing function. */ + int keyType; /* Type of keys used in this table. It's + * either TCL_CUSTOM_KEYS, TCL_STRING_KEYS, + * TCL_ONE_WORD_KEYS, or an integer giving the + * number of ints that is the size of the + * key. */ + Tcl_HashEntry *(*findProc) (Tcl_HashTable *tablePtr, const char *key); + Tcl_HashEntry *(*createProc) (Tcl_HashTable *tablePtr, const char *key, + int *newPtr); + const Tcl_HashKeyType *typePtr; + /* Type of the keys used in the + * Tcl_HashTable. */ +}; + +/* + * Structure definition for information used to keep track of searches through + * hash tables: + */ + +typedef struct Tcl_HashSearch { + Tcl_HashTable *tablePtr; /* Table being searched. */ + int nextIndex; /* Index of next bucket to be enumerated after + * present one. */ + Tcl_HashEntry *nextEntryPtr;/* Next entry to be enumerated in the current + * bucket. */ +} Tcl_HashSearch; + +/* + * Acceptable key types for hash tables: + * + * TCL_STRING_KEYS: The keys are strings, they are copied into the + * entry. + * TCL_ONE_WORD_KEYS: The keys are pointers, the pointer is stored + * in the entry. + * TCL_CUSTOM_TYPE_KEYS: The keys are arbitrary types which are copied + * into the entry. + * TCL_CUSTOM_PTR_KEYS: The keys are pointers to arbitrary types, the + * pointer is stored in the entry. + * + * While maintaining binary compatability the above have to be distinct values + * as they are used to differentiate between old versions of the hash table + * which don't have a typePtr and new ones which do. Once binary compatability + * is discarded in favour of making more wide spread changes TCL_STRING_KEYS + * can be the same as TCL_CUSTOM_TYPE_KEYS, and TCL_ONE_WORD_KEYS can be the + * same as TCL_CUSTOM_PTR_KEYS because they simply determine how the key is + * accessed from the entry and not the behaviour. + */ + +#define TCL_STRING_KEYS (0) +#define TCL_ONE_WORD_KEYS (1) +#define TCL_CUSTOM_TYPE_KEYS (-2) +#define TCL_CUSTOM_PTR_KEYS (-1) + +/* + * Structure definition for information used to keep track of searches through + * dictionaries. These fields should not be accessed by code outside + * tclDictObj.c + */ + +typedef struct { + void *next; /* Search position for underlying hash + * table. */ + int epoch; /* Epoch marker for dictionary being searched, + * or -1 if search has terminated. */ + Tcl_Dict dictionaryPtr; /* Reference to dictionary being searched. */ +} Tcl_DictSearch; + +/* + *---------------------------------------------------------------------------- + * Flag values to pass to Tcl_DoOneEvent to disable searches for some kinds of + * events: + */ + +#define TCL_DONT_WAIT (1<<1) +#define TCL_WINDOW_EVENTS (1<<2) +#define TCL_FILE_EVENTS (1<<3) +#define TCL_TIMER_EVENTS (1<<4) +#define TCL_IDLE_EVENTS (1<<5) /* WAS 0x10 ???? */ +#define TCL_ALL_EVENTS (~TCL_DONT_WAIT) + +/* + * The following structure defines a generic event for the Tcl event system. + * These are the things that are queued in calls to Tcl_QueueEvent and + * serviced later by Tcl_DoOneEvent. There can be many different kinds of + * events with different fields, corresponding to window events, timer events, + * etc. The structure for a particular event consists of a Tcl_Event header + * followed by additional information specific to that event. + */ + +struct Tcl_Event { + Tcl_EventProc *proc; /* Function to call to service this event. */ + struct Tcl_Event *nextPtr; /* Next in list of pending events, or NULL. */ +}; + +/* + * Positions to pass to Tcl_QueueEvent: + */ + +typedef enum { + TCL_QUEUE_TAIL, TCL_QUEUE_HEAD, TCL_QUEUE_MARK +} Tcl_QueuePosition; + +/* + * Values to pass to Tcl_SetServiceMode to specify the behavior of notifier + * event routines. + */ + +#define TCL_SERVICE_NONE 0 +#define TCL_SERVICE_ALL 1 + +/* + * The following structure keeps is used to hold a time value, either as an + * absolute time (the number of seconds from the epoch) or as an elapsed time. + * On Unix systems the epoch is Midnight Jan 1, 1970 GMT. + */ + +typedef struct Tcl_Time { + long sec; /* Seconds. */ + long usec; /* Microseconds. */ +} Tcl_Time; + +typedef void (Tcl_SetTimerProc) (CONST86 Tcl_Time *timePtr); +typedef int (Tcl_WaitForEventProc) (CONST86 Tcl_Time *timePtr); + +/* + * TIP #233 (Virtualized Time) + */ + +typedef void (Tcl_GetTimeProc) (Tcl_Time *timebuf, ClientData clientData); +typedef void (Tcl_ScaleTimeProc) (Tcl_Time *timebuf, ClientData clientData); + +/* + *---------------------------------------------------------------------------- + * Bits to pass to Tcl_CreateFileHandler and Tcl_CreateChannelHandler to + * indicate what sorts of events are of interest: + */ + +#define TCL_READABLE (1<<1) +#define TCL_WRITABLE (1<<2) +#define TCL_EXCEPTION (1<<3) + +/* + * Flag values to pass to Tcl_OpenCommandChannel to indicate the disposition + * of the stdio handles. TCL_STDIN, TCL_STDOUT, TCL_STDERR, are also used in + * Tcl_GetStdChannel. + */ + +#define TCL_STDIN (1<<1) +#define TCL_STDOUT (1<<2) +#define TCL_STDERR (1<<3) +#define TCL_ENFORCE_MODE (1<<4) + +/* + * Bits passed to Tcl_DriverClose2Proc to indicate which side of a channel + * should be closed. + */ + +#define TCL_CLOSE_READ (1<<1) +#define TCL_CLOSE_WRITE (1<<2) + +/* + * Value to use as the closeProc for a channel that supports the close2Proc + * interface. + */ + +#define TCL_CLOSE2PROC ((Tcl_DriverCloseProc *) 1) + +/* + * Channel version tag. This was introduced in 8.3.2/8.4. + */ + +#define TCL_CHANNEL_VERSION_1 ((Tcl_ChannelTypeVersion) 0x1) +#define TCL_CHANNEL_VERSION_2 ((Tcl_ChannelTypeVersion) 0x2) +#define TCL_CHANNEL_VERSION_3 ((Tcl_ChannelTypeVersion) 0x3) +#define TCL_CHANNEL_VERSION_4 ((Tcl_ChannelTypeVersion) 0x4) +#define TCL_CHANNEL_VERSION_5 ((Tcl_ChannelTypeVersion) 0x5) + +/* + * TIP #218: Channel Actions, Ids for Tcl_DriverThreadActionProc. + */ + +#define TCL_CHANNEL_THREAD_INSERT (0) +#define TCL_CHANNEL_THREAD_REMOVE (1) + +/* + * Typedefs for the various operations in a channel type: + */ + +typedef int (Tcl_DriverBlockModeProc) (ClientData instanceData, int mode); +typedef int (Tcl_DriverCloseProc) (ClientData instanceData, + Tcl_Interp *interp); +typedef int (Tcl_DriverClose2Proc) (ClientData instanceData, + Tcl_Interp *interp, int flags); +typedef int (Tcl_DriverInputProc) (ClientData instanceData, char *buf, + int toRead, int *errorCodePtr); +typedef int (Tcl_DriverOutputProc) (ClientData instanceData, + CONST84 char *buf, int toWrite, int *errorCodePtr); +typedef int (Tcl_DriverSeekProc) (ClientData instanceData, long offset, + int mode, int *errorCodePtr); +typedef int (Tcl_DriverSetOptionProc) (ClientData instanceData, + Tcl_Interp *interp, const char *optionName, + const char *value); +typedef int (Tcl_DriverGetOptionProc) (ClientData instanceData, + Tcl_Interp *interp, CONST84 char *optionName, + Tcl_DString *dsPtr); +typedef void (Tcl_DriverWatchProc) (ClientData instanceData, int mask); +typedef int (Tcl_DriverGetHandleProc) (ClientData instanceData, + int direction, ClientData *handlePtr); +typedef int (Tcl_DriverFlushProc) (ClientData instanceData); +typedef int (Tcl_DriverHandlerProc) (ClientData instanceData, + int interestMask); +typedef Tcl_WideInt (Tcl_DriverWideSeekProc) (ClientData instanceData, + Tcl_WideInt offset, int mode, int *errorCodePtr); +/* + * TIP #218, Channel Thread Actions + */ +typedef void (Tcl_DriverThreadActionProc) (ClientData instanceData, + int action); +/* + * TIP #208, File Truncation (etc.) + */ +typedef int (Tcl_DriverTruncateProc) (ClientData instanceData, + Tcl_WideInt length); + +/* + * struct Tcl_ChannelType: + * + * One such structure exists for each type (kind) of channel. It collects + * together in one place all the functions that are part of the specific + * channel type. + * + * It is recommend that the Tcl_Channel* functions are used to access elements + * of this structure, instead of direct accessing. + */ + +typedef struct Tcl_ChannelType { + const char *typeName; /* The name of the channel type in Tcl + * commands. This storage is owned by channel + * type. */ + Tcl_ChannelTypeVersion version; + /* Version of the channel type. */ + Tcl_DriverCloseProc *closeProc; + /* Function to call to close the channel, or + * TCL_CLOSE2PROC if the close2Proc should be + * used instead. */ + Tcl_DriverInputProc *inputProc; + /* Function to call for input on channel. */ + Tcl_DriverOutputProc *outputProc; + /* Function to call for output on channel. */ + Tcl_DriverSeekProc *seekProc; + /* Function to call to seek on the channel. + * May be NULL. */ + Tcl_DriverSetOptionProc *setOptionProc; + /* Set an option on a channel. */ + Tcl_DriverGetOptionProc *getOptionProc; + /* Get an option from a channel. */ + Tcl_DriverWatchProc *watchProc; + /* Set up the notifier to watch for events on + * this channel. */ + Tcl_DriverGetHandleProc *getHandleProc; + /* Get an OS handle from the channel or NULL + * if not supported. */ + Tcl_DriverClose2Proc *close2Proc; + /* Function to call to close the channel if + * the device supports closing the read & + * write sides independently. */ + Tcl_DriverBlockModeProc *blockModeProc; + /* Set blocking mode for the raw channel. May + * be NULL. */ + /* + * Only valid in TCL_CHANNEL_VERSION_2 channels or later. + */ + Tcl_DriverFlushProc *flushProc; + /* Function to call to flush a channel. May be + * NULL. */ + Tcl_DriverHandlerProc *handlerProc; + /* Function to call to handle a channel event. + * This will be passed up the stacked channel + * chain. */ + /* + * Only valid in TCL_CHANNEL_VERSION_3 channels or later. + */ + Tcl_DriverWideSeekProc *wideSeekProc; + /* Function to call to seek on the channel + * which can handle 64-bit offsets. May be + * NULL, and must be NULL if seekProc is + * NULL. */ + /* + * Only valid in TCL_CHANNEL_VERSION_4 channels or later. + * TIP #218, Channel Thread Actions. + */ + Tcl_DriverThreadActionProc *threadActionProc; + /* Function to call to notify the driver of + * thread specific activity for a channel. May + * be NULL. */ + /* + * Only valid in TCL_CHANNEL_VERSION_5 channels or later. + * TIP #208, File Truncation. + */ + Tcl_DriverTruncateProc *truncateProc; + /* Function to call to truncate the underlying + * file to a particular length. May be NULL if + * the channel does not support truncation. */ +} Tcl_ChannelType; + +/* + * The following flags determine whether the blockModeProc above should set + * the channel into blocking or nonblocking mode. They are passed as arguments + * to the blockModeProc function in the above structure. + */ + +#define TCL_MODE_BLOCKING 0 /* Put channel into blocking mode. */ +#define TCL_MODE_NONBLOCKING 1 /* Put channel into nonblocking + * mode. */ + +/* + *---------------------------------------------------------------------------- + * Enum for different types of file paths. + */ + +typedef enum Tcl_PathType { + TCL_PATH_ABSOLUTE, + TCL_PATH_RELATIVE, + TCL_PATH_VOLUME_RELATIVE +} Tcl_PathType; + +/* + * The following structure is used to pass glob type data amongst the various + * glob routines and Tcl_FSMatchInDirectory. + */ + +typedef struct Tcl_GlobTypeData { + int type; /* Corresponds to bcdpfls as in 'find -t'. */ + int perm; /* Corresponds to file permissions. */ + Tcl_Obj *macType; /* Acceptable Mac type. */ + Tcl_Obj *macCreator; /* Acceptable Mac creator. */ +} Tcl_GlobTypeData; + +/* + * Type and permission definitions for glob command. + */ + +#define TCL_GLOB_TYPE_BLOCK (1<<0) +#define TCL_GLOB_TYPE_CHAR (1<<1) +#define TCL_GLOB_TYPE_DIR (1<<2) +#define TCL_GLOB_TYPE_PIPE (1<<3) +#define TCL_GLOB_TYPE_FILE (1<<4) +#define TCL_GLOB_TYPE_LINK (1<<5) +#define TCL_GLOB_TYPE_SOCK (1<<6) +#define TCL_GLOB_TYPE_MOUNT (1<<7) + +#define TCL_GLOB_PERM_RONLY (1<<0) +#define TCL_GLOB_PERM_HIDDEN (1<<1) +#define TCL_GLOB_PERM_R (1<<2) +#define TCL_GLOB_PERM_W (1<<3) +#define TCL_GLOB_PERM_X (1<<4) + +/* + * Flags for the unload callback function. + */ + +#define TCL_UNLOAD_DETACH_FROM_INTERPRETER (1<<0) +#define TCL_UNLOAD_DETACH_FROM_PROCESS (1<<1) + +/* + * Typedefs for the various filesystem operations: + */ + +typedef int (Tcl_FSStatProc) (Tcl_Obj *pathPtr, Tcl_StatBuf *buf); +typedef int (Tcl_FSAccessProc) (Tcl_Obj *pathPtr, int mode); +typedef Tcl_Channel (Tcl_FSOpenFileChannelProc) (Tcl_Interp *interp, + Tcl_Obj *pathPtr, int mode, int permissions); +typedef int (Tcl_FSMatchInDirectoryProc) (Tcl_Interp *interp, Tcl_Obj *result, + Tcl_Obj *pathPtr, const char *pattern, Tcl_GlobTypeData *types); +typedef Tcl_Obj * (Tcl_FSGetCwdProc) (Tcl_Interp *interp); +typedef int (Tcl_FSChdirProc) (Tcl_Obj *pathPtr); +typedef int (Tcl_FSLstatProc) (Tcl_Obj *pathPtr, Tcl_StatBuf *buf); +typedef int (Tcl_FSCreateDirectoryProc) (Tcl_Obj *pathPtr); +typedef int (Tcl_FSDeleteFileProc) (Tcl_Obj *pathPtr); +typedef int (Tcl_FSCopyDirectoryProc) (Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr, Tcl_Obj **errorPtr); +typedef int (Tcl_FSCopyFileProc) (Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr); +typedef int (Tcl_FSRemoveDirectoryProc) (Tcl_Obj *pathPtr, int recursive, + Tcl_Obj **errorPtr); +typedef int (Tcl_FSRenameFileProc) (Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr); +typedef void (Tcl_FSUnloadFileProc) (Tcl_LoadHandle loadHandle); +typedef Tcl_Obj * (Tcl_FSListVolumesProc) (void); +/* We have to declare the utime structure here. */ +struct utimbuf; +typedef int (Tcl_FSUtimeProc) (Tcl_Obj *pathPtr, struct utimbuf *tval); +typedef int (Tcl_FSNormalizePathProc) (Tcl_Interp *interp, Tcl_Obj *pathPtr, + int nextCheckpoint); +typedef int (Tcl_FSFileAttrsGetProc) (Tcl_Interp *interp, int index, + Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef); +typedef const char *CONST86 * (Tcl_FSFileAttrStringsProc) (Tcl_Obj *pathPtr, + Tcl_Obj **objPtrRef); +typedef int (Tcl_FSFileAttrsSetProc) (Tcl_Interp *interp, int index, + Tcl_Obj *pathPtr, Tcl_Obj *objPtr); +typedef Tcl_Obj * (Tcl_FSLinkProc) (Tcl_Obj *pathPtr, Tcl_Obj *toPtr, + int linkType); +typedef int (Tcl_FSLoadFileProc) (Tcl_Interp *interp, Tcl_Obj *pathPtr, + Tcl_LoadHandle *handlePtr, Tcl_FSUnloadFileProc **unloadProcPtr); +typedef int (Tcl_FSPathInFilesystemProc) (Tcl_Obj *pathPtr, + ClientData *clientDataPtr); +typedef Tcl_Obj * (Tcl_FSFilesystemPathTypeProc) (Tcl_Obj *pathPtr); +typedef Tcl_Obj * (Tcl_FSFilesystemSeparatorProc) (Tcl_Obj *pathPtr); +typedef void (Tcl_FSFreeInternalRepProc) (ClientData clientData); +typedef ClientData (Tcl_FSDupInternalRepProc) (ClientData clientData); +typedef Tcl_Obj * (Tcl_FSInternalToNormalizedProc) (ClientData clientData); +typedef ClientData (Tcl_FSCreateInternalRepProc) (Tcl_Obj *pathPtr); + +typedef struct Tcl_FSVersion_ *Tcl_FSVersion; + +/* + *---------------------------------------------------------------------------- + * Data structures related to hooking into the filesystem + */ + +/* + * Filesystem version tag. This was introduced in 8.4. + */ + +#define TCL_FILESYSTEM_VERSION_1 ((Tcl_FSVersion) 0x1) + +/* + * struct Tcl_Filesystem: + * + * One such structure exists for each type (kind) of filesystem. It collects + * together in one place all the functions that are part of the specific + * filesystem. Tcl always accesses the filesystem through one of these + * structures. + * + * Not all entries need be non-NULL; any which are NULL are simply ignored. + * However, a complete filesystem should provide all of these functions. The + * explanations in the structure show the importance of each function. + */ + +typedef struct Tcl_Filesystem { + const char *typeName; /* The name of the filesystem. */ + int structureLength; /* Length of this structure, so future binary + * compatibility can be assured. */ + Tcl_FSVersion version; /* Version of the filesystem type. */ + Tcl_FSPathInFilesystemProc *pathInFilesystemProc; + /* Function to check whether a path is in this + * filesystem. This is the most important + * filesystem function. */ + Tcl_FSDupInternalRepProc *dupInternalRepProc; + /* Function to duplicate internal fs rep. May + * be NULL (but then fs is less efficient). */ + Tcl_FSFreeInternalRepProc *freeInternalRepProc; + /* Function to free internal fs rep. Must be + * implemented if internal representations + * need freeing, otherwise it can be NULL. */ + Tcl_FSInternalToNormalizedProc *internalToNormalizedProc; + /* Function to convert internal representation + * to a normalized path. Only required if the + * fs creates pure path objects with no + * string/path representation. */ + Tcl_FSCreateInternalRepProc *createInternalRepProc; + /* Function to create a filesystem-specific + * internal representation. May be NULL if + * paths have no internal representation, or + * if the Tcl_FSPathInFilesystemProc for this + * filesystem always immediately creates an + * internal representation for paths it + * accepts. */ + Tcl_FSNormalizePathProc *normalizePathProc; + /* Function to normalize a path. Should be + * implemented for all filesystems which can + * have multiple string representations for + * the same path object. */ + Tcl_FSFilesystemPathTypeProc *filesystemPathTypeProc; + /* Function to determine the type of a path in + * this filesystem. May be NULL. */ + Tcl_FSFilesystemSeparatorProc *filesystemSeparatorProc; + /* Function to return the separator + * character(s) for this filesystem. Must be + * implemented. */ + Tcl_FSStatProc *statProc; /* Function to process a 'Tcl_FSStat()' call. + * Must be implemented for any reasonable + * filesystem. */ + Tcl_FSAccessProc *accessProc; + /* Function to process a 'Tcl_FSAccess()' + * call. Must be implemented for any + * reasonable filesystem. */ + Tcl_FSOpenFileChannelProc *openFileChannelProc; + /* Function to process a + * 'Tcl_FSOpenFileChannel()' call. Must be + * implemented for any reasonable + * filesystem. */ + Tcl_FSMatchInDirectoryProc *matchInDirectoryProc; + /* Function to process a + * 'Tcl_FSMatchInDirectory()'. If not + * implemented, then glob and recursive copy + * functionality will be lacking in the + * filesystem. */ + Tcl_FSUtimeProc *utimeProc; /* Function to process a 'Tcl_FSUtime()' call. + * Required to allow setting (not reading) of + * times with 'file mtime', 'file atime' and + * the open-r/open-w/fcopy implementation of + * 'file copy'. */ + Tcl_FSLinkProc *linkProc; /* Function to process a 'Tcl_FSLink()' call. + * Should be implemented only if the + * filesystem supports links (reading or + * creating). */ + Tcl_FSListVolumesProc *listVolumesProc; + /* Function to list any filesystem volumes + * added by this filesystem. Should be + * implemented only if the filesystem adds + * volumes at the head of the filesystem. */ + Tcl_FSFileAttrStringsProc *fileAttrStringsProc; + /* Function to list all attributes strings + * which are valid for this filesystem. If not + * implemented the filesystem will not support + * the 'file attributes' command. This allows + * arbitrary additional information to be + * attached to files in the filesystem. */ + Tcl_FSFileAttrsGetProc *fileAttrsGetProc; + /* Function to process a + * 'Tcl_FSFileAttrsGet()' call, used by 'file + * attributes'. */ + Tcl_FSFileAttrsSetProc *fileAttrsSetProc; + /* Function to process a + * 'Tcl_FSFileAttrsSet()' call, used by 'file + * attributes'. */ + Tcl_FSCreateDirectoryProc *createDirectoryProc; + /* Function to process a + * 'Tcl_FSCreateDirectory()' call. Should be + * implemented unless the FS is read-only. */ + Tcl_FSRemoveDirectoryProc *removeDirectoryProc; + /* Function to process a + * 'Tcl_FSRemoveDirectory()' call. Should be + * implemented unless the FS is read-only. */ + Tcl_FSDeleteFileProc *deleteFileProc; + /* Function to process a 'Tcl_FSDeleteFile()' + * call. Should be implemented unless the FS + * is read-only. */ + Tcl_FSCopyFileProc *copyFileProc; + /* Function to process a 'Tcl_FSCopyFile()' + * call. If not implemented Tcl will fall back + * on open-r, open-w and fcopy as a copying + * mechanism, for copying actions initiated in + * Tcl (not C). */ + Tcl_FSRenameFileProc *renameFileProc; + /* Function to process a 'Tcl_FSRenameFile()' + * call. If not implemented, Tcl will fall + * back on a copy and delete mechanism, for + * rename actions initiated in Tcl (not C). */ + Tcl_FSCopyDirectoryProc *copyDirectoryProc; + /* Function to process a + * 'Tcl_FSCopyDirectory()' call. If not + * implemented, Tcl will fall back on a + * recursive create-dir, file copy mechanism, + * for copying actions initiated in Tcl (not + * C). */ + Tcl_FSLstatProc *lstatProc; /* Function to process a 'Tcl_FSLstat()' call. + * If not implemented, Tcl will attempt to use + * the 'statProc' defined above instead. */ + Tcl_FSLoadFileProc *loadFileProc; + /* Function to process a 'Tcl_FSLoadFile()' + * call. If not implemented, Tcl will fall + * back on a copy to native-temp followed by a + * Tcl_FSLoadFile on that temporary copy. */ + Tcl_FSGetCwdProc *getCwdProc; + /* Function to process a 'Tcl_FSGetCwd()' + * call. Most filesystems need not implement + * this. It will usually only be called once, + * if 'getcwd' is called before 'chdir'. May + * be NULL. */ + Tcl_FSChdirProc *chdirProc; /* Function to process a 'Tcl_FSChdir()' call. + * If filesystems do not implement this, it + * will be emulated by a series of directory + * access checks. Otherwise, virtual + * filesystems which do implement it need only + * respond with a positive return result if + * the dirName is a valid directory in their + * filesystem. They need not remember the + * result, since that will be automatically + * remembered for use by GetCwd. Real + * filesystems should carry out the correct + * action (i.e. call the correct system + * 'chdir' api). If not implemented, then 'cd' + * and 'pwd' will fail inside the + * filesystem. */ +} Tcl_Filesystem; + +/* + * The following definitions are used as values for the 'linkAction' flag to + * Tcl_FSLink, or the linkProc of any filesystem. Any combination of flags can + * be given. For link creation, the linkProc should create a link which + * matches any of the types given. + * + * TCL_CREATE_SYMBOLIC_LINK - Create a symbolic or soft link. + * TCL_CREATE_HARD_LINK - Create a hard link. + */ + +#define TCL_CREATE_SYMBOLIC_LINK 0x01 +#define TCL_CREATE_HARD_LINK 0x02 + +/* + *---------------------------------------------------------------------------- + * The following structure represents the Notifier functions that you can + * override with the Tcl_SetNotifier call. + */ + +typedef struct Tcl_NotifierProcs { + Tcl_SetTimerProc *setTimerProc; + Tcl_WaitForEventProc *waitForEventProc; + Tcl_CreateFileHandlerProc *createFileHandlerProc; + Tcl_DeleteFileHandlerProc *deleteFileHandlerProc; + Tcl_InitNotifierProc *initNotifierProc; + Tcl_FinalizeNotifierProc *finalizeNotifierProc; + Tcl_AlertNotifierProc *alertNotifierProc; + Tcl_ServiceModeHookProc *serviceModeHookProc; +} Tcl_NotifierProcs; + +/* + *---------------------------------------------------------------------------- + * The following data structures and declarations are for the new Tcl parser. + * + * For each word of a command, and for each piece of a word such as a variable + * reference, one of the following structures is created to describe the + * token. + */ + +typedef struct Tcl_Token { + int type; /* Type of token, such as TCL_TOKEN_WORD; see + * below for valid types. */ + const char *start; /* First character in token. */ + int size; /* Number of bytes in token. */ + int numComponents; /* If this token is composed of other tokens, + * this field tells how many of them there are + * (including components of components, etc.). + * The component tokens immediately follow + * this one. */ +} Tcl_Token; + +/* + * Type values defined for Tcl_Token structures. These values are defined as + * mask bits so that it's easy to check for collections of types. + * + * TCL_TOKEN_WORD - The token describes one word of a command, + * from the first non-blank character of the word + * (which may be " or {) up to but not including + * the space, semicolon, or bracket that + * terminates the word. NumComponents counts the + * total number of sub-tokens that make up the + * word. This includes, for example, sub-tokens + * of TCL_TOKEN_VARIABLE tokens. + * TCL_TOKEN_SIMPLE_WORD - This token is just like TCL_TOKEN_WORD except + * that the word is guaranteed to consist of a + * single TCL_TOKEN_TEXT sub-token. + * TCL_TOKEN_TEXT - The token describes a range of literal text + * that is part of a word. NumComponents is + * always 0. + * TCL_TOKEN_BS - The token describes a backslash sequence that + * must be collapsed. NumComponents is always 0. + * TCL_TOKEN_COMMAND - The token describes a command whose result + * must be substituted into the word. The token + * includes the enclosing brackets. NumComponents + * is always 0. + * TCL_TOKEN_VARIABLE - The token describes a variable substitution, + * including the dollar sign, variable name, and + * array index (if there is one) up through the + * right parentheses. NumComponents tells how + * many additional tokens follow to represent the + * variable name. The first token will be a + * TCL_TOKEN_TEXT token that describes the + * variable name. If the variable is an array + * reference then there will be one or more + * additional tokens, of type TCL_TOKEN_TEXT, + * TCL_TOKEN_BS, TCL_TOKEN_COMMAND, and + * TCL_TOKEN_VARIABLE, that describe the array + * index; numComponents counts the total number + * of nested tokens that make up the variable + * reference, including sub-tokens of + * TCL_TOKEN_VARIABLE tokens. + * TCL_TOKEN_SUB_EXPR - The token describes one subexpression of an + * expression, from the first non-blank character + * of the subexpression up to but not including + * the space, brace, or bracket that terminates + * the subexpression. NumComponents counts the + * total number of following subtokens that make + * up the subexpression; this includes all + * subtokens for any nested TCL_TOKEN_SUB_EXPR + * tokens. For example, a numeric value used as a + * primitive operand is described by a + * TCL_TOKEN_SUB_EXPR token followed by a + * TCL_TOKEN_TEXT token. A binary subexpression + * is described by a TCL_TOKEN_SUB_EXPR token + * followed by the TCL_TOKEN_OPERATOR token for + * the operator, then TCL_TOKEN_SUB_EXPR tokens + * for the left then the right operands. + * TCL_TOKEN_OPERATOR - The token describes one expression operator. + * An operator might be the name of a math + * function such as "abs". A TCL_TOKEN_OPERATOR + * token is always preceeded by one + * TCL_TOKEN_SUB_EXPR token for the operator's + * subexpression, and is followed by zero or more + * TCL_TOKEN_SUB_EXPR tokens for the operator's + * operands. NumComponents is always 0. + * TCL_TOKEN_EXPAND_WORD - This token is just like TCL_TOKEN_WORD except + * that it marks a word that began with the + * literal character prefix "{*}". This word is + * marked to be expanded - that is, broken into + * words after substitution is complete. + */ + +#define TCL_TOKEN_WORD 1 +#define TCL_TOKEN_SIMPLE_WORD 2 +#define TCL_TOKEN_TEXT 4 +#define TCL_TOKEN_BS 8 +#define TCL_TOKEN_COMMAND 16 +#define TCL_TOKEN_VARIABLE 32 +#define TCL_TOKEN_SUB_EXPR 64 +#define TCL_TOKEN_OPERATOR 128 +#define TCL_TOKEN_EXPAND_WORD 256 + +/* + * Parsing error types. On any parsing error, one of these values will be + * stored in the error field of the Tcl_Parse structure defined below. + */ + +#define TCL_PARSE_SUCCESS 0 +#define TCL_PARSE_QUOTE_EXTRA 1 +#define TCL_PARSE_BRACE_EXTRA 2 +#define TCL_PARSE_MISSING_BRACE 3 +#define TCL_PARSE_MISSING_BRACKET 4 +#define TCL_PARSE_MISSING_PAREN 5 +#define TCL_PARSE_MISSING_QUOTE 6 +#define TCL_PARSE_MISSING_VAR_BRACE 7 +#define TCL_PARSE_SYNTAX 8 +#define TCL_PARSE_BAD_NUMBER 9 + +/* + * A structure of the following type is filled in by Tcl_ParseCommand. It + * describes a single command parsed from an input string. + */ + +#define NUM_STATIC_TOKENS 20 + +typedef struct Tcl_Parse { + const char *commentStart; /* Pointer to # that begins the first of one + * or more comments preceding the command. */ + int commentSize; /* Number of bytes in comments (up through + * newline character that terminates the last + * comment). If there were no comments, this + * field is 0. */ + const char *commandStart; /* First character in first word of + * command. */ + int commandSize; /* Number of bytes in command, including first + * character of first word, up through the + * terminating newline, close bracket, or + * semicolon. */ + int numWords; /* Total number of words in command. May be + * 0. */ + Tcl_Token *tokenPtr; /* Pointer to first token representing the + * words of the command. Initially points to + * staticTokens, but may change to point to + * malloc-ed space if command exceeds space in + * staticTokens. */ + int numTokens; /* Total number of tokens in command. */ + int tokensAvailable; /* Total number of tokens available at + * *tokenPtr. */ + int errorType; /* One of the parsing error types defined + * above. */ + + /* + * The fields below are intended only for the private use of the parser. + * They should not be used by functions that invoke Tcl_ParseCommand. + */ + + const char *string; /* The original command string passed to + * Tcl_ParseCommand. */ + const char *end; /* Points to the character just after the last + * one in the command string. */ + Tcl_Interp *interp; /* Interpreter to use for error reporting, or + * NULL. */ + const char *term; /* Points to character in string that + * terminated most recent token. Filled in by + * ParseTokens. If an error occurs, points to + * beginning of region where the error + * occurred (e.g. the open brace if the close + * brace is missing). */ + int incomplete; /* This field is set to 1 by Tcl_ParseCommand + * if the command appears to be incomplete. + * This information is used by + * Tcl_CommandComplete. */ + Tcl_Token staticTokens[NUM_STATIC_TOKENS]; + /* Initial space for tokens for command. This + * space should be large enough to accommodate + * most commands; dynamic space is allocated + * for very large commands that don't fit + * here. */ +} Tcl_Parse; + +/* + *---------------------------------------------------------------------------- + * The following structure represents a user-defined encoding. It collects + * together all the functions that are used by the specific encoding. + */ + +typedef struct Tcl_EncodingType { + const char *encodingName; /* The name of the encoding, e.g. "euc-jp". + * This name is the unique key for this + * encoding type. */ + Tcl_EncodingConvertProc *toUtfProc; + /* Function to convert from external encoding + * into UTF-8. */ + Tcl_EncodingConvertProc *fromUtfProc; + /* Function to convert from UTF-8 into + * external encoding. */ + Tcl_EncodingFreeProc *freeProc; + /* If non-NULL, function to call when this + * encoding is deleted. */ + ClientData clientData; /* Arbitrary value associated with encoding + * type. Passed to conversion functions. */ + int nullSize; /* Number of zero bytes that signify + * end-of-string in this encoding. This number + * is used to determine the source string + * length when the srcLen argument is + * negative. Must be 1 or 2. */ +} Tcl_EncodingType; + +/* + * The following definitions are used as values for the conversion control + * flags argument when converting text from one character set to another: + * + * TCL_ENCODING_START - Signifies that the source buffer is the first + * block in a (potentially multi-block) input + * stream. Tells the conversion function to reset + * to an initial state and perform any + * initialization that needs to occur before the + * first byte is converted. If the source buffer + * contains the entire input stream to be + * converted, this flag should be set. + * TCL_ENCODING_END - Signifies that the source buffer is the last + * block in a (potentially multi-block) input + * stream. Tells the conversion routine to + * perform any finalization that needs to occur + * after the last byte is converted and then to + * reset to an initial state. If the source + * buffer contains the entire input stream to be + * converted, this flag should be set. + * TCL_ENCODING_STOPONERROR - If set, then the converter will return + * immediately upon encountering an invalid byte + * sequence or a source character that has no + * mapping in the target encoding. If clear, then + * the converter will skip the problem, + * substituting one or more "close" characters in + * the destination buffer and then continue to + * convert the source. + * TCL_ENCODING_NO_TERMINATE - If set, Tcl_ExternalToUtf will not append a + * terminating NUL byte. Knowing that it will + * not need space to do so, it will fill all + * dstLen bytes with encoded UTF-8 content, as + * other circumstances permit. If clear, the + * default behavior is to reserve a byte in + * the dst space for NUL termination, and to + * append the NUL byte. + * TCL_ENCODING_CHAR_LIMIT - If set and dstCharsPtr is not NULL, then + * Tcl_ExternalToUtf takes the initial value + * of *dstCharsPtr is taken as a limit of the + * maximum number of chars to produce in the + * encoded UTF-8 content. Otherwise, the + * number of chars produced is controlled only + * by other limiting factors. + */ + +#define TCL_ENCODING_START 0x01 +#define TCL_ENCODING_END 0x02 +#define TCL_ENCODING_STOPONERROR 0x04 +#define TCL_ENCODING_NO_TERMINATE 0x08 +#define TCL_ENCODING_CHAR_LIMIT 0x10 + +/* + * The following definitions are the error codes returned by the conversion + * routines: + * + * TCL_OK - All characters were converted. + * TCL_CONVERT_NOSPACE - The output buffer would not have been large + * enough for all of the converted data; as many + * characters as could fit were converted though. + * TCL_CONVERT_MULTIBYTE - The last few bytes in the source string were + * the beginning of a multibyte sequence, but + * more bytes were needed to complete this + * sequence. A subsequent call to the conversion + * routine should pass the beginning of this + * unconverted sequence plus additional bytes + * from the source stream to properly convert the + * formerly split-up multibyte sequence. + * TCL_CONVERT_SYNTAX - The source stream contained an invalid + * character sequence. This may occur if the + * input stream has been damaged or if the input + * encoding method was misidentified. This error + * is reported only if TCL_ENCODING_STOPONERROR + * was specified. + * TCL_CONVERT_UNKNOWN - The source string contained a character that + * could not be represented in the target + * encoding. This error is reported only if + * TCL_ENCODING_STOPONERROR was specified. + */ + +#define TCL_CONVERT_MULTIBYTE (-1) +#define TCL_CONVERT_SYNTAX (-2) +#define TCL_CONVERT_UNKNOWN (-3) +#define TCL_CONVERT_NOSPACE (-4) + +/* + * The maximum number of bytes that are necessary to represent a single + * Unicode character in UTF-8. The valid values should be 3, 4 or 6 + * (or perhaps 1 if we want to support a non-unicode enabled core). If 3 or + * 4, then Tcl_UniChar must be 2-bytes in size (UCS-2) (the default). If 6, + * then Tcl_UniChar must be 4-bytes in size (UCS-4). At this time UCS-2 mode + * is the default and recommended mode. UCS-4 is experimental and not + * recommended. It works for the core, but most extensions expect UCS-2. + */ + +#ifndef TCL_UTF_MAX +#define TCL_UTF_MAX 3 +#endif + +/* + * This represents a Unicode character. Any changes to this should also be + * reflected in regcustom.h. + */ + +#if TCL_UTF_MAX > 4 + /* + * unsigned int isn't 100% accurate as it should be a strict 4-byte value + * (perhaps wchar_t). 64-bit systems may have troubles. The size of this + * value must be reflected correctly in regcustom.h and + * in tclEncoding.c. + * XXX: Tcl is currently UCS-2 and planning UTF-16 for the Unicode + * XXX: string rep that Tcl_UniChar represents. Changing the size + * XXX: of Tcl_UniChar is /not/ supported. + */ +typedef unsigned int Tcl_UniChar; +#else +typedef unsigned short Tcl_UniChar; +#endif + +/* + *---------------------------------------------------------------------------- + * TIP #59: The following structure is used in calls 'Tcl_RegisterConfig' to + * provide the system with the embedded configuration data. + */ + +typedef struct Tcl_Config { + const char *key; /* Configuration key to register. ASCII + * encoded, thus UTF-8. */ + const char *value; /* The value associated with the key. System + * encoding. */ +} Tcl_Config; + +/* + *---------------------------------------------------------------------------- + * Flags for TIP#143 limits, detailing which limits are active in an + * interpreter. Used for Tcl_{Add,Remove}LimitHandler type argument. + */ + +#define TCL_LIMIT_COMMANDS 0x01 +#define TCL_LIMIT_TIME 0x02 + +/* + * Structure containing information about a limit handler to be called when a + * command- or time-limit is exceeded by an interpreter. + */ + +typedef void (Tcl_LimitHandlerProc) (ClientData clientData, Tcl_Interp *interp); +typedef void (Tcl_LimitHandlerDeleteProc) (ClientData clientData); + +/* + *---------------------------------------------------------------------------- + * Override definitions for libtommath. + */ + +typedef struct mp_int mp_int; +#define MP_INT_DECLARED +typedef unsigned int mp_digit; +#define MP_DIGIT_DECLARED + +/* + *---------------------------------------------------------------------------- + * Definitions needed for Tcl_ParseArgvObj routines. + * Based on tkArgv.c. + * Modifications from the original are copyright (c) Sam Bromley 2006 + */ + +typedef struct { + int type; /* Indicates the option type; see below. */ + const char *keyStr; /* The key string that flags the option in the + * argv array. */ + void *srcPtr; /* Value to be used in setting dst; usage + * depends on type.*/ + void *dstPtr; /* Address of value to be modified; usage + * depends on type.*/ + const char *helpStr; /* Documentation message describing this + * option. */ + ClientData clientData; /* Word to pass to function callbacks. */ +} Tcl_ArgvInfo; + +/* + * Legal values for the type field of a Tcl_ArgInfo: see the user + * documentation for details. + */ + +#define TCL_ARGV_CONSTANT 15 +#define TCL_ARGV_INT 16 +#define TCL_ARGV_STRING 17 +#define TCL_ARGV_REST 18 +#define TCL_ARGV_FLOAT 19 +#define TCL_ARGV_FUNC 20 +#define TCL_ARGV_GENFUNC 21 +#define TCL_ARGV_HELP 22 +#define TCL_ARGV_END 23 + +/* + * Types of callback functions for the TCL_ARGV_FUNC and TCL_ARGV_GENFUNC + * argument types: + */ + +typedef int (Tcl_ArgvFuncProc)(ClientData clientData, Tcl_Obj *objPtr, + void *dstPtr); +typedef int (Tcl_ArgvGenFuncProc)(ClientData clientData, Tcl_Interp *interp, + int objc, Tcl_Obj *const *objv, void *dstPtr); + +/* + * Shorthand for commonly used argTable entries. + */ + +#define TCL_ARGV_AUTO_HELP \ + {TCL_ARGV_HELP, "-help", NULL, NULL, \ + "Print summary of command-line options and abort", NULL} +#define TCL_ARGV_AUTO_REST \ + {TCL_ARGV_REST, "--", NULL, NULL, \ + "Marks the end of the options", NULL} +#define TCL_ARGV_TABLE_END \ + {TCL_ARGV_END, NULL, NULL, NULL, NULL, NULL} + +/* + *---------------------------------------------------------------------------- + * Definitions needed for Tcl_Zlib routines. [TIP #234] + * + * Constants for the format flags describing what sort of data format is + * desired/expected for the Tcl_ZlibDeflate, Tcl_ZlibInflate and + * Tcl_ZlibStreamInit functions. + */ + +#define TCL_ZLIB_FORMAT_RAW 1 +#define TCL_ZLIB_FORMAT_ZLIB 2 +#define TCL_ZLIB_FORMAT_GZIP 4 +#define TCL_ZLIB_FORMAT_AUTO 8 + +/* + * Constants that describe whether the stream is to operate in compressing or + * decompressing mode. + */ + +#define TCL_ZLIB_STREAM_DEFLATE 16 +#define TCL_ZLIB_STREAM_INFLATE 32 + +/* + * Constants giving compression levels. Use of TCL_ZLIB_COMPRESS_DEFAULT is + * recommended. + */ + +#define TCL_ZLIB_COMPRESS_NONE 0 +#define TCL_ZLIB_COMPRESS_FAST 1 +#define TCL_ZLIB_COMPRESS_BEST 9 +#define TCL_ZLIB_COMPRESS_DEFAULT (-1) + +/* + * Constants for types of flushing, used with Tcl_ZlibFlush. + */ + +#define TCL_ZLIB_NO_FLUSH 0 +#define TCL_ZLIB_FLUSH 2 +#define TCL_ZLIB_FULLFLUSH 3 +#define TCL_ZLIB_FINALIZE 4 + +/* + *---------------------------------------------------------------------------- + * Definitions needed for the Tcl_LoadFile function. [TIP #416] + */ + +#define TCL_LOAD_GLOBAL 1 +#define TCL_LOAD_LAZY 2 + +/* + *---------------------------------------------------------------------------- + * Single public declaration for NRE. + */ + +typedef int (Tcl_NRPostProc) (ClientData data[], Tcl_Interp *interp, + int result); + +/* + *---------------------------------------------------------------------------- + * The following constant is used to test for older versions of Tcl in the + * stubs tables. + * + * Jan Nijtman's plus patch uses 0xFCA1BACF, so we need to pick a different + * value since the stubs tables don't match. + */ + +#define TCL_STUB_MAGIC ((int) 0xFCA3BACF) + +/* + * The following function is required to be defined in all stubs aware + * extensions. The function is actually implemented in the stub library, not + * the main Tcl library, although there is a trivial implementation in the + * main library in case an extension is statically linked into an application. + */ + +const char * Tcl_InitStubs(Tcl_Interp *interp, const char *version, + int exact); +const char * TclTomMathInitializeStubs(Tcl_Interp *interp, + const char *version, int epoch, int revision); + +/* + * When not using stubs, make it a macro. + */ + +#ifndef USE_TCL_STUBS +#define Tcl_InitStubs(interp, version, exact) \ + Tcl_PkgInitStubsCheck(interp, version, exact) +#endif + +/* + * TODO - tommath stubs export goes here! + */ + +/* + * Public functions that are not accessible via the stubs table. + * Tcl_GetMemoryInfo is needed for AOLserver. [Bug 1868171] + */ + +#define Tcl_Main(argc, argv, proc) Tcl_MainEx(argc, argv, proc, \ + ((Tcl_CreateInterp)())) +EXTERN void Tcl_MainEx(int argc, char **argv, + Tcl_AppInitProc *appInitProc, Tcl_Interp *interp); +EXTERN const char * Tcl_PkgInitStubsCheck(Tcl_Interp *interp, + const char *version, int exact); +EXTERN void Tcl_GetMemoryInfo(Tcl_DString *dsPtr); + +/* + *---------------------------------------------------------------------------- + * Include the public function declarations that are accessible via the stubs + * table. + */ + +#include "tclDecls.h" + +/* + * Include platform specific public function declarations that are accessible + * via the stubs table. Make all TclOO symbols MODULE_SCOPE (which only + * has effect on building it as a shared library). See ticket [3010352]. + */ + +#if defined(BUILD_tcl) +# undef TCLAPI +# define TCLAPI MODULE_SCOPE +#endif + +#include "tclPlatDecls.h" + +/* + *---------------------------------------------------------------------------- + * The following declarations either map ckalloc and ckfree to malloc and + * free, or they map them to functions with all sorts of debugging hooks + * defined in tclCkalloc.c. + */ + +#ifdef TCL_MEM_DEBUG + +# define ckalloc(x) \ + ((void *) Tcl_DbCkalloc((unsigned)(x), __FILE__, __LINE__)) +# define ckfree(x) \ + Tcl_DbCkfree((char *)(x), __FILE__, __LINE__) +# define ckrealloc(x,y) \ + ((void *) Tcl_DbCkrealloc((char *)(x), (unsigned)(y), __FILE__, __LINE__)) +# define attemptckalloc(x) \ + ((void *) Tcl_AttemptDbCkalloc((unsigned)(x), __FILE__, __LINE__)) +# define attemptckrealloc(x,y) \ + ((void *) Tcl_AttemptDbCkrealloc((char *)(x), (unsigned)(y), __FILE__, __LINE__)) + +#else /* !TCL_MEM_DEBUG */ + +/* + * If we are not using the debugging allocator, we should call the Tcl_Alloc, + * et al. routines in order to guarantee that every module is using the same + * memory allocator both inside and outside of the Tcl library. + */ + +# define ckalloc(x) \ + ((void *) Tcl_Alloc((unsigned)(x))) +# define ckfree(x) \ + Tcl_Free((char *)(x)) +# define ckrealloc(x,y) \ + ((void *) Tcl_Realloc((char *)(x), (unsigned)(y))) +# define attemptckalloc(x) \ + ((void *) Tcl_AttemptAlloc((unsigned)(x))) +# define attemptckrealloc(x,y) \ + ((void *) Tcl_AttemptRealloc((char *)(x), (unsigned)(y))) +# undef Tcl_InitMemory +# define Tcl_InitMemory(x) +# undef Tcl_DumpActiveMemory +# define Tcl_DumpActiveMemory(x) +# undef Tcl_ValidateAllMemory +# define Tcl_ValidateAllMemory(x,y) + +#endif /* !TCL_MEM_DEBUG */ + +#ifdef TCL_MEM_DEBUG +# define Tcl_IncrRefCount(objPtr) \ + Tcl_DbIncrRefCount(objPtr, __FILE__, __LINE__) +# define Tcl_DecrRefCount(objPtr) \ + Tcl_DbDecrRefCount(objPtr, __FILE__, __LINE__) +# define Tcl_IsShared(objPtr) \ + Tcl_DbIsShared(objPtr, __FILE__, __LINE__) +#else +# define Tcl_IncrRefCount(objPtr) \ + ++(objPtr)->refCount + /* + * Use do/while0 idiom for optimum correctness without compiler warnings. + * http://c2.com/cgi/wiki?TrivialDoWhileLoop + */ +# define Tcl_DecrRefCount(objPtr) \ + do { \ + Tcl_Obj *_objPtr = (objPtr); \ + if (--(_objPtr)->refCount <= 0) { \ + TclFreeObj(_objPtr); \ + } \ + } while(0) +# define Tcl_IsShared(objPtr) \ + ((objPtr)->refCount > 1) +#endif + +/* + * Macros and definitions that help to debug the use of Tcl objects. When + * TCL_MEM_DEBUG is defined, the Tcl_New declarations are overridden to call + * debugging versions of the object creation functions. + */ + +#ifdef TCL_MEM_DEBUG +# undef Tcl_NewBignumObj +# define Tcl_NewBignumObj(val) \ + Tcl_DbNewBignumObj(val, __FILE__, __LINE__) +# undef Tcl_NewBooleanObj +# define Tcl_NewBooleanObj(val) \ + Tcl_DbNewBooleanObj(val, __FILE__, __LINE__) +# undef Tcl_NewByteArrayObj +# define Tcl_NewByteArrayObj(bytes, len) \ + Tcl_DbNewByteArrayObj(bytes, len, __FILE__, __LINE__) +# undef Tcl_NewDoubleObj +# define Tcl_NewDoubleObj(val) \ + Tcl_DbNewDoubleObj(val, __FILE__, __LINE__) +# undef Tcl_NewIntObj +# define Tcl_NewIntObj(val) \ + Tcl_DbNewLongObj(val, __FILE__, __LINE__) +# undef Tcl_NewListObj +# define Tcl_NewListObj(objc, objv) \ + Tcl_DbNewListObj(objc, objv, __FILE__, __LINE__) +# undef Tcl_NewLongObj +# define Tcl_NewLongObj(val) \ + Tcl_DbNewLongObj(val, __FILE__, __LINE__) +# undef Tcl_NewObj +# define Tcl_NewObj() \ + Tcl_DbNewObj(__FILE__, __LINE__) +# undef Tcl_NewStringObj +# define Tcl_NewStringObj(bytes, len) \ + Tcl_DbNewStringObj(bytes, len, __FILE__, __LINE__) +# undef Tcl_NewWideIntObj +# define Tcl_NewWideIntObj(val) \ + Tcl_DbNewWideIntObj(val, __FILE__, __LINE__) +#endif /* TCL_MEM_DEBUG */ + +/* + *---------------------------------------------------------------------------- + * Macros for clients to use to access fields of hash entries: + */ + +#define Tcl_GetHashValue(h) ((h)->clientData) +#define Tcl_SetHashValue(h, value) ((h)->clientData = (ClientData) (value)) +#define Tcl_GetHashKey(tablePtr, h) \ + ((void *) (((tablePtr)->keyType == TCL_ONE_WORD_KEYS || \ + (tablePtr)->keyType == TCL_CUSTOM_PTR_KEYS) \ + ? (h)->key.oneWordValue \ + : (h)->key.string)) + +/* + * Macros to use for clients to use to invoke find and create functions for + * hash tables: + */ + +#undef Tcl_FindHashEntry +#define Tcl_FindHashEntry(tablePtr, key) \ + (*((tablePtr)->findProc))(tablePtr, (const char *)(key)) +#undef Tcl_CreateHashEntry +#define Tcl_CreateHashEntry(tablePtr, key, newPtr) \ + (*((tablePtr)->createProc))(tablePtr, (const char *)(key), newPtr) + +/* + *---------------------------------------------------------------------------- + * Macros that eliminate the overhead of the thread synchronization functions + * when compiling without thread support. + */ + +#ifndef TCL_THREADS +#undef Tcl_MutexLock +#define Tcl_MutexLock(mutexPtr) +#undef Tcl_MutexUnlock +#define Tcl_MutexUnlock(mutexPtr) +#undef Tcl_MutexFinalize +#define Tcl_MutexFinalize(mutexPtr) +#undef Tcl_ConditionNotify +#define Tcl_ConditionNotify(condPtr) +#undef Tcl_ConditionWait +#define Tcl_ConditionWait(condPtr, mutexPtr, timePtr) +#undef Tcl_ConditionFinalize +#define Tcl_ConditionFinalize(condPtr) +#endif /* TCL_THREADS */ + +/* + *---------------------------------------------------------------------------- + * Deprecated Tcl functions: + */ + +#ifndef TCL_NO_DEPRECATED +/* + * These function have been renamed. The old names are deprecated, but we + * define these macros for backwards compatibilty. + */ + +# define Tcl_Ckalloc Tcl_Alloc +# define Tcl_Ckfree Tcl_Free +# define Tcl_Ckrealloc Tcl_Realloc +# define Tcl_Return Tcl_SetResult +# define Tcl_TildeSubst Tcl_TranslateFileName +# define panic Tcl_Panic +# define panicVA Tcl_PanicVA +#endif /* !TCL_NO_DEPRECATED */ + +/* + *---------------------------------------------------------------------------- + * Convenience declaration of Tcl_AppInit for backwards compatibility. This + * function is not *implemented* by the tcl library, so the storage class is + * neither DLLEXPORT nor DLLIMPORT. + */ + +extern Tcl_AppInitProc Tcl_AppInit; + +#endif /* RC_INVOKED */ + +/* + * end block for C++ + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TCL */ + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tclDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tclDecls.h new file mode 100644 index 00000000..91c0add2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tclDecls.h @@ -0,0 +1,3917 @@ +/* + * tclDecls.h -- + * + * Declarations of functions in the platform independent public Tcl API. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TCLDECLS +#define _TCLDECLS + +#undef TCL_STORAGE_CLASS +#ifdef BUILD_tcl +# define TCL_STORAGE_CLASS DLLEXPORT +#else +# ifdef USE_TCL_STUBS +# define TCL_STORAGE_CLASS +# else +# define TCL_STORAGE_CLASS DLLIMPORT +# endif +#endif + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tcl.decls script. + */ + +/* !BEGIN!: Do not edit below this line. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Exported function declarations: + */ + +/* 0 */ +EXTERN int Tcl_PkgProvideEx(Tcl_Interp *interp, + const char *name, const char *version, + const void *clientData); +/* 1 */ +EXTERN CONST84_RETURN char * Tcl_PkgRequireEx(Tcl_Interp *interp, + const char *name, const char *version, + int exact, void *clientDataPtr); +/* 2 */ +EXTERN void Tcl_Panic(const char *format, ...) TCL_FORMAT_PRINTF(1, 2); +/* 3 */ +EXTERN char * Tcl_Alloc(unsigned int size); +/* 4 */ +EXTERN void Tcl_Free(char *ptr); +/* 5 */ +EXTERN char * Tcl_Realloc(char *ptr, unsigned int size); +/* 6 */ +EXTERN char * Tcl_DbCkalloc(unsigned int size, const char *file, + int line); +/* 7 */ +EXTERN void Tcl_DbCkfree(char *ptr, const char *file, int line); +/* 8 */ +EXTERN char * Tcl_DbCkrealloc(char *ptr, unsigned int size, + const char *file, int line); +#if !defined(_WIN32) && !defined(MAC_OSX_TCL) /* UNIX */ +/* 9 */ +EXTERN void Tcl_CreateFileHandler(int fd, int mask, + Tcl_FileProc *proc, ClientData clientData); +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +/* 9 */ +EXTERN void Tcl_CreateFileHandler(int fd, int mask, + Tcl_FileProc *proc, ClientData clientData); +#endif /* MACOSX */ +#if !defined(_WIN32) && !defined(MAC_OSX_TCL) /* UNIX */ +/* 10 */ +EXTERN void Tcl_DeleteFileHandler(int fd); +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +/* 10 */ +EXTERN void Tcl_DeleteFileHandler(int fd); +#endif /* MACOSX */ +/* 11 */ +EXTERN void Tcl_SetTimer(const Tcl_Time *timePtr); +/* 12 */ +EXTERN void Tcl_Sleep(int ms); +/* 13 */ +EXTERN int Tcl_WaitForEvent(const Tcl_Time *timePtr); +/* 14 */ +EXTERN int Tcl_AppendAllObjTypes(Tcl_Interp *interp, + Tcl_Obj *objPtr); +/* 15 */ +EXTERN void Tcl_AppendStringsToObj(Tcl_Obj *objPtr, ...); +/* 16 */ +EXTERN void Tcl_AppendToObj(Tcl_Obj *objPtr, const char *bytes, + int length); +/* 17 */ +EXTERN Tcl_Obj * Tcl_ConcatObj(int objc, Tcl_Obj *const objv[]); +/* 18 */ +EXTERN int Tcl_ConvertToType(Tcl_Interp *interp, + Tcl_Obj *objPtr, const Tcl_ObjType *typePtr); +/* 19 */ +EXTERN void Tcl_DbDecrRefCount(Tcl_Obj *objPtr, const char *file, + int line); +/* 20 */ +EXTERN void Tcl_DbIncrRefCount(Tcl_Obj *objPtr, const char *file, + int line); +/* 21 */ +EXTERN int Tcl_DbIsShared(Tcl_Obj *objPtr, const char *file, + int line); +/* 22 */ +EXTERN Tcl_Obj * Tcl_DbNewBooleanObj(int boolValue, const char *file, + int line); +/* 23 */ +EXTERN Tcl_Obj * Tcl_DbNewByteArrayObj(const unsigned char *bytes, + int length, const char *file, int line); +/* 24 */ +EXTERN Tcl_Obj * Tcl_DbNewDoubleObj(double doubleValue, + const char *file, int line); +/* 25 */ +EXTERN Tcl_Obj * Tcl_DbNewListObj(int objc, Tcl_Obj *const *objv, + const char *file, int line); +/* 26 */ +EXTERN Tcl_Obj * Tcl_DbNewLongObj(long longValue, const char *file, + int line); +/* 27 */ +EXTERN Tcl_Obj * Tcl_DbNewObj(const char *file, int line); +/* 28 */ +EXTERN Tcl_Obj * Tcl_DbNewStringObj(const char *bytes, int length, + const char *file, int line); +/* 29 */ +EXTERN Tcl_Obj * Tcl_DuplicateObj(Tcl_Obj *objPtr); +/* 30 */ +EXTERN void TclFreeObj(Tcl_Obj *objPtr); +/* 31 */ +EXTERN int Tcl_GetBoolean(Tcl_Interp *interp, const char *src, + int *boolPtr); +/* 32 */ +EXTERN int Tcl_GetBooleanFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, int *boolPtr); +/* 33 */ +EXTERN unsigned char * Tcl_GetByteArrayFromObj(Tcl_Obj *objPtr, + int *lengthPtr); +/* 34 */ +EXTERN int Tcl_GetDouble(Tcl_Interp *interp, const char *src, + double *doublePtr); +/* 35 */ +EXTERN int Tcl_GetDoubleFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, double *doublePtr); +/* 36 */ +EXTERN int Tcl_GetIndexFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, + CONST84 char *const *tablePtr, + const char *msg, int flags, int *indexPtr); +/* 37 */ +EXTERN int Tcl_GetInt(Tcl_Interp *interp, const char *src, + int *intPtr); +/* 38 */ +EXTERN int Tcl_GetIntFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, int *intPtr); +/* 39 */ +EXTERN int Tcl_GetLongFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, long *longPtr); +/* 40 */ +EXTERN CONST86 Tcl_ObjType * Tcl_GetObjType(const char *typeName); +/* 41 */ +EXTERN char * Tcl_GetStringFromObj(Tcl_Obj *objPtr, int *lengthPtr); +/* 42 */ +EXTERN void Tcl_InvalidateStringRep(Tcl_Obj *objPtr); +/* 43 */ +EXTERN int Tcl_ListObjAppendList(Tcl_Interp *interp, + Tcl_Obj *listPtr, Tcl_Obj *elemListPtr); +/* 44 */ +EXTERN int Tcl_ListObjAppendElement(Tcl_Interp *interp, + Tcl_Obj *listPtr, Tcl_Obj *objPtr); +/* 45 */ +EXTERN int Tcl_ListObjGetElements(Tcl_Interp *interp, + Tcl_Obj *listPtr, int *objcPtr, + Tcl_Obj ***objvPtr); +/* 46 */ +EXTERN int Tcl_ListObjIndex(Tcl_Interp *interp, + Tcl_Obj *listPtr, int index, + Tcl_Obj **objPtrPtr); +/* 47 */ +EXTERN int Tcl_ListObjLength(Tcl_Interp *interp, + Tcl_Obj *listPtr, int *lengthPtr); +/* 48 */ +EXTERN int Tcl_ListObjReplace(Tcl_Interp *interp, + Tcl_Obj *listPtr, int first, int count, + int objc, Tcl_Obj *const objv[]); +/* 49 */ +EXTERN Tcl_Obj * Tcl_NewBooleanObj(int boolValue); +/* 50 */ +EXTERN Tcl_Obj * Tcl_NewByteArrayObj(const unsigned char *bytes, + int length); +/* 51 */ +EXTERN Tcl_Obj * Tcl_NewDoubleObj(double doubleValue); +/* 52 */ +EXTERN Tcl_Obj * Tcl_NewIntObj(int intValue); +/* 53 */ +EXTERN Tcl_Obj * Tcl_NewListObj(int objc, Tcl_Obj *const objv[]); +/* 54 */ +EXTERN Tcl_Obj * Tcl_NewLongObj(long longValue); +/* 55 */ +EXTERN Tcl_Obj * Tcl_NewObj(void); +/* 56 */ +EXTERN Tcl_Obj * Tcl_NewStringObj(const char *bytes, int length); +/* 57 */ +EXTERN void Tcl_SetBooleanObj(Tcl_Obj *objPtr, int boolValue); +/* 58 */ +EXTERN unsigned char * Tcl_SetByteArrayLength(Tcl_Obj *objPtr, int length); +/* 59 */ +EXTERN void Tcl_SetByteArrayObj(Tcl_Obj *objPtr, + const unsigned char *bytes, int length); +/* 60 */ +EXTERN void Tcl_SetDoubleObj(Tcl_Obj *objPtr, double doubleValue); +/* 61 */ +EXTERN void Tcl_SetIntObj(Tcl_Obj *objPtr, int intValue); +/* 62 */ +EXTERN void Tcl_SetListObj(Tcl_Obj *objPtr, int objc, + Tcl_Obj *const objv[]); +/* 63 */ +EXTERN void Tcl_SetLongObj(Tcl_Obj *objPtr, long longValue); +/* 64 */ +EXTERN void Tcl_SetObjLength(Tcl_Obj *objPtr, int length); +/* 65 */ +EXTERN void Tcl_SetStringObj(Tcl_Obj *objPtr, const char *bytes, + int length); +/* 66 */ +EXTERN void Tcl_AddErrorInfo(Tcl_Interp *interp, + const char *message); +/* 67 */ +EXTERN void Tcl_AddObjErrorInfo(Tcl_Interp *interp, + const char *message, int length); +/* 68 */ +EXTERN void Tcl_AllowExceptions(Tcl_Interp *interp); +/* 69 */ +EXTERN void Tcl_AppendElement(Tcl_Interp *interp, + const char *element); +/* 70 */ +EXTERN void Tcl_AppendResult(Tcl_Interp *interp, ...); +/* 71 */ +EXTERN Tcl_AsyncHandler Tcl_AsyncCreate(Tcl_AsyncProc *proc, + ClientData clientData); +/* 72 */ +EXTERN void Tcl_AsyncDelete(Tcl_AsyncHandler async); +/* 73 */ +EXTERN int Tcl_AsyncInvoke(Tcl_Interp *interp, int code); +/* 74 */ +EXTERN void Tcl_AsyncMark(Tcl_AsyncHandler async); +/* 75 */ +EXTERN int Tcl_AsyncReady(void); +/* 76 */ +EXTERN void Tcl_BackgroundError(Tcl_Interp *interp); +/* 77 */ +EXTERN char Tcl_Backslash(const char *src, int *readPtr); +/* 78 */ +EXTERN int Tcl_BadChannelOption(Tcl_Interp *interp, + const char *optionName, + const char *optionList); +/* 79 */ +EXTERN void Tcl_CallWhenDeleted(Tcl_Interp *interp, + Tcl_InterpDeleteProc *proc, + ClientData clientData); +/* 80 */ +EXTERN void Tcl_CancelIdleCall(Tcl_IdleProc *idleProc, + ClientData clientData); +/* 81 */ +EXTERN int Tcl_Close(Tcl_Interp *interp, Tcl_Channel chan); +/* 82 */ +EXTERN int Tcl_CommandComplete(const char *cmd); +/* 83 */ +EXTERN char * Tcl_Concat(int argc, CONST84 char *const *argv); +/* 84 */ +EXTERN int Tcl_ConvertElement(const char *src, char *dst, + int flags); +/* 85 */ +EXTERN int Tcl_ConvertCountedElement(const char *src, + int length, char *dst, int flags); +/* 86 */ +EXTERN int Tcl_CreateAlias(Tcl_Interp *slave, + const char *slaveCmd, Tcl_Interp *target, + const char *targetCmd, int argc, + CONST84 char *const *argv); +/* 87 */ +EXTERN int Tcl_CreateAliasObj(Tcl_Interp *slave, + const char *slaveCmd, Tcl_Interp *target, + const char *targetCmd, int objc, + Tcl_Obj *const objv[]); +/* 88 */ +EXTERN Tcl_Channel Tcl_CreateChannel(const Tcl_ChannelType *typePtr, + const char *chanName, + ClientData instanceData, int mask); +/* 89 */ +EXTERN void Tcl_CreateChannelHandler(Tcl_Channel chan, int mask, + Tcl_ChannelProc *proc, ClientData clientData); +/* 90 */ +EXTERN void Tcl_CreateCloseHandler(Tcl_Channel chan, + Tcl_CloseProc *proc, ClientData clientData); +/* 91 */ +EXTERN Tcl_Command Tcl_CreateCommand(Tcl_Interp *interp, + const char *cmdName, Tcl_CmdProc *proc, + ClientData clientData, + Tcl_CmdDeleteProc *deleteProc); +/* 92 */ +EXTERN void Tcl_CreateEventSource(Tcl_EventSetupProc *setupProc, + Tcl_EventCheckProc *checkProc, + ClientData clientData); +/* 93 */ +EXTERN void Tcl_CreateExitHandler(Tcl_ExitProc *proc, + ClientData clientData); +/* 94 */ +EXTERN Tcl_Interp * Tcl_CreateInterp(void); +/* 95 */ +EXTERN void Tcl_CreateMathFunc(Tcl_Interp *interp, + const char *name, int numArgs, + Tcl_ValueType *argTypes, Tcl_MathProc *proc, + ClientData clientData); +/* 96 */ +EXTERN Tcl_Command Tcl_CreateObjCommand(Tcl_Interp *interp, + const char *cmdName, Tcl_ObjCmdProc *proc, + ClientData clientData, + Tcl_CmdDeleteProc *deleteProc); +/* 97 */ +EXTERN Tcl_Interp * Tcl_CreateSlave(Tcl_Interp *interp, + const char *slaveName, int isSafe); +/* 98 */ +EXTERN Tcl_TimerToken Tcl_CreateTimerHandler(int milliseconds, + Tcl_TimerProc *proc, ClientData clientData); +/* 99 */ +EXTERN Tcl_Trace Tcl_CreateTrace(Tcl_Interp *interp, int level, + Tcl_CmdTraceProc *proc, + ClientData clientData); +/* 100 */ +EXTERN void Tcl_DeleteAssocData(Tcl_Interp *interp, + const char *name); +/* 101 */ +EXTERN void Tcl_DeleteChannelHandler(Tcl_Channel chan, + Tcl_ChannelProc *proc, ClientData clientData); +/* 102 */ +EXTERN void Tcl_DeleteCloseHandler(Tcl_Channel chan, + Tcl_CloseProc *proc, ClientData clientData); +/* 103 */ +EXTERN int Tcl_DeleteCommand(Tcl_Interp *interp, + const char *cmdName); +/* 104 */ +EXTERN int Tcl_DeleteCommandFromToken(Tcl_Interp *interp, + Tcl_Command command); +/* 105 */ +EXTERN void Tcl_DeleteEvents(Tcl_EventDeleteProc *proc, + ClientData clientData); +/* 106 */ +EXTERN void Tcl_DeleteEventSource(Tcl_EventSetupProc *setupProc, + Tcl_EventCheckProc *checkProc, + ClientData clientData); +/* 107 */ +EXTERN void Tcl_DeleteExitHandler(Tcl_ExitProc *proc, + ClientData clientData); +/* 108 */ +EXTERN void Tcl_DeleteHashEntry(Tcl_HashEntry *entryPtr); +/* 109 */ +EXTERN void Tcl_DeleteHashTable(Tcl_HashTable *tablePtr); +/* 110 */ +EXTERN void Tcl_DeleteInterp(Tcl_Interp *interp); +/* 111 */ +EXTERN void Tcl_DetachPids(int numPids, Tcl_Pid *pidPtr); +/* 112 */ +EXTERN void Tcl_DeleteTimerHandler(Tcl_TimerToken token); +/* 113 */ +EXTERN void Tcl_DeleteTrace(Tcl_Interp *interp, Tcl_Trace trace); +/* 114 */ +EXTERN void Tcl_DontCallWhenDeleted(Tcl_Interp *interp, + Tcl_InterpDeleteProc *proc, + ClientData clientData); +/* 115 */ +EXTERN int Tcl_DoOneEvent(int flags); +/* 116 */ +EXTERN void Tcl_DoWhenIdle(Tcl_IdleProc *proc, + ClientData clientData); +/* 117 */ +EXTERN char * Tcl_DStringAppend(Tcl_DString *dsPtr, + const char *bytes, int length); +/* 118 */ +EXTERN char * Tcl_DStringAppendElement(Tcl_DString *dsPtr, + const char *element); +/* 119 */ +EXTERN void Tcl_DStringEndSublist(Tcl_DString *dsPtr); +/* 120 */ +EXTERN void Tcl_DStringFree(Tcl_DString *dsPtr); +/* 121 */ +EXTERN void Tcl_DStringGetResult(Tcl_Interp *interp, + Tcl_DString *dsPtr); +/* 122 */ +EXTERN void Tcl_DStringInit(Tcl_DString *dsPtr); +/* 123 */ +EXTERN void Tcl_DStringResult(Tcl_Interp *interp, + Tcl_DString *dsPtr); +/* 124 */ +EXTERN void Tcl_DStringSetLength(Tcl_DString *dsPtr, int length); +/* 125 */ +EXTERN void Tcl_DStringStartSublist(Tcl_DString *dsPtr); +/* 126 */ +EXTERN int Tcl_Eof(Tcl_Channel chan); +/* 127 */ +EXTERN CONST84_RETURN char * Tcl_ErrnoId(void); +/* 128 */ +EXTERN CONST84_RETURN char * Tcl_ErrnoMsg(int err); +/* 129 */ +EXTERN int Tcl_Eval(Tcl_Interp *interp, const char *script); +/* 130 */ +EXTERN int Tcl_EvalFile(Tcl_Interp *interp, + const char *fileName); +/* 131 */ +EXTERN int Tcl_EvalObj(Tcl_Interp *interp, Tcl_Obj *objPtr); +/* 132 */ +EXTERN void Tcl_EventuallyFree(ClientData clientData, + Tcl_FreeProc *freeProc); +/* 133 */ +EXTERN void Tcl_Exit(int status); +/* 134 */ +EXTERN int Tcl_ExposeCommand(Tcl_Interp *interp, + const char *hiddenCmdToken, + const char *cmdName); +/* 135 */ +EXTERN int Tcl_ExprBoolean(Tcl_Interp *interp, const char *expr, + int *ptr); +/* 136 */ +EXTERN int Tcl_ExprBooleanObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, int *ptr); +/* 137 */ +EXTERN int Tcl_ExprDouble(Tcl_Interp *interp, const char *expr, + double *ptr); +/* 138 */ +EXTERN int Tcl_ExprDoubleObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, double *ptr); +/* 139 */ +EXTERN int Tcl_ExprLong(Tcl_Interp *interp, const char *expr, + long *ptr); +/* 140 */ +EXTERN int Tcl_ExprLongObj(Tcl_Interp *interp, Tcl_Obj *objPtr, + long *ptr); +/* 141 */ +EXTERN int Tcl_ExprObj(Tcl_Interp *interp, Tcl_Obj *objPtr, + Tcl_Obj **resultPtrPtr); +/* 142 */ +EXTERN int Tcl_ExprString(Tcl_Interp *interp, const char *expr); +/* 143 */ +EXTERN void Tcl_Finalize(void); +/* 144 */ +EXTERN void Tcl_FindExecutable(const char *argv0); +/* 145 */ +EXTERN Tcl_HashEntry * Tcl_FirstHashEntry(Tcl_HashTable *tablePtr, + Tcl_HashSearch *searchPtr); +/* 146 */ +EXTERN int Tcl_Flush(Tcl_Channel chan); +/* 147 */ +EXTERN void Tcl_FreeResult(Tcl_Interp *interp); +/* 148 */ +EXTERN int Tcl_GetAlias(Tcl_Interp *interp, + const char *slaveCmd, + Tcl_Interp **targetInterpPtr, + CONST84 char **targetCmdPtr, int *argcPtr, + CONST84 char ***argvPtr); +/* 149 */ +EXTERN int Tcl_GetAliasObj(Tcl_Interp *interp, + const char *slaveCmd, + Tcl_Interp **targetInterpPtr, + CONST84 char **targetCmdPtr, int *objcPtr, + Tcl_Obj ***objv); +/* 150 */ +EXTERN ClientData Tcl_GetAssocData(Tcl_Interp *interp, + const char *name, + Tcl_InterpDeleteProc **procPtr); +/* 151 */ +EXTERN Tcl_Channel Tcl_GetChannel(Tcl_Interp *interp, + const char *chanName, int *modePtr); +/* 152 */ +EXTERN int Tcl_GetChannelBufferSize(Tcl_Channel chan); +/* 153 */ +EXTERN int Tcl_GetChannelHandle(Tcl_Channel chan, int direction, + ClientData *handlePtr); +/* 154 */ +EXTERN ClientData Tcl_GetChannelInstanceData(Tcl_Channel chan); +/* 155 */ +EXTERN int Tcl_GetChannelMode(Tcl_Channel chan); +/* 156 */ +EXTERN CONST84_RETURN char * Tcl_GetChannelName(Tcl_Channel chan); +/* 157 */ +EXTERN int Tcl_GetChannelOption(Tcl_Interp *interp, + Tcl_Channel chan, const char *optionName, + Tcl_DString *dsPtr); +/* 158 */ +EXTERN CONST86 Tcl_ChannelType * Tcl_GetChannelType(Tcl_Channel chan); +/* 159 */ +EXTERN int Tcl_GetCommandInfo(Tcl_Interp *interp, + const char *cmdName, Tcl_CmdInfo *infoPtr); +/* 160 */ +EXTERN CONST84_RETURN char * Tcl_GetCommandName(Tcl_Interp *interp, + Tcl_Command command); +/* 161 */ +EXTERN int Tcl_GetErrno(void); +/* 162 */ +EXTERN CONST84_RETURN char * Tcl_GetHostName(void); +/* 163 */ +EXTERN int Tcl_GetInterpPath(Tcl_Interp *askInterp, + Tcl_Interp *slaveInterp); +/* 164 */ +EXTERN Tcl_Interp * Tcl_GetMaster(Tcl_Interp *interp); +/* 165 */ +EXTERN const char * Tcl_GetNameOfExecutable(void); +/* 166 */ +EXTERN Tcl_Obj * Tcl_GetObjResult(Tcl_Interp *interp); +#if !defined(_WIN32) && !defined(MAC_OSX_TCL) /* UNIX */ +/* 167 */ +EXTERN int Tcl_GetOpenFile(Tcl_Interp *interp, + const char *chanID, int forWriting, + int checkUsage, ClientData *filePtr); +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +/* 167 */ +EXTERN int Tcl_GetOpenFile(Tcl_Interp *interp, + const char *chanID, int forWriting, + int checkUsage, ClientData *filePtr); +#endif /* MACOSX */ +/* 168 */ +EXTERN Tcl_PathType Tcl_GetPathType(const char *path); +/* 169 */ +EXTERN int Tcl_Gets(Tcl_Channel chan, Tcl_DString *dsPtr); +/* 170 */ +EXTERN int Tcl_GetsObj(Tcl_Channel chan, Tcl_Obj *objPtr); +/* 171 */ +EXTERN int Tcl_GetServiceMode(void); +/* 172 */ +EXTERN Tcl_Interp * Tcl_GetSlave(Tcl_Interp *interp, + const char *slaveName); +/* 173 */ +EXTERN Tcl_Channel Tcl_GetStdChannel(int type); +/* 174 */ +EXTERN CONST84_RETURN char * Tcl_GetStringResult(Tcl_Interp *interp); +/* 175 */ +EXTERN CONST84_RETURN char * Tcl_GetVar(Tcl_Interp *interp, + const char *varName, int flags); +/* 176 */ +EXTERN CONST84_RETURN char * Tcl_GetVar2(Tcl_Interp *interp, + const char *part1, const char *part2, + int flags); +/* 177 */ +EXTERN int Tcl_GlobalEval(Tcl_Interp *interp, + const char *command); +/* 178 */ +EXTERN int Tcl_GlobalEvalObj(Tcl_Interp *interp, + Tcl_Obj *objPtr); +/* 179 */ +EXTERN int Tcl_HideCommand(Tcl_Interp *interp, + const char *cmdName, + const char *hiddenCmdToken); +/* 180 */ +EXTERN int Tcl_Init(Tcl_Interp *interp); +/* 181 */ +EXTERN void Tcl_InitHashTable(Tcl_HashTable *tablePtr, + int keyType); +/* 182 */ +EXTERN int Tcl_InputBlocked(Tcl_Channel chan); +/* 183 */ +EXTERN int Tcl_InputBuffered(Tcl_Channel chan); +/* 184 */ +EXTERN int Tcl_InterpDeleted(Tcl_Interp *interp); +/* 185 */ +EXTERN int Tcl_IsSafe(Tcl_Interp *interp); +/* 186 */ +EXTERN char * Tcl_JoinPath(int argc, CONST84 char *const *argv, + Tcl_DString *resultPtr); +/* 187 */ +EXTERN int Tcl_LinkVar(Tcl_Interp *interp, const char *varName, + char *addr, int type); +/* Slot 188 is reserved */ +/* 189 */ +EXTERN Tcl_Channel Tcl_MakeFileChannel(ClientData handle, int mode); +/* 190 */ +EXTERN int Tcl_MakeSafe(Tcl_Interp *interp); +/* 191 */ +EXTERN Tcl_Channel Tcl_MakeTcpClientChannel(ClientData tcpSocket); +/* 192 */ +EXTERN char * Tcl_Merge(int argc, CONST84 char *const *argv); +/* 193 */ +EXTERN Tcl_HashEntry * Tcl_NextHashEntry(Tcl_HashSearch *searchPtr); +/* 194 */ +EXTERN void Tcl_NotifyChannel(Tcl_Channel channel, int mask); +/* 195 */ +EXTERN Tcl_Obj * Tcl_ObjGetVar2(Tcl_Interp *interp, Tcl_Obj *part1Ptr, + Tcl_Obj *part2Ptr, int flags); +/* 196 */ +EXTERN Tcl_Obj * Tcl_ObjSetVar2(Tcl_Interp *interp, Tcl_Obj *part1Ptr, + Tcl_Obj *part2Ptr, Tcl_Obj *newValuePtr, + int flags); +/* 197 */ +EXTERN Tcl_Channel Tcl_OpenCommandChannel(Tcl_Interp *interp, int argc, + CONST84 char **argv, int flags); +/* 198 */ +EXTERN Tcl_Channel Tcl_OpenFileChannel(Tcl_Interp *interp, + const char *fileName, const char *modeString, + int permissions); +/* 199 */ +EXTERN Tcl_Channel Tcl_OpenTcpClient(Tcl_Interp *interp, int port, + const char *address, const char *myaddr, + int myport, int async); +/* 200 */ +EXTERN Tcl_Channel Tcl_OpenTcpServer(Tcl_Interp *interp, int port, + const char *host, + Tcl_TcpAcceptProc *acceptProc, + ClientData callbackData); +/* 201 */ +EXTERN void Tcl_Preserve(ClientData data); +/* 202 */ +EXTERN void Tcl_PrintDouble(Tcl_Interp *interp, double value, + char *dst); +/* 203 */ +EXTERN int Tcl_PutEnv(const char *assignment); +/* 204 */ +EXTERN CONST84_RETURN char * Tcl_PosixError(Tcl_Interp *interp); +/* 205 */ +EXTERN void Tcl_QueueEvent(Tcl_Event *evPtr, + Tcl_QueuePosition position); +/* 206 */ +EXTERN int Tcl_Read(Tcl_Channel chan, char *bufPtr, int toRead); +/* 207 */ +EXTERN void Tcl_ReapDetachedProcs(void); +/* 208 */ +EXTERN int Tcl_RecordAndEval(Tcl_Interp *interp, + const char *cmd, int flags); +/* 209 */ +EXTERN int Tcl_RecordAndEvalObj(Tcl_Interp *interp, + Tcl_Obj *cmdPtr, int flags); +/* 210 */ +EXTERN void Tcl_RegisterChannel(Tcl_Interp *interp, + Tcl_Channel chan); +/* 211 */ +EXTERN void Tcl_RegisterObjType(const Tcl_ObjType *typePtr); +/* 212 */ +EXTERN Tcl_RegExp Tcl_RegExpCompile(Tcl_Interp *interp, + const char *pattern); +/* 213 */ +EXTERN int Tcl_RegExpExec(Tcl_Interp *interp, Tcl_RegExp regexp, + const char *text, const char *start); +/* 214 */ +EXTERN int Tcl_RegExpMatch(Tcl_Interp *interp, const char *text, + const char *pattern); +/* 215 */ +EXTERN void Tcl_RegExpRange(Tcl_RegExp regexp, int index, + CONST84 char **startPtr, + CONST84 char **endPtr); +/* 216 */ +EXTERN void Tcl_Release(ClientData clientData); +/* 217 */ +EXTERN void Tcl_ResetResult(Tcl_Interp *interp); +/* 218 */ +EXTERN int Tcl_ScanElement(const char *src, int *flagPtr); +/* 219 */ +EXTERN int Tcl_ScanCountedElement(const char *src, int length, + int *flagPtr); +/* 220 */ +EXTERN int Tcl_SeekOld(Tcl_Channel chan, int offset, int mode); +/* 221 */ +EXTERN int Tcl_ServiceAll(void); +/* 222 */ +EXTERN int Tcl_ServiceEvent(int flags); +/* 223 */ +EXTERN void Tcl_SetAssocData(Tcl_Interp *interp, + const char *name, Tcl_InterpDeleteProc *proc, + ClientData clientData); +/* 224 */ +EXTERN void Tcl_SetChannelBufferSize(Tcl_Channel chan, int sz); +/* 225 */ +EXTERN int Tcl_SetChannelOption(Tcl_Interp *interp, + Tcl_Channel chan, const char *optionName, + const char *newValue); +/* 226 */ +EXTERN int Tcl_SetCommandInfo(Tcl_Interp *interp, + const char *cmdName, + const Tcl_CmdInfo *infoPtr); +/* 227 */ +EXTERN void Tcl_SetErrno(int err); +/* 228 */ +EXTERN void Tcl_SetErrorCode(Tcl_Interp *interp, ...); +/* 229 */ +EXTERN void Tcl_SetMaxBlockTime(const Tcl_Time *timePtr); +/* 230 */ +EXTERN void Tcl_SetPanicProc(Tcl_PanicProc *panicProc); +/* 231 */ +EXTERN int Tcl_SetRecursionLimit(Tcl_Interp *interp, int depth); +/* 232 */ +EXTERN void Tcl_SetResult(Tcl_Interp *interp, char *result, + Tcl_FreeProc *freeProc); +/* 233 */ +EXTERN int Tcl_SetServiceMode(int mode); +/* 234 */ +EXTERN void Tcl_SetObjErrorCode(Tcl_Interp *interp, + Tcl_Obj *errorObjPtr); +/* 235 */ +EXTERN void Tcl_SetObjResult(Tcl_Interp *interp, + Tcl_Obj *resultObjPtr); +/* 236 */ +EXTERN void Tcl_SetStdChannel(Tcl_Channel channel, int type); +/* 237 */ +EXTERN CONST84_RETURN char * Tcl_SetVar(Tcl_Interp *interp, + const char *varName, const char *newValue, + int flags); +/* 238 */ +EXTERN CONST84_RETURN char * Tcl_SetVar2(Tcl_Interp *interp, + const char *part1, const char *part2, + const char *newValue, int flags); +/* 239 */ +EXTERN CONST84_RETURN char * Tcl_SignalId(int sig); +/* 240 */ +EXTERN CONST84_RETURN char * Tcl_SignalMsg(int sig); +/* 241 */ +EXTERN void Tcl_SourceRCFile(Tcl_Interp *interp); +/* 242 */ +EXTERN int Tcl_SplitList(Tcl_Interp *interp, + const char *listStr, int *argcPtr, + CONST84 char ***argvPtr); +/* 243 */ +EXTERN void Tcl_SplitPath(const char *path, int *argcPtr, + CONST84 char ***argvPtr); +/* 244 */ +EXTERN void Tcl_StaticPackage(Tcl_Interp *interp, + const char *pkgName, + Tcl_PackageInitProc *initProc, + Tcl_PackageInitProc *safeInitProc); +/* 245 */ +EXTERN int Tcl_StringMatch(const char *str, const char *pattern); +/* 246 */ +EXTERN int Tcl_TellOld(Tcl_Channel chan); +/* 247 */ +EXTERN int Tcl_TraceVar(Tcl_Interp *interp, const char *varName, + int flags, Tcl_VarTraceProc *proc, + ClientData clientData); +/* 248 */ +EXTERN int Tcl_TraceVar2(Tcl_Interp *interp, const char *part1, + const char *part2, int flags, + Tcl_VarTraceProc *proc, + ClientData clientData); +/* 249 */ +EXTERN char * Tcl_TranslateFileName(Tcl_Interp *interp, + const char *name, Tcl_DString *bufferPtr); +/* 250 */ +EXTERN int Tcl_Ungets(Tcl_Channel chan, const char *str, + int len, int atHead); +/* 251 */ +EXTERN void Tcl_UnlinkVar(Tcl_Interp *interp, + const char *varName); +/* 252 */ +EXTERN int Tcl_UnregisterChannel(Tcl_Interp *interp, + Tcl_Channel chan); +/* 253 */ +EXTERN int Tcl_UnsetVar(Tcl_Interp *interp, const char *varName, + int flags); +/* 254 */ +EXTERN int Tcl_UnsetVar2(Tcl_Interp *interp, const char *part1, + const char *part2, int flags); +/* 255 */ +EXTERN void Tcl_UntraceVar(Tcl_Interp *interp, + const char *varName, int flags, + Tcl_VarTraceProc *proc, + ClientData clientData); +/* 256 */ +EXTERN void Tcl_UntraceVar2(Tcl_Interp *interp, + const char *part1, const char *part2, + int flags, Tcl_VarTraceProc *proc, + ClientData clientData); +/* 257 */ +EXTERN void Tcl_UpdateLinkedVar(Tcl_Interp *interp, + const char *varName); +/* 258 */ +EXTERN int Tcl_UpVar(Tcl_Interp *interp, const char *frameName, + const char *varName, const char *localName, + int flags); +/* 259 */ +EXTERN int Tcl_UpVar2(Tcl_Interp *interp, const char *frameName, + const char *part1, const char *part2, + const char *localName, int flags); +/* 260 */ +EXTERN int Tcl_VarEval(Tcl_Interp *interp, ...); +/* 261 */ +EXTERN ClientData Tcl_VarTraceInfo(Tcl_Interp *interp, + const char *varName, int flags, + Tcl_VarTraceProc *procPtr, + ClientData prevClientData); +/* 262 */ +EXTERN ClientData Tcl_VarTraceInfo2(Tcl_Interp *interp, + const char *part1, const char *part2, + int flags, Tcl_VarTraceProc *procPtr, + ClientData prevClientData); +/* 263 */ +EXTERN int Tcl_Write(Tcl_Channel chan, const char *s, int slen); +/* 264 */ +EXTERN void Tcl_WrongNumArgs(Tcl_Interp *interp, int objc, + Tcl_Obj *const objv[], const char *message); +/* 265 */ +EXTERN int Tcl_DumpActiveMemory(const char *fileName); +/* 266 */ +EXTERN void Tcl_ValidateAllMemory(const char *file, int line); +/* 267 */ +EXTERN void Tcl_AppendResultVA(Tcl_Interp *interp, + va_list argList); +/* 268 */ +EXTERN void Tcl_AppendStringsToObjVA(Tcl_Obj *objPtr, + va_list argList); +/* 269 */ +EXTERN char * Tcl_HashStats(Tcl_HashTable *tablePtr); +/* 270 */ +EXTERN CONST84_RETURN char * Tcl_ParseVar(Tcl_Interp *interp, + const char *start, CONST84 char **termPtr); +/* 271 */ +EXTERN CONST84_RETURN char * Tcl_PkgPresent(Tcl_Interp *interp, + const char *name, const char *version, + int exact); +/* 272 */ +EXTERN CONST84_RETURN char * Tcl_PkgPresentEx(Tcl_Interp *interp, + const char *name, const char *version, + int exact, void *clientDataPtr); +/* 273 */ +EXTERN int Tcl_PkgProvide(Tcl_Interp *interp, const char *name, + const char *version); +/* 274 */ +EXTERN CONST84_RETURN char * Tcl_PkgRequire(Tcl_Interp *interp, + const char *name, const char *version, + int exact); +/* 275 */ +EXTERN void Tcl_SetErrorCodeVA(Tcl_Interp *interp, + va_list argList); +/* 276 */ +EXTERN int Tcl_VarEvalVA(Tcl_Interp *interp, va_list argList); +/* 277 */ +EXTERN Tcl_Pid Tcl_WaitPid(Tcl_Pid pid, int *statPtr, int options); +/* 278 */ +EXTERN void Tcl_PanicVA(const char *format, va_list argList); +/* 279 */ +EXTERN void Tcl_GetVersion(int *major, int *minor, + int *patchLevel, int *type); +/* 280 */ +EXTERN void Tcl_InitMemory(Tcl_Interp *interp); +/* 281 */ +EXTERN Tcl_Channel Tcl_StackChannel(Tcl_Interp *interp, + const Tcl_ChannelType *typePtr, + ClientData instanceData, int mask, + Tcl_Channel prevChan); +/* 282 */ +EXTERN int Tcl_UnstackChannel(Tcl_Interp *interp, + Tcl_Channel chan); +/* 283 */ +EXTERN Tcl_Channel Tcl_GetStackedChannel(Tcl_Channel chan); +/* 284 */ +EXTERN void Tcl_SetMainLoop(Tcl_MainLoopProc *proc); +/* Slot 285 is reserved */ +/* 286 */ +EXTERN void Tcl_AppendObjToObj(Tcl_Obj *objPtr, + Tcl_Obj *appendObjPtr); +/* 287 */ +EXTERN Tcl_Encoding Tcl_CreateEncoding(const Tcl_EncodingType *typePtr); +/* 288 */ +EXTERN void Tcl_CreateThreadExitHandler(Tcl_ExitProc *proc, + ClientData clientData); +/* 289 */ +EXTERN void Tcl_DeleteThreadExitHandler(Tcl_ExitProc *proc, + ClientData clientData); +/* 290 */ +EXTERN void Tcl_DiscardResult(Tcl_SavedResult *statePtr); +/* 291 */ +EXTERN int Tcl_EvalEx(Tcl_Interp *interp, const char *script, + int numBytes, int flags); +/* 292 */ +EXTERN int Tcl_EvalObjv(Tcl_Interp *interp, int objc, + Tcl_Obj *const objv[], int flags); +/* 293 */ +EXTERN int Tcl_EvalObjEx(Tcl_Interp *interp, Tcl_Obj *objPtr, + int flags); +/* 294 */ +EXTERN void Tcl_ExitThread(int status); +/* 295 */ +EXTERN int Tcl_ExternalToUtf(Tcl_Interp *interp, + Tcl_Encoding encoding, const char *src, + int srcLen, int flags, + Tcl_EncodingState *statePtr, char *dst, + int dstLen, int *srcReadPtr, + int *dstWrotePtr, int *dstCharsPtr); +/* 296 */ +EXTERN char * Tcl_ExternalToUtfDString(Tcl_Encoding encoding, + const char *src, int srcLen, + Tcl_DString *dsPtr); +/* 297 */ +EXTERN void Tcl_FinalizeThread(void); +/* 298 */ +EXTERN void Tcl_FinalizeNotifier(ClientData clientData); +/* 299 */ +EXTERN void Tcl_FreeEncoding(Tcl_Encoding encoding); +/* 300 */ +EXTERN Tcl_ThreadId Tcl_GetCurrentThread(void); +/* 301 */ +EXTERN Tcl_Encoding Tcl_GetEncoding(Tcl_Interp *interp, const char *name); +/* 302 */ +EXTERN CONST84_RETURN char * Tcl_GetEncodingName(Tcl_Encoding encoding); +/* 303 */ +EXTERN void Tcl_GetEncodingNames(Tcl_Interp *interp); +/* 304 */ +EXTERN int Tcl_GetIndexFromObjStruct(Tcl_Interp *interp, + Tcl_Obj *objPtr, const void *tablePtr, + int offset, const char *msg, int flags, + int *indexPtr); +/* 305 */ +EXTERN void * Tcl_GetThreadData(Tcl_ThreadDataKey *keyPtr, + int size); +/* 306 */ +EXTERN Tcl_Obj * Tcl_GetVar2Ex(Tcl_Interp *interp, const char *part1, + const char *part2, int flags); +/* 307 */ +EXTERN ClientData Tcl_InitNotifier(void); +/* 308 */ +EXTERN void Tcl_MutexLock(Tcl_Mutex *mutexPtr); +/* 309 */ +EXTERN void Tcl_MutexUnlock(Tcl_Mutex *mutexPtr); +/* 310 */ +EXTERN void Tcl_ConditionNotify(Tcl_Condition *condPtr); +/* 311 */ +EXTERN void Tcl_ConditionWait(Tcl_Condition *condPtr, + Tcl_Mutex *mutexPtr, const Tcl_Time *timePtr); +/* 312 */ +EXTERN int Tcl_NumUtfChars(const char *src, int length); +/* 313 */ +EXTERN int Tcl_ReadChars(Tcl_Channel channel, Tcl_Obj *objPtr, + int charsToRead, int appendFlag); +/* 314 */ +EXTERN void Tcl_RestoreResult(Tcl_Interp *interp, + Tcl_SavedResult *statePtr); +/* 315 */ +EXTERN void Tcl_SaveResult(Tcl_Interp *interp, + Tcl_SavedResult *statePtr); +/* 316 */ +EXTERN int Tcl_SetSystemEncoding(Tcl_Interp *interp, + const char *name); +/* 317 */ +EXTERN Tcl_Obj * Tcl_SetVar2Ex(Tcl_Interp *interp, const char *part1, + const char *part2, Tcl_Obj *newValuePtr, + int flags); +/* 318 */ +EXTERN void Tcl_ThreadAlert(Tcl_ThreadId threadId); +/* 319 */ +EXTERN void Tcl_ThreadQueueEvent(Tcl_ThreadId threadId, + Tcl_Event *evPtr, Tcl_QueuePosition position); +/* 320 */ +EXTERN Tcl_UniChar Tcl_UniCharAtIndex(const char *src, int index); +/* 321 */ +EXTERN Tcl_UniChar Tcl_UniCharToLower(int ch); +/* 322 */ +EXTERN Tcl_UniChar Tcl_UniCharToTitle(int ch); +/* 323 */ +EXTERN Tcl_UniChar Tcl_UniCharToUpper(int ch); +/* 324 */ +EXTERN int Tcl_UniCharToUtf(int ch, char *buf); +/* 325 */ +EXTERN CONST84_RETURN char * Tcl_UtfAtIndex(const char *src, int index); +/* 326 */ +EXTERN int Tcl_UtfCharComplete(const char *src, int length); +/* 327 */ +EXTERN int Tcl_UtfBackslash(const char *src, int *readPtr, + char *dst); +/* 328 */ +EXTERN CONST84_RETURN char * Tcl_UtfFindFirst(const char *src, int ch); +/* 329 */ +EXTERN CONST84_RETURN char * Tcl_UtfFindLast(const char *src, int ch); +/* 330 */ +EXTERN CONST84_RETURN char * Tcl_UtfNext(const char *src); +/* 331 */ +EXTERN CONST84_RETURN char * Tcl_UtfPrev(const char *src, const char *start); +/* 332 */ +EXTERN int Tcl_UtfToExternal(Tcl_Interp *interp, + Tcl_Encoding encoding, const char *src, + int srcLen, int flags, + Tcl_EncodingState *statePtr, char *dst, + int dstLen, int *srcReadPtr, + int *dstWrotePtr, int *dstCharsPtr); +/* 333 */ +EXTERN char * Tcl_UtfToExternalDString(Tcl_Encoding encoding, + const char *src, int srcLen, + Tcl_DString *dsPtr); +/* 334 */ +EXTERN int Tcl_UtfToLower(char *src); +/* 335 */ +EXTERN int Tcl_UtfToTitle(char *src); +/* 336 */ +EXTERN int Tcl_UtfToUniChar(const char *src, Tcl_UniChar *chPtr); +/* 337 */ +EXTERN int Tcl_UtfToUpper(char *src); +/* 338 */ +EXTERN int Tcl_WriteChars(Tcl_Channel chan, const char *src, + int srcLen); +/* 339 */ +EXTERN int Tcl_WriteObj(Tcl_Channel chan, Tcl_Obj *objPtr); +/* 340 */ +EXTERN char * Tcl_GetString(Tcl_Obj *objPtr); +/* 341 */ +EXTERN CONST84_RETURN char * Tcl_GetDefaultEncodingDir(void); +/* 342 */ +EXTERN void Tcl_SetDefaultEncodingDir(const char *path); +/* 343 */ +EXTERN void Tcl_AlertNotifier(ClientData clientData); +/* 344 */ +EXTERN void Tcl_ServiceModeHook(int mode); +/* 345 */ +EXTERN int Tcl_UniCharIsAlnum(int ch); +/* 346 */ +EXTERN int Tcl_UniCharIsAlpha(int ch); +/* 347 */ +EXTERN int Tcl_UniCharIsDigit(int ch); +/* 348 */ +EXTERN int Tcl_UniCharIsLower(int ch); +/* 349 */ +EXTERN int Tcl_UniCharIsSpace(int ch); +/* 350 */ +EXTERN int Tcl_UniCharIsUpper(int ch); +/* 351 */ +EXTERN int Tcl_UniCharIsWordChar(int ch); +/* 352 */ +EXTERN int Tcl_UniCharLen(const Tcl_UniChar *uniStr); +/* 353 */ +EXTERN int Tcl_UniCharNcmp(const Tcl_UniChar *ucs, + const Tcl_UniChar *uct, + unsigned long numChars); +/* 354 */ +EXTERN char * Tcl_UniCharToUtfDString(const Tcl_UniChar *uniStr, + int uniLength, Tcl_DString *dsPtr); +/* 355 */ +EXTERN Tcl_UniChar * Tcl_UtfToUniCharDString(const char *src, int length, + Tcl_DString *dsPtr); +/* 356 */ +EXTERN Tcl_RegExp Tcl_GetRegExpFromObj(Tcl_Interp *interp, + Tcl_Obj *patObj, int flags); +/* 357 */ +EXTERN Tcl_Obj * Tcl_EvalTokens(Tcl_Interp *interp, + Tcl_Token *tokenPtr, int count); +/* 358 */ +EXTERN void Tcl_FreeParse(Tcl_Parse *parsePtr); +/* 359 */ +EXTERN void Tcl_LogCommandInfo(Tcl_Interp *interp, + const char *script, const char *command, + int length); +/* 360 */ +EXTERN int Tcl_ParseBraces(Tcl_Interp *interp, + const char *start, int numBytes, + Tcl_Parse *parsePtr, int append, + CONST84 char **termPtr); +/* 361 */ +EXTERN int Tcl_ParseCommand(Tcl_Interp *interp, + const char *start, int numBytes, int nested, + Tcl_Parse *parsePtr); +/* 362 */ +EXTERN int Tcl_ParseExpr(Tcl_Interp *interp, const char *start, + int numBytes, Tcl_Parse *parsePtr); +/* 363 */ +EXTERN int Tcl_ParseQuotedString(Tcl_Interp *interp, + const char *start, int numBytes, + Tcl_Parse *parsePtr, int append, + CONST84 char **termPtr); +/* 364 */ +EXTERN int Tcl_ParseVarName(Tcl_Interp *interp, + const char *start, int numBytes, + Tcl_Parse *parsePtr, int append); +/* 365 */ +EXTERN char * Tcl_GetCwd(Tcl_Interp *interp, Tcl_DString *cwdPtr); +/* 366 */ +EXTERN int Tcl_Chdir(const char *dirName); +/* 367 */ +EXTERN int Tcl_Access(const char *path, int mode); +/* 368 */ +EXTERN int Tcl_Stat(const char *path, struct stat *bufPtr); +/* 369 */ +EXTERN int Tcl_UtfNcmp(const char *s1, const char *s2, + unsigned long n); +/* 370 */ +EXTERN int Tcl_UtfNcasecmp(const char *s1, const char *s2, + unsigned long n); +/* 371 */ +EXTERN int Tcl_StringCaseMatch(const char *str, + const char *pattern, int nocase); +/* 372 */ +EXTERN int Tcl_UniCharIsControl(int ch); +/* 373 */ +EXTERN int Tcl_UniCharIsGraph(int ch); +/* 374 */ +EXTERN int Tcl_UniCharIsPrint(int ch); +/* 375 */ +EXTERN int Tcl_UniCharIsPunct(int ch); +/* 376 */ +EXTERN int Tcl_RegExpExecObj(Tcl_Interp *interp, + Tcl_RegExp regexp, Tcl_Obj *textObj, + int offset, int nmatches, int flags); +/* 377 */ +EXTERN void Tcl_RegExpGetInfo(Tcl_RegExp regexp, + Tcl_RegExpInfo *infoPtr); +/* 378 */ +EXTERN Tcl_Obj * Tcl_NewUnicodeObj(const Tcl_UniChar *unicode, + int numChars); +/* 379 */ +EXTERN void Tcl_SetUnicodeObj(Tcl_Obj *objPtr, + const Tcl_UniChar *unicode, int numChars); +/* 380 */ +EXTERN int Tcl_GetCharLength(Tcl_Obj *objPtr); +/* 381 */ +EXTERN Tcl_UniChar Tcl_GetUniChar(Tcl_Obj *objPtr, int index); +/* 382 */ +EXTERN Tcl_UniChar * Tcl_GetUnicode(Tcl_Obj *objPtr); +/* 383 */ +EXTERN Tcl_Obj * Tcl_GetRange(Tcl_Obj *objPtr, int first, int last); +/* 384 */ +EXTERN void Tcl_AppendUnicodeToObj(Tcl_Obj *objPtr, + const Tcl_UniChar *unicode, int length); +/* 385 */ +EXTERN int Tcl_RegExpMatchObj(Tcl_Interp *interp, + Tcl_Obj *textObj, Tcl_Obj *patternObj); +/* 386 */ +EXTERN void Tcl_SetNotifier(Tcl_NotifierProcs *notifierProcPtr); +/* 387 */ +EXTERN Tcl_Mutex * Tcl_GetAllocMutex(void); +/* 388 */ +EXTERN int Tcl_GetChannelNames(Tcl_Interp *interp); +/* 389 */ +EXTERN int Tcl_GetChannelNamesEx(Tcl_Interp *interp, + const char *pattern); +/* 390 */ +EXTERN int Tcl_ProcObjCmd(ClientData clientData, + Tcl_Interp *interp, int objc, + Tcl_Obj *const objv[]); +/* 391 */ +EXTERN void Tcl_ConditionFinalize(Tcl_Condition *condPtr); +/* 392 */ +EXTERN void Tcl_MutexFinalize(Tcl_Mutex *mutex); +/* 393 */ +EXTERN int Tcl_CreateThread(Tcl_ThreadId *idPtr, + Tcl_ThreadCreateProc *proc, + ClientData clientData, int stackSize, + int flags); +/* 394 */ +EXTERN int Tcl_ReadRaw(Tcl_Channel chan, char *dst, + int bytesToRead); +/* 395 */ +EXTERN int Tcl_WriteRaw(Tcl_Channel chan, const char *src, + int srcLen); +/* 396 */ +EXTERN Tcl_Channel Tcl_GetTopChannel(Tcl_Channel chan); +/* 397 */ +EXTERN int Tcl_ChannelBuffered(Tcl_Channel chan); +/* 398 */ +EXTERN CONST84_RETURN char * Tcl_ChannelName( + const Tcl_ChannelType *chanTypePtr); +/* 399 */ +EXTERN Tcl_ChannelTypeVersion Tcl_ChannelVersion( + const Tcl_ChannelType *chanTypePtr); +/* 400 */ +EXTERN Tcl_DriverBlockModeProc * Tcl_ChannelBlockModeProc( + const Tcl_ChannelType *chanTypePtr); +/* 401 */ +EXTERN Tcl_DriverCloseProc * Tcl_ChannelCloseProc( + const Tcl_ChannelType *chanTypePtr); +/* 402 */ +EXTERN Tcl_DriverClose2Proc * Tcl_ChannelClose2Proc( + const Tcl_ChannelType *chanTypePtr); +/* 403 */ +EXTERN Tcl_DriverInputProc * Tcl_ChannelInputProc( + const Tcl_ChannelType *chanTypePtr); +/* 404 */ +EXTERN Tcl_DriverOutputProc * Tcl_ChannelOutputProc( + const Tcl_ChannelType *chanTypePtr); +/* 405 */ +EXTERN Tcl_DriverSeekProc * Tcl_ChannelSeekProc( + const Tcl_ChannelType *chanTypePtr); +/* 406 */ +EXTERN Tcl_DriverSetOptionProc * Tcl_ChannelSetOptionProc( + const Tcl_ChannelType *chanTypePtr); +/* 407 */ +EXTERN Tcl_DriverGetOptionProc * Tcl_ChannelGetOptionProc( + const Tcl_ChannelType *chanTypePtr); +/* 408 */ +EXTERN Tcl_DriverWatchProc * Tcl_ChannelWatchProc( + const Tcl_ChannelType *chanTypePtr); +/* 409 */ +EXTERN Tcl_DriverGetHandleProc * Tcl_ChannelGetHandleProc( + const Tcl_ChannelType *chanTypePtr); +/* 410 */ +EXTERN Tcl_DriverFlushProc * Tcl_ChannelFlushProc( + const Tcl_ChannelType *chanTypePtr); +/* 411 */ +EXTERN Tcl_DriverHandlerProc * Tcl_ChannelHandlerProc( + const Tcl_ChannelType *chanTypePtr); +/* 412 */ +EXTERN int Tcl_JoinThread(Tcl_ThreadId threadId, int *result); +/* 413 */ +EXTERN int Tcl_IsChannelShared(Tcl_Channel channel); +/* 414 */ +EXTERN int Tcl_IsChannelRegistered(Tcl_Interp *interp, + Tcl_Channel channel); +/* 415 */ +EXTERN void Tcl_CutChannel(Tcl_Channel channel); +/* 416 */ +EXTERN void Tcl_SpliceChannel(Tcl_Channel channel); +/* 417 */ +EXTERN void Tcl_ClearChannelHandlers(Tcl_Channel channel); +/* 418 */ +EXTERN int Tcl_IsChannelExisting(const char *channelName); +/* 419 */ +EXTERN int Tcl_UniCharNcasecmp(const Tcl_UniChar *ucs, + const Tcl_UniChar *uct, + unsigned long numChars); +/* 420 */ +EXTERN int Tcl_UniCharCaseMatch(const Tcl_UniChar *uniStr, + const Tcl_UniChar *uniPattern, int nocase); +/* 421 */ +EXTERN Tcl_HashEntry * Tcl_FindHashEntry(Tcl_HashTable *tablePtr, + const void *key); +/* 422 */ +EXTERN Tcl_HashEntry * Tcl_CreateHashEntry(Tcl_HashTable *tablePtr, + const void *key, int *newPtr); +/* 423 */ +EXTERN void Tcl_InitCustomHashTable(Tcl_HashTable *tablePtr, + int keyType, const Tcl_HashKeyType *typePtr); +/* 424 */ +EXTERN void Tcl_InitObjHashTable(Tcl_HashTable *tablePtr); +/* 425 */ +EXTERN ClientData Tcl_CommandTraceInfo(Tcl_Interp *interp, + const char *varName, int flags, + Tcl_CommandTraceProc *procPtr, + ClientData prevClientData); +/* 426 */ +EXTERN int Tcl_TraceCommand(Tcl_Interp *interp, + const char *varName, int flags, + Tcl_CommandTraceProc *proc, + ClientData clientData); +/* 427 */ +EXTERN void Tcl_UntraceCommand(Tcl_Interp *interp, + const char *varName, int flags, + Tcl_CommandTraceProc *proc, + ClientData clientData); +/* 428 */ +EXTERN char * Tcl_AttemptAlloc(unsigned int size); +/* 429 */ +EXTERN char * Tcl_AttemptDbCkalloc(unsigned int size, + const char *file, int line); +/* 430 */ +EXTERN char * Tcl_AttemptRealloc(char *ptr, unsigned int size); +/* 431 */ +EXTERN char * Tcl_AttemptDbCkrealloc(char *ptr, unsigned int size, + const char *file, int line); +/* 432 */ +EXTERN int Tcl_AttemptSetObjLength(Tcl_Obj *objPtr, int length); +/* 433 */ +EXTERN Tcl_ThreadId Tcl_GetChannelThread(Tcl_Channel channel); +/* 434 */ +EXTERN Tcl_UniChar * Tcl_GetUnicodeFromObj(Tcl_Obj *objPtr, + int *lengthPtr); +/* 435 */ +EXTERN int Tcl_GetMathFuncInfo(Tcl_Interp *interp, + const char *name, int *numArgsPtr, + Tcl_ValueType **argTypesPtr, + Tcl_MathProc **procPtr, + ClientData *clientDataPtr); +/* 436 */ +EXTERN Tcl_Obj * Tcl_ListMathFuncs(Tcl_Interp *interp, + const char *pattern); +/* 437 */ +EXTERN Tcl_Obj * Tcl_SubstObj(Tcl_Interp *interp, Tcl_Obj *objPtr, + int flags); +/* 438 */ +EXTERN int Tcl_DetachChannel(Tcl_Interp *interp, + Tcl_Channel channel); +/* 439 */ +EXTERN int Tcl_IsStandardChannel(Tcl_Channel channel); +/* 440 */ +EXTERN int Tcl_FSCopyFile(Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr); +/* 441 */ +EXTERN int Tcl_FSCopyDirectory(Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr, Tcl_Obj **errorPtr); +/* 442 */ +EXTERN int Tcl_FSCreateDirectory(Tcl_Obj *pathPtr); +/* 443 */ +EXTERN int Tcl_FSDeleteFile(Tcl_Obj *pathPtr); +/* 444 */ +EXTERN int Tcl_FSLoadFile(Tcl_Interp *interp, Tcl_Obj *pathPtr, + const char *sym1, const char *sym2, + Tcl_PackageInitProc **proc1Ptr, + Tcl_PackageInitProc **proc2Ptr, + Tcl_LoadHandle *handlePtr, + Tcl_FSUnloadFileProc **unloadProcPtr); +/* 445 */ +EXTERN int Tcl_FSMatchInDirectory(Tcl_Interp *interp, + Tcl_Obj *result, Tcl_Obj *pathPtr, + const char *pattern, Tcl_GlobTypeData *types); +/* 446 */ +EXTERN Tcl_Obj * Tcl_FSLink(Tcl_Obj *pathPtr, Tcl_Obj *toPtr, + int linkAction); +/* 447 */ +EXTERN int Tcl_FSRemoveDirectory(Tcl_Obj *pathPtr, + int recursive, Tcl_Obj **errorPtr); +/* 448 */ +EXTERN int Tcl_FSRenameFile(Tcl_Obj *srcPathPtr, + Tcl_Obj *destPathPtr); +/* 449 */ +EXTERN int Tcl_FSLstat(Tcl_Obj *pathPtr, Tcl_StatBuf *buf); +/* 450 */ +EXTERN int Tcl_FSUtime(Tcl_Obj *pathPtr, struct utimbuf *tval); +/* 451 */ +EXTERN int Tcl_FSFileAttrsGet(Tcl_Interp *interp, int index, + Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef); +/* 452 */ +EXTERN int Tcl_FSFileAttrsSet(Tcl_Interp *interp, int index, + Tcl_Obj *pathPtr, Tcl_Obj *objPtr); +/* 453 */ +EXTERN const char *CONST86 * Tcl_FSFileAttrStrings(Tcl_Obj *pathPtr, + Tcl_Obj **objPtrRef); +/* 454 */ +EXTERN int Tcl_FSStat(Tcl_Obj *pathPtr, Tcl_StatBuf *buf); +/* 455 */ +EXTERN int Tcl_FSAccess(Tcl_Obj *pathPtr, int mode); +/* 456 */ +EXTERN Tcl_Channel Tcl_FSOpenFileChannel(Tcl_Interp *interp, + Tcl_Obj *pathPtr, const char *modeString, + int permissions); +/* 457 */ +EXTERN Tcl_Obj * Tcl_FSGetCwd(Tcl_Interp *interp); +/* 458 */ +EXTERN int Tcl_FSChdir(Tcl_Obj *pathPtr); +/* 459 */ +EXTERN int Tcl_FSConvertToPathType(Tcl_Interp *interp, + Tcl_Obj *pathPtr); +/* 460 */ +EXTERN Tcl_Obj * Tcl_FSJoinPath(Tcl_Obj *listObj, int elements); +/* 461 */ +EXTERN Tcl_Obj * Tcl_FSSplitPath(Tcl_Obj *pathPtr, int *lenPtr); +/* 462 */ +EXTERN int Tcl_FSEqualPaths(Tcl_Obj *firstPtr, + Tcl_Obj *secondPtr); +/* 463 */ +EXTERN Tcl_Obj * Tcl_FSGetNormalizedPath(Tcl_Interp *interp, + Tcl_Obj *pathPtr); +/* 464 */ +EXTERN Tcl_Obj * Tcl_FSJoinToPath(Tcl_Obj *pathPtr, int objc, + Tcl_Obj *const objv[]); +/* 465 */ +EXTERN ClientData Tcl_FSGetInternalRep(Tcl_Obj *pathPtr, + const Tcl_Filesystem *fsPtr); +/* 466 */ +EXTERN Tcl_Obj * Tcl_FSGetTranslatedPath(Tcl_Interp *interp, + Tcl_Obj *pathPtr); +/* 467 */ +EXTERN int Tcl_FSEvalFile(Tcl_Interp *interp, Tcl_Obj *fileName); +/* 468 */ +EXTERN Tcl_Obj * Tcl_FSNewNativePath( + const Tcl_Filesystem *fromFilesystem, + ClientData clientData); +/* 469 */ +EXTERN const void * Tcl_FSGetNativePath(Tcl_Obj *pathPtr); +/* 470 */ +EXTERN Tcl_Obj * Tcl_FSFileSystemInfo(Tcl_Obj *pathPtr); +/* 471 */ +EXTERN Tcl_Obj * Tcl_FSPathSeparator(Tcl_Obj *pathPtr); +/* 472 */ +EXTERN Tcl_Obj * Tcl_FSListVolumes(void); +/* 473 */ +EXTERN int Tcl_FSRegister(ClientData clientData, + const Tcl_Filesystem *fsPtr); +/* 474 */ +EXTERN int Tcl_FSUnregister(const Tcl_Filesystem *fsPtr); +/* 475 */ +EXTERN ClientData Tcl_FSData(const Tcl_Filesystem *fsPtr); +/* 476 */ +EXTERN const char * Tcl_FSGetTranslatedStringPath(Tcl_Interp *interp, + Tcl_Obj *pathPtr); +/* 477 */ +EXTERN CONST86 Tcl_Filesystem * Tcl_FSGetFileSystemForPath(Tcl_Obj *pathPtr); +/* 478 */ +EXTERN Tcl_PathType Tcl_FSGetPathType(Tcl_Obj *pathPtr); +/* 479 */ +EXTERN int Tcl_OutputBuffered(Tcl_Channel chan); +/* 480 */ +EXTERN void Tcl_FSMountsChanged(const Tcl_Filesystem *fsPtr); +/* 481 */ +EXTERN int Tcl_EvalTokensStandard(Tcl_Interp *interp, + Tcl_Token *tokenPtr, int count); +/* 482 */ +EXTERN void Tcl_GetTime(Tcl_Time *timeBuf); +/* 483 */ +EXTERN Tcl_Trace Tcl_CreateObjTrace(Tcl_Interp *interp, int level, + int flags, Tcl_CmdObjTraceProc *objProc, + ClientData clientData, + Tcl_CmdObjTraceDeleteProc *delProc); +/* 484 */ +EXTERN int Tcl_GetCommandInfoFromToken(Tcl_Command token, + Tcl_CmdInfo *infoPtr); +/* 485 */ +EXTERN int Tcl_SetCommandInfoFromToken(Tcl_Command token, + const Tcl_CmdInfo *infoPtr); +/* 486 */ +EXTERN Tcl_Obj * Tcl_DbNewWideIntObj(Tcl_WideInt wideValue, + const char *file, int line); +/* 487 */ +EXTERN int Tcl_GetWideIntFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, Tcl_WideInt *widePtr); +/* 488 */ +EXTERN Tcl_Obj * Tcl_NewWideIntObj(Tcl_WideInt wideValue); +/* 489 */ +EXTERN void Tcl_SetWideIntObj(Tcl_Obj *objPtr, + Tcl_WideInt wideValue); +/* 490 */ +EXTERN Tcl_StatBuf * Tcl_AllocStatBuf(void); +/* 491 */ +EXTERN Tcl_WideInt Tcl_Seek(Tcl_Channel chan, Tcl_WideInt offset, + int mode); +/* 492 */ +EXTERN Tcl_WideInt Tcl_Tell(Tcl_Channel chan); +/* 493 */ +EXTERN Tcl_DriverWideSeekProc * Tcl_ChannelWideSeekProc( + const Tcl_ChannelType *chanTypePtr); +/* 494 */ +EXTERN int Tcl_DictObjPut(Tcl_Interp *interp, Tcl_Obj *dictPtr, + Tcl_Obj *keyPtr, Tcl_Obj *valuePtr); +/* 495 */ +EXTERN int Tcl_DictObjGet(Tcl_Interp *interp, Tcl_Obj *dictPtr, + Tcl_Obj *keyPtr, Tcl_Obj **valuePtrPtr); +/* 496 */ +EXTERN int Tcl_DictObjRemove(Tcl_Interp *interp, + Tcl_Obj *dictPtr, Tcl_Obj *keyPtr); +/* 497 */ +EXTERN int Tcl_DictObjSize(Tcl_Interp *interp, Tcl_Obj *dictPtr, + int *sizePtr); +/* 498 */ +EXTERN int Tcl_DictObjFirst(Tcl_Interp *interp, + Tcl_Obj *dictPtr, Tcl_DictSearch *searchPtr, + Tcl_Obj **keyPtrPtr, Tcl_Obj **valuePtrPtr, + int *donePtr); +/* 499 */ +EXTERN void Tcl_DictObjNext(Tcl_DictSearch *searchPtr, + Tcl_Obj **keyPtrPtr, Tcl_Obj **valuePtrPtr, + int *donePtr); +/* 500 */ +EXTERN void Tcl_DictObjDone(Tcl_DictSearch *searchPtr); +/* 501 */ +EXTERN int Tcl_DictObjPutKeyList(Tcl_Interp *interp, + Tcl_Obj *dictPtr, int keyc, + Tcl_Obj *const *keyv, Tcl_Obj *valuePtr); +/* 502 */ +EXTERN int Tcl_DictObjRemoveKeyList(Tcl_Interp *interp, + Tcl_Obj *dictPtr, int keyc, + Tcl_Obj *const *keyv); +/* 503 */ +EXTERN Tcl_Obj * Tcl_NewDictObj(void); +/* 504 */ +EXTERN Tcl_Obj * Tcl_DbNewDictObj(const char *file, int line); +/* 505 */ +EXTERN void Tcl_RegisterConfig(Tcl_Interp *interp, + const char *pkgName, + const Tcl_Config *configuration, + const char *valEncoding); +/* 506 */ +EXTERN Tcl_Namespace * Tcl_CreateNamespace(Tcl_Interp *interp, + const char *name, ClientData clientData, + Tcl_NamespaceDeleteProc *deleteProc); +/* 507 */ +EXTERN void Tcl_DeleteNamespace(Tcl_Namespace *nsPtr); +/* 508 */ +EXTERN int Tcl_AppendExportList(Tcl_Interp *interp, + Tcl_Namespace *nsPtr, Tcl_Obj *objPtr); +/* 509 */ +EXTERN int Tcl_Export(Tcl_Interp *interp, Tcl_Namespace *nsPtr, + const char *pattern, int resetListFirst); +/* 510 */ +EXTERN int Tcl_Import(Tcl_Interp *interp, Tcl_Namespace *nsPtr, + const char *pattern, int allowOverwrite); +/* 511 */ +EXTERN int Tcl_ForgetImport(Tcl_Interp *interp, + Tcl_Namespace *nsPtr, const char *pattern); +/* 512 */ +EXTERN Tcl_Namespace * Tcl_GetCurrentNamespace(Tcl_Interp *interp); +/* 513 */ +EXTERN Tcl_Namespace * Tcl_GetGlobalNamespace(Tcl_Interp *interp); +/* 514 */ +EXTERN Tcl_Namespace * Tcl_FindNamespace(Tcl_Interp *interp, + const char *name, + Tcl_Namespace *contextNsPtr, int flags); +/* 515 */ +EXTERN Tcl_Command Tcl_FindCommand(Tcl_Interp *interp, const char *name, + Tcl_Namespace *contextNsPtr, int flags); +/* 516 */ +EXTERN Tcl_Command Tcl_GetCommandFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr); +/* 517 */ +EXTERN void Tcl_GetCommandFullName(Tcl_Interp *interp, + Tcl_Command command, Tcl_Obj *objPtr); +/* 518 */ +EXTERN int Tcl_FSEvalFileEx(Tcl_Interp *interp, + Tcl_Obj *fileName, const char *encodingName); +/* 519 */ +EXTERN Tcl_ExitProc * Tcl_SetExitProc(Tcl_ExitProc *proc); +/* 520 */ +EXTERN void Tcl_LimitAddHandler(Tcl_Interp *interp, int type, + Tcl_LimitHandlerProc *handlerProc, + ClientData clientData, + Tcl_LimitHandlerDeleteProc *deleteProc); +/* 521 */ +EXTERN void Tcl_LimitRemoveHandler(Tcl_Interp *interp, int type, + Tcl_LimitHandlerProc *handlerProc, + ClientData clientData); +/* 522 */ +EXTERN int Tcl_LimitReady(Tcl_Interp *interp); +/* 523 */ +EXTERN int Tcl_LimitCheck(Tcl_Interp *interp); +/* 524 */ +EXTERN int Tcl_LimitExceeded(Tcl_Interp *interp); +/* 525 */ +EXTERN void Tcl_LimitSetCommands(Tcl_Interp *interp, + int commandLimit); +/* 526 */ +EXTERN void Tcl_LimitSetTime(Tcl_Interp *interp, + Tcl_Time *timeLimitPtr); +/* 527 */ +EXTERN void Tcl_LimitSetGranularity(Tcl_Interp *interp, int type, + int granularity); +/* 528 */ +EXTERN int Tcl_LimitTypeEnabled(Tcl_Interp *interp, int type); +/* 529 */ +EXTERN int Tcl_LimitTypeExceeded(Tcl_Interp *interp, int type); +/* 530 */ +EXTERN void Tcl_LimitTypeSet(Tcl_Interp *interp, int type); +/* 531 */ +EXTERN void Tcl_LimitTypeReset(Tcl_Interp *interp, int type); +/* 532 */ +EXTERN int Tcl_LimitGetCommands(Tcl_Interp *interp); +/* 533 */ +EXTERN void Tcl_LimitGetTime(Tcl_Interp *interp, + Tcl_Time *timeLimitPtr); +/* 534 */ +EXTERN int Tcl_LimitGetGranularity(Tcl_Interp *interp, int type); +/* 535 */ +EXTERN Tcl_InterpState Tcl_SaveInterpState(Tcl_Interp *interp, int status); +/* 536 */ +EXTERN int Tcl_RestoreInterpState(Tcl_Interp *interp, + Tcl_InterpState state); +/* 537 */ +EXTERN void Tcl_DiscardInterpState(Tcl_InterpState state); +/* 538 */ +EXTERN int Tcl_SetReturnOptions(Tcl_Interp *interp, + Tcl_Obj *options); +/* 539 */ +EXTERN Tcl_Obj * Tcl_GetReturnOptions(Tcl_Interp *interp, int result); +/* 540 */ +EXTERN int Tcl_IsEnsemble(Tcl_Command token); +/* 541 */ +EXTERN Tcl_Command Tcl_CreateEnsemble(Tcl_Interp *interp, + const char *name, + Tcl_Namespace *namespacePtr, int flags); +/* 542 */ +EXTERN Tcl_Command Tcl_FindEnsemble(Tcl_Interp *interp, + Tcl_Obj *cmdNameObj, int flags); +/* 543 */ +EXTERN int Tcl_SetEnsembleSubcommandList(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj *subcmdList); +/* 544 */ +EXTERN int Tcl_SetEnsembleMappingDict(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj *mapDict); +/* 545 */ +EXTERN int Tcl_SetEnsembleUnknownHandler(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj *unknownList); +/* 546 */ +EXTERN int Tcl_SetEnsembleFlags(Tcl_Interp *interp, + Tcl_Command token, int flags); +/* 547 */ +EXTERN int Tcl_GetEnsembleSubcommandList(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj **subcmdListPtr); +/* 548 */ +EXTERN int Tcl_GetEnsembleMappingDict(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj **mapDictPtr); +/* 549 */ +EXTERN int Tcl_GetEnsembleUnknownHandler(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj **unknownListPtr); +/* 550 */ +EXTERN int Tcl_GetEnsembleFlags(Tcl_Interp *interp, + Tcl_Command token, int *flagsPtr); +/* 551 */ +EXTERN int Tcl_GetEnsembleNamespace(Tcl_Interp *interp, + Tcl_Command token, + Tcl_Namespace **namespacePtrPtr); +/* 552 */ +EXTERN void Tcl_SetTimeProc(Tcl_GetTimeProc *getProc, + Tcl_ScaleTimeProc *scaleProc, + ClientData clientData); +/* 553 */ +EXTERN void Tcl_QueryTimeProc(Tcl_GetTimeProc **getProc, + Tcl_ScaleTimeProc **scaleProc, + ClientData *clientData); +/* 554 */ +EXTERN Tcl_DriverThreadActionProc * Tcl_ChannelThreadActionProc( + const Tcl_ChannelType *chanTypePtr); +/* 555 */ +EXTERN Tcl_Obj * Tcl_NewBignumObj(mp_int *value); +/* 556 */ +EXTERN Tcl_Obj * Tcl_DbNewBignumObj(mp_int *value, const char *file, + int line); +/* 557 */ +EXTERN void Tcl_SetBignumObj(Tcl_Obj *obj, mp_int *value); +/* 558 */ +EXTERN int Tcl_GetBignumFromObj(Tcl_Interp *interp, + Tcl_Obj *obj, mp_int *value); +/* 559 */ +EXTERN int Tcl_TakeBignumFromObj(Tcl_Interp *interp, + Tcl_Obj *obj, mp_int *value); +/* 560 */ +EXTERN int Tcl_TruncateChannel(Tcl_Channel chan, + Tcl_WideInt length); +/* 561 */ +EXTERN Tcl_DriverTruncateProc * Tcl_ChannelTruncateProc( + const Tcl_ChannelType *chanTypePtr); +/* 562 */ +EXTERN void Tcl_SetChannelErrorInterp(Tcl_Interp *interp, + Tcl_Obj *msg); +/* 563 */ +EXTERN void Tcl_GetChannelErrorInterp(Tcl_Interp *interp, + Tcl_Obj **msg); +/* 564 */ +EXTERN void Tcl_SetChannelError(Tcl_Channel chan, Tcl_Obj *msg); +/* 565 */ +EXTERN void Tcl_GetChannelError(Tcl_Channel chan, Tcl_Obj **msg); +/* 566 */ +EXTERN int Tcl_InitBignumFromDouble(Tcl_Interp *interp, + double initval, mp_int *toInit); +/* 567 */ +EXTERN Tcl_Obj * Tcl_GetNamespaceUnknownHandler(Tcl_Interp *interp, + Tcl_Namespace *nsPtr); +/* 568 */ +EXTERN int Tcl_SetNamespaceUnknownHandler(Tcl_Interp *interp, + Tcl_Namespace *nsPtr, Tcl_Obj *handlerPtr); +/* 569 */ +EXTERN int Tcl_GetEncodingFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, Tcl_Encoding *encodingPtr); +/* 570 */ +EXTERN Tcl_Obj * Tcl_GetEncodingSearchPath(void); +/* 571 */ +EXTERN int Tcl_SetEncodingSearchPath(Tcl_Obj *searchPath); +/* 572 */ +EXTERN const char * Tcl_GetEncodingNameFromEnvironment( + Tcl_DString *bufPtr); +/* 573 */ +EXTERN int Tcl_PkgRequireProc(Tcl_Interp *interp, + const char *name, int objc, + Tcl_Obj *const objv[], void *clientDataPtr); +/* 574 */ +EXTERN void Tcl_AppendObjToErrorInfo(Tcl_Interp *interp, + Tcl_Obj *objPtr); +/* 575 */ +EXTERN void Tcl_AppendLimitedToObj(Tcl_Obj *objPtr, + const char *bytes, int length, int limit, + const char *ellipsis); +/* 576 */ +EXTERN Tcl_Obj * Tcl_Format(Tcl_Interp *interp, const char *format, + int objc, Tcl_Obj *const objv[]); +/* 577 */ +EXTERN int Tcl_AppendFormatToObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, const char *format, + int objc, Tcl_Obj *const objv[]); +/* 578 */ +EXTERN Tcl_Obj * Tcl_ObjPrintf(const char *format, ...) TCL_FORMAT_PRINTF(1, 2); +/* 579 */ +EXTERN void Tcl_AppendPrintfToObj(Tcl_Obj *objPtr, + const char *format, ...) TCL_FORMAT_PRINTF(2, 3); +/* 580 */ +EXTERN int Tcl_CancelEval(Tcl_Interp *interp, + Tcl_Obj *resultObjPtr, ClientData clientData, + int flags); +/* 581 */ +EXTERN int Tcl_Canceled(Tcl_Interp *interp, int flags); +/* 582 */ +EXTERN int Tcl_CreatePipe(Tcl_Interp *interp, + Tcl_Channel *rchan, Tcl_Channel *wchan, + int flags); +/* 583 */ +EXTERN Tcl_Command Tcl_NRCreateCommand(Tcl_Interp *interp, + const char *cmdName, Tcl_ObjCmdProc *proc, + Tcl_ObjCmdProc *nreProc, + ClientData clientData, + Tcl_CmdDeleteProc *deleteProc); +/* 584 */ +EXTERN int Tcl_NREvalObj(Tcl_Interp *interp, Tcl_Obj *objPtr, + int flags); +/* 585 */ +EXTERN int Tcl_NREvalObjv(Tcl_Interp *interp, int objc, + Tcl_Obj *const objv[], int flags); +/* 586 */ +EXTERN int Tcl_NRCmdSwap(Tcl_Interp *interp, Tcl_Command cmd, + int objc, Tcl_Obj *const objv[], int flags); +/* 587 */ +EXTERN void Tcl_NRAddCallback(Tcl_Interp *interp, + Tcl_NRPostProc *postProcPtr, + ClientData data0, ClientData data1, + ClientData data2, ClientData data3); +/* 588 */ +EXTERN int Tcl_NRCallObjProc(Tcl_Interp *interp, + Tcl_ObjCmdProc *objProc, + ClientData clientData, int objc, + Tcl_Obj *const objv[]); +/* 589 */ +EXTERN unsigned Tcl_GetFSDeviceFromStat(const Tcl_StatBuf *statPtr); +/* 590 */ +EXTERN unsigned Tcl_GetFSInodeFromStat(const Tcl_StatBuf *statPtr); +/* 591 */ +EXTERN unsigned Tcl_GetModeFromStat(const Tcl_StatBuf *statPtr); +/* 592 */ +EXTERN int Tcl_GetLinkCountFromStat(const Tcl_StatBuf *statPtr); +/* 593 */ +EXTERN int Tcl_GetUserIdFromStat(const Tcl_StatBuf *statPtr); +/* 594 */ +EXTERN int Tcl_GetGroupIdFromStat(const Tcl_StatBuf *statPtr); +/* 595 */ +EXTERN int Tcl_GetDeviceTypeFromStat(const Tcl_StatBuf *statPtr); +/* 596 */ +EXTERN Tcl_WideInt Tcl_GetAccessTimeFromStat(const Tcl_StatBuf *statPtr); +/* 597 */ +EXTERN Tcl_WideInt Tcl_GetModificationTimeFromStat( + const Tcl_StatBuf *statPtr); +/* 598 */ +EXTERN Tcl_WideInt Tcl_GetChangeTimeFromStat(const Tcl_StatBuf *statPtr); +/* 599 */ +EXTERN Tcl_WideUInt Tcl_GetSizeFromStat(const Tcl_StatBuf *statPtr); +/* 600 */ +EXTERN Tcl_WideUInt Tcl_GetBlocksFromStat(const Tcl_StatBuf *statPtr); +/* 601 */ +EXTERN unsigned Tcl_GetBlockSizeFromStat(const Tcl_StatBuf *statPtr); +/* 602 */ +EXTERN int Tcl_SetEnsembleParameterList(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj *paramList); +/* 603 */ +EXTERN int Tcl_GetEnsembleParameterList(Tcl_Interp *interp, + Tcl_Command token, Tcl_Obj **paramListPtr); +/* 604 */ +EXTERN int Tcl_ParseArgsObjv(Tcl_Interp *interp, + const Tcl_ArgvInfo *argTable, int *objcPtr, + Tcl_Obj *const *objv, Tcl_Obj ***remObjv); +/* 605 */ +EXTERN int Tcl_GetErrorLine(Tcl_Interp *interp); +/* 606 */ +EXTERN void Tcl_SetErrorLine(Tcl_Interp *interp, int lineNum); +/* 607 */ +EXTERN void Tcl_TransferResult(Tcl_Interp *sourceInterp, + int result, Tcl_Interp *targetInterp); +/* 608 */ +EXTERN int Tcl_InterpActive(Tcl_Interp *interp); +/* 609 */ +EXTERN void Tcl_BackgroundException(Tcl_Interp *interp, int code); +/* 610 */ +EXTERN int Tcl_ZlibDeflate(Tcl_Interp *interp, int format, + Tcl_Obj *data, int level, + Tcl_Obj *gzipHeaderDictObj); +/* 611 */ +EXTERN int Tcl_ZlibInflate(Tcl_Interp *interp, int format, + Tcl_Obj *data, int buffersize, + Tcl_Obj *gzipHeaderDictObj); +/* 612 */ +EXTERN unsigned int Tcl_ZlibCRC32(unsigned int crc, + const unsigned char *buf, int len); +/* 613 */ +EXTERN unsigned int Tcl_ZlibAdler32(unsigned int adler, + const unsigned char *buf, int len); +/* 614 */ +EXTERN int Tcl_ZlibStreamInit(Tcl_Interp *interp, int mode, + int format, int level, Tcl_Obj *dictObj, + Tcl_ZlibStream *zshandle); +/* 615 */ +EXTERN Tcl_Obj * Tcl_ZlibStreamGetCommandName(Tcl_ZlibStream zshandle); +/* 616 */ +EXTERN int Tcl_ZlibStreamEof(Tcl_ZlibStream zshandle); +/* 617 */ +EXTERN int Tcl_ZlibStreamChecksum(Tcl_ZlibStream zshandle); +/* 618 */ +EXTERN int Tcl_ZlibStreamPut(Tcl_ZlibStream zshandle, + Tcl_Obj *data, int flush); +/* 619 */ +EXTERN int Tcl_ZlibStreamGet(Tcl_ZlibStream zshandle, + Tcl_Obj *data, int count); +/* 620 */ +EXTERN int Tcl_ZlibStreamClose(Tcl_ZlibStream zshandle); +/* 621 */ +EXTERN int Tcl_ZlibStreamReset(Tcl_ZlibStream zshandle); +/* 622 */ +EXTERN void Tcl_SetStartupScript(Tcl_Obj *path, + const char *encoding); +/* 623 */ +EXTERN Tcl_Obj * Tcl_GetStartupScript(const char **encodingPtr); +/* 624 */ +EXTERN int Tcl_CloseEx(Tcl_Interp *interp, Tcl_Channel chan, + int flags); +/* 625 */ +EXTERN int Tcl_NRExprObj(Tcl_Interp *interp, Tcl_Obj *objPtr, + Tcl_Obj *resultPtr); +/* 626 */ +EXTERN int Tcl_NRSubstObj(Tcl_Interp *interp, Tcl_Obj *objPtr, + int flags); +/* 627 */ +EXTERN int Tcl_LoadFile(Tcl_Interp *interp, Tcl_Obj *pathPtr, + const char *const symv[], int flags, + void *procPtrs, Tcl_LoadHandle *handlePtr); +/* 628 */ +EXTERN void * Tcl_FindSymbol(Tcl_Interp *interp, + Tcl_LoadHandle handle, const char *symbol); +/* 629 */ +EXTERN int Tcl_FSUnloadFile(Tcl_Interp *interp, + Tcl_LoadHandle handlePtr); +/* 630 */ +EXTERN void Tcl_ZlibStreamSetCompressionDictionary( + Tcl_ZlibStream zhandle, + Tcl_Obj *compressionDictionaryObj); + +typedef struct { + const struct TclPlatStubs *tclPlatStubs; + const struct TclIntStubs *tclIntStubs; + const struct TclIntPlatStubs *tclIntPlatStubs; +} TclStubHooks; + +typedef struct TclStubs { + int magic; + const TclStubHooks *hooks; + + int (*tcl_PkgProvideEx) (Tcl_Interp *interp, const char *name, const char *version, const void *clientData); /* 0 */ + CONST84_RETURN char * (*tcl_PkgRequireEx) (Tcl_Interp *interp, const char *name, const char *version, int exact, void *clientDataPtr); /* 1 */ + void (*tcl_Panic) (const char *format, ...) TCL_FORMAT_PRINTF(1, 2); /* 2 */ + char * (*tcl_Alloc) (unsigned int size); /* 3 */ + void (*tcl_Free) (char *ptr); /* 4 */ + char * (*tcl_Realloc) (char *ptr, unsigned int size); /* 5 */ + char * (*tcl_DbCkalloc) (unsigned int size, const char *file, int line); /* 6 */ + void (*tcl_DbCkfree) (char *ptr, const char *file, int line); /* 7 */ + char * (*tcl_DbCkrealloc) (char *ptr, unsigned int size, const char *file, int line); /* 8 */ +#if !defined(_WIN32) && !defined(MAC_OSX_TCL) /* UNIX */ + void (*tcl_CreateFileHandler) (int fd, int mask, Tcl_FileProc *proc, ClientData clientData); /* 9 */ +#endif /* UNIX */ +#if defined(_WIN32) /* WIN */ + void (*reserved9)(void); +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ + void (*tcl_CreateFileHandler) (int fd, int mask, Tcl_FileProc *proc, ClientData clientData); /* 9 */ +#endif /* MACOSX */ +#if !defined(_WIN32) && !defined(MAC_OSX_TCL) /* UNIX */ + void (*tcl_DeleteFileHandler) (int fd); /* 10 */ +#endif /* UNIX */ +#if defined(_WIN32) /* WIN */ + void (*reserved10)(void); +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ + void (*tcl_DeleteFileHandler) (int fd); /* 10 */ +#endif /* MACOSX */ + void (*tcl_SetTimer) (const Tcl_Time *timePtr); /* 11 */ + void (*tcl_Sleep) (int ms); /* 12 */ + int (*tcl_WaitForEvent) (const Tcl_Time *timePtr); /* 13 */ + int (*tcl_AppendAllObjTypes) (Tcl_Interp *interp, Tcl_Obj *objPtr); /* 14 */ + void (*tcl_AppendStringsToObj) (Tcl_Obj *objPtr, ...); /* 15 */ + void (*tcl_AppendToObj) (Tcl_Obj *objPtr, const char *bytes, int length); /* 16 */ + Tcl_Obj * (*tcl_ConcatObj) (int objc, Tcl_Obj *const objv[]); /* 17 */ + int (*tcl_ConvertToType) (Tcl_Interp *interp, Tcl_Obj *objPtr, const Tcl_ObjType *typePtr); /* 18 */ + void (*tcl_DbDecrRefCount) (Tcl_Obj *objPtr, const char *file, int line); /* 19 */ + void (*tcl_DbIncrRefCount) (Tcl_Obj *objPtr, const char *file, int line); /* 20 */ + int (*tcl_DbIsShared) (Tcl_Obj *objPtr, const char *file, int line); /* 21 */ + Tcl_Obj * (*tcl_DbNewBooleanObj) (int boolValue, const char *file, int line); /* 22 */ + Tcl_Obj * (*tcl_DbNewByteArrayObj) (const unsigned char *bytes, int length, const char *file, int line); /* 23 */ + Tcl_Obj * (*tcl_DbNewDoubleObj) (double doubleValue, const char *file, int line); /* 24 */ + Tcl_Obj * (*tcl_DbNewListObj) (int objc, Tcl_Obj *const *objv, const char *file, int line); /* 25 */ + Tcl_Obj * (*tcl_DbNewLongObj) (long longValue, const char *file, int line); /* 26 */ + Tcl_Obj * (*tcl_DbNewObj) (const char *file, int line); /* 27 */ + Tcl_Obj * (*tcl_DbNewStringObj) (const char *bytes, int length, const char *file, int line); /* 28 */ + Tcl_Obj * (*tcl_DuplicateObj) (Tcl_Obj *objPtr); /* 29 */ + void (*tclFreeObj) (Tcl_Obj *objPtr); /* 30 */ + int (*tcl_GetBoolean) (Tcl_Interp *interp, const char *src, int *boolPtr); /* 31 */ + int (*tcl_GetBooleanFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int *boolPtr); /* 32 */ + unsigned char * (*tcl_GetByteArrayFromObj) (Tcl_Obj *objPtr, int *lengthPtr); /* 33 */ + int (*tcl_GetDouble) (Tcl_Interp *interp, const char *src, double *doublePtr); /* 34 */ + int (*tcl_GetDoubleFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, double *doublePtr); /* 35 */ + int (*tcl_GetIndexFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, CONST84 char *const *tablePtr, const char *msg, int flags, int *indexPtr); /* 36 */ + int (*tcl_GetInt) (Tcl_Interp *interp, const char *src, int *intPtr); /* 37 */ + int (*tcl_GetIntFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int *intPtr); /* 38 */ + int (*tcl_GetLongFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, long *longPtr); /* 39 */ + CONST86 Tcl_ObjType * (*tcl_GetObjType) (const char *typeName); /* 40 */ + char * (*tcl_GetStringFromObj) (Tcl_Obj *objPtr, int *lengthPtr); /* 41 */ + void (*tcl_InvalidateStringRep) (Tcl_Obj *objPtr); /* 42 */ + int (*tcl_ListObjAppendList) (Tcl_Interp *interp, Tcl_Obj *listPtr, Tcl_Obj *elemListPtr); /* 43 */ + int (*tcl_ListObjAppendElement) (Tcl_Interp *interp, Tcl_Obj *listPtr, Tcl_Obj *objPtr); /* 44 */ + int (*tcl_ListObjGetElements) (Tcl_Interp *interp, Tcl_Obj *listPtr, int *objcPtr, Tcl_Obj ***objvPtr); /* 45 */ + int (*tcl_ListObjIndex) (Tcl_Interp *interp, Tcl_Obj *listPtr, int index, Tcl_Obj **objPtrPtr); /* 46 */ + int (*tcl_ListObjLength) (Tcl_Interp *interp, Tcl_Obj *listPtr, int *lengthPtr); /* 47 */ + int (*tcl_ListObjReplace) (Tcl_Interp *interp, Tcl_Obj *listPtr, int first, int count, int objc, Tcl_Obj *const objv[]); /* 48 */ + Tcl_Obj * (*tcl_NewBooleanObj) (int boolValue); /* 49 */ + Tcl_Obj * (*tcl_NewByteArrayObj) (const unsigned char *bytes, int length); /* 50 */ + Tcl_Obj * (*tcl_NewDoubleObj) (double doubleValue); /* 51 */ + Tcl_Obj * (*tcl_NewIntObj) (int intValue); /* 52 */ + Tcl_Obj * (*tcl_NewListObj) (int objc, Tcl_Obj *const objv[]); /* 53 */ + Tcl_Obj * (*tcl_NewLongObj) (long longValue); /* 54 */ + Tcl_Obj * (*tcl_NewObj) (void); /* 55 */ + Tcl_Obj * (*tcl_NewStringObj) (const char *bytes, int length); /* 56 */ + void (*tcl_SetBooleanObj) (Tcl_Obj *objPtr, int boolValue); /* 57 */ + unsigned char * (*tcl_SetByteArrayLength) (Tcl_Obj *objPtr, int length); /* 58 */ + void (*tcl_SetByteArrayObj) (Tcl_Obj *objPtr, const unsigned char *bytes, int length); /* 59 */ + void (*tcl_SetDoubleObj) (Tcl_Obj *objPtr, double doubleValue); /* 60 */ + void (*tcl_SetIntObj) (Tcl_Obj *objPtr, int intValue); /* 61 */ + void (*tcl_SetListObj) (Tcl_Obj *objPtr, int objc, Tcl_Obj *const objv[]); /* 62 */ + void (*tcl_SetLongObj) (Tcl_Obj *objPtr, long longValue); /* 63 */ + void (*tcl_SetObjLength) (Tcl_Obj *objPtr, int length); /* 64 */ + void (*tcl_SetStringObj) (Tcl_Obj *objPtr, const char *bytes, int length); /* 65 */ + void (*tcl_AddErrorInfo) (Tcl_Interp *interp, const char *message); /* 66 */ + void (*tcl_AddObjErrorInfo) (Tcl_Interp *interp, const char *message, int length); /* 67 */ + void (*tcl_AllowExceptions) (Tcl_Interp *interp); /* 68 */ + void (*tcl_AppendElement) (Tcl_Interp *interp, const char *element); /* 69 */ + void (*tcl_AppendResult) (Tcl_Interp *interp, ...); /* 70 */ + Tcl_AsyncHandler (*tcl_AsyncCreate) (Tcl_AsyncProc *proc, ClientData clientData); /* 71 */ + void (*tcl_AsyncDelete) (Tcl_AsyncHandler async); /* 72 */ + int (*tcl_AsyncInvoke) (Tcl_Interp *interp, int code); /* 73 */ + void (*tcl_AsyncMark) (Tcl_AsyncHandler async); /* 74 */ + int (*tcl_AsyncReady) (void); /* 75 */ + void (*tcl_BackgroundError) (Tcl_Interp *interp); /* 76 */ + char (*tcl_Backslash) (const char *src, int *readPtr); /* 77 */ + int (*tcl_BadChannelOption) (Tcl_Interp *interp, const char *optionName, const char *optionList); /* 78 */ + void (*tcl_CallWhenDeleted) (Tcl_Interp *interp, Tcl_InterpDeleteProc *proc, ClientData clientData); /* 79 */ + void (*tcl_CancelIdleCall) (Tcl_IdleProc *idleProc, ClientData clientData); /* 80 */ + int (*tcl_Close) (Tcl_Interp *interp, Tcl_Channel chan); /* 81 */ + int (*tcl_CommandComplete) (const char *cmd); /* 82 */ + char * (*tcl_Concat) (int argc, CONST84 char *const *argv); /* 83 */ + int (*tcl_ConvertElement) (const char *src, char *dst, int flags); /* 84 */ + int (*tcl_ConvertCountedElement) (const char *src, int length, char *dst, int flags); /* 85 */ + int (*tcl_CreateAlias) (Tcl_Interp *slave, const char *slaveCmd, Tcl_Interp *target, const char *targetCmd, int argc, CONST84 char *const *argv); /* 86 */ + int (*tcl_CreateAliasObj) (Tcl_Interp *slave, const char *slaveCmd, Tcl_Interp *target, const char *targetCmd, int objc, Tcl_Obj *const objv[]); /* 87 */ + Tcl_Channel (*tcl_CreateChannel) (const Tcl_ChannelType *typePtr, const char *chanName, ClientData instanceData, int mask); /* 88 */ + void (*tcl_CreateChannelHandler) (Tcl_Channel chan, int mask, Tcl_ChannelProc *proc, ClientData clientData); /* 89 */ + void (*tcl_CreateCloseHandler) (Tcl_Channel chan, Tcl_CloseProc *proc, ClientData clientData); /* 90 */ + Tcl_Command (*tcl_CreateCommand) (Tcl_Interp *interp, const char *cmdName, Tcl_CmdProc *proc, ClientData clientData, Tcl_CmdDeleteProc *deleteProc); /* 91 */ + void (*tcl_CreateEventSource) (Tcl_EventSetupProc *setupProc, Tcl_EventCheckProc *checkProc, ClientData clientData); /* 92 */ + void (*tcl_CreateExitHandler) (Tcl_ExitProc *proc, ClientData clientData); /* 93 */ + Tcl_Interp * (*tcl_CreateInterp) (void); /* 94 */ + void (*tcl_CreateMathFunc) (Tcl_Interp *interp, const char *name, int numArgs, Tcl_ValueType *argTypes, Tcl_MathProc *proc, ClientData clientData); /* 95 */ + Tcl_Command (*tcl_CreateObjCommand) (Tcl_Interp *interp, const char *cmdName, Tcl_ObjCmdProc *proc, ClientData clientData, Tcl_CmdDeleteProc *deleteProc); /* 96 */ + Tcl_Interp * (*tcl_CreateSlave) (Tcl_Interp *interp, const char *slaveName, int isSafe); /* 97 */ + Tcl_TimerToken (*tcl_CreateTimerHandler) (int milliseconds, Tcl_TimerProc *proc, ClientData clientData); /* 98 */ + Tcl_Trace (*tcl_CreateTrace) (Tcl_Interp *interp, int level, Tcl_CmdTraceProc *proc, ClientData clientData); /* 99 */ + void (*tcl_DeleteAssocData) (Tcl_Interp *interp, const char *name); /* 100 */ + void (*tcl_DeleteChannelHandler) (Tcl_Channel chan, Tcl_ChannelProc *proc, ClientData clientData); /* 101 */ + void (*tcl_DeleteCloseHandler) (Tcl_Channel chan, Tcl_CloseProc *proc, ClientData clientData); /* 102 */ + int (*tcl_DeleteCommand) (Tcl_Interp *interp, const char *cmdName); /* 103 */ + int (*tcl_DeleteCommandFromToken) (Tcl_Interp *interp, Tcl_Command command); /* 104 */ + void (*tcl_DeleteEvents) (Tcl_EventDeleteProc *proc, ClientData clientData); /* 105 */ + void (*tcl_DeleteEventSource) (Tcl_EventSetupProc *setupProc, Tcl_EventCheckProc *checkProc, ClientData clientData); /* 106 */ + void (*tcl_DeleteExitHandler) (Tcl_ExitProc *proc, ClientData clientData); /* 107 */ + void (*tcl_DeleteHashEntry) (Tcl_HashEntry *entryPtr); /* 108 */ + void (*tcl_DeleteHashTable) (Tcl_HashTable *tablePtr); /* 109 */ + void (*tcl_DeleteInterp) (Tcl_Interp *interp); /* 110 */ + void (*tcl_DetachPids) (int numPids, Tcl_Pid *pidPtr); /* 111 */ + void (*tcl_DeleteTimerHandler) (Tcl_TimerToken token); /* 112 */ + void (*tcl_DeleteTrace) (Tcl_Interp *interp, Tcl_Trace trace); /* 113 */ + void (*tcl_DontCallWhenDeleted) (Tcl_Interp *interp, Tcl_InterpDeleteProc *proc, ClientData clientData); /* 114 */ + int (*tcl_DoOneEvent) (int flags); /* 115 */ + void (*tcl_DoWhenIdle) (Tcl_IdleProc *proc, ClientData clientData); /* 116 */ + char * (*tcl_DStringAppend) (Tcl_DString *dsPtr, const char *bytes, int length); /* 117 */ + char * (*tcl_DStringAppendElement) (Tcl_DString *dsPtr, const char *element); /* 118 */ + void (*tcl_DStringEndSublist) (Tcl_DString *dsPtr); /* 119 */ + void (*tcl_DStringFree) (Tcl_DString *dsPtr); /* 120 */ + void (*tcl_DStringGetResult) (Tcl_Interp *interp, Tcl_DString *dsPtr); /* 121 */ + void (*tcl_DStringInit) (Tcl_DString *dsPtr); /* 122 */ + void (*tcl_DStringResult) (Tcl_Interp *interp, Tcl_DString *dsPtr); /* 123 */ + void (*tcl_DStringSetLength) (Tcl_DString *dsPtr, int length); /* 124 */ + void (*tcl_DStringStartSublist) (Tcl_DString *dsPtr); /* 125 */ + int (*tcl_Eof) (Tcl_Channel chan); /* 126 */ + CONST84_RETURN char * (*tcl_ErrnoId) (void); /* 127 */ + CONST84_RETURN char * (*tcl_ErrnoMsg) (int err); /* 128 */ + int (*tcl_Eval) (Tcl_Interp *interp, const char *script); /* 129 */ + int (*tcl_EvalFile) (Tcl_Interp *interp, const char *fileName); /* 130 */ + int (*tcl_EvalObj) (Tcl_Interp *interp, Tcl_Obj *objPtr); /* 131 */ + void (*tcl_EventuallyFree) (ClientData clientData, Tcl_FreeProc *freeProc); /* 132 */ + void (*tcl_Exit) (int status); /* 133 */ + int (*tcl_ExposeCommand) (Tcl_Interp *interp, const char *hiddenCmdToken, const char *cmdName); /* 134 */ + int (*tcl_ExprBoolean) (Tcl_Interp *interp, const char *expr, int *ptr); /* 135 */ + int (*tcl_ExprBooleanObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int *ptr); /* 136 */ + int (*tcl_ExprDouble) (Tcl_Interp *interp, const char *expr, double *ptr); /* 137 */ + int (*tcl_ExprDoubleObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, double *ptr); /* 138 */ + int (*tcl_ExprLong) (Tcl_Interp *interp, const char *expr, long *ptr); /* 139 */ + int (*tcl_ExprLongObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, long *ptr); /* 140 */ + int (*tcl_ExprObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Obj **resultPtrPtr); /* 141 */ + int (*tcl_ExprString) (Tcl_Interp *interp, const char *expr); /* 142 */ + void (*tcl_Finalize) (void); /* 143 */ + void (*tcl_FindExecutable) (const char *argv0); /* 144 */ + Tcl_HashEntry * (*tcl_FirstHashEntry) (Tcl_HashTable *tablePtr, Tcl_HashSearch *searchPtr); /* 145 */ + int (*tcl_Flush) (Tcl_Channel chan); /* 146 */ + void (*tcl_FreeResult) (Tcl_Interp *interp); /* 147 */ + int (*tcl_GetAlias) (Tcl_Interp *interp, const char *slaveCmd, Tcl_Interp **targetInterpPtr, CONST84 char **targetCmdPtr, int *argcPtr, CONST84 char ***argvPtr); /* 148 */ + int (*tcl_GetAliasObj) (Tcl_Interp *interp, const char *slaveCmd, Tcl_Interp **targetInterpPtr, CONST84 char **targetCmdPtr, int *objcPtr, Tcl_Obj ***objv); /* 149 */ + ClientData (*tcl_GetAssocData) (Tcl_Interp *interp, const char *name, Tcl_InterpDeleteProc **procPtr); /* 150 */ + Tcl_Channel (*tcl_GetChannel) (Tcl_Interp *interp, const char *chanName, int *modePtr); /* 151 */ + int (*tcl_GetChannelBufferSize) (Tcl_Channel chan); /* 152 */ + int (*tcl_GetChannelHandle) (Tcl_Channel chan, int direction, ClientData *handlePtr); /* 153 */ + ClientData (*tcl_GetChannelInstanceData) (Tcl_Channel chan); /* 154 */ + int (*tcl_GetChannelMode) (Tcl_Channel chan); /* 155 */ + CONST84_RETURN char * (*tcl_GetChannelName) (Tcl_Channel chan); /* 156 */ + int (*tcl_GetChannelOption) (Tcl_Interp *interp, Tcl_Channel chan, const char *optionName, Tcl_DString *dsPtr); /* 157 */ + CONST86 Tcl_ChannelType * (*tcl_GetChannelType) (Tcl_Channel chan); /* 158 */ + int (*tcl_GetCommandInfo) (Tcl_Interp *interp, const char *cmdName, Tcl_CmdInfo *infoPtr); /* 159 */ + CONST84_RETURN char * (*tcl_GetCommandName) (Tcl_Interp *interp, Tcl_Command command); /* 160 */ + int (*tcl_GetErrno) (void); /* 161 */ + CONST84_RETURN char * (*tcl_GetHostName) (void); /* 162 */ + int (*tcl_GetInterpPath) (Tcl_Interp *askInterp, Tcl_Interp *slaveInterp); /* 163 */ + Tcl_Interp * (*tcl_GetMaster) (Tcl_Interp *interp); /* 164 */ + const char * (*tcl_GetNameOfExecutable) (void); /* 165 */ + Tcl_Obj * (*tcl_GetObjResult) (Tcl_Interp *interp); /* 166 */ +#if !defined(_WIN32) && !defined(MAC_OSX_TCL) /* UNIX */ + int (*tcl_GetOpenFile) (Tcl_Interp *interp, const char *chanID, int forWriting, int checkUsage, ClientData *filePtr); /* 167 */ +#endif /* UNIX */ +#if defined(_WIN32) /* WIN */ + void (*reserved167)(void); +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ + int (*tcl_GetOpenFile) (Tcl_Interp *interp, const char *chanID, int forWriting, int checkUsage, ClientData *filePtr); /* 167 */ +#endif /* MACOSX */ + Tcl_PathType (*tcl_GetPathType) (const char *path); /* 168 */ + int (*tcl_Gets) (Tcl_Channel chan, Tcl_DString *dsPtr); /* 169 */ + int (*tcl_GetsObj) (Tcl_Channel chan, Tcl_Obj *objPtr); /* 170 */ + int (*tcl_GetServiceMode) (void); /* 171 */ + Tcl_Interp * (*tcl_GetSlave) (Tcl_Interp *interp, const char *slaveName); /* 172 */ + Tcl_Channel (*tcl_GetStdChannel) (int type); /* 173 */ + CONST84_RETURN char * (*tcl_GetStringResult) (Tcl_Interp *interp); /* 174 */ + CONST84_RETURN char * (*tcl_GetVar) (Tcl_Interp *interp, const char *varName, int flags); /* 175 */ + CONST84_RETURN char * (*tcl_GetVar2) (Tcl_Interp *interp, const char *part1, const char *part2, int flags); /* 176 */ + int (*tcl_GlobalEval) (Tcl_Interp *interp, const char *command); /* 177 */ + int (*tcl_GlobalEvalObj) (Tcl_Interp *interp, Tcl_Obj *objPtr); /* 178 */ + int (*tcl_HideCommand) (Tcl_Interp *interp, const char *cmdName, const char *hiddenCmdToken); /* 179 */ + int (*tcl_Init) (Tcl_Interp *interp); /* 180 */ + void (*tcl_InitHashTable) (Tcl_HashTable *tablePtr, int keyType); /* 181 */ + int (*tcl_InputBlocked) (Tcl_Channel chan); /* 182 */ + int (*tcl_InputBuffered) (Tcl_Channel chan); /* 183 */ + int (*tcl_InterpDeleted) (Tcl_Interp *interp); /* 184 */ + int (*tcl_IsSafe) (Tcl_Interp *interp); /* 185 */ + char * (*tcl_JoinPath) (int argc, CONST84 char *const *argv, Tcl_DString *resultPtr); /* 186 */ + int (*tcl_LinkVar) (Tcl_Interp *interp, const char *varName, char *addr, int type); /* 187 */ + void (*reserved188)(void); + Tcl_Channel (*tcl_MakeFileChannel) (ClientData handle, int mode); /* 189 */ + int (*tcl_MakeSafe) (Tcl_Interp *interp); /* 190 */ + Tcl_Channel (*tcl_MakeTcpClientChannel) (ClientData tcpSocket); /* 191 */ + char * (*tcl_Merge) (int argc, CONST84 char *const *argv); /* 192 */ + Tcl_HashEntry * (*tcl_NextHashEntry) (Tcl_HashSearch *searchPtr); /* 193 */ + void (*tcl_NotifyChannel) (Tcl_Channel channel, int mask); /* 194 */ + Tcl_Obj * (*tcl_ObjGetVar2) (Tcl_Interp *interp, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, int flags); /* 195 */ + Tcl_Obj * (*tcl_ObjSetVar2) (Tcl_Interp *interp, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, Tcl_Obj *newValuePtr, int flags); /* 196 */ + Tcl_Channel (*tcl_OpenCommandChannel) (Tcl_Interp *interp, int argc, CONST84 char **argv, int flags); /* 197 */ + Tcl_Channel (*tcl_OpenFileChannel) (Tcl_Interp *interp, const char *fileName, const char *modeString, int permissions); /* 198 */ + Tcl_Channel (*tcl_OpenTcpClient) (Tcl_Interp *interp, int port, const char *address, const char *myaddr, int myport, int async); /* 199 */ + Tcl_Channel (*tcl_OpenTcpServer) (Tcl_Interp *interp, int port, const char *host, Tcl_TcpAcceptProc *acceptProc, ClientData callbackData); /* 200 */ + void (*tcl_Preserve) (ClientData data); /* 201 */ + void (*tcl_PrintDouble) (Tcl_Interp *interp, double value, char *dst); /* 202 */ + int (*tcl_PutEnv) (const char *assignment); /* 203 */ + CONST84_RETURN char * (*tcl_PosixError) (Tcl_Interp *interp); /* 204 */ + void (*tcl_QueueEvent) (Tcl_Event *evPtr, Tcl_QueuePosition position); /* 205 */ + int (*tcl_Read) (Tcl_Channel chan, char *bufPtr, int toRead); /* 206 */ + void (*tcl_ReapDetachedProcs) (void); /* 207 */ + int (*tcl_RecordAndEval) (Tcl_Interp *interp, const char *cmd, int flags); /* 208 */ + int (*tcl_RecordAndEvalObj) (Tcl_Interp *interp, Tcl_Obj *cmdPtr, int flags); /* 209 */ + void (*tcl_RegisterChannel) (Tcl_Interp *interp, Tcl_Channel chan); /* 210 */ + void (*tcl_RegisterObjType) (const Tcl_ObjType *typePtr); /* 211 */ + Tcl_RegExp (*tcl_RegExpCompile) (Tcl_Interp *interp, const char *pattern); /* 212 */ + int (*tcl_RegExpExec) (Tcl_Interp *interp, Tcl_RegExp regexp, const char *text, const char *start); /* 213 */ + int (*tcl_RegExpMatch) (Tcl_Interp *interp, const char *text, const char *pattern); /* 214 */ + void (*tcl_RegExpRange) (Tcl_RegExp regexp, int index, CONST84 char **startPtr, CONST84 char **endPtr); /* 215 */ + void (*tcl_Release) (ClientData clientData); /* 216 */ + void (*tcl_ResetResult) (Tcl_Interp *interp); /* 217 */ + int (*tcl_ScanElement) (const char *src, int *flagPtr); /* 218 */ + int (*tcl_ScanCountedElement) (const char *src, int length, int *flagPtr); /* 219 */ + int (*tcl_SeekOld) (Tcl_Channel chan, int offset, int mode); /* 220 */ + int (*tcl_ServiceAll) (void); /* 221 */ + int (*tcl_ServiceEvent) (int flags); /* 222 */ + void (*tcl_SetAssocData) (Tcl_Interp *interp, const char *name, Tcl_InterpDeleteProc *proc, ClientData clientData); /* 223 */ + void (*tcl_SetChannelBufferSize) (Tcl_Channel chan, int sz); /* 224 */ + int (*tcl_SetChannelOption) (Tcl_Interp *interp, Tcl_Channel chan, const char *optionName, const char *newValue); /* 225 */ + int (*tcl_SetCommandInfo) (Tcl_Interp *interp, const char *cmdName, const Tcl_CmdInfo *infoPtr); /* 226 */ + void (*tcl_SetErrno) (int err); /* 227 */ + void (*tcl_SetErrorCode) (Tcl_Interp *interp, ...); /* 228 */ + void (*tcl_SetMaxBlockTime) (const Tcl_Time *timePtr); /* 229 */ + void (*tcl_SetPanicProc) (Tcl_PanicProc *panicProc); /* 230 */ + int (*tcl_SetRecursionLimit) (Tcl_Interp *interp, int depth); /* 231 */ + void (*tcl_SetResult) (Tcl_Interp *interp, char *result, Tcl_FreeProc *freeProc); /* 232 */ + int (*tcl_SetServiceMode) (int mode); /* 233 */ + void (*tcl_SetObjErrorCode) (Tcl_Interp *interp, Tcl_Obj *errorObjPtr); /* 234 */ + void (*tcl_SetObjResult) (Tcl_Interp *interp, Tcl_Obj *resultObjPtr); /* 235 */ + void (*tcl_SetStdChannel) (Tcl_Channel channel, int type); /* 236 */ + CONST84_RETURN char * (*tcl_SetVar) (Tcl_Interp *interp, const char *varName, const char *newValue, int flags); /* 237 */ + CONST84_RETURN char * (*tcl_SetVar2) (Tcl_Interp *interp, const char *part1, const char *part2, const char *newValue, int flags); /* 238 */ + CONST84_RETURN char * (*tcl_SignalId) (int sig); /* 239 */ + CONST84_RETURN char * (*tcl_SignalMsg) (int sig); /* 240 */ + void (*tcl_SourceRCFile) (Tcl_Interp *interp); /* 241 */ + int (*tcl_SplitList) (Tcl_Interp *interp, const char *listStr, int *argcPtr, CONST84 char ***argvPtr); /* 242 */ + void (*tcl_SplitPath) (const char *path, int *argcPtr, CONST84 char ***argvPtr); /* 243 */ + void (*tcl_StaticPackage) (Tcl_Interp *interp, const char *pkgName, Tcl_PackageInitProc *initProc, Tcl_PackageInitProc *safeInitProc); /* 244 */ + int (*tcl_StringMatch) (const char *str, const char *pattern); /* 245 */ + int (*tcl_TellOld) (Tcl_Channel chan); /* 246 */ + int (*tcl_TraceVar) (Tcl_Interp *interp, const char *varName, int flags, Tcl_VarTraceProc *proc, ClientData clientData); /* 247 */ + int (*tcl_TraceVar2) (Tcl_Interp *interp, const char *part1, const char *part2, int flags, Tcl_VarTraceProc *proc, ClientData clientData); /* 248 */ + char * (*tcl_TranslateFileName) (Tcl_Interp *interp, const char *name, Tcl_DString *bufferPtr); /* 249 */ + int (*tcl_Ungets) (Tcl_Channel chan, const char *str, int len, int atHead); /* 250 */ + void (*tcl_UnlinkVar) (Tcl_Interp *interp, const char *varName); /* 251 */ + int (*tcl_UnregisterChannel) (Tcl_Interp *interp, Tcl_Channel chan); /* 252 */ + int (*tcl_UnsetVar) (Tcl_Interp *interp, const char *varName, int flags); /* 253 */ + int (*tcl_UnsetVar2) (Tcl_Interp *interp, const char *part1, const char *part2, int flags); /* 254 */ + void (*tcl_UntraceVar) (Tcl_Interp *interp, const char *varName, int flags, Tcl_VarTraceProc *proc, ClientData clientData); /* 255 */ + void (*tcl_UntraceVar2) (Tcl_Interp *interp, const char *part1, const char *part2, int flags, Tcl_VarTraceProc *proc, ClientData clientData); /* 256 */ + void (*tcl_UpdateLinkedVar) (Tcl_Interp *interp, const char *varName); /* 257 */ + int (*tcl_UpVar) (Tcl_Interp *interp, const char *frameName, const char *varName, const char *localName, int flags); /* 258 */ + int (*tcl_UpVar2) (Tcl_Interp *interp, const char *frameName, const char *part1, const char *part2, const char *localName, int flags); /* 259 */ + int (*tcl_VarEval) (Tcl_Interp *interp, ...); /* 260 */ + ClientData (*tcl_VarTraceInfo) (Tcl_Interp *interp, const char *varName, int flags, Tcl_VarTraceProc *procPtr, ClientData prevClientData); /* 261 */ + ClientData (*tcl_VarTraceInfo2) (Tcl_Interp *interp, const char *part1, const char *part2, int flags, Tcl_VarTraceProc *procPtr, ClientData prevClientData); /* 262 */ + int (*tcl_Write) (Tcl_Channel chan, const char *s, int slen); /* 263 */ + void (*tcl_WrongNumArgs) (Tcl_Interp *interp, int objc, Tcl_Obj *const objv[], const char *message); /* 264 */ + int (*tcl_DumpActiveMemory) (const char *fileName); /* 265 */ + void (*tcl_ValidateAllMemory) (const char *file, int line); /* 266 */ + void (*tcl_AppendResultVA) (Tcl_Interp *interp, va_list argList); /* 267 */ + void (*tcl_AppendStringsToObjVA) (Tcl_Obj *objPtr, va_list argList); /* 268 */ + char * (*tcl_HashStats) (Tcl_HashTable *tablePtr); /* 269 */ + CONST84_RETURN char * (*tcl_ParseVar) (Tcl_Interp *interp, const char *start, CONST84 char **termPtr); /* 270 */ + CONST84_RETURN char * (*tcl_PkgPresent) (Tcl_Interp *interp, const char *name, const char *version, int exact); /* 271 */ + CONST84_RETURN char * (*tcl_PkgPresentEx) (Tcl_Interp *interp, const char *name, const char *version, int exact, void *clientDataPtr); /* 272 */ + int (*tcl_PkgProvide) (Tcl_Interp *interp, const char *name, const char *version); /* 273 */ + CONST84_RETURN char * (*tcl_PkgRequire) (Tcl_Interp *interp, const char *name, const char *version, int exact); /* 274 */ + void (*tcl_SetErrorCodeVA) (Tcl_Interp *interp, va_list argList); /* 275 */ + int (*tcl_VarEvalVA) (Tcl_Interp *interp, va_list argList); /* 276 */ + Tcl_Pid (*tcl_WaitPid) (Tcl_Pid pid, int *statPtr, int options); /* 277 */ + void (*tcl_PanicVA) (const char *format, va_list argList); /* 278 */ + void (*tcl_GetVersion) (int *major, int *minor, int *patchLevel, int *type); /* 279 */ + void (*tcl_InitMemory) (Tcl_Interp *interp); /* 280 */ + Tcl_Channel (*tcl_StackChannel) (Tcl_Interp *interp, const Tcl_ChannelType *typePtr, ClientData instanceData, int mask, Tcl_Channel prevChan); /* 281 */ + int (*tcl_UnstackChannel) (Tcl_Interp *interp, Tcl_Channel chan); /* 282 */ + Tcl_Channel (*tcl_GetStackedChannel) (Tcl_Channel chan); /* 283 */ + void (*tcl_SetMainLoop) (Tcl_MainLoopProc *proc); /* 284 */ + void (*reserved285)(void); + void (*tcl_AppendObjToObj) (Tcl_Obj *objPtr, Tcl_Obj *appendObjPtr); /* 286 */ + Tcl_Encoding (*tcl_CreateEncoding) (const Tcl_EncodingType *typePtr); /* 287 */ + void (*tcl_CreateThreadExitHandler) (Tcl_ExitProc *proc, ClientData clientData); /* 288 */ + void (*tcl_DeleteThreadExitHandler) (Tcl_ExitProc *proc, ClientData clientData); /* 289 */ + void (*tcl_DiscardResult) (Tcl_SavedResult *statePtr); /* 290 */ + int (*tcl_EvalEx) (Tcl_Interp *interp, const char *script, int numBytes, int flags); /* 291 */ + int (*tcl_EvalObjv) (Tcl_Interp *interp, int objc, Tcl_Obj *const objv[], int flags); /* 292 */ + int (*tcl_EvalObjEx) (Tcl_Interp *interp, Tcl_Obj *objPtr, int flags); /* 293 */ + void (*tcl_ExitThread) (int status); /* 294 */ + int (*tcl_ExternalToUtf) (Tcl_Interp *interp, Tcl_Encoding encoding, const char *src, int srcLen, int flags, Tcl_EncodingState *statePtr, char *dst, int dstLen, int *srcReadPtr, int *dstWrotePtr, int *dstCharsPtr); /* 295 */ + char * (*tcl_ExternalToUtfDString) (Tcl_Encoding encoding, const char *src, int srcLen, Tcl_DString *dsPtr); /* 296 */ + void (*tcl_FinalizeThread) (void); /* 297 */ + void (*tcl_FinalizeNotifier) (ClientData clientData); /* 298 */ + void (*tcl_FreeEncoding) (Tcl_Encoding encoding); /* 299 */ + Tcl_ThreadId (*tcl_GetCurrentThread) (void); /* 300 */ + Tcl_Encoding (*tcl_GetEncoding) (Tcl_Interp *interp, const char *name); /* 301 */ + CONST84_RETURN char * (*tcl_GetEncodingName) (Tcl_Encoding encoding); /* 302 */ + void (*tcl_GetEncodingNames) (Tcl_Interp *interp); /* 303 */ + int (*tcl_GetIndexFromObjStruct) (Tcl_Interp *interp, Tcl_Obj *objPtr, const void *tablePtr, int offset, const char *msg, int flags, int *indexPtr); /* 304 */ + void * (*tcl_GetThreadData) (Tcl_ThreadDataKey *keyPtr, int size); /* 305 */ + Tcl_Obj * (*tcl_GetVar2Ex) (Tcl_Interp *interp, const char *part1, const char *part2, int flags); /* 306 */ + ClientData (*tcl_InitNotifier) (void); /* 307 */ + void (*tcl_MutexLock) (Tcl_Mutex *mutexPtr); /* 308 */ + void (*tcl_MutexUnlock) (Tcl_Mutex *mutexPtr); /* 309 */ + void (*tcl_ConditionNotify) (Tcl_Condition *condPtr); /* 310 */ + void (*tcl_ConditionWait) (Tcl_Condition *condPtr, Tcl_Mutex *mutexPtr, const Tcl_Time *timePtr); /* 311 */ + int (*tcl_NumUtfChars) (const char *src, int length); /* 312 */ + int (*tcl_ReadChars) (Tcl_Channel channel, Tcl_Obj *objPtr, int charsToRead, int appendFlag); /* 313 */ + void (*tcl_RestoreResult) (Tcl_Interp *interp, Tcl_SavedResult *statePtr); /* 314 */ + void (*tcl_SaveResult) (Tcl_Interp *interp, Tcl_SavedResult *statePtr); /* 315 */ + int (*tcl_SetSystemEncoding) (Tcl_Interp *interp, const char *name); /* 316 */ + Tcl_Obj * (*tcl_SetVar2Ex) (Tcl_Interp *interp, const char *part1, const char *part2, Tcl_Obj *newValuePtr, int flags); /* 317 */ + void (*tcl_ThreadAlert) (Tcl_ThreadId threadId); /* 318 */ + void (*tcl_ThreadQueueEvent) (Tcl_ThreadId threadId, Tcl_Event *evPtr, Tcl_QueuePosition position); /* 319 */ + Tcl_UniChar (*tcl_UniCharAtIndex) (const char *src, int index); /* 320 */ + Tcl_UniChar (*tcl_UniCharToLower) (int ch); /* 321 */ + Tcl_UniChar (*tcl_UniCharToTitle) (int ch); /* 322 */ + Tcl_UniChar (*tcl_UniCharToUpper) (int ch); /* 323 */ + int (*tcl_UniCharToUtf) (int ch, char *buf); /* 324 */ + CONST84_RETURN char * (*tcl_UtfAtIndex) (const char *src, int index); /* 325 */ + int (*tcl_UtfCharComplete) (const char *src, int length); /* 326 */ + int (*tcl_UtfBackslash) (const char *src, int *readPtr, char *dst); /* 327 */ + CONST84_RETURN char * (*tcl_UtfFindFirst) (const char *src, int ch); /* 328 */ + CONST84_RETURN char * (*tcl_UtfFindLast) (const char *src, int ch); /* 329 */ + CONST84_RETURN char * (*tcl_UtfNext) (const char *src); /* 330 */ + CONST84_RETURN char * (*tcl_UtfPrev) (const char *src, const char *start); /* 331 */ + int (*tcl_UtfToExternal) (Tcl_Interp *interp, Tcl_Encoding encoding, const char *src, int srcLen, int flags, Tcl_EncodingState *statePtr, char *dst, int dstLen, int *srcReadPtr, int *dstWrotePtr, int *dstCharsPtr); /* 332 */ + char * (*tcl_UtfToExternalDString) (Tcl_Encoding encoding, const char *src, int srcLen, Tcl_DString *dsPtr); /* 333 */ + int (*tcl_UtfToLower) (char *src); /* 334 */ + int (*tcl_UtfToTitle) (char *src); /* 335 */ + int (*tcl_UtfToUniChar) (const char *src, Tcl_UniChar *chPtr); /* 336 */ + int (*tcl_UtfToUpper) (char *src); /* 337 */ + int (*tcl_WriteChars) (Tcl_Channel chan, const char *src, int srcLen); /* 338 */ + int (*tcl_WriteObj) (Tcl_Channel chan, Tcl_Obj *objPtr); /* 339 */ + char * (*tcl_GetString) (Tcl_Obj *objPtr); /* 340 */ + CONST84_RETURN char * (*tcl_GetDefaultEncodingDir) (void); /* 341 */ + void (*tcl_SetDefaultEncodingDir) (const char *path); /* 342 */ + void (*tcl_AlertNotifier) (ClientData clientData); /* 343 */ + void (*tcl_ServiceModeHook) (int mode); /* 344 */ + int (*tcl_UniCharIsAlnum) (int ch); /* 345 */ + int (*tcl_UniCharIsAlpha) (int ch); /* 346 */ + int (*tcl_UniCharIsDigit) (int ch); /* 347 */ + int (*tcl_UniCharIsLower) (int ch); /* 348 */ + int (*tcl_UniCharIsSpace) (int ch); /* 349 */ + int (*tcl_UniCharIsUpper) (int ch); /* 350 */ + int (*tcl_UniCharIsWordChar) (int ch); /* 351 */ + int (*tcl_UniCharLen) (const Tcl_UniChar *uniStr); /* 352 */ + int (*tcl_UniCharNcmp) (const Tcl_UniChar *ucs, const Tcl_UniChar *uct, unsigned long numChars); /* 353 */ + char * (*tcl_UniCharToUtfDString) (const Tcl_UniChar *uniStr, int uniLength, Tcl_DString *dsPtr); /* 354 */ + Tcl_UniChar * (*tcl_UtfToUniCharDString) (const char *src, int length, Tcl_DString *dsPtr); /* 355 */ + Tcl_RegExp (*tcl_GetRegExpFromObj) (Tcl_Interp *interp, Tcl_Obj *patObj, int flags); /* 356 */ + Tcl_Obj * (*tcl_EvalTokens) (Tcl_Interp *interp, Tcl_Token *tokenPtr, int count); /* 357 */ + void (*tcl_FreeParse) (Tcl_Parse *parsePtr); /* 358 */ + void (*tcl_LogCommandInfo) (Tcl_Interp *interp, const char *script, const char *command, int length); /* 359 */ + int (*tcl_ParseBraces) (Tcl_Interp *interp, const char *start, int numBytes, Tcl_Parse *parsePtr, int append, CONST84 char **termPtr); /* 360 */ + int (*tcl_ParseCommand) (Tcl_Interp *interp, const char *start, int numBytes, int nested, Tcl_Parse *parsePtr); /* 361 */ + int (*tcl_ParseExpr) (Tcl_Interp *interp, const char *start, int numBytes, Tcl_Parse *parsePtr); /* 362 */ + int (*tcl_ParseQuotedString) (Tcl_Interp *interp, const char *start, int numBytes, Tcl_Parse *parsePtr, int append, CONST84 char **termPtr); /* 363 */ + int (*tcl_ParseVarName) (Tcl_Interp *interp, const char *start, int numBytes, Tcl_Parse *parsePtr, int append); /* 364 */ + char * (*tcl_GetCwd) (Tcl_Interp *interp, Tcl_DString *cwdPtr); /* 365 */ + int (*tcl_Chdir) (const char *dirName); /* 366 */ + int (*tcl_Access) (const char *path, int mode); /* 367 */ + int (*tcl_Stat) (const char *path, struct stat *bufPtr); /* 368 */ + int (*tcl_UtfNcmp) (const char *s1, const char *s2, unsigned long n); /* 369 */ + int (*tcl_UtfNcasecmp) (const char *s1, const char *s2, unsigned long n); /* 370 */ + int (*tcl_StringCaseMatch) (const char *str, const char *pattern, int nocase); /* 371 */ + int (*tcl_UniCharIsControl) (int ch); /* 372 */ + int (*tcl_UniCharIsGraph) (int ch); /* 373 */ + int (*tcl_UniCharIsPrint) (int ch); /* 374 */ + int (*tcl_UniCharIsPunct) (int ch); /* 375 */ + int (*tcl_RegExpExecObj) (Tcl_Interp *interp, Tcl_RegExp regexp, Tcl_Obj *textObj, int offset, int nmatches, int flags); /* 376 */ + void (*tcl_RegExpGetInfo) (Tcl_RegExp regexp, Tcl_RegExpInfo *infoPtr); /* 377 */ + Tcl_Obj * (*tcl_NewUnicodeObj) (const Tcl_UniChar *unicode, int numChars); /* 378 */ + void (*tcl_SetUnicodeObj) (Tcl_Obj *objPtr, const Tcl_UniChar *unicode, int numChars); /* 379 */ + int (*tcl_GetCharLength) (Tcl_Obj *objPtr); /* 380 */ + Tcl_UniChar (*tcl_GetUniChar) (Tcl_Obj *objPtr, int index); /* 381 */ + Tcl_UniChar * (*tcl_GetUnicode) (Tcl_Obj *objPtr); /* 382 */ + Tcl_Obj * (*tcl_GetRange) (Tcl_Obj *objPtr, int first, int last); /* 383 */ + void (*tcl_AppendUnicodeToObj) (Tcl_Obj *objPtr, const Tcl_UniChar *unicode, int length); /* 384 */ + int (*tcl_RegExpMatchObj) (Tcl_Interp *interp, Tcl_Obj *textObj, Tcl_Obj *patternObj); /* 385 */ + void (*tcl_SetNotifier) (Tcl_NotifierProcs *notifierProcPtr); /* 386 */ + Tcl_Mutex * (*tcl_GetAllocMutex) (void); /* 387 */ + int (*tcl_GetChannelNames) (Tcl_Interp *interp); /* 388 */ + int (*tcl_GetChannelNamesEx) (Tcl_Interp *interp, const char *pattern); /* 389 */ + int (*tcl_ProcObjCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 390 */ + void (*tcl_ConditionFinalize) (Tcl_Condition *condPtr); /* 391 */ + void (*tcl_MutexFinalize) (Tcl_Mutex *mutex); /* 392 */ + int (*tcl_CreateThread) (Tcl_ThreadId *idPtr, Tcl_ThreadCreateProc *proc, ClientData clientData, int stackSize, int flags); /* 393 */ + int (*tcl_ReadRaw) (Tcl_Channel chan, char *dst, int bytesToRead); /* 394 */ + int (*tcl_WriteRaw) (Tcl_Channel chan, const char *src, int srcLen); /* 395 */ + Tcl_Channel (*tcl_GetTopChannel) (Tcl_Channel chan); /* 396 */ + int (*tcl_ChannelBuffered) (Tcl_Channel chan); /* 397 */ + CONST84_RETURN char * (*tcl_ChannelName) (const Tcl_ChannelType *chanTypePtr); /* 398 */ + Tcl_ChannelTypeVersion (*tcl_ChannelVersion) (const Tcl_ChannelType *chanTypePtr); /* 399 */ + Tcl_DriverBlockModeProc * (*tcl_ChannelBlockModeProc) (const Tcl_ChannelType *chanTypePtr); /* 400 */ + Tcl_DriverCloseProc * (*tcl_ChannelCloseProc) (const Tcl_ChannelType *chanTypePtr); /* 401 */ + Tcl_DriverClose2Proc * (*tcl_ChannelClose2Proc) (const Tcl_ChannelType *chanTypePtr); /* 402 */ + Tcl_DriverInputProc * (*tcl_ChannelInputProc) (const Tcl_ChannelType *chanTypePtr); /* 403 */ + Tcl_DriverOutputProc * (*tcl_ChannelOutputProc) (const Tcl_ChannelType *chanTypePtr); /* 404 */ + Tcl_DriverSeekProc * (*tcl_ChannelSeekProc) (const Tcl_ChannelType *chanTypePtr); /* 405 */ + Tcl_DriverSetOptionProc * (*tcl_ChannelSetOptionProc) (const Tcl_ChannelType *chanTypePtr); /* 406 */ + Tcl_DriverGetOptionProc * (*tcl_ChannelGetOptionProc) (const Tcl_ChannelType *chanTypePtr); /* 407 */ + Tcl_DriverWatchProc * (*tcl_ChannelWatchProc) (const Tcl_ChannelType *chanTypePtr); /* 408 */ + Tcl_DriverGetHandleProc * (*tcl_ChannelGetHandleProc) (const Tcl_ChannelType *chanTypePtr); /* 409 */ + Tcl_DriverFlushProc * (*tcl_ChannelFlushProc) (const Tcl_ChannelType *chanTypePtr); /* 410 */ + Tcl_DriverHandlerProc * (*tcl_ChannelHandlerProc) (const Tcl_ChannelType *chanTypePtr); /* 411 */ + int (*tcl_JoinThread) (Tcl_ThreadId threadId, int *result); /* 412 */ + int (*tcl_IsChannelShared) (Tcl_Channel channel); /* 413 */ + int (*tcl_IsChannelRegistered) (Tcl_Interp *interp, Tcl_Channel channel); /* 414 */ + void (*tcl_CutChannel) (Tcl_Channel channel); /* 415 */ + void (*tcl_SpliceChannel) (Tcl_Channel channel); /* 416 */ + void (*tcl_ClearChannelHandlers) (Tcl_Channel channel); /* 417 */ + int (*tcl_IsChannelExisting) (const char *channelName); /* 418 */ + int (*tcl_UniCharNcasecmp) (const Tcl_UniChar *ucs, const Tcl_UniChar *uct, unsigned long numChars); /* 419 */ + int (*tcl_UniCharCaseMatch) (const Tcl_UniChar *uniStr, const Tcl_UniChar *uniPattern, int nocase); /* 420 */ + Tcl_HashEntry * (*tcl_FindHashEntry) (Tcl_HashTable *tablePtr, const void *key); /* 421 */ + Tcl_HashEntry * (*tcl_CreateHashEntry) (Tcl_HashTable *tablePtr, const void *key, int *newPtr); /* 422 */ + void (*tcl_InitCustomHashTable) (Tcl_HashTable *tablePtr, int keyType, const Tcl_HashKeyType *typePtr); /* 423 */ + void (*tcl_InitObjHashTable) (Tcl_HashTable *tablePtr); /* 424 */ + ClientData (*tcl_CommandTraceInfo) (Tcl_Interp *interp, const char *varName, int flags, Tcl_CommandTraceProc *procPtr, ClientData prevClientData); /* 425 */ + int (*tcl_TraceCommand) (Tcl_Interp *interp, const char *varName, int flags, Tcl_CommandTraceProc *proc, ClientData clientData); /* 426 */ + void (*tcl_UntraceCommand) (Tcl_Interp *interp, const char *varName, int flags, Tcl_CommandTraceProc *proc, ClientData clientData); /* 427 */ + char * (*tcl_AttemptAlloc) (unsigned int size); /* 428 */ + char * (*tcl_AttemptDbCkalloc) (unsigned int size, const char *file, int line); /* 429 */ + char * (*tcl_AttemptRealloc) (char *ptr, unsigned int size); /* 430 */ + char * (*tcl_AttemptDbCkrealloc) (char *ptr, unsigned int size, const char *file, int line); /* 431 */ + int (*tcl_AttemptSetObjLength) (Tcl_Obj *objPtr, int length); /* 432 */ + Tcl_ThreadId (*tcl_GetChannelThread) (Tcl_Channel channel); /* 433 */ + Tcl_UniChar * (*tcl_GetUnicodeFromObj) (Tcl_Obj *objPtr, int *lengthPtr); /* 434 */ + int (*tcl_GetMathFuncInfo) (Tcl_Interp *interp, const char *name, int *numArgsPtr, Tcl_ValueType **argTypesPtr, Tcl_MathProc **procPtr, ClientData *clientDataPtr); /* 435 */ + Tcl_Obj * (*tcl_ListMathFuncs) (Tcl_Interp *interp, const char *pattern); /* 436 */ + Tcl_Obj * (*tcl_SubstObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int flags); /* 437 */ + int (*tcl_DetachChannel) (Tcl_Interp *interp, Tcl_Channel channel); /* 438 */ + int (*tcl_IsStandardChannel) (Tcl_Channel channel); /* 439 */ + int (*tcl_FSCopyFile) (Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr); /* 440 */ + int (*tcl_FSCopyDirectory) (Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr, Tcl_Obj **errorPtr); /* 441 */ + int (*tcl_FSCreateDirectory) (Tcl_Obj *pathPtr); /* 442 */ + int (*tcl_FSDeleteFile) (Tcl_Obj *pathPtr); /* 443 */ + int (*tcl_FSLoadFile) (Tcl_Interp *interp, Tcl_Obj *pathPtr, const char *sym1, const char *sym2, Tcl_PackageInitProc **proc1Ptr, Tcl_PackageInitProc **proc2Ptr, Tcl_LoadHandle *handlePtr, Tcl_FSUnloadFileProc **unloadProcPtr); /* 444 */ + int (*tcl_FSMatchInDirectory) (Tcl_Interp *interp, Tcl_Obj *result, Tcl_Obj *pathPtr, const char *pattern, Tcl_GlobTypeData *types); /* 445 */ + Tcl_Obj * (*tcl_FSLink) (Tcl_Obj *pathPtr, Tcl_Obj *toPtr, int linkAction); /* 446 */ + int (*tcl_FSRemoveDirectory) (Tcl_Obj *pathPtr, int recursive, Tcl_Obj **errorPtr); /* 447 */ + int (*tcl_FSRenameFile) (Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr); /* 448 */ + int (*tcl_FSLstat) (Tcl_Obj *pathPtr, Tcl_StatBuf *buf); /* 449 */ + int (*tcl_FSUtime) (Tcl_Obj *pathPtr, struct utimbuf *tval); /* 450 */ + int (*tcl_FSFileAttrsGet) (Tcl_Interp *interp, int index, Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef); /* 451 */ + int (*tcl_FSFileAttrsSet) (Tcl_Interp *interp, int index, Tcl_Obj *pathPtr, Tcl_Obj *objPtr); /* 452 */ + const char *CONST86 * (*tcl_FSFileAttrStrings) (Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef); /* 453 */ + int (*tcl_FSStat) (Tcl_Obj *pathPtr, Tcl_StatBuf *buf); /* 454 */ + int (*tcl_FSAccess) (Tcl_Obj *pathPtr, int mode); /* 455 */ + Tcl_Channel (*tcl_FSOpenFileChannel) (Tcl_Interp *interp, Tcl_Obj *pathPtr, const char *modeString, int permissions); /* 456 */ + Tcl_Obj * (*tcl_FSGetCwd) (Tcl_Interp *interp); /* 457 */ + int (*tcl_FSChdir) (Tcl_Obj *pathPtr); /* 458 */ + int (*tcl_FSConvertToPathType) (Tcl_Interp *interp, Tcl_Obj *pathPtr); /* 459 */ + Tcl_Obj * (*tcl_FSJoinPath) (Tcl_Obj *listObj, int elements); /* 460 */ + Tcl_Obj * (*tcl_FSSplitPath) (Tcl_Obj *pathPtr, int *lenPtr); /* 461 */ + int (*tcl_FSEqualPaths) (Tcl_Obj *firstPtr, Tcl_Obj *secondPtr); /* 462 */ + Tcl_Obj * (*tcl_FSGetNormalizedPath) (Tcl_Interp *interp, Tcl_Obj *pathPtr); /* 463 */ + Tcl_Obj * (*tcl_FSJoinToPath) (Tcl_Obj *pathPtr, int objc, Tcl_Obj *const objv[]); /* 464 */ + ClientData (*tcl_FSGetInternalRep) (Tcl_Obj *pathPtr, const Tcl_Filesystem *fsPtr); /* 465 */ + Tcl_Obj * (*tcl_FSGetTranslatedPath) (Tcl_Interp *interp, Tcl_Obj *pathPtr); /* 466 */ + int (*tcl_FSEvalFile) (Tcl_Interp *interp, Tcl_Obj *fileName); /* 467 */ + Tcl_Obj * (*tcl_FSNewNativePath) (const Tcl_Filesystem *fromFilesystem, ClientData clientData); /* 468 */ + const void * (*tcl_FSGetNativePath) (Tcl_Obj *pathPtr); /* 469 */ + Tcl_Obj * (*tcl_FSFileSystemInfo) (Tcl_Obj *pathPtr); /* 470 */ + Tcl_Obj * (*tcl_FSPathSeparator) (Tcl_Obj *pathPtr); /* 471 */ + Tcl_Obj * (*tcl_FSListVolumes) (void); /* 472 */ + int (*tcl_FSRegister) (ClientData clientData, const Tcl_Filesystem *fsPtr); /* 473 */ + int (*tcl_FSUnregister) (const Tcl_Filesystem *fsPtr); /* 474 */ + ClientData (*tcl_FSData) (const Tcl_Filesystem *fsPtr); /* 475 */ + const char * (*tcl_FSGetTranslatedStringPath) (Tcl_Interp *interp, Tcl_Obj *pathPtr); /* 476 */ + CONST86 Tcl_Filesystem * (*tcl_FSGetFileSystemForPath) (Tcl_Obj *pathPtr); /* 477 */ + Tcl_PathType (*tcl_FSGetPathType) (Tcl_Obj *pathPtr); /* 478 */ + int (*tcl_OutputBuffered) (Tcl_Channel chan); /* 479 */ + void (*tcl_FSMountsChanged) (const Tcl_Filesystem *fsPtr); /* 480 */ + int (*tcl_EvalTokensStandard) (Tcl_Interp *interp, Tcl_Token *tokenPtr, int count); /* 481 */ + void (*tcl_GetTime) (Tcl_Time *timeBuf); /* 482 */ + Tcl_Trace (*tcl_CreateObjTrace) (Tcl_Interp *interp, int level, int flags, Tcl_CmdObjTraceProc *objProc, ClientData clientData, Tcl_CmdObjTraceDeleteProc *delProc); /* 483 */ + int (*tcl_GetCommandInfoFromToken) (Tcl_Command token, Tcl_CmdInfo *infoPtr); /* 484 */ + int (*tcl_SetCommandInfoFromToken) (Tcl_Command token, const Tcl_CmdInfo *infoPtr); /* 485 */ + Tcl_Obj * (*tcl_DbNewWideIntObj) (Tcl_WideInt wideValue, const char *file, int line); /* 486 */ + int (*tcl_GetWideIntFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_WideInt *widePtr); /* 487 */ + Tcl_Obj * (*tcl_NewWideIntObj) (Tcl_WideInt wideValue); /* 488 */ + void (*tcl_SetWideIntObj) (Tcl_Obj *objPtr, Tcl_WideInt wideValue); /* 489 */ + Tcl_StatBuf * (*tcl_AllocStatBuf) (void); /* 490 */ + Tcl_WideInt (*tcl_Seek) (Tcl_Channel chan, Tcl_WideInt offset, int mode); /* 491 */ + Tcl_WideInt (*tcl_Tell) (Tcl_Channel chan); /* 492 */ + Tcl_DriverWideSeekProc * (*tcl_ChannelWideSeekProc) (const Tcl_ChannelType *chanTypePtr); /* 493 */ + int (*tcl_DictObjPut) (Tcl_Interp *interp, Tcl_Obj *dictPtr, Tcl_Obj *keyPtr, Tcl_Obj *valuePtr); /* 494 */ + int (*tcl_DictObjGet) (Tcl_Interp *interp, Tcl_Obj *dictPtr, Tcl_Obj *keyPtr, Tcl_Obj **valuePtrPtr); /* 495 */ + int (*tcl_DictObjRemove) (Tcl_Interp *interp, Tcl_Obj *dictPtr, Tcl_Obj *keyPtr); /* 496 */ + int (*tcl_DictObjSize) (Tcl_Interp *interp, Tcl_Obj *dictPtr, int *sizePtr); /* 497 */ + int (*tcl_DictObjFirst) (Tcl_Interp *interp, Tcl_Obj *dictPtr, Tcl_DictSearch *searchPtr, Tcl_Obj **keyPtrPtr, Tcl_Obj **valuePtrPtr, int *donePtr); /* 498 */ + void (*tcl_DictObjNext) (Tcl_DictSearch *searchPtr, Tcl_Obj **keyPtrPtr, Tcl_Obj **valuePtrPtr, int *donePtr); /* 499 */ + void (*tcl_DictObjDone) (Tcl_DictSearch *searchPtr); /* 500 */ + int (*tcl_DictObjPutKeyList) (Tcl_Interp *interp, Tcl_Obj *dictPtr, int keyc, Tcl_Obj *const *keyv, Tcl_Obj *valuePtr); /* 501 */ + int (*tcl_DictObjRemoveKeyList) (Tcl_Interp *interp, Tcl_Obj *dictPtr, int keyc, Tcl_Obj *const *keyv); /* 502 */ + Tcl_Obj * (*tcl_NewDictObj) (void); /* 503 */ + Tcl_Obj * (*tcl_DbNewDictObj) (const char *file, int line); /* 504 */ + void (*tcl_RegisterConfig) (Tcl_Interp *interp, const char *pkgName, const Tcl_Config *configuration, const char *valEncoding); /* 505 */ + Tcl_Namespace * (*tcl_CreateNamespace) (Tcl_Interp *interp, const char *name, ClientData clientData, Tcl_NamespaceDeleteProc *deleteProc); /* 506 */ + void (*tcl_DeleteNamespace) (Tcl_Namespace *nsPtr); /* 507 */ + int (*tcl_AppendExportList) (Tcl_Interp *interp, Tcl_Namespace *nsPtr, Tcl_Obj *objPtr); /* 508 */ + int (*tcl_Export) (Tcl_Interp *interp, Tcl_Namespace *nsPtr, const char *pattern, int resetListFirst); /* 509 */ + int (*tcl_Import) (Tcl_Interp *interp, Tcl_Namespace *nsPtr, const char *pattern, int allowOverwrite); /* 510 */ + int (*tcl_ForgetImport) (Tcl_Interp *interp, Tcl_Namespace *nsPtr, const char *pattern); /* 511 */ + Tcl_Namespace * (*tcl_GetCurrentNamespace) (Tcl_Interp *interp); /* 512 */ + Tcl_Namespace * (*tcl_GetGlobalNamespace) (Tcl_Interp *interp); /* 513 */ + Tcl_Namespace * (*tcl_FindNamespace) (Tcl_Interp *interp, const char *name, Tcl_Namespace *contextNsPtr, int flags); /* 514 */ + Tcl_Command (*tcl_FindCommand) (Tcl_Interp *interp, const char *name, Tcl_Namespace *contextNsPtr, int flags); /* 515 */ + Tcl_Command (*tcl_GetCommandFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr); /* 516 */ + void (*tcl_GetCommandFullName) (Tcl_Interp *interp, Tcl_Command command, Tcl_Obj *objPtr); /* 517 */ + int (*tcl_FSEvalFileEx) (Tcl_Interp *interp, Tcl_Obj *fileName, const char *encodingName); /* 518 */ + Tcl_ExitProc * (*tcl_SetExitProc) (Tcl_ExitProc *proc); /* 519 */ + void (*tcl_LimitAddHandler) (Tcl_Interp *interp, int type, Tcl_LimitHandlerProc *handlerProc, ClientData clientData, Tcl_LimitHandlerDeleteProc *deleteProc); /* 520 */ + void (*tcl_LimitRemoveHandler) (Tcl_Interp *interp, int type, Tcl_LimitHandlerProc *handlerProc, ClientData clientData); /* 521 */ + int (*tcl_LimitReady) (Tcl_Interp *interp); /* 522 */ + int (*tcl_LimitCheck) (Tcl_Interp *interp); /* 523 */ + int (*tcl_LimitExceeded) (Tcl_Interp *interp); /* 524 */ + void (*tcl_LimitSetCommands) (Tcl_Interp *interp, int commandLimit); /* 525 */ + void (*tcl_LimitSetTime) (Tcl_Interp *interp, Tcl_Time *timeLimitPtr); /* 526 */ + void (*tcl_LimitSetGranularity) (Tcl_Interp *interp, int type, int granularity); /* 527 */ + int (*tcl_LimitTypeEnabled) (Tcl_Interp *interp, int type); /* 528 */ + int (*tcl_LimitTypeExceeded) (Tcl_Interp *interp, int type); /* 529 */ + void (*tcl_LimitTypeSet) (Tcl_Interp *interp, int type); /* 530 */ + void (*tcl_LimitTypeReset) (Tcl_Interp *interp, int type); /* 531 */ + int (*tcl_LimitGetCommands) (Tcl_Interp *interp); /* 532 */ + void (*tcl_LimitGetTime) (Tcl_Interp *interp, Tcl_Time *timeLimitPtr); /* 533 */ + int (*tcl_LimitGetGranularity) (Tcl_Interp *interp, int type); /* 534 */ + Tcl_InterpState (*tcl_SaveInterpState) (Tcl_Interp *interp, int status); /* 535 */ + int (*tcl_RestoreInterpState) (Tcl_Interp *interp, Tcl_InterpState state); /* 536 */ + void (*tcl_DiscardInterpState) (Tcl_InterpState state); /* 537 */ + int (*tcl_SetReturnOptions) (Tcl_Interp *interp, Tcl_Obj *options); /* 538 */ + Tcl_Obj * (*tcl_GetReturnOptions) (Tcl_Interp *interp, int result); /* 539 */ + int (*tcl_IsEnsemble) (Tcl_Command token); /* 540 */ + Tcl_Command (*tcl_CreateEnsemble) (Tcl_Interp *interp, const char *name, Tcl_Namespace *namespacePtr, int flags); /* 541 */ + Tcl_Command (*tcl_FindEnsemble) (Tcl_Interp *interp, Tcl_Obj *cmdNameObj, int flags); /* 542 */ + int (*tcl_SetEnsembleSubcommandList) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj *subcmdList); /* 543 */ + int (*tcl_SetEnsembleMappingDict) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj *mapDict); /* 544 */ + int (*tcl_SetEnsembleUnknownHandler) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj *unknownList); /* 545 */ + int (*tcl_SetEnsembleFlags) (Tcl_Interp *interp, Tcl_Command token, int flags); /* 546 */ + int (*tcl_GetEnsembleSubcommandList) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj **subcmdListPtr); /* 547 */ + int (*tcl_GetEnsembleMappingDict) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj **mapDictPtr); /* 548 */ + int (*tcl_GetEnsembleUnknownHandler) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj **unknownListPtr); /* 549 */ + int (*tcl_GetEnsembleFlags) (Tcl_Interp *interp, Tcl_Command token, int *flagsPtr); /* 550 */ + int (*tcl_GetEnsembleNamespace) (Tcl_Interp *interp, Tcl_Command token, Tcl_Namespace **namespacePtrPtr); /* 551 */ + void (*tcl_SetTimeProc) (Tcl_GetTimeProc *getProc, Tcl_ScaleTimeProc *scaleProc, ClientData clientData); /* 552 */ + void (*tcl_QueryTimeProc) (Tcl_GetTimeProc **getProc, Tcl_ScaleTimeProc **scaleProc, ClientData *clientData); /* 553 */ + Tcl_DriverThreadActionProc * (*tcl_ChannelThreadActionProc) (const Tcl_ChannelType *chanTypePtr); /* 554 */ + Tcl_Obj * (*tcl_NewBignumObj) (mp_int *value); /* 555 */ + Tcl_Obj * (*tcl_DbNewBignumObj) (mp_int *value, const char *file, int line); /* 556 */ + void (*tcl_SetBignumObj) (Tcl_Obj *obj, mp_int *value); /* 557 */ + int (*tcl_GetBignumFromObj) (Tcl_Interp *interp, Tcl_Obj *obj, mp_int *value); /* 558 */ + int (*tcl_TakeBignumFromObj) (Tcl_Interp *interp, Tcl_Obj *obj, mp_int *value); /* 559 */ + int (*tcl_TruncateChannel) (Tcl_Channel chan, Tcl_WideInt length); /* 560 */ + Tcl_DriverTruncateProc * (*tcl_ChannelTruncateProc) (const Tcl_ChannelType *chanTypePtr); /* 561 */ + void (*tcl_SetChannelErrorInterp) (Tcl_Interp *interp, Tcl_Obj *msg); /* 562 */ + void (*tcl_GetChannelErrorInterp) (Tcl_Interp *interp, Tcl_Obj **msg); /* 563 */ + void (*tcl_SetChannelError) (Tcl_Channel chan, Tcl_Obj *msg); /* 564 */ + void (*tcl_GetChannelError) (Tcl_Channel chan, Tcl_Obj **msg); /* 565 */ + int (*tcl_InitBignumFromDouble) (Tcl_Interp *interp, double initval, mp_int *toInit); /* 566 */ + Tcl_Obj * (*tcl_GetNamespaceUnknownHandler) (Tcl_Interp *interp, Tcl_Namespace *nsPtr); /* 567 */ + int (*tcl_SetNamespaceUnknownHandler) (Tcl_Interp *interp, Tcl_Namespace *nsPtr, Tcl_Obj *handlerPtr); /* 568 */ + int (*tcl_GetEncodingFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Encoding *encodingPtr); /* 569 */ + Tcl_Obj * (*tcl_GetEncodingSearchPath) (void); /* 570 */ + int (*tcl_SetEncodingSearchPath) (Tcl_Obj *searchPath); /* 571 */ + const char * (*tcl_GetEncodingNameFromEnvironment) (Tcl_DString *bufPtr); /* 572 */ + int (*tcl_PkgRequireProc) (Tcl_Interp *interp, const char *name, int objc, Tcl_Obj *const objv[], void *clientDataPtr); /* 573 */ + void (*tcl_AppendObjToErrorInfo) (Tcl_Interp *interp, Tcl_Obj *objPtr); /* 574 */ + void (*tcl_AppendLimitedToObj) (Tcl_Obj *objPtr, const char *bytes, int length, int limit, const char *ellipsis); /* 575 */ + Tcl_Obj * (*tcl_Format) (Tcl_Interp *interp, const char *format, int objc, Tcl_Obj *const objv[]); /* 576 */ + int (*tcl_AppendFormatToObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, const char *format, int objc, Tcl_Obj *const objv[]); /* 577 */ + Tcl_Obj * (*tcl_ObjPrintf) (const char *format, ...) TCL_FORMAT_PRINTF(1, 2); /* 578 */ + void (*tcl_AppendPrintfToObj) (Tcl_Obj *objPtr, const char *format, ...) TCL_FORMAT_PRINTF(2, 3); /* 579 */ + int (*tcl_CancelEval) (Tcl_Interp *interp, Tcl_Obj *resultObjPtr, ClientData clientData, int flags); /* 580 */ + int (*tcl_Canceled) (Tcl_Interp *interp, int flags); /* 581 */ + int (*tcl_CreatePipe) (Tcl_Interp *interp, Tcl_Channel *rchan, Tcl_Channel *wchan, int flags); /* 582 */ + Tcl_Command (*tcl_NRCreateCommand) (Tcl_Interp *interp, const char *cmdName, Tcl_ObjCmdProc *proc, Tcl_ObjCmdProc *nreProc, ClientData clientData, Tcl_CmdDeleteProc *deleteProc); /* 583 */ + int (*tcl_NREvalObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int flags); /* 584 */ + int (*tcl_NREvalObjv) (Tcl_Interp *interp, int objc, Tcl_Obj *const objv[], int flags); /* 585 */ + int (*tcl_NRCmdSwap) (Tcl_Interp *interp, Tcl_Command cmd, int objc, Tcl_Obj *const objv[], int flags); /* 586 */ + void (*tcl_NRAddCallback) (Tcl_Interp *interp, Tcl_NRPostProc *postProcPtr, ClientData data0, ClientData data1, ClientData data2, ClientData data3); /* 587 */ + int (*tcl_NRCallObjProc) (Tcl_Interp *interp, Tcl_ObjCmdProc *objProc, ClientData clientData, int objc, Tcl_Obj *const objv[]); /* 588 */ + unsigned (*tcl_GetFSDeviceFromStat) (const Tcl_StatBuf *statPtr); /* 589 */ + unsigned (*tcl_GetFSInodeFromStat) (const Tcl_StatBuf *statPtr); /* 590 */ + unsigned (*tcl_GetModeFromStat) (const Tcl_StatBuf *statPtr); /* 591 */ + int (*tcl_GetLinkCountFromStat) (const Tcl_StatBuf *statPtr); /* 592 */ + int (*tcl_GetUserIdFromStat) (const Tcl_StatBuf *statPtr); /* 593 */ + int (*tcl_GetGroupIdFromStat) (const Tcl_StatBuf *statPtr); /* 594 */ + int (*tcl_GetDeviceTypeFromStat) (const Tcl_StatBuf *statPtr); /* 595 */ + Tcl_WideInt (*tcl_GetAccessTimeFromStat) (const Tcl_StatBuf *statPtr); /* 596 */ + Tcl_WideInt (*tcl_GetModificationTimeFromStat) (const Tcl_StatBuf *statPtr); /* 597 */ + Tcl_WideInt (*tcl_GetChangeTimeFromStat) (const Tcl_StatBuf *statPtr); /* 598 */ + Tcl_WideUInt (*tcl_GetSizeFromStat) (const Tcl_StatBuf *statPtr); /* 599 */ + Tcl_WideUInt (*tcl_GetBlocksFromStat) (const Tcl_StatBuf *statPtr); /* 600 */ + unsigned (*tcl_GetBlockSizeFromStat) (const Tcl_StatBuf *statPtr); /* 601 */ + int (*tcl_SetEnsembleParameterList) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj *paramList); /* 602 */ + int (*tcl_GetEnsembleParameterList) (Tcl_Interp *interp, Tcl_Command token, Tcl_Obj **paramListPtr); /* 603 */ + int (*tcl_ParseArgsObjv) (Tcl_Interp *interp, const Tcl_ArgvInfo *argTable, int *objcPtr, Tcl_Obj *const *objv, Tcl_Obj ***remObjv); /* 604 */ + int (*tcl_GetErrorLine) (Tcl_Interp *interp); /* 605 */ + void (*tcl_SetErrorLine) (Tcl_Interp *interp, int lineNum); /* 606 */ + void (*tcl_TransferResult) (Tcl_Interp *sourceInterp, int result, Tcl_Interp *targetInterp); /* 607 */ + int (*tcl_InterpActive) (Tcl_Interp *interp); /* 608 */ + void (*tcl_BackgroundException) (Tcl_Interp *interp, int code); /* 609 */ + int (*tcl_ZlibDeflate) (Tcl_Interp *interp, int format, Tcl_Obj *data, int level, Tcl_Obj *gzipHeaderDictObj); /* 610 */ + int (*tcl_ZlibInflate) (Tcl_Interp *interp, int format, Tcl_Obj *data, int buffersize, Tcl_Obj *gzipHeaderDictObj); /* 611 */ + unsigned int (*tcl_ZlibCRC32) (unsigned int crc, const unsigned char *buf, int len); /* 612 */ + unsigned int (*tcl_ZlibAdler32) (unsigned int adler, const unsigned char *buf, int len); /* 613 */ + int (*tcl_ZlibStreamInit) (Tcl_Interp *interp, int mode, int format, int level, Tcl_Obj *dictObj, Tcl_ZlibStream *zshandle); /* 614 */ + Tcl_Obj * (*tcl_ZlibStreamGetCommandName) (Tcl_ZlibStream zshandle); /* 615 */ + int (*tcl_ZlibStreamEof) (Tcl_ZlibStream zshandle); /* 616 */ + int (*tcl_ZlibStreamChecksum) (Tcl_ZlibStream zshandle); /* 617 */ + int (*tcl_ZlibStreamPut) (Tcl_ZlibStream zshandle, Tcl_Obj *data, int flush); /* 618 */ + int (*tcl_ZlibStreamGet) (Tcl_ZlibStream zshandle, Tcl_Obj *data, int count); /* 619 */ + int (*tcl_ZlibStreamClose) (Tcl_ZlibStream zshandle); /* 620 */ + int (*tcl_ZlibStreamReset) (Tcl_ZlibStream zshandle); /* 621 */ + void (*tcl_SetStartupScript) (Tcl_Obj *path, const char *encoding); /* 622 */ + Tcl_Obj * (*tcl_GetStartupScript) (const char **encodingPtr); /* 623 */ + int (*tcl_CloseEx) (Tcl_Interp *interp, Tcl_Channel chan, int flags); /* 624 */ + int (*tcl_NRExprObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Obj *resultPtr); /* 625 */ + int (*tcl_NRSubstObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int flags); /* 626 */ + int (*tcl_LoadFile) (Tcl_Interp *interp, Tcl_Obj *pathPtr, const char *const symv[], int flags, void *procPtrs, Tcl_LoadHandle *handlePtr); /* 627 */ + void * (*tcl_FindSymbol) (Tcl_Interp *interp, Tcl_LoadHandle handle, const char *symbol); /* 628 */ + int (*tcl_FSUnloadFile) (Tcl_Interp *interp, Tcl_LoadHandle handlePtr); /* 629 */ + void (*tcl_ZlibStreamSetCompressionDictionary) (Tcl_ZlibStream zhandle, Tcl_Obj *compressionDictionaryObj); /* 630 */ +} TclStubs; + +extern const TclStubs *tclStubsPtr; + +#ifdef __cplusplus +} +#endif + +#if defined(USE_TCL_STUBS) + +/* + * Inline function declarations: + */ + +#define Tcl_PkgProvideEx \ + (tclStubsPtr->tcl_PkgProvideEx) /* 0 */ +#define Tcl_PkgRequireEx \ + (tclStubsPtr->tcl_PkgRequireEx) /* 1 */ +#define Tcl_Panic \ + (tclStubsPtr->tcl_Panic) /* 2 */ +#define Tcl_Alloc \ + (tclStubsPtr->tcl_Alloc) /* 3 */ +#define Tcl_Free \ + (tclStubsPtr->tcl_Free) /* 4 */ +#define Tcl_Realloc \ + (tclStubsPtr->tcl_Realloc) /* 5 */ +#define Tcl_DbCkalloc \ + (tclStubsPtr->tcl_DbCkalloc) /* 6 */ +#define Tcl_DbCkfree \ + (tclStubsPtr->tcl_DbCkfree) /* 7 */ +#define Tcl_DbCkrealloc \ + (tclStubsPtr->tcl_DbCkrealloc) /* 8 */ +#if !defined(_WIN32) && !defined(MAC_OSX_TCL) /* UNIX */ +#define Tcl_CreateFileHandler \ + (tclStubsPtr->tcl_CreateFileHandler) /* 9 */ +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#define Tcl_CreateFileHandler \ + (tclStubsPtr->tcl_CreateFileHandler) /* 9 */ +#endif /* MACOSX */ +#if !defined(_WIN32) && !defined(MAC_OSX_TCL) /* UNIX */ +#define Tcl_DeleteFileHandler \ + (tclStubsPtr->tcl_DeleteFileHandler) /* 10 */ +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#define Tcl_DeleteFileHandler \ + (tclStubsPtr->tcl_DeleteFileHandler) /* 10 */ +#endif /* MACOSX */ +#define Tcl_SetTimer \ + (tclStubsPtr->tcl_SetTimer) /* 11 */ +#define Tcl_Sleep \ + (tclStubsPtr->tcl_Sleep) /* 12 */ +#define Tcl_WaitForEvent \ + (tclStubsPtr->tcl_WaitForEvent) /* 13 */ +#define Tcl_AppendAllObjTypes \ + (tclStubsPtr->tcl_AppendAllObjTypes) /* 14 */ +#define Tcl_AppendStringsToObj \ + (tclStubsPtr->tcl_AppendStringsToObj) /* 15 */ +#define Tcl_AppendToObj \ + (tclStubsPtr->tcl_AppendToObj) /* 16 */ +#define Tcl_ConcatObj \ + (tclStubsPtr->tcl_ConcatObj) /* 17 */ +#define Tcl_ConvertToType \ + (tclStubsPtr->tcl_ConvertToType) /* 18 */ +#define Tcl_DbDecrRefCount \ + (tclStubsPtr->tcl_DbDecrRefCount) /* 19 */ +#define Tcl_DbIncrRefCount \ + (tclStubsPtr->tcl_DbIncrRefCount) /* 20 */ +#define Tcl_DbIsShared \ + (tclStubsPtr->tcl_DbIsShared) /* 21 */ +#define Tcl_DbNewBooleanObj \ + (tclStubsPtr->tcl_DbNewBooleanObj) /* 22 */ +#define Tcl_DbNewByteArrayObj \ + (tclStubsPtr->tcl_DbNewByteArrayObj) /* 23 */ +#define Tcl_DbNewDoubleObj \ + (tclStubsPtr->tcl_DbNewDoubleObj) /* 24 */ +#define Tcl_DbNewListObj \ + (tclStubsPtr->tcl_DbNewListObj) /* 25 */ +#define Tcl_DbNewLongObj \ + (tclStubsPtr->tcl_DbNewLongObj) /* 26 */ +#define Tcl_DbNewObj \ + (tclStubsPtr->tcl_DbNewObj) /* 27 */ +#define Tcl_DbNewStringObj \ + (tclStubsPtr->tcl_DbNewStringObj) /* 28 */ +#define Tcl_DuplicateObj \ + (tclStubsPtr->tcl_DuplicateObj) /* 29 */ +#define TclFreeObj \ + (tclStubsPtr->tclFreeObj) /* 30 */ +#define Tcl_GetBoolean \ + (tclStubsPtr->tcl_GetBoolean) /* 31 */ +#define Tcl_GetBooleanFromObj \ + (tclStubsPtr->tcl_GetBooleanFromObj) /* 32 */ +#define Tcl_GetByteArrayFromObj \ + (tclStubsPtr->tcl_GetByteArrayFromObj) /* 33 */ +#define Tcl_GetDouble \ + (tclStubsPtr->tcl_GetDouble) /* 34 */ +#define Tcl_GetDoubleFromObj \ + (tclStubsPtr->tcl_GetDoubleFromObj) /* 35 */ +#define Tcl_GetIndexFromObj \ + (tclStubsPtr->tcl_GetIndexFromObj) /* 36 */ +#define Tcl_GetInt \ + (tclStubsPtr->tcl_GetInt) /* 37 */ +#define Tcl_GetIntFromObj \ + (tclStubsPtr->tcl_GetIntFromObj) /* 38 */ +#define Tcl_GetLongFromObj \ + (tclStubsPtr->tcl_GetLongFromObj) /* 39 */ +#define Tcl_GetObjType \ + (tclStubsPtr->tcl_GetObjType) /* 40 */ +#define Tcl_GetStringFromObj \ + (tclStubsPtr->tcl_GetStringFromObj) /* 41 */ +#define Tcl_InvalidateStringRep \ + (tclStubsPtr->tcl_InvalidateStringRep) /* 42 */ +#define Tcl_ListObjAppendList \ + (tclStubsPtr->tcl_ListObjAppendList) /* 43 */ +#define Tcl_ListObjAppendElement \ + (tclStubsPtr->tcl_ListObjAppendElement) /* 44 */ +#define Tcl_ListObjGetElements \ + (tclStubsPtr->tcl_ListObjGetElements) /* 45 */ +#define Tcl_ListObjIndex \ + (tclStubsPtr->tcl_ListObjIndex) /* 46 */ +#define Tcl_ListObjLength \ + (tclStubsPtr->tcl_ListObjLength) /* 47 */ +#define Tcl_ListObjReplace \ + (tclStubsPtr->tcl_ListObjReplace) /* 48 */ +#define Tcl_NewBooleanObj \ + (tclStubsPtr->tcl_NewBooleanObj) /* 49 */ +#define Tcl_NewByteArrayObj \ + (tclStubsPtr->tcl_NewByteArrayObj) /* 50 */ +#define Tcl_NewDoubleObj \ + (tclStubsPtr->tcl_NewDoubleObj) /* 51 */ +#define Tcl_NewIntObj \ + (tclStubsPtr->tcl_NewIntObj) /* 52 */ +#define Tcl_NewListObj \ + (tclStubsPtr->tcl_NewListObj) /* 53 */ +#define Tcl_NewLongObj \ + (tclStubsPtr->tcl_NewLongObj) /* 54 */ +#define Tcl_NewObj \ + (tclStubsPtr->tcl_NewObj) /* 55 */ +#define Tcl_NewStringObj \ + (tclStubsPtr->tcl_NewStringObj) /* 56 */ +#define Tcl_SetBooleanObj \ + (tclStubsPtr->tcl_SetBooleanObj) /* 57 */ +#define Tcl_SetByteArrayLength \ + (tclStubsPtr->tcl_SetByteArrayLength) /* 58 */ +#define Tcl_SetByteArrayObj \ + (tclStubsPtr->tcl_SetByteArrayObj) /* 59 */ +#define Tcl_SetDoubleObj \ + (tclStubsPtr->tcl_SetDoubleObj) /* 60 */ +#define Tcl_SetIntObj \ + (tclStubsPtr->tcl_SetIntObj) /* 61 */ +#define Tcl_SetListObj \ + (tclStubsPtr->tcl_SetListObj) /* 62 */ +#define Tcl_SetLongObj \ + (tclStubsPtr->tcl_SetLongObj) /* 63 */ +#define Tcl_SetObjLength \ + (tclStubsPtr->tcl_SetObjLength) /* 64 */ +#define Tcl_SetStringObj \ + (tclStubsPtr->tcl_SetStringObj) /* 65 */ +#define Tcl_AddErrorInfo \ + (tclStubsPtr->tcl_AddErrorInfo) /* 66 */ +#define Tcl_AddObjErrorInfo \ + (tclStubsPtr->tcl_AddObjErrorInfo) /* 67 */ +#define Tcl_AllowExceptions \ + (tclStubsPtr->tcl_AllowExceptions) /* 68 */ +#define Tcl_AppendElement \ + (tclStubsPtr->tcl_AppendElement) /* 69 */ +#define Tcl_AppendResult \ + (tclStubsPtr->tcl_AppendResult) /* 70 */ +#define Tcl_AsyncCreate \ + (tclStubsPtr->tcl_AsyncCreate) /* 71 */ +#define Tcl_AsyncDelete \ + (tclStubsPtr->tcl_AsyncDelete) /* 72 */ +#define Tcl_AsyncInvoke \ + (tclStubsPtr->tcl_AsyncInvoke) /* 73 */ +#define Tcl_AsyncMark \ + (tclStubsPtr->tcl_AsyncMark) /* 74 */ +#define Tcl_AsyncReady \ + (tclStubsPtr->tcl_AsyncReady) /* 75 */ +#define Tcl_BackgroundError \ + (tclStubsPtr->tcl_BackgroundError) /* 76 */ +#define Tcl_Backslash \ + (tclStubsPtr->tcl_Backslash) /* 77 */ +#define Tcl_BadChannelOption \ + (tclStubsPtr->tcl_BadChannelOption) /* 78 */ +#define Tcl_CallWhenDeleted \ + (tclStubsPtr->tcl_CallWhenDeleted) /* 79 */ +#define Tcl_CancelIdleCall \ + (tclStubsPtr->tcl_CancelIdleCall) /* 80 */ +#define Tcl_Close \ + (tclStubsPtr->tcl_Close) /* 81 */ +#define Tcl_CommandComplete \ + (tclStubsPtr->tcl_CommandComplete) /* 82 */ +#define Tcl_Concat \ + (tclStubsPtr->tcl_Concat) /* 83 */ +#define Tcl_ConvertElement \ + (tclStubsPtr->tcl_ConvertElement) /* 84 */ +#define Tcl_ConvertCountedElement \ + (tclStubsPtr->tcl_ConvertCountedElement) /* 85 */ +#define Tcl_CreateAlias \ + (tclStubsPtr->tcl_CreateAlias) /* 86 */ +#define Tcl_CreateAliasObj \ + (tclStubsPtr->tcl_CreateAliasObj) /* 87 */ +#define Tcl_CreateChannel \ + (tclStubsPtr->tcl_CreateChannel) /* 88 */ +#define Tcl_CreateChannelHandler \ + (tclStubsPtr->tcl_CreateChannelHandler) /* 89 */ +#define Tcl_CreateCloseHandler \ + (tclStubsPtr->tcl_CreateCloseHandler) /* 90 */ +#define Tcl_CreateCommand \ + (tclStubsPtr->tcl_CreateCommand) /* 91 */ +#define Tcl_CreateEventSource \ + (tclStubsPtr->tcl_CreateEventSource) /* 92 */ +#define Tcl_CreateExitHandler \ + (tclStubsPtr->tcl_CreateExitHandler) /* 93 */ +#define Tcl_CreateInterp \ + (tclStubsPtr->tcl_CreateInterp) /* 94 */ +#define Tcl_CreateMathFunc \ + (tclStubsPtr->tcl_CreateMathFunc) /* 95 */ +#define Tcl_CreateObjCommand \ + (tclStubsPtr->tcl_CreateObjCommand) /* 96 */ +#define Tcl_CreateSlave \ + (tclStubsPtr->tcl_CreateSlave) /* 97 */ +#define Tcl_CreateTimerHandler \ + (tclStubsPtr->tcl_CreateTimerHandler) /* 98 */ +#define Tcl_CreateTrace \ + (tclStubsPtr->tcl_CreateTrace) /* 99 */ +#define Tcl_DeleteAssocData \ + (tclStubsPtr->tcl_DeleteAssocData) /* 100 */ +#define Tcl_DeleteChannelHandler \ + (tclStubsPtr->tcl_DeleteChannelHandler) /* 101 */ +#define Tcl_DeleteCloseHandler \ + (tclStubsPtr->tcl_DeleteCloseHandler) /* 102 */ +#define Tcl_DeleteCommand \ + (tclStubsPtr->tcl_DeleteCommand) /* 103 */ +#define Tcl_DeleteCommandFromToken \ + (tclStubsPtr->tcl_DeleteCommandFromToken) /* 104 */ +#define Tcl_DeleteEvents \ + (tclStubsPtr->tcl_DeleteEvents) /* 105 */ +#define Tcl_DeleteEventSource \ + (tclStubsPtr->tcl_DeleteEventSource) /* 106 */ +#define Tcl_DeleteExitHandler \ + (tclStubsPtr->tcl_DeleteExitHandler) /* 107 */ +#define Tcl_DeleteHashEntry \ + (tclStubsPtr->tcl_DeleteHashEntry) /* 108 */ +#define Tcl_DeleteHashTable \ + (tclStubsPtr->tcl_DeleteHashTable) /* 109 */ +#define Tcl_DeleteInterp \ + (tclStubsPtr->tcl_DeleteInterp) /* 110 */ +#define Tcl_DetachPids \ + (tclStubsPtr->tcl_DetachPids) /* 111 */ +#define Tcl_DeleteTimerHandler \ + (tclStubsPtr->tcl_DeleteTimerHandler) /* 112 */ +#define Tcl_DeleteTrace \ + (tclStubsPtr->tcl_DeleteTrace) /* 113 */ +#define Tcl_DontCallWhenDeleted \ + (tclStubsPtr->tcl_DontCallWhenDeleted) /* 114 */ +#define Tcl_DoOneEvent \ + (tclStubsPtr->tcl_DoOneEvent) /* 115 */ +#define Tcl_DoWhenIdle \ + (tclStubsPtr->tcl_DoWhenIdle) /* 116 */ +#define Tcl_DStringAppend \ + (tclStubsPtr->tcl_DStringAppend) /* 117 */ +#define Tcl_DStringAppendElement \ + (tclStubsPtr->tcl_DStringAppendElement) /* 118 */ +#define Tcl_DStringEndSublist \ + (tclStubsPtr->tcl_DStringEndSublist) /* 119 */ +#define Tcl_DStringFree \ + (tclStubsPtr->tcl_DStringFree) /* 120 */ +#define Tcl_DStringGetResult \ + (tclStubsPtr->tcl_DStringGetResult) /* 121 */ +#define Tcl_DStringInit \ + (tclStubsPtr->tcl_DStringInit) /* 122 */ +#define Tcl_DStringResult \ + (tclStubsPtr->tcl_DStringResult) /* 123 */ +#define Tcl_DStringSetLength \ + (tclStubsPtr->tcl_DStringSetLength) /* 124 */ +#define Tcl_DStringStartSublist \ + (tclStubsPtr->tcl_DStringStartSublist) /* 125 */ +#define Tcl_Eof \ + (tclStubsPtr->tcl_Eof) /* 126 */ +#define Tcl_ErrnoId \ + (tclStubsPtr->tcl_ErrnoId) /* 127 */ +#define Tcl_ErrnoMsg \ + (tclStubsPtr->tcl_ErrnoMsg) /* 128 */ +#define Tcl_Eval \ + (tclStubsPtr->tcl_Eval) /* 129 */ +#define Tcl_EvalFile \ + (tclStubsPtr->tcl_EvalFile) /* 130 */ +#define Tcl_EvalObj \ + (tclStubsPtr->tcl_EvalObj) /* 131 */ +#define Tcl_EventuallyFree \ + (tclStubsPtr->tcl_EventuallyFree) /* 132 */ +#define Tcl_Exit \ + (tclStubsPtr->tcl_Exit) /* 133 */ +#define Tcl_ExposeCommand \ + (tclStubsPtr->tcl_ExposeCommand) /* 134 */ +#define Tcl_ExprBoolean \ + (tclStubsPtr->tcl_ExprBoolean) /* 135 */ +#define Tcl_ExprBooleanObj \ + (tclStubsPtr->tcl_ExprBooleanObj) /* 136 */ +#define Tcl_ExprDouble \ + (tclStubsPtr->tcl_ExprDouble) /* 137 */ +#define Tcl_ExprDoubleObj \ + (tclStubsPtr->tcl_ExprDoubleObj) /* 138 */ +#define Tcl_ExprLong \ + (tclStubsPtr->tcl_ExprLong) /* 139 */ +#define Tcl_ExprLongObj \ + (tclStubsPtr->tcl_ExprLongObj) /* 140 */ +#define Tcl_ExprObj \ + (tclStubsPtr->tcl_ExprObj) /* 141 */ +#define Tcl_ExprString \ + (tclStubsPtr->tcl_ExprString) /* 142 */ +#define Tcl_Finalize \ + (tclStubsPtr->tcl_Finalize) /* 143 */ +#define Tcl_FindExecutable \ + (tclStubsPtr->tcl_FindExecutable) /* 144 */ +#define Tcl_FirstHashEntry \ + (tclStubsPtr->tcl_FirstHashEntry) /* 145 */ +#define Tcl_Flush \ + (tclStubsPtr->tcl_Flush) /* 146 */ +#define Tcl_FreeResult \ + (tclStubsPtr->tcl_FreeResult) /* 147 */ +#define Tcl_GetAlias \ + (tclStubsPtr->tcl_GetAlias) /* 148 */ +#define Tcl_GetAliasObj \ + (tclStubsPtr->tcl_GetAliasObj) /* 149 */ +#define Tcl_GetAssocData \ + (tclStubsPtr->tcl_GetAssocData) /* 150 */ +#define Tcl_GetChannel \ + (tclStubsPtr->tcl_GetChannel) /* 151 */ +#define Tcl_GetChannelBufferSize \ + (tclStubsPtr->tcl_GetChannelBufferSize) /* 152 */ +#define Tcl_GetChannelHandle \ + (tclStubsPtr->tcl_GetChannelHandle) /* 153 */ +#define Tcl_GetChannelInstanceData \ + (tclStubsPtr->tcl_GetChannelInstanceData) /* 154 */ +#define Tcl_GetChannelMode \ + (tclStubsPtr->tcl_GetChannelMode) /* 155 */ +#define Tcl_GetChannelName \ + (tclStubsPtr->tcl_GetChannelName) /* 156 */ +#define Tcl_GetChannelOption \ + (tclStubsPtr->tcl_GetChannelOption) /* 157 */ +#define Tcl_GetChannelType \ + (tclStubsPtr->tcl_GetChannelType) /* 158 */ +#define Tcl_GetCommandInfo \ + (tclStubsPtr->tcl_GetCommandInfo) /* 159 */ +#define Tcl_GetCommandName \ + (tclStubsPtr->tcl_GetCommandName) /* 160 */ +#define Tcl_GetErrno \ + (tclStubsPtr->tcl_GetErrno) /* 161 */ +#define Tcl_GetHostName \ + (tclStubsPtr->tcl_GetHostName) /* 162 */ +#define Tcl_GetInterpPath \ + (tclStubsPtr->tcl_GetInterpPath) /* 163 */ +#define Tcl_GetMaster \ + (tclStubsPtr->tcl_GetMaster) /* 164 */ +#define Tcl_GetNameOfExecutable \ + (tclStubsPtr->tcl_GetNameOfExecutable) /* 165 */ +#define Tcl_GetObjResult \ + (tclStubsPtr->tcl_GetObjResult) /* 166 */ +#if !defined(_WIN32) && !defined(MAC_OSX_TCL) /* UNIX */ +#define Tcl_GetOpenFile \ + (tclStubsPtr->tcl_GetOpenFile) /* 167 */ +#endif /* UNIX */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#define Tcl_GetOpenFile \ + (tclStubsPtr->tcl_GetOpenFile) /* 167 */ +#endif /* MACOSX */ +#define Tcl_GetPathType \ + (tclStubsPtr->tcl_GetPathType) /* 168 */ +#define Tcl_Gets \ + (tclStubsPtr->tcl_Gets) /* 169 */ +#define Tcl_GetsObj \ + (tclStubsPtr->tcl_GetsObj) /* 170 */ +#define Tcl_GetServiceMode \ + (tclStubsPtr->tcl_GetServiceMode) /* 171 */ +#define Tcl_GetSlave \ + (tclStubsPtr->tcl_GetSlave) /* 172 */ +#define Tcl_GetStdChannel \ + (tclStubsPtr->tcl_GetStdChannel) /* 173 */ +#define Tcl_GetStringResult \ + (tclStubsPtr->tcl_GetStringResult) /* 174 */ +#define Tcl_GetVar \ + (tclStubsPtr->tcl_GetVar) /* 175 */ +#define Tcl_GetVar2 \ + (tclStubsPtr->tcl_GetVar2) /* 176 */ +#define Tcl_GlobalEval \ + (tclStubsPtr->tcl_GlobalEval) /* 177 */ +#define Tcl_GlobalEvalObj \ + (tclStubsPtr->tcl_GlobalEvalObj) /* 178 */ +#define Tcl_HideCommand \ + (tclStubsPtr->tcl_HideCommand) /* 179 */ +#define Tcl_Init \ + (tclStubsPtr->tcl_Init) /* 180 */ +#define Tcl_InitHashTable \ + (tclStubsPtr->tcl_InitHashTable) /* 181 */ +#define Tcl_InputBlocked \ + (tclStubsPtr->tcl_InputBlocked) /* 182 */ +#define Tcl_InputBuffered \ + (tclStubsPtr->tcl_InputBuffered) /* 183 */ +#define Tcl_InterpDeleted \ + (tclStubsPtr->tcl_InterpDeleted) /* 184 */ +#define Tcl_IsSafe \ + (tclStubsPtr->tcl_IsSafe) /* 185 */ +#define Tcl_JoinPath \ + (tclStubsPtr->tcl_JoinPath) /* 186 */ +#define Tcl_LinkVar \ + (tclStubsPtr->tcl_LinkVar) /* 187 */ +/* Slot 188 is reserved */ +#define Tcl_MakeFileChannel \ + (tclStubsPtr->tcl_MakeFileChannel) /* 189 */ +#define Tcl_MakeSafe \ + (tclStubsPtr->tcl_MakeSafe) /* 190 */ +#define Tcl_MakeTcpClientChannel \ + (tclStubsPtr->tcl_MakeTcpClientChannel) /* 191 */ +#define Tcl_Merge \ + (tclStubsPtr->tcl_Merge) /* 192 */ +#define Tcl_NextHashEntry \ + (tclStubsPtr->tcl_NextHashEntry) /* 193 */ +#define Tcl_NotifyChannel \ + (tclStubsPtr->tcl_NotifyChannel) /* 194 */ +#define Tcl_ObjGetVar2 \ + (tclStubsPtr->tcl_ObjGetVar2) /* 195 */ +#define Tcl_ObjSetVar2 \ + (tclStubsPtr->tcl_ObjSetVar2) /* 196 */ +#define Tcl_OpenCommandChannel \ + (tclStubsPtr->tcl_OpenCommandChannel) /* 197 */ +#define Tcl_OpenFileChannel \ + (tclStubsPtr->tcl_OpenFileChannel) /* 198 */ +#define Tcl_OpenTcpClient \ + (tclStubsPtr->tcl_OpenTcpClient) /* 199 */ +#define Tcl_OpenTcpServer \ + (tclStubsPtr->tcl_OpenTcpServer) /* 200 */ +#define Tcl_Preserve \ + (tclStubsPtr->tcl_Preserve) /* 201 */ +#define Tcl_PrintDouble \ + (tclStubsPtr->tcl_PrintDouble) /* 202 */ +#define Tcl_PutEnv \ + (tclStubsPtr->tcl_PutEnv) /* 203 */ +#define Tcl_PosixError \ + (tclStubsPtr->tcl_PosixError) /* 204 */ +#define Tcl_QueueEvent \ + (tclStubsPtr->tcl_QueueEvent) /* 205 */ +#define Tcl_Read \ + (tclStubsPtr->tcl_Read) /* 206 */ +#define Tcl_ReapDetachedProcs \ + (tclStubsPtr->tcl_ReapDetachedProcs) /* 207 */ +#define Tcl_RecordAndEval \ + (tclStubsPtr->tcl_RecordAndEval) /* 208 */ +#define Tcl_RecordAndEvalObj \ + (tclStubsPtr->tcl_RecordAndEvalObj) /* 209 */ +#define Tcl_RegisterChannel \ + (tclStubsPtr->tcl_RegisterChannel) /* 210 */ +#define Tcl_RegisterObjType \ + (tclStubsPtr->tcl_RegisterObjType) /* 211 */ +#define Tcl_RegExpCompile \ + (tclStubsPtr->tcl_RegExpCompile) /* 212 */ +#define Tcl_RegExpExec \ + (tclStubsPtr->tcl_RegExpExec) /* 213 */ +#define Tcl_RegExpMatch \ + (tclStubsPtr->tcl_RegExpMatch) /* 214 */ +#define Tcl_RegExpRange \ + (tclStubsPtr->tcl_RegExpRange) /* 215 */ +#define Tcl_Release \ + (tclStubsPtr->tcl_Release) /* 216 */ +#define Tcl_ResetResult \ + (tclStubsPtr->tcl_ResetResult) /* 217 */ +#define Tcl_ScanElement \ + (tclStubsPtr->tcl_ScanElement) /* 218 */ +#define Tcl_ScanCountedElement \ + (tclStubsPtr->tcl_ScanCountedElement) /* 219 */ +#define Tcl_SeekOld \ + (tclStubsPtr->tcl_SeekOld) /* 220 */ +#define Tcl_ServiceAll \ + (tclStubsPtr->tcl_ServiceAll) /* 221 */ +#define Tcl_ServiceEvent \ + (tclStubsPtr->tcl_ServiceEvent) /* 222 */ +#define Tcl_SetAssocData \ + (tclStubsPtr->tcl_SetAssocData) /* 223 */ +#define Tcl_SetChannelBufferSize \ + (tclStubsPtr->tcl_SetChannelBufferSize) /* 224 */ +#define Tcl_SetChannelOption \ + (tclStubsPtr->tcl_SetChannelOption) /* 225 */ +#define Tcl_SetCommandInfo \ + (tclStubsPtr->tcl_SetCommandInfo) /* 226 */ +#define Tcl_SetErrno \ + (tclStubsPtr->tcl_SetErrno) /* 227 */ +#define Tcl_SetErrorCode \ + (tclStubsPtr->tcl_SetErrorCode) /* 228 */ +#define Tcl_SetMaxBlockTime \ + (tclStubsPtr->tcl_SetMaxBlockTime) /* 229 */ +#define Tcl_SetPanicProc \ + (tclStubsPtr->tcl_SetPanicProc) /* 230 */ +#define Tcl_SetRecursionLimit \ + (tclStubsPtr->tcl_SetRecursionLimit) /* 231 */ +#define Tcl_SetResult \ + (tclStubsPtr->tcl_SetResult) /* 232 */ +#define Tcl_SetServiceMode \ + (tclStubsPtr->tcl_SetServiceMode) /* 233 */ +#define Tcl_SetObjErrorCode \ + (tclStubsPtr->tcl_SetObjErrorCode) /* 234 */ +#define Tcl_SetObjResult \ + (tclStubsPtr->tcl_SetObjResult) /* 235 */ +#define Tcl_SetStdChannel \ + (tclStubsPtr->tcl_SetStdChannel) /* 236 */ +#define Tcl_SetVar \ + (tclStubsPtr->tcl_SetVar) /* 237 */ +#define Tcl_SetVar2 \ + (tclStubsPtr->tcl_SetVar2) /* 238 */ +#define Tcl_SignalId \ + (tclStubsPtr->tcl_SignalId) /* 239 */ +#define Tcl_SignalMsg \ + (tclStubsPtr->tcl_SignalMsg) /* 240 */ +#define Tcl_SourceRCFile \ + (tclStubsPtr->tcl_SourceRCFile) /* 241 */ +#define Tcl_SplitList \ + (tclStubsPtr->tcl_SplitList) /* 242 */ +#define Tcl_SplitPath \ + (tclStubsPtr->tcl_SplitPath) /* 243 */ +#define Tcl_StaticPackage \ + (tclStubsPtr->tcl_StaticPackage) /* 244 */ +#define Tcl_StringMatch \ + (tclStubsPtr->tcl_StringMatch) /* 245 */ +#define Tcl_TellOld \ + (tclStubsPtr->tcl_TellOld) /* 246 */ +#define Tcl_TraceVar \ + (tclStubsPtr->tcl_TraceVar) /* 247 */ +#define Tcl_TraceVar2 \ + (tclStubsPtr->tcl_TraceVar2) /* 248 */ +#define Tcl_TranslateFileName \ + (tclStubsPtr->tcl_TranslateFileName) /* 249 */ +#define Tcl_Ungets \ + (tclStubsPtr->tcl_Ungets) /* 250 */ +#define Tcl_UnlinkVar \ + (tclStubsPtr->tcl_UnlinkVar) /* 251 */ +#define Tcl_UnregisterChannel \ + (tclStubsPtr->tcl_UnregisterChannel) /* 252 */ +#define Tcl_UnsetVar \ + (tclStubsPtr->tcl_UnsetVar) /* 253 */ +#define Tcl_UnsetVar2 \ + (tclStubsPtr->tcl_UnsetVar2) /* 254 */ +#define Tcl_UntraceVar \ + (tclStubsPtr->tcl_UntraceVar) /* 255 */ +#define Tcl_UntraceVar2 \ + (tclStubsPtr->tcl_UntraceVar2) /* 256 */ +#define Tcl_UpdateLinkedVar \ + (tclStubsPtr->tcl_UpdateLinkedVar) /* 257 */ +#define Tcl_UpVar \ + (tclStubsPtr->tcl_UpVar) /* 258 */ +#define Tcl_UpVar2 \ + (tclStubsPtr->tcl_UpVar2) /* 259 */ +#define Tcl_VarEval \ + (tclStubsPtr->tcl_VarEval) /* 260 */ +#define Tcl_VarTraceInfo \ + (tclStubsPtr->tcl_VarTraceInfo) /* 261 */ +#define Tcl_VarTraceInfo2 \ + (tclStubsPtr->tcl_VarTraceInfo2) /* 262 */ +#define Tcl_Write \ + (tclStubsPtr->tcl_Write) /* 263 */ +#define Tcl_WrongNumArgs \ + (tclStubsPtr->tcl_WrongNumArgs) /* 264 */ +#define Tcl_DumpActiveMemory \ + (tclStubsPtr->tcl_DumpActiveMemory) /* 265 */ +#define Tcl_ValidateAllMemory \ + (tclStubsPtr->tcl_ValidateAllMemory) /* 266 */ +#define Tcl_AppendResultVA \ + (tclStubsPtr->tcl_AppendResultVA) /* 267 */ +#define Tcl_AppendStringsToObjVA \ + (tclStubsPtr->tcl_AppendStringsToObjVA) /* 268 */ +#define Tcl_HashStats \ + (tclStubsPtr->tcl_HashStats) /* 269 */ +#define Tcl_ParseVar \ + (tclStubsPtr->tcl_ParseVar) /* 270 */ +#define Tcl_PkgPresent \ + (tclStubsPtr->tcl_PkgPresent) /* 271 */ +#define Tcl_PkgPresentEx \ + (tclStubsPtr->tcl_PkgPresentEx) /* 272 */ +#define Tcl_PkgProvide \ + (tclStubsPtr->tcl_PkgProvide) /* 273 */ +#define Tcl_PkgRequire \ + (tclStubsPtr->tcl_PkgRequire) /* 274 */ +#define Tcl_SetErrorCodeVA \ + (tclStubsPtr->tcl_SetErrorCodeVA) /* 275 */ +#define Tcl_VarEvalVA \ + (tclStubsPtr->tcl_VarEvalVA) /* 276 */ +#define Tcl_WaitPid \ + (tclStubsPtr->tcl_WaitPid) /* 277 */ +#define Tcl_PanicVA \ + (tclStubsPtr->tcl_PanicVA) /* 278 */ +#define Tcl_GetVersion \ + (tclStubsPtr->tcl_GetVersion) /* 279 */ +#define Tcl_InitMemory \ + (tclStubsPtr->tcl_InitMemory) /* 280 */ +#define Tcl_StackChannel \ + (tclStubsPtr->tcl_StackChannel) /* 281 */ +#define Tcl_UnstackChannel \ + (tclStubsPtr->tcl_UnstackChannel) /* 282 */ +#define Tcl_GetStackedChannel \ + (tclStubsPtr->tcl_GetStackedChannel) /* 283 */ +#define Tcl_SetMainLoop \ + (tclStubsPtr->tcl_SetMainLoop) /* 284 */ +/* Slot 285 is reserved */ +#define Tcl_AppendObjToObj \ + (tclStubsPtr->tcl_AppendObjToObj) /* 286 */ +#define Tcl_CreateEncoding \ + (tclStubsPtr->tcl_CreateEncoding) /* 287 */ +#define Tcl_CreateThreadExitHandler \ + (tclStubsPtr->tcl_CreateThreadExitHandler) /* 288 */ +#define Tcl_DeleteThreadExitHandler \ + (tclStubsPtr->tcl_DeleteThreadExitHandler) /* 289 */ +#define Tcl_DiscardResult \ + (tclStubsPtr->tcl_DiscardResult) /* 290 */ +#define Tcl_EvalEx \ + (tclStubsPtr->tcl_EvalEx) /* 291 */ +#define Tcl_EvalObjv \ + (tclStubsPtr->tcl_EvalObjv) /* 292 */ +#define Tcl_EvalObjEx \ + (tclStubsPtr->tcl_EvalObjEx) /* 293 */ +#define Tcl_ExitThread \ + (tclStubsPtr->tcl_ExitThread) /* 294 */ +#define Tcl_ExternalToUtf \ + (tclStubsPtr->tcl_ExternalToUtf) /* 295 */ +#define Tcl_ExternalToUtfDString \ + (tclStubsPtr->tcl_ExternalToUtfDString) /* 296 */ +#define Tcl_FinalizeThread \ + (tclStubsPtr->tcl_FinalizeThread) /* 297 */ +#define Tcl_FinalizeNotifier \ + (tclStubsPtr->tcl_FinalizeNotifier) /* 298 */ +#define Tcl_FreeEncoding \ + (tclStubsPtr->tcl_FreeEncoding) /* 299 */ +#define Tcl_GetCurrentThread \ + (tclStubsPtr->tcl_GetCurrentThread) /* 300 */ +#define Tcl_GetEncoding \ + (tclStubsPtr->tcl_GetEncoding) /* 301 */ +#define Tcl_GetEncodingName \ + (tclStubsPtr->tcl_GetEncodingName) /* 302 */ +#define Tcl_GetEncodingNames \ + (tclStubsPtr->tcl_GetEncodingNames) /* 303 */ +#define Tcl_GetIndexFromObjStruct \ + (tclStubsPtr->tcl_GetIndexFromObjStruct) /* 304 */ +#define Tcl_GetThreadData \ + (tclStubsPtr->tcl_GetThreadData) /* 305 */ +#define Tcl_GetVar2Ex \ + (tclStubsPtr->tcl_GetVar2Ex) /* 306 */ +#define Tcl_InitNotifier \ + (tclStubsPtr->tcl_InitNotifier) /* 307 */ +#define Tcl_MutexLock \ + (tclStubsPtr->tcl_MutexLock) /* 308 */ +#define Tcl_MutexUnlock \ + (tclStubsPtr->tcl_MutexUnlock) /* 309 */ +#define Tcl_ConditionNotify \ + (tclStubsPtr->tcl_ConditionNotify) /* 310 */ +#define Tcl_ConditionWait \ + (tclStubsPtr->tcl_ConditionWait) /* 311 */ +#define Tcl_NumUtfChars \ + (tclStubsPtr->tcl_NumUtfChars) /* 312 */ +#define Tcl_ReadChars \ + (tclStubsPtr->tcl_ReadChars) /* 313 */ +#define Tcl_RestoreResult \ + (tclStubsPtr->tcl_RestoreResult) /* 314 */ +#define Tcl_SaveResult \ + (tclStubsPtr->tcl_SaveResult) /* 315 */ +#define Tcl_SetSystemEncoding \ + (tclStubsPtr->tcl_SetSystemEncoding) /* 316 */ +#define Tcl_SetVar2Ex \ + (tclStubsPtr->tcl_SetVar2Ex) /* 317 */ +#define Tcl_ThreadAlert \ + (tclStubsPtr->tcl_ThreadAlert) /* 318 */ +#define Tcl_ThreadQueueEvent \ + (tclStubsPtr->tcl_ThreadQueueEvent) /* 319 */ +#define Tcl_UniCharAtIndex \ + (tclStubsPtr->tcl_UniCharAtIndex) /* 320 */ +#define Tcl_UniCharToLower \ + (tclStubsPtr->tcl_UniCharToLower) /* 321 */ +#define Tcl_UniCharToTitle \ + (tclStubsPtr->tcl_UniCharToTitle) /* 322 */ +#define Tcl_UniCharToUpper \ + (tclStubsPtr->tcl_UniCharToUpper) /* 323 */ +#define Tcl_UniCharToUtf \ + (tclStubsPtr->tcl_UniCharToUtf) /* 324 */ +#define Tcl_UtfAtIndex \ + (tclStubsPtr->tcl_UtfAtIndex) /* 325 */ +#define Tcl_UtfCharComplete \ + (tclStubsPtr->tcl_UtfCharComplete) /* 326 */ +#define Tcl_UtfBackslash \ + (tclStubsPtr->tcl_UtfBackslash) /* 327 */ +#define Tcl_UtfFindFirst \ + (tclStubsPtr->tcl_UtfFindFirst) /* 328 */ +#define Tcl_UtfFindLast \ + (tclStubsPtr->tcl_UtfFindLast) /* 329 */ +#define Tcl_UtfNext \ + (tclStubsPtr->tcl_UtfNext) /* 330 */ +#define Tcl_UtfPrev \ + (tclStubsPtr->tcl_UtfPrev) /* 331 */ +#define Tcl_UtfToExternal \ + (tclStubsPtr->tcl_UtfToExternal) /* 332 */ +#define Tcl_UtfToExternalDString \ + (tclStubsPtr->tcl_UtfToExternalDString) /* 333 */ +#define Tcl_UtfToLower \ + (tclStubsPtr->tcl_UtfToLower) /* 334 */ +#define Tcl_UtfToTitle \ + (tclStubsPtr->tcl_UtfToTitle) /* 335 */ +#define Tcl_UtfToUniChar \ + (tclStubsPtr->tcl_UtfToUniChar) /* 336 */ +#define Tcl_UtfToUpper \ + (tclStubsPtr->tcl_UtfToUpper) /* 337 */ +#define Tcl_WriteChars \ + (tclStubsPtr->tcl_WriteChars) /* 338 */ +#define Tcl_WriteObj \ + (tclStubsPtr->tcl_WriteObj) /* 339 */ +#define Tcl_GetString \ + (tclStubsPtr->tcl_GetString) /* 340 */ +#define Tcl_GetDefaultEncodingDir \ + (tclStubsPtr->tcl_GetDefaultEncodingDir) /* 341 */ +#define Tcl_SetDefaultEncodingDir \ + (tclStubsPtr->tcl_SetDefaultEncodingDir) /* 342 */ +#define Tcl_AlertNotifier \ + (tclStubsPtr->tcl_AlertNotifier) /* 343 */ +#define Tcl_ServiceModeHook \ + (tclStubsPtr->tcl_ServiceModeHook) /* 344 */ +#define Tcl_UniCharIsAlnum \ + (tclStubsPtr->tcl_UniCharIsAlnum) /* 345 */ +#define Tcl_UniCharIsAlpha \ + (tclStubsPtr->tcl_UniCharIsAlpha) /* 346 */ +#define Tcl_UniCharIsDigit \ + (tclStubsPtr->tcl_UniCharIsDigit) /* 347 */ +#define Tcl_UniCharIsLower \ + (tclStubsPtr->tcl_UniCharIsLower) /* 348 */ +#define Tcl_UniCharIsSpace \ + (tclStubsPtr->tcl_UniCharIsSpace) /* 349 */ +#define Tcl_UniCharIsUpper \ + (tclStubsPtr->tcl_UniCharIsUpper) /* 350 */ +#define Tcl_UniCharIsWordChar \ + (tclStubsPtr->tcl_UniCharIsWordChar) /* 351 */ +#define Tcl_UniCharLen \ + (tclStubsPtr->tcl_UniCharLen) /* 352 */ +#define Tcl_UniCharNcmp \ + (tclStubsPtr->tcl_UniCharNcmp) /* 353 */ +#define Tcl_UniCharToUtfDString \ + (tclStubsPtr->tcl_UniCharToUtfDString) /* 354 */ +#define Tcl_UtfToUniCharDString \ + (tclStubsPtr->tcl_UtfToUniCharDString) /* 355 */ +#define Tcl_GetRegExpFromObj \ + (tclStubsPtr->tcl_GetRegExpFromObj) /* 356 */ +#define Tcl_EvalTokens \ + (tclStubsPtr->tcl_EvalTokens) /* 357 */ +#define Tcl_FreeParse \ + (tclStubsPtr->tcl_FreeParse) /* 358 */ +#define Tcl_LogCommandInfo \ + (tclStubsPtr->tcl_LogCommandInfo) /* 359 */ +#define Tcl_ParseBraces \ + (tclStubsPtr->tcl_ParseBraces) /* 360 */ +#define Tcl_ParseCommand \ + (tclStubsPtr->tcl_ParseCommand) /* 361 */ +#define Tcl_ParseExpr \ + (tclStubsPtr->tcl_ParseExpr) /* 362 */ +#define Tcl_ParseQuotedString \ + (tclStubsPtr->tcl_ParseQuotedString) /* 363 */ +#define Tcl_ParseVarName \ + (tclStubsPtr->tcl_ParseVarName) /* 364 */ +#define Tcl_GetCwd \ + (tclStubsPtr->tcl_GetCwd) /* 365 */ +#define Tcl_Chdir \ + (tclStubsPtr->tcl_Chdir) /* 366 */ +#define Tcl_Access \ + (tclStubsPtr->tcl_Access) /* 367 */ +#define Tcl_Stat \ + (tclStubsPtr->tcl_Stat) /* 368 */ +#define Tcl_UtfNcmp \ + (tclStubsPtr->tcl_UtfNcmp) /* 369 */ +#define Tcl_UtfNcasecmp \ + (tclStubsPtr->tcl_UtfNcasecmp) /* 370 */ +#define Tcl_StringCaseMatch \ + (tclStubsPtr->tcl_StringCaseMatch) /* 371 */ +#define Tcl_UniCharIsControl \ + (tclStubsPtr->tcl_UniCharIsControl) /* 372 */ +#define Tcl_UniCharIsGraph \ + (tclStubsPtr->tcl_UniCharIsGraph) /* 373 */ +#define Tcl_UniCharIsPrint \ + (tclStubsPtr->tcl_UniCharIsPrint) /* 374 */ +#define Tcl_UniCharIsPunct \ + (tclStubsPtr->tcl_UniCharIsPunct) /* 375 */ +#define Tcl_RegExpExecObj \ + (tclStubsPtr->tcl_RegExpExecObj) /* 376 */ +#define Tcl_RegExpGetInfo \ + (tclStubsPtr->tcl_RegExpGetInfo) /* 377 */ +#define Tcl_NewUnicodeObj \ + (tclStubsPtr->tcl_NewUnicodeObj) /* 378 */ +#define Tcl_SetUnicodeObj \ + (tclStubsPtr->tcl_SetUnicodeObj) /* 379 */ +#define Tcl_GetCharLength \ + (tclStubsPtr->tcl_GetCharLength) /* 380 */ +#define Tcl_GetUniChar \ + (tclStubsPtr->tcl_GetUniChar) /* 381 */ +#define Tcl_GetUnicode \ + (tclStubsPtr->tcl_GetUnicode) /* 382 */ +#define Tcl_GetRange \ + (tclStubsPtr->tcl_GetRange) /* 383 */ +#define Tcl_AppendUnicodeToObj \ + (tclStubsPtr->tcl_AppendUnicodeToObj) /* 384 */ +#define Tcl_RegExpMatchObj \ + (tclStubsPtr->tcl_RegExpMatchObj) /* 385 */ +#define Tcl_SetNotifier \ + (tclStubsPtr->tcl_SetNotifier) /* 386 */ +#define Tcl_GetAllocMutex \ + (tclStubsPtr->tcl_GetAllocMutex) /* 387 */ +#define Tcl_GetChannelNames \ + (tclStubsPtr->tcl_GetChannelNames) /* 388 */ +#define Tcl_GetChannelNamesEx \ + (tclStubsPtr->tcl_GetChannelNamesEx) /* 389 */ +#define Tcl_ProcObjCmd \ + (tclStubsPtr->tcl_ProcObjCmd) /* 390 */ +#define Tcl_ConditionFinalize \ + (tclStubsPtr->tcl_ConditionFinalize) /* 391 */ +#define Tcl_MutexFinalize \ + (tclStubsPtr->tcl_MutexFinalize) /* 392 */ +#define Tcl_CreateThread \ + (tclStubsPtr->tcl_CreateThread) /* 393 */ +#define Tcl_ReadRaw \ + (tclStubsPtr->tcl_ReadRaw) /* 394 */ +#define Tcl_WriteRaw \ + (tclStubsPtr->tcl_WriteRaw) /* 395 */ +#define Tcl_GetTopChannel \ + (tclStubsPtr->tcl_GetTopChannel) /* 396 */ +#define Tcl_ChannelBuffered \ + (tclStubsPtr->tcl_ChannelBuffered) /* 397 */ +#define Tcl_ChannelName \ + (tclStubsPtr->tcl_ChannelName) /* 398 */ +#define Tcl_ChannelVersion \ + (tclStubsPtr->tcl_ChannelVersion) /* 399 */ +#define Tcl_ChannelBlockModeProc \ + (tclStubsPtr->tcl_ChannelBlockModeProc) /* 400 */ +#define Tcl_ChannelCloseProc \ + (tclStubsPtr->tcl_ChannelCloseProc) /* 401 */ +#define Tcl_ChannelClose2Proc \ + (tclStubsPtr->tcl_ChannelClose2Proc) /* 402 */ +#define Tcl_ChannelInputProc \ + (tclStubsPtr->tcl_ChannelInputProc) /* 403 */ +#define Tcl_ChannelOutputProc \ + (tclStubsPtr->tcl_ChannelOutputProc) /* 404 */ +#define Tcl_ChannelSeekProc \ + (tclStubsPtr->tcl_ChannelSeekProc) /* 405 */ +#define Tcl_ChannelSetOptionProc \ + (tclStubsPtr->tcl_ChannelSetOptionProc) /* 406 */ +#define Tcl_ChannelGetOptionProc \ + (tclStubsPtr->tcl_ChannelGetOptionProc) /* 407 */ +#define Tcl_ChannelWatchProc \ + (tclStubsPtr->tcl_ChannelWatchProc) /* 408 */ +#define Tcl_ChannelGetHandleProc \ + (tclStubsPtr->tcl_ChannelGetHandleProc) /* 409 */ +#define Tcl_ChannelFlushProc \ + (tclStubsPtr->tcl_ChannelFlushProc) /* 410 */ +#define Tcl_ChannelHandlerProc \ + (tclStubsPtr->tcl_ChannelHandlerProc) /* 411 */ +#define Tcl_JoinThread \ + (tclStubsPtr->tcl_JoinThread) /* 412 */ +#define Tcl_IsChannelShared \ + (tclStubsPtr->tcl_IsChannelShared) /* 413 */ +#define Tcl_IsChannelRegistered \ + (tclStubsPtr->tcl_IsChannelRegistered) /* 414 */ +#define Tcl_CutChannel \ + (tclStubsPtr->tcl_CutChannel) /* 415 */ +#define Tcl_SpliceChannel \ + (tclStubsPtr->tcl_SpliceChannel) /* 416 */ +#define Tcl_ClearChannelHandlers \ + (tclStubsPtr->tcl_ClearChannelHandlers) /* 417 */ +#define Tcl_IsChannelExisting \ + (tclStubsPtr->tcl_IsChannelExisting) /* 418 */ +#define Tcl_UniCharNcasecmp \ + (tclStubsPtr->tcl_UniCharNcasecmp) /* 419 */ +#define Tcl_UniCharCaseMatch \ + (tclStubsPtr->tcl_UniCharCaseMatch) /* 420 */ +#define Tcl_FindHashEntry \ + (tclStubsPtr->tcl_FindHashEntry) /* 421 */ +#define Tcl_CreateHashEntry \ + (tclStubsPtr->tcl_CreateHashEntry) /* 422 */ +#define Tcl_InitCustomHashTable \ + (tclStubsPtr->tcl_InitCustomHashTable) /* 423 */ +#define Tcl_InitObjHashTable \ + (tclStubsPtr->tcl_InitObjHashTable) /* 424 */ +#define Tcl_CommandTraceInfo \ + (tclStubsPtr->tcl_CommandTraceInfo) /* 425 */ +#define Tcl_TraceCommand \ + (tclStubsPtr->tcl_TraceCommand) /* 426 */ +#define Tcl_UntraceCommand \ + (tclStubsPtr->tcl_UntraceCommand) /* 427 */ +#define Tcl_AttemptAlloc \ + (tclStubsPtr->tcl_AttemptAlloc) /* 428 */ +#define Tcl_AttemptDbCkalloc \ + (tclStubsPtr->tcl_AttemptDbCkalloc) /* 429 */ +#define Tcl_AttemptRealloc \ + (tclStubsPtr->tcl_AttemptRealloc) /* 430 */ +#define Tcl_AttemptDbCkrealloc \ + (tclStubsPtr->tcl_AttemptDbCkrealloc) /* 431 */ +#define Tcl_AttemptSetObjLength \ + (tclStubsPtr->tcl_AttemptSetObjLength) /* 432 */ +#define Tcl_GetChannelThread \ + (tclStubsPtr->tcl_GetChannelThread) /* 433 */ +#define Tcl_GetUnicodeFromObj \ + (tclStubsPtr->tcl_GetUnicodeFromObj) /* 434 */ +#define Tcl_GetMathFuncInfo \ + (tclStubsPtr->tcl_GetMathFuncInfo) /* 435 */ +#define Tcl_ListMathFuncs \ + (tclStubsPtr->tcl_ListMathFuncs) /* 436 */ +#define Tcl_SubstObj \ + (tclStubsPtr->tcl_SubstObj) /* 437 */ +#define Tcl_DetachChannel \ + (tclStubsPtr->tcl_DetachChannel) /* 438 */ +#define Tcl_IsStandardChannel \ + (tclStubsPtr->tcl_IsStandardChannel) /* 439 */ +#define Tcl_FSCopyFile \ + (tclStubsPtr->tcl_FSCopyFile) /* 440 */ +#define Tcl_FSCopyDirectory \ + (tclStubsPtr->tcl_FSCopyDirectory) /* 441 */ +#define Tcl_FSCreateDirectory \ + (tclStubsPtr->tcl_FSCreateDirectory) /* 442 */ +#define Tcl_FSDeleteFile \ + (tclStubsPtr->tcl_FSDeleteFile) /* 443 */ +#define Tcl_FSLoadFile \ + (tclStubsPtr->tcl_FSLoadFile) /* 444 */ +#define Tcl_FSMatchInDirectory \ + (tclStubsPtr->tcl_FSMatchInDirectory) /* 445 */ +#define Tcl_FSLink \ + (tclStubsPtr->tcl_FSLink) /* 446 */ +#define Tcl_FSRemoveDirectory \ + (tclStubsPtr->tcl_FSRemoveDirectory) /* 447 */ +#define Tcl_FSRenameFile \ + (tclStubsPtr->tcl_FSRenameFile) /* 448 */ +#define Tcl_FSLstat \ + (tclStubsPtr->tcl_FSLstat) /* 449 */ +#define Tcl_FSUtime \ + (tclStubsPtr->tcl_FSUtime) /* 450 */ +#define Tcl_FSFileAttrsGet \ + (tclStubsPtr->tcl_FSFileAttrsGet) /* 451 */ +#define Tcl_FSFileAttrsSet \ + (tclStubsPtr->tcl_FSFileAttrsSet) /* 452 */ +#define Tcl_FSFileAttrStrings \ + (tclStubsPtr->tcl_FSFileAttrStrings) /* 453 */ +#define Tcl_FSStat \ + (tclStubsPtr->tcl_FSStat) /* 454 */ +#define Tcl_FSAccess \ + (tclStubsPtr->tcl_FSAccess) /* 455 */ +#define Tcl_FSOpenFileChannel \ + (tclStubsPtr->tcl_FSOpenFileChannel) /* 456 */ +#define Tcl_FSGetCwd \ + (tclStubsPtr->tcl_FSGetCwd) /* 457 */ +#define Tcl_FSChdir \ + (tclStubsPtr->tcl_FSChdir) /* 458 */ +#define Tcl_FSConvertToPathType \ + (tclStubsPtr->tcl_FSConvertToPathType) /* 459 */ +#define Tcl_FSJoinPath \ + (tclStubsPtr->tcl_FSJoinPath) /* 460 */ +#define Tcl_FSSplitPath \ + (tclStubsPtr->tcl_FSSplitPath) /* 461 */ +#define Tcl_FSEqualPaths \ + (tclStubsPtr->tcl_FSEqualPaths) /* 462 */ +#define Tcl_FSGetNormalizedPath \ + (tclStubsPtr->tcl_FSGetNormalizedPath) /* 463 */ +#define Tcl_FSJoinToPath \ + (tclStubsPtr->tcl_FSJoinToPath) /* 464 */ +#define Tcl_FSGetInternalRep \ + (tclStubsPtr->tcl_FSGetInternalRep) /* 465 */ +#define Tcl_FSGetTranslatedPath \ + (tclStubsPtr->tcl_FSGetTranslatedPath) /* 466 */ +#define Tcl_FSEvalFile \ + (tclStubsPtr->tcl_FSEvalFile) /* 467 */ +#define Tcl_FSNewNativePath \ + (tclStubsPtr->tcl_FSNewNativePath) /* 468 */ +#define Tcl_FSGetNativePath \ + (tclStubsPtr->tcl_FSGetNativePath) /* 469 */ +#define Tcl_FSFileSystemInfo \ + (tclStubsPtr->tcl_FSFileSystemInfo) /* 470 */ +#define Tcl_FSPathSeparator \ + (tclStubsPtr->tcl_FSPathSeparator) /* 471 */ +#define Tcl_FSListVolumes \ + (tclStubsPtr->tcl_FSListVolumes) /* 472 */ +#define Tcl_FSRegister \ + (tclStubsPtr->tcl_FSRegister) /* 473 */ +#define Tcl_FSUnregister \ + (tclStubsPtr->tcl_FSUnregister) /* 474 */ +#define Tcl_FSData \ + (tclStubsPtr->tcl_FSData) /* 475 */ +#define Tcl_FSGetTranslatedStringPath \ + (tclStubsPtr->tcl_FSGetTranslatedStringPath) /* 476 */ +#define Tcl_FSGetFileSystemForPath \ + (tclStubsPtr->tcl_FSGetFileSystemForPath) /* 477 */ +#define Tcl_FSGetPathType \ + (tclStubsPtr->tcl_FSGetPathType) /* 478 */ +#define Tcl_OutputBuffered \ + (tclStubsPtr->tcl_OutputBuffered) /* 479 */ +#define Tcl_FSMountsChanged \ + (tclStubsPtr->tcl_FSMountsChanged) /* 480 */ +#define Tcl_EvalTokensStandard \ + (tclStubsPtr->tcl_EvalTokensStandard) /* 481 */ +#define Tcl_GetTime \ + (tclStubsPtr->tcl_GetTime) /* 482 */ +#define Tcl_CreateObjTrace \ + (tclStubsPtr->tcl_CreateObjTrace) /* 483 */ +#define Tcl_GetCommandInfoFromToken \ + (tclStubsPtr->tcl_GetCommandInfoFromToken) /* 484 */ +#define Tcl_SetCommandInfoFromToken \ + (tclStubsPtr->tcl_SetCommandInfoFromToken) /* 485 */ +#define Tcl_DbNewWideIntObj \ + (tclStubsPtr->tcl_DbNewWideIntObj) /* 486 */ +#define Tcl_GetWideIntFromObj \ + (tclStubsPtr->tcl_GetWideIntFromObj) /* 487 */ +#define Tcl_NewWideIntObj \ + (tclStubsPtr->tcl_NewWideIntObj) /* 488 */ +#define Tcl_SetWideIntObj \ + (tclStubsPtr->tcl_SetWideIntObj) /* 489 */ +#define Tcl_AllocStatBuf \ + (tclStubsPtr->tcl_AllocStatBuf) /* 490 */ +#define Tcl_Seek \ + (tclStubsPtr->tcl_Seek) /* 491 */ +#define Tcl_Tell \ + (tclStubsPtr->tcl_Tell) /* 492 */ +#define Tcl_ChannelWideSeekProc \ + (tclStubsPtr->tcl_ChannelWideSeekProc) /* 493 */ +#define Tcl_DictObjPut \ + (tclStubsPtr->tcl_DictObjPut) /* 494 */ +#define Tcl_DictObjGet \ + (tclStubsPtr->tcl_DictObjGet) /* 495 */ +#define Tcl_DictObjRemove \ + (tclStubsPtr->tcl_DictObjRemove) /* 496 */ +#define Tcl_DictObjSize \ + (tclStubsPtr->tcl_DictObjSize) /* 497 */ +#define Tcl_DictObjFirst \ + (tclStubsPtr->tcl_DictObjFirst) /* 498 */ +#define Tcl_DictObjNext \ + (tclStubsPtr->tcl_DictObjNext) /* 499 */ +#define Tcl_DictObjDone \ + (tclStubsPtr->tcl_DictObjDone) /* 500 */ +#define Tcl_DictObjPutKeyList \ + (tclStubsPtr->tcl_DictObjPutKeyList) /* 501 */ +#define Tcl_DictObjRemoveKeyList \ + (tclStubsPtr->tcl_DictObjRemoveKeyList) /* 502 */ +#define Tcl_NewDictObj \ + (tclStubsPtr->tcl_NewDictObj) /* 503 */ +#define Tcl_DbNewDictObj \ + (tclStubsPtr->tcl_DbNewDictObj) /* 504 */ +#define Tcl_RegisterConfig \ + (tclStubsPtr->tcl_RegisterConfig) /* 505 */ +#define Tcl_CreateNamespace \ + (tclStubsPtr->tcl_CreateNamespace) /* 506 */ +#define Tcl_DeleteNamespace \ + (tclStubsPtr->tcl_DeleteNamespace) /* 507 */ +#define Tcl_AppendExportList \ + (tclStubsPtr->tcl_AppendExportList) /* 508 */ +#define Tcl_Export \ + (tclStubsPtr->tcl_Export) /* 509 */ +#define Tcl_Import \ + (tclStubsPtr->tcl_Import) /* 510 */ +#define Tcl_ForgetImport \ + (tclStubsPtr->tcl_ForgetImport) /* 511 */ +#define Tcl_GetCurrentNamespace \ + (tclStubsPtr->tcl_GetCurrentNamespace) /* 512 */ +#define Tcl_GetGlobalNamespace \ + (tclStubsPtr->tcl_GetGlobalNamespace) /* 513 */ +#define Tcl_FindNamespace \ + (tclStubsPtr->tcl_FindNamespace) /* 514 */ +#define Tcl_FindCommand \ + (tclStubsPtr->tcl_FindCommand) /* 515 */ +#define Tcl_GetCommandFromObj \ + (tclStubsPtr->tcl_GetCommandFromObj) /* 516 */ +#define Tcl_GetCommandFullName \ + (tclStubsPtr->tcl_GetCommandFullName) /* 517 */ +#define Tcl_FSEvalFileEx \ + (tclStubsPtr->tcl_FSEvalFileEx) /* 518 */ +#define Tcl_SetExitProc \ + (tclStubsPtr->tcl_SetExitProc) /* 519 */ +#define Tcl_LimitAddHandler \ + (tclStubsPtr->tcl_LimitAddHandler) /* 520 */ +#define Tcl_LimitRemoveHandler \ + (tclStubsPtr->tcl_LimitRemoveHandler) /* 521 */ +#define Tcl_LimitReady \ + (tclStubsPtr->tcl_LimitReady) /* 522 */ +#define Tcl_LimitCheck \ + (tclStubsPtr->tcl_LimitCheck) /* 523 */ +#define Tcl_LimitExceeded \ + (tclStubsPtr->tcl_LimitExceeded) /* 524 */ +#define Tcl_LimitSetCommands \ + (tclStubsPtr->tcl_LimitSetCommands) /* 525 */ +#define Tcl_LimitSetTime \ + (tclStubsPtr->tcl_LimitSetTime) /* 526 */ +#define Tcl_LimitSetGranularity \ + (tclStubsPtr->tcl_LimitSetGranularity) /* 527 */ +#define Tcl_LimitTypeEnabled \ + (tclStubsPtr->tcl_LimitTypeEnabled) /* 528 */ +#define Tcl_LimitTypeExceeded \ + (tclStubsPtr->tcl_LimitTypeExceeded) /* 529 */ +#define Tcl_LimitTypeSet \ + (tclStubsPtr->tcl_LimitTypeSet) /* 530 */ +#define Tcl_LimitTypeReset \ + (tclStubsPtr->tcl_LimitTypeReset) /* 531 */ +#define Tcl_LimitGetCommands \ + (tclStubsPtr->tcl_LimitGetCommands) /* 532 */ +#define Tcl_LimitGetTime \ + (tclStubsPtr->tcl_LimitGetTime) /* 533 */ +#define Tcl_LimitGetGranularity \ + (tclStubsPtr->tcl_LimitGetGranularity) /* 534 */ +#define Tcl_SaveInterpState \ + (tclStubsPtr->tcl_SaveInterpState) /* 535 */ +#define Tcl_RestoreInterpState \ + (tclStubsPtr->tcl_RestoreInterpState) /* 536 */ +#define Tcl_DiscardInterpState \ + (tclStubsPtr->tcl_DiscardInterpState) /* 537 */ +#define Tcl_SetReturnOptions \ + (tclStubsPtr->tcl_SetReturnOptions) /* 538 */ +#define Tcl_GetReturnOptions \ + (tclStubsPtr->tcl_GetReturnOptions) /* 539 */ +#define Tcl_IsEnsemble \ + (tclStubsPtr->tcl_IsEnsemble) /* 540 */ +#define Tcl_CreateEnsemble \ + (tclStubsPtr->tcl_CreateEnsemble) /* 541 */ +#define Tcl_FindEnsemble \ + (tclStubsPtr->tcl_FindEnsemble) /* 542 */ +#define Tcl_SetEnsembleSubcommandList \ + (tclStubsPtr->tcl_SetEnsembleSubcommandList) /* 543 */ +#define Tcl_SetEnsembleMappingDict \ + (tclStubsPtr->tcl_SetEnsembleMappingDict) /* 544 */ +#define Tcl_SetEnsembleUnknownHandler \ + (tclStubsPtr->tcl_SetEnsembleUnknownHandler) /* 545 */ +#define Tcl_SetEnsembleFlags \ + (tclStubsPtr->tcl_SetEnsembleFlags) /* 546 */ +#define Tcl_GetEnsembleSubcommandList \ + (tclStubsPtr->tcl_GetEnsembleSubcommandList) /* 547 */ +#define Tcl_GetEnsembleMappingDict \ + (tclStubsPtr->tcl_GetEnsembleMappingDict) /* 548 */ +#define Tcl_GetEnsembleUnknownHandler \ + (tclStubsPtr->tcl_GetEnsembleUnknownHandler) /* 549 */ +#define Tcl_GetEnsembleFlags \ + (tclStubsPtr->tcl_GetEnsembleFlags) /* 550 */ +#define Tcl_GetEnsembleNamespace \ + (tclStubsPtr->tcl_GetEnsembleNamespace) /* 551 */ +#define Tcl_SetTimeProc \ + (tclStubsPtr->tcl_SetTimeProc) /* 552 */ +#define Tcl_QueryTimeProc \ + (tclStubsPtr->tcl_QueryTimeProc) /* 553 */ +#define Tcl_ChannelThreadActionProc \ + (tclStubsPtr->tcl_ChannelThreadActionProc) /* 554 */ +#define Tcl_NewBignumObj \ + (tclStubsPtr->tcl_NewBignumObj) /* 555 */ +#define Tcl_DbNewBignumObj \ + (tclStubsPtr->tcl_DbNewBignumObj) /* 556 */ +#define Tcl_SetBignumObj \ + (tclStubsPtr->tcl_SetBignumObj) /* 557 */ +#define Tcl_GetBignumFromObj \ + (tclStubsPtr->tcl_GetBignumFromObj) /* 558 */ +#define Tcl_TakeBignumFromObj \ + (tclStubsPtr->tcl_TakeBignumFromObj) /* 559 */ +#define Tcl_TruncateChannel \ + (tclStubsPtr->tcl_TruncateChannel) /* 560 */ +#define Tcl_ChannelTruncateProc \ + (tclStubsPtr->tcl_ChannelTruncateProc) /* 561 */ +#define Tcl_SetChannelErrorInterp \ + (tclStubsPtr->tcl_SetChannelErrorInterp) /* 562 */ +#define Tcl_GetChannelErrorInterp \ + (tclStubsPtr->tcl_GetChannelErrorInterp) /* 563 */ +#define Tcl_SetChannelError \ + (tclStubsPtr->tcl_SetChannelError) /* 564 */ +#define Tcl_GetChannelError \ + (tclStubsPtr->tcl_GetChannelError) /* 565 */ +#define Tcl_InitBignumFromDouble \ + (tclStubsPtr->tcl_InitBignumFromDouble) /* 566 */ +#define Tcl_GetNamespaceUnknownHandler \ + (tclStubsPtr->tcl_GetNamespaceUnknownHandler) /* 567 */ +#define Tcl_SetNamespaceUnknownHandler \ + (tclStubsPtr->tcl_SetNamespaceUnknownHandler) /* 568 */ +#define Tcl_GetEncodingFromObj \ + (tclStubsPtr->tcl_GetEncodingFromObj) /* 569 */ +#define Tcl_GetEncodingSearchPath \ + (tclStubsPtr->tcl_GetEncodingSearchPath) /* 570 */ +#define Tcl_SetEncodingSearchPath \ + (tclStubsPtr->tcl_SetEncodingSearchPath) /* 571 */ +#define Tcl_GetEncodingNameFromEnvironment \ + (tclStubsPtr->tcl_GetEncodingNameFromEnvironment) /* 572 */ +#define Tcl_PkgRequireProc \ + (tclStubsPtr->tcl_PkgRequireProc) /* 573 */ +#define Tcl_AppendObjToErrorInfo \ + (tclStubsPtr->tcl_AppendObjToErrorInfo) /* 574 */ +#define Tcl_AppendLimitedToObj \ + (tclStubsPtr->tcl_AppendLimitedToObj) /* 575 */ +#define Tcl_Format \ + (tclStubsPtr->tcl_Format) /* 576 */ +#define Tcl_AppendFormatToObj \ + (tclStubsPtr->tcl_AppendFormatToObj) /* 577 */ +#define Tcl_ObjPrintf \ + (tclStubsPtr->tcl_ObjPrintf) /* 578 */ +#define Tcl_AppendPrintfToObj \ + (tclStubsPtr->tcl_AppendPrintfToObj) /* 579 */ +#define Tcl_CancelEval \ + (tclStubsPtr->tcl_CancelEval) /* 580 */ +#define Tcl_Canceled \ + (tclStubsPtr->tcl_Canceled) /* 581 */ +#define Tcl_CreatePipe \ + (tclStubsPtr->tcl_CreatePipe) /* 582 */ +#define Tcl_NRCreateCommand \ + (tclStubsPtr->tcl_NRCreateCommand) /* 583 */ +#define Tcl_NREvalObj \ + (tclStubsPtr->tcl_NREvalObj) /* 584 */ +#define Tcl_NREvalObjv \ + (tclStubsPtr->tcl_NREvalObjv) /* 585 */ +#define Tcl_NRCmdSwap \ + (tclStubsPtr->tcl_NRCmdSwap) /* 586 */ +#define Tcl_NRAddCallback \ + (tclStubsPtr->tcl_NRAddCallback) /* 587 */ +#define Tcl_NRCallObjProc \ + (tclStubsPtr->tcl_NRCallObjProc) /* 588 */ +#define Tcl_GetFSDeviceFromStat \ + (tclStubsPtr->tcl_GetFSDeviceFromStat) /* 589 */ +#define Tcl_GetFSInodeFromStat \ + (tclStubsPtr->tcl_GetFSInodeFromStat) /* 590 */ +#define Tcl_GetModeFromStat \ + (tclStubsPtr->tcl_GetModeFromStat) /* 591 */ +#define Tcl_GetLinkCountFromStat \ + (tclStubsPtr->tcl_GetLinkCountFromStat) /* 592 */ +#define Tcl_GetUserIdFromStat \ + (tclStubsPtr->tcl_GetUserIdFromStat) /* 593 */ +#define Tcl_GetGroupIdFromStat \ + (tclStubsPtr->tcl_GetGroupIdFromStat) /* 594 */ +#define Tcl_GetDeviceTypeFromStat \ + (tclStubsPtr->tcl_GetDeviceTypeFromStat) /* 595 */ +#define Tcl_GetAccessTimeFromStat \ + (tclStubsPtr->tcl_GetAccessTimeFromStat) /* 596 */ +#define Tcl_GetModificationTimeFromStat \ + (tclStubsPtr->tcl_GetModificationTimeFromStat) /* 597 */ +#define Tcl_GetChangeTimeFromStat \ + (tclStubsPtr->tcl_GetChangeTimeFromStat) /* 598 */ +#define Tcl_GetSizeFromStat \ + (tclStubsPtr->tcl_GetSizeFromStat) /* 599 */ +#define Tcl_GetBlocksFromStat \ + (tclStubsPtr->tcl_GetBlocksFromStat) /* 600 */ +#define Tcl_GetBlockSizeFromStat \ + (tclStubsPtr->tcl_GetBlockSizeFromStat) /* 601 */ +#define Tcl_SetEnsembleParameterList \ + (tclStubsPtr->tcl_SetEnsembleParameterList) /* 602 */ +#define Tcl_GetEnsembleParameterList \ + (tclStubsPtr->tcl_GetEnsembleParameterList) /* 603 */ +#define Tcl_ParseArgsObjv \ + (tclStubsPtr->tcl_ParseArgsObjv) /* 604 */ +#define Tcl_GetErrorLine \ + (tclStubsPtr->tcl_GetErrorLine) /* 605 */ +#define Tcl_SetErrorLine \ + (tclStubsPtr->tcl_SetErrorLine) /* 606 */ +#define Tcl_TransferResult \ + (tclStubsPtr->tcl_TransferResult) /* 607 */ +#define Tcl_InterpActive \ + (tclStubsPtr->tcl_InterpActive) /* 608 */ +#define Tcl_BackgroundException \ + (tclStubsPtr->tcl_BackgroundException) /* 609 */ +#define Tcl_ZlibDeflate \ + (tclStubsPtr->tcl_ZlibDeflate) /* 610 */ +#define Tcl_ZlibInflate \ + (tclStubsPtr->tcl_ZlibInflate) /* 611 */ +#define Tcl_ZlibCRC32 \ + (tclStubsPtr->tcl_ZlibCRC32) /* 612 */ +#define Tcl_ZlibAdler32 \ + (tclStubsPtr->tcl_ZlibAdler32) /* 613 */ +#define Tcl_ZlibStreamInit \ + (tclStubsPtr->tcl_ZlibStreamInit) /* 614 */ +#define Tcl_ZlibStreamGetCommandName \ + (tclStubsPtr->tcl_ZlibStreamGetCommandName) /* 615 */ +#define Tcl_ZlibStreamEof \ + (tclStubsPtr->tcl_ZlibStreamEof) /* 616 */ +#define Tcl_ZlibStreamChecksum \ + (tclStubsPtr->tcl_ZlibStreamChecksum) /* 617 */ +#define Tcl_ZlibStreamPut \ + (tclStubsPtr->tcl_ZlibStreamPut) /* 618 */ +#define Tcl_ZlibStreamGet \ + (tclStubsPtr->tcl_ZlibStreamGet) /* 619 */ +#define Tcl_ZlibStreamClose \ + (tclStubsPtr->tcl_ZlibStreamClose) /* 620 */ +#define Tcl_ZlibStreamReset \ + (tclStubsPtr->tcl_ZlibStreamReset) /* 621 */ +#define Tcl_SetStartupScript \ + (tclStubsPtr->tcl_SetStartupScript) /* 622 */ +#define Tcl_GetStartupScript \ + (tclStubsPtr->tcl_GetStartupScript) /* 623 */ +#define Tcl_CloseEx \ + (tclStubsPtr->tcl_CloseEx) /* 624 */ +#define Tcl_NRExprObj \ + (tclStubsPtr->tcl_NRExprObj) /* 625 */ +#define Tcl_NRSubstObj \ + (tclStubsPtr->tcl_NRSubstObj) /* 626 */ +#define Tcl_LoadFile \ + (tclStubsPtr->tcl_LoadFile) /* 627 */ +#define Tcl_FindSymbol \ + (tclStubsPtr->tcl_FindSymbol) /* 628 */ +#define Tcl_FSUnloadFile \ + (tclStubsPtr->tcl_FSUnloadFile) /* 629 */ +#define Tcl_ZlibStreamSetCompressionDictionary \ + (tclStubsPtr->tcl_ZlibStreamSetCompressionDictionary) /* 630 */ + +#endif /* defined(USE_TCL_STUBS) */ + +/* !END!: Do not edit above this line. */ + +#if defined(USE_TCL_STUBS) +# undef Tcl_CreateInterp +# undef Tcl_FindExecutable +# undef Tcl_GetStringResult +# undef Tcl_Init +# undef Tcl_SetPanicProc +# undef Tcl_SetVar +# undef Tcl_ObjSetVar2 +# undef Tcl_StaticPackage +# undef TclFSGetNativePath +# define Tcl_CreateInterp() (tclStubsPtr->tcl_CreateInterp()) +# define Tcl_GetStringResult(interp) (tclStubsPtr->tcl_GetStringResult(interp)) +# define Tcl_Init(interp) (tclStubsPtr->tcl_Init(interp)) +# define Tcl_SetPanicProc(proc) (tclStubsPtr->tcl_SetPanicProc(proc)) +# define Tcl_SetVar(interp, varName, newValue, flags) \ + (tclStubsPtr->tcl_SetVar(interp, varName, newValue, flags)) +# define Tcl_ObjSetVar2(interp, part1, part2, newValue, flags) \ + (tclStubsPtr->tcl_ObjSetVar2(interp, part1, part2, newValue, flags)) +#endif + +#if defined(_WIN32) && defined(UNICODE) +# define Tcl_FindExecutable(arg) ((Tcl_FindExecutable)((const char *)(arg))) +# define Tcl_MainEx Tcl_MainExW + EXTERN void Tcl_MainExW(int argc, wchar_t **argv, + Tcl_AppInitProc *appInitProc, Tcl_Interp *interp); +#endif + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#undef Tcl_SeekOld +#undef Tcl_TellOld + +#undef Tcl_PkgPresent +#define Tcl_PkgPresent(interp, name, version, exact) \ + Tcl_PkgPresentEx(interp, name, version, exact, NULL) +#undef Tcl_PkgProvide +#define Tcl_PkgProvide(interp, name, version) \ + Tcl_PkgProvideEx(interp, name, version, NULL) +#undef Tcl_PkgRequire +#define Tcl_PkgRequire(interp, name, version, exact) \ + Tcl_PkgRequireEx(interp, name, version, exact, NULL) +#undef Tcl_GetIndexFromObj +#define Tcl_GetIndexFromObj(interp, objPtr, tablePtr, msg, flags, indexPtr) \ + Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr, \ + sizeof(char *), msg, flags, indexPtr) +#undef Tcl_NewBooleanObj +#define Tcl_NewBooleanObj(boolValue) \ + Tcl_NewIntObj((boolValue)!=0) +#undef Tcl_DbNewBooleanObj +#define Tcl_DbNewBooleanObj(boolValue, file, line) \ + Tcl_DbNewLongObj((boolValue)!=0, file, line) +#undef Tcl_SetBooleanObj +#define Tcl_SetBooleanObj(objPtr, boolValue) \ + Tcl_SetIntObj((objPtr), (boolValue)!=0) +#undef Tcl_SetVar +#define Tcl_SetVar(interp, varName, newValue, flags) \ + Tcl_SetVar2(interp, varName, NULL, newValue, flags) +#undef Tcl_UnsetVar +#define Tcl_UnsetVar(interp, varName, flags) \ + Tcl_UnsetVar2(interp, varName, NULL, flags) +#undef Tcl_GetVar +#define Tcl_GetVar(interp, varName, flags) \ + Tcl_GetVar2(interp, varName, NULL, flags) +#undef Tcl_TraceVar +#define Tcl_TraceVar(interp, varName, flags, proc, clientData) \ + Tcl_TraceVar2(interp, varName, NULL, flags, proc, clientData) +#undef Tcl_UntraceVar +#define Tcl_UntraceVar(interp, varName, flags, proc, clientData) \ + Tcl_UntraceVar2(interp, varName, NULL, flags, proc, clientData) +#undef Tcl_VarTraceInfo +#define Tcl_VarTraceInfo(interp, varName, flags, proc, prevClientData) \ + Tcl_VarTraceInfo2(interp, varName, NULL, flags, proc, prevClientData) +#undef Tcl_UpVar +#define Tcl_UpVar(interp, frameName, varName, localName, flags) \ + Tcl_UpVar2(interp, frameName, varName, NULL, localName, flags) + +#if defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) +# if defined(__CYGWIN__) && defined(TCL_WIDE_INT_IS_LONG) +/* On Cygwin64, long is 64-bit while on Win64 long is 32-bit. Therefore + * we have to make sure that all stub entries on Cygwin64 follow the + * Win64 signature. Cygwin64 stubbed extensions cannot use those stub + * entries any more, they should use the 64-bit alternatives where + * possible. Tcl 9 must find a better solution, but that cannot be done + * without introducing a binary incompatibility. + */ +# undef Tcl_DbNewLongObj +# undef Tcl_GetLongFromObj +# undef Tcl_NewLongObj +# undef Tcl_SetLongObj +# undef Tcl_ExprLong +# undef Tcl_ExprLongObj +# undef Tcl_UniCharNcmp +# undef Tcl_UtfNcmp +# undef Tcl_UtfNcasecmp +# undef Tcl_UniCharNcasecmp +# define Tcl_DbNewLongObj ((Tcl_Obj*(*)(long,const char*,int))Tcl_DbNewWideIntObj) +# define Tcl_GetLongFromObj ((int(*)(Tcl_Interp*,Tcl_Obj*,long*))Tcl_GetWideIntFromObj) +# define Tcl_NewLongObj ((Tcl_Obj*(*)(long))Tcl_NewWideIntObj) +# define Tcl_SetLongObj ((void(*)(Tcl_Obj*,long))Tcl_SetWideIntObj) +# define Tcl_ExprLong TclExprLong + static inline int TclExprLong(Tcl_Interp *interp, const char *string, long *ptr){ + int intValue; + int result = tclStubsPtr->tcl_ExprLong(interp, string, (long *)&intValue); + if (result == TCL_OK) *ptr = (long)intValue; + return result; + } +# define Tcl_ExprLongObj TclExprLongObj + static inline int TclExprLongObj(Tcl_Interp *interp, Tcl_Obj *obj, long *ptr){ + int intValue; + int result = tclStubsPtr->tcl_ExprLongObj(interp, obj, (long *)&intValue); + if (result == TCL_OK) *ptr = (long)intValue; + return result; + } +# define Tcl_UniCharNcmp(ucs,uct,n) \ + ((int(*)(const Tcl_UniChar*,const Tcl_UniChar*,unsigned int))tclStubsPtr->tcl_UniCharNcmp)(ucs,uct,(unsigned int)(n)) +# define Tcl_UtfNcmp(s1,s2,n) \ + ((int(*)(const char*,const char*,unsigned int))tclStubsPtr->tcl_UtfNcmp)(s1,s2,(unsigned int)(n)) +# define Tcl_UtfNcasecmp(s1,s2,n) \ + ((int(*)(const char*,const char*,unsigned int))tclStubsPtr->tcl_UtfNcasecmp)(s1,s2,(unsigned int)(n)) +# define Tcl_UniCharNcasecmp(ucs,uct,n) \ + ((int(*)(const Tcl_UniChar*,const Tcl_UniChar*,unsigned int))tclStubsPtr->tcl_UniCharNcasecmp)(ucs,uct,(unsigned int)(n)) +# endif +#endif + +/* + * Deprecated Tcl procedures: + */ + +#undef Tcl_EvalObj +#define Tcl_EvalObj(interp,objPtr) \ + Tcl_EvalObjEx((interp),(objPtr),0) +#undef Tcl_GlobalEvalObj +#define Tcl_GlobalEvalObj(interp,objPtr) \ + Tcl_EvalObjEx((interp),(objPtr),TCL_EVAL_GLOBAL) + +#endif /* _TCLDECLS */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tclPlatDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tclPlatDecls.h new file mode 100644 index 00000000..abc8ee81 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tclPlatDecls.h @@ -0,0 +1,122 @@ +/* + * tclPlatDecls.h -- + * + * Declarations of platform specific Tcl APIs. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * All rights reserved. + */ + +#ifndef _TCLPLATDECLS +#define _TCLPLATDECLS + +#undef TCL_STORAGE_CLASS +#ifdef BUILD_tcl +# define TCL_STORAGE_CLASS DLLEXPORT +#else +# ifdef USE_TCL_STUBS +# define TCL_STORAGE_CLASS +# else +# define TCL_STORAGE_CLASS DLLIMPORT +# endif +#endif + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tcl.decls script. + */ + +/* + * TCHAR is needed here for win32, so if it is not defined yet do it here. + * This way, we don't need to include just for one define. + */ +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(_TCHAR_DEFINED) +# if defined(_UNICODE) + typedef wchar_t TCHAR; +# else + typedef char TCHAR; +# endif +# define _TCHAR_DEFINED +#endif + +/* !BEGIN!: Do not edit below this line. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Exported function declarations: + */ + +#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */ +/* 0 */ +EXTERN TCHAR * Tcl_WinUtfToTChar(const char *str, int len, + Tcl_DString *dsPtr); +/* 1 */ +EXTERN char * Tcl_WinTCharToUtf(const TCHAR *str, int len, + Tcl_DString *dsPtr); +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ +/* 0 */ +EXTERN int Tcl_MacOSXOpenBundleResources(Tcl_Interp *interp, + const char *bundleName, int hasResourceFile, + int maxPathLen, char *libraryPath); +/* 1 */ +EXTERN int Tcl_MacOSXOpenVersionedBundleResources( + Tcl_Interp *interp, const char *bundleName, + const char *bundleVersion, + int hasResourceFile, int maxPathLen, + char *libraryPath); +#endif /* MACOSX */ + +typedef struct TclPlatStubs { + int magic; + void *hooks; + +#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */ + TCHAR * (*tcl_WinUtfToTChar) (const char *str, int len, Tcl_DString *dsPtr); /* 0 */ + char * (*tcl_WinTCharToUtf) (const TCHAR *str, int len, Tcl_DString *dsPtr); /* 1 */ +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ + int (*tcl_MacOSXOpenBundleResources) (Tcl_Interp *interp, const char *bundleName, int hasResourceFile, int maxPathLen, char *libraryPath); /* 0 */ + int (*tcl_MacOSXOpenVersionedBundleResources) (Tcl_Interp *interp, const char *bundleName, const char *bundleVersion, int hasResourceFile, int maxPathLen, char *libraryPath); /* 1 */ +#endif /* MACOSX */ +} TclPlatStubs; + +extern const TclPlatStubs *tclPlatStubsPtr; + +#ifdef __cplusplus +} +#endif + +#if defined(USE_TCL_STUBS) + +/* + * Inline function declarations: + */ + +#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */ +#define Tcl_WinUtfToTChar \ + (tclPlatStubsPtr->tcl_WinUtfToTChar) /* 0 */ +#define Tcl_WinTCharToUtf \ + (tclPlatStubsPtr->tcl_WinTCharToUtf) /* 1 */ +#endif /* WIN */ +#ifdef MAC_OSX_TCL /* MACOSX */ +#define Tcl_MacOSXOpenBundleResources \ + (tclPlatStubsPtr->tcl_MacOSXOpenBundleResources) /* 0 */ +#define Tcl_MacOSXOpenVersionedBundleResources \ + (tclPlatStubsPtr->tcl_MacOSXOpenVersionedBundleResources) /* 1 */ +#endif /* MACOSX */ + +#endif /* defined(USE_TCL_STUBS) */ + +/* !END!: Do not edit above this line. */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#endif /* _TCLPLATDECLS */ + + diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tk.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tk.h new file mode 100644 index 00000000..4a655a49 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tk.h @@ -0,0 +1,1619 @@ +/* + * tk.h -- + * + * Declarations for Tk-related things that are visible outside of the Tk + * module itself. + * + * Copyright (c) 1989-1994 The Regents of the University of California. + * Copyright (c) 1994 The Australian National University. + * Copyright (c) 1994-1998 Sun Microsystems, Inc. + * Copyright (c) 1998-2000 Ajuba Solutions. + * + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TK +#define _TK + +#include +#if (TCL_MAJOR_VERSION != 8) || (TCL_MINOR_VERSION < 6) +# error Tk 8.6 must be compiled with tcl.h from Tcl 8.6 or better +#endif + +#ifndef CONST84 +# define CONST84 const +# define CONST84_RETURN const +#endif +#ifndef CONST86 +# define CONST86 CONST84 +#endif +#ifndef EXTERN +# define EXTERN extern TCL_STORAGE_CLASS +#endif + +/* + * Utility macros: STRINGIFY takes an argument and wraps it in "" (double + * quotation marks), JOIN joins two arguments. + */ + +#ifndef STRINGIFY +# define STRINGIFY(x) STRINGIFY1(x) +# define STRINGIFY1(x) #x +#endif +#ifndef JOIN +# define JOIN(a,b) JOIN1(a,b) +# define JOIN1(a,b) a##b +#endif + +/* + * For C++ compilers, use extern "C" + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * When version numbers change here, you must also go into the following files + * and update the version numbers: + * + * library/tk.tcl (1 LOC patch) + * unix/configure.in (2 LOC Major, 2 LOC minor, 1 LOC patch) + * win/configure.in (as above) + * README (sections 0 and 1) + * macosx/Tk-Common.xcconfig (not patchlevel) 1 LOC + * win/README (not patchlevel) + * unix/README (not patchlevel) + * unix/tk.spec (1 LOC patch) + * win/tcl.m4 (not patchlevel) + * + * You may also need to update some of these files when the numbers change for + * the version of Tcl that this release of Tk is compiled against. + */ + +#define TK_MAJOR_VERSION 8 +#define TK_MINOR_VERSION 6 +#define TK_RELEASE_LEVEL TCL_FINAL_RELEASE +#define TK_RELEASE_SERIAL 4 + +#define TK_VERSION "8.6" +#define TK_PATCH_LEVEL "8.6.4" + +/* + * A special definition used to allow this header file to be included from + * windows or mac resource files so that they can obtain version information. + * RC_INVOKED is defined by default by the windows RC tool and manually set + * for macintosh. + * + * Resource compilers don't like all the C stuff, like typedefs and procedure + * declarations, that occur below, so block them out. + */ + +#ifndef RC_INVOKED + +#ifndef _XLIB_H +# include +# ifdef MAC_OSX_TK +# include +# endif +#endif +#ifdef __STDC__ +# include +#endif + +#ifdef BUILD_tk +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLEXPORT +#endif + +/* + *---------------------------------------------------------------------- + * + * Decide whether or not to use input methods. + */ + +#ifdef XNQueryInputStyle +#define TK_USE_INPUT_METHODS +#endif + +/* + * Dummy types that are used by clients: + */ + +typedef struct Tk_BindingTable_ *Tk_BindingTable; +typedef struct Tk_Canvas_ *Tk_Canvas; +typedef struct Tk_Cursor_ *Tk_Cursor; +typedef struct Tk_ErrorHandler_ *Tk_ErrorHandler; +typedef struct Tk_Font_ *Tk_Font; +typedef struct Tk_Image__ *Tk_Image; +typedef struct Tk_ImageMaster_ *Tk_ImageMaster; +typedef struct Tk_OptionTable_ *Tk_OptionTable; +typedef struct Tk_PostscriptInfo_ *Tk_PostscriptInfo; +typedef struct Tk_TextLayout_ *Tk_TextLayout; +typedef struct Tk_Window_ *Tk_Window; +typedef struct Tk_3DBorder_ *Tk_3DBorder; +typedef struct Tk_Style_ *Tk_Style; +typedef struct Tk_StyleEngine_ *Tk_StyleEngine; +typedef struct Tk_StyledElement_ *Tk_StyledElement; + +/* + * Additional types exported to clients. + */ + +typedef const char *Tk_Uid; + +/* + *---------------------------------------------------------------------- + * + * The enum below defines the valid types for Tk configuration options as + * implemented by Tk_InitOptions, Tk_SetOptions, etc. + */ + +typedef enum { + TK_OPTION_BOOLEAN, + TK_OPTION_INT, + TK_OPTION_DOUBLE, + TK_OPTION_STRING, + TK_OPTION_STRING_TABLE, + TK_OPTION_COLOR, + TK_OPTION_FONT, + TK_OPTION_BITMAP, + TK_OPTION_BORDER, + TK_OPTION_RELIEF, + TK_OPTION_CURSOR, + TK_OPTION_JUSTIFY, + TK_OPTION_ANCHOR, + TK_OPTION_SYNONYM, + TK_OPTION_PIXELS, + TK_OPTION_WINDOW, + TK_OPTION_END, + TK_OPTION_CUSTOM, + TK_OPTION_STYLE +} Tk_OptionType; + +/* + * Structures of the following type are used by widgets to specify their + * configuration options. Typically each widget has a static array of these + * structures, where each element of the array describes a single + * configuration option. The array is passed to Tk_CreateOptionTable. + */ + +typedef struct Tk_OptionSpec { + Tk_OptionType type; /* Type of option, such as TK_OPTION_COLOR; + * see definitions above. Last option in table + * must have type TK_OPTION_END. */ + const char *optionName; /* Name used to specify option in Tcl + * commands. */ + const char *dbName; /* Name for option in option database. */ + const char *dbClass; /* Class for option in database. */ + const char *defValue; /* Default value for option if not specified + * in command line, the option database, or + * the system. */ + int objOffset; /* Where in record to store a Tcl_Obj * that + * holds the value of this option, specified + * as an offset in bytes from the start of the + * record. Use the Tk_Offset macro to generate + * values for this. -1 means don't store the + * Tcl_Obj in the record. */ + int internalOffset; /* Where in record to store the internal + * representation of the value of this option, + * such as an int or XColor *. This field is + * specified as an offset in bytes from the + * start of the record. Use the Tk_Offset + * macro to generate values for it. -1 means + * don't store the internal representation in + * the record. */ + int flags; /* Any combination of the values defined + * below. */ + const void *clientData; /* An alternate place to put option-specific + * data. Used for the monochrome default value + * for colors, etc. */ + int typeMask; /* An arbitrary bit mask defined by the class + * manager; typically bits correspond to + * certain kinds of options such as all those + * that require a redisplay when they change. + * Tk_SetOptions returns the bit-wise OR of + * the typeMasks of all options that were + * changed. */ +} Tk_OptionSpec; + +/* + * Flag values for Tk_OptionSpec structures. These flags are shared by + * Tk_ConfigSpec structures, so be sure to coordinate any changes carefully. + */ + +#define TK_OPTION_NULL_OK (1 << 0) +#define TK_OPTION_DONT_SET_DEFAULT (1 << 3) + +/* + * The following structure and function types are used by TK_OPTION_CUSTOM + * options; the structure holds pointers to the functions needed by the Tk + * option config code to handle a custom option. + */ + +typedef int (Tk_CustomOptionSetProc) (ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj **value, char *widgRec, + int offset, char *saveInternalPtr, int flags); +typedef Tcl_Obj *(Tk_CustomOptionGetProc) (ClientData clientData, + Tk_Window tkwin, char *widgRec, int offset); +typedef void (Tk_CustomOptionRestoreProc) (ClientData clientData, + Tk_Window tkwin, char *internalPtr, char *saveInternalPtr); +typedef void (Tk_CustomOptionFreeProc) (ClientData clientData, Tk_Window tkwin, + char *internalPtr); + +typedef struct Tk_ObjCustomOption { + const char *name; /* Name of the custom option. */ + Tk_CustomOptionSetProc *setProc; + /* Function to use to set a record's option + * value from a Tcl_Obj */ + Tk_CustomOptionGetProc *getProc; + /* Function to use to get a Tcl_Obj + * representation from an internal + * representation of an option. */ + Tk_CustomOptionRestoreProc *restoreProc; + /* Function to use to restore a saved value + * for the internal representation. */ + Tk_CustomOptionFreeProc *freeProc; + /* Function to use to free the internal + * representation of an option. */ + ClientData clientData; /* Arbitrary one-word value passed to the + * handling procs. */ +} Tk_ObjCustomOption; + +/* + * Macro to use to fill in "offset" fields of the Tk_OptionSpec structure. + * Computes number of bytes from beginning of structure to a given field. + */ + +#ifdef offsetof +#define Tk_Offset(type, field) ((int) offsetof(type, field)) +#else +#define Tk_Offset(type, field) ((int) ((char *) &((type *) 0)->field)) +#endif + +/* + * The following two structures are used for error handling. When config + * options are being modified, the old values are saved in a Tk_SavedOptions + * structure. If an error occurs, then the contents of the structure can be + * used to restore all of the old values. The contents of this structure are + * for the private use Tk. No-one outside Tk should ever read or write any of + * the fields of these structures. + */ + +typedef struct Tk_SavedOption { + struct TkOption *optionPtr; /* Points to information that describes the + * option. */ + Tcl_Obj *valuePtr; /* The old value of the option, in the form of + * a Tcl object; may be NULL if the value was + * not saved as an object. */ + double internalForm; /* The old value of the option, in some + * internal representation such as an int or + * (XColor *). Valid only if the field + * optionPtr->specPtr->objOffset is < 0. The + * space must be large enough to accommodate a + * double, a long, or a pointer; right now it + * looks like a double (i.e., 8 bytes) is big + * enough. Also, using a double guarantees + * that the field is properly aligned for + * storing large values. */ +} Tk_SavedOption; + +#ifdef TCL_MEM_DEBUG +# define TK_NUM_SAVED_OPTIONS 2 +#else +# define TK_NUM_SAVED_OPTIONS 20 +#endif + +typedef struct Tk_SavedOptions { + char *recordPtr; /* The data structure in which to restore + * configuration options. */ + Tk_Window tkwin; /* Window associated with recordPtr; needed to + * restore certain options. */ + int numItems; /* The number of valid items in items field. */ + Tk_SavedOption items[TK_NUM_SAVED_OPTIONS]; + /* Items used to hold old values. */ + struct Tk_SavedOptions *nextPtr; + /* Points to next structure in list; needed if + * too many options changed to hold all the + * old values in a single structure. NULL + * means no more structures. */ +} Tk_SavedOptions; + +/* + * Structure used to describe application-specific configuration options: + * indicates procedures to call to parse an option and to return a text string + * describing an option. THESE ARE DEPRECATED; PLEASE USE THE NEW STRUCTURES + * LISTED ABOVE. + */ + +/* + * This is a temporary flag used while tkObjConfig and new widgets are in + * development. + */ + +#ifndef __NO_OLD_CONFIG + +typedef int (Tk_OptionParseProc) (ClientData clientData, Tcl_Interp *interp, + Tk_Window tkwin, CONST84 char *value, char *widgRec, int offset); +typedef CONST86 char *(Tk_OptionPrintProc) (ClientData clientData, + Tk_Window tkwin, char *widgRec, int offset, Tcl_FreeProc **freeProcPtr); + +typedef struct Tk_CustomOption { + Tk_OptionParseProc *parseProc; + /* Procedure to call to parse an option and + * store it in converted form. */ + Tk_OptionPrintProc *printProc; + /* Procedure to return a printable string + * describing an existing option. */ + ClientData clientData; /* Arbitrary one-word value used by option + * parser: passed to parseProc and + * printProc. */ +} Tk_CustomOption; + +/* + * Structure used to specify information for Tk_ConfigureWidget. Each + * structure gives complete information for one option, including how the + * option is specified on the command line, where it appears in the option + * database, etc. + */ + +typedef struct Tk_ConfigSpec { + int type; /* Type of option, such as TK_CONFIG_COLOR; + * see definitions below. Last option in table + * must have type TK_CONFIG_END. */ + CONST86 char *argvName; /* Switch used to specify option in argv. NULL + * means this spec is part of a group. */ + Tk_Uid dbName; /* Name for option in option database. */ + Tk_Uid dbClass; /* Class for option in database. */ + Tk_Uid defValue; /* Default value for option if not specified + * in command line or database. */ + int offset; /* Where in widget record to store value; use + * Tk_Offset macro to generate values for + * this. */ + int specFlags; /* Any combination of the values defined + * below; other bits are used internally by + * tkConfig.c. */ + CONST86 Tk_CustomOption *customPtr; + /* If type is TK_CONFIG_CUSTOM then this is a + * pointer to info about how to parse and + * print the option. Otherwise it is + * irrelevant. */ +} Tk_ConfigSpec; + +/* + * Type values for Tk_ConfigSpec structures. See the user documentation for + * details. + */ + +typedef enum { + TK_CONFIG_BOOLEAN, TK_CONFIG_INT, TK_CONFIG_DOUBLE, TK_CONFIG_STRING, + TK_CONFIG_UID, TK_CONFIG_COLOR, TK_CONFIG_FONT, TK_CONFIG_BITMAP, + TK_CONFIG_BORDER, TK_CONFIG_RELIEF, TK_CONFIG_CURSOR, + TK_CONFIG_ACTIVE_CURSOR, TK_CONFIG_JUSTIFY, TK_CONFIG_ANCHOR, + TK_CONFIG_SYNONYM, TK_CONFIG_CAP_STYLE, TK_CONFIG_JOIN_STYLE, + TK_CONFIG_PIXELS, TK_CONFIG_MM, TK_CONFIG_WINDOW, TK_CONFIG_CUSTOM, + TK_CONFIG_END +} Tk_ConfigTypes; + +/* + * Possible values for flags argument to Tk_ConfigureWidget: + */ + +#define TK_CONFIG_ARGV_ONLY 1 +#define TK_CONFIG_OBJS 0x80 + +/* + * Possible flag values for Tk_ConfigSpec structures. Any bits at or above + * TK_CONFIG_USER_BIT may be used by clients for selecting certain entries. + * Before changing any values here, coordinate with tkOldConfig.c + * (internal-use-only flags are defined there). + */ + +#define TK_CONFIG_NULL_OK (1 << 0) +#define TK_CONFIG_COLOR_ONLY (1 << 1) +#define TK_CONFIG_MONO_ONLY (1 << 2) +#define TK_CONFIG_DONT_SET_DEFAULT (1 << 3) +#define TK_CONFIG_OPTION_SPECIFIED (1 << 4) +#define TK_CONFIG_USER_BIT 0x100 +#endif /* __NO_OLD_CONFIG */ + +/* + * Structure used to specify how to handle argv options. + */ + +typedef struct { + CONST86 char *key; /* The key string that flags the option in the + * argv array. */ + int type; /* Indicates option type; see below. */ + char *src; /* Value to be used in setting dst; usage + * depends on type. */ + char *dst; /* Address of value to be modified; usage + * depends on type. */ + CONST86 char *help; /* Documentation message describing this + * option. */ +} Tk_ArgvInfo; + +/* + * Legal values for the type field of a Tk_ArgvInfo: see the user + * documentation for details. + */ + +#define TK_ARGV_CONSTANT 15 +#define TK_ARGV_INT 16 +#define TK_ARGV_STRING 17 +#define TK_ARGV_UID 18 +#define TK_ARGV_REST 19 +#define TK_ARGV_FLOAT 20 +#define TK_ARGV_FUNC 21 +#define TK_ARGV_GENFUNC 22 +#define TK_ARGV_HELP 23 +#define TK_ARGV_CONST_OPTION 24 +#define TK_ARGV_OPTION_VALUE 25 +#define TK_ARGV_OPTION_NAME_VALUE 26 +#define TK_ARGV_END 27 + +/* + * Flag bits for passing to Tk_ParseArgv: + */ + +#define TK_ARGV_NO_DEFAULTS 0x1 +#define TK_ARGV_NO_LEFTOVERS 0x2 +#define TK_ARGV_NO_ABBREV 0x4 +#define TK_ARGV_DONT_SKIP_FIRST_ARG 0x8 + +/* + * Enumerated type for describing actions to be taken in response to a + * restrictProc established by Tk_RestrictEvents. + */ + +typedef enum { + TK_DEFER_EVENT, TK_PROCESS_EVENT, TK_DISCARD_EVENT +} Tk_RestrictAction; + +/* + * Priority levels to pass to Tk_AddOption: + */ + +#define TK_WIDGET_DEFAULT_PRIO 20 +#define TK_STARTUP_FILE_PRIO 40 +#define TK_USER_DEFAULT_PRIO 60 +#define TK_INTERACTIVE_PRIO 80 +#define TK_MAX_PRIO 100 + +/* + * Relief values returned by Tk_GetRelief: + */ + +#define TK_RELIEF_NULL -1 +#define TK_RELIEF_FLAT 0 +#define TK_RELIEF_GROOVE 1 +#define TK_RELIEF_RAISED 2 +#define TK_RELIEF_RIDGE 3 +#define TK_RELIEF_SOLID 4 +#define TK_RELIEF_SUNKEN 5 + +/* + * "Which" argument values for Tk_3DBorderGC: + */ + +#define TK_3D_FLAT_GC 1 +#define TK_3D_LIGHT_GC 2 +#define TK_3D_DARK_GC 3 + +/* + * Special EnterNotify/LeaveNotify "mode" for use in events generated by + * tkShare.c. Pick a high enough value that it's unlikely to conflict with + * existing values (like NotifyNormal) or any new values defined in the + * future. + */ + +#define TK_NOTIFY_SHARE 20 + +/* + * Enumerated type for describing a point by which to anchor something: + */ + +typedef enum { + TK_ANCHOR_N, TK_ANCHOR_NE, TK_ANCHOR_E, TK_ANCHOR_SE, + TK_ANCHOR_S, TK_ANCHOR_SW, TK_ANCHOR_W, TK_ANCHOR_NW, + TK_ANCHOR_CENTER +} Tk_Anchor; + +/* + * Enumerated type for describing a style of justification: + */ + +typedef enum { + TK_JUSTIFY_LEFT, TK_JUSTIFY_RIGHT, TK_JUSTIFY_CENTER +} Tk_Justify; + +/* + * The following structure is used by Tk_GetFontMetrics() to return + * information about the properties of a Tk_Font. + */ + +typedef struct Tk_FontMetrics { + int ascent; /* The amount in pixels that the tallest + * letter sticks up above the baseline, plus + * any extra blank space added by the designer + * of the font. */ + int descent; /* The largest amount in pixels that any + * letter sticks below the baseline, plus any + * extra blank space added by the designer of + * the font. */ + int linespace; /* The sum of the ascent and descent. How far + * apart two lines of text in the same font + * should be placed so that none of the + * characters in one line overlap any of the + * characters in the other line. */ +} Tk_FontMetrics; + +/* + * Flags passed to Tk_MeasureChars: + */ + +#define TK_WHOLE_WORDS 1 +#define TK_AT_LEAST_ONE 2 +#define TK_PARTIAL_OK 4 + +/* + * Flags passed to Tk_ComputeTextLayout: + */ + +#define TK_IGNORE_TABS 8 +#define TK_IGNORE_NEWLINES 16 + +/* + * Widget class procedures used to implement platform specific widget + * behavior. + */ + +typedef Window (Tk_ClassCreateProc) (Tk_Window tkwin, Window parent, + ClientData instanceData); +typedef void (Tk_ClassWorldChangedProc) (ClientData instanceData); +typedef void (Tk_ClassModalProc) (Tk_Window tkwin, XEvent *eventPtr); + +typedef struct Tk_ClassProcs { + unsigned int size; + Tk_ClassWorldChangedProc *worldChangedProc; + /* Procedure to invoke when the widget needs + * to respond in some way to a change in the + * world (font changes, etc.) */ + Tk_ClassCreateProc *createProc; + /* Procedure to invoke when the platform- + * dependent window needs to be created. */ + Tk_ClassModalProc *modalProc; + /* Procedure to invoke after all bindings on a + * widget have been triggered in order to + * handle a modal loop. */ +} Tk_ClassProcs; + +/* + * Simple accessor for Tk_ClassProcs structure. Checks that the structure is + * not NULL, then checks the size field and returns either the requested + * field, if present, or NULL if the structure is too small to have the field + * (or NULL if the structure is NULL). + * + * A more general version of this function may be useful if other + * size-versioned structure pop up in the future: + * + * #define Tk_GetField(name, who, which) \ + * (((who) == NULL) ? NULL : + * (((who)->size <= Tk_Offset(name, which)) ? NULL :(name)->which)) + */ + +#define Tk_GetClassProc(procs, which) \ + (((procs) == NULL) ? NULL : \ + (((procs)->size <= Tk_Offset(Tk_ClassProcs, which)) ? NULL:(procs)->which)) + +/* + * Each geometry manager (the packer, the placer, etc.) is represented by a + * structure of the following form, which indicates procedures to invoke in + * the geometry manager to carry out certain functions. + */ + +typedef void (Tk_GeomRequestProc) (ClientData clientData, Tk_Window tkwin); +typedef void (Tk_GeomLostSlaveProc) (ClientData clientData, Tk_Window tkwin); + +typedef struct Tk_GeomMgr { + const char *name; /* Name of the geometry manager (command used + * to invoke it, or name of widget class that + * allows embedded widgets). */ + Tk_GeomRequestProc *requestProc; + /* Procedure to invoke when a slave's + * requested geometry changes. */ + Tk_GeomLostSlaveProc *lostSlaveProc; + /* Procedure to invoke when a slave is taken + * away from one geometry manager by another. + * NULL means geometry manager doesn't care + * when slaves are lost. */ +} Tk_GeomMgr; + +/* + * Result values returned by Tk_GetScrollInfo: + */ + +#define TK_SCROLL_MOVETO 1 +#define TK_SCROLL_PAGES 2 +#define TK_SCROLL_UNITS 3 +#define TK_SCROLL_ERROR 4 + +/* + *---------------------------------------------------------------------- + * + * Extensions to the X event set + * + *---------------------------------------------------------------------- + */ + +#define VirtualEvent (MappingNotify + 1) +#define ActivateNotify (MappingNotify + 2) +#define DeactivateNotify (MappingNotify + 3) +#define MouseWheelEvent (MappingNotify + 4) +#define TK_LASTEVENT (MappingNotify + 5) + +#define MouseWheelMask (1L << 28) +#define ActivateMask (1L << 29) +#define VirtualEventMask (1L << 30) + +/* + * A virtual event shares most of its fields with the XKeyEvent and + * XButtonEvent structures. 99% of the time a virtual event will be an + * abstraction of a key or button event, so this structure provides the most + * information to the user. The only difference is the changing of the detail + * field for a virtual event so that it holds the name of the virtual event + * being triggered. + * + * When using this structure, you should ensure that you zero out all the + * fields first using memset() or bzero(). + */ + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server. */ + Bool send_event; /* True if this came from a SendEvent + * request. */ + Display *display; /* Display the event was read from. */ + Window event; /* Window on which event was requested. */ + Window root; /* Root window that the event occured on. */ + Window subwindow; /* Child window. */ + Time time; /* Milliseconds. */ + int x, y; /* Pointer x, y coordinates in event + * window. */ + int x_root, y_root; /* Coordinates relative to root. */ + unsigned int state; /* Key or button mask */ + Tk_Uid name; /* Name of virtual event. */ + Bool same_screen; /* Same screen flag. */ + Tcl_Obj *user_data; /* Application-specific data reference; Tk + * will decrement the reference count *once* + * when it has finished processing the + * event. */ +} XVirtualEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server. */ + Bool send_event; /* True if this came from a SendEvent + * request. */ + Display *display; /* Display the event was read from. */ + Window window; /* Window in which event occurred. */ +} XActivateDeactivateEvent; +typedef XActivateDeactivateEvent XActivateEvent; +typedef XActivateDeactivateEvent XDeactivateEvent; + +/* + *---------------------------------------------------------------------- + * + * Macros for querying Tk_Window structures. See the manual entries for + * documentation. + * + *---------------------------------------------------------------------- + */ + +#define Tk_Display(tkwin) (((Tk_FakeWin *) (tkwin))->display) +#define Tk_ScreenNumber(tkwin) (((Tk_FakeWin *) (tkwin))->screenNum) +#define Tk_Screen(tkwin) \ + (ScreenOfDisplay(Tk_Display(tkwin), Tk_ScreenNumber(tkwin))) +#define Tk_Depth(tkwin) (((Tk_FakeWin *) (tkwin))->depth) +#define Tk_Visual(tkwin) (((Tk_FakeWin *) (tkwin))->visual) +#define Tk_WindowId(tkwin) (((Tk_FakeWin *) (tkwin))->window) +#define Tk_PathName(tkwin) (((Tk_FakeWin *) (tkwin))->pathName) +#define Tk_Name(tkwin) (((Tk_FakeWin *) (tkwin))->nameUid) +#define Tk_Class(tkwin) (((Tk_FakeWin *) (tkwin))->classUid) +#define Tk_X(tkwin) (((Tk_FakeWin *) (tkwin))->changes.x) +#define Tk_Y(tkwin) (((Tk_FakeWin *) (tkwin))->changes.y) +#define Tk_Width(tkwin) (((Tk_FakeWin *) (tkwin))->changes.width) +#define Tk_Height(tkwin) \ + (((Tk_FakeWin *) (tkwin))->changes.height) +#define Tk_Changes(tkwin) (&((Tk_FakeWin *) (tkwin))->changes) +#define Tk_Attributes(tkwin) (&((Tk_FakeWin *) (tkwin))->atts) +#define Tk_IsEmbedded(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_EMBEDDED) +#define Tk_IsContainer(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_CONTAINER) +#define Tk_IsMapped(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_MAPPED) +#define Tk_IsTopLevel(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_TOP_LEVEL) +#define Tk_HasWrapper(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_HAS_WRAPPER) +#define Tk_WinManaged(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_WIN_MANAGED) +#define Tk_TopWinHierarchy(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_TOP_HIERARCHY) +#define Tk_IsManageable(tkwin) \ + (((Tk_FakeWin *) (tkwin))->flags & TK_WM_MANAGEABLE) +#define Tk_ReqWidth(tkwin) (((Tk_FakeWin *) (tkwin))->reqWidth) +#define Tk_ReqHeight(tkwin) (((Tk_FakeWin *) (tkwin))->reqHeight) +/* Tk_InternalBorderWidth is deprecated */ +#define Tk_InternalBorderWidth(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderLeft) +#define Tk_InternalBorderLeft(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderLeft) +#define Tk_InternalBorderRight(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderRight) +#define Tk_InternalBorderTop(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderTop) +#define Tk_InternalBorderBottom(tkwin) \ + (((Tk_FakeWin *) (tkwin))->internalBorderBottom) +#define Tk_MinReqWidth(tkwin) (((Tk_FakeWin *) (tkwin))->minReqWidth) +#define Tk_MinReqHeight(tkwin) (((Tk_FakeWin *) (tkwin))->minReqHeight) +#define Tk_Parent(tkwin) (((Tk_FakeWin *) (tkwin))->parentPtr) +#define Tk_Colormap(tkwin) (((Tk_FakeWin *) (tkwin))->atts.colormap) + +/* + * The structure below is needed by the macros above so that they can access + * the fields of a Tk_Window. The fields not needed by the macros are declared + * as "dummyX". The structure has its own type in order to prevent apps from + * accessing Tk_Window fields except using official macros. WARNING!! The + * structure definition must be kept consistent with the TkWindow structure in + * tkInt.h. If you change one, then change the other. See the declaration in + * tkInt.h for documentation on what the fields are used for internally. + */ + +typedef struct Tk_FakeWin { + Display *display; + char *dummy1; /* dispPtr */ + int screenNum; + Visual *visual; + int depth; + Window window; + char *dummy2; /* childList */ + char *dummy3; /* lastChildPtr */ + Tk_Window parentPtr; /* parentPtr */ + char *dummy4; /* nextPtr */ + char *dummy5; /* mainPtr */ + char *pathName; + Tk_Uid nameUid; + Tk_Uid classUid; + XWindowChanges changes; + unsigned int dummy6; /* dirtyChanges */ + XSetWindowAttributes atts; + unsigned long dummy7; /* dirtyAtts */ + unsigned int flags; + char *dummy8; /* handlerList */ +#ifdef TK_USE_INPUT_METHODS + XIC dummy9; /* inputContext */ +#endif /* TK_USE_INPUT_METHODS */ + ClientData *dummy10; /* tagPtr */ + int dummy11; /* numTags */ + int dummy12; /* optionLevel */ + char *dummy13; /* selHandlerList */ + char *dummy14; /* geomMgrPtr */ + ClientData dummy15; /* geomData */ + int reqWidth, reqHeight; + int internalBorderLeft; + char *dummy16; /* wmInfoPtr */ + char *dummy17; /* classProcPtr */ + ClientData dummy18; /* instanceData */ + char *dummy19; /* privatePtr */ + int internalBorderRight; + int internalBorderTop; + int internalBorderBottom; + int minReqWidth; + int minReqHeight; + char *dummy20; /* geometryMaster */ +} Tk_FakeWin; + +/* + * Flag values for TkWindow (and Tk_FakeWin) structures are: + * + * TK_MAPPED: 1 means window is currently mapped, + * 0 means unmapped. + * TK_TOP_LEVEL: 1 means this is a top-level widget. + * TK_ALREADY_DEAD: 1 means the window is in the process of + * being destroyed already. + * TK_NEED_CONFIG_NOTIFY: 1 means that the window has been reconfigured + * before it was made to exist. At the time of + * making it exist a ConfigureNotify event needs + * to be generated. + * TK_GRAB_FLAG: Used to manage grabs. See tkGrab.c for details + * TK_CHECKED_IC: 1 means we've already tried to get an input + * context for this window; if the ic field is + * NULL it means that there isn't a context for + * the field. + * TK_DONT_DESTROY_WINDOW: 1 means that Tk_DestroyWindow should not + * invoke XDestroyWindow to destroy this widget's + * X window. The flag is set when the window has + * already been destroyed elsewhere (e.g. by + * another application) or when it will be + * destroyed later (e.g. by destroying its parent) + * TK_WM_COLORMAP_WINDOW: 1 means that this window has at some time + * appeared in the WM_COLORMAP_WINDOWS property + * for its toplevel, so we have to remove it from + * that property if the window is deleted and the + * toplevel isn't. + * TK_EMBEDDED: 1 means that this window (which must be a + * toplevel) is not a free-standing window but + * rather is embedded in some other application. + * TK_CONTAINER: 1 means that this window is a container, and + * that some other application (either in this + * process or elsewhere) may be embedding itself + * inside the window. + * TK_BOTH_HALVES: 1 means that this window is used for + * application embedding (either as container or + * embedded application), and both the containing + * and embedded halves are associated with + * windows in this particular process. + * TK_WRAPPER: 1 means that this window is the extra wrapper + * window created around a toplevel to hold the + * menubar under Unix. See tkUnixWm.c for more + * information. + * TK_REPARENTED: 1 means that this window has been reparented + * so that as far as the window system is + * concerned it isn't a child of its Tk parent. + * Initially this is used only for special Unix + * menubar windows. + * TK_ANONYMOUS_WINDOW: 1 means that this window has no name, and is + * thus not accessible from Tk. + * TK_HAS_WRAPPER 1 means that this window has a wrapper window + * TK_WIN_MANAGED 1 means that this window is a child of the root + * window, and is managed by the window manager. + * TK_TOP_HIERARCHY 1 means this window is at the top of a physical + * window hierarchy within this process, i.e. the + * window's parent either doesn't exist or is not + * owned by this Tk application. + * TK_PROP_PROPCHANGE 1 means that PropertyNotify events in the + * window's children should propagate up to this + * window. + * TK_WM_MANAGEABLE 1 marks a window as capable of being converted + * into a toplevel using [wm manage]. + */ + +#define TK_MAPPED 1 +#define TK_TOP_LEVEL 2 +#define TK_ALREADY_DEAD 4 +#define TK_NEED_CONFIG_NOTIFY 8 +#define TK_GRAB_FLAG 0x10 +#define TK_CHECKED_IC 0x20 +#define TK_DONT_DESTROY_WINDOW 0x40 +#define TK_WM_COLORMAP_WINDOW 0x80 +#define TK_EMBEDDED 0x100 +#define TK_CONTAINER 0x200 +#define TK_BOTH_HALVES 0x400 +#define TK_WRAPPER 0x1000 +#define TK_REPARENTED 0x2000 +#define TK_ANONYMOUS_WINDOW 0x4000 +#define TK_HAS_WRAPPER 0x8000 +#define TK_WIN_MANAGED 0x10000 +#define TK_TOP_HIERARCHY 0x20000 +#define TK_PROP_PROPCHANGE 0x40000 +#define TK_WM_MANAGEABLE 0x80000 + +/* + *---------------------------------------------------------------------- + * + * Procedure prototypes and structures used for defining new canvas items: + * + *---------------------------------------------------------------------- + */ + +typedef enum { + TK_STATE_NULL = -1, TK_STATE_ACTIVE, TK_STATE_DISABLED, + TK_STATE_NORMAL, TK_STATE_HIDDEN +} Tk_State; + +typedef struct Tk_SmoothMethod { + CONST86 char *name; + int (*coordProc) (Tk_Canvas canvas, double *pointPtr, int numPoints, + int numSteps, XPoint xPoints[], double dblPoints[]); + void (*postscriptProc) (Tcl_Interp *interp, Tk_Canvas canvas, + double *coordPtr, int numPoints, int numSteps); +} Tk_SmoothMethod; + +/* + * For each item in a canvas widget there exists one record with the following + * structure. Each actual item is represented by a record with the following + * stuff at its beginning, plus additional type-specific stuff after that. + */ + +#define TK_TAG_SPACE 3 + +typedef struct Tk_Item { + int id; /* Unique identifier for this item (also + * serves as first tag for item). */ + struct Tk_Item *nextPtr; /* Next in display list of all items in this + * canvas. Later items in list are drawn on + * top of earlier ones. */ + Tk_Uid staticTagSpace[TK_TAG_SPACE]; + /* Built-in space for limited # of tags. */ + Tk_Uid *tagPtr; /* Pointer to array of tags. Usually points to + * staticTagSpace, but may point to malloc-ed + * space if there are lots of tags. */ + int tagSpace; /* Total amount of tag space available at + * tagPtr. */ + int numTags; /* Number of tag slots actually used at + * *tagPtr. */ + struct Tk_ItemType *typePtr;/* Table of procedures that implement this + * type of item. */ + int x1, y1, x2, y2; /* Bounding box for item, in integer canvas + * units. Set by item-specific code and + * guaranteed to contain every pixel drawn in + * item. Item area includes x1 and y1 but not + * x2 and y2. */ + struct Tk_Item *prevPtr; /* Previous in display list of all items in + * this canvas. Later items in list are drawn + * just below earlier ones. */ + Tk_State state; /* State of item. */ + char *reserved1; /* reserved for future use */ + int redraw_flags; /* Some flags used in the canvas */ + + /* + *------------------------------------------------------------------ + * Starting here is additional type-specific stuff; see the declarations + * for individual types to see what is part of each type. The actual space + * below is determined by the "itemInfoSize" of the type's Tk_ItemType + * record. + *------------------------------------------------------------------ + */ +} Tk_Item; + +/* + * Flag bits for canvases (redraw_flags): + * + * TK_ITEM_STATE_DEPENDANT - 1 means that object needs to be redrawn if the + * canvas state changes. + * TK_ITEM_DONT_REDRAW - 1 means that the object redraw is already been + * prepared, so the general canvas code doesn't + * need to do that any more. + */ + +#define TK_ITEM_STATE_DEPENDANT 1 +#define TK_ITEM_DONT_REDRAW 2 + +/* + * Records of the following type are used to describe a type of item (e.g. + * lines, circles, etc.) that can form part of a canvas widget. + */ + +#ifdef USE_OLD_CANVAS +typedef int (Tk_ItemCreateProc)(Tcl_Interp *interp, Tk_Canvas canvas, + Tk_Item *itemPtr, int argc, char **argv); +typedef int (Tk_ItemConfigureProc)(Tcl_Interp *interp, Tk_Canvas canvas, + Tk_Item *itemPtr, int argc, char **argv, int flags); +typedef int (Tk_ItemCoordProc)(Tcl_Interp *interp, Tk_Canvas canvas, + Tk_Item *itemPtr, int argc, char **argv); +#else +typedef int (Tk_ItemCreateProc)(Tcl_Interp *interp, Tk_Canvas canvas, + Tk_Item *itemPtr, int argc, Tcl_Obj *const objv[]); +typedef int (Tk_ItemConfigureProc)(Tcl_Interp *interp, Tk_Canvas canvas, + Tk_Item *itemPtr, int argc, Tcl_Obj *const objv[], + int flags); +typedef int (Tk_ItemCoordProc)(Tcl_Interp *interp, Tk_Canvas canvas, + Tk_Item *itemPtr, int argc, Tcl_Obj *const argv[]); +#endif /* USE_OLD_CANVAS */ +typedef void (Tk_ItemDeleteProc)(Tk_Canvas canvas, Tk_Item *itemPtr, + Display *display); +typedef void (Tk_ItemDisplayProc)(Tk_Canvas canvas, Tk_Item *itemPtr, + Display *display, Drawable dst, int x, int y, int width, + int height); +typedef double (Tk_ItemPointProc)(Tk_Canvas canvas, Tk_Item *itemPtr, + double *pointPtr); +typedef int (Tk_ItemAreaProc)(Tk_Canvas canvas, Tk_Item *itemPtr, + double *rectPtr); +typedef int (Tk_ItemPostscriptProc)(Tcl_Interp *interp, Tk_Canvas canvas, + Tk_Item *itemPtr, int prepass); +typedef void (Tk_ItemScaleProc)(Tk_Canvas canvas, Tk_Item *itemPtr, + double originX, double originY, double scaleX, + double scaleY); +typedef void (Tk_ItemTranslateProc)(Tk_Canvas canvas, Tk_Item *itemPtr, + double deltaX, double deltaY); +#ifdef USE_OLD_CANVAS +typedef int (Tk_ItemIndexProc)(Tcl_Interp *interp, Tk_Canvas canvas, + Tk_Item *itemPtr, char *indexString, int *indexPtr); +#else +typedef int (Tk_ItemIndexProc)(Tcl_Interp *interp, Tk_Canvas canvas, + Tk_Item *itemPtr, Tcl_Obj *indexString, int *indexPtr); +#endif /* USE_OLD_CANVAS */ +typedef void (Tk_ItemCursorProc)(Tk_Canvas canvas, Tk_Item *itemPtr, + int index); +typedef int (Tk_ItemSelectionProc)(Tk_Canvas canvas, Tk_Item *itemPtr, + int offset, char *buffer, int maxBytes); +#ifdef USE_OLD_CANVAS +typedef void (Tk_ItemInsertProc)(Tk_Canvas canvas, Tk_Item *itemPtr, + int beforeThis, char *string); +#else +typedef void (Tk_ItemInsertProc)(Tk_Canvas canvas, Tk_Item *itemPtr, + int beforeThis, Tcl_Obj *string); +#endif /* USE_OLD_CANVAS */ +typedef void (Tk_ItemDCharsProc)(Tk_Canvas canvas, Tk_Item *itemPtr, + int first, int last); + +#ifndef __NO_OLD_CONFIG + +typedef struct Tk_ItemType { + CONST86 char *name; /* The name of this type of item, such as + * "line". */ + int itemSize; /* Total amount of space needed for item's + * record. */ + Tk_ItemCreateProc *createProc; + /* Procedure to create a new item of this + * type. */ + CONST86 Tk_ConfigSpec *configSpecs; /* Pointer to array of configuration specs for + * this type. Used for returning configuration + * info. */ + Tk_ItemConfigureProc *configProc; + /* Procedure to call to change configuration + * options. */ + Tk_ItemCoordProc *coordProc;/* Procedure to call to get and set the item's + * coordinates. */ + Tk_ItemDeleteProc *deleteProc; + /* Procedure to delete existing item of this + * type. */ + Tk_ItemDisplayProc *displayProc; + /* Procedure to display items of this type. */ + int alwaysRedraw; /* Non-zero means displayProc should be called + * even when the item has been moved + * off-screen. */ + Tk_ItemPointProc *pointProc;/* Computes distance from item to a given + * point. */ + Tk_ItemAreaProc *areaProc; /* Computes whether item is inside, outside, + * or overlapping an area. */ + Tk_ItemPostscriptProc *postscriptProc; + /* Procedure to write a Postscript description + * for items of this type. */ + Tk_ItemScaleProc *scaleProc;/* Procedure to rescale items of this type. */ + Tk_ItemTranslateProc *translateProc; + /* Procedure to translate items of this + * type. */ + Tk_ItemIndexProc *indexProc;/* Procedure to determine index of indicated + * character. NULL if item doesn't support + * indexing. */ + Tk_ItemCursorProc *icursorProc; + /* Procedure to set insert cursor posn to just + * before a given position. */ + Tk_ItemSelectionProc *selectionProc; + /* Procedure to return selection (in STRING + * format) when it is in this item. */ + Tk_ItemInsertProc *insertProc; + /* Procedure to insert something into an + * item. */ + Tk_ItemDCharsProc *dCharsProc; + /* Procedure to delete characters from an + * item. */ + struct Tk_ItemType *nextPtr;/* Used to link types together into a list. */ + char *reserved1; /* Reserved for future extension. */ + int reserved2; /* Carefully compatible with */ + char *reserved3; /* Jan Nijtmans dash patch */ + char *reserved4; +} Tk_ItemType; + +/* + * Flag (used in the alwaysRedraw field) to say whether an item supports + * point-level manipulation like the line and polygon items. + */ + +#define TK_MOVABLE_POINTS 2 + +#endif /* __NO_OLD_CONFIG */ + +/* + * The following structure provides information about the selection and the + * insertion cursor. It is needed by only a few items, such as those that + * display text. It is shared by the generic canvas code and the item-specific + * code, but most of the fields should be written only by the canvas generic + * code. + */ + +typedef struct Tk_CanvasTextInfo { + Tk_3DBorder selBorder; /* Border and background for selected + * characters. Read-only to items.*/ + int selBorderWidth; /* Width of border around selection. Read-only + * to items. */ + XColor *selFgColorPtr; /* Foreground color for selected text. + * Read-only to items. */ + Tk_Item *selItemPtr; /* Pointer to selected item. NULL means + * selection isn't in this canvas. Writable by + * items. */ + int selectFirst; /* Character index of first selected + * character. Writable by items. */ + int selectLast; /* Character index of last selected character. + * Writable by items. */ + Tk_Item *anchorItemPtr; /* Item corresponding to "selectAnchor": not + * necessarily selItemPtr. Read-only to + * items. */ + int selectAnchor; /* Character index of fixed end of selection + * (i.e. "select to" operation will use this + * as one end of the selection). Writable by + * items. */ + Tk_3DBorder insertBorder; /* Used to draw vertical bar for insertion + * cursor. Read-only to items. */ + int insertWidth; /* Total width of insertion cursor. Read-only + * to items. */ + int insertBorderWidth; /* Width of 3-D border around insert cursor. + * Read-only to items. */ + Tk_Item *focusItemPtr; /* Item that currently has the input focus, or + * NULL if no such item. Read-only to items. */ + int gotFocus; /* Non-zero means that the canvas widget has + * the input focus. Read-only to items.*/ + int cursorOn; /* Non-zero means that an insertion cursor + * should be displayed in focusItemPtr. + * Read-only to items.*/ +} Tk_CanvasTextInfo; + +/* + * Structures used for Dashing and Outline. + */ + +typedef struct Tk_Dash { + int number; + union { + char *pt; + char array[sizeof(char *)]; + } pattern; +} Tk_Dash; + +typedef struct Tk_TSOffset { + int flags; /* Flags; see below for possible values */ + int xoffset; /* x offset */ + int yoffset; /* y offset */ +} Tk_TSOffset; + +/* + * Bit fields in Tk_Offset->flags: + */ + +#define TK_OFFSET_INDEX 1 +#define TK_OFFSET_RELATIVE 2 +#define TK_OFFSET_LEFT 4 +#define TK_OFFSET_CENTER 8 +#define TK_OFFSET_RIGHT 16 +#define TK_OFFSET_TOP 32 +#define TK_OFFSET_MIDDLE 64 +#define TK_OFFSET_BOTTOM 128 + +typedef struct Tk_Outline { + GC gc; /* Graphics context. */ + double width; /* Width of outline. */ + double activeWidth; /* Width of outline. */ + double disabledWidth; /* Width of outline. */ + int offset; /* Dash offset. */ + Tk_Dash dash; /* Dash pattern. */ + Tk_Dash activeDash; /* Dash pattern if state is active. */ + Tk_Dash disabledDash; /* Dash pattern if state is disabled. */ + void *reserved1; /* Reserved for future expansion. */ + void *reserved2; + void *reserved3; + Tk_TSOffset tsoffset; /* Stipple offset for outline. */ + XColor *color; /* Outline color. */ + XColor *activeColor; /* Outline color if state is active. */ + XColor *disabledColor; /* Outline color if state is disabled. */ + Pixmap stipple; /* Outline Stipple pattern. */ + Pixmap activeStipple; /* Outline Stipple pattern if state is + * active. */ + Pixmap disabledStipple; /* Outline Stipple pattern if state is + * disabled. */ +} Tk_Outline; + +/* + *---------------------------------------------------------------------- + * + * Procedure prototypes and structures used for managing images: + * + *---------------------------------------------------------------------- + */ + +typedef struct Tk_ImageType Tk_ImageType; +#ifdef USE_OLD_IMAGE +typedef int (Tk_ImageCreateProc) (Tcl_Interp *interp, char *name, int argc, + char **argv, Tk_ImageType *typePtr, Tk_ImageMaster master, + ClientData *masterDataPtr); +#else +typedef int (Tk_ImageCreateProc) (Tcl_Interp *interp, CONST86 char *name, int objc, + Tcl_Obj *const objv[], CONST86 Tk_ImageType *typePtr, Tk_ImageMaster master, + ClientData *masterDataPtr); +#endif /* USE_OLD_IMAGE */ +typedef ClientData (Tk_ImageGetProc) (Tk_Window tkwin, ClientData masterData); +typedef void (Tk_ImageDisplayProc) (ClientData instanceData, Display *display, + Drawable drawable, int imageX, int imageY, int width, int height, + int drawableX, int drawableY); +typedef void (Tk_ImageFreeProc) (ClientData instanceData, Display *display); +typedef void (Tk_ImageDeleteProc) (ClientData masterData); +typedef void (Tk_ImageChangedProc) (ClientData clientData, int x, int y, + int width, int height, int imageWidth, int imageHeight); +typedef int (Tk_ImagePostscriptProc) (ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, Tk_PostscriptInfo psinfo, + int x, int y, int width, int height, int prepass); + +/* + * The following structure represents a particular type of image (bitmap, xpm + * image, etc.). It provides information common to all images of that type, + * such as the type name and a collection of procedures in the image manager + * that respond to various events. Each image manager is represented by one of + * these structures. + */ + +struct Tk_ImageType { + CONST86 char *name; /* Name of image type. */ + Tk_ImageCreateProc *createProc; + /* Procedure to call to create a new image of + * this type. */ + Tk_ImageGetProc *getProc; /* Procedure to call the first time + * Tk_GetImage is called in a new way (new + * visual or screen). */ + Tk_ImageDisplayProc *displayProc; + /* Call to draw image, in response to + * Tk_RedrawImage calls. */ + Tk_ImageFreeProc *freeProc; /* Procedure to call whenever Tk_FreeImage is + * called to release an instance of an + * image. */ + Tk_ImageDeleteProc *deleteProc; + /* Procedure to call to delete image. It will + * not be called until after freeProc has been + * called for each instance of the image. */ + Tk_ImagePostscriptProc *postscriptProc; + /* Procedure to call to produce postscript + * output for the image. */ + struct Tk_ImageType *nextPtr; + /* Next in list of all image types currently + * known. Filled in by Tk, not by image + * manager. */ + char *reserved; /* reserved for future expansion */ +}; + +/* + *---------------------------------------------------------------------- + * + * Additional definitions used to manage images of type "photo". + * + *---------------------------------------------------------------------- + */ + +/* + * The following type is used to identify a particular photo image to be + * manipulated: + */ + +typedef void *Tk_PhotoHandle; + +/* + * The following structure describes a block of pixels in memory: + */ + +typedef struct Tk_PhotoImageBlock { + unsigned char *pixelPtr; /* Pointer to the first pixel. */ + int width; /* Width of block, in pixels. */ + int height; /* Height of block, in pixels. */ + int pitch; /* Address difference between corresponding + * pixels in successive lines. */ + int pixelSize; /* Address difference between successive + * pixels in the same line. */ + int offset[4]; /* Address differences between the red, green, + * blue and alpha components of the pixel and + * the pixel as a whole. */ +} Tk_PhotoImageBlock; + +/* + * The following values control how blocks are combined into photo images when + * the alpha component of a pixel is not 255, a.k.a. the compositing rule. + */ + +#define TK_PHOTO_COMPOSITE_OVERLAY 0 +#define TK_PHOTO_COMPOSITE_SET 1 + +/* + * Procedure prototypes and structures used in reading and writing photo + * images: + */ + +typedef struct Tk_PhotoImageFormat Tk_PhotoImageFormat; +#ifdef USE_OLD_IMAGE +typedef int (Tk_ImageFileMatchProc) (Tcl_Channel chan, char *fileName, + char *formatString, int *widthPtr, int *heightPtr); +typedef int (Tk_ImageStringMatchProc) (char *string, char *formatString, + int *widthPtr, int *heightPtr); +typedef int (Tk_ImageFileReadProc) (Tcl_Interp *interp, Tcl_Channel chan, + char *fileName, char *formatString, Tk_PhotoHandle imageHandle, + int destX, int destY, int width, int height, int srcX, int srcY); +typedef int (Tk_ImageStringReadProc) (Tcl_Interp *interp, char *string, + char *formatString, Tk_PhotoHandle imageHandle, int destX, int destY, + int width, int height, int srcX, int srcY); +typedef int (Tk_ImageFileWriteProc) (Tcl_Interp *interp, char *fileName, + char *formatString, Tk_PhotoImageBlock *blockPtr); +typedef int (Tk_ImageStringWriteProc) (Tcl_Interp *interp, + Tcl_DString *dataPtr, char *formatString, Tk_PhotoImageBlock *blockPtr); +#else +typedef int (Tk_ImageFileMatchProc) (Tcl_Channel chan, const char *fileName, + Tcl_Obj *format, int *widthPtr, int *heightPtr, Tcl_Interp *interp); +typedef int (Tk_ImageStringMatchProc) (Tcl_Obj *dataObj, Tcl_Obj *format, + int *widthPtr, int *heightPtr, Tcl_Interp *interp); +typedef int (Tk_ImageFileReadProc) (Tcl_Interp *interp, Tcl_Channel chan, + const char *fileName, Tcl_Obj *format, Tk_PhotoHandle imageHandle, + int destX, int destY, int width, int height, int srcX, int srcY); +typedef int (Tk_ImageStringReadProc) (Tcl_Interp *interp, Tcl_Obj *dataObj, + Tcl_Obj *format, Tk_PhotoHandle imageHandle, int destX, int destY, + int width, int height, int srcX, int srcY); +typedef int (Tk_ImageFileWriteProc) (Tcl_Interp *interp, const char *fileName, + Tcl_Obj *format, Tk_PhotoImageBlock *blockPtr); +typedef int (Tk_ImageStringWriteProc) (Tcl_Interp *interp, Tcl_Obj *format, + Tk_PhotoImageBlock *blockPtr); +#endif /* USE_OLD_IMAGE */ + +/* + * The following structure represents a particular file format for storing + * images (e.g., PPM, GIF, JPEG, etc.). It provides information to allow image + * files of that format to be recognized and read into a photo image. + */ + +struct Tk_PhotoImageFormat { + CONST86 char *name; /* Name of image file format */ + Tk_ImageFileMatchProc *fileMatchProc; + /* Procedure to call to determine whether an + * image file matches this format. */ + Tk_ImageStringMatchProc *stringMatchProc; + /* Procedure to call to determine whether the + * data in a string matches this format. */ + Tk_ImageFileReadProc *fileReadProc; + /* Procedure to call to read data from an + * image file into a photo image. */ + Tk_ImageStringReadProc *stringReadProc; + /* Procedure to call to read data from a + * string into a photo image. */ + Tk_ImageFileWriteProc *fileWriteProc; + /* Procedure to call to write data from a + * photo image to a file. */ + Tk_ImageStringWriteProc *stringWriteProc; + /* Procedure to call to obtain a string + * representation of the data in a photo + * image.*/ + struct Tk_PhotoImageFormat *nextPtr; + /* Next in list of all photo image formats + * currently known. Filled in by Tk, not by + * image format handler. */ +}; + +/* + *---------------------------------------------------------------------- + * + * Procedure prototypes and structures used for managing styles: + * + *---------------------------------------------------------------------- + */ + +/* + * Style support version tag. + */ + +#define TK_STYLE_VERSION_1 0x1 +#define TK_STYLE_VERSION TK_STYLE_VERSION_1 + +/* + * The following structures and prototypes are used as static templates to + * declare widget elements. + */ + +typedef void (Tk_GetElementSizeProc) (ClientData clientData, char *recordPtr, + const Tk_OptionSpec **optionsPtr, Tk_Window tkwin, int width, + int height, int inner, int *widthPtr, int *heightPtr); +typedef void (Tk_GetElementBoxProc) (ClientData clientData, char *recordPtr, + const Tk_OptionSpec **optionsPtr, Tk_Window tkwin, int x, int y, + int width, int height, int inner, int *xPtr, int *yPtr, int *widthPtr, + int *heightPtr); +typedef int (Tk_GetElementBorderWidthProc) (ClientData clientData, + char *recordPtr, const Tk_OptionSpec **optionsPtr, Tk_Window tkwin); +typedef void (Tk_DrawElementProc) (ClientData clientData, char *recordPtr, + const Tk_OptionSpec **optionsPtr, Tk_Window tkwin, Drawable d, int x, + int y, int width, int height, int state); + +typedef struct Tk_ElementOptionSpec { + char *name; /* Name of the required option. */ + Tk_OptionType type; /* Accepted option type. TK_OPTION_END means + * any. */ +} Tk_ElementOptionSpec; + +typedef struct Tk_ElementSpec { + int version; /* Version of the style support. */ + char *name; /* Name of element. */ + Tk_ElementOptionSpec *options; + /* List of required options. Last one's name + * must be NULL. */ + Tk_GetElementSizeProc *getSize; + /* Compute the external (resp. internal) size + * of the element from its desired internal + * (resp. external) size. */ + Tk_GetElementBoxProc *getBox; + /* Compute the inscribed or bounding boxes + * within a given area. */ + Tk_GetElementBorderWidthProc *getBorderWidth; + /* Return the element's internal border width. + * Mostly useful for widgets. */ + Tk_DrawElementProc *draw; /* Draw the element in the given bounding + * box. */ +} Tk_ElementSpec; + +/* + * Element state flags. Can be OR'ed. + */ + +#define TK_ELEMENT_STATE_ACTIVE 1<<0 +#define TK_ELEMENT_STATE_DISABLED 1<<1 +#define TK_ELEMENT_STATE_FOCUS 1<<2 +#define TK_ELEMENT_STATE_PRESSED 1<<3 + +/* + *---------------------------------------------------------------------- + * + * The definitions below provide backward compatibility for functions and + * types related to event handling that used to be in Tk but have moved to + * Tcl. + * + *---------------------------------------------------------------------- + */ + +#define TK_READABLE TCL_READABLE +#define TK_WRITABLE TCL_WRITABLE +#define TK_EXCEPTION TCL_EXCEPTION + +#define TK_DONT_WAIT TCL_DONT_WAIT +#define TK_X_EVENTS TCL_WINDOW_EVENTS +#define TK_WINDOW_EVENTS TCL_WINDOW_EVENTS +#define TK_FILE_EVENTS TCL_FILE_EVENTS +#define TK_TIMER_EVENTS TCL_TIMER_EVENTS +#define TK_IDLE_EVENTS TCL_IDLE_EVENTS +#define TK_ALL_EVENTS TCL_ALL_EVENTS + +#define Tk_IdleProc Tcl_IdleProc +#define Tk_FileProc Tcl_FileProc +#define Tk_TimerProc Tcl_TimerProc +#define Tk_TimerToken Tcl_TimerToken + +#define Tk_BackgroundError Tcl_BackgroundError +#define Tk_CancelIdleCall Tcl_CancelIdleCall +#define Tk_CreateFileHandler Tcl_CreateFileHandler +#define Tk_CreateTimerHandler Tcl_CreateTimerHandler +#define Tk_DeleteFileHandler Tcl_DeleteFileHandler +#define Tk_DeleteTimerHandler Tcl_DeleteTimerHandler +#define Tk_DoOneEvent Tcl_DoOneEvent +#define Tk_DoWhenIdle Tcl_DoWhenIdle +#define Tk_Sleep Tcl_Sleep + +/* Additional stuff that has moved to Tcl: */ + +#define Tk_EventuallyFree Tcl_EventuallyFree +#define Tk_FreeProc Tcl_FreeProc +#define Tk_Preserve Tcl_Preserve +#define Tk_Release Tcl_Release + +/* Removed Tk_Main, use macro instead */ +#if defined(_WIN32) || defined(__CYGWIN__) +#define Tk_Main(argc, argv, proc) Tk_MainEx(argc, argv, proc, \ + (Tcl_FindExecutable(0), (Tcl_CreateInterp)())) +#else +#define Tk_Main(argc, argv, proc) Tk_MainEx(argc, argv, proc, \ + (Tcl_FindExecutable(argv[0]), (Tcl_CreateInterp)())) +#endif +const char * Tk_InitStubs(Tcl_Interp *interp, const char *version, + int exact); +EXTERN const char * Tk_PkgInitStubsCheck(Tcl_Interp *interp, + const char *version, int exact); + +#ifndef USE_TK_STUBS +#define Tk_InitStubs(interp, version, exact) \ + Tk_PkgInitStubsCheck(interp, version, exact) +#endif /* USE_TK_STUBS */ + +#define Tk_InitImageArgs(interp, argc, argv) /**/ + +/* + *---------------------------------------------------------------------- + * + * Additional procedure types defined by Tk. + * + *---------------------------------------------------------------------- + */ + +typedef int (Tk_ErrorProc) (ClientData clientData, XErrorEvent *errEventPtr); +typedef void (Tk_EventProc) (ClientData clientData, XEvent *eventPtr); +typedef int (Tk_GenericProc) (ClientData clientData, XEvent *eventPtr); +typedef int (Tk_ClientMessageProc) (Tk_Window tkwin, XEvent *eventPtr); +typedef int (Tk_GetSelProc) (ClientData clientData, Tcl_Interp *interp, + CONST86 char *portion); +typedef void (Tk_LostSelProc) (ClientData clientData); +typedef Tk_RestrictAction (Tk_RestrictProc) (ClientData clientData, + XEvent *eventPtr); +typedef int (Tk_SelectionProc) (ClientData clientData, int offset, + char *buffer, int maxBytes); + +/* + *---------------------------------------------------------------------- + * + * Platform independent exported procedures and variables. + * + *---------------------------------------------------------------------- + */ + +#include "tkDecls.h" + +#ifdef USE_OLD_IMAGE +#undef Tk_CreateImageType +#define Tk_CreateImageType Tk_CreateOldImageType +#undef Tk_CreatePhotoImageFormat +#define Tk_CreatePhotoImageFormat Tk_CreateOldPhotoImageFormat +#endif /* USE_OLD_IMAGE */ + +/* + *---------------------------------------------------------------------- + * + * Allow users to say that they don't want to alter their source to add extra + * arguments to Tk_PhotoPutBlock() et al; DO NOT DEFINE THIS WHEN BUILDING TK. + * + * This goes after the inclusion of the stubbed-decls so that the declarations + * of what is actually there can be correct. + */ + +#ifdef USE_COMPOSITELESS_PHOTO_PUT_BLOCK +# ifdef Tk_PhotoPutBlock +# undef Tk_PhotoPutBlock +# endif +# define Tk_PhotoPutBlock Tk_PhotoPutBlock_NoComposite +# ifdef Tk_PhotoPutZoomedBlock +# undef Tk_PhotoPutZoomedBlock +# endif +# define Tk_PhotoPutZoomedBlock Tk_PhotoPutZoomedBlock_NoComposite +# define USE_PANIC_ON_PHOTO_ALLOC_FAILURE +#else /* !USE_COMPOSITELESS_PHOTO_PUT_BLOCK */ +# ifdef USE_PANIC_ON_PHOTO_ALLOC_FAILURE +# ifdef Tk_PhotoPutBlock +# undef Tk_PhotoPutBlock +# endif +# define Tk_PhotoPutBlock Tk_PhotoPutBlock_Panic +# ifdef Tk_PhotoPutZoomedBlock +# undef Tk_PhotoPutZoomedBlock +# endif +# define Tk_PhotoPutZoomedBlock Tk_PhotoPutZoomedBlock_Panic +# endif /* USE_PANIC_ON_PHOTO_ALLOC_FAILURE */ +#endif /* USE_COMPOSITELESS_PHOTO_PUT_BLOCK */ +#ifdef USE_PANIC_ON_PHOTO_ALLOC_FAILURE +# ifdef Tk_PhotoExpand +# undef Tk_PhotoExpand +# endif +# define Tk_PhotoExpand Tk_PhotoExpand_Panic +# ifdef Tk_PhotoSetSize +# undef Tk_PhotoSetSize +# endif +# define Tk_PhotoSetSize Tk_PhotoSetSize_Panic +#endif /* USE_PANIC_ON_PHOTO_ALLOC_FAILURE */ + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#endif /* RC_INVOKED */ + +/* + * end block for C++ + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TK */ + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tkDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tkDecls.h new file mode 100644 index 00000000..64c32cd2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tkDecls.h @@ -0,0 +1,1733 @@ +/* + * tkDecls.h -- + * + * Declarations of functions in the platform independent public Tcl API. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TKDECLS +#define _TKDECLS + +#ifdef BUILD_tk +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLEXPORT +#endif + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tk.decls script. + */ + +/* !BEGIN!: Do not edit below this line. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Exported function declarations: + */ + +/* 0 */ +EXTERN void Tk_MainLoop(void); +/* 1 */ +EXTERN XColor * Tk_3DBorderColor(Tk_3DBorder border); +/* 2 */ +EXTERN GC Tk_3DBorderGC(Tk_Window tkwin, Tk_3DBorder border, + int which); +/* 3 */ +EXTERN void Tk_3DHorizontalBevel(Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, int x, + int y, int width, int height, int leftIn, + int rightIn, int topBevel, int relief); +/* 4 */ +EXTERN void Tk_3DVerticalBevel(Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, int x, + int y, int width, int height, int leftBevel, + int relief); +/* 5 */ +EXTERN void Tk_AddOption(Tk_Window tkwin, const char *name, + const char *value, int priority); +/* 6 */ +EXTERN void Tk_BindEvent(Tk_BindingTable bindingTable, + XEvent *eventPtr, Tk_Window tkwin, + int numObjects, ClientData *objectPtr); +/* 7 */ +EXTERN void Tk_CanvasDrawableCoords(Tk_Canvas canvas, double x, + double y, short *drawableXPtr, + short *drawableYPtr); +/* 8 */ +EXTERN void Tk_CanvasEventuallyRedraw(Tk_Canvas canvas, int x1, + int y1, int x2, int y2); +/* 9 */ +EXTERN int Tk_CanvasGetCoord(Tcl_Interp *interp, + Tk_Canvas canvas, const char *str, + double *doublePtr); +/* 10 */ +EXTERN Tk_CanvasTextInfo * Tk_CanvasGetTextInfo(Tk_Canvas canvas); +/* 11 */ +EXTERN int Tk_CanvasPsBitmap(Tcl_Interp *interp, + Tk_Canvas canvas, Pixmap bitmap, int x, + int y, int width, int height); +/* 12 */ +EXTERN int Tk_CanvasPsColor(Tcl_Interp *interp, + Tk_Canvas canvas, XColor *colorPtr); +/* 13 */ +EXTERN int Tk_CanvasPsFont(Tcl_Interp *interp, Tk_Canvas canvas, + Tk_Font font); +/* 14 */ +EXTERN void Tk_CanvasPsPath(Tcl_Interp *interp, Tk_Canvas canvas, + double *coordPtr, int numPoints); +/* 15 */ +EXTERN int Tk_CanvasPsStipple(Tcl_Interp *interp, + Tk_Canvas canvas, Pixmap bitmap); +/* 16 */ +EXTERN double Tk_CanvasPsY(Tk_Canvas canvas, double y); +/* 17 */ +EXTERN void Tk_CanvasSetStippleOrigin(Tk_Canvas canvas, GC gc); +/* 18 */ +EXTERN int Tk_CanvasTagsParseProc(ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, + const char *value, char *widgRec, int offset); +/* 19 */ +EXTERN CONST86 char * Tk_CanvasTagsPrintProc(ClientData clientData, + Tk_Window tkwin, char *widgRec, int offset, + Tcl_FreeProc **freeProcPtr); +/* 20 */ +EXTERN Tk_Window Tk_CanvasTkwin(Tk_Canvas canvas); +/* 21 */ +EXTERN void Tk_CanvasWindowCoords(Tk_Canvas canvas, double x, + double y, short *screenXPtr, + short *screenYPtr); +/* 22 */ +EXTERN void Tk_ChangeWindowAttributes(Tk_Window tkwin, + unsigned long valueMask, + XSetWindowAttributes *attsPtr); +/* 23 */ +EXTERN int Tk_CharBbox(Tk_TextLayout layout, int index, + int *xPtr, int *yPtr, int *widthPtr, + int *heightPtr); +/* 24 */ +EXTERN void Tk_ClearSelection(Tk_Window tkwin, Atom selection); +/* 25 */ +EXTERN int Tk_ClipboardAppend(Tcl_Interp *interp, + Tk_Window tkwin, Atom target, Atom format, + const char *buffer); +/* 26 */ +EXTERN int Tk_ClipboardClear(Tcl_Interp *interp, + Tk_Window tkwin); +/* 27 */ +EXTERN int Tk_ConfigureInfo(Tcl_Interp *interp, Tk_Window tkwin, + const Tk_ConfigSpec *specs, char *widgRec, + const char *argvName, int flags); +/* 28 */ +EXTERN int Tk_ConfigureValue(Tcl_Interp *interp, + Tk_Window tkwin, const Tk_ConfigSpec *specs, + char *widgRec, const char *argvName, + int flags); +/* 29 */ +EXTERN int Tk_ConfigureWidget(Tcl_Interp *interp, + Tk_Window tkwin, const Tk_ConfigSpec *specs, + int argc, CONST84 char **argv, char *widgRec, + int flags); +/* 30 */ +EXTERN void Tk_ConfigureWindow(Tk_Window tkwin, + unsigned int valueMask, + XWindowChanges *valuePtr); +/* 31 */ +EXTERN Tk_TextLayout Tk_ComputeTextLayout(Tk_Font font, const char *str, + int numChars, int wrapLength, + Tk_Justify justify, int flags, int *widthPtr, + int *heightPtr); +/* 32 */ +EXTERN Tk_Window Tk_CoordsToWindow(int rootX, int rootY, + Tk_Window tkwin); +/* 33 */ +EXTERN unsigned long Tk_CreateBinding(Tcl_Interp *interp, + Tk_BindingTable bindingTable, + ClientData object, const char *eventStr, + const char *script, int append); +/* 34 */ +EXTERN Tk_BindingTable Tk_CreateBindingTable(Tcl_Interp *interp); +/* 35 */ +EXTERN Tk_ErrorHandler Tk_CreateErrorHandler(Display *display, int errNum, + int request, int minorCode, + Tk_ErrorProc *errorProc, + ClientData clientData); +/* 36 */ +EXTERN void Tk_CreateEventHandler(Tk_Window token, + unsigned long mask, Tk_EventProc *proc, + ClientData clientData); +/* 37 */ +EXTERN void Tk_CreateGenericHandler(Tk_GenericProc *proc, + ClientData clientData); +/* 38 */ +EXTERN void Tk_CreateImageType(const Tk_ImageType *typePtr); +/* 39 */ +EXTERN void Tk_CreateItemType(Tk_ItemType *typePtr); +/* 40 */ +EXTERN void Tk_CreatePhotoImageFormat( + const Tk_PhotoImageFormat *formatPtr); +/* 41 */ +EXTERN void Tk_CreateSelHandler(Tk_Window tkwin, Atom selection, + Atom target, Tk_SelectionProc *proc, + ClientData clientData, Atom format); +/* 42 */ +EXTERN Tk_Window Tk_CreateWindow(Tcl_Interp *interp, Tk_Window parent, + const char *name, const char *screenName); +/* 43 */ +EXTERN Tk_Window Tk_CreateWindowFromPath(Tcl_Interp *interp, + Tk_Window tkwin, const char *pathName, + const char *screenName); +/* 44 */ +EXTERN int Tk_DefineBitmap(Tcl_Interp *interp, const char *name, + const void *source, int width, int height); +/* 45 */ +EXTERN void Tk_DefineCursor(Tk_Window window, Tk_Cursor cursor); +/* 46 */ +EXTERN void Tk_DeleteAllBindings(Tk_BindingTable bindingTable, + ClientData object); +/* 47 */ +EXTERN int Tk_DeleteBinding(Tcl_Interp *interp, + Tk_BindingTable bindingTable, + ClientData object, const char *eventStr); +/* 48 */ +EXTERN void Tk_DeleteBindingTable(Tk_BindingTable bindingTable); +/* 49 */ +EXTERN void Tk_DeleteErrorHandler(Tk_ErrorHandler handler); +/* 50 */ +EXTERN void Tk_DeleteEventHandler(Tk_Window token, + unsigned long mask, Tk_EventProc *proc, + ClientData clientData); +/* 51 */ +EXTERN void Tk_DeleteGenericHandler(Tk_GenericProc *proc, + ClientData clientData); +/* 52 */ +EXTERN void Tk_DeleteImage(Tcl_Interp *interp, const char *name); +/* 53 */ +EXTERN void Tk_DeleteSelHandler(Tk_Window tkwin, Atom selection, + Atom target); +/* 54 */ +EXTERN void Tk_DestroyWindow(Tk_Window tkwin); +/* 55 */ +EXTERN CONST84_RETURN char * Tk_DisplayName(Tk_Window tkwin); +/* 56 */ +EXTERN int Tk_DistanceToTextLayout(Tk_TextLayout layout, int x, + int y); +/* 57 */ +EXTERN void Tk_Draw3DPolygon(Tk_Window tkwin, Drawable drawable, + Tk_3DBorder border, XPoint *pointPtr, + int numPoints, int borderWidth, + int leftRelief); +/* 58 */ +EXTERN void Tk_Draw3DRectangle(Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, int x, + int y, int width, int height, + int borderWidth, int relief); +/* 59 */ +EXTERN void Tk_DrawChars(Display *display, Drawable drawable, + GC gc, Tk_Font tkfont, const char *source, + int numBytes, int x, int y); +/* 60 */ +EXTERN void Tk_DrawFocusHighlight(Tk_Window tkwin, GC gc, + int width, Drawable drawable); +/* 61 */ +EXTERN void Tk_DrawTextLayout(Display *display, + Drawable drawable, GC gc, + Tk_TextLayout layout, int x, int y, + int firstChar, int lastChar); +/* 62 */ +EXTERN void Tk_Fill3DPolygon(Tk_Window tkwin, Drawable drawable, + Tk_3DBorder border, XPoint *pointPtr, + int numPoints, int borderWidth, + int leftRelief); +/* 63 */ +EXTERN void Tk_Fill3DRectangle(Tk_Window tkwin, + Drawable drawable, Tk_3DBorder border, int x, + int y, int width, int height, + int borderWidth, int relief); +/* 64 */ +EXTERN Tk_PhotoHandle Tk_FindPhoto(Tcl_Interp *interp, + const char *imageName); +/* 65 */ +EXTERN Font Tk_FontId(Tk_Font font); +/* 66 */ +EXTERN void Tk_Free3DBorder(Tk_3DBorder border); +/* 67 */ +EXTERN void Tk_FreeBitmap(Display *display, Pixmap bitmap); +/* 68 */ +EXTERN void Tk_FreeColor(XColor *colorPtr); +/* 69 */ +EXTERN void Tk_FreeColormap(Display *display, Colormap colormap); +/* 70 */ +EXTERN void Tk_FreeCursor(Display *display, Tk_Cursor cursor); +/* 71 */ +EXTERN void Tk_FreeFont(Tk_Font f); +/* 72 */ +EXTERN void Tk_FreeGC(Display *display, GC gc); +/* 73 */ +EXTERN void Tk_FreeImage(Tk_Image image); +/* 74 */ +EXTERN void Tk_FreeOptions(const Tk_ConfigSpec *specs, + char *widgRec, Display *display, + int needFlags); +/* 75 */ +EXTERN void Tk_FreePixmap(Display *display, Pixmap pixmap); +/* 76 */ +EXTERN void Tk_FreeTextLayout(Tk_TextLayout textLayout); +/* 77 */ +EXTERN void Tk_FreeXId(Display *display, XID xid); +/* 78 */ +EXTERN GC Tk_GCForColor(XColor *colorPtr, Drawable drawable); +/* 79 */ +EXTERN void Tk_GeometryRequest(Tk_Window tkwin, int reqWidth, + int reqHeight); +/* 80 */ +EXTERN Tk_3DBorder Tk_Get3DBorder(Tcl_Interp *interp, Tk_Window tkwin, + Tk_Uid colorName); +/* 81 */ +EXTERN void Tk_GetAllBindings(Tcl_Interp *interp, + Tk_BindingTable bindingTable, + ClientData object); +/* 82 */ +EXTERN int Tk_GetAnchor(Tcl_Interp *interp, const char *str, + Tk_Anchor *anchorPtr); +/* 83 */ +EXTERN CONST84_RETURN char * Tk_GetAtomName(Tk_Window tkwin, Atom atom); +/* 84 */ +EXTERN CONST84_RETURN char * Tk_GetBinding(Tcl_Interp *interp, + Tk_BindingTable bindingTable, + ClientData object, const char *eventStr); +/* 85 */ +EXTERN Pixmap Tk_GetBitmap(Tcl_Interp *interp, Tk_Window tkwin, + const char *str); +/* 86 */ +EXTERN Pixmap Tk_GetBitmapFromData(Tcl_Interp *interp, + Tk_Window tkwin, const void *source, + int width, int height); +/* 87 */ +EXTERN int Tk_GetCapStyle(Tcl_Interp *interp, const char *str, + int *capPtr); +/* 88 */ +EXTERN XColor * Tk_GetColor(Tcl_Interp *interp, Tk_Window tkwin, + Tk_Uid name); +/* 89 */ +EXTERN XColor * Tk_GetColorByValue(Tk_Window tkwin, XColor *colorPtr); +/* 90 */ +EXTERN Colormap Tk_GetColormap(Tcl_Interp *interp, Tk_Window tkwin, + const char *str); +/* 91 */ +EXTERN Tk_Cursor Tk_GetCursor(Tcl_Interp *interp, Tk_Window tkwin, + Tk_Uid str); +/* 92 */ +EXTERN Tk_Cursor Tk_GetCursorFromData(Tcl_Interp *interp, + Tk_Window tkwin, const char *source, + const char *mask, int width, int height, + int xHot, int yHot, Tk_Uid fg, Tk_Uid bg); +/* 93 */ +EXTERN Tk_Font Tk_GetFont(Tcl_Interp *interp, Tk_Window tkwin, + const char *str); +/* 94 */ +EXTERN Tk_Font Tk_GetFontFromObj(Tk_Window tkwin, Tcl_Obj *objPtr); +/* 95 */ +EXTERN void Tk_GetFontMetrics(Tk_Font font, + Tk_FontMetrics *fmPtr); +/* 96 */ +EXTERN GC Tk_GetGC(Tk_Window tkwin, unsigned long valueMask, + XGCValues *valuePtr); +/* 97 */ +EXTERN Tk_Image Tk_GetImage(Tcl_Interp *interp, Tk_Window tkwin, + const char *name, + Tk_ImageChangedProc *changeProc, + ClientData clientData); +/* 98 */ +EXTERN ClientData Tk_GetImageMasterData(Tcl_Interp *interp, + const char *name, + CONST86 Tk_ImageType **typePtrPtr); +/* 99 */ +EXTERN Tk_ItemType * Tk_GetItemTypes(void); +/* 100 */ +EXTERN int Tk_GetJoinStyle(Tcl_Interp *interp, const char *str, + int *joinPtr); +/* 101 */ +EXTERN int Tk_GetJustify(Tcl_Interp *interp, const char *str, + Tk_Justify *justifyPtr); +/* 102 */ +EXTERN int Tk_GetNumMainWindows(void); +/* 103 */ +EXTERN Tk_Uid Tk_GetOption(Tk_Window tkwin, const char *name, + const char *className); +/* 104 */ +EXTERN int Tk_GetPixels(Tcl_Interp *interp, Tk_Window tkwin, + const char *str, int *intPtr); +/* 105 */ +EXTERN Pixmap Tk_GetPixmap(Display *display, Drawable d, int width, + int height, int depth); +/* 106 */ +EXTERN int Tk_GetRelief(Tcl_Interp *interp, const char *name, + int *reliefPtr); +/* 107 */ +EXTERN void Tk_GetRootCoords(Tk_Window tkwin, int *xPtr, + int *yPtr); +/* 108 */ +EXTERN int Tk_GetScrollInfo(Tcl_Interp *interp, int argc, + CONST84 char **argv, double *dblPtr, + int *intPtr); +/* 109 */ +EXTERN int Tk_GetScreenMM(Tcl_Interp *interp, Tk_Window tkwin, + const char *str, double *doublePtr); +/* 110 */ +EXTERN int Tk_GetSelection(Tcl_Interp *interp, Tk_Window tkwin, + Atom selection, Atom target, + Tk_GetSelProc *proc, ClientData clientData); +/* 111 */ +EXTERN Tk_Uid Tk_GetUid(const char *str); +/* 112 */ +EXTERN Visual * Tk_GetVisual(Tcl_Interp *interp, Tk_Window tkwin, + const char *str, int *depthPtr, + Colormap *colormapPtr); +/* 113 */ +EXTERN void Tk_GetVRootGeometry(Tk_Window tkwin, int *xPtr, + int *yPtr, int *widthPtr, int *heightPtr); +/* 114 */ +EXTERN int Tk_Grab(Tcl_Interp *interp, Tk_Window tkwin, + int grabGlobal); +/* 115 */ +EXTERN void Tk_HandleEvent(XEvent *eventPtr); +/* 116 */ +EXTERN Tk_Window Tk_IdToWindow(Display *display, Window window); +/* 117 */ +EXTERN void Tk_ImageChanged(Tk_ImageMaster master, int x, int y, + int width, int height, int imageWidth, + int imageHeight); +/* 118 */ +EXTERN int Tk_Init(Tcl_Interp *interp); +/* 119 */ +EXTERN Atom Tk_InternAtom(Tk_Window tkwin, const char *name); +/* 120 */ +EXTERN int Tk_IntersectTextLayout(Tk_TextLayout layout, int x, + int y, int width, int height); +/* 121 */ +EXTERN void Tk_MaintainGeometry(Tk_Window slave, + Tk_Window master, int x, int y, int width, + int height); +/* 122 */ +EXTERN Tk_Window Tk_MainWindow(Tcl_Interp *interp); +/* 123 */ +EXTERN void Tk_MakeWindowExist(Tk_Window tkwin); +/* 124 */ +EXTERN void Tk_ManageGeometry(Tk_Window tkwin, + const Tk_GeomMgr *mgrPtr, + ClientData clientData); +/* 125 */ +EXTERN void Tk_MapWindow(Tk_Window tkwin); +/* 126 */ +EXTERN int Tk_MeasureChars(Tk_Font tkfont, const char *source, + int numBytes, int maxPixels, int flags, + int *lengthPtr); +/* 127 */ +EXTERN void Tk_MoveResizeWindow(Tk_Window tkwin, int x, int y, + int width, int height); +/* 128 */ +EXTERN void Tk_MoveWindow(Tk_Window tkwin, int x, int y); +/* 129 */ +EXTERN void Tk_MoveToplevelWindow(Tk_Window tkwin, int x, int y); +/* 130 */ +EXTERN CONST84_RETURN char * Tk_NameOf3DBorder(Tk_3DBorder border); +/* 131 */ +EXTERN CONST84_RETURN char * Tk_NameOfAnchor(Tk_Anchor anchor); +/* 132 */ +EXTERN CONST84_RETURN char * Tk_NameOfBitmap(Display *display, Pixmap bitmap); +/* 133 */ +EXTERN CONST84_RETURN char * Tk_NameOfCapStyle(int cap); +/* 134 */ +EXTERN CONST84_RETURN char * Tk_NameOfColor(XColor *colorPtr); +/* 135 */ +EXTERN CONST84_RETURN char * Tk_NameOfCursor(Display *display, + Tk_Cursor cursor); +/* 136 */ +EXTERN CONST84_RETURN char * Tk_NameOfFont(Tk_Font font); +/* 137 */ +EXTERN CONST84_RETURN char * Tk_NameOfImage(Tk_ImageMaster imageMaster); +/* 138 */ +EXTERN CONST84_RETURN char * Tk_NameOfJoinStyle(int join); +/* 139 */ +EXTERN CONST84_RETURN char * Tk_NameOfJustify(Tk_Justify justify); +/* 140 */ +EXTERN CONST84_RETURN char * Tk_NameOfRelief(int relief); +/* 141 */ +EXTERN Tk_Window Tk_NameToWindow(Tcl_Interp *interp, + const char *pathName, Tk_Window tkwin); +/* 142 */ +EXTERN void Tk_OwnSelection(Tk_Window tkwin, Atom selection, + Tk_LostSelProc *proc, ClientData clientData); +/* 143 */ +EXTERN int Tk_ParseArgv(Tcl_Interp *interp, Tk_Window tkwin, + int *argcPtr, CONST84 char **argv, + const Tk_ArgvInfo *argTable, int flags); +/* 144 */ +EXTERN void Tk_PhotoPutBlock_NoComposite(Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height); +/* 145 */ +EXTERN void Tk_PhotoPutZoomedBlock_NoComposite( + Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int zoomX, int zoomY, + int subsampleX, int subsampleY); +/* 146 */ +EXTERN int Tk_PhotoGetImage(Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr); +/* 147 */ +EXTERN void Tk_PhotoBlank(Tk_PhotoHandle handle); +/* 148 */ +EXTERN void Tk_PhotoExpand_Panic(Tk_PhotoHandle handle, + int width, int height); +/* 149 */ +EXTERN void Tk_PhotoGetSize(Tk_PhotoHandle handle, int *widthPtr, + int *heightPtr); +/* 150 */ +EXTERN void Tk_PhotoSetSize_Panic(Tk_PhotoHandle handle, + int width, int height); +/* 151 */ +EXTERN int Tk_PointToChar(Tk_TextLayout layout, int x, int y); +/* 152 */ +EXTERN int Tk_PostscriptFontName(Tk_Font tkfont, + Tcl_DString *dsPtr); +/* 153 */ +EXTERN void Tk_PreserveColormap(Display *display, + Colormap colormap); +/* 154 */ +EXTERN void Tk_QueueWindowEvent(XEvent *eventPtr, + Tcl_QueuePosition position); +/* 155 */ +EXTERN void Tk_RedrawImage(Tk_Image image, int imageX, + int imageY, int width, int height, + Drawable drawable, int drawableX, + int drawableY); +/* 156 */ +EXTERN void Tk_ResizeWindow(Tk_Window tkwin, int width, + int height); +/* 157 */ +EXTERN int Tk_RestackWindow(Tk_Window tkwin, int aboveBelow, + Tk_Window other); +/* 158 */ +EXTERN Tk_RestrictProc * Tk_RestrictEvents(Tk_RestrictProc *proc, + ClientData arg, ClientData *prevArgPtr); +/* 159 */ +EXTERN int Tk_SafeInit(Tcl_Interp *interp); +/* 160 */ +EXTERN const char * Tk_SetAppName(Tk_Window tkwin, const char *name); +/* 161 */ +EXTERN void Tk_SetBackgroundFromBorder(Tk_Window tkwin, + Tk_3DBorder border); +/* 162 */ +EXTERN void Tk_SetClass(Tk_Window tkwin, const char *className); +/* 163 */ +EXTERN void Tk_SetGrid(Tk_Window tkwin, int reqWidth, + int reqHeight, int gridWidth, int gridHeight); +/* 164 */ +EXTERN void Tk_SetInternalBorder(Tk_Window tkwin, int width); +/* 165 */ +EXTERN void Tk_SetWindowBackground(Tk_Window tkwin, + unsigned long pixel); +/* 166 */ +EXTERN void Tk_SetWindowBackgroundPixmap(Tk_Window tkwin, + Pixmap pixmap); +/* 167 */ +EXTERN void Tk_SetWindowBorder(Tk_Window tkwin, + unsigned long pixel); +/* 168 */ +EXTERN void Tk_SetWindowBorderWidth(Tk_Window tkwin, int width); +/* 169 */ +EXTERN void Tk_SetWindowBorderPixmap(Tk_Window tkwin, + Pixmap pixmap); +/* 170 */ +EXTERN void Tk_SetWindowColormap(Tk_Window tkwin, + Colormap colormap); +/* 171 */ +EXTERN int Tk_SetWindowVisual(Tk_Window tkwin, Visual *visual, + int depth, Colormap colormap); +/* 172 */ +EXTERN void Tk_SizeOfBitmap(Display *display, Pixmap bitmap, + int *widthPtr, int *heightPtr); +/* 173 */ +EXTERN void Tk_SizeOfImage(Tk_Image image, int *widthPtr, + int *heightPtr); +/* 174 */ +EXTERN int Tk_StrictMotif(Tk_Window tkwin); +/* 175 */ +EXTERN void Tk_TextLayoutToPostscript(Tcl_Interp *interp, + Tk_TextLayout layout); +/* 176 */ +EXTERN int Tk_TextWidth(Tk_Font font, const char *str, + int numBytes); +/* 177 */ +EXTERN void Tk_UndefineCursor(Tk_Window window); +/* 178 */ +EXTERN void Tk_UnderlineChars(Display *display, + Drawable drawable, GC gc, Tk_Font tkfont, + const char *source, int x, int y, + int firstByte, int lastByte); +/* 179 */ +EXTERN void Tk_UnderlineTextLayout(Display *display, + Drawable drawable, GC gc, + Tk_TextLayout layout, int x, int y, + int underline); +/* 180 */ +EXTERN void Tk_Ungrab(Tk_Window tkwin); +/* 181 */ +EXTERN void Tk_UnmaintainGeometry(Tk_Window slave, + Tk_Window master); +/* 182 */ +EXTERN void Tk_UnmapWindow(Tk_Window tkwin); +/* 183 */ +EXTERN void Tk_UnsetGrid(Tk_Window tkwin); +/* 184 */ +EXTERN void Tk_UpdatePointer(Tk_Window tkwin, int x, int y, + int state); +/* 185 */ +EXTERN Pixmap Tk_AllocBitmapFromObj(Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr); +/* 186 */ +EXTERN Tk_3DBorder Tk_Alloc3DBorderFromObj(Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr); +/* 187 */ +EXTERN XColor * Tk_AllocColorFromObj(Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr); +/* 188 */ +EXTERN Tk_Cursor Tk_AllocCursorFromObj(Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr); +/* 189 */ +EXTERN Tk_Font Tk_AllocFontFromObj(Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr); +/* 190 */ +EXTERN Tk_OptionTable Tk_CreateOptionTable(Tcl_Interp *interp, + const Tk_OptionSpec *templatePtr); +/* 191 */ +EXTERN void Tk_DeleteOptionTable(Tk_OptionTable optionTable); +/* 192 */ +EXTERN void Tk_Free3DBorderFromObj(Tk_Window tkwin, + Tcl_Obj *objPtr); +/* 193 */ +EXTERN void Tk_FreeBitmapFromObj(Tk_Window tkwin, + Tcl_Obj *objPtr); +/* 194 */ +EXTERN void Tk_FreeColorFromObj(Tk_Window tkwin, Tcl_Obj *objPtr); +/* 195 */ +EXTERN void Tk_FreeConfigOptions(char *recordPtr, + Tk_OptionTable optionToken, Tk_Window tkwin); +/* 196 */ +EXTERN void Tk_FreeSavedOptions(Tk_SavedOptions *savePtr); +/* 197 */ +EXTERN void Tk_FreeCursorFromObj(Tk_Window tkwin, + Tcl_Obj *objPtr); +/* 198 */ +EXTERN void Tk_FreeFontFromObj(Tk_Window tkwin, Tcl_Obj *objPtr); +/* 199 */ +EXTERN Tk_3DBorder Tk_Get3DBorderFromObj(Tk_Window tkwin, + Tcl_Obj *objPtr); +/* 200 */ +EXTERN int Tk_GetAnchorFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, Tk_Anchor *anchorPtr); +/* 201 */ +EXTERN Pixmap Tk_GetBitmapFromObj(Tk_Window tkwin, Tcl_Obj *objPtr); +/* 202 */ +EXTERN XColor * Tk_GetColorFromObj(Tk_Window tkwin, Tcl_Obj *objPtr); +/* 203 */ +EXTERN Tk_Cursor Tk_GetCursorFromObj(Tk_Window tkwin, Tcl_Obj *objPtr); +/* 204 */ +EXTERN Tcl_Obj * Tk_GetOptionInfo(Tcl_Interp *interp, char *recordPtr, + Tk_OptionTable optionTable, Tcl_Obj *namePtr, + Tk_Window tkwin); +/* 205 */ +EXTERN Tcl_Obj * Tk_GetOptionValue(Tcl_Interp *interp, + char *recordPtr, Tk_OptionTable optionTable, + Tcl_Obj *namePtr, Tk_Window tkwin); +/* 206 */ +EXTERN int Tk_GetJustifyFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, Tk_Justify *justifyPtr); +/* 207 */ +EXTERN int Tk_GetMMFromObj(Tcl_Interp *interp, Tk_Window tkwin, + Tcl_Obj *objPtr, double *doublePtr); +/* 208 */ +EXTERN int Tk_GetPixelsFromObj(Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *objPtr, + int *intPtr); +/* 209 */ +EXTERN int Tk_GetReliefFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr, int *resultPtr); +/* 210 */ +EXTERN int Tk_GetScrollInfoObj(Tcl_Interp *interp, int objc, + Tcl_Obj *const objv[], double *dblPtr, + int *intPtr); +/* 211 */ +EXTERN int Tk_InitOptions(Tcl_Interp *interp, char *recordPtr, + Tk_OptionTable optionToken, Tk_Window tkwin); +/* 212 */ +EXTERN void Tk_MainEx(int argc, char **argv, + Tcl_AppInitProc *appInitProc, + Tcl_Interp *interp); +/* 213 */ +EXTERN void Tk_RestoreSavedOptions(Tk_SavedOptions *savePtr); +/* 214 */ +EXTERN int Tk_SetOptions(Tcl_Interp *interp, char *recordPtr, + Tk_OptionTable optionTable, int objc, + Tcl_Obj *const objv[], Tk_Window tkwin, + Tk_SavedOptions *savePtr, int *maskPtr); +/* 215 */ +EXTERN void Tk_InitConsoleChannels(Tcl_Interp *interp); +/* 216 */ +EXTERN int Tk_CreateConsoleWindow(Tcl_Interp *interp); +/* 217 */ +EXTERN void Tk_CreateSmoothMethod(Tcl_Interp *interp, + const Tk_SmoothMethod *method); +/* Slot 218 is reserved */ +/* Slot 219 is reserved */ +/* 220 */ +EXTERN int Tk_GetDash(Tcl_Interp *interp, const char *value, + Tk_Dash *dash); +/* 221 */ +EXTERN void Tk_CreateOutline(Tk_Outline *outline); +/* 222 */ +EXTERN void Tk_DeleteOutline(Display *display, + Tk_Outline *outline); +/* 223 */ +EXTERN int Tk_ConfigOutlineGC(XGCValues *gcValues, + Tk_Canvas canvas, Tk_Item *item, + Tk_Outline *outline); +/* 224 */ +EXTERN int Tk_ChangeOutlineGC(Tk_Canvas canvas, Tk_Item *item, + Tk_Outline *outline); +/* 225 */ +EXTERN int Tk_ResetOutlineGC(Tk_Canvas canvas, Tk_Item *item, + Tk_Outline *outline); +/* 226 */ +EXTERN int Tk_CanvasPsOutline(Tk_Canvas canvas, Tk_Item *item, + Tk_Outline *outline); +/* 227 */ +EXTERN void Tk_SetTSOrigin(Tk_Window tkwin, GC gc, int x, int y); +/* 228 */ +EXTERN int Tk_CanvasGetCoordFromObj(Tcl_Interp *interp, + Tk_Canvas canvas, Tcl_Obj *obj, + double *doublePtr); +/* 229 */ +EXTERN void Tk_CanvasSetOffset(Tk_Canvas canvas, GC gc, + Tk_TSOffset *offset); +/* 230 */ +EXTERN void Tk_DitherPhoto(Tk_PhotoHandle handle, int x, int y, + int width, int height); +/* 231 */ +EXTERN int Tk_PostscriptBitmap(Tcl_Interp *interp, + Tk_Window tkwin, Tk_PostscriptInfo psInfo, + Pixmap bitmap, int startX, int startY, + int width, int height); +/* 232 */ +EXTERN int Tk_PostscriptColor(Tcl_Interp *interp, + Tk_PostscriptInfo psInfo, XColor *colorPtr); +/* 233 */ +EXTERN int Tk_PostscriptFont(Tcl_Interp *interp, + Tk_PostscriptInfo psInfo, Tk_Font font); +/* 234 */ +EXTERN int Tk_PostscriptImage(Tk_Image image, + Tcl_Interp *interp, Tk_Window tkwin, + Tk_PostscriptInfo psinfo, int x, int y, + int width, int height, int prepass); +/* 235 */ +EXTERN void Tk_PostscriptPath(Tcl_Interp *interp, + Tk_PostscriptInfo psInfo, double *coordPtr, + int numPoints); +/* 236 */ +EXTERN int Tk_PostscriptStipple(Tcl_Interp *interp, + Tk_Window tkwin, Tk_PostscriptInfo psInfo, + Pixmap bitmap); +/* 237 */ +EXTERN double Tk_PostscriptY(double y, Tk_PostscriptInfo psInfo); +/* 238 */ +EXTERN int Tk_PostscriptPhoto(Tcl_Interp *interp, + Tk_PhotoImageBlock *blockPtr, + Tk_PostscriptInfo psInfo, int width, + int height); +/* 239 */ +EXTERN void Tk_CreateClientMessageHandler( + Tk_ClientMessageProc *proc); +/* 240 */ +EXTERN void Tk_DeleteClientMessageHandler( + Tk_ClientMessageProc *proc); +/* 241 */ +EXTERN Tk_Window Tk_CreateAnonymousWindow(Tcl_Interp *interp, + Tk_Window parent, const char *screenName); +/* 242 */ +EXTERN void Tk_SetClassProcs(Tk_Window tkwin, + const Tk_ClassProcs *procs, + ClientData instanceData); +/* 243 */ +EXTERN void Tk_SetInternalBorderEx(Tk_Window tkwin, int left, + int right, int top, int bottom); +/* 244 */ +EXTERN void Tk_SetMinimumRequestSize(Tk_Window tkwin, + int minWidth, int minHeight); +/* 245 */ +EXTERN void Tk_SetCaretPos(Tk_Window tkwin, int x, int y, + int height); +/* 246 */ +EXTERN void Tk_PhotoPutBlock_Panic(Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int compRule); +/* 247 */ +EXTERN void Tk_PhotoPutZoomedBlock_Panic(Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int zoomX, int zoomY, + int subsampleX, int subsampleY, int compRule); +/* 248 */ +EXTERN int Tk_CollapseMotionEvents(Display *display, + int collapse); +/* 249 */ +EXTERN Tk_StyleEngine Tk_RegisterStyleEngine(const char *name, + Tk_StyleEngine parent); +/* 250 */ +EXTERN Tk_StyleEngine Tk_GetStyleEngine(const char *name); +/* 251 */ +EXTERN int Tk_RegisterStyledElement(Tk_StyleEngine engine, + Tk_ElementSpec *templatePtr); +/* 252 */ +EXTERN int Tk_GetElementId(const char *name); +/* 253 */ +EXTERN Tk_Style Tk_CreateStyle(const char *name, + Tk_StyleEngine engine, ClientData clientData); +/* 254 */ +EXTERN Tk_Style Tk_GetStyle(Tcl_Interp *interp, const char *name); +/* 255 */ +EXTERN void Tk_FreeStyle(Tk_Style style); +/* 256 */ +EXTERN const char * Tk_NameOfStyle(Tk_Style style); +/* 257 */ +EXTERN Tk_Style Tk_AllocStyleFromObj(Tcl_Interp *interp, + Tcl_Obj *objPtr); +/* 258 */ +EXTERN Tk_Style Tk_GetStyleFromObj(Tcl_Obj *objPtr); +/* 259 */ +EXTERN void Tk_FreeStyleFromObj(Tcl_Obj *objPtr); +/* 260 */ +EXTERN Tk_StyledElement Tk_GetStyledElement(Tk_Style style, int elementId, + Tk_OptionTable optionTable); +/* 261 */ +EXTERN void Tk_GetElementSize(Tk_Style style, + Tk_StyledElement element, char *recordPtr, + Tk_Window tkwin, int width, int height, + int inner, int *widthPtr, int *heightPtr); +/* 262 */ +EXTERN void Tk_GetElementBox(Tk_Style style, + Tk_StyledElement element, char *recordPtr, + Tk_Window tkwin, int x, int y, int width, + int height, int inner, int *xPtr, int *yPtr, + int *widthPtr, int *heightPtr); +/* 263 */ +EXTERN int Tk_GetElementBorderWidth(Tk_Style style, + Tk_StyledElement element, char *recordPtr, + Tk_Window tkwin); +/* 264 */ +EXTERN void Tk_DrawElement(Tk_Style style, + Tk_StyledElement element, char *recordPtr, + Tk_Window tkwin, Drawable d, int x, int y, + int width, int height, int state); +/* 265 */ +EXTERN int Tk_PhotoExpand(Tcl_Interp *interp, + Tk_PhotoHandle handle, int width, int height); +/* 266 */ +EXTERN int Tk_PhotoPutBlock(Tcl_Interp *interp, + Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int compRule); +/* 267 */ +EXTERN int Tk_PhotoPutZoomedBlock(Tcl_Interp *interp, + Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, + int width, int height, int zoomX, int zoomY, + int subsampleX, int subsampleY, int compRule); +/* 268 */ +EXTERN int Tk_PhotoSetSize(Tcl_Interp *interp, + Tk_PhotoHandle handle, int width, int height); +/* 269 */ +EXTERN long Tk_GetUserInactiveTime(Display *dpy); +/* 270 */ +EXTERN void Tk_ResetUserInactiveTime(Display *dpy); +/* 271 */ +EXTERN Tcl_Interp * Tk_Interp(Tk_Window tkwin); +/* 272 */ +EXTERN void Tk_CreateOldImageType(const Tk_ImageType *typePtr); +/* 273 */ +EXTERN void Tk_CreateOldPhotoImageFormat( + const Tk_PhotoImageFormat *formatPtr); + +typedef struct { + const struct TkPlatStubs *tkPlatStubs; + const struct TkIntStubs *tkIntStubs; + const struct TkIntPlatStubs *tkIntPlatStubs; + const struct TkIntXlibStubs *tkIntXlibStubs; +} TkStubHooks; + +typedef struct TkStubs { + int magic; + const TkStubHooks *hooks; + + void (*tk_MainLoop) (void); /* 0 */ + XColor * (*tk_3DBorderColor) (Tk_3DBorder border); /* 1 */ + GC (*tk_3DBorderGC) (Tk_Window tkwin, Tk_3DBorder border, int which); /* 2 */ + void (*tk_3DHorizontalBevel) (Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height, int leftIn, int rightIn, int topBevel, int relief); /* 3 */ + void (*tk_3DVerticalBevel) (Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height, int leftBevel, int relief); /* 4 */ + void (*tk_AddOption) (Tk_Window tkwin, const char *name, const char *value, int priority); /* 5 */ + void (*tk_BindEvent) (Tk_BindingTable bindingTable, XEvent *eventPtr, Tk_Window tkwin, int numObjects, ClientData *objectPtr); /* 6 */ + void (*tk_CanvasDrawableCoords) (Tk_Canvas canvas, double x, double y, short *drawableXPtr, short *drawableYPtr); /* 7 */ + void (*tk_CanvasEventuallyRedraw) (Tk_Canvas canvas, int x1, int y1, int x2, int y2); /* 8 */ + int (*tk_CanvasGetCoord) (Tcl_Interp *interp, Tk_Canvas canvas, const char *str, double *doublePtr); /* 9 */ + Tk_CanvasTextInfo * (*tk_CanvasGetTextInfo) (Tk_Canvas canvas); /* 10 */ + int (*tk_CanvasPsBitmap) (Tcl_Interp *interp, Tk_Canvas canvas, Pixmap bitmap, int x, int y, int width, int height); /* 11 */ + int (*tk_CanvasPsColor) (Tcl_Interp *interp, Tk_Canvas canvas, XColor *colorPtr); /* 12 */ + int (*tk_CanvasPsFont) (Tcl_Interp *interp, Tk_Canvas canvas, Tk_Font font); /* 13 */ + void (*tk_CanvasPsPath) (Tcl_Interp *interp, Tk_Canvas canvas, double *coordPtr, int numPoints); /* 14 */ + int (*tk_CanvasPsStipple) (Tcl_Interp *interp, Tk_Canvas canvas, Pixmap bitmap); /* 15 */ + double (*tk_CanvasPsY) (Tk_Canvas canvas, double y); /* 16 */ + void (*tk_CanvasSetStippleOrigin) (Tk_Canvas canvas, GC gc); /* 17 */ + int (*tk_CanvasTagsParseProc) (ClientData clientData, Tcl_Interp *interp, Tk_Window tkwin, const char *value, char *widgRec, int offset); /* 18 */ + CONST86 char * (*tk_CanvasTagsPrintProc) (ClientData clientData, Tk_Window tkwin, char *widgRec, int offset, Tcl_FreeProc **freeProcPtr); /* 19 */ + Tk_Window (*tk_CanvasTkwin) (Tk_Canvas canvas); /* 20 */ + void (*tk_CanvasWindowCoords) (Tk_Canvas canvas, double x, double y, short *screenXPtr, short *screenYPtr); /* 21 */ + void (*tk_ChangeWindowAttributes) (Tk_Window tkwin, unsigned long valueMask, XSetWindowAttributes *attsPtr); /* 22 */ + int (*tk_CharBbox) (Tk_TextLayout layout, int index, int *xPtr, int *yPtr, int *widthPtr, int *heightPtr); /* 23 */ + void (*tk_ClearSelection) (Tk_Window tkwin, Atom selection); /* 24 */ + int (*tk_ClipboardAppend) (Tcl_Interp *interp, Tk_Window tkwin, Atom target, Atom format, const char *buffer); /* 25 */ + int (*tk_ClipboardClear) (Tcl_Interp *interp, Tk_Window tkwin); /* 26 */ + int (*tk_ConfigureInfo) (Tcl_Interp *interp, Tk_Window tkwin, const Tk_ConfigSpec *specs, char *widgRec, const char *argvName, int flags); /* 27 */ + int (*tk_ConfigureValue) (Tcl_Interp *interp, Tk_Window tkwin, const Tk_ConfigSpec *specs, char *widgRec, const char *argvName, int flags); /* 28 */ + int (*tk_ConfigureWidget) (Tcl_Interp *interp, Tk_Window tkwin, const Tk_ConfigSpec *specs, int argc, CONST84 char **argv, char *widgRec, int flags); /* 29 */ + void (*tk_ConfigureWindow) (Tk_Window tkwin, unsigned int valueMask, XWindowChanges *valuePtr); /* 30 */ + Tk_TextLayout (*tk_ComputeTextLayout) (Tk_Font font, const char *str, int numChars, int wrapLength, Tk_Justify justify, int flags, int *widthPtr, int *heightPtr); /* 31 */ + Tk_Window (*tk_CoordsToWindow) (int rootX, int rootY, Tk_Window tkwin); /* 32 */ + unsigned long (*tk_CreateBinding) (Tcl_Interp *interp, Tk_BindingTable bindingTable, ClientData object, const char *eventStr, const char *script, int append); /* 33 */ + Tk_BindingTable (*tk_CreateBindingTable) (Tcl_Interp *interp); /* 34 */ + Tk_ErrorHandler (*tk_CreateErrorHandler) (Display *display, int errNum, int request, int minorCode, Tk_ErrorProc *errorProc, ClientData clientData); /* 35 */ + void (*tk_CreateEventHandler) (Tk_Window token, unsigned long mask, Tk_EventProc *proc, ClientData clientData); /* 36 */ + void (*tk_CreateGenericHandler) (Tk_GenericProc *proc, ClientData clientData); /* 37 */ + void (*tk_CreateImageType) (const Tk_ImageType *typePtr); /* 38 */ + void (*tk_CreateItemType) (Tk_ItemType *typePtr); /* 39 */ + void (*tk_CreatePhotoImageFormat) (const Tk_PhotoImageFormat *formatPtr); /* 40 */ + void (*tk_CreateSelHandler) (Tk_Window tkwin, Atom selection, Atom target, Tk_SelectionProc *proc, ClientData clientData, Atom format); /* 41 */ + Tk_Window (*tk_CreateWindow) (Tcl_Interp *interp, Tk_Window parent, const char *name, const char *screenName); /* 42 */ + Tk_Window (*tk_CreateWindowFromPath) (Tcl_Interp *interp, Tk_Window tkwin, const char *pathName, const char *screenName); /* 43 */ + int (*tk_DefineBitmap) (Tcl_Interp *interp, const char *name, const void *source, int width, int height); /* 44 */ + void (*tk_DefineCursor) (Tk_Window window, Tk_Cursor cursor); /* 45 */ + void (*tk_DeleteAllBindings) (Tk_BindingTable bindingTable, ClientData object); /* 46 */ + int (*tk_DeleteBinding) (Tcl_Interp *interp, Tk_BindingTable bindingTable, ClientData object, const char *eventStr); /* 47 */ + void (*tk_DeleteBindingTable) (Tk_BindingTable bindingTable); /* 48 */ + void (*tk_DeleteErrorHandler) (Tk_ErrorHandler handler); /* 49 */ + void (*tk_DeleteEventHandler) (Tk_Window token, unsigned long mask, Tk_EventProc *proc, ClientData clientData); /* 50 */ + void (*tk_DeleteGenericHandler) (Tk_GenericProc *proc, ClientData clientData); /* 51 */ + void (*tk_DeleteImage) (Tcl_Interp *interp, const char *name); /* 52 */ + void (*tk_DeleteSelHandler) (Tk_Window tkwin, Atom selection, Atom target); /* 53 */ + void (*tk_DestroyWindow) (Tk_Window tkwin); /* 54 */ + CONST84_RETURN char * (*tk_DisplayName) (Tk_Window tkwin); /* 55 */ + int (*tk_DistanceToTextLayout) (Tk_TextLayout layout, int x, int y); /* 56 */ + void (*tk_Draw3DPolygon) (Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, XPoint *pointPtr, int numPoints, int borderWidth, int leftRelief); /* 57 */ + void (*tk_Draw3DRectangle) (Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height, int borderWidth, int relief); /* 58 */ + void (*tk_DrawChars) (Display *display, Drawable drawable, GC gc, Tk_Font tkfont, const char *source, int numBytes, int x, int y); /* 59 */ + void (*tk_DrawFocusHighlight) (Tk_Window tkwin, GC gc, int width, Drawable drawable); /* 60 */ + void (*tk_DrawTextLayout) (Display *display, Drawable drawable, GC gc, Tk_TextLayout layout, int x, int y, int firstChar, int lastChar); /* 61 */ + void (*tk_Fill3DPolygon) (Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, XPoint *pointPtr, int numPoints, int borderWidth, int leftRelief); /* 62 */ + void (*tk_Fill3DRectangle) (Tk_Window tkwin, Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height, int borderWidth, int relief); /* 63 */ + Tk_PhotoHandle (*tk_FindPhoto) (Tcl_Interp *interp, const char *imageName); /* 64 */ + Font (*tk_FontId) (Tk_Font font); /* 65 */ + void (*tk_Free3DBorder) (Tk_3DBorder border); /* 66 */ + void (*tk_FreeBitmap) (Display *display, Pixmap bitmap); /* 67 */ + void (*tk_FreeColor) (XColor *colorPtr); /* 68 */ + void (*tk_FreeColormap) (Display *display, Colormap colormap); /* 69 */ + void (*tk_FreeCursor) (Display *display, Tk_Cursor cursor); /* 70 */ + void (*tk_FreeFont) (Tk_Font f); /* 71 */ + void (*tk_FreeGC) (Display *display, GC gc); /* 72 */ + void (*tk_FreeImage) (Tk_Image image); /* 73 */ + void (*tk_FreeOptions) (const Tk_ConfigSpec *specs, char *widgRec, Display *display, int needFlags); /* 74 */ + void (*tk_FreePixmap) (Display *display, Pixmap pixmap); /* 75 */ + void (*tk_FreeTextLayout) (Tk_TextLayout textLayout); /* 76 */ + void (*tk_FreeXId) (Display *display, XID xid); /* 77 */ + GC (*tk_GCForColor) (XColor *colorPtr, Drawable drawable); /* 78 */ + void (*tk_GeometryRequest) (Tk_Window tkwin, int reqWidth, int reqHeight); /* 79 */ + Tk_3DBorder (*tk_Get3DBorder) (Tcl_Interp *interp, Tk_Window tkwin, Tk_Uid colorName); /* 80 */ + void (*tk_GetAllBindings) (Tcl_Interp *interp, Tk_BindingTable bindingTable, ClientData object); /* 81 */ + int (*tk_GetAnchor) (Tcl_Interp *interp, const char *str, Tk_Anchor *anchorPtr); /* 82 */ + CONST84_RETURN char * (*tk_GetAtomName) (Tk_Window tkwin, Atom atom); /* 83 */ + CONST84_RETURN char * (*tk_GetBinding) (Tcl_Interp *interp, Tk_BindingTable bindingTable, ClientData object, const char *eventStr); /* 84 */ + Pixmap (*tk_GetBitmap) (Tcl_Interp *interp, Tk_Window tkwin, const char *str); /* 85 */ + Pixmap (*tk_GetBitmapFromData) (Tcl_Interp *interp, Tk_Window tkwin, const void *source, int width, int height); /* 86 */ + int (*tk_GetCapStyle) (Tcl_Interp *interp, const char *str, int *capPtr); /* 87 */ + XColor * (*tk_GetColor) (Tcl_Interp *interp, Tk_Window tkwin, Tk_Uid name); /* 88 */ + XColor * (*tk_GetColorByValue) (Tk_Window tkwin, XColor *colorPtr); /* 89 */ + Colormap (*tk_GetColormap) (Tcl_Interp *interp, Tk_Window tkwin, const char *str); /* 90 */ + Tk_Cursor (*tk_GetCursor) (Tcl_Interp *interp, Tk_Window tkwin, Tk_Uid str); /* 91 */ + Tk_Cursor (*tk_GetCursorFromData) (Tcl_Interp *interp, Tk_Window tkwin, const char *source, const char *mask, int width, int height, int xHot, int yHot, Tk_Uid fg, Tk_Uid bg); /* 92 */ + Tk_Font (*tk_GetFont) (Tcl_Interp *interp, Tk_Window tkwin, const char *str); /* 93 */ + Tk_Font (*tk_GetFontFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 94 */ + void (*tk_GetFontMetrics) (Tk_Font font, Tk_FontMetrics *fmPtr); /* 95 */ + GC (*tk_GetGC) (Tk_Window tkwin, unsigned long valueMask, XGCValues *valuePtr); /* 96 */ + Tk_Image (*tk_GetImage) (Tcl_Interp *interp, Tk_Window tkwin, const char *name, Tk_ImageChangedProc *changeProc, ClientData clientData); /* 97 */ + ClientData (*tk_GetImageMasterData) (Tcl_Interp *interp, const char *name, CONST86 Tk_ImageType **typePtrPtr); /* 98 */ + Tk_ItemType * (*tk_GetItemTypes) (void); /* 99 */ + int (*tk_GetJoinStyle) (Tcl_Interp *interp, const char *str, int *joinPtr); /* 100 */ + int (*tk_GetJustify) (Tcl_Interp *interp, const char *str, Tk_Justify *justifyPtr); /* 101 */ + int (*tk_GetNumMainWindows) (void); /* 102 */ + Tk_Uid (*tk_GetOption) (Tk_Window tkwin, const char *name, const char *className); /* 103 */ + int (*tk_GetPixels) (Tcl_Interp *interp, Tk_Window tkwin, const char *str, int *intPtr); /* 104 */ + Pixmap (*tk_GetPixmap) (Display *display, Drawable d, int width, int height, int depth); /* 105 */ + int (*tk_GetRelief) (Tcl_Interp *interp, const char *name, int *reliefPtr); /* 106 */ + void (*tk_GetRootCoords) (Tk_Window tkwin, int *xPtr, int *yPtr); /* 107 */ + int (*tk_GetScrollInfo) (Tcl_Interp *interp, int argc, CONST84 char **argv, double *dblPtr, int *intPtr); /* 108 */ + int (*tk_GetScreenMM) (Tcl_Interp *interp, Tk_Window tkwin, const char *str, double *doublePtr); /* 109 */ + int (*tk_GetSelection) (Tcl_Interp *interp, Tk_Window tkwin, Atom selection, Atom target, Tk_GetSelProc *proc, ClientData clientData); /* 110 */ + Tk_Uid (*tk_GetUid) (const char *str); /* 111 */ + Visual * (*tk_GetVisual) (Tcl_Interp *interp, Tk_Window tkwin, const char *str, int *depthPtr, Colormap *colormapPtr); /* 112 */ + void (*tk_GetVRootGeometry) (Tk_Window tkwin, int *xPtr, int *yPtr, int *widthPtr, int *heightPtr); /* 113 */ + int (*tk_Grab) (Tcl_Interp *interp, Tk_Window tkwin, int grabGlobal); /* 114 */ + void (*tk_HandleEvent) (XEvent *eventPtr); /* 115 */ + Tk_Window (*tk_IdToWindow) (Display *display, Window window); /* 116 */ + void (*tk_ImageChanged) (Tk_ImageMaster master, int x, int y, int width, int height, int imageWidth, int imageHeight); /* 117 */ + int (*tk_Init) (Tcl_Interp *interp); /* 118 */ + Atom (*tk_InternAtom) (Tk_Window tkwin, const char *name); /* 119 */ + int (*tk_IntersectTextLayout) (Tk_TextLayout layout, int x, int y, int width, int height); /* 120 */ + void (*tk_MaintainGeometry) (Tk_Window slave, Tk_Window master, int x, int y, int width, int height); /* 121 */ + Tk_Window (*tk_MainWindow) (Tcl_Interp *interp); /* 122 */ + void (*tk_MakeWindowExist) (Tk_Window tkwin); /* 123 */ + void (*tk_ManageGeometry) (Tk_Window tkwin, const Tk_GeomMgr *mgrPtr, ClientData clientData); /* 124 */ + void (*tk_MapWindow) (Tk_Window tkwin); /* 125 */ + int (*tk_MeasureChars) (Tk_Font tkfont, const char *source, int numBytes, int maxPixels, int flags, int *lengthPtr); /* 126 */ + void (*tk_MoveResizeWindow) (Tk_Window tkwin, int x, int y, int width, int height); /* 127 */ + void (*tk_MoveWindow) (Tk_Window tkwin, int x, int y); /* 128 */ + void (*tk_MoveToplevelWindow) (Tk_Window tkwin, int x, int y); /* 129 */ + CONST84_RETURN char * (*tk_NameOf3DBorder) (Tk_3DBorder border); /* 130 */ + CONST84_RETURN char * (*tk_NameOfAnchor) (Tk_Anchor anchor); /* 131 */ + CONST84_RETURN char * (*tk_NameOfBitmap) (Display *display, Pixmap bitmap); /* 132 */ + CONST84_RETURN char * (*tk_NameOfCapStyle) (int cap); /* 133 */ + CONST84_RETURN char * (*tk_NameOfColor) (XColor *colorPtr); /* 134 */ + CONST84_RETURN char * (*tk_NameOfCursor) (Display *display, Tk_Cursor cursor); /* 135 */ + CONST84_RETURN char * (*tk_NameOfFont) (Tk_Font font); /* 136 */ + CONST84_RETURN char * (*tk_NameOfImage) (Tk_ImageMaster imageMaster); /* 137 */ + CONST84_RETURN char * (*tk_NameOfJoinStyle) (int join); /* 138 */ + CONST84_RETURN char * (*tk_NameOfJustify) (Tk_Justify justify); /* 139 */ + CONST84_RETURN char * (*tk_NameOfRelief) (int relief); /* 140 */ + Tk_Window (*tk_NameToWindow) (Tcl_Interp *interp, const char *pathName, Tk_Window tkwin); /* 141 */ + void (*tk_OwnSelection) (Tk_Window tkwin, Atom selection, Tk_LostSelProc *proc, ClientData clientData); /* 142 */ + int (*tk_ParseArgv) (Tcl_Interp *interp, Tk_Window tkwin, int *argcPtr, CONST84 char **argv, const Tk_ArgvInfo *argTable, int flags); /* 143 */ + void (*tk_PhotoPutBlock_NoComposite) (Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height); /* 144 */ + void (*tk_PhotoPutZoomedBlock_NoComposite) (Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY); /* 145 */ + int (*tk_PhotoGetImage) (Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr); /* 146 */ + void (*tk_PhotoBlank) (Tk_PhotoHandle handle); /* 147 */ + void (*tk_PhotoExpand_Panic) (Tk_PhotoHandle handle, int width, int height); /* 148 */ + void (*tk_PhotoGetSize) (Tk_PhotoHandle handle, int *widthPtr, int *heightPtr); /* 149 */ + void (*tk_PhotoSetSize_Panic) (Tk_PhotoHandle handle, int width, int height); /* 150 */ + int (*tk_PointToChar) (Tk_TextLayout layout, int x, int y); /* 151 */ + int (*tk_PostscriptFontName) (Tk_Font tkfont, Tcl_DString *dsPtr); /* 152 */ + void (*tk_PreserveColormap) (Display *display, Colormap colormap); /* 153 */ + void (*tk_QueueWindowEvent) (XEvent *eventPtr, Tcl_QueuePosition position); /* 154 */ + void (*tk_RedrawImage) (Tk_Image image, int imageX, int imageY, int width, int height, Drawable drawable, int drawableX, int drawableY); /* 155 */ + void (*tk_ResizeWindow) (Tk_Window tkwin, int width, int height); /* 156 */ + int (*tk_RestackWindow) (Tk_Window tkwin, int aboveBelow, Tk_Window other); /* 157 */ + Tk_RestrictProc * (*tk_RestrictEvents) (Tk_RestrictProc *proc, ClientData arg, ClientData *prevArgPtr); /* 158 */ + int (*tk_SafeInit) (Tcl_Interp *interp); /* 159 */ + const char * (*tk_SetAppName) (Tk_Window tkwin, const char *name); /* 160 */ + void (*tk_SetBackgroundFromBorder) (Tk_Window tkwin, Tk_3DBorder border); /* 161 */ + void (*tk_SetClass) (Tk_Window tkwin, const char *className); /* 162 */ + void (*tk_SetGrid) (Tk_Window tkwin, int reqWidth, int reqHeight, int gridWidth, int gridHeight); /* 163 */ + void (*tk_SetInternalBorder) (Tk_Window tkwin, int width); /* 164 */ + void (*tk_SetWindowBackground) (Tk_Window tkwin, unsigned long pixel); /* 165 */ + void (*tk_SetWindowBackgroundPixmap) (Tk_Window tkwin, Pixmap pixmap); /* 166 */ + void (*tk_SetWindowBorder) (Tk_Window tkwin, unsigned long pixel); /* 167 */ + void (*tk_SetWindowBorderWidth) (Tk_Window tkwin, int width); /* 168 */ + void (*tk_SetWindowBorderPixmap) (Tk_Window tkwin, Pixmap pixmap); /* 169 */ + void (*tk_SetWindowColormap) (Tk_Window tkwin, Colormap colormap); /* 170 */ + int (*tk_SetWindowVisual) (Tk_Window tkwin, Visual *visual, int depth, Colormap colormap); /* 171 */ + void (*tk_SizeOfBitmap) (Display *display, Pixmap bitmap, int *widthPtr, int *heightPtr); /* 172 */ + void (*tk_SizeOfImage) (Tk_Image image, int *widthPtr, int *heightPtr); /* 173 */ + int (*tk_StrictMotif) (Tk_Window tkwin); /* 174 */ + void (*tk_TextLayoutToPostscript) (Tcl_Interp *interp, Tk_TextLayout layout); /* 175 */ + int (*tk_TextWidth) (Tk_Font font, const char *str, int numBytes); /* 176 */ + void (*tk_UndefineCursor) (Tk_Window window); /* 177 */ + void (*tk_UnderlineChars) (Display *display, Drawable drawable, GC gc, Tk_Font tkfont, const char *source, int x, int y, int firstByte, int lastByte); /* 178 */ + void (*tk_UnderlineTextLayout) (Display *display, Drawable drawable, GC gc, Tk_TextLayout layout, int x, int y, int underline); /* 179 */ + void (*tk_Ungrab) (Tk_Window tkwin); /* 180 */ + void (*tk_UnmaintainGeometry) (Tk_Window slave, Tk_Window master); /* 181 */ + void (*tk_UnmapWindow) (Tk_Window tkwin); /* 182 */ + void (*tk_UnsetGrid) (Tk_Window tkwin); /* 183 */ + void (*tk_UpdatePointer) (Tk_Window tkwin, int x, int y, int state); /* 184 */ + Pixmap (*tk_AllocBitmapFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr); /* 185 */ + Tk_3DBorder (*tk_Alloc3DBorderFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr); /* 186 */ + XColor * (*tk_AllocColorFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr); /* 187 */ + Tk_Cursor (*tk_AllocCursorFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr); /* 188 */ + Tk_Font (*tk_AllocFontFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr); /* 189 */ + Tk_OptionTable (*tk_CreateOptionTable) (Tcl_Interp *interp, const Tk_OptionSpec *templatePtr); /* 190 */ + void (*tk_DeleteOptionTable) (Tk_OptionTable optionTable); /* 191 */ + void (*tk_Free3DBorderFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 192 */ + void (*tk_FreeBitmapFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 193 */ + void (*tk_FreeColorFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 194 */ + void (*tk_FreeConfigOptions) (char *recordPtr, Tk_OptionTable optionToken, Tk_Window tkwin); /* 195 */ + void (*tk_FreeSavedOptions) (Tk_SavedOptions *savePtr); /* 196 */ + void (*tk_FreeCursorFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 197 */ + void (*tk_FreeFontFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 198 */ + Tk_3DBorder (*tk_Get3DBorderFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 199 */ + int (*tk_GetAnchorFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, Tk_Anchor *anchorPtr); /* 200 */ + Pixmap (*tk_GetBitmapFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 201 */ + XColor * (*tk_GetColorFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 202 */ + Tk_Cursor (*tk_GetCursorFromObj) (Tk_Window tkwin, Tcl_Obj *objPtr); /* 203 */ + Tcl_Obj * (*tk_GetOptionInfo) (Tcl_Interp *interp, char *recordPtr, Tk_OptionTable optionTable, Tcl_Obj *namePtr, Tk_Window tkwin); /* 204 */ + Tcl_Obj * (*tk_GetOptionValue) (Tcl_Interp *interp, char *recordPtr, Tk_OptionTable optionTable, Tcl_Obj *namePtr, Tk_Window tkwin); /* 205 */ + int (*tk_GetJustifyFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, Tk_Justify *justifyPtr); /* 206 */ + int (*tk_GetMMFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr, double *doublePtr); /* 207 */ + int (*tk_GetPixelsFromObj) (Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr, int *intPtr); /* 208 */ + int (*tk_GetReliefFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int *resultPtr); /* 209 */ + int (*tk_GetScrollInfoObj) (Tcl_Interp *interp, int objc, Tcl_Obj *const objv[], double *dblPtr, int *intPtr); /* 210 */ + int (*tk_InitOptions) (Tcl_Interp *interp, char *recordPtr, Tk_OptionTable optionToken, Tk_Window tkwin); /* 211 */ + void (*tk_MainEx) (int argc, char **argv, Tcl_AppInitProc *appInitProc, Tcl_Interp *interp); /* 212 */ + void (*tk_RestoreSavedOptions) (Tk_SavedOptions *savePtr); /* 213 */ + int (*tk_SetOptions) (Tcl_Interp *interp, char *recordPtr, Tk_OptionTable optionTable, int objc, Tcl_Obj *const objv[], Tk_Window tkwin, Tk_SavedOptions *savePtr, int *maskPtr); /* 214 */ + void (*tk_InitConsoleChannels) (Tcl_Interp *interp); /* 215 */ + int (*tk_CreateConsoleWindow) (Tcl_Interp *interp); /* 216 */ + void (*tk_CreateSmoothMethod) (Tcl_Interp *interp, const Tk_SmoothMethod *method); /* 217 */ + void (*reserved218)(void); + void (*reserved219)(void); + int (*tk_GetDash) (Tcl_Interp *interp, const char *value, Tk_Dash *dash); /* 220 */ + void (*tk_CreateOutline) (Tk_Outline *outline); /* 221 */ + void (*tk_DeleteOutline) (Display *display, Tk_Outline *outline); /* 222 */ + int (*tk_ConfigOutlineGC) (XGCValues *gcValues, Tk_Canvas canvas, Tk_Item *item, Tk_Outline *outline); /* 223 */ + int (*tk_ChangeOutlineGC) (Tk_Canvas canvas, Tk_Item *item, Tk_Outline *outline); /* 224 */ + int (*tk_ResetOutlineGC) (Tk_Canvas canvas, Tk_Item *item, Tk_Outline *outline); /* 225 */ + int (*tk_CanvasPsOutline) (Tk_Canvas canvas, Tk_Item *item, Tk_Outline *outline); /* 226 */ + void (*tk_SetTSOrigin) (Tk_Window tkwin, GC gc, int x, int y); /* 227 */ + int (*tk_CanvasGetCoordFromObj) (Tcl_Interp *interp, Tk_Canvas canvas, Tcl_Obj *obj, double *doublePtr); /* 228 */ + void (*tk_CanvasSetOffset) (Tk_Canvas canvas, GC gc, Tk_TSOffset *offset); /* 229 */ + void (*tk_DitherPhoto) (Tk_PhotoHandle handle, int x, int y, int width, int height); /* 230 */ + int (*tk_PostscriptBitmap) (Tcl_Interp *interp, Tk_Window tkwin, Tk_PostscriptInfo psInfo, Pixmap bitmap, int startX, int startY, int width, int height); /* 231 */ + int (*tk_PostscriptColor) (Tcl_Interp *interp, Tk_PostscriptInfo psInfo, XColor *colorPtr); /* 232 */ + int (*tk_PostscriptFont) (Tcl_Interp *interp, Tk_PostscriptInfo psInfo, Tk_Font font); /* 233 */ + int (*tk_PostscriptImage) (Tk_Image image, Tcl_Interp *interp, Tk_Window tkwin, Tk_PostscriptInfo psinfo, int x, int y, int width, int height, int prepass); /* 234 */ + void (*tk_PostscriptPath) (Tcl_Interp *interp, Tk_PostscriptInfo psInfo, double *coordPtr, int numPoints); /* 235 */ + int (*tk_PostscriptStipple) (Tcl_Interp *interp, Tk_Window tkwin, Tk_PostscriptInfo psInfo, Pixmap bitmap); /* 236 */ + double (*tk_PostscriptY) (double y, Tk_PostscriptInfo psInfo); /* 237 */ + int (*tk_PostscriptPhoto) (Tcl_Interp *interp, Tk_PhotoImageBlock *blockPtr, Tk_PostscriptInfo psInfo, int width, int height); /* 238 */ + void (*tk_CreateClientMessageHandler) (Tk_ClientMessageProc *proc); /* 239 */ + void (*tk_DeleteClientMessageHandler) (Tk_ClientMessageProc *proc); /* 240 */ + Tk_Window (*tk_CreateAnonymousWindow) (Tcl_Interp *interp, Tk_Window parent, const char *screenName); /* 241 */ + void (*tk_SetClassProcs) (Tk_Window tkwin, const Tk_ClassProcs *procs, ClientData instanceData); /* 242 */ + void (*tk_SetInternalBorderEx) (Tk_Window tkwin, int left, int right, int top, int bottom); /* 243 */ + void (*tk_SetMinimumRequestSize) (Tk_Window tkwin, int minWidth, int minHeight); /* 244 */ + void (*tk_SetCaretPos) (Tk_Window tkwin, int x, int y, int height); /* 245 */ + void (*tk_PhotoPutBlock_Panic) (Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int compRule); /* 246 */ + void (*tk_PhotoPutZoomedBlock_Panic) (Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY, int compRule); /* 247 */ + int (*tk_CollapseMotionEvents) (Display *display, int collapse); /* 248 */ + Tk_StyleEngine (*tk_RegisterStyleEngine) (const char *name, Tk_StyleEngine parent); /* 249 */ + Tk_StyleEngine (*tk_GetStyleEngine) (const char *name); /* 250 */ + int (*tk_RegisterStyledElement) (Tk_StyleEngine engine, Tk_ElementSpec *templatePtr); /* 251 */ + int (*tk_GetElementId) (const char *name); /* 252 */ + Tk_Style (*tk_CreateStyle) (const char *name, Tk_StyleEngine engine, ClientData clientData); /* 253 */ + Tk_Style (*tk_GetStyle) (Tcl_Interp *interp, const char *name); /* 254 */ + void (*tk_FreeStyle) (Tk_Style style); /* 255 */ + const char * (*tk_NameOfStyle) (Tk_Style style); /* 256 */ + Tk_Style (*tk_AllocStyleFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr); /* 257 */ + Tk_Style (*tk_GetStyleFromObj) (Tcl_Obj *objPtr); /* 258 */ + void (*tk_FreeStyleFromObj) (Tcl_Obj *objPtr); /* 259 */ + Tk_StyledElement (*tk_GetStyledElement) (Tk_Style style, int elementId, Tk_OptionTable optionTable); /* 260 */ + void (*tk_GetElementSize) (Tk_Style style, Tk_StyledElement element, char *recordPtr, Tk_Window tkwin, int width, int height, int inner, int *widthPtr, int *heightPtr); /* 261 */ + void (*tk_GetElementBox) (Tk_Style style, Tk_StyledElement element, char *recordPtr, Tk_Window tkwin, int x, int y, int width, int height, int inner, int *xPtr, int *yPtr, int *widthPtr, int *heightPtr); /* 262 */ + int (*tk_GetElementBorderWidth) (Tk_Style style, Tk_StyledElement element, char *recordPtr, Tk_Window tkwin); /* 263 */ + void (*tk_DrawElement) (Tk_Style style, Tk_StyledElement element, char *recordPtr, Tk_Window tkwin, Drawable d, int x, int y, int width, int height, int state); /* 264 */ + int (*tk_PhotoExpand) (Tcl_Interp *interp, Tk_PhotoHandle handle, int width, int height); /* 265 */ + int (*tk_PhotoPutBlock) (Tcl_Interp *interp, Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int compRule); /* 266 */ + int (*tk_PhotoPutZoomedBlock) (Tcl_Interp *interp, Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY, int compRule); /* 267 */ + int (*tk_PhotoSetSize) (Tcl_Interp *interp, Tk_PhotoHandle handle, int width, int height); /* 268 */ + long (*tk_GetUserInactiveTime) (Display *dpy); /* 269 */ + void (*tk_ResetUserInactiveTime) (Display *dpy); /* 270 */ + Tcl_Interp * (*tk_Interp) (Tk_Window tkwin); /* 271 */ + void (*tk_CreateOldImageType) (const Tk_ImageType *typePtr); /* 272 */ + void (*tk_CreateOldPhotoImageFormat) (const Tk_PhotoImageFormat *formatPtr); /* 273 */ +} TkStubs; + +extern const TkStubs *tkStubsPtr; + +#ifdef __cplusplus +} +#endif + +#if defined(USE_TK_STUBS) + +/* + * Inline function declarations: + */ + +#define Tk_MainLoop \ + (tkStubsPtr->tk_MainLoop) /* 0 */ +#define Tk_3DBorderColor \ + (tkStubsPtr->tk_3DBorderColor) /* 1 */ +#define Tk_3DBorderGC \ + (tkStubsPtr->tk_3DBorderGC) /* 2 */ +#define Tk_3DHorizontalBevel \ + (tkStubsPtr->tk_3DHorizontalBevel) /* 3 */ +#define Tk_3DVerticalBevel \ + (tkStubsPtr->tk_3DVerticalBevel) /* 4 */ +#define Tk_AddOption \ + (tkStubsPtr->tk_AddOption) /* 5 */ +#define Tk_BindEvent \ + (tkStubsPtr->tk_BindEvent) /* 6 */ +#define Tk_CanvasDrawableCoords \ + (tkStubsPtr->tk_CanvasDrawableCoords) /* 7 */ +#define Tk_CanvasEventuallyRedraw \ + (tkStubsPtr->tk_CanvasEventuallyRedraw) /* 8 */ +#define Tk_CanvasGetCoord \ + (tkStubsPtr->tk_CanvasGetCoord) /* 9 */ +#define Tk_CanvasGetTextInfo \ + (tkStubsPtr->tk_CanvasGetTextInfo) /* 10 */ +#define Tk_CanvasPsBitmap \ + (tkStubsPtr->tk_CanvasPsBitmap) /* 11 */ +#define Tk_CanvasPsColor \ + (tkStubsPtr->tk_CanvasPsColor) /* 12 */ +#define Tk_CanvasPsFont \ + (tkStubsPtr->tk_CanvasPsFont) /* 13 */ +#define Tk_CanvasPsPath \ + (tkStubsPtr->tk_CanvasPsPath) /* 14 */ +#define Tk_CanvasPsStipple \ + (tkStubsPtr->tk_CanvasPsStipple) /* 15 */ +#define Tk_CanvasPsY \ + (tkStubsPtr->tk_CanvasPsY) /* 16 */ +#define Tk_CanvasSetStippleOrigin \ + (tkStubsPtr->tk_CanvasSetStippleOrigin) /* 17 */ +#define Tk_CanvasTagsParseProc \ + (tkStubsPtr->tk_CanvasTagsParseProc) /* 18 */ +#define Tk_CanvasTagsPrintProc \ + (tkStubsPtr->tk_CanvasTagsPrintProc) /* 19 */ +#define Tk_CanvasTkwin \ + (tkStubsPtr->tk_CanvasTkwin) /* 20 */ +#define Tk_CanvasWindowCoords \ + (tkStubsPtr->tk_CanvasWindowCoords) /* 21 */ +#define Tk_ChangeWindowAttributes \ + (tkStubsPtr->tk_ChangeWindowAttributes) /* 22 */ +#define Tk_CharBbox \ + (tkStubsPtr->tk_CharBbox) /* 23 */ +#define Tk_ClearSelection \ + (tkStubsPtr->tk_ClearSelection) /* 24 */ +#define Tk_ClipboardAppend \ + (tkStubsPtr->tk_ClipboardAppend) /* 25 */ +#define Tk_ClipboardClear \ + (tkStubsPtr->tk_ClipboardClear) /* 26 */ +#define Tk_ConfigureInfo \ + (tkStubsPtr->tk_ConfigureInfo) /* 27 */ +#define Tk_ConfigureValue \ + (tkStubsPtr->tk_ConfigureValue) /* 28 */ +#define Tk_ConfigureWidget \ + (tkStubsPtr->tk_ConfigureWidget) /* 29 */ +#define Tk_ConfigureWindow \ + (tkStubsPtr->tk_ConfigureWindow) /* 30 */ +#define Tk_ComputeTextLayout \ + (tkStubsPtr->tk_ComputeTextLayout) /* 31 */ +#define Tk_CoordsToWindow \ + (tkStubsPtr->tk_CoordsToWindow) /* 32 */ +#define Tk_CreateBinding \ + (tkStubsPtr->tk_CreateBinding) /* 33 */ +#define Tk_CreateBindingTable \ + (tkStubsPtr->tk_CreateBindingTable) /* 34 */ +#define Tk_CreateErrorHandler \ + (tkStubsPtr->tk_CreateErrorHandler) /* 35 */ +#define Tk_CreateEventHandler \ + (tkStubsPtr->tk_CreateEventHandler) /* 36 */ +#define Tk_CreateGenericHandler \ + (tkStubsPtr->tk_CreateGenericHandler) /* 37 */ +#define Tk_CreateImageType \ + (tkStubsPtr->tk_CreateImageType) /* 38 */ +#define Tk_CreateItemType \ + (tkStubsPtr->tk_CreateItemType) /* 39 */ +#define Tk_CreatePhotoImageFormat \ + (tkStubsPtr->tk_CreatePhotoImageFormat) /* 40 */ +#define Tk_CreateSelHandler \ + (tkStubsPtr->tk_CreateSelHandler) /* 41 */ +#define Tk_CreateWindow \ + (tkStubsPtr->tk_CreateWindow) /* 42 */ +#define Tk_CreateWindowFromPath \ + (tkStubsPtr->tk_CreateWindowFromPath) /* 43 */ +#define Tk_DefineBitmap \ + (tkStubsPtr->tk_DefineBitmap) /* 44 */ +#define Tk_DefineCursor \ + (tkStubsPtr->tk_DefineCursor) /* 45 */ +#define Tk_DeleteAllBindings \ + (tkStubsPtr->tk_DeleteAllBindings) /* 46 */ +#define Tk_DeleteBinding \ + (tkStubsPtr->tk_DeleteBinding) /* 47 */ +#define Tk_DeleteBindingTable \ + (tkStubsPtr->tk_DeleteBindingTable) /* 48 */ +#define Tk_DeleteErrorHandler \ + (tkStubsPtr->tk_DeleteErrorHandler) /* 49 */ +#define Tk_DeleteEventHandler \ + (tkStubsPtr->tk_DeleteEventHandler) /* 50 */ +#define Tk_DeleteGenericHandler \ + (tkStubsPtr->tk_DeleteGenericHandler) /* 51 */ +#define Tk_DeleteImage \ + (tkStubsPtr->tk_DeleteImage) /* 52 */ +#define Tk_DeleteSelHandler \ + (tkStubsPtr->tk_DeleteSelHandler) /* 53 */ +#define Tk_DestroyWindow \ + (tkStubsPtr->tk_DestroyWindow) /* 54 */ +#define Tk_DisplayName \ + (tkStubsPtr->tk_DisplayName) /* 55 */ +#define Tk_DistanceToTextLayout \ + (tkStubsPtr->tk_DistanceToTextLayout) /* 56 */ +#define Tk_Draw3DPolygon \ + (tkStubsPtr->tk_Draw3DPolygon) /* 57 */ +#define Tk_Draw3DRectangle \ + (tkStubsPtr->tk_Draw3DRectangle) /* 58 */ +#define Tk_DrawChars \ + (tkStubsPtr->tk_DrawChars) /* 59 */ +#define Tk_DrawFocusHighlight \ + (tkStubsPtr->tk_DrawFocusHighlight) /* 60 */ +#define Tk_DrawTextLayout \ + (tkStubsPtr->tk_DrawTextLayout) /* 61 */ +#define Tk_Fill3DPolygon \ + (tkStubsPtr->tk_Fill3DPolygon) /* 62 */ +#define Tk_Fill3DRectangle \ + (tkStubsPtr->tk_Fill3DRectangle) /* 63 */ +#define Tk_FindPhoto \ + (tkStubsPtr->tk_FindPhoto) /* 64 */ +#define Tk_FontId \ + (tkStubsPtr->tk_FontId) /* 65 */ +#define Tk_Free3DBorder \ + (tkStubsPtr->tk_Free3DBorder) /* 66 */ +#define Tk_FreeBitmap \ + (tkStubsPtr->tk_FreeBitmap) /* 67 */ +#define Tk_FreeColor \ + (tkStubsPtr->tk_FreeColor) /* 68 */ +#define Tk_FreeColormap \ + (tkStubsPtr->tk_FreeColormap) /* 69 */ +#define Tk_FreeCursor \ + (tkStubsPtr->tk_FreeCursor) /* 70 */ +#define Tk_FreeFont \ + (tkStubsPtr->tk_FreeFont) /* 71 */ +#define Tk_FreeGC \ + (tkStubsPtr->tk_FreeGC) /* 72 */ +#define Tk_FreeImage \ + (tkStubsPtr->tk_FreeImage) /* 73 */ +#define Tk_FreeOptions \ + (tkStubsPtr->tk_FreeOptions) /* 74 */ +#define Tk_FreePixmap \ + (tkStubsPtr->tk_FreePixmap) /* 75 */ +#define Tk_FreeTextLayout \ + (tkStubsPtr->tk_FreeTextLayout) /* 76 */ +#define Tk_FreeXId \ + (tkStubsPtr->tk_FreeXId) /* 77 */ +#define Tk_GCForColor \ + (tkStubsPtr->tk_GCForColor) /* 78 */ +#define Tk_GeometryRequest \ + (tkStubsPtr->tk_GeometryRequest) /* 79 */ +#define Tk_Get3DBorder \ + (tkStubsPtr->tk_Get3DBorder) /* 80 */ +#define Tk_GetAllBindings \ + (tkStubsPtr->tk_GetAllBindings) /* 81 */ +#define Tk_GetAnchor \ + (tkStubsPtr->tk_GetAnchor) /* 82 */ +#define Tk_GetAtomName \ + (tkStubsPtr->tk_GetAtomName) /* 83 */ +#define Tk_GetBinding \ + (tkStubsPtr->tk_GetBinding) /* 84 */ +#define Tk_GetBitmap \ + (tkStubsPtr->tk_GetBitmap) /* 85 */ +#define Tk_GetBitmapFromData \ + (tkStubsPtr->tk_GetBitmapFromData) /* 86 */ +#define Tk_GetCapStyle \ + (tkStubsPtr->tk_GetCapStyle) /* 87 */ +#define Tk_GetColor \ + (tkStubsPtr->tk_GetColor) /* 88 */ +#define Tk_GetColorByValue \ + (tkStubsPtr->tk_GetColorByValue) /* 89 */ +#define Tk_GetColormap \ + (tkStubsPtr->tk_GetColormap) /* 90 */ +#define Tk_GetCursor \ + (tkStubsPtr->tk_GetCursor) /* 91 */ +#define Tk_GetCursorFromData \ + (tkStubsPtr->tk_GetCursorFromData) /* 92 */ +#define Tk_GetFont \ + (tkStubsPtr->tk_GetFont) /* 93 */ +#define Tk_GetFontFromObj \ + (tkStubsPtr->tk_GetFontFromObj) /* 94 */ +#define Tk_GetFontMetrics \ + (tkStubsPtr->tk_GetFontMetrics) /* 95 */ +#define Tk_GetGC \ + (tkStubsPtr->tk_GetGC) /* 96 */ +#define Tk_GetImage \ + (tkStubsPtr->tk_GetImage) /* 97 */ +#define Tk_GetImageMasterData \ + (tkStubsPtr->tk_GetImageMasterData) /* 98 */ +#define Tk_GetItemTypes \ + (tkStubsPtr->tk_GetItemTypes) /* 99 */ +#define Tk_GetJoinStyle \ + (tkStubsPtr->tk_GetJoinStyle) /* 100 */ +#define Tk_GetJustify \ + (tkStubsPtr->tk_GetJustify) /* 101 */ +#define Tk_GetNumMainWindows \ + (tkStubsPtr->tk_GetNumMainWindows) /* 102 */ +#define Tk_GetOption \ + (tkStubsPtr->tk_GetOption) /* 103 */ +#define Tk_GetPixels \ + (tkStubsPtr->tk_GetPixels) /* 104 */ +#define Tk_GetPixmap \ + (tkStubsPtr->tk_GetPixmap) /* 105 */ +#define Tk_GetRelief \ + (tkStubsPtr->tk_GetRelief) /* 106 */ +#define Tk_GetRootCoords \ + (tkStubsPtr->tk_GetRootCoords) /* 107 */ +#define Tk_GetScrollInfo \ + (tkStubsPtr->tk_GetScrollInfo) /* 108 */ +#define Tk_GetScreenMM \ + (tkStubsPtr->tk_GetScreenMM) /* 109 */ +#define Tk_GetSelection \ + (tkStubsPtr->tk_GetSelection) /* 110 */ +#define Tk_GetUid \ + (tkStubsPtr->tk_GetUid) /* 111 */ +#define Tk_GetVisual \ + (tkStubsPtr->tk_GetVisual) /* 112 */ +#define Tk_GetVRootGeometry \ + (tkStubsPtr->tk_GetVRootGeometry) /* 113 */ +#define Tk_Grab \ + (tkStubsPtr->tk_Grab) /* 114 */ +#define Tk_HandleEvent \ + (tkStubsPtr->tk_HandleEvent) /* 115 */ +#define Tk_IdToWindow \ + (tkStubsPtr->tk_IdToWindow) /* 116 */ +#define Tk_ImageChanged \ + (tkStubsPtr->tk_ImageChanged) /* 117 */ +#define Tk_Init \ + (tkStubsPtr->tk_Init) /* 118 */ +#define Tk_InternAtom \ + (tkStubsPtr->tk_InternAtom) /* 119 */ +#define Tk_IntersectTextLayout \ + (tkStubsPtr->tk_IntersectTextLayout) /* 120 */ +#define Tk_MaintainGeometry \ + (tkStubsPtr->tk_MaintainGeometry) /* 121 */ +#define Tk_MainWindow \ + (tkStubsPtr->tk_MainWindow) /* 122 */ +#define Tk_MakeWindowExist \ + (tkStubsPtr->tk_MakeWindowExist) /* 123 */ +#define Tk_ManageGeometry \ + (tkStubsPtr->tk_ManageGeometry) /* 124 */ +#define Tk_MapWindow \ + (tkStubsPtr->tk_MapWindow) /* 125 */ +#define Tk_MeasureChars \ + (tkStubsPtr->tk_MeasureChars) /* 126 */ +#define Tk_MoveResizeWindow \ + (tkStubsPtr->tk_MoveResizeWindow) /* 127 */ +#define Tk_MoveWindow \ + (tkStubsPtr->tk_MoveWindow) /* 128 */ +#define Tk_MoveToplevelWindow \ + (tkStubsPtr->tk_MoveToplevelWindow) /* 129 */ +#define Tk_NameOf3DBorder \ + (tkStubsPtr->tk_NameOf3DBorder) /* 130 */ +#define Tk_NameOfAnchor \ + (tkStubsPtr->tk_NameOfAnchor) /* 131 */ +#define Tk_NameOfBitmap \ + (tkStubsPtr->tk_NameOfBitmap) /* 132 */ +#define Tk_NameOfCapStyle \ + (tkStubsPtr->tk_NameOfCapStyle) /* 133 */ +#define Tk_NameOfColor \ + (tkStubsPtr->tk_NameOfColor) /* 134 */ +#define Tk_NameOfCursor \ + (tkStubsPtr->tk_NameOfCursor) /* 135 */ +#define Tk_NameOfFont \ + (tkStubsPtr->tk_NameOfFont) /* 136 */ +#define Tk_NameOfImage \ + (tkStubsPtr->tk_NameOfImage) /* 137 */ +#define Tk_NameOfJoinStyle \ + (tkStubsPtr->tk_NameOfJoinStyle) /* 138 */ +#define Tk_NameOfJustify \ + (tkStubsPtr->tk_NameOfJustify) /* 139 */ +#define Tk_NameOfRelief \ + (tkStubsPtr->tk_NameOfRelief) /* 140 */ +#define Tk_NameToWindow \ + (tkStubsPtr->tk_NameToWindow) /* 141 */ +#define Tk_OwnSelection \ + (tkStubsPtr->tk_OwnSelection) /* 142 */ +#define Tk_ParseArgv \ + (tkStubsPtr->tk_ParseArgv) /* 143 */ +#define Tk_PhotoPutBlock_NoComposite \ + (tkStubsPtr->tk_PhotoPutBlock_NoComposite) /* 144 */ +#define Tk_PhotoPutZoomedBlock_NoComposite \ + (tkStubsPtr->tk_PhotoPutZoomedBlock_NoComposite) /* 145 */ +#define Tk_PhotoGetImage \ + (tkStubsPtr->tk_PhotoGetImage) /* 146 */ +#define Tk_PhotoBlank \ + (tkStubsPtr->tk_PhotoBlank) /* 147 */ +#define Tk_PhotoExpand_Panic \ + (tkStubsPtr->tk_PhotoExpand_Panic) /* 148 */ +#define Tk_PhotoGetSize \ + (tkStubsPtr->tk_PhotoGetSize) /* 149 */ +#define Tk_PhotoSetSize_Panic \ + (tkStubsPtr->tk_PhotoSetSize_Panic) /* 150 */ +#define Tk_PointToChar \ + (tkStubsPtr->tk_PointToChar) /* 151 */ +#define Tk_PostscriptFontName \ + (tkStubsPtr->tk_PostscriptFontName) /* 152 */ +#define Tk_PreserveColormap \ + (tkStubsPtr->tk_PreserveColormap) /* 153 */ +#define Tk_QueueWindowEvent \ + (tkStubsPtr->tk_QueueWindowEvent) /* 154 */ +#define Tk_RedrawImage \ + (tkStubsPtr->tk_RedrawImage) /* 155 */ +#define Tk_ResizeWindow \ + (tkStubsPtr->tk_ResizeWindow) /* 156 */ +#define Tk_RestackWindow \ + (tkStubsPtr->tk_RestackWindow) /* 157 */ +#define Tk_RestrictEvents \ + (tkStubsPtr->tk_RestrictEvents) /* 158 */ +#define Tk_SafeInit \ + (tkStubsPtr->tk_SafeInit) /* 159 */ +#define Tk_SetAppName \ + (tkStubsPtr->tk_SetAppName) /* 160 */ +#define Tk_SetBackgroundFromBorder \ + (tkStubsPtr->tk_SetBackgroundFromBorder) /* 161 */ +#define Tk_SetClass \ + (tkStubsPtr->tk_SetClass) /* 162 */ +#define Tk_SetGrid \ + (tkStubsPtr->tk_SetGrid) /* 163 */ +#define Tk_SetInternalBorder \ + (tkStubsPtr->tk_SetInternalBorder) /* 164 */ +#define Tk_SetWindowBackground \ + (tkStubsPtr->tk_SetWindowBackground) /* 165 */ +#define Tk_SetWindowBackgroundPixmap \ + (tkStubsPtr->tk_SetWindowBackgroundPixmap) /* 166 */ +#define Tk_SetWindowBorder \ + (tkStubsPtr->tk_SetWindowBorder) /* 167 */ +#define Tk_SetWindowBorderWidth \ + (tkStubsPtr->tk_SetWindowBorderWidth) /* 168 */ +#define Tk_SetWindowBorderPixmap \ + (tkStubsPtr->tk_SetWindowBorderPixmap) /* 169 */ +#define Tk_SetWindowColormap \ + (tkStubsPtr->tk_SetWindowColormap) /* 170 */ +#define Tk_SetWindowVisual \ + (tkStubsPtr->tk_SetWindowVisual) /* 171 */ +#define Tk_SizeOfBitmap \ + (tkStubsPtr->tk_SizeOfBitmap) /* 172 */ +#define Tk_SizeOfImage \ + (tkStubsPtr->tk_SizeOfImage) /* 173 */ +#define Tk_StrictMotif \ + (tkStubsPtr->tk_StrictMotif) /* 174 */ +#define Tk_TextLayoutToPostscript \ + (tkStubsPtr->tk_TextLayoutToPostscript) /* 175 */ +#define Tk_TextWidth \ + (tkStubsPtr->tk_TextWidth) /* 176 */ +#define Tk_UndefineCursor \ + (tkStubsPtr->tk_UndefineCursor) /* 177 */ +#define Tk_UnderlineChars \ + (tkStubsPtr->tk_UnderlineChars) /* 178 */ +#define Tk_UnderlineTextLayout \ + (tkStubsPtr->tk_UnderlineTextLayout) /* 179 */ +#define Tk_Ungrab \ + (tkStubsPtr->tk_Ungrab) /* 180 */ +#define Tk_UnmaintainGeometry \ + (tkStubsPtr->tk_UnmaintainGeometry) /* 181 */ +#define Tk_UnmapWindow \ + (tkStubsPtr->tk_UnmapWindow) /* 182 */ +#define Tk_UnsetGrid \ + (tkStubsPtr->tk_UnsetGrid) /* 183 */ +#define Tk_UpdatePointer \ + (tkStubsPtr->tk_UpdatePointer) /* 184 */ +#define Tk_AllocBitmapFromObj \ + (tkStubsPtr->tk_AllocBitmapFromObj) /* 185 */ +#define Tk_Alloc3DBorderFromObj \ + (tkStubsPtr->tk_Alloc3DBorderFromObj) /* 186 */ +#define Tk_AllocColorFromObj \ + (tkStubsPtr->tk_AllocColorFromObj) /* 187 */ +#define Tk_AllocCursorFromObj \ + (tkStubsPtr->tk_AllocCursorFromObj) /* 188 */ +#define Tk_AllocFontFromObj \ + (tkStubsPtr->tk_AllocFontFromObj) /* 189 */ +#define Tk_CreateOptionTable \ + (tkStubsPtr->tk_CreateOptionTable) /* 190 */ +#define Tk_DeleteOptionTable \ + (tkStubsPtr->tk_DeleteOptionTable) /* 191 */ +#define Tk_Free3DBorderFromObj \ + (tkStubsPtr->tk_Free3DBorderFromObj) /* 192 */ +#define Tk_FreeBitmapFromObj \ + (tkStubsPtr->tk_FreeBitmapFromObj) /* 193 */ +#define Tk_FreeColorFromObj \ + (tkStubsPtr->tk_FreeColorFromObj) /* 194 */ +#define Tk_FreeConfigOptions \ + (tkStubsPtr->tk_FreeConfigOptions) /* 195 */ +#define Tk_FreeSavedOptions \ + (tkStubsPtr->tk_FreeSavedOptions) /* 196 */ +#define Tk_FreeCursorFromObj \ + (tkStubsPtr->tk_FreeCursorFromObj) /* 197 */ +#define Tk_FreeFontFromObj \ + (tkStubsPtr->tk_FreeFontFromObj) /* 198 */ +#define Tk_Get3DBorderFromObj \ + (tkStubsPtr->tk_Get3DBorderFromObj) /* 199 */ +#define Tk_GetAnchorFromObj \ + (tkStubsPtr->tk_GetAnchorFromObj) /* 200 */ +#define Tk_GetBitmapFromObj \ + (tkStubsPtr->tk_GetBitmapFromObj) /* 201 */ +#define Tk_GetColorFromObj \ + (tkStubsPtr->tk_GetColorFromObj) /* 202 */ +#define Tk_GetCursorFromObj \ + (tkStubsPtr->tk_GetCursorFromObj) /* 203 */ +#define Tk_GetOptionInfo \ + (tkStubsPtr->tk_GetOptionInfo) /* 204 */ +#define Tk_GetOptionValue \ + (tkStubsPtr->tk_GetOptionValue) /* 205 */ +#define Tk_GetJustifyFromObj \ + (tkStubsPtr->tk_GetJustifyFromObj) /* 206 */ +#define Tk_GetMMFromObj \ + (tkStubsPtr->tk_GetMMFromObj) /* 207 */ +#define Tk_GetPixelsFromObj \ + (tkStubsPtr->tk_GetPixelsFromObj) /* 208 */ +#define Tk_GetReliefFromObj \ + (tkStubsPtr->tk_GetReliefFromObj) /* 209 */ +#define Tk_GetScrollInfoObj \ + (tkStubsPtr->tk_GetScrollInfoObj) /* 210 */ +#define Tk_InitOptions \ + (tkStubsPtr->tk_InitOptions) /* 211 */ +#define Tk_MainEx \ + (tkStubsPtr->tk_MainEx) /* 212 */ +#define Tk_RestoreSavedOptions \ + (tkStubsPtr->tk_RestoreSavedOptions) /* 213 */ +#define Tk_SetOptions \ + (tkStubsPtr->tk_SetOptions) /* 214 */ +#define Tk_InitConsoleChannels \ + (tkStubsPtr->tk_InitConsoleChannels) /* 215 */ +#define Tk_CreateConsoleWindow \ + (tkStubsPtr->tk_CreateConsoleWindow) /* 216 */ +#define Tk_CreateSmoothMethod \ + (tkStubsPtr->tk_CreateSmoothMethod) /* 217 */ +/* Slot 218 is reserved */ +/* Slot 219 is reserved */ +#define Tk_GetDash \ + (tkStubsPtr->tk_GetDash) /* 220 */ +#define Tk_CreateOutline \ + (tkStubsPtr->tk_CreateOutline) /* 221 */ +#define Tk_DeleteOutline \ + (tkStubsPtr->tk_DeleteOutline) /* 222 */ +#define Tk_ConfigOutlineGC \ + (tkStubsPtr->tk_ConfigOutlineGC) /* 223 */ +#define Tk_ChangeOutlineGC \ + (tkStubsPtr->tk_ChangeOutlineGC) /* 224 */ +#define Tk_ResetOutlineGC \ + (tkStubsPtr->tk_ResetOutlineGC) /* 225 */ +#define Tk_CanvasPsOutline \ + (tkStubsPtr->tk_CanvasPsOutline) /* 226 */ +#define Tk_SetTSOrigin \ + (tkStubsPtr->tk_SetTSOrigin) /* 227 */ +#define Tk_CanvasGetCoordFromObj \ + (tkStubsPtr->tk_CanvasGetCoordFromObj) /* 228 */ +#define Tk_CanvasSetOffset \ + (tkStubsPtr->tk_CanvasSetOffset) /* 229 */ +#define Tk_DitherPhoto \ + (tkStubsPtr->tk_DitherPhoto) /* 230 */ +#define Tk_PostscriptBitmap \ + (tkStubsPtr->tk_PostscriptBitmap) /* 231 */ +#define Tk_PostscriptColor \ + (tkStubsPtr->tk_PostscriptColor) /* 232 */ +#define Tk_PostscriptFont \ + (tkStubsPtr->tk_PostscriptFont) /* 233 */ +#define Tk_PostscriptImage \ + (tkStubsPtr->tk_PostscriptImage) /* 234 */ +#define Tk_PostscriptPath \ + (tkStubsPtr->tk_PostscriptPath) /* 235 */ +#define Tk_PostscriptStipple \ + (tkStubsPtr->tk_PostscriptStipple) /* 236 */ +#define Tk_PostscriptY \ + (tkStubsPtr->tk_PostscriptY) /* 237 */ +#define Tk_PostscriptPhoto \ + (tkStubsPtr->tk_PostscriptPhoto) /* 238 */ +#define Tk_CreateClientMessageHandler \ + (tkStubsPtr->tk_CreateClientMessageHandler) /* 239 */ +#define Tk_DeleteClientMessageHandler \ + (tkStubsPtr->tk_DeleteClientMessageHandler) /* 240 */ +#define Tk_CreateAnonymousWindow \ + (tkStubsPtr->tk_CreateAnonymousWindow) /* 241 */ +#define Tk_SetClassProcs \ + (tkStubsPtr->tk_SetClassProcs) /* 242 */ +#define Tk_SetInternalBorderEx \ + (tkStubsPtr->tk_SetInternalBorderEx) /* 243 */ +#define Tk_SetMinimumRequestSize \ + (tkStubsPtr->tk_SetMinimumRequestSize) /* 244 */ +#define Tk_SetCaretPos \ + (tkStubsPtr->tk_SetCaretPos) /* 245 */ +#define Tk_PhotoPutBlock_Panic \ + (tkStubsPtr->tk_PhotoPutBlock_Panic) /* 246 */ +#define Tk_PhotoPutZoomedBlock_Panic \ + (tkStubsPtr->tk_PhotoPutZoomedBlock_Panic) /* 247 */ +#define Tk_CollapseMotionEvents \ + (tkStubsPtr->tk_CollapseMotionEvents) /* 248 */ +#define Tk_RegisterStyleEngine \ + (tkStubsPtr->tk_RegisterStyleEngine) /* 249 */ +#define Tk_GetStyleEngine \ + (tkStubsPtr->tk_GetStyleEngine) /* 250 */ +#define Tk_RegisterStyledElement \ + (tkStubsPtr->tk_RegisterStyledElement) /* 251 */ +#define Tk_GetElementId \ + (tkStubsPtr->tk_GetElementId) /* 252 */ +#define Tk_CreateStyle \ + (tkStubsPtr->tk_CreateStyle) /* 253 */ +#define Tk_GetStyle \ + (tkStubsPtr->tk_GetStyle) /* 254 */ +#define Tk_FreeStyle \ + (tkStubsPtr->tk_FreeStyle) /* 255 */ +#define Tk_NameOfStyle \ + (tkStubsPtr->tk_NameOfStyle) /* 256 */ +#define Tk_AllocStyleFromObj \ + (tkStubsPtr->tk_AllocStyleFromObj) /* 257 */ +#define Tk_GetStyleFromObj \ + (tkStubsPtr->tk_GetStyleFromObj) /* 258 */ +#define Tk_FreeStyleFromObj \ + (tkStubsPtr->tk_FreeStyleFromObj) /* 259 */ +#define Tk_GetStyledElement \ + (tkStubsPtr->tk_GetStyledElement) /* 260 */ +#define Tk_GetElementSize \ + (tkStubsPtr->tk_GetElementSize) /* 261 */ +#define Tk_GetElementBox \ + (tkStubsPtr->tk_GetElementBox) /* 262 */ +#define Tk_GetElementBorderWidth \ + (tkStubsPtr->tk_GetElementBorderWidth) /* 263 */ +#define Tk_DrawElement \ + (tkStubsPtr->tk_DrawElement) /* 264 */ +#define Tk_PhotoExpand \ + (tkStubsPtr->tk_PhotoExpand) /* 265 */ +#define Tk_PhotoPutBlock \ + (tkStubsPtr->tk_PhotoPutBlock) /* 266 */ +#define Tk_PhotoPutZoomedBlock \ + (tkStubsPtr->tk_PhotoPutZoomedBlock) /* 267 */ +#define Tk_PhotoSetSize \ + (tkStubsPtr->tk_PhotoSetSize) /* 268 */ +#define Tk_GetUserInactiveTime \ + (tkStubsPtr->tk_GetUserInactiveTime) /* 269 */ +#define Tk_ResetUserInactiveTime \ + (tkStubsPtr->tk_ResetUserInactiveTime) /* 270 */ +#define Tk_Interp \ + (tkStubsPtr->tk_Interp) /* 271 */ +#define Tk_CreateOldImageType \ + (tkStubsPtr->tk_CreateOldImageType) /* 272 */ +#define Tk_CreateOldPhotoImageFormat \ + (tkStubsPtr->tk_CreateOldPhotoImageFormat) /* 273 */ + +#endif /* defined(USE_TK_STUBS) */ + +/* !END!: Do not edit above this line. */ + +/* Functions that don't belong in the stub table */ +#undef Tk_MainEx +#undef Tk_Init +#undef Tk_SafeInit +#undef Tk_CreateConsoleWindow + +#if defined(_WIN32) && defined(UNICODE) +# define Tk_MainEx Tk_MainExW + EXTERN void Tk_MainExW(int argc, wchar_t **argv, + Tcl_AppInitProc *appInitProc, Tcl_Interp *interp); +#endif + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#endif /* _TKDECLS */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tkPlatDecls.h b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tkPlatDecls.h new file mode 100644 index 00000000..1e69c883 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tcl8.6/tkPlatDecls.h @@ -0,0 +1,176 @@ +/* + * tkPlatDecls.h -- + * + * Declarations of functions in the platform-specific public Tcl API. + * + * Copyright (c) 1998-1999 by Scriptics Corporation. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifndef _TKPLATDECLS +#define _TKPLATDECLS + +#ifdef BUILD_tk +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLEXPORT +#endif + +/* + * WARNING: This file is automatically generated by the tools/genStubs.tcl + * script. Any modifications to the function declarations below should be made + * in the generic/tk.decls script. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* !BEGIN!: Do not edit below this line. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Exported function declarations: + */ + +#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */ +/* 0 */ +EXTERN Window Tk_AttachHWND(Tk_Window tkwin, HWND hwnd); +/* 1 */ +EXTERN HINSTANCE Tk_GetHINSTANCE(void); +/* 2 */ +EXTERN HWND Tk_GetHWND(Window window); +/* 3 */ +EXTERN Tk_Window Tk_HWNDToWindow(HWND hwnd); +/* 4 */ +EXTERN void Tk_PointerEvent(HWND hwnd, int x, int y); +/* 5 */ +EXTERN int Tk_TranslateWinEvent(HWND hwnd, UINT message, + WPARAM wParam, LPARAM lParam, + LRESULT *result); +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ +/* 0 */ +EXTERN void Tk_MacOSXSetEmbedHandler( + Tk_MacOSXEmbedRegisterWinProc *registerWinProcPtr, + Tk_MacOSXEmbedGetGrafPortProc *getPortProcPtr, + Tk_MacOSXEmbedMakeContainerExistProc *containerExistProcPtr, + Tk_MacOSXEmbedGetClipProc *getClipProc, + Tk_MacOSXEmbedGetOffsetInParentProc *getOffsetProc); +/* 1 */ +EXTERN void Tk_MacOSXTurnOffMenus(void); +/* 2 */ +EXTERN void Tk_MacOSXTkOwnsCursor(int tkOwnsIt); +/* 3 */ +EXTERN void TkMacOSXInitMenus(Tcl_Interp *interp); +/* 4 */ +EXTERN void TkMacOSXInitAppleEvents(Tcl_Interp *interp); +/* 5 */ +EXTERN void TkGenWMConfigureEvent(Tk_Window tkwin, int x, int y, + int width, int height, int flags); +/* 6 */ +EXTERN void TkMacOSXInvalClipRgns(Tk_Window tkwin); +/* 7 */ +EXTERN void * TkMacOSXGetDrawablePort(Drawable drawable); +/* 8 */ +EXTERN void * TkMacOSXGetRootControl(Drawable drawable); +/* 9 */ +EXTERN void Tk_MacOSXSetupTkNotifier(void); +/* 10 */ +EXTERN int Tk_MacOSXIsAppInFront(void); +#endif /* AQUA */ + +typedef struct TkPlatStubs { + int magic; + void *hooks; + +#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */ + Window (*tk_AttachHWND) (Tk_Window tkwin, HWND hwnd); /* 0 */ + HINSTANCE (*tk_GetHINSTANCE) (void); /* 1 */ + HWND (*tk_GetHWND) (Window window); /* 2 */ + Tk_Window (*tk_HWNDToWindow) (HWND hwnd); /* 3 */ + void (*tk_PointerEvent) (HWND hwnd, int x, int y); /* 4 */ + int (*tk_TranslateWinEvent) (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT *result); /* 5 */ +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ + void (*tk_MacOSXSetEmbedHandler) (Tk_MacOSXEmbedRegisterWinProc *registerWinProcPtr, Tk_MacOSXEmbedGetGrafPortProc *getPortProcPtr, Tk_MacOSXEmbedMakeContainerExistProc *containerExistProcPtr, Tk_MacOSXEmbedGetClipProc *getClipProc, Tk_MacOSXEmbedGetOffsetInParentProc *getOffsetProc); /* 0 */ + void (*tk_MacOSXTurnOffMenus) (void); /* 1 */ + void (*tk_MacOSXTkOwnsCursor) (int tkOwnsIt); /* 2 */ + void (*tkMacOSXInitMenus) (Tcl_Interp *interp); /* 3 */ + void (*tkMacOSXInitAppleEvents) (Tcl_Interp *interp); /* 4 */ + void (*tkGenWMConfigureEvent) (Tk_Window tkwin, int x, int y, int width, int height, int flags); /* 5 */ + void (*tkMacOSXInvalClipRgns) (Tk_Window tkwin); /* 6 */ + void * (*tkMacOSXGetDrawablePort) (Drawable drawable); /* 7 */ + void * (*tkMacOSXGetRootControl) (Drawable drawable); /* 8 */ + void (*tk_MacOSXSetupTkNotifier) (void); /* 9 */ + int (*tk_MacOSXIsAppInFront) (void); /* 10 */ +#endif /* AQUA */ +} TkPlatStubs; + +extern const TkPlatStubs *tkPlatStubsPtr; + +#ifdef __cplusplus +} +#endif + +#if defined(USE_TK_STUBS) + +/* + * Inline function declarations: + */ + +#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */ +#define Tk_AttachHWND \ + (tkPlatStubsPtr->tk_AttachHWND) /* 0 */ +#define Tk_GetHINSTANCE \ + (tkPlatStubsPtr->tk_GetHINSTANCE) /* 1 */ +#define Tk_GetHWND \ + (tkPlatStubsPtr->tk_GetHWND) /* 2 */ +#define Tk_HWNDToWindow \ + (tkPlatStubsPtr->tk_HWNDToWindow) /* 3 */ +#define Tk_PointerEvent \ + (tkPlatStubsPtr->tk_PointerEvent) /* 4 */ +#define Tk_TranslateWinEvent \ + (tkPlatStubsPtr->tk_TranslateWinEvent) /* 5 */ +#endif /* WIN */ +#ifdef MAC_OSX_TK /* AQUA */ +#define Tk_MacOSXSetEmbedHandler \ + (tkPlatStubsPtr->tk_MacOSXSetEmbedHandler) /* 0 */ +#define Tk_MacOSXTurnOffMenus \ + (tkPlatStubsPtr->tk_MacOSXTurnOffMenus) /* 1 */ +#define Tk_MacOSXTkOwnsCursor \ + (tkPlatStubsPtr->tk_MacOSXTkOwnsCursor) /* 2 */ +#define TkMacOSXInitMenus \ + (tkPlatStubsPtr->tkMacOSXInitMenus) /* 3 */ +#define TkMacOSXInitAppleEvents \ + (tkPlatStubsPtr->tkMacOSXInitAppleEvents) /* 4 */ +#define TkGenWMConfigureEvent \ + (tkPlatStubsPtr->tkGenWMConfigureEvent) /* 5 */ +#define TkMacOSXInvalClipRgns \ + (tkPlatStubsPtr->tkMacOSXInvalClipRgns) /* 6 */ +#define TkMacOSXGetDrawablePort \ + (tkPlatStubsPtr->tkMacOSXGetDrawablePort) /* 7 */ +#define TkMacOSXGetRootControl \ + (tkPlatStubsPtr->tkMacOSXGetRootControl) /* 8 */ +#define Tk_MacOSXSetupTkNotifier \ + (tkPlatStubsPtr->tk_MacOSXSetupTkNotifier) /* 9 */ +#define Tk_MacOSXIsAppInFront \ + (tkPlatStubsPtr->tk_MacOSXIsAppInFront) /* 10 */ +#endif /* AQUA */ + +#endif /* defined(USE_TK_STUBS) */ + +/* !END!: Do not edit above this line. */ + +#ifdef __cplusplus +} +#endif + +#undef TCL_STORAGE_CLASS +#define TCL_STORAGE_CLASS DLLIMPORT + +#endif /* _TKPLATDECLS */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tclAppInit.c b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tclAppInit.c new file mode 100644 index 00000000..fd4bc5af --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tclAppInit.c @@ -0,0 +1,179 @@ +/* + * tclAppInit.c -- + * + * Provides a default version of the main program and Tcl_AppInit + * function for Tcl applications (without Tk). + * + * Copyright (c) 1993 The Regents of the University of California. + * Copyright (c) 1994-1997 Sun Microsystems, Inc. + * Copyright (c) 1998-1999 by Scriptics Corporation. + * + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. + * + * RCS: @(#) $Id: tclAppInit.c 1325 2007-03-29 07:27:33Z jcw $ + */ + +#include "tcl.h" + +#ifdef TCL_TEST + +#include "tclInt.h" + +extern Tcl_PackageInitProc Procbodytest_Init; +extern Tcl_PackageInitProc Procbodytest_SafeInit; +extern Tcl_PackageInitProc TclObjTest_Init; +extern Tcl_PackageInitProc Tcltest_Init; + +#endif /* TCL_TEST */ + +#ifdef TCL_XT_TEST +extern void XtToolkitInitialize _ANSI_ARGS_((void)); +extern int Tclxttest_Init _ANSI_ARGS_((Tcl_Interp *interp)); +#endif + +/* + *---------------------------------------------------------------------- + * + * main -- + * + * This is the main program for the application. + * + * Results: + * None: Tcl_Main never returns here, so this function never returns + * either. + * + * Side effects: + * Whatever the application does. + * + *---------------------------------------------------------------------- + */ + +int +main(argc, argv) + int argc; /* Number of command-line arguments. */ + char **argv; /* Values of command-line arguments. */ +{ + /* + * The following #if block allows you to change the AppInit function by + * using a #define of TCL_LOCAL_APPINIT instead of rewriting this entire + * file. The #if checks for that #define and uses Tcl_AppInit if it does + * not exist. + */ + +#ifndef TCL_LOCAL_APPINIT +#define TCL_LOCAL_APPINIT Tcl_AppInit +#endif + extern int TCL_LOCAL_APPINIT _ANSI_ARGS_((Tcl_Interp *interp)); + + /* + * The following #if block allows you to change how Tcl finds the startup + * script, prime the library or encoding paths, fiddle with the argv, + * etc., without needing to rewrite Tcl_Main() + */ + +#ifdef TCL_LOCAL_MAIN_HOOK + extern int TCL_LOCAL_MAIN_HOOK _ANSI_ARGS_((int *argc, char ***argv)); +#endif + +#ifdef TCL_XT_TEST + XtToolkitInitialize(); +#endif + +#ifdef TCL_LOCAL_MAIN_HOOK + TCL_LOCAL_MAIN_HOOK(&argc, &argv); +#endif + + Tcl_Main(argc, argv, TCL_LOCAL_APPINIT); + + return 0; /* Needed only to prevent compiler warning. */ +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_AppInit -- + * + * This function performs application-specific initialization. Most + * applications, especially those that incorporate additional packages, + * will have their own version of this function. + * + * Results: + * Returns a standard Tcl completion code, and leaves an error message in + * the interp's result if an error occurs. + * + * Side effects: + * Depends on the startup script. + * + *---------------------------------------------------------------------- + */ + +int +Tcl_AppInit(interp) + Tcl_Interp *interp; /* Interpreter for application. */ +{ + if (Tcl_Init(interp) == TCL_ERROR) { + return TCL_ERROR; + } + +#ifdef TCL_TEST +#ifdef TCL_XT_TEST + if (Tclxttest_Init(interp) == TCL_ERROR) { + return TCL_ERROR; + } +#endif + if (Tcltest_Init(interp) == TCL_ERROR) { + return TCL_ERROR; + } + Tcl_StaticPackage(interp, "Tcltest", Tcltest_Init, + (Tcl_PackageInitProc *) NULL); + if (TclObjTest_Init(interp) == TCL_ERROR) { + return TCL_ERROR; + } + if (Procbodytest_Init(interp) == TCL_ERROR) { + return TCL_ERROR; + } + Tcl_StaticPackage(interp, "procbodytest", Procbodytest_Init, + Procbodytest_SafeInit); +#endif /* TCL_TEST */ + + /* + * Call the init functions for included packages. Each call should look + * like this: + * + * if (Mod_Init(interp) == TCL_ERROR) { + * return TCL_ERROR; + * } + * + * where "Mod" is the name of the module. (Dynamically-loadable packages + * should have the same entry-point name.) + */ + + /* + * Call Tcl_CreateCommand for application-specific commands, if they + * weren't already created by the init functions called above. + */ + + /* + * Specify a user-specific startup file to invoke if the application is + * run interactively. Typically the startup file is "~/.apprc" where "app" + * is the name of the application. If this line is deleted then no user- + * specific startup file will be run under any conditions. + */ + +#ifdef DJGPP + Tcl_SetVar(interp, "tcl_rcFileName", "~/tclsh.rc", TCL_GLOBAL_ONLY); +#else + Tcl_SetVar(interp, "tcl_rcFileName", "~/.tclshrc", TCL_GLOBAL_ONLY); +#endif + + return TCL_OK; +} + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tkstubs.c b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tkstubs.c new file mode 100644 index 00000000..a4f3f27e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tkstubs.c @@ -0,0 +1,24 @@ + +#if USE_TK_STUBS + + const TkStubs *tkStubsPtr; + const struct TkPlatStubs *tkPlatStubsPtr; + const struct TkIntStubs *tkIntStubsPtr; + const struct TkIntPlatStubs *tkIntPlatStubsPtr; + const struct TkIntXlibStubs *tkIntXlibStubsPtr; + + static int + MyInitTkStubs (Tcl_Interp *ip) + { + if (Tcl_PkgRequireEx(ip, "Tk", "8.1", 0, (ClientData*) &tkStubsPtr) == NULL) return 0; + if (tkStubsPtr == NULL || tkStubsPtr->hooks == NULL) { + Tcl_SetResult(ip, "This extension requires Tk stubs-support.", TCL_STATIC); + return 0; + } + tkPlatStubsPtr = tkStubsPtr->hooks->tkPlatStubs; + tkIntStubsPtr = tkStubsPtr->hooks->tkIntStubs; + tkIntPlatStubsPtr = tkStubsPtr->hooks->tkIntPlatStubs; + tkIntXlibStubsPtr = tkStubsPtr->hooks->tkIntXlibStubs; + return 1; + } +#endif diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tkstubs_noconst.c b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tkstubs_noconst.c new file mode 100644 index 00000000..36a0f7b8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/critcl_c/tkstubs_noconst.c @@ -0,0 +1,27 @@ + +#if USE_TK_STUBS + /* Pre 8.6 two of the variables are not declared const. + * Prevent mismatch with tkDecls.h + */ + + TkStubs *tkStubsPtr; + const struct TkPlatStubs *tkPlatStubsPtr; + const struct TkIntStubs *tkIntStubsPtr; + const struct TkIntPlatStubs *tkIntPlatStubsPtr; + struct TkIntXlibStubs *tkIntXlibStubsPtr; + + static int + MyInitTkStubs (Tcl_Interp *ip) + { + if (Tcl_PkgRequireEx(ip, "Tk", "8.1", 0, (ClientData*) &tkStubsPtr) == NULL) return 0; + if (tkStubsPtr == NULL || tkStubsPtr->hooks == NULL) { + Tcl_SetResult(ip, "This extension requires Tk stubs-support.", TCL_STATIC); + return 0; + } + tkPlatStubsPtr = tkStubsPtr->hooks->tkPlatStubs; + tkIntStubsPtr = tkStubsPtr->hooks->tkIntStubs; + tkIntPlatStubsPtr = tkStubsPtr->hooks->tkIntPlatStubs; + tkIntXlibStubsPtr = tkStubsPtr->hooks->tkIntXlibStubs; + return 1; + } +#endif diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/license.terms b/src/tclkit86bi.vfs/lib/critcl3.2/license.terms new file mode 100644 index 00000000..16e6bdf7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/license.terms @@ -0,0 +1,40 @@ +This software is copyrighted by Jean-Claude Wippler, Steve Landers, +and other parties. + +The following terms apply to all files associated with the software +unless explicitly disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the +U.S. government, the Government shall have only "Restricted Rights" +in the software and related documentation as defined in the Federal +Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you +are acquiring the software on behalf of the Department of Defense, the +software shall be classified as "Commercial Computer Software" and the +Government shall have only "Restricted Rights" as defined in Clause +252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the +authors grant the U.S. Government and others acting in its behalf +permission to use and distribute the software in accordance with the +terms specified in this license. diff --git a/src/tclkit86bi.vfs/lib/critcl3.2/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl3.2/pkgIndex.tcl new file mode 100644 index 00000000..002acb50 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl3.2/pkgIndex.tcl @@ -0,0 +1,2 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl 3.2 [list source [file join $dir critcl.tcl]] diff --git a/src/tclkit86bi.vfs/lib/critcl_callback1.1/critcl-rt.tcl b/src/tclkit86bi.vfs/lib/critcl_callback1.1/critcl-rt.tcl new file mode 100644 index 00000000..0622f0ee --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl_callback1.1/critcl-rt.tcl @@ -0,0 +1,381 @@ +# +# Critcl - build C extensions on-the-fly +# +# Copyright (c) 2001-2007 Jean-Claude Wippler +# Copyright (c) 2002-2007 Steve Landers +# +# See http://wiki.tcl.tk/critcl +# +# This is the Critcl runtime that loads the appropriate +# shared library when a package is requested +# + +namespace eval ::critcl::runtime {} + +proc ::critcl::runtime::loadlib {dir package version libname initfun tsrc mapping args} { + # XXX At least parts of this can be done by the package generator, + # XXX like listing the Tcl files to source. The glob here allows + # XXX code-injection after-the-fact, by simply adding a .tcl in + # XXX the proper place. + set path [file join $dir [MapPlatform $mapping]] + set ext [info sharedlibextension] + set lib [file join $path $libname$ext] + set provide [list] + + # Now the runtime equivalent of a series of 'preFetch' commands. + if {[llength $args]} { + set preload [file join $path preload$ext] + foreach p $args { + set prelib [file join $path $p$ext] + if {[file readable $preload] && [file readable $prelib]} { + lappend provide [list load $preload];# XXX Move this out of the loop, do only once. + lappend provide [list ::critcl::runtime::preload $prelib] + } + } + } + + lappend provide [list load $lib $initfun] + foreach t $tsrc { + lappend loadcmd "::critcl::runtime::Fetch \$dir [list $t]" + } + lappend provide "package provide $package $version" + package ifneeded $package $version [join $provide "\n"] + return +} + +proc ::critcl::runtime::preFetch {path ext dll} { + set preload [file join $path preload$ext] + if {![file readable $preload]} return + + set prelib [file join $path $dll$ext] + if {![file readable $prelib]} return + + load $preload ; # Defines next command. + ::critcl::runtime::preload $prelib + return +} + +proc ::critcl::runtime::Fetch {dir t} { + # The 'Ignore' disables compile & run functionality. + + # Background: If the regular critcl package is already loaded, and + # this prebuilt package uses its defining .tcl file also as a + # 'tsources' then critcl might try to collect data and build it + # because of the calls to its API, despite the necessary binaries + # already being present, just not in the critcl cache. That is + # redundant in the best case, and fails in the worst case (no + # compiler), preventing the use o a perfectly fine package. The + # 'ignore' call now tells critcl that it should ignore any calls + # made to it by the sourced files, and thus avoids that trouble. + + # The other case, the regular critcl package getting loaded after + # this prebuilt package is irrelevant. At that point the tsources + # were already run, and used the dummy procedures defined in the + # critcl-rt.tcl, which ignore the calls by definition. + + set t [file join $dir tcl $t] + ::critcl::Ignore $t + uplevel #0 [list source $t] + return +} + +proc ::critcl::runtime::precopy {dll} { + # This command is only used on Windows when preloading out of a + # VFS that doesn't support direct loading (usually, a Starkit) + # - we preserve the dll name so that dependencies are satisfied + # - The critcl::runtime::preload command is defined in the supporting + # "preload" package, implemented in "critcl/lib/critcl/critcl_c/preload.c" + + global env + if {[info exists env(TEMP)]} { + set dir $env(TEMP) + } elseif {[info exists env(TMP)]} { + set dir $env(TMP) + } elseif {[info exists ~]} { + set dir ~ + } else { + set dir . + } + set dir [file join $dir TCL[pid]] + set i 0 + while {[file exists $dir]} { + append dir [incr i] + } + set new [file join $dir [file tail $dll]] + file mkdir $dir + file copy $dll $new + return $new +} + +proc ::critcl::runtime::MapPlatform {{mapping {}}} { + # A sibling of critcl::platform that applies the platform mapping + + set platform [::platform::generic] + set version $::tcl_platform(osVersion) + if {[string match "macosx-*" $platform]} { + # "normalize" the osVersion to match OSX release numbers + set v [split $version .] + set v1 [lindex $v 0] + set v2 [lindex $v 1] + incr v1 -4 + set version 10.$v1.$v2 + } else { + # Strip trailing non-version info + regsub -- {-.*$} $version {} version + } + foreach {config map} $mapping { + if {![string match $config $platform]} continue + set minver [lindex $map 1] + if {[package vcompare $version $minver] < 0} continue + set platform [lindex $map 0] + break + } + return $platform +} + +# Dummy implementation of the critcl package, if not present +if {![llength [info commands ::critcl::Ignore]]} { + namespace eval ::critcl {} + proc ::critcl::Ignore {args} { + namespace eval ::critcl::v {} + set ::critcl::v::ignore([file normalize [lindex $args 0]]) . + } +} +if {![llength [info commands ::critcl::api]]} { + namespace eval ::critcl {} + proc ::critcl::api {args} {} +} +if {![llength [info commands ::critcl::at]]} { + namespace eval ::critcl {} + proc ::critcl::at {args} {} +} +if {![llength [info commands ::critcl::cache]]} { + namespace eval ::critcl {} + proc ::critcl::cache {args} {} +} +if {![llength [info commands ::critcl::ccode]]} { + namespace eval ::critcl {} + proc ::critcl::ccode {args} {} +} +if {![llength [info commands ::critcl::ccommand]]} { + namespace eval ::critcl {} + proc ::critcl::ccommand {args} {} +} +if {![llength [info commands ::critcl::cdata]]} { + namespace eval ::critcl {} + proc ::critcl::cdata {args} {} +} +if {![llength [info commands ::critcl::cdefines]]} { + namespace eval ::critcl {} + proc ::critcl::cdefines {args} {} +} +if {![llength [info commands ::critcl::cflags]]} { + namespace eval ::critcl {} + proc ::critcl::cflags {args} {} +} +if {![llength [info commands ::critcl::cheaders]]} { + namespace eval ::critcl {} + proc ::critcl::cheaders {args} {} +} +if {![llength [info commands ::critcl::check]]} { + namespace eval ::critcl {} + proc ::critcl::check {args} {return 0} +} +if {![llength [info commands ::critcl::cinit]]} { + namespace eval ::critcl {} + proc ::critcl::cinit {args} {} +} +if {![llength [info commands ::critcl::clibraries]]} { + namespace eval ::critcl {} + proc ::critcl::clibraries {args} {} +} +if {![llength [info commands ::critcl::compiled]]} { + namespace eval ::critcl {} + proc ::critcl::compiled {args} {return 1} +} +if {![llength [info commands ::critcl::compiling]]} { + namespace eval ::critcl {} + proc ::critcl::compiling {args} {return 0} +} +if {![llength [info commands ::critcl::config]]} { + namespace eval ::critcl {} + proc ::critcl::config {args} {} +} +if {![llength [info commands ::critcl::cproc]]} { + namespace eval ::critcl {} + proc ::critcl::cproc {args} {} +} +if {![llength [info commands ::critcl::csources]]} { + namespace eval ::critcl {} + proc ::critcl::csources {args} {} +} +if {![llength [info commands ::critcl::debug]]} { + namespace eval ::critcl {} + proc ::critcl::debug {args} {} +} +if {![llength [info commands ::critcl::done]]} { + namespace eval ::critcl {} + proc ::critcl::done {args} {return 1} +} +if {![llength [info commands ::critcl::failed]]} { + namespace eval ::critcl {} + proc ::critcl::failed {args} {return 0} +} +if {![llength [info commands ::critcl::framework]]} { + namespace eval ::critcl {} + proc ::critcl::framework {args} {} +} +if {![llength [info commands ::critcl::include]]} { + namespace eval ::critcl {} + proc ::critcl::include {args} {} +} +if {![llength [info commands ::critcl::ldflags]]} { + namespace eval ::critcl {} + proc ::critcl::ldflags {args} {} +} +if {![llength [info commands ::critcl::license]]} { + namespace eval ::critcl {} + proc ::critcl::license {args} {} +} +if {![llength [info commands ::critcl::load]]} { + namespace eval ::critcl {} + proc ::critcl::load {args} {return 1} +} +if {![llength [info commands ::critcl::make]]} { + namespace eval ::critcl {} + proc ::critcl::make {args} {} +} +if {![llength [info commands ::critcl::meta]]} { + namespace eval ::critcl {} + proc ::critcl::meta {args} {} +} +if {![llength [info commands ::critcl::platform]]} { + namespace eval ::critcl {} + proc ::critcl::platform {args} {} +} +if {![llength [info commands ::critcl::preload]]} { + namespace eval ::critcl {} + proc ::critcl::preload {args} {} +} +if {![llength [info commands ::critcl::source]]} { + namespace eval ::critcl {} + proc ::critcl::source {args} {} +} +if {![llength [info commands ::critcl::tcl]]} { + namespace eval ::critcl {} + proc ::critcl::tcl {args} {} +} +if {![llength [info commands ::critcl::tk]]} { + namespace eval ::critcl {} + proc ::critcl::tk {args} {} +} +if {![llength [info commands ::critcl::tsources]]} { + namespace eval ::critcl {} + proc ::critcl::tsources {args} {} +} +if {![llength [info commands ::critcl::userconfig]]} { + namespace eval ::critcl {} + proc ::critcl::userconfig {args} {} +} + +# Define a clone of platform::generic, if needed +if {![llength [info commands ::platform::generic]]} { + namespace eval ::platform {} + proc ::platform::generic {} { + global tcl_platform + + set plat [string tolower [lindex $tcl_platform(os) 0]] + set cpu $tcl_platform(machine) + + switch -glob -- $cpu { + sun4* { + set cpu sparc + } + intel - + ia32* - + i*86* { + set cpu ix86 + } + x86_64 { + if {$tcl_platform(wordSize) == 4} { + # See Example <1> at the top of this file. + set cpu ix86 + } + } + ppc - + "Power*" { + set cpu powerpc + } + "arm*" { + set cpu arm + } + ia64 { + if {$tcl_platform(wordSize) == 4} { + append cpu _32 + } + } + } + + switch -glob -- $plat { + windows { + if {$tcl_platform(platform) == "unix"} { + set plat cygwin + } else { + set plat win32 + } + if {$cpu eq "amd64"} { + # Do not check wordSize, win32-x64 is an IL32P64 platform. + set cpu x86_64 + } + } + sunos { + set plat solaris + if {[string match "ix86" $cpu]} { + if {$tcl_platform(wordSize) == 8} { + set cpu x86_64 + } + } elseif {![string match "ia64*" $cpu]} { + # sparc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + } + darwin { + set plat macosx + # Correctly identify the cpu when running as a 64bit + # process on a machine with a 32bit kernel + if {$cpu eq "ix86"} { + if {$tcl_platform(wordSize) == 8} { + set cpu x86_64 + } + } + } + aix { + set cpu powerpc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + hp-ux { + set plat hpux + if {![string match "ia64*" $cpu]} { + set cpu parisc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + } + osf1 { + set plat tru64 + } + default { + set plat [lindex [split $plat _-] 0] + } + } + + return "${plat}-${cpu}" + } +} + + diff --git a/src/tclkit86bi.vfs/lib/critcl_callback1.1/license.terms b/src/tclkit86bi.vfs/lib/critcl_callback1.1/license.terms new file mode 100644 index 00000000..6975e4c9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl_callback1.1/license.terms @@ -0,0 +1 @@ +<> diff --git a/src/tclkit86bi.vfs/lib/critcl_callback1.1/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl_callback1.1/pkgIndex.tcl new file mode 100644 index 00000000..98a76dfc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl_callback1.1/pkgIndex.tcl @@ -0,0 +1,9 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl::callback 1.1 [list ::apply {dir { + source [file join $dir critcl-rt.tcl] + set path [file join $dir [::critcl::runtime::MapPlatform]] + set ext [info sharedlibextension] + set lib [file join $path "callback$ext"] + load $lib Callback + package provide critcl::callback 1.1 +}} $dir] diff --git a/src/tclkit86bi.vfs/lib/critcl_callback1.1/teapot.txt b/src/tclkit86bi.vfs/lib/critcl_callback1.1/teapot.txt new file mode 100644 index 00000000..444774cf --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl_callback1.1/teapot.txt @@ -0,0 +1,23 @@ +Package critcl::callback 1.1 +Meta platform win32-x86_64 +Meta build::date 2023-01-07 +Meta generated::by {critcl 3.2} anton +Meta generated::date critcl +Meta build::require critcl::cutil +Meta license Under a BSD license. +Meta author {Andreas Kupries} +Meta summary Critcl utility package providing functions and structures +Meta summary to manage callbacks into Tcl, from C +Meta description Part of Critcl +Meta subject critcl callbacks {management of callbacks} +Meta subject {Tcl callbacks from C} +Meta require {Tcl 8.6} +Meta entrytclcommand {eval [list ::apply {dir { + source [file join $dir critcl-rt.tcl] + set path [file join $dir [::critcl::runtime::MapPlatform]] + set ext [info sharedlibextension] + set lib [file join $path "callback$ext"] + load $lib Callback + package provide critcl::callback 1.1 +}} $dir]} +Meta included critcl-rt.tcl win32-x86_64/callback.dll diff --git a/src/tclkit86bi.vfs/lib/critcl_callback1.1/win32-x86_64/callback.dll b/src/tclkit86bi.vfs/lib/critcl_callback1.1/win32-x86_64/callback.dll new file mode 100644 index 0000000000000000000000000000000000000000..3ebc4283ceaec5d4c36b0defc50ad011fcaa9f6b GIT binary patch literal 15360 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 literal 0 HcmV?d00001 diff --git a/src/tclkit86bi.vfs/lib/critcl_md5c0.12/critcl-rt.tcl b/src/tclkit86bi.vfs/lib/critcl_md5c0.12/critcl-rt.tcl new file mode 100644 index 00000000..0622f0ee --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl_md5c0.12/critcl-rt.tcl @@ -0,0 +1,381 @@ +# +# Critcl - build C extensions on-the-fly +# +# Copyright (c) 2001-2007 Jean-Claude Wippler +# Copyright (c) 2002-2007 Steve Landers +# +# See http://wiki.tcl.tk/critcl +# +# This is the Critcl runtime that loads the appropriate +# shared library when a package is requested +# + +namespace eval ::critcl::runtime {} + +proc ::critcl::runtime::loadlib {dir package version libname initfun tsrc mapping args} { + # XXX At least parts of this can be done by the package generator, + # XXX like listing the Tcl files to source. The glob here allows + # XXX code-injection after-the-fact, by simply adding a .tcl in + # XXX the proper place. + set path [file join $dir [MapPlatform $mapping]] + set ext [info sharedlibextension] + set lib [file join $path $libname$ext] + set provide [list] + + # Now the runtime equivalent of a series of 'preFetch' commands. + if {[llength $args]} { + set preload [file join $path preload$ext] + foreach p $args { + set prelib [file join $path $p$ext] + if {[file readable $preload] && [file readable $prelib]} { + lappend provide [list load $preload];# XXX Move this out of the loop, do only once. + lappend provide [list ::critcl::runtime::preload $prelib] + } + } + } + + lappend provide [list load $lib $initfun] + foreach t $tsrc { + lappend loadcmd "::critcl::runtime::Fetch \$dir [list $t]" + } + lappend provide "package provide $package $version" + package ifneeded $package $version [join $provide "\n"] + return +} + +proc ::critcl::runtime::preFetch {path ext dll} { + set preload [file join $path preload$ext] + if {![file readable $preload]} return + + set prelib [file join $path $dll$ext] + if {![file readable $prelib]} return + + load $preload ; # Defines next command. + ::critcl::runtime::preload $prelib + return +} + +proc ::critcl::runtime::Fetch {dir t} { + # The 'Ignore' disables compile & run functionality. + + # Background: If the regular critcl package is already loaded, and + # this prebuilt package uses its defining .tcl file also as a + # 'tsources' then critcl might try to collect data and build it + # because of the calls to its API, despite the necessary binaries + # already being present, just not in the critcl cache. That is + # redundant in the best case, and fails in the worst case (no + # compiler), preventing the use o a perfectly fine package. The + # 'ignore' call now tells critcl that it should ignore any calls + # made to it by the sourced files, and thus avoids that trouble. + + # The other case, the regular critcl package getting loaded after + # this prebuilt package is irrelevant. At that point the tsources + # were already run, and used the dummy procedures defined in the + # critcl-rt.tcl, which ignore the calls by definition. + + set t [file join $dir tcl $t] + ::critcl::Ignore $t + uplevel #0 [list source $t] + return +} + +proc ::critcl::runtime::precopy {dll} { + # This command is only used on Windows when preloading out of a + # VFS that doesn't support direct loading (usually, a Starkit) + # - we preserve the dll name so that dependencies are satisfied + # - The critcl::runtime::preload command is defined in the supporting + # "preload" package, implemented in "critcl/lib/critcl/critcl_c/preload.c" + + global env + if {[info exists env(TEMP)]} { + set dir $env(TEMP) + } elseif {[info exists env(TMP)]} { + set dir $env(TMP) + } elseif {[info exists ~]} { + set dir ~ + } else { + set dir . + } + set dir [file join $dir TCL[pid]] + set i 0 + while {[file exists $dir]} { + append dir [incr i] + } + set new [file join $dir [file tail $dll]] + file mkdir $dir + file copy $dll $new + return $new +} + +proc ::critcl::runtime::MapPlatform {{mapping {}}} { + # A sibling of critcl::platform that applies the platform mapping + + set platform [::platform::generic] + set version $::tcl_platform(osVersion) + if {[string match "macosx-*" $platform]} { + # "normalize" the osVersion to match OSX release numbers + set v [split $version .] + set v1 [lindex $v 0] + set v2 [lindex $v 1] + incr v1 -4 + set version 10.$v1.$v2 + } else { + # Strip trailing non-version info + regsub -- {-.*$} $version {} version + } + foreach {config map} $mapping { + if {![string match $config $platform]} continue + set minver [lindex $map 1] + if {[package vcompare $version $minver] < 0} continue + set platform [lindex $map 0] + break + } + return $platform +} + +# Dummy implementation of the critcl package, if not present +if {![llength [info commands ::critcl::Ignore]]} { + namespace eval ::critcl {} + proc ::critcl::Ignore {args} { + namespace eval ::critcl::v {} + set ::critcl::v::ignore([file normalize [lindex $args 0]]) . + } +} +if {![llength [info commands ::critcl::api]]} { + namespace eval ::critcl {} + proc ::critcl::api {args} {} +} +if {![llength [info commands ::critcl::at]]} { + namespace eval ::critcl {} + proc ::critcl::at {args} {} +} +if {![llength [info commands ::critcl::cache]]} { + namespace eval ::critcl {} + proc ::critcl::cache {args} {} +} +if {![llength [info commands ::critcl::ccode]]} { + namespace eval ::critcl {} + proc ::critcl::ccode {args} {} +} +if {![llength [info commands ::critcl::ccommand]]} { + namespace eval ::critcl {} + proc ::critcl::ccommand {args} {} +} +if {![llength [info commands ::critcl::cdata]]} { + namespace eval ::critcl {} + proc ::critcl::cdata {args} {} +} +if {![llength [info commands ::critcl::cdefines]]} { + namespace eval ::critcl {} + proc ::critcl::cdefines {args} {} +} +if {![llength [info commands ::critcl::cflags]]} { + namespace eval ::critcl {} + proc ::critcl::cflags {args} {} +} +if {![llength [info commands ::critcl::cheaders]]} { + namespace eval ::critcl {} + proc ::critcl::cheaders {args} {} +} +if {![llength [info commands ::critcl::check]]} { + namespace eval ::critcl {} + proc ::critcl::check {args} {return 0} +} +if {![llength [info commands ::critcl::cinit]]} { + namespace eval ::critcl {} + proc ::critcl::cinit {args} {} +} +if {![llength [info commands ::critcl::clibraries]]} { + namespace eval ::critcl {} + proc ::critcl::clibraries {args} {} +} +if {![llength [info commands ::critcl::compiled]]} { + namespace eval ::critcl {} + proc ::critcl::compiled {args} {return 1} +} +if {![llength [info commands ::critcl::compiling]]} { + namespace eval ::critcl {} + proc ::critcl::compiling {args} {return 0} +} +if {![llength [info commands ::critcl::config]]} { + namespace eval ::critcl {} + proc ::critcl::config {args} {} +} +if {![llength [info commands ::critcl::cproc]]} { + namespace eval ::critcl {} + proc ::critcl::cproc {args} {} +} +if {![llength [info commands ::critcl::csources]]} { + namespace eval ::critcl {} + proc ::critcl::csources {args} {} +} +if {![llength [info commands ::critcl::debug]]} { + namespace eval ::critcl {} + proc ::critcl::debug {args} {} +} +if {![llength [info commands ::critcl::done]]} { + namespace eval ::critcl {} + proc ::critcl::done {args} {return 1} +} +if {![llength [info commands ::critcl::failed]]} { + namespace eval ::critcl {} + proc ::critcl::failed {args} {return 0} +} +if {![llength [info commands ::critcl::framework]]} { + namespace eval ::critcl {} + proc ::critcl::framework {args} {} +} +if {![llength [info commands ::critcl::include]]} { + namespace eval ::critcl {} + proc ::critcl::include {args} {} +} +if {![llength [info commands ::critcl::ldflags]]} { + namespace eval ::critcl {} + proc ::critcl::ldflags {args} {} +} +if {![llength [info commands ::critcl::license]]} { + namespace eval ::critcl {} + proc ::critcl::license {args} {} +} +if {![llength [info commands ::critcl::load]]} { + namespace eval ::critcl {} + proc ::critcl::load {args} {return 1} +} +if {![llength [info commands ::critcl::make]]} { + namespace eval ::critcl {} + proc ::critcl::make {args} {} +} +if {![llength [info commands ::critcl::meta]]} { + namespace eval ::critcl {} + proc ::critcl::meta {args} {} +} +if {![llength [info commands ::critcl::platform]]} { + namespace eval ::critcl {} + proc ::critcl::platform {args} {} +} +if {![llength [info commands ::critcl::preload]]} { + namespace eval ::critcl {} + proc ::critcl::preload {args} {} +} +if {![llength [info commands ::critcl::source]]} { + namespace eval ::critcl {} + proc ::critcl::source {args} {} +} +if {![llength [info commands ::critcl::tcl]]} { + namespace eval ::critcl {} + proc ::critcl::tcl {args} {} +} +if {![llength [info commands ::critcl::tk]]} { + namespace eval ::critcl {} + proc ::critcl::tk {args} {} +} +if {![llength [info commands ::critcl::tsources]]} { + namespace eval ::critcl {} + proc ::critcl::tsources {args} {} +} +if {![llength [info commands ::critcl::userconfig]]} { + namespace eval ::critcl {} + proc ::critcl::userconfig {args} {} +} + +# Define a clone of platform::generic, if needed +if {![llength [info commands ::platform::generic]]} { + namespace eval ::platform {} + proc ::platform::generic {} { + global tcl_platform + + set plat [string tolower [lindex $tcl_platform(os) 0]] + set cpu $tcl_platform(machine) + + switch -glob -- $cpu { + sun4* { + set cpu sparc + } + intel - + ia32* - + i*86* { + set cpu ix86 + } + x86_64 { + if {$tcl_platform(wordSize) == 4} { + # See Example <1> at the top of this file. + set cpu ix86 + } + } + ppc - + "Power*" { + set cpu powerpc + } + "arm*" { + set cpu arm + } + ia64 { + if {$tcl_platform(wordSize) == 4} { + append cpu _32 + } + } + } + + switch -glob -- $plat { + windows { + if {$tcl_platform(platform) == "unix"} { + set plat cygwin + } else { + set plat win32 + } + if {$cpu eq "amd64"} { + # Do not check wordSize, win32-x64 is an IL32P64 platform. + set cpu x86_64 + } + } + sunos { + set plat solaris + if {[string match "ix86" $cpu]} { + if {$tcl_platform(wordSize) == 8} { + set cpu x86_64 + } + } elseif {![string match "ia64*" $cpu]} { + # sparc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + } + darwin { + set plat macosx + # Correctly identify the cpu when running as a 64bit + # process on a machine with a 32bit kernel + if {$cpu eq "ix86"} { + if {$tcl_platform(wordSize) == 8} { + set cpu x86_64 + } + } + } + aix { + set cpu powerpc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + hp-ux { + set plat hpux + if {![string match "ia64*" $cpu]} { + set cpu parisc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + } + osf1 { + set plat tru64 + } + default { + set plat [lindex [split $plat _-] 0] + } + } + + return "${plat}-${cpu}" + } +} + + diff --git a/src/tclkit86bi.vfs/lib/critcl_md5c0.12/license.terms b/src/tclkit86bi.vfs/lib/critcl_md5c0.12/license.terms new file mode 100644 index 00000000..6975e4c9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl_md5c0.12/license.terms @@ -0,0 +1 @@ +<> diff --git a/src/tclkit86bi.vfs/lib/critcl_md5c0.12/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/critcl_md5c0.12/pkgIndex.tcl new file mode 100644 index 00000000..83d133f4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl_md5c0.12/pkgIndex.tcl @@ -0,0 +1,9 @@ +if {![package vsatisfies [package provide Tcl] 8.6]} {return} +package ifneeded critcl_md5c 0.12 [list ::apply {dir { + source [file join $dir critcl-rt.tcl] + set path [file join $dir [::critcl::runtime::MapPlatform]] + set ext [info sharedlibextension] + set lib [file join $path "md5c$ext"] + load $lib Md5c + package provide critcl_md5c 0.12 +}} $dir] diff --git a/src/tclkit86bi.vfs/lib/critcl_md5c0.12/teapot.txt b/src/tclkit86bi.vfs/lib/critcl_md5c0.12/teapot.txt new file mode 100644 index 00000000..c1ef6288 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/critcl_md5c0.12/teapot.txt @@ -0,0 +1,14 @@ +Package critcl_md5c 0.12 +Meta platform win32-x86_64 +Meta build::date 2023-01-07 +Meta generated::by {critcl 3.2} anton +Meta generated::date critcl +Meta entrytclcommand {eval [list ::apply {dir { + source [file join $dir critcl-rt.tcl] + set path [file join $dir [::critcl::runtime::MapPlatform]] + set ext [info sharedlibextension] + set lib [file join $path "md5c$ext"] + load $lib Md5c + package provide critcl_md5c 0.12 +}} $dir]} +Meta included critcl-rt.tcl win32-x86_64/md5c.dll diff --git a/src/tclkit86bi.vfs/lib/critcl_md5c0.12/win32-x86_64/md5c.dll b/src/tclkit86bi.vfs/lib/critcl_md5c0.12/win32-x86_64/md5c.dll new file mode 100644 index 0000000000000000000000000000000000000000..a122ef9ca110152ddecdee387565d40b89543e02 GIT binary patch literal 19456 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 EZ=MGwqW}N^ literal 0 HcmV?d00001 diff --git a/src/tclkit86bi.vfs/lib/dde1.4/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/dde1.4/pkgIndex.tcl new file mode 100644 index 00000000..18ac5178 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/dde1.4/pkgIndex.tcl @@ -0,0 +1,12 @@ +if {[info sharedlibextension] != ".dll"} return +if {[package vsatisfies [package provide Tcl] 9.0-]} { + package ifneeded dde 1.4.4 \ + [list load [file join $dir tcl9dde14.dll] Dde] +} elseif {![package vsatisfies [package provide Tcl] 8.7] + && [::tcl::pkgconfig get debug]} { + package ifneeded dde 1.4.4 \ + [list load [file join $dir tcldde14g.dll] Dde] +} else { + package ifneeded dde 1.4.4 \ + [list load [file join $dir tcldde14.dll] Dde] +} diff --git a/src/tclkit86bi.vfs/lib/dde1.4/tcldde14.dll b/src/tclkit86bi.vfs/lib/dde1.4/tcldde14.dll new file mode 100644 index 0000000000000000000000000000000000000000..48123ec2a526a485ad8282553e7290b09c576085 GIT binary patch literal 71523 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 E3&c9%Z2$lO literal 0 HcmV?d00001 diff --git a/src/tclkit86bi.vfs/lib/iocp1.1.0/bt.tcl b/src/tclkit86bi.vfs/lib/iocp1.1.0/bt.tcl new file mode 100644 index 00000000..b711ad43 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/iocp1.1.0/bt.tcl @@ -0,0 +1,690 @@ +# +# Copyright (c) 2020, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +package require iocp +iocp::bt_init + +namespace eval iocp::bt { + variable script_dir [file dirname [info script]] + variable version + + namespace eval radio { + namespace path [namespace parent] + namespace export configure devices info + namespace ensemble create + } + namespace eval device { + namespace path [namespace parent] + namespace export address addresses port print printn remove service_references services + namespace ensemble create + } +} + +set iocp::bt::version [package require iocp] +source [file join $iocp::bt::script_dir btsdr.tcl] +source [file join $iocp::bt::script_dir btnames.tcl] + +proc iocp::bt::radios {{detailed false}} { + # Enumerate Bluetooth radios on the local system. + # detailed - If true, detailed information about each radio is returned. + # If false (default), only the radio addresses are returned. + # + # When $detailed is passed as a boolean false value, a list of radio + # addresses is returned. + # + # When $detailed is passed as a boolean true value, + # each element of the returned list contains the following keys: + # Address - The Bluetooth address of the radio. + # Name - Name assigned to the local system as advertised by the radio. + # Class - Device class as a numeric value. + # DeviceClasses - Human readable list of general device class categories + # Subversion - Integer value whose interpretation is manufacturer-specific. + # Manufacturer - Integer identifier assigned to the manufacturer. + # MajorClassName - Human readable major device class name. + # MinorClassName - Human readable minor device class name. + # + # Returns a list of radio addresses or radio information elements. + + set pair [FindFirstRadio] + if {[llength $pair] == 0} { + return {} + } + lassign $pair finder hradio + set radios {} + try { + while {1} { + set radio [GetRadioInfo $hradio] + if {$detailed} { + lappend radios [dict merge $radio [DeviceClass [dict get $radio Class]]] + } else { + lappend radios [dict get $radio Address] + } + CloseHandle $hradio + set hradio [FindNextRadio $finder] + } + } finally { + FindFirstRadioClose $finder + } + return $radios +} + +proc iocp::bt::radio::Open {{radio {}}} { + # Get a handle to a radio. + # radio - The address or name associated with a radio on the system. + # If unspecified or the empty string, a handle to the first + # radio found is returned. + + # The command will raise an error if no matching radio is present. + # + # The returned handle must be closed with the [close] command. + # + # Returns a handle to a Bluetooth radio. + + set pair [FindFirstRadio] + if {[llength $pair] == 0} { + error "Radio not found." + } + lassign $pair finder hradio + try { + while {1} { + set info [GetRadioInfo $hradio] + if {$radio eq "" || + [string equal -nocase $radio [dict get $info Name]] || + [string equal -nocase $radio [dict get $info Address]]} { + return $hradio + } + CloseHandle $hradio + set hradio [FindNextRadio $finder] + } + } finally { + FindFirstRadioClose $finder + } + error "Radio not found." +} + +proc iocp::bt::radio::Close {hradio} { + # Closes a radio handle. + # hradio - The radio handle to close. + CloseHandle $hradio +} + +proc iocp::bt::radio::info {{radio {}}} { + # Get detailed information about a radio on the system + # radio - The address or name associated with a radio on the system. + # If unspecified or the empty string, information about + # the first radio found is returned. + # + # The returned dictionary has the following keys: + # + # Address - The Bluetooth address of the radio. + # Name - Name assigned to the local system as advertised by the radio. + # Class - Device class as a numeric value. + # DeviceClasses - Human readable list of general device class categories + # Subversion - Integer value whose interpretation is manufacturer-specific. + # Manufacturer - Integer identifier assigned to the manufacturer. + # MajorClassName - Human readable major device class name. + # MinorClassName - Human readable minor device class name. + # + # Returns a dictionary containing information about the radio. + + set hradio [Open $radio] + try { + set radio [GetRadioInfo $hradio] + set radio [dict merge $radio [DeviceClass [dict get $radio Class]]] + } finally { + Close $hradio + } +} + +proc iocp::bt::radio::configure {radio args} { + # Gets or modifies a radio configuration. + # radio - The address or name associated with a radio on the system. + # args - See below. + # + # Returns an option value, a dictionary of options and values, or an empty + # string. + # + # If no arguments are given to the command, it returns the current + # values of all options in the form of a dictionary. + # + # If exactly one argument is given, it must be the name of an option + # and the command returns the value of the option. + # + # Otherwise, the arguments must be a list of option name and + # values. The radio's options are set accordingly. The command returns + # an empty string for this case. Note that in case of raised exceptions + # the state of the radio options is indeterminate. + + set hradio [Open $radio] + try { + if {[llength $args] == 0} { + return [list \ + -discoverable [IsDiscoverable $hradio] \ + -connectable [IsConnectable $hradio]] + } elseif {[llength $args] == 1} { + return [switch -exact -- [lindex $args 0] { + -discoverable {IsDiscoverable $hradio} + -connectable {IsConnectable $hradio} + default { error "Unknown option \"[lindex $args 0]\"."} + }] + } else { + set unchanged {} + foreach {opt val} $args { + switch -exact -- $opt { + -discoverable { + set changed [EnableDiscovery $val] + } + -connectable { + set changed [EnableIncoming $val] + } + default { error "Unknown option \"$opt\"."} + } + if {! $changed} { + lappend unchanged $opt + } + } + if {[llength $unchanged]} { + error "Options [join $unchanged {, }] could not be modified." + } + } + } finally { + Close $hradio + } +} + +proc iocp::bt::radio::devices {radio args} { + # Discover devices accessible through the specified radio. + # radio - Name or address of Bluetooth radio + # args - Passed on to [::iocp::bt::devices] + # This command has the same functionality as the [::iocp::bt::devices] + # command except that it restricts discovery only to those devices + # accessible through the specified radio. + # + # Returns a list of device information dictionaries. See + # [::iocp::bt::devices] for the dictionary format. + + set hradio [Open $radio] + try { + return [::iocp::bt::devices {*}$args -hradio $hradio] + } finally { + Close $hradio + } +} + +proc iocp::bt::devices {args} { + # Discover Bluetooth devices. + # -authenticated - filter for authenticated devices + # -connected - filter for connected devices + # -inquire - issue a new inquiry. Without this option, devices that are + # not already known to the system will not be discovered. + # -remembered - filter for remembered devices + # -timeout MS - timeout for the inquiry in milliseconds. Defaults to 10240ms. + # Ignored if `-inquire` is not specified. + # -unknown - filter for unknown devices + # + # Each device information element is returned as a dictionary with + # the following keys: + # Authenticated - Boolean value indicating whether the device has + # been authenticated + # Address - Bluetooth address of the devicec + # Class - Device class as a numeric value + # Connected - Boolean value indicating whether the device is connected + # DeviceClasses - Human readable list of general device class categories + # LastSeen - Time when device was last seen. The format is a list of + # year, month, day, hour, minutes, seconds and milliseconds. + # LastUsed - Time when device was last used. The format is a list of + # year, month, day, hour, minutes, seconds and milliseconds. + # MajorClassName - Human readable major device class name. + # MinorClassName - Human readable minor device class name. + # Name - Human readable name of the device + # Remembered - Boolean value indicating whether the device is connected + # + # The filtering options may be specified to limit the devices + # returned. If none are specified, all devices are returned. + # + # Returns a list of device information dictionaries. + + set pair [FindFirstDevice {*}$args] + if {[llength $pair] == 0} { + # No devices found + return {} + } + lassign $pair finder device + set device [dict merge $device [DeviceClass [dict get $device Class]]] + set devices [list $device] + try { + while {1} { + set device [FindNextDevice $finder] + set device [dict merge $device [DeviceClass [dict get $device Class]]] + lappend devices $device + } + } finally { + FindFirstDeviceClose $finder + } + return $devices +} + +proc iocp::bt::device::address {name args} { + # Returns a Bluetooth address for a given name. + # name - name of device of interest + # args - Options to control device enquiry. See [devices]. + # If a device has multiple addresses, the command may return any one + # them. If no addresses are found for the device, an error is raised. + set addrs [addresses $name {*}$args] + if {[llength $addrs]} { + return [lindex $addrs 0] + } + error "Could not find address for device \"$name\"." +} + +proc iocp::bt::device::addresses {name args} { + # Returns a list of Bluetooth addresses for a given name. + # name - name of device of interest + # args - Options to control device enquiry. See [devices]. + + set addresses [lmap device [devices {*}$args] { + if {[string compare -nocase $name [dict get $device Name]]} { + continue + } + dict get $device Address + }] + # Also resolve local system radios + foreach radio [radios 1] { + if {[string equal -nocase $name [dict get $radio Name]]} { + lappend addresses [dict get $radio Address] + } + } + return $addresses +} + +proc iocp::bt::device::port {device service_class} { + # Resolve the port for a Bluetooth service running over RFCOMM. + # device - Bluetooth address or name of a device. If specified as a name, + # it must resolve to a single address. + # service_class - UUID or name of service class of interest. Note the + # service **name** cannot be used for lookup. + # + # In case multiple services of the same service class are available on the + # device, the port for the first one discovered is returned. + # + # Returns the port number for the service or raises an error if it + # cannot be resolved. + + #TBD - maybe use device::services and loop through so we can match service_class + #against service name as well + + set h [LookupServiceBegin \ + [ResolveDeviceUnique $device] \ + [names::service_class_uuid $service_class]] + try { + while {1} { + # 0x100 -> LUP_RETURN_ADDR + set rec [LookupServiceNext $h 0x100] + if {[dict exists $rec RemoteAddress] && + [dict get $rec RemoteAddress AddressFamily] == 32} { + # 32 -> AF_BTH (Bluetooth) + # Further we are looking for RFCOMM (protocol 3) + if {[dict exists $rec Protocol] && + [dict get $rec Protocol] == 3} { + return [dict get $rec RemoteAddress Port] + } + } + } + } finally { + LookupServiceEnd $h + } + error "Could not resolve service \"$service_class\" to a port on device \"$device\"." +} + +proc iocp::bt::device::remove {device} { + # Removes cached authentication information for a device from the system cache. + # device - bluetooth address or name of a device. if specified as a name, + # it must resolve to a single address. + # The command will raise an error if $device is a name that cannot be + # resolved. + + RemoveDevice [ResolveDeviceUnique $device] +} + +proc iocp::bt::device::service_references {device service} { + # Retrieve service discovery records that refer to a specified service. + # device - Bluetooth address or name of a device. If specified as a name, + # it must resolve to a single address. + # service - the UUID of a service or service class or its mnemonic. + # The command will return all service discovery records that contain + # an attribute referring to the specified service. + # The returned service discovery records should be treated as + # opaque and accessed through the service record decoding commands. + # + # Returns a list of service discovery records. + + set h [LookupServiceBegin \ + [ResolveDeviceUnique $device] \ + [names::to_uuid $service]] + set recs {} + try { + while {1} { + # 0x0200 -> LUP_RETURN_BLOB. Returns {Blob BINDATA} + lappend recs [lindex [LookupServiceNext $h 0x200] 1] + } + } finally { + LookupServiceEnd $h + } + return $recs +} + +proc iocp::bt::device::services {device} { + # Retrieve the service discovery records for top level services + # advertised by a device. + # device - Bluetooth address or name of a device. If specified as a name, + # it must resolve to a single address. + # + # The command will return all service discovery records that reference + # the `PublicBrowseRoot` service class. This is not necessarily all the + # services on the device, only those the device advertises as the + # top-level services. + # + # The returned service discovery records should be treated as + # opaque and accessed through the service record decoding commands. + # + # Returns a list of service dscovery records. + + # TBD - add a browse group parameter + # TBD - perhaps check that the sdr acually refernces browse group in + # the appropriate attribute + return [service_references $device 00001002-0000-1000-8000-00805f9b34fb] +} + +# TBD - is this needed? Less functional version of services +proc iocp::bt::device::enumerate_services {device} { + # Get installed services on a device. + # device - Bluetooth address or name of device. If specified as a name, + # it must resolve to a single address. + # Returns a list of service UUID's. + + return [EnumerateInstalledServices [ResolveDeviceUnique $device]] +} + + +proc iocp::bt::device::print {devinfo} { + # Prints device information in human-readable form to stdout. + # devinfo - A device information record as returned by + # the [devices] command. + dict with devinfo { + puts "Device $Name" + puts "Address: $Address" + puts "Class: $Class ($MajorClassName:$MinorClassName)" + puts "Device categories: ([join $DeviceClasses {, }])" + puts "Authenticated: $Authenticated" + puts "Remembered: $Remembered" + puts "Connected: $Connected" + puts "Last seen: $LastSeen" + puts "Last used: $LastUsed" + } +} + +proc iocp::bt::device::printn {dinfolist {detailed false}} { + # Prints device information in human-readable form to stdout. + # dinfolist - A list of device information records as returned by + # the [devices] command. + # detailed - If a true value, detailed information about the device + # is printed. If false (default), only the address and + # name are printed in compact form. + set sep "" + foreach dinfo $dinfolist { + if {$detailed} { + puts -nonewline $sep + set sep "----------------------------------------------\n" + print $dinfo + } else { + dict with dinfo { + puts "$Address $Name" + } + } + } +} + +proc iocp::bt::IsAddress {addr} { + # Returns boolean indicating whether addr is a valid Bluetooth address + # addr - value to be checked + + # TBD - implement in C? + return [regexp {^[[:xdigit:]]{2}(:[[:xdigit:]]{2}){5}$} $addr] + +} + +proc iocp::bt::Uuid16 {uuid16} { + if {![regexp {^[[:xdigit:]]{4}$} $uuid16]} { + error "\"$uuid16\" is not a valid 16 bit UUID." + } + return 0000${uuid16}-0000-1000-8000-00805f9b34fb +} + +proc iocp::bt::IsUuid {uuid} { + + # Check passed parameter for UUID syntax + + # Only checks syntax. Not RFC 4122 validity + # TBD - implement in C? + return [regexp {^[[:xdigit:]]{8}-([[:xdigit:]]{4}-){3}[[:xdigit:]]{12}$} $uuid] +} + +proc iocp::bt::IsBluetoothUuid {uuid} { + + # Check passed parameter for UUID syntax + + # TBD - implement in C? + return [regexp {^[[:xdigit:]]{8}-0000-1000-8000-00805f9b34fb$} $uuid] +} + + +proc iocp::bt::BinToHex {bin {start 0} {end end}} { + regexp -inline -all .. [binary encode hex [string range $bin $start $end]] +} + +proc iocp::bt::EncodingTclName {mibenum} { + set encoding_map { + 3 ascii + 2026 big5 + 437 cp437 + 2087 cp775 + 2009 cp850 + 2010 cp852 + 2046 cp855 + 2047 cp857 + 2048 cp860 + 2049 cp861 + 2013 cp862 + 2050 cp863 + 2051 cp864 + 2052 cp865 + 2086 cp866 + 2054 cp869 + 2109 cp874 + 113 cp936 + 2250 cp1250 + 2251 cp1251 + 2252 cp1252 + 2253 cp1253 + 2254 cp1254 + 2255 cp1255 + 2256 cp1256 + 2257 cp1257 + 2258 cp1258 + 2088 ebcdic + 18 euc-jp + 38 euc-kr + 56 gb1988 + 2025 gb2312 + 57 gb2312-raw + 39 iso2022-jp + 37 iso2022-kr + 4 iso8859-1 + 5 iso8859-2 + 6 iso8859-3 + 7 iso8859-4 + 8 iso8859-5 + 9 iso8859-6 + 10 iso8859-7 + 11 iso8859-8 + 12 iso8859-9 + 13 iso8859-10 + 109 iso8859-13 + 110 iso8859-14 + 111 iso8859-15 + 112 iso8859-16 + 15 jis0201 + 63 jis0208 + 98 jis0212 + 2084 koi8-r + 2088 koi8-u + 36 ksc5601 + 17 shiftjis + 2259 tis-620 + 106 utf-8 + } + incr mibenum 0; # Convert to canonical decimal string + if {[dict exists $encoding_map $mibenum]} { + return [dict get $encoding_map $mibenum] + } + return $mibenum +} + +proc iocp::AddressFamilyName {af} { + if {$af == 2} { + return IPv4 + } elseif {$af == 23} { + return IPv6 + } elseif {$af == 32} { + return Bluetooth + } elseif {$af == 1} { + return Unix + } elseif {$af == 6} { + return IPX + } elseif {$af == 17} { + return Netbios + } else { + return AF$af + } +} + +proc DeviceClass {class} { + if {[expr {$class & 3}] != 0} { + # Not format type that we understand + return {} + } + + # https://www.bluetooth.com/specifications/assigned-numbers/baseband/ + + set minor_class [expr {($class >> 2) & 0x3f}] + set major_class [expr {($class >> 8) & 0x1f}] + + if {$major_class == 0} { + set major_name "Miscellaneous" + set minor_name "Miscellaneous" + } elseif {$major_class == 1} { + set major_name Computer + set minor_name [lindex { + Uncategorized Desktop Server Laptop "Handheld PC/PDA" "Palm-size PC/PDA" Wearable Tablet + } $minor_class] + } elseif {$major_class == 2} { + set major_name Phone + set minor_name [lindex { + Uncategorized Cellular Cordless Smartphone "Wired modem" ISDN + } $minor_class] + } elseif {$major_class == 3} { + set major_name "LAN/Network Access point" + set minor_name [lindex { + 0% 1-17% 17-33% 33-50% 50-67% 67-83% 83-99% 100% + } $minor_class] + } elseif {$major_class == 4} { + set major_name "Audio/Video" + set minor_name [lindex { + Uncategorized "Wearable Headset Device" "Hands-free Device" Reserved + Microphone Loudspeaker Headphones "Portable Audio" "Car Audio" + "Set-top box" "HiFi Audio Device" VCR Camcorder "Video Monitor" + "Video Display and Loudspeaker" "Video Conferencing" Reserved + "Gaming/Toy" + } $minor_class] + } elseif {$major_class == 5} { + set major_name Peripheral + set bits [expr {$minor_class >> 4}] + set minor_name [lindex { + Other Keyboard "Pointing device" "Combo keyboard/pointing device" + } $bits] + set bits [expr {$minor_class & 0xf}] + if {$bits < 10} { + append minor_name /[lindex { + Uncategorized Joystick Gamepad "Remote control" "Sensing device" + "Digitizer tabler" "Card reader" "Digital pen" "Handheld scanner" + "Handheld gesture input device" + }] + } + } elseif {$major_class == 6} { + set major_name Imaging + set minor_name {} + if {$minor_class & 4} {lappend minor_name Display} + if {$minor_class & 8} {lappend minor_name Camera} + if {$minor_class & 16} {lappend minor_name Scanner} + if {$minor_class & 32} {lappend minor_name Printer} + set minor_name [join $minor_name /] + } elseif {$major_class == 7} { + set major_name Wearable + set minor_name [lindex { + Wristwatch Pager Jacket Helmet Glasses + } $minor_class] + } elseif {$major_class == 8} { + set major_name Toy + set minor_name [lindex { + Robot Vehicle Doll Controller Game + } $minor_class] + } elseif {$major_class == 9} { + set major_name Health + set minor_name [lindex { + Undefined "Blood Pressure Monitor" Thermometer "Weighing Scale" + "Glucose Meter" "Pulse Oximeter" "Heart/Pulse Rate Monitor" + "Health Data Display" "Step Counter" "Body Composition Analyzer" + "Peak Flow Monitor" "Medication Monitor" "Knee Prosthesis" + "Andle Prosthesis" "Generic Health Manager" "Personal Mobility Device" + } $minor_class] + } elseif {$major_class == 31} { + set major_name Uncategorized + set minor_name "" + } else { + set major_name Reserved + set minor_name "" + } + + set service_class {} + if {$class & (1<<13)} {lappend service_class "Limited Discoverable Mode"} + if {$class & (1<<16)} {lappend service_class "Positioning (Location identification)"} + if {$class & (1<<17)} {lappend service_class "Networking"} + if {$class & (1<<18)} {lappend service_class "Rendering"} + if {$class & (1<<19)} {lappend service_class "Capturing"} + if {$class & (1<<20)} {lappend service_class "Object Transfer"} + if {$class & (1<<21)} {lappend service_class "Audio"} + if {$class & (1<<22)} {lappend service_class "Telephony"} + if {$class & (1<<23)} {lappend service_class "Information"} + + return [dict create MajorClassName $major_name \ + MinorClassName $minor_name \ + DeviceClasses $service_class] +} + +proc iocp::bt::ResolveDeviceUnique {device} { + if {[IsAddress $device]} { + return $device + } + set addrs [device address $device] + if {[llength $addrs] == 0} { + error "Could not resolve Bluetooth device name \"$device\"." + } elseif {[llength $addrs] > 1} { + error "Device \"$device\" resolves to multiple addresses." + } + return [lindex $addrs 0] +} + +package provide iocp_bt $iocp::bt::version diff --git a/src/tclkit86bi.vfs/lib/iocp1.1.0/btnames.tcl b/src/tclkit86bi.vfs/lib/iocp1.1.0/btnames.tcl new file mode 100644 index 00000000..c441c4fa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/iocp1.1.0/btnames.tcl @@ -0,0 +1,383 @@ +# +# Copyright (c) 2020, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval iocp::bt::names { + namespace path [namespace parent] + # Maps UUID to Service class name + # https://www.bluetooth.com/specifications/assigned-numbers/service-discovery/ + # UUID may be either 16-bit Bluetooth universal UUID as or the full UUID + # Uses lower case hex. + variable service_class_names { + 1000 ServiceDiscoveryServerServiceClassID + 1001 BrowseGroupDescriptorServiceClassID + 1002 PublicBrowseRoot + 1101 SerialPort + 1102 LANAccessUsingPPP + 1103 DialupNetworking + 1104 IrMCSync + 1105 OBEXObjectPush + 1106 OBEXFileTransfer + 1107 IrMCSyncCommand + 1108 Headset + 1109 CordlessTelephony + 110a AudioSource + 110b AudioSink + 110c A/V_RemoteControlTarget + 110d AdvancedAudioDistribution + 110e A/V_RemoteControl + 110f A/V_RemoteControlController + 1110 Intercom + 1111 Fax + 1112 {Headset - Audio Gateway (AG)} + 1115 PANU + 1116 NAP + 1117 GN + 1118 DirectPrinting + 1119 ReferencePrinting + 111a {Basic Imaging Profile} + 111b ImagingResponder + 111c ImagingAutomaticArchive + 111d ImagingReferencedObjects + 111e Handsfree + 111f HandsfreeAudioGateway + 1120 DirectPrintingReferenceObjectsService + 1121 ReflectedUI + 1122 BasicPrinting + 1123 PrintingStatus + 1124 HumanInterfaceDeviceService + 1125 HardcopyCableReplacement + 1126 HCR_Print + 1127 HCR_Scan + 1128 Common_ISDN_Access + 112d SIM_Access + 112e {Phonebook Access - PCE} + 112f {Phonebook Access - PSE} + 1130 {Phonebook Access} + 1131 {Headset - HS} + 1132 {Message Access Server} + 1133 {Message Notification Server} + 1134 {Message Access Profile} + 1135 GNSS + 1136 GNSS_Server + 1137 {3D Display} + 1138 {3D Glasses} + 1139 {3D Synchronization} + 113a {MPS Profile UUID} + 113b {MPS SC UUID} + 113c {CTN Access Service} + 113d {CTN Notification Service} + 113e {CTN Profile} + 1200 PnPInformation + 1201 GenericNetworking + 1202 GenericFileTransfer + 1203 GenericAudio + 1204 GenericTelephony + 1303 VideoSource + 1304 VideoSink + 1305 VideoDistribution + 1400 HDP + 1401 {HDP Source} + 1402 {HDP Sink} + 02030302-1d19-415f-86f2-22a2106a0a77 {Wireless iAP v2} + } + + # https://www.bluetooth.com/specifications/assigned-numbers/service-discovery/ + variable protocol_names { + 0001 SDP + 0002 UDP + 0003 RFCOMM + 0004 TCP + 0005 TCS-BIN + 0006 TCS-AT + 0007 ATT + 0008 OBEX + 0009 IP + 000a FTP + 000c HTTP + 000e WSP + 000f BNEP + 0010 UPNP + 0011 HIDP + 0012 HardcopyControlChannel + 0014 HardcopyDataChannel + 0016 HardcopyNotification + 0017 AVCTP + 0019 AVDTP + 001b CMTP + 001e MCAPControlChannel + 001f MCAPDataChannel + 0100 L2CAP + } + + # Universal attribute names + variable attribute_names + set attribute_names { + ServiceRecordHandle 0 + ServiceClassIDList 1 + ServiceRecordState 2 + ServiceID 3 + ProtocolDescriptorList 4 + BrowseGroupList 5 + LanguageBaseAttributeIDList 6 + ServiceInfoTimeToLive 7 + ServiceAvailability 8 + BluetoothProfileDescriptorList 9 + DocumentationURL 10 + ClientExecutableURL 11 + IconURL 12 + AdditionalProtocolDescriptorList 13 + ServiceName 256 + ServiceDescription 257 + ProviderName 258 + } + +} + +proc iocp::bt::names::is_uuid {uuid} { + regexp {^[[:xdigit:]]{8}-([[:xdigit:]]{4}-){3}[[:xdigit:]]{12}$} $uuid +} + +proc iocp::bt::names::to_name {uuid} { + # Map a UUID to a name. + # uuid - Bluetooth UUID + # The command attempts to map the UUID as a service name or protocol + # name in that order. + # + # Returns the mapped name or the uuid if no mapping is possible. + + set name [service_class_name $uuid] + if {$name ne $uuid && ![is_uuid $name]} { + return $name + } + return [protocol_name $uuid] +} + +proc iocp::bt::names::to_uuid {name_or_uuid} { + # Map a name to a UUID. + # name_or_uuid - Bluetooth UUID or name + # The command attempts to map the name as a service class name or protocol + # name in that order. + # + # Returns the mapped uuid raises an error if no mapping is possible. + variable service_class_names + if {[MapNameToUuidV $name_or_uuid service_class_names name]} { + return $name + } + return [protocol_uuid $name_or_uuid] +} + + +proc iocp::bt::names::service_class_name {uuid} { + # Maps a UUID to a service class name. + # uuid - UUID to be mapped + # Returns a human-readable name or the UUID itself + # if no mapping could be performed. + variable service_class_names + set name [MapUuidToName $uuid service_class_names] + if {$name ne $uuid} { + return $name + } + # Well known private uuids + if {[string equal -nocase "02030302-1d19-415f-86f2-22a2106a0a77" $uuid]} { + return "Wireless iAP v2"; # iPod Accessory Protocol + } + return $uuid +} + +proc iocp::bt::names::service_class_uuid {name} { + # Maps a service class name to a UUID. + # name - Service class name to be mapped. + # The command raises an error if the name could not be mapped to + # a UUID. + # + # Returns the UUID corresponding to the name. + variable service_class_names + return [MapNameToUuid $name service_class_names] +} + +proc iocp::bt::names::profile_name {uuid} { + # Maps a UUID to a Bluetooth profile name. + # uuid - UUID to be mapped + # Returns a human-readable name or the UUID itself + # if no mapping could be performed. + + # Profiles seem to come from same service class UUID space. + return [service_class_name $uuid] +} + +proc iocp::bt::names::protocol_name {uuid} { + # Maps a UUID to a protocol name. + # uuid - UUID to be mapped + # Returns a human-readable name or the UUID itself + # if no mapping could be performed. + variable protocol_names + return [MapUuidToName $uuid protocol_names] +} + +proc iocp::bt::names::protocol_uuid {name} { + # Maps a protocol name to a UUID. + # name - Protocol name to be mapped. + # The command raises an error if the name could not be mapped to + # a UUID. + # + # Returns the UUID corresponding to the name. + variable protocol_names + return [MapNameToUuid $name protocol_names] +} + +proc iocp::bt::names::attribute_name {attr_id} { + # Maps a attribute id (numeric or name) to a attribute name. + # attr_id - numeric attribute identifier + # Returns a human-readable name for the attribute or + # the numeric id itself if no mapping could be performed. + variable attribute_names + dict for {name id} $attribute_names { + if {$attr_id == $id || [string equal -nocase $name $attr_id]} { + return $name + } + } + if {[string is integer -strict $attr_id]} { + return $attr_id + } + error "Unknown attribute \"$attr_id\"." +} + +proc iocp::bt::names::attribute_id {name} { + # Maps a attribute name to it numeric attribute identifier. + # name - Attribute name to be mapped + # The command will raise an error if the name is unknown. + # Returns the numeric attribute identifier corresponding to + # the passed name. + variable attribute_names + if {[string is integer -strict $name]} { + return $name + } + return [dict get $attribute_names $name] +} + +proc iocp::bt::names::print {} { + # Prints known UUID's and their mapped mnemonics. + variable service_class_names + dict for {uuid16 name} $service_class_names { + puts "[Uuid16 $uuid16] $name" + } +} + +proc iocp::bt::names::MapUuidToName {uuid dictvar} { + upvar 1 $dictvar names + + # uuid may be a full UUID or a 16-bit Bluetooth UUID + if {[IsUuid $uuid]} { + # See if the exact match exists + set uuid [string tolower $uuid] + if {[dict exists $names $uuid]} { + return [dict get $names $uuid] + } + # Nope. Now see if it is a 16-bit Bluetooth UUID + if {[IsBluetoothUuid $uuid] && [string range $uuid 0 3] eq "0000"} { + # 16-bit UUID + set uuid16 [string tolower [string range $uuid 4 7]] + if {[dict exists $names $uuid16]} { + return [dict get $names $uuid16] + } + } + # Nope. Cannot be mapped. Return the UUID. + return $uuid + } + + # Not a full UUID. Retry as a 16-but UUID. tailcall so upvar works right. + tailcall MapUuidToName [Uuid16 $uuid] $dictvar +} + +proc iocp::bt::names::MapNameToUuidV {name dictvar resultvar} { + upvar 1 $dictvar names + upvar 1 $resultvar result + + if {[IsUuid $name]} { + set result $name + return 1 + } + dict for {uuid mapped_name} $names { + if {[string equal -nocase $name $mapped_name]} { + if {[string length $uuid] == 4} { + # 16-bit UUID -> full UUID + set result "0000${uuid}-0000-1000-8000-00805f9b34fb" + } else { + set result $uuid + } + return 1 + } + } + return 0 +} + +proc iocp::bt::names::MapNameToUuid {name dictvar} { + upvar 1 $dictvar names + if {[MapNameToUuidV $name names result]} { + return $result + } + error "Name \"$name\" could not be mapped to a UUID" +} + +proc iocp::bt::names::Asciify {svar} { + # Replaces non-ascii or non-printable chars with Tcl sequences + # + # Transformed string is stored back in svar. + + upvar 1 $svar s + set ascii "" + set was_escaped 0 + # Split can be expensive for large strings so string index + set len [string length $s] + for {set i 0} {$i < $len} {incr i} { + set char [string index $s $i] + scan $char %c codepoint + if {$codepoint < 32 || $codepoint >= 126} { + append ascii "\\u[format %.4x $codepoint]" + set was_escaped 1 + } else { + append ascii $char + } + } + set s $ascii + return $was_escaped +} + +proc iocp::bt::names::ClipSpec {{use_list 0}} { + package require twapi + + set csv [twapi::read_clipboard_text] + if {$use_list} { + set tcl "\[list \n" + } else { + set tcl "\{ \n" + } + foreach line [split $csv \n] { + lassign [split $line \t] name uuid description + set name [string trim $name] + set uuid [string trim $uuid] + if {![regexp {^0x[[:xdigit:]]{4}} $uuid]} continue + if {$use_list} { + # Unicode chars, needs escaping + Asciify name + append tcl " " [list [string range $uuid 2 end]] " " "\"$name\"" " \\" \n + } else { + if {[Asciify name]} { + # Need to use the list command. Just restart + return [ScrapeBTSpec 1] + } + append tcl " " [string range $uuid 2 end] " " "{$name}" \n + } + } + if {$use_list} { + append tcl "\]\n" + } else { + append tcl "\}" + } + + twapi::write_clipboard_text $tcl +} + diff --git a/src/tclkit86bi.vfs/lib/iocp1.1.0/btsdr.tcl b/src/tclkit86bi.vfs/lib/iocp1.1.0/btsdr.tcl new file mode 100644 index 00000000..e42cc462 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/iocp1.1.0/btsdr.tcl @@ -0,0 +1,962 @@ +# +# Copyright (c) 2020, Ashok P. Nadkarni +# All rights reserved. +# +# See the file LICENSE for license + +namespace eval iocp::bt::sdr { + namespace path [namespace parent] + namespace export attribute attributes decode print printn + + namespace eval attribute { + namespace path [list [namespace parent] [namespace parent [namespace parent]]] + namespace export exists get raw text + namespace ensemble create + } +} + +proc iocp::bt::sdr::decode {binsdr} { + # Decodes a binary service discovery record + # binsdr - a raw Bluetooth service discovery record in binary + # form. + # + # The returned value should be treated as opaque. The attributes + # stored in the record should be accessed with the commands in + # the `sdr` namespace. + # + # Returns a container of attributes stored in the record. + + # A SDR record is a single data element which is a sequence + # containing nested data elements. + # {{sequence {nested data elements}}} + set rec [lindex [DecodeElements $binsdr] 0 1] + + # $rec contains alternating attribute value pairs. The result + # is built as a list as its faster to do that and shimmer + # to a dict on access than to build a dictionary to begin with. + set sdr {} + foreach {attr val} $rec { + lappend sdr [lindex $attr 1] $val + } + return $sdr +} + +proc iocp::bt::sdr::attribute::exists {sdr attr_id {varname {}}} { + # Checks if an attribute exists in a service discovery record + # sdr - a decoded service discovery record in the form returned by + # [decode]. + # attr_id - attribute integer id or Bluetooth universal attribute name + # varname - If not the empty string, the attribute + # value is stored in a variable of this name in the + # caller's context. + # + # The value returned in $varname is the attribute type-independent data + # value. To get the value formatted for the attribute type, use the + # [attribute get] command. + # + # Returns 1 if the attribute exists, and 0 otherwise. + + if {[string is integer -strict $attr_id]} { + set key [expr {$attr_id + 0}]; # Force decimal rep. Faster than format + } else { + set key [names::attribute_id $attr_id]; # name -> id + } + + if {[dict exists $sdr $key]} { + if {$varname ne ""} { + upvar 1 $varname value + set value [dict get $sdr $key] + } + return 1 + } + + return 0 +} + +proc iocp::bt::sdr::attributes {sdr} { + # Get the list of attributes in a service discovery record + # sdr - a decoded service discovery record in the form returned by + # [decode]. + # Returns a list of numeric attribute ids. + return [dict keys $sdr] +} + +proc iocp::bt::sdr::attribute::raw {sdr attr_id} { + # Get an attribute value from an service discovery record. + # sdr - a decoded service discovery record in the form returned by + # sdr_decode. + # attr_id - attribute integer id + # + # The command will raise an error if the attribute does not exist + # in the sdr. + # + # Returns the attribute value as a pair consisting of the type and + # the raw data element value. + + if {[exists $sdr $attr_id value]} { + return $value + } else { + error "Attribute with id \"$attr_id\" not found." + } +} + +proc iocp::bt::sdr::attribute::get {sdr attr_id {varname {}}} { + # Get the value of an universal attribute from a service + # discovery record. + # sdr - Decoded service discovery record. + # attr_id - Universal attribute name or numeric identifier. + # varname - Optional name of variable in caller's context. + # + # If $varname is not the empty string, it should be the name of + # a variable in the caller's context. + # - If the attribute is present, the command returns `1` and + # stores the attribute value in the variable. + # - If the attribute is not present, the command returns 0. + # + # If $varname is an empty string, + # - If the attribute is present, the command returns its value. + # - If the attribute is not present, the command raises an error. + # + # The attribute value is decoded into a attribute type-dependent format. + # + # The $attr_id argument must be one of those defined in + # the *Universal Attributes* section in the + # [Bluetooth Assigned Numbers](https://www.bluetooth.com/specifications/assigned-numbers/service-discovery/) + # specification. Otherwise an error is raised. The recognized attributes + # are listed below. Refer to the Bluetooth specification for their + # exact semantics. + # + # AdditionalProtocolDescriptorList - List of protocol stacks. This + # supplements the `ProtocolDescriptorList` attribute. + # BluetoothProfileDescriptorList - List of Bluetooth profile descriptors + # to which the service conforms. Each element is a dictionary + # with keys `Uuid`, `Name`, `MajorVersion` and `MinorVersion` + # corresponding to the referenced profile. + # BrowseGroupList - List of browse group descriptors representing + # the browse groups to which the service record belongs. Each + # descriptor is dictionary with keys `Uuid` and `Name` identifying + # the a browse group. + # ClientExecutableURL - URL pointing to the client application that + # may be used to utilize the service. + # DocumentationURL - URL for the service documentation. + # IconURL - URL for icon that may be used to represent the service. + # LanguageBaseAttributeIDList - Nested dictionary of language-specific + # attribute offsets (see below). + # ProtocolDescriptorList - List of protocol stacks (see below) that may + # be used to access the service described by the service record. + # ProviderName - Name of entity providing the service in the primary + # language of the service record. + # ServiceAvailability - A value in the range 0-255 that indicates + # relative availability of the service in terms of the number of + # clients it can accept. Note this is a scaled estimate. + # ServiceClassIDList - List with each element being a dictionary + # corresponding to a service class that the record conforms to. + # The keys of the dictionary are `Name` and `Uuid`. + # ServiceDescription - A description of the service in the primary + # language of the record. + # ServiceID - UUID that uniquely identifies a service instance. + # ServiceInfoTimeToLive - The number of seconds from the time it was + # generated that the service record information is expected to be valid. + # ServiceName - The human-readable name of the service in the primary + # language of the record. + # ServiceRecordHandle - A numeric value that uniquely identifies a service + # record within a SDP server. + # ServiceRecordState - Numeric value that is changed any time the service + # record is modified by the SDP server. + # + # In the case of ProtocolDescriptorList and AdditionalProtocolDescriptorList, + # the attribute value is in the form of a list each element of + # which describes a protocol stack that may be used to access the + # service. Each such element is itself a list whose elements correspond + # to layers in that protocol stack starting with the lowest layer first. + # Each layer is described as a dictionary with the following keys: + # Uuid - the UUID of the protocol for the layer + # Name - the name of the protocol + # Params - the protocol parameters. This is a list of raw data elements + # of the form `{type value}` the interpretation of which is + # protocol dependent. + # + # In the case of LanguageBaseAttributeIDList, the attribute value is + # a dictionary indexed by language + # identifiers as defined in ISO639, e.g. `en`, `fr` etc. + # The corresponding value is itself a dictionary with keys `BaseOffset` + # and `Encoding`. See the Bluetooth specification for the former. + # The latter is either a Tcl encoding name or in case the encoding + # is not supported by Tcl, an integer value that identifies an encoding + # as per the Bluetooth specification. + # + # Returns a boolean or the decoded attribute value. + + set attr_name [names::attribute_name $attr_id] + set attr_id [names::attribute_id $attr_id] + switch -exact -- $attr_name { + BrowseGroupList - + ServiceClassIDList { + tailcall Uuids $sdr $attr_id $varname + } + BluetoothProfileDescriptorList - + ProtocolDescriptorList - + AdditionalProtocolDescriptorList - + LanguageBaseAttributeIDList { + tailcall $attr_name $sdr $varname + } + DocumentationURL - + ClientExecutableURL - + IconURL - + ServiceAvailability - + ServiceInfoTimeToLive - + ServiceID - + ServiceRecordState - + ServiceRecordHandle { + tailcall AttributeValue $sdr $attr_id $varname + } + ServiceName - + ServiceDescription - + ProviderName { + # Special case because they need a language argument + tailcall text $sdr $attr_name primary $varname + } + default { + if {[llength [info commands [namespace current]::universal::$attr_name]]} { + tailcall [namespace current]::universal::$attr_name $sdr $varname + } + } + } + error "Unknown universal attribute \"$attr_id\"." +} + +proc iocp::bt::sdr::attribute::text {sdr attr_id lang {varname {}}} { + # Get the value of an text attribute in the specified language + # from a service discovery record. + # sdr - Decoded service discovery record. + # attr_id - Universal attribute name or numeric identifier. + # lang - language identifier as specified in iso639, e.g. `en` for + # english, `fr` for french etc. or the keyword `primary`. + # varname - Name of variable in caller's context. + # + # If $varname is not the empty string, it should be the name of + # a variable in the caller's context. + # - If the attribute is present, the command returns `1` and + # stores the attribute value in the variable. + # - If the attribute is not present, the command returns 0. + # + # If $varname is an empty string, + # - If the attribute is present, the command returns its value. + # - If the attribute is not present, the command raises an error. + # + # If the record does not contain a value for the specified language, + # the value for the primary language will be retrieved. + # + # Returns a boolean or the attribute text value. + # + set lang_offset [names::attribute_id $attr_id] + if {$lang_offset < 256 || $lang_offset >= 512} { + error "Invalid text attribute id \"$attr_id\"." + } + incr lang_offset -256 + tailcall TextAttribute $sdr $lang_offset $lang $varname +} + + +proc iocp::bt::sdr::attribute::LanguageBaseAttributeIDList {sdr {varname {}}} { + # Retrieve the language base attributes in a service discovery record. + # sdr - decoded service discovery record + # varname - optional name of variable in caller's context. + # + # The retrieved value is a nested dictionary + # corresponding to the `LanguageBaseAttributeIDList` + # universal attribute in the Bluetooth Core specification. + # + # If $varname is not the empty string, it should be the name of + # a variable in the caller's context. + # - If the attribute is present, the command returns `1` and + # stores the attribute value in the variable. + # - If the attribute is not present, the command returns 0. + # + # If $varname is an empty string, + # - If the attribute is present, the command returns its value. + # - If the attribute is not present, the command raises an error. + # + # The dictionary value returned or stored is indexed by language + # identifiers as defined in ISO639, e.g. `en`, `fr` etc. + # The corresponding value is itself a dictionary with keys `BaseOffset` + # and `Encoding`. See the Bluetooth specification for the former. + # The latter is either a Tcl encoding name or in case the encoding + # is not supported by Tcl, an integer value that identifies an encoding + # as per the Bluetooth specification. fs + # + # Returns a boolean or a dictionary of language attributes. + if {![AttributeValue $sdr 6 sequence]} { + if {$varname eq ""} { + error "Attribute not found." + } else { + return 0 + } + } + + # attr is {sequence {langid encoding baseoffset ...}} + set langs [dict create] + foreach {langid enc offset} $sequence { + # langid is ISO 639 language code + set langid [lindex $langid 1] + set langid "[format %c [expr {$langid >> 8}]][format %c [expr {$langid &0xff}]]" + dict set langs $langid Encoding [::iocp::bt::EncodingTclName [lindex $enc 1]] + dict set langs $langid BaseOffset [lindex $offset 1] + } + if {$varname eq ""} { + return $langs + } else { + upvar 1 $varname var + set var $langs + return 1 + } +} + + +proc iocp::bt::sdr::attribute::ProtocolDescriptorList {sdr {varname {}}} { + # Retrieve the protocol information from a service discovery record. + # sdr - decoded service discovery record + # varname - optional name of variable in caller's context. + # + # Information about the protocols that may be used to access the + # service described by SDR is stored in the ProtocolDescriptorList + # universal attribute as described in the Bluetooth Core specification. + # + # If $varname is not the empty string, it should be the name of + # a variable in the caller's context. + # - If the attribute is present, the command returns `1` and + # stores the attribute value in the variable. + # - If the attribute is not present, the command returns 0. + # + # If $varname is an empty string, + # - If the attribute is present, the command returns its value. + # - If the attribute is not present, the command raises an error. + # + # The returned information is in the form of a list each element of + # which describes a protocol stack that may be used to access the + # service. Each such element is itself a list whose elements correspond + # to layers in that protocol stack starting with the lowest layer first. + # Each layer is described as a dictionary with the following keys: + # Uuid - the UUID of the protocol for the layer + # Name - the name of the protocol + # Params - the protocol parameters. This is a list of raw data elements + # of the form `{type value}` the interpretation of which is + # protocol dependent. + # + # Returns a boolean or the list of protocols. + + if {! [attribute exists $sdr 4 attrval]} { + if {$varname eq ""} { + error "Attribute not found." + } else { + return 0 + } + } + + if {$varname eq ""} { + return [Protocols $attrval] + } else { + upvar 1 $varname var + set var [Protocols $attrval] + return 1 + } +} + +proc iocp::bt::sdr::attribute::BluetoothProfileDescriptorList {sdr {varname {}}} { + # Retrieve the service classes in a service discovery record. + # sdr - decoded service discovery record + # varname - optional name of variable in caller's context. + # + # The retrieved value is a list of profile descriptors + # corresponding to the BluetoothProfileDescriptorList + # universal attribute in the Bluetooth Core specification. + # Each descriptor is a dictionary with the following keys: + # `Uuid` - the UUID of the profile + # `Name` - the mnemonic name of the profile or its UUID if the + # UUID cannot be mapped to a name + # `MajorVersion` - the profile's major version + # `MinorVersion` - the profile's minor version + # + # If $varname is not the empty string, it should be the name of + # a variable in the caller's context. + # - If the attribute is present, the command returns `1` and + # stores the attribute value in the variable. + # - If the attribute is not present, the command returns 0. + # + # If $varname is an empty string, + # - If the attribute is present, the command returns its value. + # - If the attribute is not present, the command raises an error. + # + # Returns a boolean or the list of service class descriptors. + + if {! [attribute exists $sdr 9 attr]} { + if {$varname eq ""} { + error "Attribute not found." + } else { + return 0 + } + } + + # Sequence of profile descriptors. Each profile descriptor + # is sequence of profile uuid and version. + set profiles {} + foreach profile [lindex $attr 1] { + set uuid [lindex $profile 1 0 1] + set version [lindex $profile 1 1 1] + lappend profiles [dict create \ + Uuid $uuid \ + Name [iocp::bt::names::to_name $uuid] \ + MajorVersion [expr {$version >> 8}] \ + MinorVersion [expr {$version & 0xff}] + ] + } + + if {$varname eq ""} { + return $profiles + } else { + upvar 1 $varname var + set var $profiles + return 1 + } + +} + +proc iocp::bt::sdr::attribute::AdditionalProtocolDescriptorList {sdr {varname {}}} { + # Returns protocol information from the additional protocols field + # in a service discovery record. + # sdr - decoded service discovery record + # varname - optional name of variable in caller's context. + # This command is identical to [protocols] except it extracts + # protocol information from the `AdditionalProtocolDescriptorList` + # attribute instead of `ProtocolDescriptorList`. + + if {! [attribute exists $sdr 13 attrval]} { + if {$varname eq ""} { + error "Attribute not found." + } else { + return 0 + } + } + + # AdditionalProtocolDescriptorList is a sequence each element of which + # is formatted like a ProtocolDescriptorList + # assert [lindex $attrval 0] eq "sequence" + set protocols [lmap elem [lindex $attrval 1] { + Protocols $elem + }] + + if {$varname eq ""} { + return $protocols + } else { + upvar 1 $varname var + set var $protocols + return 1 + } +} + + +proc iocp::bt::sdr::Uuids {sdr attr_id {varname {}}} { + if {! [attribute exists $sdr $attr_id attrval]} { + if {$varname eq ""} { + error "Attribute not found." + } else { + return 0 + } + } + + set uuids [lmap elem [lindex $attrval 1] { + set uuid [lindex $elem 1] + dict create Uuid $uuid Name [names::to_name $uuid] + }] + + if {$varname eq ""} { + return $uuids + } else { + upvar 1 $varname var + set var $uuids + return 1 + } +} + +proc iocp::bt::sdr::Protocols {attrval} { + # The attribute value may either be a single protocol stack encoded + # as a sequence, or multiple stacks encoded as a selection of sequences. + if {[lindex $attrval 0] eq "sequence"} { + # Single protocol stack + set stacks [list [lindex $attrval 1]] + } else { + # selection - Multiple stacks + set stacks [lindex $attrval 1] + } + + set protocols [lmap stack $stacks { + # stack -> {protocol_descriptor protocol_descriptor ...} + # protocol_descriptor -> {sequence {data_element ...}} + lmap protocol_descriptor $stack { + # Each descriptor is a sequence, the first element identifying the + # protocol and the remaining being (optional) parameters. + set elements [lindex $protocol_descriptor 1] + set protocol_uuid [lindex $elements 0 1] + dict create \ + Protocol $protocol_uuid \ + ProtocolName [iocp::bt::names::protocol_name $protocol_uuid] \ + ProtocolParams [lrange $elements 1 end] + } + }] + + return $protocols +} + +proc iocp::bt::sdr::AttributeValue {sdr attr_id {varname {}}} { + if {$varname eq ""} { + return [lindex [attribute raw $sdr $attr_id] 1] + } else { + if {[attribute exists $sdr $attr_id attrval]} { + upvar 1 $varname value + set value [lindex $attrval 1] + return 1 + } else { + return 0 + } + } +} + +proc iocp::bt::sdr::TextAttribute {sdr attr_offset lang {varname {}}} { + + # Assume that if sdr does not explicitly specify encoding, it is UTF8 + set enc utf-8 + set base_offset 256 + + # Primary language's ServiceName attribute index always 256 + # Otherwise get the offset from the base index 256 + if {$lang ne "primary"} { + # See if the specified language has an entry in the languages table + if {[attribute get $sdr LanguageBaseAttributeIDList base_offsets] && + [dict exists $base_offsets $lang]} { + # Yes, so the language-specific text will be at an offset + # from the base attribute index + set base_offset [dict get $base_offsets $lang BaseOffset] + set enc [dict get $base_offsets $lang Encoding] + } + } + set attr_index [expr {$base_offset + $attr_offset}] + if {! [attribute exists $sdr $attr_index name]} { + # This language does not exist. Return primary language if possible. + # If base_offset was 256, that's already primary so don't retry + if {$base_offset == 256 || + ![attribute exists $sdr [expr {256 + $attr_offset}] name] } { + if {$varname ne ""} { + return 0 + } else { + error "Attribute not found in SDR." + } + } + } + + set name [lindex $name 1] + + # $name is encoded. If Tcl supports the encoding, well and good. + # Else return a hex form + if {[string is integer $enc]} { + # SDR specified an encoding but not one that Tcl knows about + set text [binary encode hex $name] + } else { + # The string may be null terminated. TBD - always? + if {[string index $name end] eq "\0"} { + set name [string range $name 0 end-1] + } + set text [encoding convertfrom $enc $name] + } + + if {$varname ne ""} { + upvar 1 $varname var + set var $text + return 1 + } else { + return $text + } +} + +proc iocp::bt::sdr::DecodeElements {delem} { + # Decodes a Data Element as defined in the Bluetooth specification. + # delem - Data element in binary format + + set decoded {} + while {[string length $delem]} { + lassign [ExtractFirstElement $delem] type value delem + switch -exact -- $type { + sequence { lappend decoded [list sequence [DecodeElements $value]]} + selection { lappend decoded [list selection [DecodeElements $value]]} + default { + lappend decoded [list $type $value] + } + } + } + return $decoded +} + +proc iocp::bt::sdr::ExtractFirstElement {bin} { + # Extracts leading element from an SDP record. + # bin - tail of SDP record + # Returns a pair consisting of the extracted element and + # the remaining part of $bin. + + set binlen [string length $bin] + if {$binlen == 0} { + return {} + } + binary scan $bin c header + set type [expr {($header >> 3) & 0xff}] + set lenbits [expr {$header & 0x7}] + + # The nil type is formatted slightly differently. Treat as a special case. + if {$type == 0} { + if {$lenbits != 0} { + error "Invalid non-0 length for nil type." + } + return [list nil "" [string range $bin 1 end]] + } + + if {$lenbits < 5} { + set len [expr {1 << $lenbits}] + set dataoffset 1 + } else { + if {$lenbits == 5} { + set dataoffset 2 + set fmt c + set mask 0xff + } elseif {$lenbits == 6} { + set dataoffset 3 + set fmt S + set mask 0xffff + } else { + # lenbits == 7 + set dataoffset 5 + set fmt I + set mask 0xffffffff + } + # Ensure input length enough for at least length field + if {$binlen < $dataoffset} { + error "Truncated binary header." + } + binary scan $bin @1$fmt len + set len [expr {$len & $mask}]; # Since binary scan is signed + } + if {$binlen < ($dataoffset+$len)} { + error "Truncated binary data." + } + set elem [string range $bin $dataoffset [expr {$dataoffset+$len-1}]] + switch -exact $type { + 1 { + set type uint + if {$len == 1} { + binary scan $elem cu elem + } elseif {$len == 2} { + binary scan $elem Su elem + } elseif {$len == 4} { + binary scan $elem Iu elem + } elseif {$len == 8} { + binary scan $elem Wu elem + } elseif {$len == 16} { + binary scan $elem WuWu hi lo + # TBD - check this + # (2**64)*hi + lo + set elem [expr {(18446744073709551616 * $hi) + $lo}] + } else { + error "Invalid integer width." + } + } + 2 { + set type int + if {$len == 1} { + binary scan $elem c elem + } elseif {$len == 2} { + binary scan $elem S elem + } elseif {$len == 4} { + binary scan $elem I elem + } elseif {$len == 8} { + binary scan $elem W elem + } elseif {$len == 16} { + # Note hi is signed, lo unsigned + binary scan $elem WWu hi lo + # TBD - check this + # (2**64)*hi + lo + set elem [expr {(18446744073709551616 * $hi) + $lo}] + } else { + error "Invalid integer width." + } + } + 3 { + set type uuid + if {$len == 2} { + set elem [binary encode hex $elem] + set elem "0000$elem-0000-1000-8000-00805f9b34fb" + } elseif {$len == 4} { + set elem [binary encode hex $elem] + set elem "$elem-0000-1000-8000-00805f9b34fb" + } elseif {$len == 16} { + set hex [binary encode hex $elem] + set elem [string range $hex 0 7] + append elem - [string range $hex 8 11] + append elem - [string range $hex 12 15] + append elem - [string range $hex 16 19] + append elem - [string range $hex 20 end] + } else { + error "Invalid length $len for UUID." + } + } + 4 { + set type text + # TBD - keep elem as binary as we do not know encoding + } + 5 { + set type boolean + if {$len != 1} { + error "Invalid length for boolean type." + } + binary scan $elem c elem + set elem [expr {!!$elem}] ; # Convert to 0/1 + } + 6 { + set type sequence + # elem remains the same. Caller will have to recurse to parse + } + 7 { + set type selection + # elem remains the same. Caller will have to recurse to parse + } + 8 { + set type url + # elem remains same. Encoding unknown. TBD + } + default { + set type unknown + # elem remains same + } + } + + return [list $type $elem [string range $bin $dataoffset+$len end]] +} + +proc iocp::bt::sdr::printn {recs {attrfilter *}} { + # Prints a SDP record to a more human readable form. + # recs - a list of binary SDP records in the form returned by + # [::iocp::bt::device services] or [::iocp::bt::device service_references]. + # attrfilter - If specified, only attribute names matching the filter + # using `string match` are printed. + # + set sep "" + foreach rec $recs { + puts $sep + set sep "--------------------------------------------" + print $rec $attrfilter + } +} + +proc iocp::bt::sdr::print {rec {attrfilter *}} { + # Prints a SDP record to a more human readable form. + # rec - a binary SDP record in the form returned by [::iocp::bt::device services] or + # [::iocp::bt::device service_references]. + # attrfilter - If specified, only attribute names matching the filter + # using `string match` are printed. + # + + # Alternating attribute value pairs + set rec [decode $rec] + foreach attr [attributes $rec] { + set attrname [names::attribute_name $attr] + if {[string is integer -strict $attrname]} { + # For easier matching with Bluetooth specs + set attrname [format 0x%x $attrname] + } + if {![string match -nocase $attrfilter $attrname]} { + continue + } + switch -exact -- $attrname { + ServiceID - + ServiceRecordState - + ServiceInfoTimeToLive - + ServiceAvailability - + DocumentationURL - + ClientExecutableURL - + IconURL - + ServiceName - + ServiceDescription - + ProviderName - + ServiceRecordHandle { + puts "$attrname: [attribute get $rec $attrname]" + } + ServiceClassIDList { + puts "$attrname: sequence" + foreach elem [attribute get $rec $attrname] { + dict with elem { + # We use this for printing service-specific attributes + lappend service_class_uuids $Uuid + if {$Name eq $Uuid} { + puts " $Uuid" + } else { + puts " $Uuid $Name" + } + } + } + } + ProtocolDescriptorList { + puts "$attrname:" + foreach protocol [attribute get $rec $attrname] { + puts " ProtocolStack:" + foreach layer $protocol { + set name [dict get $layer ProtocolName] + set uuid [dict get $layer Protocol] + set params [lmap param [dict get $layer ProtocolParams] { + PrintableElement $param + }] + if {$name eq ""} { + puts " $uuid ([join $params {, }])" + } else { + puts " $uuid $name ([join $params {, }])" + } + } + } + } + AdditionalProtocolDescriptorList { + # Like ProtocolDescriptorList but an additional level + # of nesting. + puts "$attrname:" + foreach additional_protocol [attribute get $rec $attrname] { + foreach protocol $additional_protocol { + puts " ProtocolStack:" + foreach layer $protocol { + set name [dict get $layer ProtocolName] + set uuid [dict get $layer Protocol] + set params [lmap param [dict get $layer ProtocolParams] { + PrintableElement $param + }] + if {$name eq ""} { + puts " $uuid ([join $params {, }])" + } else { + puts " $uuid $name ([join $params {, }])" + } + } + } + } + } + BrowseGroupList { + puts "$attrname: sequence" + foreach elem [attribute get $rec $attrname] { + dict with elem { + if {$Name eq $Uuid} { + puts " $Uuid" + } else { + puts " $Uuid $Name" + } + } + } + } + LanguageBaseAttributeIDList { + puts "$attrname: sequence" + dict for {lang val} [attribute get $rec $attrname] { + puts " $lang: [dict get $val Encoding], [dict get $val BaseOffset]" + } + } + BluetoothProfileDescriptorList { + puts "$attrname: sequence" + foreach profile [attribute get $rec $attrname] { + # Sequence of profiles. Each profile is a sequence of + # profile uuid and version. + # puts profile:$profile + dict with profile { + if {$Uuid eq $Name} { + puts " $Uuid v$MajorVersion.$MinorVersion" + } else { + puts " $Uuid $Name v$MajorVersion.$MinorVersion" + } + } + } + } + default { + if {$attr >= 0x100 && $attr <= 0x1ff} { + # TBD - special handling for 0x100-0x1ff attributes by + # looking up languages table + puts "$attrname: [PrintableElement [attribute raw $rec $attr]]" + } else { + lassign [PrintableServiceSpecificAttribute \ + $service_class_uuids $rec $attr] attrname attrval + puts "$attrname: $attrval" + } + } + } + } +} + +proc iocp::bt::sdr::PrintableServiceSpecificAttribute {service_class_uuids rec attr} { + # Returns pair of human readable attribute name and value + set attrname $attr + set attrval [PrintableElement [attribute raw $rec $attr]] + + # Maybe we know about attributes for one of these services + foreach uuid $service_class_uuids { + switch -exact -- $uuid { + 00001105-0000-1000-8000-00805f9b34fb { + # ObjectPush + if {$attr == 0x200} { + set attrname GoepL2CapPsm + break + } elseif {$attr == 0x303} { + set attrname SupportedFormats + set attrval [lmap val [lindex [attribute raw $rec $attr] 1] { + # Val is a sequence of {type value} where type is int + set val [lindex $val 1] + if {$val == 255} { + set val any + } else { + set formats {unknown vcard-2.1 vcard-3.0 vcal-1.0 ical-2.0 vnote vmessage} + if {$val < [llength $formats]} { + set val [lindex $formats $val] + } + } + set val + }] + break + } + } + } + } + return [list $attrname $attrval] +} + +proc iocp::bt::sdr::PrintableElement {delem {parent_indent {}}} { + lassign $delem type val + switch -exact -- $type { + nil - + uint - + int { return $val } + uuid { + set name [names::to_name $val] + if {$name eq $val} { + return $val + } else { + return "$val $name" + } + } + text - + url { + # Assume UTF-8 binary form + # Strip terminating null. TBD - is null alwys present? + set printable [encoding convertfrom utf-8 $val] + } + boolean { return [expr {$val ? "true" : "false"}] } + selection - + sequence { + set printable [list $type] + set new_indent "${parent_indent} " + foreach elem $val { + lappend printable "${new_indent}[PrintableElement $elem $new_indent]" + } + set printable [join $printable \n] + } + unknown { + set printable [BinToHex $val] + } + } + return $printable +} diff --git a/src/tclkit86bi.vfs/lib/iocp1.1.0/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/iocp1.1.0/pkgIndex.tcl new file mode 100644 index 00000000..b9060ae1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/iocp1.1.0/pkgIndex.tcl @@ -0,0 +1,25 @@ +# Core iocp package +package ifneeded iocp 1.1.0 \ + [list apply [list {dir} { + if {$::tcl_platform(machine) eq "amd64"} { + set path [file join $dir amd64 "iocp110.dll"] + } else { + set path [file join $dir x86 "iocp110.dll"] + } + if {![file exists $path]} { + # To accomodate make test + set path [file join $dir "iocp110.dll"] + } + uplevel #0 [list load $path] + }] $dir] + +# iocp_inet doesn't need anything other than core iocp +package ifneeded iocp_inet 1.1.0 \ + "package require iocp" + +if {1} { + # iocp_bt needs supporting script files + package ifneeded iocp_bt 1.1.0 \ + "[list source [file join $dir bt.tcl]]" +} + diff --git a/src/tclkit86bi.vfs/lib/reg1.3/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/reg1.3/pkgIndex.tcl new file mode 100644 index 00000000..6603e3ef --- /dev/null +++ b/src/tclkit86bi.vfs/lib/reg1.3/pkgIndex.tcl @@ -0,0 +1,9 @@ +if {![package vsatisfies [package provide Tcl] 8.5]} return +if {[info sharedlibextension] != ".dll"} return +if {[::tcl::pkgconfig get debug]} { + package ifneeded registry 1.3.5 \ + [list load [file join $dir tclreg13g.dll] Registry] +} else { + package ifneeded registry 1.3.5 \ + [list load [file join $dir tclreg13.dll] Registry] +} diff --git a/src/tclkit86bi.vfs/lib/reg1.3/tclreg13.dll b/src/tclkit86bi.vfs/lib/reg1.3/tclreg13.dll new file mode 100644 index 0000000000000000000000000000000000000000..4e6f2ebb923f42da8a986a5e1e7c3d7b0d2169c7 GIT binary patch literal 64280 zcmeEv3w&HvwfCO9I_YcDN1z~;0RyB+)1*yHT3g99GwB&RNrpVy0)@$I(u7VP&Z7^k z(wYPrhhS7xRIaxdiqtDtt8%d*V)~#h@-S3DK&}=UVH7eA7`I)s;(MjnT)Y4{8A~#b|a*#oc}-lzpcogdhP>L*}b`s zpSRoQd;Glm_Kt|NC)~X*+|=o8Y3l0gjyjuz&Ty>D+0o^6*VH*XyIX@rQ>IKTkfi+{ z##(R8W5fS?e+wIA>^l(TIJ?j}DI;SxTMDFR{3bHCYX-tRD)e9%{paxvAvYzn84`5) zZH(nGc1^C0*NZVH2aB>4vMr~Cag{UwP*GSQ zmfHbu#1A@TZv4`&a@JU0)FbeC9ea>ThESb`glIV{E-%_7@OBZut@sgMEq-Yi$7_y6 z2;?Un4yI+MMYpoXp`xIm$929PnM8M08WN(MUWdTrZL$kMs>d1&-cV6RZ9PGG)(|2@ zuNl9ztDKb&6-7f_zIK8S<41U{lrS#n1^Nqyx?5yhA3+}BwHY`RgM7>9l?s@jg5&rR z9w$x!aiKky&nsEX6Mvaa0Sw{82(IHG{a-oDTRv|=2~RH|TXEta(Yr}U;Sr8kx{$}u zr~G2zQG0xjgYAg8pA=@eCx+r$jtsH&9tLS35|f1}hoTdiOi8-q+?hw~wpL)!?dc zSiOqK7WN9T4L_KcQAHz z!u?55PCc!~PaM}A-(R5h55Tk3FBH1}T>MKOK&RpYL5jkwuMJ$| zTI;%IU++nqqyJmT4{C|53yKi|!v&n7mgupA)8)izrsLdlrY%0;=(9tNG1&gLBn8G3 zC1abT?=s*ea{7lHeSZN_k_Nzu0QRRGeTO-p>_h{xgW86oQ>x<02dIDg;xDF#d$T|P zY4m)nxK@ZSalsCd@g^o0B-a;$UjL95e>l3rmzaAyhgY#=9l_%VwcbD2wZ(tkI73TJ zAfA6n4NK65SGD*^GE@dS2QkRv@*d18ps-})Vx(aRS3-n?IfSMqrYuDwc`2BTy!tM129bXjK*-6UoY}}Zm_s@kd6wskcAH8C z9t2=ew-zTkA6O(I0~Z$P%(|23$|9 zO;7yvom6VXOS&#n{RyNU{R;p(`kc^z?=ekFWdE)XdWBXY^GREDB5J3Ne4q5`i@OWT z;`IfkTHIGqm>l>B8e!8VFu?@i34$j8=lI(Qzd?)tP8*n#4@%dJbf3={=VI`u{A>0N z>KAx#25(QvBOdhqf&6=FsIl?4)jk2S)REEUg)eCL#h>scZZ6mbK4@Pp{-pOH=?OMT z|Jl|hYaM+@5b?%y9rxM#hN8tw0Vx8GHsG=y%~$%+dWURVPa^9KWO?H@$9;L;_)y>B z*emGPzrlp$0q6?d*27YR!@P8T!CKe-c92Fjt5y>GeUz<1NyVfjr*9zp8L9<0ri1Q+ zLJ}-BIEWccV#dJbDQGx8>4tm_JsZmPY4PV$UnGYKjrw3_v$Ymq!CI)|Nlcrx#LS;* z@iU;`c5+Ai22}?W$+p3**W1=cuOoj1S+)4jAk^l|sa&R(*wqddrUsqUDd#OMzBly@ z;7~PE5ONFQ4dib_kQyuo>L}V=^WOL&*8ymz*Jc~}JsQ{>&(j8$XE^Sw&47}o96gs5 z2&MHMj?RQ0W5GtkG&Y6(F@j5w+MgWmvt{Ez5Q zy!bGRd-`8?^lzt@>wh&m4@^>+WsS{b#LNWVGSOGCodkx_k*H{>sJ88`ESQ>xtepTk z`tBs!Xj7*rK0@Xk|9vXI8*-2kV2LKrzL~T1pUec$^p}7M7xT3D~{` z+1=D5$jSJrMsV+h;VaPe`cVW!7Qm{esb`jDqELKabO{`M8#r*{T*p*2mH(ZuA^TaV zma3^#>$=tzFynbcr;HvD**O^YA+w1YfB{Ew-@ z6Qrv60p4~chduG*h9=2kUH8+B|9&=&TMk!jD*v~)QF}W2-sIZP^bLdxdZ_ZUGs4AC zizIeC(GQauFgr|8I1H}lmpqcne-kvc7I(oWErHUQVL0xq&rWSUIWab=_YXF$MWv_2 zazvWj3*l85I}RZ+*0s`v@O^Ev!QqxrcH1BMIP=m=ElK_R#n{}WA_ z2FV}xr=nAU#H&H3F$i-YEt<_iA1}#pdq`WTyPv%1Kz=`FKS?*FA#i*IkQ)gyU&;3t z24h_+@C8B#5QLBA&2bXKq4SI>-$)1+lGfhoy_42uXl>2MHKE0yLFd${mp+*q+%*v+ zNOd0X?qJfp$CmOJl697Gk9Z*Yxgt_0`VzE3VpFU827CqOJ^+i8cb?#;doX%F7x9mL z-j?zgLz&z56JtX``+R81GS^njq+%6>Juv0Vn99kKa<>?D_+UwFxG9KHX9T0p&A^04 zCLs_SIr{kr)}oovAjzN4MPC0924F|uT(HDg!si*jfp*OC>*45x=Xp_ed9tx$_#nIV zL50cN-=b=`;s>G)q8_M%tM^^Z@@dio5SNly4q{IxVG_4lB>sh)>nM2(O`uMqQ|t3L zQ1D?`^83iV#F&&>6+aH?)5auj`rKFSO@8BKDg|Ud4rL0D?|O4TCV#0Y=1!!$&sLmH zckcL0Xe};qGW9l9fxEIJx02+%Yx|2wRzpNGIqoM%o*Zku?LD>zrZYv(4Y=uGto@s< z$A>xJSk|MF^^_-rZ%FGoR~HI~)4P9-vYLI4bGM?EA#)#}w0Yt$(kSNS?MrP7KLT4M zt1L|Z@=ei*`=j3%D*EK|zg0yqK;0vopk2vtl)u!_q!1-N+SxHu)v)`W^kh5`APejU(Ud-2z?+5)YC33^Dqy@BD4QLh&B z$Gj0K?egkygWAxG8#Qp)N2}&x|x8SMUF#*vM+YXb$xfIx=Pf zY5scDe2Q!eO^o%*0Z;r8+1*xvU_h?kLl~gpgOgXn$zaleCUx}x8?W2!HjHh2w341nQrHW43d16e<*nMl zy#;M5FoOWTMKAV zJ*AHM+xpiLNzl2&(VRq>JdNpclEhGj#fc1n#l@26+5t;m0oTRtpv=*~fyyOjUrQ~*ha0pM4Z@JZH_(cy zG@7p*RWZ!qAgPfCC2j`15g=!I3&5gNU=X7H9aYAcm;|fA(B(?3&U2-{Kx?V0_=}j9 z_-J(jo6-2}8#5{B2qw4eKd{ZqEjIPbWxoemSA0+GGAI}}i6vSl*1zSp!-BscM6)oW zAqa9RWbj7uD7PGE$GuIUQJdM~|VkdQd zRXa?(;HaSyZt??DK8HIVRWx7Ui_JfjB)xNw!09T8JN~oe&e!?OfNPIrfZk|Kh+z~~NSHH0)W3B5*De&k&kcH3a@i7anoC#l<;7~Dm5b42sw zhuZe+vF}Od?Rhb;ZO@S1@uQ*KJ*mS=6t424cl9Q1v?X>COr#w3kz}Bk?Xo(mMV=nn z0LC;)(#;w8)V!pTfBy(o-dEs#>sy&aia;`V|b3Tfy0 z32*$Fs`&n@_~VYgJf6Ait#afIOu_ON_VK*h+X)q5YLopqjEL_#U|)yK99^Rr8sa`j zZ0TTScmXg<9-%=v{yY|6s2%yWmAsbNuz+@-%^`E{E7(LFF&v;vU=9v)eB}j1=Gu1X zGUi}OpPWcJ`X}-7v#;jTg$f#JC83*l92*n|c#<47`ZBna0-% zA5$qlT=S^`wW+B;a-KXtm47JCtEqE6`WSkpFEPW>KOg#}_0Aemb(**OT&XW^0+<#I z2V=XXdZ+>Q-U$`@`iDLp@RYnN$45*7T^Ok@PfW)0O1T?ygD3+=mnUXk?CpKn?oKSn zVhnxwi@Uj*Wx95QE)mA+=NwGcFk~Xby?9H3?}l%4*7wMkkqc}z18o8EHTBJWB01p4 zG6*cmS0lHOwo{@)L>axmMRmi*Zq70aJTUPSHgEhXcl>}a z{;1=Y8svHtUb`4WwwBF}#t7@Dkcd5C$3IvBU;V*dOv6nA?9R>*{(^cyvD*E87Fp=6 zqy2=V|51=|C$M^)^Dfq;IgZc1MhYC5@-Y;k6=zG<7c|?U)DdDTSD7y=f3)ly*xA<- zb#~55(T0n9fCRzR(5d`UY#of&@A?S?ad@Yx5E|8VIc|N}wdZ$stc8huwC$(REqfpj z|3>C=@3|FG#+S;!KuI6Ar+ouch8EJEoTvX)Z~R%um-nJty?Zmzs(z@$#c#K{Fj8)B;zYl>S+IH^g@Nj(Be%@fGF@O zzC;yE_?7XY`?g~T3>WB;RkQo)@Jj#T2hK*^=kOdN%Nsz~Cvz``e(R~DrSeNYOUefi z7&pH~fC`8hE%ay$!ge z@#s3})zLSTH%b;(ZbqX#vj7}kMZePh1vOj$Fd(Pka13)R;_wVmXnjlViPg`@PAZa^ z`8FxF(L;mRi*g7|8x)ft{{u~lW7x36j(N!&sr->%8du&J`K&B1N+zESxx4k;l?i+3o&h4mNdBe7-Q2`y2&Pj6kP7C)JM_%*Qualp}k2B(R3B8%dq zxmZ)-J_M%7%CN|u;8I~+iB-y~q_^U$@j|o)AAYcq*h|Y6CjnCVYfvE=kW0~`c^J2d zRQ_K-LnGy@j=oQ!iMgfFG;x<$?#jVZh=RdV+8<93Ou279b-5FK{CS2{%X_LEQn6lp zF?sI@*1ayQJgE`H?Fs@f!$?c&x`=YdwwbdfN|r)N(`d%2H5z%9H0tPoobO@%E$W0W zp;1Gfw3us@y0Jkwqt(WBbt8B1AWsuWt|Xt>A&~0=nsk|UbrlZCC|&)MF1H~Ee8p!cPK*}nE5cZqAxKSTcYk6u%r4J$N9|}y@iwO{~|Q{G*)+d zQEdCEqP`jEitZW5scce|MbG4&AURK#{Tkmx#LUc_sIjMpy@}O!?iV4MrnS`OX?zLN z04$7Ij(#7p>OGlzKkhg}5eGC!HSP;8Yr_V;w)l}hf6LK-F)%i4|(8?;eBkpBwbuP=x4_Lp6Kt-909 zCustNEz5Go<-_WC_AlUEA3$xu8FShvFlyfm0;1jmPLp}c9GG&4HHYSk$oYhxL&Hr5 zdjL|SiC~l%R)9hcf`PmkEr%4Z49yq6!mBuhp^ffD<eB~^$;L+m0Bx~fGgYNjlj=l~w$F`6C{DC{)ar9q`Cs2ShA#2&-M4a$7$s2%ljFUg2G zsYa--P3zrj^YjhHe(!i_Ix0$){4DMK>AibYh5Xb^b+bx__-#J1UKq&E1ynm&iRlgr zor7GBdWE=B7fi(|p25M?1y5jqfWmLe@D>?f%R_blH+8{79N$QPSmI5U;k#P|o!4ae zYZ*Qv!-r(}T^W8;hPUvL4q8DUkK({hQwvt#OUdSXPvD+0EF*Rv_Q%hrUXL>iXa~5d zXQBV%wDVg0WJI!SCU6o{&Ls*bVW5bA2yx-nMhGxKeV4i;tye(1FnJX(!`IpSl27wO zbh0F#{aiDs><2)cx`<~F6X5L`L{G6d?$_a*Sn^V8BiQb(Lyr4~-Xxqtb>xK3k)aX| zXOU36H_gT@F_G;iz!PW=QFS(c48j;Nx-o(LG<10`O+Qp4@BY*r}Af0 z9?%No2UGdQlvofgD5NtA-0#suSt~gne@!bnfGJ1GaqYZeZSk|%6+y3h6Q`@PXA#qQ z{&}N#i~jMzW7jwjw><^D>|P)RKl-Rq{{|==CyIKH^$4f?&T4eA{0AT!>igeo5DYXt zE1W*=?-Q7O)}7SV1{#id<9lejuiPJ6;6aq9fuk7N*snq5X;{EAQcE;Eo67$LC!Bo? z2orqa6ygxi-mn(I?%XUkM4AVnfdDuka3-ZZ7`(G9MD#=|e<9Hrm{N;7W~qD)iB$d_ zn=yD$aei~Z0I=kOX+*&@3&fnf8XnkP_J2aWkxx>?%8Tr^_he@DO!&eXYH%tv&MPFZ z#^T3-4=Vf2o`HL*y=58EoP)Fu#Idf7=nOjBRjwmryrA}<{k0oO-i2SJVDYb`zoC%| z_MAZ{|MtOje;s=@y-ach(}Hw>>HbH_km_lo0$ThKxESq8X;n80b^G;eEerR-NB6(M z4+K5!!)>Qq#GQ<6^7DMwK5I}*(yCf9EGY^K@v zpv-(K6ZaL*O64auAxif33UaXsbkpYAOK(T*y~*<4BR`Eb_hzTALhtNN*&}nx-#D1% z=pO_ojvVAU?(;A}GH%Lr^naCT_wM)0P8dHy2Okpk*(XpAwwQS${9^BapC}oELm7fY z^5wI|n95I{5q|CHAuV&^zk!8ocR3M(z)n7DdT9z#jnb>~Qu!}zB#+_f?}8nr^63l< z%<<}r(VO=s?{PqK4~wVbnF;r@cjE4ky))7SG)&eGVX_uaIez3`_HG;C?~bei9117_ zKM;6n4r!>q08>wQ@vLME2myKzpjgi)>yaFUB{ZlFSaD7dGrM~VwnEgz?3b>DRKJQ& z(*}aOQFA(3OB)5(>^qpf4_VZ)l2c*K+HKlE)>ix;rX%fI?~&ul6=)pXw`xQc4rYHH z$aG*J>_Gds%mfqkuSE7Ase9XwyAxQ=VLL{{ zwgb*MX$j5lNo(C@ME(N0&B~YBfmx?fFJI9^j`r2iBKjz_<3ND1{^%l9 z^Pp!Z__O34(OD)3v#Zp9gW@?zv)eAA0_W>8>Z{@WA6VZ*A zF2n6_FuI-KxFtIj>jq6~lH`9)6f~pVT$6P=!~TkO=`c8{KQuPT>y{_T*8m$zzdO(>%iB9-8;7XeR zjI74kKUp9DIsrGghtzI1R0zTpP>)RUMnCjl4NLP2?9kg&C(a6Wb$S- z^hgO1(hS*&jNU`3kqjLy>|cV9!mRZvk$TnzX8Z+MVk&=iH)@=i-AZPO;d24*UL50~ zWkCdkiAnTm%YoD{(E+ByxbP%Rq5_8aM_ScforfZ^7eLEH#reV`aE+F_;3^aqJxa`b-&5+$z8OHSu*3b&}Ai~RwD zeTgy;X161t>tJ@9jHU9Ic0#gmi1tfl*8&bH&N!IuMvOdO8hgy|r+5KQngURhrW~f~D}}IBvKeDs(5xCwmtU<51m3J9){)Pi~w<6LsI> zL$Tiy<+SyIm^M1G*h@Z1djP#B>>JnPA)s5Gu-I)&s;-J%gX6AA53C23zCvrc9O6GI z*smq_E<8^aUCdYFSzB?2YG2_|IO~0d+TypP=ZgsrKLGn&vIF$dYjB5|b_i%tfFvbo z06mHM7OlU0iR^r0@7h*Ybrqhmh^vx#Di{|<;N%$2QUH=fxJDKM2 z>=m^X^9NBA7?q=|)xb`H9fy>};x^Yum@Fu5!g6iQ(4&bIBiILW@@Ld0Q%=&u0_-@HzDKF~^TI z^bMaK##v6rd9iMs?mg%mSHK<)SH*|Jx$aDt-M4se7y|8qR`GJHse z-<9DvWq6AWKP|&98D1;HY8if9hD9>`unecl@ZEOFUxvSy;Q<-mC&O>a@GCOBQHEVI zyjF(QGW@s8gWhWE+vTQdBL3~!WSmkh7vp|V%LpMzC2zx9j< zrT94$+%olH>#ALBoSp?==-T}u^esN;@C|5<@cMr~3$u~?(8p<8uQ2&K#qdNLGVy3r z@){(QyYSDj6cOXk=Z!2nq;hDOrfX=Wd`|-PVO#=Adw=HZ_WoC2!cphOj%d5H$+@8^)Y0k;cXvlwbxokQ zrlvly(sLzS?X3>fdR8#XaCS9y2C>(K*GsIze?RlG1q?T|S#5BgI~WQ^gDZoZJ)2gu zSl9Zl?u}i}U^v_zUgEqU)XL}wTJDN0Z7gWb9;P-7_qLV=1|ZX z?RH8$pe%8Mkpg%31iPplfZ{T;f?cuBV7Mt7bVg#$MB3TiCe;8`18-e0N?M2od8V^1 z+})X`F&5q2gUTD|5rr;Tf^ap|9mz>A%5Yvr@?3TqyKL@)`OO{CEpr!@BDl=i-4pHT?s8t%6kg{n zDk{2+(TiA^fHEbUsoqkfr>Qz=)TlV=iI|fbPhaSTM^dRj;2!jrM^mY3`1$Au*n{|$ z6)j}p;JS`TG`yLW6fHoqr>SLq)4CvQ>kfklYYulewYD@xqD)B02uSV6pnAqRM@TYp z{h(R+!3SlyPlg9&_?Qe`O#*LNrd4^NMkdqWRdGxa8plHS8D*V z=8mo=)S-1_ceqvj4>WhI3k17bJDR#!sH1B=>x_k>9fTVWM!I9+mS6yu5mh94s7XFm zGW5&vDj7D(aGeY{$?#J$yitaVsM76{B`w{Zoe))JoFb&{2pT&u_vRtcc!+fi53va1 zAy!d5#B!R48oWfnS5x8g1*%*Xnz!1+IH;k{g9Q+eR`^_Xb)Gujn7w$@W!A0Q+% zq@t#}(z`;y{GQs%n%XK?b%iJ3cGbHC)O}^ONSQ0Lrd71pdKqqz;Y~99x(vT7!~HT; zR64rQ-+IDuVqs@25{x*T=v7A09eQF1`JPBL)*Nwm23y*jx;i4AtiC0r%2HVVWx>C3 zP=s3-i%{WIb#$%UICtZsQhG@exd>-lQ%5Kk4lcoN8!lICD~u!Jyr9R~-V||mbvrvc z(HZ8#fl!BLPUotQa5UBwx*`?~Z{~%Atxj|m=LN0K=FL%(IO=TDsVKgBIe)l23R=N{(;2fPz7^qjW-xXR;=2&0@Vf+YHj}Yw_?05=M0g>7OA#+dcm;lL#2XRLIsR)l}XZ#Uv>31gY~?MFNh;Y|DvA?`$2fZtW!dLLyj`(qeZ{W8BasNujzK`E9)g9r_@Y@Oa2iM)_aF{8)kN7`X$4%-}-PSG}FBAa2mh)ph@)Htyx*KZ%n8O}PA zaa_PZYK2eBWz%dIvWdmHjrN`i{+yw#;fy1oO|ssRP8l#xyTeL@!&jUFUU3R|(<$I{ ztni#nmeZV3Y-@xJ6#tBjlRiF^rVr9{E%Zz}Tn=0nQkmtl4C#?{UYn-#iP_l`59efN z7H2eay`HKZm8D<0JVfh@X|!fd?4OmH*DUovG+{XVNak^BM=8_j_Exq*by=QPm(gj3 zr$QwQg%h&ag!x?h9-WWk_g-N-9cgm_eQ^DqHNfA!3Ytr|3meKnoPLE!7von(A;wS| zN4u?OBNKhhC;O2!x!xVZ&yduNHuhYuv{nn53c_gHPE`tkZSU7%ng2k z6;c|k53n78-THk4?`6QY{1Em6xVl~ktl(aiGKZxSzFdZDWO$tnub1J?GQ3@e_sH-; z84k-(QGZFMPs(ume~O#}8J5YgT86DMjLPsP8Gc=c_sVd;43Eh0gbcIp6ZAhU!%`V) zGHjON1{vNe!`o%JONI~0@Oc>?lcB2DJ2E}-M*=cSh8N0kz6_Vh&@IDi8LpCHqYT?+ z7?$A{8Qv(vK^cBshC5{VT^a6{;eHt^IiDDn{-B+OX8zgRxg-P5z9Q5ep^bgEkf*x4 zy0ERF27%RV35SM**k1<{?f!cR;#T(qRx_`WUPasMtC^o59&F3Y5_Kvq^P4GMgB^XD z-%V-0@5K>_3A=${b-}0sd5#ID72%F(M@v(vPVStYWFFev8x3Y5TV;2+vng7IZ8z++ zf#%O`D}vFASU4Q)iekI01sQDE3iGzIr_!MH?Wlb#fNXjO%KNZm?V%eVSbtKws=GB7 z3ToJa4H1tu1S8^d!w)Mbg4At}M1!66*cWs~Dmy|!im|&Xr@o_QeML9+3>kYngT~wr z+^M-fIJ!DjnZ97t1`C*7lj-Y*GAhHtAp2=1SE4@{#=ar;gj<4~a4^hrvTCCtNK_f? z;@ge&bYF!{AZSHXPZZmf72QxG-dsMFV7~6|^|2m>4E19Fo8?oE+@x&i+Sox`&O5Tu zL=9coGDYoMJ)2sB{PqNDh!$br&#DUrgFWo0S@pqiC$`a}L8W$fAgewULG^k2vR`DK zk_h`_mSl>uw8M$DxPtKNGFHO^0Zd)6bH52wmU^T*x|;)Ss4K=d7HH~>V7s2On9mmI zfQlhpCk|Ex@MiG!tTiJbOBQ7YVwmOtX3uJB?hZ%U*;&vne}A|utBq95s4DyUM6pm1C!HRkSXWDD4||AW;gJJn=HcqkhQTT!ZE8e>TrKSS}xfNZaBfXXgvQLelGVam*2Z!KA+E_$V`;^NBmZL zYO6gygKr`D{yl%4kqs^3sHoLa(5Bl91~)aDeGr;7kZ0bvR(b0Fg@5tb`3moY@Sj8j z!=jxVWq3^9k0>5>pW>gSw*UWCqa1t5sP(ho!9Txz@7{Gc8^T^VSk2mAyq)$K z=zAQLc5W|J5Tri1{wFnX35e5P5AOQ#|J%Kyzt86>>%VgV%3wdie}Qks_yF?1Ndxyo zSlRxxeauw*AC`7dR5UOBFA{EkqIoTw*I|lZ zRL3foti{xQ-NsAj7q6AKrx8uRMI8-nSjcZwuWiPC>ejV7U4@TR5py|>1@qSmR%}Ie zgVR;#oL@A*jM=u9;$~qM-H~K=8|74#l!*J<&bgh@SXXdaOLsUpABiT+nU{6ptU_0l zbM89zSA#6|YwPNs+tG>zo^x&+7YDM>6-)s^CQik*te@K>))H97O-@$};$vz?5SU-o z@;{`GPg3jIa&Yz}%rfbDw+#CPtY_9a`M+2ftuJsK1S<>VWE(jI$co{APc$5eGTX}O zD2r7D=uonmUNe!AF(J~9#f;NTCM%l?XGRDkOOPZ$ww>5#+pGD1kvm~jNgMo=)@ zPA_oE<~;QLjVJ_!{kQV0uk-(3NFxyJ+RzckVV#U&BB6?H)WOeDK?Uwv*NIkP87~nd z1>C5hM~S+Ew(&!J8Gj*RCrY(+M|wg{QCi5OU)wIsBw_!>l#kOoEF+g^sY2+o96Eh8 zw6p0t*m}l?Ebxvlf){Xj4wlNzq4hY@!!j2VFUW`UNinQUuhlmlGxcZ>vRF(jIJta6Lb=niIJY&>Vx_Tb!Oz{3NHRu-_)^ zjErp2D|i>ek*xL&O(FD|2^Ukvv)ZFg%>jb43G?m%dbWKh{!iM9e?P)+GW`SaCkUnp zdFD)4i3s)3$v@J0Jg`0*EjBQk=YFu)Hz1n^XB62N_R z_XL_k>#$qHn}7EHY&>Jw)g4foNWnePJ_T;phJ!r;oN{aH*c2!U(6KR=kq#>ru*`H= znSfA#ks*dHpKqv*%TRS#j zFk`v@Mfru(JG(bTpoZU2RhLrgdZdm}s(g9~{V@n~5$NJYD(xnOU;ujT=w`Vu5lG`@ znnP$l+{?>-nP9%@utW*?9X-43=YR-W8I1YU%xkB&^#q6*%l$nSX{WRxag<7gC@l-T zN`Ot%J3BYY5`Ul)eH-p&EC%$o$+ zNmQsP>ty`V?szD0%aogOL)v^2G}2W4x&P0-!bL-S40cL@66bm}p|XiIybneYDP z{*}N(Fb!&=rY`KhMR>0woM43IzDxQ0XEuki$J)+~g5hf{1UxjejT?oHryiTx1_~@U zgQtdPwxK;)ZYEDX1i4b0+hgck=ZzXlR)=g=aBaK6-gNv8f!M zCE(DtEK0qB44#`Oa&ZEkdUAUHOrAee$zuqb z&ogG(^3kJO1JS1S!LER*HO}A&=ST#6zH}_4SsclU4~%{j-P}&?NBxZV{VbN*k2nXC zsc~Qi%lx_mlFf1;ihmFBY`Y&sCU(#qS=9X;+Y1~{u0p`c*T~G-HUgi)(P@ec`)%!j zmyvEhH)=aOAD(>;sMR-AdjfS8n#bMX^Q6Q4uG)Gp4rb#4j)2?a_f)$*)fHD_6fjEF zc><@v$}nTq`F-AcqEyE+jT}|B(&t*i+0@m$d_Isan6G?%X- zjTM_{WY>CdZoQ@=;KfPx`Wn&`>gMsWNmi6fzX@Zqf#IsCXsBxNx#~TEnuhunHQwqK z0aq>Lm}21gYioQpD;hjF4^P=pnTJg^vORvUCEH7O3L7X44EX z(f6Urk;|qVV0TT!as{4YfE9L)pUpI&3K`IR1L}9V19e(WZGE7!p}L~pTT{)>Fz42K z>KkgS>)4qFxU#09HgI_Z8r$cs^47CiMi!c@ezmI>vetSkJ+Ktg%yLh)r_x&in`UPj zsJ;rnG^4W(AR5mNO}f36SF#ToU{aR1y29+8zI@7R;xXV9rxym$CDV96=W7 zff_&TpJ-QbdpO^~k|%<-pwvF!vf>40 zmj>|o2OL6meI5I#k-Y+~j;_a@PXJGn1nSTseC!efgMbays^-2LG(DQkTLn9rdn&BD z`Wjf5LMt+(`CSz&p+l)@Z*^U@jycbaS%0P9WKwWf0vU>4 zXkd~xKn7GKkdCovObngCrA9V4dw-qQP`R9y8DL3MInaP-ji;i4yNJaGlCb>JY=x1dMtPb?i1AuW%ak%+!FxROT5~k7m^WN*WXTGV`q)YXEKJo`BL~4c zyy06P^~pHbRA?)fvnn$XH7aJ+28`+gw5Q9L2_@^kU2e`BZb2oJaBrV;j!o;NS)p4O{qJQOqT2hjjE@ z(w6aaHJ5bNV!A~mj+{rzw4XFDCywc$vgO!6peEwLHPlta?2xCI*R6K>G8rri)Bqlq2o)s?m6P`82kv`&KCdg-(e#&GHO4Px0;V~$k=cvRGBPZt595fJC zdTU`#lsR40ZVewaIq4Z3gGXmNJgdN;O7L{PW4WMNhlv{|x<<~Kj;bmt=qx3RUhJ$i zfpp;6QYszrAqk+VH0O2>s$Xxgn4Old7y7WH%2l^Az{TW+&J_S2cRJ9!OAQL=ahZA6 z`3}q`iA_L0d5Y(VGMB>$_+o7}TAgskyCqD@-si?$E%L4J2vga2U;$>}YOcD~9!&KnrNNfhRO1klk4;X4)p>oG`Ec2%q=8pf`_Ov~a&;@O zq&fy%tJW+mnUB6?WYKiYhu&mBR(NQ5n3e`vxd=VVK)~3Ak&4Yo1FbB>LMaWS%3bNI zDk;V~$p9{QL(~%Vu~DG;SQw20Ex>|k6sQynpEOWCr*-yd(0nX;46LhYT3CYhjsc?G z(%ET)1CSqX1R0HAlw6o$xiw0u|P8pB(~C1@43afeAk(mHYBs~NB)MFwWZ)z$THW^c)G7FHLsz0l$!vei4Q}kC zs$2hz>G%GL0(P&}S%S=)Y_{{yUw373Y~{Lj#mju>pPyj^qdS3?!N^TmSXV5Wrw$Ly z69eSjQym@J=^I1j!i6vM5LbPDEM^9n;&kB&2(1{=BQ=NnFgDNiW;4O)Yy!qL`X zTLiD9LhU2bR+JTSaWq)Ow;0-4n-V}fo@O=DBWpk0tNCt#Lu~2IhYcoH*g&N4!M2 zFY&UNVjv{yjNOT!^F8Ps0#5OJ;JgN$BOrS^ne$PN!S|r^QQ&NS4;&Y8dfo$PHEMGh~5W)}yI;Ep97)yUQ5K+jq72`jhUN&FPLRgxp<>EKm z4hd7){9?qV&2L^u^NqQ%{bnrryM*<>M3n|3t}%*_alHw+Q{gaOV;n-xI=BAf-lISxDGJ&pjZ5|BnknM3LTIRc2lp_dHek-rG(*(lWr94D$`^n&$( z5O)LeX+TtssU-R_Ai7pLe>KL*5)6@q}s2M*cb6a}GT4+Cd#YC7aeK-e?| z(H~L6IzrG<4<&BJj+4RbHz>6oq8arXA~0KnKR8@0B~iQ8scbH$g>mwNBNep;S*39 z;5b3fiJ18+Mdpxhb(fhlkx~}^Rm61*ufu!We3*8(80eRQ&eo4e9aLTBney}H$mjK9MIF?F1($|E8GlqtKo+{e$OI`}3$iB2qFX^kLL~RH zadD?F*P19VoNVDs zp)|kLunpmn7CnIxMB+%zAA(e;(!8=dgO0MgG+xr`dj5e{w-hq-TAaq}44GAXrO7Po zehymsRCQOa^AD_7sav(zsV!>ZC90KAjdSViP>#@#dE6!gwAAZ;S)E-`)~$}7>fpQ- zr1T!uItsFASjnt&-=wVNeR0pSaKG8YeTRkngBI>v$HkqhX{zbMJ`4BTE!^+1aKC9> z+}|;JuAE(Lv2efD!u@s&_rY;-KVjh>wQ#@L!u@6o_uIzB{dEiXkcE4nh5Pju?%T)3 z{kVmDtA+a(3-{|R+;@(P`!NgmwHEGC3->h^?z_gtJ!#=yZ{Z%Ya9?iWzI$BUU$$`f zS-7`axR)B-rJuj}G=5%&K9UcK&3 zQSlm^^p!B)SA!Xxs5|yx$7l9avU({}3pv3HP^rnJnL{qE7sG4 zXQB;>@H`hZFXTCOPx%#aiccXAwKH9RmMu7z%nIiWD9>M*-tKb%X+&w!?nGw^AmuQ4 z15!mefDjeKHVhroemS0`PrH;3oq!2>(lTXK*+wJMLWi5Eo0%?U8-w5=`k>R4PYGok zFpH_MbKX9ZAIA4VB()6bU2p%5Y8unvsK~#)*r`aD0d8qC`M7CLt@24$} zpr~jIvVQZW+F}<37j1Fse(DDf37Tmu!2ePGw4#2MF zab%nJK$x+#YS3|CrR#94zRY>KUApGS!htCeJtuw>@yoQK6Y&}%ke8JCs&b?anN_X` zC60?qpArYW3a+~9sz%@lUUpG9?SB#BxLhs*of1d-pZ`Q#2!Gf@@1P5A3K|xz{9zuq zD5_T)6B&I!_H$gfpE2lgJy%>swK-+o1rD#*>2bVQIp33x*F{!*N;*BBSSdx z9qPgNNOUFL2}2h8IkkWOA#j{rhrrQCPeZG;gJ-_Rr&a1x=1cX;L#T!5m19^-kC;G5 zfkPBdH%s}Qt_|_M7QA2u&nD~2VEaJ8|FP41zr(;OmfE16i6@5v$%13yzJ*2U>F8if zgdUj}5W;z#M7uzX#4Ifph#cII3TWT9C%*Gp_|C zlzzRR7SwAo)*Mp$v8|9v)NAbd^4E|rG*9w0K@L=4)U}i9u3N(7QMn?y8#uHFOX|+F z5sqjhg{&;<1)UCgEAyqs+}m_IG!~fUQRC@J;7I=yj^f=G^vce#VNmQ4(9cnbL^AX<(ossWis5c~|thYYbn zJ=~h6b;6qu8s%6}@Vm*U(0na$j=-fLka})JbjSqh0%Vt@BPyN% zyyObVkcTkMm(tHdU7nsGeRnKPJ-omxkWlEyIVLZT1T!DzI;0Vnt{H$FH$lz^q{wR;@mR&N-^*%3Z9#MXSZ9 zYh}4FLA!;*lZ;{Ea>OTZBRt6_R0*F$O1o6+xb@b-ynZF;u_LFtF??}+gN2W9cf!0=|H z$DugOgPw(c#$It)b!c+&L_)v!_xI{w+adFN^{<*?w)?{UyK+{h@5vrl^K=x3jF&#&(AUP`ks>UhT4rL~^%}i~9>8VxqiovV}X%qf9u9c3Zg9H|ySi-Ji8^&$4ho$HM)) z7Vfjg#r-J@_jh2urka+{v~b^H;ZEP^d;fJGws3#l!hN!Z``0bp3&+L%F$?!&7Vb2= zFll4apoKeqlkol5oz@N}$_rn%aDNA6O*o5gv~VvQ7x(=Z?k`xlzi#2a#lpROT-=8& z+@G>=KW5<`ws6w{Z85i~DX1ce*%D_azqYo5sa`hlTs?7Vh_2xX-t6-#RYt+b!I0wQ#@3!u>)E_nXGW{dNoY zn=RaTSh&x!a335O_uDMo`z+jVw{V|m;eOk=xZi5wzQw}*RtxucFyTZ&@s4B+<|Jd?#gnJ|&QWv7Q{!Cvva$`^sn2=p^|G$EPBWk1swk@&{=$&O>iR5J zcg(OlX)QaIwY)FxTP)mLE!?+QxIb^BTM?okW( zdJFfEg*%<4F>@ap7xx|ucb|oOtA+dR7Vd|}#l79aeW`_ey@mS*3-{r1ac{M7FST&@ zS-3Y_xIa5C?u{1imsq&FE!;H=_ao!tzShFMz`}j0g?p)mdvaXd*I2lpW8q$E;r?L@ z_v7Q@UT@(()584{3wOFxjDl(X{lvJq`z+kEEZonra6f`=E;Dz=?{{-~M(^RD#?NaO z?(e9vNqPR#nHKK!a(FX$`?$EfE!%D_opn}3oP8r#>L%f;eL;W`+f`elWI1o&o0Wx#r+%$ciJ}wklIwtJgv{` zEqck|E@#v~hmR7g3A_(Uy;T5Tl)NdCQ66GVBw zE)QyIqtj?sp~xTXgf`I7z#*MjuNr{qE&~(-9P1rADse4vo>i^G>6m%p6lF``dZBf? z`R0vF}GoZyZllyQfSBu^1Vs6S z3_9N%3bgWr22wu(9McJ)r#FHQF%Wgn!UB}mAcp4821Knr1IGX^W%aErRkjZE)qrLtWkYSUA4+G)^#AvTy1ER*k45q$d zTyAQMH-V!@J?MvyBUIHhC%BU=LY_%*3~Kc!AZG$H#OWxULO>c#wy~7l2`)pP%K?dk zfKiKU0WsUpHbB&hL-4wd=$LF{7a;1Ml)!li5H;TrkS77zuiGKX@d6-zy{8c5I3Qb0 z@?_zbwOXeLI_Ckh(^S)9K-8IAfpZxk8t554?g~KEyjS3a0C`>KCB8TfjhWiw2H*^t z+VtCi&}C?BA0P%V{w-|0T#_!M7yJS^PCyLJzar@vIBx@TOqYkspM_iTY7QV|E&^n$ zNn^|Cc0Eh?KR!UVn`B-K$Ptsqx~P1y#WD^IEE&aupztnIv2X$gpYriUC6UG3x$#q5}gH^1zRE(3tB4j$w7* z0FGL@h+6CfB&2JshaW~a-m@fd9s&;4)Zq0DAmrI7U*NnZAqKB^0a2@CfioRNoF;22 z2IL-O8kAQ8attn8)Ixnpz0A~ttAJCk*AybKPC)1~xZePXx@#}E4*;TO-Q1%1x7TNx zDBlenpGor%0rIj*!e0PlZi|-yxz~jACLl*lHh(7GA*7xO74m!pkQYq6iUFa^=z|r2 zY&BWS6@aMKx}ehy$e;=5Q-Hi~qWn2Po-#qc3J5iw!Ry}v(M)uH42W7C3tqpXQYJh6 z3m`N%H0Vs6j*&>tpGB#&04X=M`#eB=$TZr086fp0$Z9~=>N4|j8TMQbUZRx)G$>2Y z1|U@i*9MeYs+S_jZGdbyasM75ttMXk0NG(G^&}wWCT$!6#5{+54Ul1OKg6B)xTet~ zehN5l6Xi)Wa85eCR13|==o0mc^x!jp(Kc3WvP>sR5p6@yiviK}Qk1(A5U@(axe}0@ zOmtcSDF+T|OK5BxAZtz9_$navCYiqtNU^Eie+-DZ1s?~bRWHTcs|BUN$LN(W0jC`h z!_)o&kTM_`Ui581j_djXGMfQM7t$#c9HU zQqVK(@D@Ohn|khDfNa%u*tQYhzYIe2I)vo;9&p|<@%jlMRCl9Zj{`!N(SpCTK;8gE zoh=j+X6B2zs6od8h-T8*1%Tw4EZhT#I*%mi)B>V*PGGCz;b7Kd(sK|vq4rc!?Zq|sE1cLCY1)4`e%$MR4M zljbMmy=!#7#gO?!fT+C!QTGx+3QWAbgk!4ddO&uW=-dFvZ91<&tc$PP+I0wNApxAp zCd%IcqhA~bWS3r3qWlUV>TXvC+koS|1utL6hbYBk4h2Q{Kq6jfUKEgK#9yv>s!TX(v1st(>ql^s^#0>OQxxA_ZV$Fv z3*qVD4t%GQKOr2W?@D5=Y+*YJ3CQS@7Od9IU3~3EqT@S{p-?lv^=w7s^CU}QK%2(E zrF{%5E_ragwp|>Q!~&@fpTmvDdaRgIa2znDLzegqL{kJG5Pr{s;t{x}o}K`IF}`?S z(TfKS0|7j>u76D;AR0^nTk)X@`I!p=b_YYjXt1KwqIA3%l3tq^@#7u!_>Kl%MvqVS ziI3r}^jyjOP2oroFKVnNV~{Uxqo((~9G#wU7~de)@fcpYD49nnzN#q{3kvq63lYOhE%8B* z@aCH4>!^N_STjBb(1~Z7BH+Ae;X+1VROWGfIZz=7ykydPssa5QpFx$4d;Rs-v-*}0 z$KlFhq79_qw3q<@cD2mJlB+wg4&VB~Cxlz+{o80J1H#|Pt=JenDg8qLWUw9h{N?rN zAZg!R7IrK?yv(->3(_*>2boU+$7d$#;|QHN)(ndHEHIvS53Gx{HFbpW(IB>>E>MB* z>)mYz$2~!XyT0y-v zsDJ7hb2@Wc35#z?a|V3)4d9EX-8i4!gKkz-jD3qub$EaUvO=PsAiWbk5XOfY@IrMI zhYP{WFv4tOQ-pi5qQ#|`;u~I;Cai71M^dWrIkGxWgPXn+`Bxa|gI$65Q(z3_ zj?N~0khi%BUob*0sk#UwO2_(OXtR9dV_KR&8DXUHZV0@_b|bz7q|pb@@#SIpydD%T za=2*(6_jd9Ur0ht7nPK;U}r2Kp0%Kucupm-t}BMG(#R$rO%G3{kpctjgPVl~D@{v& zl;09zDm%bG!H#dYZ=_G&kf?-!FW>3}l%S%Z7)(avhta0+{EDb562QllbmyJ^^y^&W zitYCRTmo(62fd`?<h3Nw;HKtK(A!lJ!#7sCq8ve|8|;d82H;JogW@@j zFh08y=;Ge?eGT2C#(OyeghC#Au7P)7^2XvTNIWw@en}dp9DJ2s>PcaidQyB_0Pc0c zLWmzYb^i$dUx^H0P%Q$KHSsP0-eI5I$9#UrTFKK zyW8aFfoMR+G>n@QF1olV!l&tW9T_p>l7z(=Gpz3A@Zc>z4k zN!#>FnWFk~euM7Sf#y&>+|XY72rF%bs|(Bo!491u8oL5>vnWk_44Vivbw<{~X=2u3 z6!|}WUCVCUFc9>=1u0-4ha7Y_1Y1Q6E0$m@M*H`feJ?3Wm$tAfak-qGnWdai_8@S> zI|`R!i_Fm*1522Ly}!Kr`I^8Uq3xHB5Y9ASz}K_?tTtj$pem1aUkLefgm@2&enj32 zIK*e&_{7H?-=P~GcqC@0mr)}vyy8bmJs}P-nx!XYr{qO4QH>w)D?jreEH~*h(+?uI zb^jXrnY@WZ1EmKe$9ug#zZ&P<`b6>sh?s(Aq*@Ek(ncT(1LR?Wf6%&cn{A6sAp!h? zT?F_s^snKq!kI_gUC%d>ga~naeI-v&YaGblK#Bux*3B+>_2Yf{9Q(yBJ1Y`uWqKAx zqTpx}0G45R)H8^1x%Z(7Wy@kcpPD#i^sS%i$VqjMw5nplPJD7Zc}-4PyXQ$NfKweG zsVp38`YYO_0QIdgmltlj9Cn!fh+`6^HYH^#UE8Z+LWRje?+vsa$u*|ON+i#e76_Zj73UNd_P}Ad(>!ZMqlUi2o%ENau;cEJ?jvyNyHjg zvcrA0#L)x?=Nx)E{EP9qD$t|jZ?xYrd{m2+rfd($!&}@WS5~a#HxNyQ{VI-3lmAl* zS4=W@Be4TO>^@H1(;{lB6MfB4DIWSSlKmA7Sv5X~2UHV1<{1S50|+~z#N+hHPnJz9 z8Aji)o=)_glA=nGmeOv>4M%ST>tfx$V$#{51KUMHD`W1XTp=o&SUrlLay8xWC~W+T zdu%cWbY-XZ=<=TLvf)M865r~G-u&BGwq1!dm0-wb5O^=GpTsFI-8MM8(4lNU#1Skh z8(~Gj64?oW^?p!>|Dj{k?TWp!+-h46*KQ&!@~SE{$CUjNsg+`(==9qOOtm3}TNss` zRQ890-Ez&bEI;~cla}t$)O(hn}-Bw8&VnYDzP4g<( z*0bP6&`oBndm#l literal 0 HcmV?d00001 diff --git a/src/tclkit86bi.vfs/lib/sqlite3.40.0/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/sqlite3.40.0/pkgIndex.tcl new file mode 100644 index 00000000..a94b1327 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/sqlite3.40.0/pkgIndex.tcl @@ -0,0 +1,12 @@ +# -*- tcl -*- +# Tcl package index file, version 1.1 +# +# Note sqlite*3* init specifically +# +if {[package vsatisfies [package provide Tcl] 9.0-]} { + package ifneeded sqlite3 3.40.0 \ + [list load [file join $dir tcl9sqlite3400.dll] Sqlite3] +} else { + package ifneeded sqlite3 3.40.0 \ + [list load [file join $dir sqlite3400.dll] Sqlite3] +} diff --git a/src/tclkit86bi.vfs/lib/sqlite3.40.0/sqlite3400.dll b/src/tclkit86bi.vfs/lib/sqlite3.40.0/sqlite3400.dll new file mode 100644 index 0000000000000000000000000000000000000000..dfe6a5c8f5d9fabc3b78dc6333b11d8380d2467c GIT binary patch literal 1181696 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≥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%0AXXIiLB3595@)4}phL@iB@sz)MFO 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%0DEnWpE8v?23-qBkC-38a;QwM-B4dGBP-vpAY z{Xp{lv@M%DaLU_W-qoO^0+COsSi}#8dZF6CMgM{y2g5oNA^YXT-abg8h>4eL8d)vz zQJ%1YJgow}T)Ab-fpUSy83)vc1RYF9lGRN)aRe$0Q4&5-JfR7F( zJ@L=4PwYZ)xSUN08^<2NPp`^;7KGhhUma66%?r)hbZ92nH$N95=H3!Houj}to%#@( zV4BJQDhVvx)1HV3+lggGe{-r<6Ye-!e8Mzl%^KqN-+HmWhEL4r)KjG@gy-#M>VR77 z``p3A`_U6Y|DP3|#dXqBq&h>`C4XiD?;*!QQpB2hS^2>pqTRrvaOGH5v1EjU?CVnd z5IC$>3ekCGbBmJEF%lwnP_7^~!4rY(cJ30VJGNz3+rN0F%{SN|`yQw2Ke(m0buLxV znAn!sWu!k!xZt&~V;6C@)CpjPiJ}nhRf4D0`aa(oXNOFSY8!~@=V=9zkN}A%4BlZ1 z+T+EF<{=8&J^$l^Gj0E!trBX!Q#2=mQz}Bq9~;8aH9cdySB^zSO}MEGt7P=s$w8yW z=i>o*S!#|4scURcVKnIsClb#Mw=+;l;-XfC#8L2|4(d;MOoBZ>3NEYlySxB25ApnZ zwu{CrzmNuLnze$A--4DA$lji_94Bx}q>K3~(KUKw?YuGbiW2k27+Xza3)Cn7%(wqr z_@PDvFeRiWo+WtcXGSh3tzVD&pt1s zap?oviuV|hq4GAnVWI5tB9*>nv#C(&6}2D3{^VKH7|~2@x@IdP+DvY|YVJMsK^VsA z({%_9=)bl2R}7dB!~WFSy$o-*j6-LUNHB#J`ehI}iB}sFANsLSNDlEQi!1jV;3>q3 zXMo7{vWFqth&Q097uVNlkrCAZ6WQA5NXT#XODzXmGyOq)#+m=97SA)60$$V1yp* zAjOTUp*2QJ4Yj&TlfQWsU_PdTlHU(4)Jjg zzdKF+B(Do0E3hiln#HH^J%P$&$R^Vo&>FEl{zcrQByUJQ)oQB+%~nIfezVnvdslWj zGG*!+2#4YY%O>;3UX9H$JqEbT4&pxhQe*oqufol?h~B1PZBcI49tAJ~CKFrIZ7Q#Y zsJxa?Xe%iM%7f>v+NjNQkgR!(@bL>%Leg~8Ov{MoNS+yhb2ue_}DEnbyvbb zs40Ps;M^vrZuvQhz=qOEsj1(G;Vs`l_Q?bh`C6+%pJX@JA}^VbmeH$w&962dLR9r2 z+nD{@!#GS-Bcs$7uL)p1)xct@NlUBC6ILI~#LuQ0*+0KAYu3wNygj=^!-=hgO$5!F zgfZ>*7OY%#YCpj?V|^t`3a>s$;*n3T!tL)I5F86VtS)X>+~j$D=nR(7xU?A2*24s6 zcVpsTVSHPg0-heZhyYO(Z~V;EJj~JxpA`o9z90#EP{znucA!HKYO~JYZ~E^5T`>JJ zJ~i8uK&}!va*(WKXB8rm%?*S{lY)J|*qvtB4gao@bl z#yHTlQ?glZHnXMkC78Tl^AzNKdA7{CSkaOQen5&}Y}wfDR@;SuK+9$p|02QzbFx#y zEWt*aRiSlvGF7MF1B%&|XSLyv*6ZMmR>@g2tNFAFEGEXm5yHD`kv4jl9SX9xZ^J4g zeJRsymL5%@E?ai0+xu7lJFoZF;!#XSIC)2Q1pa5+DHlo=ci=r5{2*=dy1gI2<2Cdx zRz$Bw2qHC}3KNz%kECLb;i!yXQ*|5UNfkF1Tv`2!!;xL;r#IrB zx*~sbIgsnnAWtmMyxd3MhH;@Mp04$D%S`{(uM?2A${vyZt~2s0cE9YOyZ>!y!C+zl z>gp8M4ybu#>=3DGNChf$maM_lggRr*I`z$nOJBKSxx_5u7j@Jya33DJE23Pm8mX0qBq+%EF6`74ckIatu zG)AtD_f$Imf#ZHpDXaBq{*HUXTq>tqyytqWHO@u%_!5kNjQg6PE%dB-JKa7#7CjHq zn{6v{UtT*=(g(Nlo)XrJ;}!LI&ctwXJiDiyLq`FR%L#Zqewc}L{H%(Jm|!Z84aVnJ z6hw*2Qsfw^hsm$AwCOUtSg{ijAr$73@lc$6Xf%yho0J)u?d>cJZ#a3TtYg9?$9q?v zXVJF$OaRhgf-{MmS~YRUY7 zBP1XUT1!{?om4ARs!KOhHG2-nHGoK_Hs;HC9d_F%}@S{b8!0HRg9TQ!>fZfI1m{b$VE{e-hsa^$TdTvsHz z>@^dCkql>=+w~1b-2_-$ z{83qaWmual)LB{WnIoeg6KQcubxWZ3oa*R1nLFD7u|18Z>im%gV_S5dSLfA)GEYai zxdZPe%-f5Ccr~rWIhM9Ditt8Gq)GB85gvc}cH-V$RJH?ig0dcy#;(f=vXk|<=yF7Z z#w$bcaODfrTp1de_i$X$+Wbc?uT$a{an~ZG;lgo`&MP zikZsXo1GsjNl=L+QEO9{HPe7wX~|>Mrx4@;Qz_^Li(4jgkNxlFZ1q;Fuw%A9(^QXf z3)*S-vOCgad7HO>SUhHZq0uT>0snh zq*IGe8dhBATOiZ@%885WhcXv32{{$gRXb%^m0qw)a=~*SGc3 zs?|D&8H10v%jp=g1dJ(_StAlYGzR4oiG!j2=}f)mDzSXwHaxn)a+Z&4u10*De|j``$Nr}qhmoMV=HdUvu5rqZ=93i`jS&C zWM}PV0j1}lSIe%yP^!s`4R(_sJoONR*Q7q~7F5f*^TiuT9*5vZLQ5IXZ4VFu7E|Gr z-(#0P;li^kGBen`QX%e14vfxrKS+rt?`L#p@~;6TzElIb2zRpk1ZL5t!NYH}RH)r6ACo~ZUR zW`Nbd(~kN8X^wCBMn9@MMt5>lx8$jG%p0t|sIoe`P@F@Z!jH?K$OsvzO^3L8Yxn*T z=G&aU{e?ylErw-&l0wi}i~M4klg}@-xkvnFLtk%D42uY7a<9=^eIf%&##e&V`;>8pXq*_oG5cs4UBXFZH&?nwZwL@=8)t0tP#Be0KLW$dU zd*L!!{VQ4hQ&|1gk}8I4{~2jOE#dE;02%lam=e`Wx-r?%BxHtnU9i_Kgh^v}iv1ZC zP7Z{PQN{Z%r&o!h%&%R1uIT@HLSFw2a#V{!tO}xb%ydC-4{`?QoWT1PO^JJ11%=Vvmi=atV==rI=aC9AQeTd zn^%lR=uYx$5+BmlMs+nvoXMBy+n5+j#U{j%QPoO9hv{woJOP z{72wKxQIUdn$utQ1x!|a%%F)$hosnoGZIcke4L>Nz+vQMVzf(JA8Yqeem2!qcQy#2f7r~5SVLxRf+>~HP) zM2|hN!0W9$O}^-5ukN1m&aeM#l{c7J1Dz4v{XuZ~XJ-VT>A3%*_vsSBGWHA%j#wA; ztcZ;}p1jTUhtM`w>jo-%7KvFw@9<}NY{0QP>(W4!tEco3Vi1+~WAhOhiLsFrx+pOj z`a;DxN;riXFj}~&vejy;AZUZ$PGjn4_70y%HSC6|ir%LHxt;YR3wBv2LL4xp&iYXW z!Q244>Z^$6;VHQWvMMlQE0e>AP0V7VekfOpM8Xe~R?bgArV5EQ8ZLjA_nhI3a|N`{ zl^bmYEu?Z%G((~oUQkj!V|RkN4t+{Akznc? zNBTV53>B*@N7~@9YFyK_%cdzlCD&rZcwVLJ2e`J|uKHY2Oy_jECRB-a%l90!{DY%Y z#fMTJ(0VnjF4Y>(zldqOLVf$_~ z6BZe5ChIF^N-+eXP}4K?9hSJmH&R*NN>@xY*OJ6+V;1@w1uXQFUc%l&@A?BWOE0+l z6X6BS^=pLv6jzuU{%dT#6w$J-C^F-wlj<-TS9C32%-oDIh#N>+@i??u(^quq^oUWS zpw4r{b*?$UX8SrTmzxf2iZ1)^gB|OxM^u-)(Q}2z?^pOgDcoH@yc7jhWN_@(!_Tx@ zg%TXDDckZ#tB~l;KeizHxL8Fe9fym+Qo}#QIJC=WFn|LR*vKQ-=>u;;=Y(SmBjXWZ z;R`&$^##Tj4(?H-=$wEX@N~9gJFWL`@mBJ=Xmi!^HuEm$#aX5H(}Pi{{?V*Qm;O}v zN;h_;i3fa}i|<_NlVSo}t!5RXcK6(T7T7qLIK{xiu4UldyMXDmFE~g?7^m50I%Dr$ zsrlc$?7MW+zE(HM^GkUEL=5qI66?c_m$KPDi}#sdIyiEXKA88QzLsr~)pnE6jq_C> zzZH~sG(EYM(yCPs(q{E!J*HhpX>1z2_QynaG-)CF@bOoS9}?V&PaML|fOyDf%G|(n zGiDBugS2u=w)@vWHZ5p%XUBdbhhi+9$)ys>G3$#_=9}=lRo`* z6=a@g3EPYVfFPTzB8My~jSPa5u-dKy1n4+RV`B$ech2QT$w#o)mQ`mn9I$77?^XvN zxqwR>ZL9sta>%dx;@ZxeyxsL4uhn`s--5B6z;nyD76(0qf8_nmTT}CK^CAh{`#k$c z_e4*z)hd&Z*cm0J@J$1fHy1+*1w8-CJWkVJyrF$qV#b^X6owU&mNWfV=Dcq{(6GaM zO({jvr3^xSeBl<78z=+IS zI2$t}y}x;Df+S)81$6lCNS%jO*b23aLM8rtwcG`Pbag4|) zpT&Qr?OD7}>@=@AowpSeynuWrTA12&D$)I-E8vq|iT#Xfs4q^VMeLP5MRnfpe`#(m zp8Y6HRLTnGe=CNe3a4o_5Sw#ELG)V3_)3R!^tk;Z^jDKgg~g9Vz+Uwe7B2DZfk^d* z>GME1&U(udI`s!2bVlyQIR2#74*f}8lCPL}_oj{;22qEJ?~Q0<_){{%O}s?X)x3Dd zb)LxCbtO?E=DX=2@Bsq?F30azVoR#EODCx}Rb(I+(J*THO{Fc?`3DU<7qN~at*FB# zG-l?*-W!6L<1r%i<6XP6u}(hu1j-JRER#C>=1b~3{TG9VLf*A|Q)aDGLo2I@P)ApWnrWXOfkMj+Tzds6{*^OUNrp$JNv&{wUrv3?-pC=do}~Po+Ao z2bg52*q!#68@VU#_L54I=BaN#GG9^fto9bp8Y31 z$M3zq%q$Hnu)6IdvOg$2M=M*DS#3D5Ci{nKr}>SdYbxum?6|z)zV+xR&yjLwGzK~K z)xqYM$zmEx+&C>nT#B$~D;#IYvr^$<>gQ0+%=v*-BMi#W&{=MlTb+dA)YQ`Ivr|L8 zx%Dt9HT3v!0(nhGHBsHRa$C{pfq)8b3fHcWZevl`K|n3WCI?z`MHSh~3dQKhS5%MX z6$v-~z#9O!KgiNIl9QVK)S#BH@?ZLm^FeV zg4PHOFap*H*k=A>ZN*>g%P^c`qe$rU2RR-QG^HhARjs!lcJ4^5UDadX=iF3qv%`L5 z{66E!u=r?}zIzIHT5*}JjT3YIoc>s6ZAt~c`GsO>4Q;CuAljd!dTknfN@W4p(f|Z^ z1*{WaS~P#a=#A!>hhF%0b>q;2MKcESrmW;ht`YV_6HOq8rBAKBi-2G|cAXb&<E&-Xg` zQpLZ%>`J%F&%VA`dc!SPj5_?z>;umyb7+<=rp$-h_s(W1C;|>a>)!O6i6s*zWRtzd zxvS7!hrP_XV~a7(k2yD0W||*zZmPMl?H}q!e(5hTmC1wK*3Q2n-VnKlt}y7zurv7k-yP@mp}T|U7A-% zu)#)i>vuh?sXC87y!2m?Xsxu8`5E8qMP7%f`bu7rx`kLPtSXQOSi29Nqc^70oLD({ z8hSsCcdW}#{BPkU8Oy~2B6`IoxEs45J0~Axg6n}m7F3?>e2_g&5~r^O84!D45Ic@! z3z@%X;T1{#ui-W3Bj7caCNlqhKzP;i%7NEy|KH)&$B+1*(KJAXj#vQ|nw>9u3z{Kk zL7JIx^~>0 zjW$sE1AHbrr4WLQH)&Lci3P~Rr!JGVv`j575{t>3px*G?bX!{W9AUVd9X)BpT-sdu$ z8t$zlea}*5$0{D?@9se1d>jxkALsTLnZ?Tp1E;TK(1$rLwATvHL_tH}MBXMe-0sC< z-q%4ud*j;|_;;_T%JM@4$1V>wZ-B1FLZrqJGnr%C12r2W!vd*LHP%J`#JUNK!o@WX zLF$S36h~0(4sKl=nH%4>088niLt58HUv2;=((UI2~C{}1t2P|5` zb`{>KniQD#_WY9BLVP4{>mO`-dtO8or3iC0c>WE6i37a*6p zwHg`pOdt+_#`q&xMJ~>z;FtxMbys!dVg?%`Wr0c%V|+L9N{tyS2l^IVJdhhJ&dB+S<~9hpEXwG z463lN!XPvKJqnuffLB3jwY;DrDy#RIQ!%$c&Datj1Pt$f9cBbF{YFkvUuA;fu(Z*S z6M8F@*l6APx)x4q_!w$yAOTNSavp5HXJ)A|-(VM_ZL->R;Q6JsQL{3HiK;=BE=EF$ z8Ep2KE5feA#qrRatr%M_RAi%2yTfrO^-B*HP4!IAzPn<{nZIy@Ri+ z_$srey^+R+nTfvFu6Kl^QeWYsn(wKhh!YwQD@yyxfA8&0hgce>Slby~QB5^v@_X;b zCH68I1@^}u0s6xzn76*0@2OLNbFgXsfT^+1rE<5YG~Cp`1dgwwjhy*wz9-oKE&c_B z49kv>uYLXB|3L4_#pd91r}M}f)%j`tOU~qJS~~_~;6w6y7}WC%^c+ixwvOaINAev} z2YDPylo?@fi=W75Y3Zs=FZ;&3pZuss;mG6-+^B>8IzSyt9wvEsfNjj`N2_SHPBV`i z*eAgX`pdsizKs&chG7kyfiY@YMami?LknQsB=(cR(HxDO};lheUJ*oi%` zMn(LaR19mhsU>91mjc=x;AzL~tkfPwRbx;0KcnfoZI!;$_k46VhJR^(CnEZ;+N_Ux zQ-#cBcuI|M-(l}WkLQo?^F+?^rvjBhb@Q;)umHf5 zDSzQXme>pM4i~#-7>8`MCOnGX|47Voj6u5czrJ_-+jr#o%OV$)l!p1zw)^F!?gSxR zu&Kxxr)Yw1c^xN6a~#v@MepRM>GsJ?(*UMvQZO~YRAKj_5l*<00$DgSa6laX2LhJq zfq(QENDIh`v;%Mh<>XKdsx|=_PwjvOt7+n7(?mL33E!TDz-Ib{(!P(fHQ8tJv4Hj_ zx@bQA$A{QJ=OT|l3wpCe&-3j!-q~*|kFHMWvh|mOKmN%w(*O?#l4o9&^wn?@Oah}~hyQQh>o5oV`K;Don9`Gx zxR$TbF}*m>gT7tawuIXQU{h1m15Qnz$ZXYTwY|wbDM^WkW?p<&7_Fs|+30LW*N(54 zKN6F3ui8ngjX=^r%UN0Qh%>VYjqTrSAIG?SNXdAGAS5xA09Cz8Y2Al{}y$ zvuSwYcCHs>+x{B}DT7SeA4!*)kLa(T{+6YMHJ$xw&NEDv);sa5=g$+!A`|(Gx$J`) zV)H$Mr(~_cqI(|FrI?a)TzVl|cYs;wJ5LY%@i3={kyZAE?CTszeR2bdp2Q3Ub2H!* z+7l_p0DA48y`MJ&&?j_G3ymIS$BcBNH?t%QpQPzKHpAbbh|Kw$H)abqP%tePFCW_3 z#;8+A`@7}W(aQt$LOKMWpdaJ{V23Jyvimbhk84*r;boxVK={0ehz}@4{_@^- z$!SH%-K$TqD8k@!ZDf+6s9v72*YW5!&IrOM2PA&z_s#C$ko_ zr1$VIEk%{HcV}D}>&}>qOYUUsQ8DeUuhe4hTVl1eA)+ts188k)jlwo)g)luNU&y;^ zKYc529Qc1(KTgPaGV?+Hj>j>IShd3<7smDsjF1h^S221ckS1t1%JK0gtSlFLo@?Bl zIhgN1(vnaqyl7U&(ay#v+>nv>p@TjaQ&8YH#1#Tr(Sp*{2q;?7Qrrykkzn$UHes&tr~L=R*gPg8V4!Sb09I zAi8<+q3(HWErl~91Vns!A?#^3$pcCrso_@_>PS$%TMKR^c@&?q1vnWbO((s&H1(Ko228bscp-n2!7Y{9hl zieNJbF2~*qkKF<8)Wjj@n?H&{A(Ty(O!~GnCU-nA>_dmp?V+WCMMJT$U+y7Nf0W>B zN8OHZrqg9bMMof`zG}^+sW#VL7v66FBvC+*Xdl+Ef1UPerhnb^?*`L9tfA}aDy6)Aq+0?Vwt26xD89V)r1ReBQ~l4PqbaaI+~y2ETi(zQMA6@1 zpF9h?$&s378SNZ3!kK43+4p6heUlNYK@BvlNch>eo^D^cCpx%K9_?gZ?pqJqpN!6k zZknoaM50p#+CpGFE41DYZ#C-Zp=dM`^_AV@sZIG%6cfaZPgCgFq8Y=m{`rlacni{% z%#`kHwu3{%7-4RumC+mJf*@LvRlpEAtrSFVj!WjZ{SRoe54ExeDPx3jy;G`D6Q_zL zu1bwu?KL%|?I%c3<9^%vS0-aLtb`51wW~%!bfzYHL(Q)T65k?W6d3s$ur5`mit(Pq zsApn@6Ao{-aCOr%9S6Mbo#N%Vy+|~_$VnNj@)qA%U4gfESu?~lOf0n)Z=)0F&QATy zXjU7wlS}C%zA@qNjN~w!Iw*$!4qbBM74=S;#a3#995;ynvh6P7$CF~K29!KJG10&~ zGDI-`%$Co%(XY&u>SXo-A_IW%`3~FOY=>oI5L92+1xKvcZwI=aSNMl&ZpLzZ{V}4o zNA=vm?3VoTWE6ct>)H;SQOb6Ww+<<`{kV{md5Xhq74eq=3A^d}Z9+71Wb2&*eTZyA z&y!bxy2H&F;ct`wp1pLWAa2~&DCZ-hJbar8M@EluoC7|5yLbTuHB%wT{j_>0H~$Y| zZvr1xb@%_zkN^SE8*RX7QKOA*P_#))ZAPNbg-Mv`M1!EB<*`_3ijUNy&Hz?~i8G@a z#{t@EtF3K)x+r~~F531FXjKxnfVc!~6UD|rw=%e> zq6%lFpz}9POdAlpbyXA>jeTZjM|C*$pT&an=ggN`YA-NE@3dK(Jk@~c92SyZ9sNgo z1&^|bDMf2}#!J$=BaTI*c2bt5Heg|0{nZkBbyCu-ec8qmTB%{GuRLi1PpIW|{d(g; z>sDGOj&mJfJWmDaW%>l@5YB~AtVHr{tKewjt|@paGSlZq2(a)Mm?e~S7h zE=(%S0>*J-uWBb~hjXI#(kS#mIRdZuPwf+WE8C0VZYn72AIS{Xqo15JvEu8i;7KYN zj1LWcRRuxUXFhu~;^DOpS;wlY-fQH8*#c9Ns--JvxQ-r&8duiGy8B&0ng-&C5^@wmZ^=j1WeSo??E8% ziRbHZBmX>8X5Ic0^M>uTT~};n4r#eK*G@eL3qnmOH*(=<-TjH85zGuI()!)JFnR=h z6~o=30psDG4?J1G$!vO>+=c}tC_s@A@BakDb@UH?;|DW10dcSAT~oo5WcO*Zg)#6p z^48O7dl_Da&^L(^c#Zc;6OHuV{F%C9FZ?yzsj8m* z&Q@e|EW6!(V~44!9*3S+{YId2+{H97FkXb=Cpb$dyv&? zY1iSpj1*;r^WU^8n{lHs#UQLN7npC^&Nv3>v%p8Kd)H{wLI_OqN$MA*I;;>PsPY6^ z*_Y%2ZWzDnIVxNLKADS&w-T_*N(zA*ECHJ@sN5g#Lb~?HR5^A0^)KHQ@W52l=#bmi9ZJ zGhMDHaYzc5WEvflvs8X$j+8vZ3(l6?{5eKz&(<@m6yw#z`y81oLb(mw(WQoTiq z(Kr{EN{HY0rj<8}-{e2ER*fIxTzZo4hOekn(b+pvpJ2rPO$s{qz9Md@oh@Odr|`gJ z8GhMnlf6Fm^AKv2DTim)!Qz{g;&Rc}P6;c$lK-PuAZ}2IB9b5nd!>M$ZyN5b**;fhdJOt4R)P zpI-P1@jkQy#LaVFKO4aDCO(7LYH#<`D~v`tG1^TV1QtdVvyuK<={Wb8(Rfo6Wop_N zyqVq16x1;@?THYft1< zZ^d1t+8&ngAK#Js7Q)o;*%Dm0QL14=Sp>U+=qMFCDMG5=AM%oA@ z6K{#=VAr+J0Zm7ew~P%~nd?|aX!KDE5nl~fy!R$OJ-und%aEh1q9G zEly_3qN_s}&9jyrODV8Iqw$d{n!E@xW`z_xkf;enpiLx!vy}wyvp%hyJ(k6^%Uort zV2q_+USaYXpJ7xJ&NOhQ2{s41sM+q!Ih!EAljCZ#W=nToKw=aCMsVvo_dJJ4ei>CA zvER|F1PP(sn02cf ze#x6`XDb5#-V36$KZJ2cU-l>V6!g;Q^EX3PfBJEl5#eme%(yM_%MFFvm_Q^pQqls+ zjk9sTw0=kQA%ug|hXtMQzHd%h;t3=OmxKwA)4c5?quSfBs2^tJzRy@^(4wKbX6Yg} zyOZUUIersuHRXoMi7zb=Da53)>@Q5Z8ycP0f<8Y=RMQzHOoA66lg${*Vy0Z+Cy_Wu zLoY2D1`mzpt~tfbLMgG~e)kAjr^b))=;PrPdWwS$R{9Ck`4vc84Y= zc+iOxc=LCcrXo$SnH%+st?P?SX4W;VR3}dmv`q#8KW%s$_p@0t-`@c;n z?3$NrqzrZr5r+nV1}@|0g9>LTJnLMhi{^2mZ_G!2Iz(491eRg*oQqmrxN|t7>uX+S zPr4}$yYRwn825PIDhz&SG_|GoUGOCC@?BAa#}>BN>(T3;9|l2JWZVkK6W{CR@MTbE z@8MfRFC4MIXJ|h^K-=b+S)aYz3onr$y&-)BaV&i62^k*U=99OGC6sEa&k~`Fp_3Gr7&}d8#xoK#$zl`8RE@q|3N=5nS{nCMosZz!t>Yi1)c|`1 zncREh+D-R;Ocaj42xD&QLpZi)1KZ zrBC9qZ5Yb#&lcuGqMLC~P0mig{bQ2*in_)O#7fIh63lr~Hr9C{8Cn}9%+P{AV}?V- zWfA|0&3)e+`nJ@29N*vlJIPPv^Tgt4Atf`dj^yV;!qo>A1v-YwOwG%E_|MMO{Ur3^ zLU3f+>vr~I^|~6*Sm)z0Bawr~VZVv56M8lAqFKvmj@mdK**XN;iRst`+;hc0u|xY7 zo?vI+S2gwHHbkJwg08dLt7M{A$?J)~xJZtAL-(7WE%{9>IH$6D9QjJ;nfan>Hjn!% zMf&lrU)WlRowgF?%v3?#{DyX{c(GTcg($vst3vw2JN5Ly>pAD zH;Cr%Hz6ay4GIGd#2Et2UbC5F5bV;ok#!MfRyq9^1FqZ|%1jr{dhGmWw9wWu&IiYQ zEU%-sbmbp;oIF&#U2-K2yLj=ebi2Olem|<7-va zgY?fm!$!qm^w(OhC}1(fTGd!2SJS7gRd<0}6ty`Kyr1RFp(BLo?u+N(mUK2@i zQOB;5AodLp(ukz*v&01v`AlX+xFGa6mv>?qlRxYFb|udM>v7o6npSa_~fFFI)BN zZ6>kOi{V^`ZO!$7uwu6DcD{{b*_?3(KM>*AP_{dn4Cj(f=mmWVkhHGPKMcY17%qUW z628-opKL~vzQv$-=QdIj{=2U9Y@{oqn%u;Hf=6-*B}2oBPGH^9Ae^}hLF4FmpJd_- zrj+9UK#ER1mW0BEa|eMF^mRX_X=U1hUi(pC4$4W{Ap%gGjb+`N2bQ@@WjreZNeN6D zk~sgO55MHDEJ37q6pa2^R{9u~&QI;KttX-Cb|w#vuww?@b!^d&~PS7TUgKXDsxRmH8HZuvXRJF6ouJ{c0Yh zD4xE|T$CgpF+IsNa651uQ`8H?hBJobK!{~-wO0A>Xob!l& z?h+2XkH7A*gF|vR5PS355~yOn$zL3FzMM83GeUkV{Q(OV$uA%w1WS`|IAo^|2W?~B z2Ea{-W&ghLGw$_#=kvGuTY_z4%t`rCEco~O&}-K1O}vee(gAtz&_H%aV}3%houAC< zG&8Zydzd_wu+sNvV28eDr5h=qJk;Wmv&lo(Tj_6@CpTK@tLaSgP<+h@%36^w*UMp4 z;62D`K|$N#5I|vSnfn+BlXY~SEcLAL`Xvq}q=chqDLD%lFTYJTtTX$S! zMt_hjuou{=^}{;cVRq`dWOjXOOMBZfk+us+&|y~4pTEZZWkIhq*zu{mhBg3R4m;mj z$3}J_n8=R-#W-Z+N4=Yd!^P}TNfx6(-(IV7_Xlg(a#=^SS``;V5?&^G zLxP9%)h!MjMSsBmp9ntz3@i%pM7lsW=|#bObC-6*?e9`=&G!EDEBYa%Z~p>_-Wq6= zK`L%Vp?^$Iz-iEu2 z2ys`RpEm6Dz{i9u%XTyccbym5K{}kP^g?lQw{|$AQk!?R4da0(zQZw-E*Zz>WE)!D z&Pdz2?pFbh70y=m?YqeD7;*#>QsLj-t%3^>~erlASHdHY~#7&0r8OHM#&;|Y*2N69wy zixe?%tTz2^W=<_^JfrMk=drb78=xN4rqDeWTbGCZJ)jL>J~W>=%l@e>mVWCId5MsH(9V`?YG#pA>t3Jhu-Cx2x6gtka(B-`N&3B z)VgE80llZxaQgu^@^0>NuEU*h1bO39yMj0b`4){C8?ZS-+@iGT6E7cS-A>$h0!6VH zX@a~1gd;Q&-iNue74gj`*@(AZhS)P$Q@RsF_J!v#GuW7%Cb1G?J{TPh$xwq=&3w4D( z$Snw7*AdBv8{95SoJSV(phHTeOTB(cdrn6T!6KDSvxX$S(qKx}^gW_AN7p{;R->6w z4}Rbu23ZkAcXA{ASWo8QF#h$WI2yM_c!{Q?_RvagmJMT;#Qh!%)aIvUMSGIXrD*6hu1+N z7VZd(>U_216GRT8ompllNEiGFMEjk%`O?#;)&8DZ(5KzwJK^qkF6XU*oA_5n()R1o z+&6$6sZ;!!v>E@uh#YkC|Hnk`XF;i?nWg`YfDZ&*>pcAgoBb!;7UmNodl5En-9PZ~ z{~-P;wRZ;g)1Zv`CGywwv$|ni)KWskyWA4q9Ajm+XxfGcJszWXMJ>b$#!l-AF+)&> z?C_|HT~YGX1w>Qh&_%$d0PmiH=cW2bql)9Q5I?D7@8dfI5eFs1_drKvbee#pO8)#4pzdrP6 zCL*b+6Bem;o}`G0)@1C*IshltLS`_)JA~Mys{t4|(h3KuNrh80HYaXB`Cv+TA z1}W(fH1?8qxZVB6fc=t#!7ep)`VACL9$IK+_HqHU*!{@Jz@sI!0VDq2gI0!|ks8st zRBZrPCfF~L+z;%=GH_H(6Xj^Ysc@j(OHG5wM+M4E9-3oiFwYW0`aRm9dJ_u$y$4OT z)(_TM-)*m5XJv+X4Q?qu8XbbkBKT78iYlrU1pO6SNbMQIKI%*m9+*Jwxy#Ene!j_U zPk3wPtFVgV`?3Gxhd*zZ+9#Y3-hhLn<119 zEI9v39x`;C3S&$NjmZ8ir++g1kwN`Hl3&2~(^Y)8oKf||7jrP1{y|jv^PITUi%7_1 zoHtEx`c}Z7oet}}>uR@IX>5QsgI`veV+vohRrJ`zbIdR$y+%b$v64Ym#b52-;QY_y zOj(fLBoAF{Wm=d!${qe4)fH2nJB$Y{E3DP6?c7DI-ywv4$|sP5U^U~HL13s05d~2o z5F6L-Z#Lq&tdqrz4bmTMZ=2e?D4HWWp=RjD3Aw9))N#>l>%)9bKqlOTt<|?x^ETRP z3aQ#i@IBHY>C8JnciRdca1~38gd_fGdtET~GU<-)&|`$Nxg~Y^;;_;)%exMG#AXu96+TEm2u3rU8r`xV*9tn*4zoXr zj{Mt^B(2Ub41V|`0;^^J4QV;Mr~CLm{AGvUUvhR+F7^TFaTB(H!;_0hu;S*+zRY<< zZGD8O^EK9o(o477$%oYCj|t`8H2WPDn8j_NvE#3h1$Exy zi#v>>nVz3gOqmek;~G2fC}qy{$3AH6oFX!dfIitvDqJmh-*`o7&UjHWx68hvrD>)$ zeJRu6S!oVwRx9y1A-LxvthUm^QR;PL&g+w&-DjSed&<*xP0;ZdcoQAj|ieyV#` zW-gSUwR&;o`Ssa_RV^990%ez0Sj*M_%*%H6tCdTyBBj)#rmO>hn+=Q%tQjKGeA6A8 zq#&j5SjRqZ>NQwDsKMl?u}Rm#iI4h=DKk!rWrXA) zx@Z=yXNp`!+2|{sVaL2Cw$0yM8H%m2*1qVEUCvPdTtz|r=hs2Lqk)y|_C{wdJDIxN zoA}R2o(zrY1+Rc=(XU66;Y&E!%h6|l489=ii2y)?$Qs@2EHY3cuo8rP zT2EVf$`VHyy`R5KPp{zVAbQNR^GZId?M2CF62p==j}4Gwx8J&|FHvG2eTS$1Brg?1 zEcZ>0%Nr|rP_?OkEG$)`v?=%XYFlXubPi_sV+3iZ-i)M(1Im-A^9<(6^|@gvxtIK~ zG2cLb06h=m7SnyI*WcVQ?KtFjB7Q_FcUDBQA4Nh3mc$j=HXgOAa z9dDEmt-(*fmD%YGBTY7mMQme2>8yp*RvEpWWeR3IiSrt$+<=#YqGl z7!UZ<)J1LN=bDgdzj+xO>iJvns=k}}7vB1dY^SG8c#lyZK=TVGbN z)A{X(0@fn4R3~b=EBFSysYG_DosePd{m`SA6=z%aF@5&y)lvhjy7VZdOz11WX{~xG ze+wFmnwOm`RVjKD#PVMs38Q-RF1QE+f+bbAr)v91kxk9CC*Hw_Vr>5esSE(Ik)F$N zll+@>K+NTH;8k@(_TL`6x}O+`gZkY^WTM|xnEa4K#LK6 zSMnR3{jNzHx*>l#YVBv8^FL6)@a+1;4B*PMK8xmlkW@+edJyL28MNO3)dxJnz>drK zI?RU=>F#%G@N9)jZmLhejs0TI>S-v0_O|CF&TMNK(|v6Lp6Zz_VwesEq4xeop5uek z8Pqn6u~v1(C#u4I<%bdDgB)^J{EV#KOmZ*W9-VO;3a&a9H0M$KKkm);`&S8fDe*kE zo%y0>$yA^*No`weI8(O}xjZ+0jzWb4ys- z@E8MB+OiS)R0SvHz;qQR#oO<=B8+PCt7ryVOkIEH!iRT-Q%dbFktb7EVg!1e?ecr- zGQ}Qv|1j2^QO>Y%Nn!f?nsm%b{7>^$@c-<0P}zz&+{$iXYNF&;RMNj2a0&w3jh;2T z&&ERGij39Tfo*|J~$2*#ake7kyw_0idz@m3%w**m&-zVyf6M8j_9GCFBlg(yEP*%NQ_Bh#8$y4R|hQ&Ja($^#(ga6MOV zC1ahpq{Y}$8Go_!4*zUqK=#ac@U}7gO80Sn{g<$#61!>qJ2wRDMkfAYo3qhKd-gkr zIZNuvWF%@~zdde;^EM9(pPU`bzR~?iOX}8&K%zx*#AYGrpMNj{WMs-`+wIm}%*+MO zDn3JWHZP!L@B5t>|Bv%*FkrPorPqf!yq>}A5 z2c3t%9^`=!XV7WE!x6qvk6gU=_=y}-(xOFaOswOooyC3uRGc3K&sjM~;` zWB@VP)O(UN00FdaGvcKwWh)UToy12gaZ0JzFR_2;>lblTj9<2S(;ReG2;h_vS1k8@ zKT}(y1aMeUkf;sEk68BCh8Am@Jq7$g#se0=f~Eq_g)kRA=}Lhom2ROH%nxqoE=ag= zNSkW!wEE(w6ped$;%HKj&l}FyvnXOHrA2I2=K-yO$pn?;u~WbKlirpOy;?EKv~pg~ z5Y3I^g>)~|To``AkN;OIGl#7h=RG>ieDpfh5Y{=sis2FC zXW)KHNM~)(x32xTS5Xv!TGTBW8Hwm|(P|tfO^e`o(KS$45sA8%d=cfvFLMYA?!_m3 zn4Kj4656cz7&hauAie@J|0+C9{G+BF^6O7j9skvT7JlYO-}w{p^^d;Js-q3@$0L5c zjo{U;VUeNl2Ii+v?M23g-tbui!ZG}$A5iaeM>(VaSG1QGAxN5nFa7EhQUShg%Oyo@ zQd5p(%J`eyEys`#Wx=((GQnJmcfg+8$+{R5dv>Tq%5|03DfMETFb+#8Rz z%2R>%d6iXggB&k?4i3f~KN6Z&nOK9GgZSKp4I>b@IG-vheQRYgH^KRzeIp`5le3pVD`@e|FS3Pk&9>rgf(?jp*MpjDo#1a6$W~q)I)OHR;c0;<)aU3-q=>pT|s`&wLW~t;E;{u^8@a+WJ7^&A5TP z+qhAUi`n+>25$WCjXyrVJU}~CwezaBVeTk+15nXDz9KVm;y{@%GmbZY;e0T6?q^pT z7g^xj&@UU32B3VGvO*+_j)!zQL4cci!0AJA=Pd}pq{n+CnOSB_qzzgj53A-2-x%v- ziD;R&iCWPa9{=+AJYxz&;%MzyD(`T9wb>hY>mPI~9&~Qz7h5H-8BNIC!4LL3-#C@f zrB9pv*~kBcW6HFsz8l>jNM!$&edLx&-atsQFxe~$ZeGQSFG6$5#vYGwMq(r}jlNNn z?PZ<_`wUJ$J=>JKrret>G~z@SEpeXuC2qAL&wA3jOW{S0&zIm%9M_P-wsdZIPnem~0Q`wjwXMqiJIJQ;pR|4_2MW8{cHY{Y^%e>-&!Tv`)UO_*(qGyOp? zxNxDzee0b&rhtb2RqnHsFrs$KuklF6!nfLt-f}+4*vv+P%&^kk0>f3M;J2^BBK5|v zWDUEIu|a=4YA}yr=m*)!?ipYw`+~t0oWO=?W@jABCh$CR`}EP2pTSyo|J6I+#0%E;mnq~c zMz%&ebofZ+7R9;Y88MX5j!%4D=k&XUKp;DvI?%mY!AuH9g(0 znEeSI+BuNFEyU{`)c;6d|38^?ME|vVkW;oXHC1;#nXY<}uH4LE^vv)G{&2!PV+u5D zlxX*F5IlJ~J zpOa&;QkX+~zz`hM+3=t9irn)(w!l~a%iFm6#y=naMZ5&qMlW8%X*k?+d~c7_x&6+i zf(+1+69U|DdM;r?#CliB_qZ><(LnyMMxe3&U*s#P8Wf-5-?X=fl{D>bVY~mw_H?kl zS?x8p+CWi%f6Vzept-F#gDkvwQ6vvjJX*4m8!oouEAF?{q&fcj=+8nds5JFsrthuS z;QoKUFkhz-)J7E^uj%@X>Hbm9QKt8jpB5%-z!aVB_qwC6Jr94#je0=5^qU(CO;op} zZYc{SP6WzMCl?`y!O4Z*!-HS)Go6Trk@y7%J)7`UGaMuO6N5t^;LkN*fBd{RU;o?k z;be}q`0oc)Q$jU`^T6PBw}rL$@C!CMp0^BjDo*dKm%yS?<)MAQVLz z*xBt(cv1R3;8@;Z2O^U->`JUgK@@*AFbJESb^AVxsRahi{PZEc&aTTnT7D)AOzxflB#`^nJ!ECh z5p*<^geH%-JnMgJ?R6+g94{^+Jev0Usv&g`BZx^1g;bw31V@8MID4&h58rZgrxyVs zmOC|faVZ2=UEM=*#BC4_$fRU5kEj>&FV`?i_6^mK{h0n515X$`M4Z{`-it)QXB|W!0k>hw#hSVWj^5@CxE^h@)~lB z3;x$i|4PpYLk{WD@z|LQj{u&_N}NtT3c>uoMp2{}3vY(1qW+>7l5z8; z^Zr{x&z-H`DDD*tX|iC?_qml4FVL1oLuV6 z@$M_QDW~^68%h(?b#_8hA-|#ps_ z(P8E7U)8zV(>SW;Z+bNk@IPUgKjYBRjCH+25U+b;xk;eta0QA5F&EY{JcoL7lgM2) ziQc}>`BYL5kNr&p^kCyjD%t(#K7Rd{u*R6XBI+bHQ@JY`|CFfuVPv^FHh2g%j7C~+ z5bBo1jcz$ND;Q-@cxVMQ1TjWfg9KF-pDtRqC;DDVqaxgnB= zJcD<{lFvr-SCM_)JO2$b@Z(umI6vV)Wd(Ol{PNbK<@I|z6TO*@t`na2fcVZSfp!M@?qd5+Y*e`5Oz*B_g6zLH&o|}kiA_j zpK$CHC1b-vBg`SYB9^ZN%*nsT5*$+ig@cY%*FBTN#R?BPZAM@FA2AiwFgF%@Be4ak z+|kk80?ZeBup(2>L>+ocOm990otLe9?`5ItIr9CDuFeHpxO0&vgHVkGi}1_Cxag@rl!7qDVA_kczGoGBduQ)DCv? zHonJNbwyn)KP4i-{ITDF9OjJjuc!r%YK{>Sa!$|1>38}UH64kjfoKOBNIOl zbLrqYW(%0hNJ%5osdivK;T$?0e68B~6w(Zo7p7{VyjuRj3@F7m=VbSA1MfuTSIB3K z1K(GyXCgqMXjg$|rveKML~ey4W6l`%XalA{27f)b1qV){0r7nE)rcCM6-5pz0xS-H z6O)jU%@6W*_P>Iy6sKoJ3r@=VED)dEGr71VekK3{__@xvF!%@D!=&=1M>u&M!$c^U zpgRw!F_a}m8I|iqyrR|J&ud0#!?|(C$GvXElpCP$JOX}Js*}0LE6c%C>h%nDgHwmC z*qHrGeHPExt&!}r=gHJILCjYKwcjiSr0N6aQGDNdzvWHbJx}avVyNDrH>|YM53zpd z$ven1-_5Q|?fInjkgU;>7o`p)Y>fGg{~2a;8R6g5ftv|V4Bv9z56xFUR(98zhI+?|=FrQWqh=MQ(J#P$=u!FEEY9LTStIWmL->;93ihgK#M&Ff+84J%jk( zC{yfwgZVt#l>b%x;AAD-Iv3HkZT7>b=F*MMjBkg2DgNL$Mo@JqVV*!yLx-RJ3fAN(1J zN*=n;O7G;c5XB6U)@(2Q4_rXOXb&o&o3^4Mb&Ac|NV}dtUuJ;-9^Lm(g>^a~Wv1Ah zbjmJ6<(KZE&lnB|iDEhQ&?`rAeQc01sG?k%KL8i0B)b!(AMy7w-SDAh1`0$vU%;;h zZnb-&x#78RHCT0|F)>Wfr;xpNIBz`Ms+~9(x0?MuVB^@<-J7h;s~kZr+Sw>!Q_uFg z%3UE{N$+`DS1a?hjuWp_cA-<7{B?YocSefbLNW{NuFS#Csm^g8%?@+F!)xc)EBvW& z&*fHKRfp%YjisqHljN+t8!$2|SFfQR&?aW|g@%SRGc6y6CAv;)Z%c}P6R>9%p1!)D zrEc#$Ysxjr^x)1kaZfm7n9Cm$yp-CkbO(h@gUAj+4O+nbd3Dbgq6!x%cow}vT>QHi z`o&$*L52B`)V7QPUHsWfv#Xhz{mx719!*C$6kYf|6e3L}1nvf6oSz(z(QEFqQbAC5 zm$hnNKllM!wrELV?$t8I%VLr5!zLW6x+ofl&p3z9X;fdlw;tRO!`*4d(B4>oY3`vI zz_QT5GAh*sjeKE*7qkYKVhl(&b-Z&*B)DnYVeEgsgOiDK-u@Gv&mVoxGarN2_8F_L z7{eFrY7X8p?E>ZQ2EfEHTYQD3Xqo#59+-v9+-@eqby}HHfoCSc0~eJAljeJ{KQ@_8 zIS&v6$i0N`JaKJJkFf~VwA~I@PwXWFzV4Nj@ImfbSVRvJ;=6?6s;LH&Rakaa{TvCx zX9)w&ig==3b4Kb2#G%VBS6O~5{9l6}x%cV-Q_pSl&QY6C#}Upf9hvo@|8IIS1D5u8 zSjfqMDL?wl2?bwiciu+N$j+WeI>8g?6EGX|9bmSnP6#2DGyd(Ue>dYupr{Sg|m9r9Y>Qm!u_onwhR&K zF_4huAtOe*wLBHB4t9pikE5`?R{t}tv)L~^<0jxA3WEQvmrN3$A!^fVDYTr-bFbVDjAZ-SkB7OAz3`v{; zh^WTM2?l4JIL@^UO1ZSuoO?sK>6tXNBJpOC|cM4a=*YXzm|NQ)xugIm7ExBh@; z|Acaw;~hY5ux_(6mlSY1ml2aAT%fW#;sbPXl1!fC+yx0{9wX?Z2$`d%mUq|mpQkD$ zIA{5w^*}0{{rHqSWlyoBr|;{65_cpd{tO|0PoMAiHiLS7aBrXS&f3HTL*8m(QEshS zk#d8c1HAqGp2&zUZywzDn0^nxlA*J``#a7DSr4r<^zPI^ea8{>U>oxQ-rC2H3A6RI zu~XO@A898;NE_baxoF)v+Q;)M=ZcV>Z!LR~$1p;~m5j}Pyz&5d3WPnwFhyo9IGy=` zecoLc3px!LSD-tORW6b#FKTYd4@5v$I7l8~ITk~Q;zLF~I6^3bcWmN3qH!(kqfjvr zfF6!y--#b%qLJ@(HjI?J!ukl|Y}9@v3)NF!Q6F?cM~R#Xi7EBH!c4K3!p?>>F$Gy; ztE&>`P|C!h!UjpFI-k1Jbcn4WYEip1?g8K``vrI)&CsB8TDz`){rluUvk?1pjy!Lz zUR2&h5EhexW^RRXG(jF1npS1qwUoMACf+*h#uIEWpanFoG*z>_27m}d*u-Q#faANO z2Wb*bjCYZ^^a=k_*4hZ|Fg)b|o>r0g6Mz|mi~3CV7C0u32IM+AS-bWdyQ!IWwz!fU zb%wrpQfB=}G&*QJmk)?o$~3WaVXMVwq7;i?2IoTzcsA1rZQArQ?Y`VsiX*wpi|ezm z)MsC-AMxk<>|g8;H%M*}x9!$Fx~R{*6hGOBa7q$m=v-=$4J*`c{4FoY?%)^92f{OJ z)tK6@L`mHgEAtNR)!ksF$tZzq8W*qXV&bn79m(?_N<5xx7>{Z7|2Ofv@rj2$pQrS6 z3Pf@@(ZlQM;d}L%Sk$~kuZp3z6FK#hmG&G!bWINXe?%7ZwMcXv8J3=MnvD{GV zyw22%RBtvgGp)SuRkL0pWwPZ-R_Ld>>lDgk9P<>Q`dVt^D==2rj7v=G{+IGw~D~JP3p!Ip|#Ny|eLOL=lP3M9G*)xh(8E;w zl`B87(y#NKF$dP7wSS~oRC_ct?m!0oDFVu%jZ5wB3d98w96BC=j0ExfA&Q_UdncW=6FbO+j zc(fx1F{1L+`U;{&mDa|F@x}CEC5Z=Xwy+VMNrvW0WJ2dJeaa8_&`*y@I5!BBS;Ax^ zfr)TM?WBr$`QYC5ua8QcT07~~#A~`bt#;CBi9hSAvUXBs;wi8^$(h*NDB;3Y&RR%H z!0QhZ(s++O%u((9(tC5CNE$n}8L+sh)DeG1@vO*2|6#d~Cqgi5tn8hM~WkXoVqWcYH6e6YY^55wTz5Fa3v=!(L2prf& z%}9`A*^N#4MJ1fNhWN+@ZBK<*4U=Zns1hT_YI+)Tr^r}vF`|Eh8~iFzQG%ws`z#FP zDq@5HXhJ+N%g!~R7vN2NG~6{}DAmx@W*`_=R!)f@XD82}=;aIty~gwgIfU%v z>i+C)xL@!{$1=*e)j!NoH!Bigc1R3xfeDLiYS`DqN2$&wAx#PR_Tm> z_%l)@Ln{#@2-CnlLMYYF*D2?~RXLTX&eK_ICK497}Ffij^&(t2x|5dm<%G()=8MY27p*}6&NdPN0; z3VmToB075$ThVL>?Nk`OA*du?a#rGH1Dvz1m(CBwCpLB>@zTOU2JUa{Y~al0Ed8deB)pqKbH0<*U^HC!j_%YMd%#Wm-oo`g+*xM(hPtcsgxD?s9W z7H1P!!Rw4KP_;?sc}6t9u*4T-=fduWlVQ=ddO zm4ox*1gX2jJQOVg>?Ib_DDIT^^1c3|z6_sN-v**|yTUwvyfSHiJ%2Fgy!9v>E`g;n zO@MDQ6CwE2{O2MeuX)qed~8!S9_snBjeHGJYnP{XeK?}4%_eZ=!YWw+L_%j<%TH!k zD%2}>Cs$Ok0Q6`F<%41M=#Q0axQ=FjZS2gPb=BU~KE>EzSX8bl_pRD&SMtrZm|D|g zJ+jh=c%NMd9bOtJNj+6!kGP^(wU0{rB?L+Bl;ol4eX?-(OesbtdfZSUwcXBzpZD64 zbp&M?>u%>9^UR=#i_GJNRk<;l?Mp7GdAWPI>=;g7GC`IDzJ`n`*whn_7RTS@_?V>% zhWed9+W*>ov-IiY+6g=eT6YZPr}eJ>!7~w?>7)J(7{!^lDFA#JApszi1)Ms=28^0= zQ=&TCk6~qFA<1}`-9=@xh-miwIHiRmy#6}c~j zY7n{Z|F|mM|4^ZnM-chJn zl7<*`@?*xWhQM*{LFb$w;Lc&-+pt01{pVw2?yHM9v=Wu>+Xl0VUep9`K+yqC?Lt+= zs^Pu#tiUuk4GWsx&O_#9{Q2%jR`jeZMQhI~o$WgPFr#(Jy`#7T_O~Q}bxfS(-Ol%M zH>I}Q2F#M2!R_2-0phNfpr%+RYj8?SR-T~Zzf9IiF^+?qs--m9RPHgO8_F#-I$-kLB`VpUXr+Dv7XGxY;Pi_Y{inf z5-~S}2g9nb=IsK#fKz8NPZu+ry@}68b0>=eIoTK=R6u0hY>13F{>Nw~J!gi*9R}DRnW&fbn`4!rHluz!$*$+0?YS9!;Xo`FnxyNNBUQd^s2XmRv9| zd2tyL){b|t=Hui`Tr9M9q!Zk5g-{*>veWlxhOIpzfw5;Xs^q zfBINnU5hjAOMj$!qb+vT@$O+3S2ALx7+W4Q)(mX^Bro;HWt(@!j;11K=0*v%;Z)YM z7qKOQ*Ie8hHC7AJ(9UdgNn&XC9Kzf|2A3w!y&?X7G^>Qg!un7q=lgv?BUSExnt?_0 z(@NxMo!R75PK&L~S9oq-8hR-|dgpZ>P`7@s0My5-?d-7bhp?_A!&`o)#5dajd=t+c z>nzEj<~sACgZ$|PbQZ@bJj=TMZ;V&7t_>#H6rt6zQatEYmEGZ-%U7nTA5DK|WkrNo z$P{6N#p#PP<8#=Ha1ixk*)b&XRcn=OZ1OWl2I|`4r*N6oWj0>M<&SlF2dCOnE@D=F zyI0L`Rm~&cEsV#eE-K&W5A@!?7g&Ah#U=iWrF}0fUc_?0FdNK8S<%NY4v;2+u5YN4 zt~s@&0<7?Sd>ZCURzI&O8$t{z8VGnU%b0+*>^T8q?!xhrP&7tn&!LJ%T(i9!!l`{O z&+d&+!+F#OxZmkswca1WzVGHK@@%jZ2-b)9ZrL?W8Aq^TiBll zZC$|w&Jqx5d*U6et0X>5-mJhN%APBp&5#*t-lK%2BdB?MEr8M6ZRtH*HgtxyY?+GB z-YACjpsg}Mh z*6XKV%~9woIG}gFSs5X36HLgQcZ29#@s7~3joClz;K@D?h1zAH4$7 zANExI(~>Kqxrw5y(Pr!+8kA#q8@hVwD^0ocQF9Q)#JL!waxMM|0PWANfqw`!mnR-K zed?a-(UbTi`j${Hd(T7Q&dQ;siPNdpvvBR3O*x3Ucj8XpKfaoFIFW|Rf0}sXO9sC@ zAYNct+eezGqa4)>D}p1y#$4<%p% zn@c%(^?T#aEEiR>um;=v6jpHqklftfU#(S zFRK&Jnx9h3tlcojxv^VXnmJOzOo7aLbJ3ip*?UpAJWF7sp^d?fx%%41?0*F~?XvZV z7wf_DoT)7SkX$wAO9joam8W5Jy-y7|Lq;9OKC2i}Kt0s%R3;=>KOx^7%w9HuugiRV zLY(2*Ux;RJsdZlv46lgfu3*issHg`vr{PgdGLumvHK2g(&{Od+(_5N&$69?8lHB>_ zi8sw^zSciJt)Hr6>lOW~C412q%;fiHKI$KPeoB?I1gl8SDh;^;=A!Lq8pG^uxtqpg zxq^-8>ec$$&dx8TtFvI>OLLdivg+B(YSH>Xre#6>PquV1_cIg=yGT_26w@&~ zk~=Y$zp$j9gh^ilv$DSkXPN3?EYHU)n{vn6$#Wk{blVee9H01WOZ~*JRVQ9+$!u4J zRw{~Ye))Q=Zc@fK{@VER9)}N>^C&STtGM6%s z9J){<9>F+o0d~|4C+F_^v^d~zqI>@1MeG4 zyMNPvKk$6gQFMr;9~+S*Es#rogxTKq77(T9*oWOafT8Kg&5eOM%m$Xf+)|_)*xG%o zCAIYGKzuHGq?fyoRlKw*SHs*u&kYIfSTdDlwIwa7y6VG;zZrvR2yntA?HU>_n$oNR zJCa{;3T-yH$j*KoqFpWJ9VgN;hsijHO8#!v$}^8#67Ub+u4AvSUGk!Tx`0v z-rYoxy!kl-e@8J@aUVG!hoa*XSi-G_Eoccvu@RGfC%tP#I0a5I zIkzRniS}b`a{sJgeK@|1*~KV6U|u7YN>*!cLxbYndG+fy4T>3jDmn{x{+LGJN* zWqoM+-BpRVK}0jETk1nIr(aGO4OP=uChz9l=gYLk6NFg{C2qX{1fGIcdrt4B=& zNnbc29%938%WPjXwFy_dMy^3zmp10hlxBHU+f^ipV#_VZAmR&O@Y77HG}UCCCYR( z;2YIkmU%02223@v#&_tm>%^jfK{3Kq$PzVd6j6ommE`A$7lZWQ1LGUC?p?`*+a^B- zK4`2pL@C+^rYBZ;briwb0ka^U4MG%wT2kH3nILGoRqIyftf5j?UIXaeZ$2PSd1W=I zBwl$U|1Yi_oBK+HvCmEIB4QK>raW~Z*aAkGXUd#&0u#Hq@_JKr!s!puBHUy%xw}j^ zT8MUzXmAvd8*>vXRdi-*&w9HjJcocu)ILU8>+e#(^7mI(Q!L8oQL7&A9DSSS91xXI zs#)J&Rl`C3Hcu;LxHaFI2~4v|7grwFCFo?qL*P}?-9*p z09k8wq_QQJKWo?j9c6^7574;&juf!2(X${xNZbAA)#|U7wX}Xjbd=$UIF3ukzeuYk zGJ0($c3N4j^mtuX+xy6B@GU9l1PPnCMn=R~Vi62RQXHr>f@W5h#4=A=nJS*p+tM%w zmG)^1KV@Y;ZN3HynGTeBbt`8m-=h_Q%CLLd(OWAkMl|61o8wklj36S&n}U z%gN!FHe*6xRF%B-YXQbE3tZALK3-<6Zn_#Xosc){#G@<$&2PrVt6@B|JQrk%TNro` zLt{-8K`^IRP7orjEZ2j1=JG^cUT-ePvW%dH^Tp4F(9S>AK0=ZXbS)#0AbA&d-gw=yr#Bd({EM)Fq% znUI;4tloJ~K}zpEwqsh}GDB|e?2pG%L*_+oviejfX51&^)#hm-~;bV_fvaYWO! zjcF+=zOd!Y$c2ZKf9IT+J$HV_NM>hdd{#}Bq#4-74rPkWb*4pjPxjfZAyIO20q2(iBw>J7SDL>)( z;6Ag0W%*)aJFviGoV(V@=0S|5(}CD7+i8%&${{UQ{mja%R+f4_OH`T8m$yu;pLNq% z{=eF~Z4X_SRV98{1jEieuUqV67~@r$UV*mP0*gNjj{88O9OmX7;XOM{omSxuVV~GGCLppff%qEZc6`AK2NCtkp9~VMj~z z5qi$m;IA_M254tiUf-BiqGBLhR1q*9ubjyxh{%)~YpuTDU@Pu`cvEOXOK69Ac@C!c zfCAZMgu0pNLBy0ehtweqSjl|c>+wx;8uvDo`ymfoR`jgD%}TfNWgphCMI%^ii)*tl zrk)EL&`S|4qKdGOH6Cmw##yWDuO`!m6C`eiP-Wuyp87d(h08~RY+r1BF38N7FKc=T z-gG6^2d&#Df*M<&6CK530mcTP1=&`*T3FN2uN=fIdlPcK3WmGL&P@h%mz-s--f2(# z$~^Gr!!&m*2_)~YOmY>?eY$7zH3*yUH~J3D(^wz9e1MnQUUwN4l_dW6C<3FDcXxT< zf6ux|z6?Rt%bNQ|aprkiDZHAsYzqnub#PJ7OFEd;MJDWVWZd?a)BzGWziY)h?gd3%vX1bA z2H4#PSdyMjw%zxcF|*rhdQ#6pEi*|j5nx#_+zN?`wF*N9Z$Vp`ImFV5&!P}v!sfUS z9)!g8R>fL<+0~#u+Q^f1xwj=0uWYe0&vEJPi}t!CNu#*c@K!R29{ZZGmHDj-fOA{4 zAqbdp+>ls)6o8isjkA`C=wtb?Py&oLd04f}TDGK2%C9}nj|n&;UHEz{^9`@0Vs@D2 zHea1XE>@yR(NmBJ+f6l%QS}DwAts@e?bgkKB)d!)8MPG#wOmfGJSTs-wAkQ&Yc+wc zBjty!)f_llmCj=2-lPNjTkJD~_0(Q1H4|Ds9a#3bb@@p3P;+jKiGYQiDTs)*>Q`YW z=}o=vTFfOqN%!x!bLj3|El#!j1G8TYEk>oBez|Z&Qt|>il`ATO8*pmfBUbu<^n0gm z_`d{7fAQzx3M92`omppk>jOfutxMW?^9 zAJA}V@m_vg{M|q-f(lFt=u5d_jf3kk6NY%Y1uEde3j9BW=8J4PFry@S0iLxd@&FJK z*iM`Rt1*&$j5;t5oAaf>Bx`l?td`Ietm@unFYz4P^ifrlYDZOAnO)jl$O#v?hET`q z*E#boF0HkfRNHGJR7if@Q<|{Pfpxv=oJeTrt;dR_hMaB`IgO-a(x^ynyOsIA*{63^ zCi%vs&OYR9yTD*iEB$TL?&V=vkBf7~d%916P*^-VVAtZ(Z)Ilc%YR}!UV(&lF?B$2 zKzPJInhCPfE0o_r5j&@rdTGH{^zF6JvrmkD&Sgv!I)0=KBLi03lW5mk>>_XwJ2bm~ z+?6bGMf9wNfT{hB}s{MwQt*4^#z&?js4mM70LzPK^^T9O=P4<@ybW5s4g1ZPJmGtjm4qi3*JpR$TyBYcoYVb zdxk@pOvMpUP%AvZ3gPg^`kLdE#cBz4S{HYY+t;_kO*9j;o@jrxj!zm>`!0x#>xe$@ zPJC_pa1F_c5 zkN()(oB3(XO|DJWl>_dfQ99oVphL&JW6g7{5e5(@(0u3+OE*vuVTiF7zu#!6=R5LT%xRNKWbO0~L&6QlZX!$X7?k72>vPKvu;s;qW3%=nl#{pTUAS;@fewL^9LLn2TMigf6NQ`k_za!;8|DvdiUh zJCE_IpS+$eTJv&hUge@7AL*&OsflE$s+^IEj>E*44`EN4Q?=`uk_EW;<`&^!-`pNK zwHnXEd=v9c@65dZADO$=N4+r9s6nV^D?===fzz4ewtxQq<#hgrd79dM8XWhhgp80(z?o=Q z5#R)>ko^zcgBb(@IMGUlBRfV&*_0U3E^GM~gE6LKyOdv8n|iL)vz;dVS`1?_wNAaT zq|xkzb?Ea%0z$#WD#yC-VT0a>&&in`EOAe#-`P&nk+G@gj$2t_%3En=OENtmG3Ddt zOq5k8>@Lhm*FN=14Y~hAjY`Ek{XO>lnkuzjI4_VlM96!SazM!khA-HczhST20rjc# zE6k*t^UIujZZowoI4b>^8o*#;hw+Z3l(ni3N^WvkJ3>$+=n;VEPuJS1<~mn~0@x?* zA#0x;=WQ1A4HfTGd4THy{i^bDOg0-7buFYtCxRK|duBhXcA>cn=Z8=A*FjSyep7sn zB{pr{YwChONLR|=%1Zx*g<*KtF8d1PqP9VSY?P&& zwBcIdMbY4a7<#;PWw}4z2+@w9qs|du+V(tk@wE`QNnL7(KD6%I3b5cuonOx{b1cA@ zeWJr}&D#+)ed?jAix3Tqj&<>(yEH%PeU$mzoZ!CDC-G)HY-VpI$_?re4*s^2sfv>N z$WX$;^%L(mty;@ZQ!96ySE)lw7p~zvZqFYTAl@MQg;m8t)t7kK4k1MI`e5C4s-gTm zRKhyNwLY_Z8uO#hkwBuI?#NvG+s{hQ?H!}Ys^$In78LD9c!mPxd6s|9lmVZaWyaXPib5->$_~LXSj!i3TsCFjpkHQ* zKq$L-SwJMB?X^_y!~9p+@2EXkFM*@}+)?ic7ZrA`UOix5@M{0t!d(So?Q2Lk68~Ta zL&jFyty=@x#D53|ltfi$%;RRLw)~&GqgZN)MaVxrBVuEreJMz-3T6d055D{1-3S5GJTztV+!W+eu#amUk$=n{wsIHMN(J17aseO+teNjc-t%IDAGvoaocb zm7ZC%uw=Z??6liHx5Lr8-$q!(+>i9Dv5Q89t+gHF*0tEgA;n$CcCIwWWW0g zETxTT#y!ozx+iRVtd`fZiCjZwJ5FOQMLUnIbP<#7M>3mH?jw2QWZ%T>4xq1anK**N za%JrQZBPH%;Df%B(F|BD^7`2Pj=t``Esqbald zvVAy3LB4#n(uaAXp^oh40+O+sI(i^Nkn(o`Q6=jfjH2&#DPZWZiU{; z4Ax#F!GRc08W>gWkyFdeTaQ?V0a+Zv#i!xv$LSflz{bvRHc{M{o7#;!)#ED%YAiJhDM2QLfaz7$_8o3IY0$_L@=m zKk^?}9#PVN{3NAOoLu2Zo)@cZVfv<5UiJU;_9pOAR@eXkOvpgke8Lh%3mR>-K~WRe z1cJ=K49w_6u!7RM@im%awU+7(#a3kKOeE8Blv-`+@@;KvTeMoOwG_~5!WP^CSHuO^ zK93Pav|%Zl|NC?AOcJ!;-|~O`Uw>LN_qoq~?sD$A=bn4+S#&u!H~YA^90j)n^eq;@ zzeg=`E{ZY`5OWSca>G7D2Uha7UzyJrbZ+lxUfl5m$b0w-n`D!-B*~`}8oPw(F=YfsHEU;yy&1*&L%NHCf&ZDsrJhei%+QC+#9u1Gls%~hrNj;QUzrVH5FOPIp{9$v5k*kX~O!z1kLnvlARY6$4l*BJ+1z|Md!zIX9CNSJ50&kXb&u!G7`atjah;1 z979D6S~Ul!=WQv!5X$F7_C%#g%LQ|=l~>NqAK5`n9>t||L%qA`4yJ^w%5^v^;Fg6d zV!2qIRSu1DosDF7tZs?FnSR6HdQ(-JIw`<4+Bv5rP6P^bK;}o^LvIC}kJjG;xe2&* zSX9BBe^s~P{I2Q3C%bbyV2ES@=-XNv`BFOy`mmsOn=u~a#=5v-WUU{K=I0?D4bzJuwY^)YcMTE-JNgLBcD81IgF0hU69pr8ZL^{x7Zi z7%F+M-4F<7x|6?*V{xEG(SX|7Oo{h3t@V2rMWtL697Nv?}bhwRqhgK0n~14M+uji8jwiDX?jLo0d7+R^84`*MlS+hOE(W zi(Dc>oNDSrh}~!MAU&~gJ*L#tc+eM#xq_1xmvrFg;qWn@ZP${T>;B~!wnmXQ_F5^v z&vP={m~JDz<{CE`&y^06w$34}(UBw2(ZT=ZPVIapB><*I;mpu~eTtrUnxyBU)U;{=ar*NldFxqMP7(mI&+&}&{gFQ~>USR;=&C}|z zD}dGiph5e>O7KSqp1!;!K|lXKd6Y29X}O2ep~Yv`m}L!?2L%hWq_SI`@E(&AszQUapc49RhcY+XFy;zN3L91Ce7YA(Ega)Z3>Tb55ZSUyn$vBm*XV*rmE?c){ebs1+_ zCRi_*T>W$Zk}GskD_x($nah*X0Zn(N3yZY4P5F)cg4)MGXoZ`SvU)Qdkw~UCJHL03 zZkATq%_6(zq?^np2L(_}OSujU4CaIUPb;8j8C8kwOVJ~g2^II3ib!- zAzmNc<75ujD=bcS6gF}Em%vVXC-Hf48p3QIb5Qm?9!)Hix}rIh=eD{(J<=|%8B7LY zHMO+nh*CzK%uVz=hF|&YR((3dELQiYRlQ5GunyOWan0dRA>uOxbTkBXGz9b>@?&Xf zG`Gtm2Be5j4OO_XknRxdGpmPRL#W5trbWCdl)@(jj^`L@XClTP?F+ulqWR0Dl))wWWV@*i!xTIIb?@@$XEdrR0ytGndj5^^>2w)JuZkm>#d20ZsE1GLjbwpNMXV!0G zxE9IKcoV#JqqLJiABtv03E9 z>9)$a|8c;X+!@Y&3w^#>d$Nr$8J8*-u!To+3pcK;;p1pWM0>q2{pd^lt#PI<(J!xY zP%^DN7va(wF(h9wTPU!1cSKYgi7z7le`xVgL8ZybMz%L+lc@YJJSd0TrIsDp$R|$b zNy>2Qt5l7Kht5Vuh4K+;6siuhS^4)c;BvGE#--hpnzIpNI2q_hbMruV?kumP68m}( zulq-F+JHI`Y;{Y2r)4@X%%+hWFESv)&^lMzfsQq5=!qcacSAqR}h%~PZjW`_x_k8F1`=QCWM zxRhV$q7&woP$W|Sft7(ZhbPQBXwd`7{>>9+4Ow`1yy6IdK0^bK>!~#I>BjCr0V9SjZN>!+TNRE`V`d7*0kYVY*mKR zpZR&1E(O=fLHubP;$)=hh4jc!tIjV;KSEs`iIgjp-Gcl`D=$?4f|RYI!%?VfU-Wv? zrO51&%-j<VMnmLB?M0+;k0ZoR)+2KE%9_bZ!|$+Pgp* zMfl|!tFw=fU32A{%g{~~RgqHW&A_f8&O5w}3wuyAKI*GI-JDo?%RPfUmOjT>~s7)tk-veykGSV;!ypYq8lYgSpv z-^N1N1fmV|-eYh0oJ=b}GApsx%;AT7*9-8h{>~Kz>f(K$O~Wh^b9zmG>Q8(nl%MsP zCPh|GvHZ+Kf_POM4p0^ik2}*jBg))-P4c}$uWKK}=pPr67rheAFTD^R5YyvWu5_dJ zIC!wR(d^{+xj89so&01B?^?yo~4k^Bf-#wlH^=NrxX7b z)f&ky+{DhK%~J~n4+a>G9I&Lg7_BoevAm6Z1YJk&Viwb1&4r3-&3U9vBdRZvenX@# zH9ZXdn>GjJmg}mi&=NIUR1o1B?Hq?(HB00U#@#77;FVz|aWYE3<-1;|9%h zzsvmT4Et;Qy83gkXBS?lcrEWtp@+?^Uqkj%n?`d9=X}(8Sx=o`HXkK10-9g$NjhQA zlXN9HIF!1fXw*S4k3xDNiY zbEU1n2aegNji;)$xKVU}`e%(VG0IsnBDL?h#94f_?_@$U6k1+uD(!i~Cz^Euw-5Uk zjxm)C+vlDOiU6bA+XUF+ht2ql>r>dh!4CR9a)F0uoWFkL%B2|Ug+HVD&Wz#Wd-3%E zdu7xvUP!+g3}v6h=p~M?x0WB#v_e*=>c_=%)yboncn$WO-?>-fiEFex)?S=F=hV8cteZduLe^dp^GdM z7@I3NN8N_jln6V6OQLETT>?PsZ!+-E@ey^&hzHOAdo=# zrnte&krc-e&#}~OJy`z*o!d9y!!&&zDsY*4IBcmcWWLK@70*qNN*167nOxazV@bok zJ{1yIRJMm89w6d|8xs#4 znsDOvgziwq7@W~kV&if2|WgKMwf3JZ)nW7zVu(C$6Vtl|WN1tXo7Db!0TutL6OCF*lKTex{eINE>+ z&d+OO)@&mX=`z8f56BkU5E%!bwa3`9c<%a*MtC*OpIs{^f<7*e*7(2&BzUMzb%}|= zE%sE7BXaUM1M?ojgrZ57h+~iOwV22Vc!HC)%%wvV~YvL$l zVIpd9fZ!YdzuPqUU`g^dgoZQy+zn!2o!l%7?n>(il+a-4h#uQ^WWOt_9$~C{K>n4>X0;zX{ zi2?Srk^|=&r}OUqv}A9%F7(`5{K9jnKUhxeoXjY?ZG0XS-j3ic`9gt~ZH9(q{zZSh zzfvyyQ3RaBb_;efUNtv&&h>alNGePLRHR5Mvj37>E?8}tI_{Yblu(WU2i-TjWX;gR$+_KDe3)Y(UZMPiDLyv{AYE_ z|NYlEVqA+MPRmjz3Dk31-Y3yDO_y#2Beiupk50SLc{JA0j31@ET)t{m&h47o zKq1X=YNGq$K-O&Le)A5MuHjvi=RnwGGjnB|BhoGVGj4(Fu+}o`)jP+OrN?k@-x+UU zjhFC-N;t?2NMSN?V{huJWk}y9b2&o4ZxmkIk+#fMb`&?p{1%paOV|_v^P^2OM#ghE zuI@F>Z_Ho69*jf2^4XvpuoQgsY4`bE`@0*7u$>;FI{X`!X=mYjv`bseOm7>LDD^F( z)+sax)WoGN*G1Kao{*Ouo?0-8 z4OaV1SFkqdv^1;r{8To!$Z+`k;TSyVeutLpLaUGCYx9RsXC3U`dcIXQF&izbC`ilM z_k<+c%e8UF21lw9{P^6jTqBJqu>H0+e3?LIK6Gx>hLdT-uH4A+DcB;nA%{ScSMn*l zl0tOBKW_7m)X5}&TUAQgZL3D`1M6424M#Z!-J*ylzK3A@HD37npJd&_dgWh_^!iQG z0cDz<3|?dz8O?}?Zy;PrL+U0Y`|f8@Ktl9acx#yt#)(_9<^Cj*rQ`4^x=7^n<*K{L ziiiVA3^oh%MK6PV*O=naKjX-_c_~9|nM1a>jaAUx5y6bd6Vs)IKT}}#ZsVyBzj&a% z^fLA#JU!qjjSV((>hWl0AMWNuqj@@d;YnhTm*Ex454avcPzU<4&kW*85^Sc zjM0k_+crZFx^*!;96WtRNdjO^1y)O4Ww*>KOOA`BH!$a)eD`%&okAcidV1hSQQV)j zTo7IMT`tl5=ndGIMC)IZrS%-m2lNyRy*j*~%0P!vS%W#xc)H|5fiOqjnIsf?UEGGR;8e3M>nx3z;HE>a{{QDL8It zTmYfe$vmhU1PCg(2*XhmYcdpJOv5O+u=v|pEe~oC1*Qn}w+6F5vGdx@rmJ{?SQ~l?p z?oLaBe(RoTyIwmPd}Beu@#_Zrhk}|Hfm~P`SZ)%OTRr3+qV9O#0V=)p??1!mUELP~pO4tEF+?~3T^YSa`p@I7H-(xb z*$+KkG#Ba1=j1U_=qNt?1)*Y{FIih)@tzjjNgbVqF2t>vwT~)<@MV^?5+VI?{SoRe5%*Swl6sb6*MP zmd)l1gTCSVmlLRIAg6M7-inIqOi5gH@33OZbFBB4dueI;rB2K5`2|_4P$O02T(h~X zih;CEzc@^ynHXN0FCSH%a`KIrFU?h=(f_wB`xOCjZ;^@t~6}G~RMKS=zj_|%h z7tCo~pHR^Ka5-PC;Z-kw_QWTtL}Y^p{808e7G)AK@pK7o2%G3`)kt!SMx`c=OGq*! zX${gDyftvYh@ho3c_`u-d2f3I#@v1R7iM+>&FQm-mr8*{GMnVcMY#7a3Ss)hYd8Mr zaoRy(=LMzp!xoK*c7RaeP6dCg+=|H4Yohs6+M~Ijq?9QKRXC^0a<(%)Em(%X>nFz$ku6yX;SXzcw?&ohbk3WRP`;-AabI!*3<3~u&>%S?<`NT6{8|dq< zxNR$e7q(e1JenUT_5?D3Hud&1uCATiaFYWARJ*17MdoM_HFQ_hZ6D}ciXN9*7MIdj z{uS*$`U)!Ukxv@L>@z>CqK?3o-_&q?zP0!(TM;_A@Arjx0@k4sSK*wr2X$AxtANkB zv%sP$Sf;l{hoTMYi!I*X-MzoNr7Pxy+b9^#PN_-s@2+@^!bU`gAH}uuj}**}xlWO+ z(Yu`~IZ{{-QaLv!zabWQc6x7jTF zd|rW2E!E3%kKkkLYKI<-iCjQ=>Q#x1lz>^IvJM>F$4)k^Y*6hcob72Hfe%%qBG2^VZ?XR!zA`pN@A2N^ zt%1{3!Aj+%Cu+#>MMF!OAvGDzRqW-p=@pYw@rfRAzf1BXn^f)xHVNKTblPMkN!KQ; zNxox~>@*c`+N5fJ-6n%1U$Mz3$*ndygX9Y~Ih*9OHaW+*RFu9`0aj){&eKaH>a94} zCN&>3Y*O>lXp@?cGi_4yG0i45A7PthJ}N>s86>GB}4R zJBg&n0n^HN3jI?zvbIbaWo}fNvngZypDWK+bi6*$2d-xWYe;w}9q_&8`)A5l$e7}E z90gVAnT|1fu+wpvO_l?zLu^vhG14YA9m8x=({YeZ){q=*lbVh)n+$sQ7j{S83e$A+evy8i_Hm}e+O0bjw|Na zgS)(2zA@Ock(7U{u4=X#qIbgr{WL1(^A3Od)?q@Xj; zCIy{u*<_vfGkCWHaqcj^vN(5$O$sC%9M#;4EK}{R=!6as!_$3o-9i^&wwz?h0}*RqkFcd%byv zW(BoVvLjUH#(aa3NvTJk3EhLc_gMi<%ey?LCa!wLP@6DJ=PLeVpPZ>iwO?;Y3?y(~ zcg4A6gmYuYQB6nSaQ*@pPMjP;A0`11jwFv)0}8L4%#SFM4wUFw5^AbpFCDFVb3^}S zsz;PN1a76fqKo#!xuJrU9Q>DubAg9U8dgjI=L-Wzc1Je6mndyinck$Yrq&hY>$5_u zBbc>{Psx+$;TDJHy?;@j5S+TDH}^;R3XKgp-5~}r8iOzgiP-7@zY^NzhaUXrfj+nW z(|z5m;oaa3hOWPhjQf=#h>|h#k7WE>8AjfhANsrBka05^ygdKDfxgvqDCjOEBR4ch zBLawUy(4g4p-JOT$^FF^j;dnu72*uccK4wX?OtAH>@?OUC)GY?SP-{KxP>s`1pI#j zmBiBnea1^ddfzB#@+S5yGTdK5`K&m915IhX9f8jTNB()!%>I(ESoJ`0WnO} zd*=gdB)qot(LV}2!uRUm9_scgc$W)2N>%}}A0+AABL7#+{Czx_nXlxzyJ9)KEi->R zxuyeyOsT+TWvj-hT}i8W?%rg&ZBALKRl6JiqZ29OV{w&O30M64SO|Nzk3E z2wpP8_+z=B+T*z~d#R^U1mFRlbAc`%)ykcE+cfko9gk z+t-c1+UyoQbo*n@eVh5OJ??)w?tclw-a&QD-TnNq<~stH&?h0Ecb<^ioRbYMb_Bjd z5&fg|H6&@4-pteI9f5_#cO8N66_TBIL2>=}6zT91W2zRI`x0A%;)@wf`x!NyK>6K! zI|5S+-yyil1}b&5^r>s62zC#X9$BL**!7d;El5VL)1v#kG6NB&9|cxH?Qq(W$$_k z`9BT!!|83rzcyU!g==4KZ!d3OQ|^B{S8$v0{wzrp2 z*8g<-nzGv69EfZ3r;L(#w!LFO?Z@qFhlKnu^KE-unSVp=$GktKeeD2hjQICPYN`5F zY9)Xf^$lp>P#*EG@&7AayE#<*A+3jKj&kAJr`tD_DgOhC@XG&G$o~m12ZUB zkym*e%64%jQ4^wc#Q%wTGe8}U`2UUgznWg15>j<9g=-&Y7&NBwZ7}WaW*q)!)uR8Y z+SmDlx_O|my2fXWfY1CJ7-y(opMX3pnH^omebf=bEag2-QQ zBVF5ue#* z6M^ha{B#DwxvNU&g!_%d?fbYA?zT%&Lk%W9Om7;38v^dvhxmdwoD^Caq_FJNq7b9o z$OLcP3%|zxu%co;k7H49iTZK9K?(12_5$-kTn0|^>l`$qWM#4jUwp3Q!`x6KFEf|x|g9%JU2AG9;0dae10eeN#F7{(anly`9T|-Z*mor zo`d!vqm-P1bAKDJR*$o_bLgUM&=;BXC~f{eM{I1jwp5i`Rx^z;VEAbRgsb#98QiZSlj7zzMy{<9d_T zy~(2s$!x{HXG6Vv_1k*nH`y25rECL`+Hw>52eOAe#v6@S2Aj0;CC(Q&PPZSutvr6)yo*lylNYQ%x`#JeN*T(D_&!ajSlPI1OO7^K(;qr-J1bBewC}8b& z&Kig^)j9$M1Gq_;HV`l{wa|AWUUw+7D#{=C+Zzq97?r-pkI5)RWWk$`Flov-_6U|s zAZSL<{S^0Eq7cCR;<5x@1nm`bDD_k-tXuZ8nE1e-rVZvjA#>nQf6Y{PR}5r~Mfu$& z7Ztatwdv!JI8XE+d!_RSaoJ++6A^AF26GG6U9sgE#Ewf>3ZMJz*Qtp+U`$zo=Tdh8 z4O%J5bfE=QILj>|BNu3&#a2hGk$CRZM@Yh8#`4#1DC-=^{VWz%yAxAlgwvAV(pf?G zNu;ez4NAt0!XCpy)RLZ3XJfX>J&Nhp1aiGykWHpI%*|sHAxqoOa;p?wQYZr`>nNKG zOr}kE*eU$T;JaxH%IN*v>n+HgOeuw;O%1+q%FcSwGaRmT0 zvVZYskeN&EU@ZT_eSp_aMv=2pdN`Jw8`4Q*170o2vq6{DyS_9~h?^*k~c zpnMsaW!|9*UxR z6M<;`OAA*3TH?{!c0K?a*DdRO9{F5H8^G%Be5!yy#r{6+zKIJUX7p+r_&deb*ROV0 zT%`s$lIF%dpv>IRU+}Zw2)g`pJ!enVGoVwWJ8vM&9H6CUVf5i2i~U#dUH1t4&6gB%+k7U9 zJD$*Dz4XC+Z+nwsVhq2%_3Sp!7U#8)w2qqOL5?wx4PM8FD;)w*ETUd_R z2xs+1*2HZWaBO$iZrq0@%LN2t{x>JT5H-hh=T@TDbEFO(L!?hQ=SxNtZ43ta+})Lh z>*2%qGw>Jzn2-v+s58!6jV*86cutK?+;hHG_oaB|1{A7J4!;?!?Jbk zV`l!{t)WJpfKN|}LOQ$O^+A1VZ(eHFKbO+nY1zh2 zPq?yoPvUE}PCgT-RaCClvqUyG*PM1g>cxK!mS)8m%y*x|`w`Q}4lU0H5EE0w(?-6l zC0L~Qz01$;2R-rHr6j=Kn8j>kePM&F+{gy`*^tCp>CdVj6%(5{vd{K8oVSo0Lo2yc zEUf3KQRg3l`PB^=ezz?+5!+p@UnzxSYW%1<*5`+=Mq(mk^nUJfW`XnSPD^iD(49~B z(!bBG*W978Cguj$zt2VKr}1turIL_LsfX6nLDpoA(;~r0G+rQt0M21%K$^eeA_1RXdq;cLNA6$nh1)T86yNwdUo65C zY12=3AV-ob;y2xkLFV-Lt4layFDfO-?{Hqf);*9$ce#^!r@PR6#TIf@;T&6`1dE+F z7U0MBynvqc@RtYhhr~Chbp?o%Zcd8tjF|q37#FW#)NG>1HPkydZsbKn-pTwH{%-zP z8~$X~o*V9QGAR!D4Zlnh?aO{nu#~Pf*goEhP}1U;IXw|JSAv`^YHaa3wb=_1f)+KL zh1Rla`k|9~RlgIG8*wd)=Kl^fihe=sen})2kT9YN@uCb^M? zZaRbsjEo?E)y}!hAIfY@zTSvIicBb+xFX4Hbr+oV?{4ME<=E&J!@{E~Ku=RErDBS| z>&d{!v|-2NdUzr}&s2*Q8YR1-E)^KpN&RIXO#4EXEJbi)sg&^n1q z%w)QWTc|Q(#WT3syp&lIHpeBQ)SmmDOr9K4d{{{R&~yPYKMkTboS8v0qJe0{RgB`I z*L9Bg6y@WorTvmah&ytMj+!4G%p$;~iQx6gx4pyp!h|C9q*&E3(#ebwG>>;$N==vN zqaK0X$qCF&G0r`AxIEou{SWE3#b^QM=CQiFk}rF*aw=kz?%Fq${E^G7YV0OM8>ad( zQA}T5!`5_OkeCzWykD`(;<-yJ;X>I56Qz+{LzMv?9$&kr4#4CFB4kk$YyHazp9a=6 zBo2z@<_A+ZRQ>_~AzU0a=B}1S7$PLFtdcIVzTR`cO4M6JtJgc3S%3~d-=$Jib}~l8 zV)5Cf8bb)4RLP24Jz2M3=+#@)_P@pH%LB2vCe+7mj{Ji+fiM z8l7h0{Cb#~wMq~T?_w&WI0(4KH>7*3J8_!!UOS@tdGzI%ya=VwE)Axm)j`kfFNN2* zwJ$g85%1dHW!5AaVXa(?QPJ60f-Mm$O1C2#&7GdAhmW&*XLv|JMFAbJ@&>>c!^PE= z!0gKu$Ykl;TTg}=ENdNlZH zreVSWRP}k&6$w>hjar#l!ERR_2Nxo_gLQ*+b2ClF^7Gm4Xf2`EqIs*iEArN=XW2sH z-uN?kip~*=Zy^n-j>_jbz*LI%7|dyDOe&b(Px-t%LNH;q|jS0$Nk9ba5kQy z69tMqf1>C&jA3Cc`58g;I+{xrus!K?9%}Hr5UFoSbV7M@SJ8|ZxYUePyqQVnZ@!*a}ru4D?9mqoJg!vx`cg)T*Nx0x9i zF0hXkaN*q0epGR3`2d74ma$lDOvCRs_#j7CT3YoxS5j@a6WPGpt;D#S4N68V!gpK{ zN88`UtJJ*8)Y+qh-gD&l?$-t5S6sp(Vh9T%VI&4w^p} zADb`O0v*paNz0!KBo_PMT%w)XX&t7wg~2~UCCkg4mVbS2*u6{O!rOar;m%~&aRARrw6gni6#atp3Y`c38b%^Bk}YC z8Gc+^AR*A~<(315GUXOP1PNxaKeTweEDWPsB>zwX6okKcho*f@%hI>`#i)vEcX#;s z3%5fl)>PsopajkHIu8>*_b!#+Lr?8eX)i1lAz5LmSPEI&h7;2i3=n&71YAEv^%>S? z4!fUtAgAR_(;4;(Er%`+LNKO3MNuT0OU^+x8R9n&_r$p3U_V)aO7&?iU5mct?d2;2 zzmPrbjtb#PJM$K~p}NTjCB4SnAY+uO1utXb2;_^+(~@#I^?=yRP% zBd3H2Q;@lcVXK<_FR4b#&%#7}op|R99)c%`Vo<1SUA2>$55>l-*L4F8f$BDx!UuS~)`kK-H2a$NjyY%}qkBTRV(ZDv#7?CW zjiNN-PE#w_^Vf&lNI^gM%c>MlR8iA4p8sIn^7kxQuBt~;ARl<_V`;;`Z8rePTE7pcp^*k(%ZEuG-_-orE{-mmHj%af%cgUN@Z#a-rHrJXvAfhTs^p1E|~SAhO8aQvvQ`-$Q@Y za&Nf@Sb0tS={bKC*N2hn%TJk>pK$3L!lg?M>3tDjlP462 zVX3^b&m8IlSKksrB%*9Enwwi)q~#sKam=Y%C@q)KmYwiSB_zZVBC)3Q6@nKRNp=`g}7@~G#EfT0M zJUliB(Hb{@75-90rM+)(n_k>#y?Iz%0dLMSYeS3orT92;7XFA}>GDJ0{YdvGec(M< zTWRt*1z`o$rCMz93Jwew-o;)3XRQ+NZA1jb_FaTCGef0^{@m0@?a5Kz2(l(Kg{DfU zhY_<<9Z?k+>FHGyNB!*3Z!bK!lrM)fmkolXN zIxfA3$!`J}#!w`dy*ikB$k1gL9l807{q&{ekNCKD?!%!8CR_ccly^mHDzj^edqw~# zSP0Mk^0_i7+0?_Z=EEcW58bbZAil+A=Co+J**#JR!~@y2O?CTqY#bHqm;QFfO%0L&UI0+C&A2UHmzb0HS)*1)+}F0eLOe2Je2DP3BGv;G(SHVONlLUHvgd9 zZgw8cc{wq{crE$JZ4H=}Ua$QZ!7ibVpC^VgU&We;&-0>~XUt^#jqaCx12YXh#&U^% zOm0_lrOw??M4LK_xMvHmBghmU|543K4(wWkdG2(mI}UdfmE7m~f=o|linbDvcuthC zFDd%&wA7FVL!8=YWC}A%Qu~k%yfc_D_aTXSiG&$%qimY?;6j@{OIsWw4t9u2_sH<4 z-KmEP5{-6)@9849T;a(O%*5|9+o6-uoA`tp&U+oy0qAZaL;fwG)D!=F#$ffN=te%Z z?`KHe%$a&YnF;fH9i5RSex#mFs_zMefH3CzYZ8Zab+{n2vB6;Y0-I{L4vn^5PPsj| zG&?5*rcb1~CFj$?F6V0j|D?hEj%!mip{e7pt2E@34KZuva68?B2O$Vx>?wM!Jr4ef zlL90bj(_zLWD3bD`SrQ4A&{`Kos1yM_#_pZ7TVDNICey z4JZ!+eCVm1Q+1LArz#s|UH4Jv5k-Cl;@dDRRM!B{B5w&|fC?KS0PJzCh$r(=1<@JP z#WB=-pW8UoX(O*>O4)#J{Qw!ySr`U-=g}+HrCAS>nWR@ql<7+lhHgcFWJdU?7^1UV zYEL81f=CtNVaQiHSV_#dm+(U%A5Ynr#RA#9P05eFkz^X;YgSC}f~+$XU0l+mn??Qj zsysJ4+J^*IvLp5-f&P~Z1n|6Z-acqHg07R1OJPmgrHv#%W-m9Mn1=W&V_Y~hnWZ8u zDKdcn-3IKod8B(xTVI z)fuXu_X-L{X`IjdZSfoNSe*kA?e26}=yI$NN_pGZ)a@;R`*kGmW()ZpAEwT@+iCd_ zCriwGe@1a1!SnDxFzibHZ*{setB!lz>sqkGW~b4)sPJI6NnxjQ~p4F=K@-tE9+O~>wbA7>R# zFCr>VMs5UB3l4`;SvQG@;Ko&2Hv%bG;Tuoq*sA%j-EkLl%!<${02@PmGDCZ;*Qwv!e4A|74`n_2?L=XalE5vscf+_0u;P z&^vhCC+sg2Z>w8RS4pFtxYa%0rV%1-(a~wEI}YW0n$@-0kG`pIEFH3v%wX!t6uME; zU$Q5M(BgOeK@K?s-RzWVOK@_u1bHL`>~Z*YIY$oTJKSft>xSOu??6 zvkyotp>|#Cf=*@)Il7c=Sx63{&NwYm)#~m?HOz;rQZ&i=IlEOBm(!}<;XuN;sWziI zRXu+iMHs{s1sOpL?8M?XB$Q2BaXaWM&owyigl&=&a|yOjcFhu$1Cp9D#M{n_+l6fg zp$-#!1wwiEXgRWkb7kJ2%}inOi%nv7@=Wizf6^w0cg`8uoNDuQG8e#vnaxwK``A1~ z2J}{+1t*Q1%BTc?@z|gjgz+uclEc&F67LGr0B!la@0#RwWk_C;0tCTu0ZmLwuON!c z7cz}YcG1!(P{O-%{2B*|g>R+G^;G&+Z0p%YGzPGGi6 zeWBL#U|=tWm$pmW7xZTFU@;++!YQUXiUZ3--bDa2nhvxSz`UuLW!_eRLzdJ9D;37>oB}fkw0+qbGrhwYs-jb@n#3m<_nE=L(t6_xOG$*$ z$?W8C$RXYRjS;7Yvh7amt7O^DvcK6ZS#>l-sP1wj)>V+y2qy)cVLwRKwOhgyf^jFK z5ZkbW;d%rSzfh&=_POEu&@u=!+CW!snF}n-tGP^#;b;j7+IJ}fv+lG$pd~1aY;cm_ zP4OJjZ*j{4ka z^y?aV#I{Q_iWIrPY(?|Gth$47#Pi2b3{fI~^dBye@Bm-j_*pvjYgg{;?);KEnt72@ zq14n8WCq{jY6#iY+vJ#zA_^>vT5ZH=$22HA`5n{XP|dG7o$y>~pT*27e~Qg#tl7Qt z2)2=2#ckT8w-W1{U+Y_(lTf7`6}TqPx*Tx-!HCSTzcAXp?q5z6UB1owzOY9pvl7eP zLv~v`esx}iuF~M{o>=xn5F#-$7c4!MH)Tir%6(<&jpd<%(~LMGMJ6lFi^03FFxq^_};`<0L^}lp`vNiJ(e20;qaR2@yy10omR|UtuN(EL@@PT zB#A>QR~cv56eUf)QYLrY*BNm>P(yW4j(Z4KYPi5QhN{q|-m`4cUzALoR{g({OpMao z4l9x9yb+d4oQZtoaa9b}Xv6m!y6Bl7Fw6E*GjHu(;j}KoKQNq@iQ**xAZ&bl-95J# z_7SYjzRtohFLYgl=Vy8Rnmb&xcK#@`c#LMJmb#T7qqYw*8!Wb4!;`8ld}>QVeuwoa{dR-9kedR~>cn$;A~-&7@7 zg;we>2$ipR`3mWGJm&uPSk2I^y3TUrsIqNTy1NWtf?9%HJ$1q{vK7E3O8WaQfdj~> z>B)Fr8BHD0j;Ynu>x*95Hi~qO(z)A8MJ8L%t0eWLNgbKXl!|1g_MNw3YL!o2%^U}y z%&1U-@g~!%mA@A8^b>6Vq=EJRXZs73;;7fe7@h7NM%m)x^X})^S-Zt+V7ZveqPfbJbys}#5)R#B(EhYF)06_mp*Ty zfRes}Xdf+G;oQ8rhMpBJs_qsj`iKm?4-A*ZmMj^+S6g_}qV#q`D_Q-?4_LTn#d9e~ z-QGyrDvtbR>;X0MU7r?5Uj3>jGB6*#WhP^_u7BJ+YYhfK_r-ky!fqA<>+b;loAmq9 zNUk!ReOGR?mhxFN`z-uy`rRNCsi?=x$s^vkd9&G#R-+-+u^3|CJ*lNDKfNs4^jPAI zba&|ulNV2DzT&FOQJ+!U8-LEmrR{btPaXV6#rb)q(I$d&xH_MMF=6WJY;0bdn)u9b zIK?DaxwjU-${+9*!Tp*(Om3*%AsIx_rx2_@x7n6WT;5xI?T%3T?MFLGPf&Amgo`4E z9aQZ$_n5~8zuT;*CmkkXFt1_i08Uj1JuV$iebR zot8rZL4F!b?B#eq+|Q3c+wsTXJWaCXsJ}hNUBLV98cd@_EZTef7)n1GOnpCaqUjzI zO=vxCV*IQrmIw0w8AZuWz%MmLEEdC2VawcfY9VdDwC~ z*#SD?W#s)8M5*m^SIvQI_$rV3-ooQ9?GnI)C&cdEylXhdaOK=tbUaGWef%0v4-Lm8 z${Hr3fx;J)Q`aBf4L&RCQbZc2O`D_sT@A+&NJlw1i!nS0;thF#v-C#oB@YU1DB+9q z{f$jqV*Xw9FVw*o^ugS|CSdnve~I3YVrb}YMtORvXqTm+_H zn_ZK7bI}A;J)K*Ge4*XXg}=-~3=iB+D^+LbFFVn1q0$myFp@C>4GS9izg2tQR7hQ% zu57mOY1XjjH(RSG!?|JH)YKVw!n-^FZ1@qzgPOQOB(xKkVr*+GE>!6L{P_cr%jj(N z@^7lX>A#xhCUc4!R|@nNscZR)0aUb-bB*p_t9?WU3q7pAfbrd}y)BI-yfrvd#QQliTp8(-}?;0FC?QZ%9dL|!D9`{FANSs z0SO)2p_UEQii7*da|aHtov%a)wC*Lo5*@gNUr>K=H;67P6tQ5{EaPa?l_y6=S6=n)rvJKX?zgXv)=wGWWL{@v6x>&wzx%P- zb^rP7furg)?b}iPh!51+EWeOLM5t>TCM5?(bbBtt=Z0glkCREr^F97VNCYAoh-4m1 zG)aF&y0&Y$?dzu+p5qv#;XbL~Ny!aVk!*+luGDecTR|@P)i5z}u0B6IAJgXqyDxnG z6Z3U)sh1~#cK40^P(ZJ}?~z_TK(!o0DwJA)^-;^gpaMWF_lBF2k5O{4H-mKc@t#IQ zJc`Qo!Oy<-xas$2%P|~UaoDJ_QOm(B@?u;tM1BEgfT>X$WsUEZmcP5KQVWy-+>x52 zkx!z1@ivpIdBgaqqqIt8t=&C)!H=;*=1kJ)ME(_9++8X>K|`X(Sz;J5t@y3o=W-Nh z^W2d99_+?-#%y^XXnA=%b9V9;#xJ9$4HokNwEYB@giqWrKaVLIXE(@W;EbM6>qxnK zHurw2OWeM~PiPq>2)i}#1~m4Qk3xwC1}X_4n1x?ZqvfHM912-%XYM;ZytCx!Bj z1jBpGt;JoN=|2@XEghyITg@CZS)HRqPx3?WTS=cTqffDHX_dA9Ls+-=VEo}K{sSif z1M)Y223eME&Fll11<7$Ak1g)dKtwzr!V_Ad)u<{=+#6aY=rTzB_i3ZA1R}R%{p_aJ zA;ij`Z^TKU*rDiS-E5| zO7uqMtcKQJ3=B3N2k^*1PYC)UJh*}#jn0eBj3z*^#{tD_&(p21ZPIEaSKW6nP<;jP z&#~Qm)$Gj~p_6Jz%+$Rjl>H<3;KMA28TUp$Teo{@O1w2rR=Xv&kei5%q7Zt&;194u?7SCn#r^F}97yH;l0Q1ZfV9Cf&ze?X(Z0h= z8N!I^=I5%ZB?R^%DGv7ONb0iVAw|aDn{PAd^M-JFKhke z&K-@y0Wz4uvHBfhoPdP0Q$|O#rJK0`;xhyafa?u6@T4L6$xVhY>X=fg-4bBe6=`YF z{zm=I?&|IKk{H9+pyu&gf9W`SF36+`g9q=Ljj=?*{^cv zu-9Nd{RHH=DOMTH-P)>J^Fv|?*&k1h4{`7)*i!Z210h*UpzwdDE6Yn0=ismqiTu!~ zc|_V&=jP2p_&|(gceWUuT~k0#_r{w*N$B_0Pwlgoa?A@e!g{0b%T+hE2EI)KM!c=_ zXMOOoFTb+*{pEDn8EaX5`M7*Ko_)p`*>m|VL&XgkZi7corlm~U7}Q#^Iz0$&p3unj z_DN9f5@@lGz)O}dXm#ti02b;3qxNj>re zDf&1!Kh2hA7|V~H@>AcW0AzK-NNG0=dCe}Wi#CZw6rSLf-0Ppg(Yu70ii`_=9UvMT zz!>|uhPbojH8Sa9Hzv$BzRwSgheli1Fx4dv2!oBkQIOMos_uC7;xUfNFYw!Iqi9}t zG1~Z{8KO9|kswsfGTi28Xyi=?8j3M{hoZ_ zsuAoGhxUO#`Wf7_H~5lYDJaabLokLR!_aJdQwoaOm!;0EMg1#4rP{AP*s_mv05Y6Y zuTG2nTZ>fH6e*qOe)A)vw|w&!UIBQ9qnXgGqz;oJ3p3)RzbWedT~Y6R#XXo?hgLEa z!w)_2j`_Sr`u@bUK+=#UB~Hn!u$`Fw`A*DLCtzV_7dx@neP^fbL}RfNv(Q3h zc(jnCk%w`<=;|e}ocw8W`ISxa{9@k^R}H}NQLKH>r0DMVqV4+*l}}dg=T{#cyR}OH zms=#>WH-qcw|(EF=;l4qu~J*Jn$d)6J1@|{pmI3!9U<#zdqt~e%c0l zdZ+3|zT)twBp2N4{^)fJ`5~onH4DeG_m+@K{~N`H{*+`c1Fr!Rs?7&JW&VRXCue)P+53rtR}WnzT*4TuQ5FJnyEQ+xw&zy_+}w{ zMIrm^HhXp<``3l+RUl&L(T09eS83tx;=0fP=wgfo zso=pUY-fU|g5;BcFxg=ts?(|F2+I#rz$;QI5S|8Huenp;JB1WE8?X6^RKKnUv;y@p z2JW*1Cmb@E07lio)F9oiC~9HC0dF^RU+n+*Li6pfS}1ErG_x2aVH(fK)Yx`t94XeP z&-o6~&s?LY)V2!oEJ>yA}Z~SRWd@*23Ug zIt|3poM73vkvjSgpbPBRez#0dYbvxK41HqoU@PZ=Tz4LV{Za?|On5~~clUQPXWLDH zEAf|-@5B%RL^$zf_laSulLw(1cmH;=`=k`po!sOjABUXsSeaAZ?wr5jW9RE_wD{8e z<)j`X^~C&NQFAHEg7l75z-eh9r3HQKm-kCc5P*qHi2$J#xYi$`v*YOgu^V?e7q&xQ zDPY!rr76zvVoen>#>P5_l>7!f;;L=VaWs{Xqo}w)c@reWRKRbcp-7>jNTH!frEOrL zh`oP9S`CTw=EOmW8UVXJjvk zxb|#3Ita}{Wy81Ss!yY=LG3RaquPVmfQSqdy<&~;&aL~*wn52IYSQs+6}v%Lp6ra> zMuiHTW;Sg$HBf+X5yyJVxaqRz8&Rb>! qP#U4A(=wiWNRe~P-9X1%%opPK1+FMp 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

Du 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%0A%kBV;6f7$x&DTDtdlX{tQ!%#zOHYLG1EoI7 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 literal 0 HcmV?d00001 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/auto.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/auto.tcl new file mode 100644 index 00000000..7d23b6ed --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/auto.tcl @@ -0,0 +1,648 @@ +# auto.tcl -- +# +# utility procs formerly in init.tcl dealing with auto execution of commands +# and can be auto loaded themselves. +# +# Copyright (c) 1991-1993 The Regents of the University of California. +# Copyright (c) 1994-1998 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution of +# this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# auto_reset -- +# +# Destroy all cached information for auto-loading and auto-execution, so that +# the information gets recomputed the next time it's needed. Also delete any +# commands that are listed in the auto-load index. +# +# Arguments: +# None. + +proc auto_reset {} { + global auto_execs auto_index auto_path + if {[array exists auto_index]} { + foreach cmdName [array names auto_index] { + set fqcn [namespace which $cmdName] + if {$fqcn eq ""} { + continue + } + rename $fqcn {} + } + } + unset -nocomplain auto_execs auto_index ::tcl::auto_oldpath + if {[catch {llength $auto_path}]} { + set auto_path [list [info library]] + } elseif {[info library] ni $auto_path} { + lappend auto_path [info library] + } +} + +# tcl_findLibrary -- +# +# This is a utility for extensions that searches for a library directory +# using a canonical searching algorithm. A side effect is to source the +# initialization script and set a global library variable. +# +# Arguments: +# basename Prefix of the directory name, (e.g., "tk") +# version Version number of the package, (e.g., "8.0") +# patch Patchlevel of the package, (e.g., "8.0.3") +# initScript Initialization script to source (e.g., tk.tcl) +# enVarName environment variable to honor (e.g., TK_LIBRARY) +# varName Global variable to set when done (e.g., tk_library) + +proc tcl_findLibrary {basename version patch initScript enVarName varName} { + upvar #0 $varName the_library + global auto_path env tcl_platform + + set dirs {} + set errors {} + + # The C application may have hardwired a path, which we honor + + if {[info exists the_library] && $the_library ne ""} { + lappend dirs $the_library + } else { + # Do the canonical search + + # 1. From an environment variable, if it exists. Placing this first + # gives the end-user ultimate control to work-around any bugs, or + # to customize. + + if {[info exists env($enVarName)]} { + lappend dirs $env($enVarName) + } + + # 2. In the package script directory registered within the + # configuration of the package itself. + + catch { + lappend dirs [::${basename}::pkgconfig get scriptdir,runtime] + } + + # 3. Relative to auto_path directories. This checks relative to the + # Tcl library as well as allowing loading of libraries added to the + # auto_path that is not relative to the core library or binary paths. + foreach d $auto_path { + lappend dirs [file join $d $basename$version] + if {$tcl_platform(platform) eq "unix" + && $tcl_platform(os) eq "Darwin"} { + # 4. On MacOSX, check the Resources/Scripts subdir too + lappend dirs [file join $d $basename$version Resources Scripts] + } + } + + # 3. Various locations relative to the executable + # ../lib/foo1.0 (From bin directory in install hierarchy) + # ../../lib/foo1.0 (From bin/arch directory in install hierarchy) + # ../library (From unix directory in build hierarchy) + # + # Remaining locations are out of date (when relevant, they ought to be + # covered by the $::auto_path seach above) and disabled. + # + # ../../library (From unix/arch directory in build hierarchy) + # ../../foo1.0.1/library + # (From unix directory in parallel build hierarchy) + # ../../../foo1.0.1/library + # (From unix/arch directory in parallel build hierarchy) + + set parentDir [file dirname [file dirname [info nameofexecutable]]] + set grandParentDir [file dirname $parentDir] + lappend dirs [file join $parentDir lib $basename$version] + lappend dirs [file join $grandParentDir lib $basename$version] + lappend dirs [file join $parentDir library] + if {0} { + lappend dirs [file join $grandParentDir library] + lappend dirs [file join $grandParentDir $basename$patch library] + lappend dirs [file join [file dirname $grandParentDir] \ + $basename$patch library] + } + } + # uniquify $dirs in order + array set seen {} + foreach i $dirs { + # Make sure $i is unique under normalization. Avoid repeated [source]. + if {[interp issafe]} { + # Safe interps have no [file normalize]. + set norm $i + } else { + set norm [file normalize $i] + } + if {[info exists seen($norm)]} { + continue + } + set seen($norm) {} + + set the_library $i + set file [file join $i $initScript] + + # source everything when in a safe interpreter because we have a + # source command, but no file exists command + + if {[interp issafe] || [file exists $file]} { + if {![catch {uplevel #0 [list source $file]} msg opts]} { + return + } + append errors "$file: $msg\n" + append errors [dict get $opts -errorinfo]\n + } + } + unset -nocomplain the_library + set msg "Can't find a usable $initScript in the following directories: \n" + append msg " $dirs\n\n" + append msg "$errors\n\n" + append msg "This probably means that $basename wasn't installed properly.\n" + error $msg +} + + +# ---------------------------------------------------------------------- +# auto_mkindex +# ---------------------------------------------------------------------- +# The following procedures are used to generate the tclIndex file from Tcl +# source files. They use a special safe interpreter to parse Tcl source +# files, writing out index entries as "proc" commands are encountered. This +# implementation won't work in a safe interpreter, since a safe interpreter +# can't create the special parser and mess with its commands. + +if {[interp issafe]} { + return ;# Stop sourcing the file here +} + +# auto_mkindex -- +# Regenerate a tclIndex file from Tcl source files. Takes as argument the +# name of the directory in which the tclIndex file is to be placed, followed +# by any number of glob patterns to use in that directory to locate all of the +# relevant files. +# +# Arguments: +# dir - Name of the directory in which to create an index. + +# args - Any number of additional arguments giving the names of files +# within dir. If no additional are given auto_mkindex will look +# for *.tcl. + +proc auto_mkindex {dir args} { + if {[interp issafe]} { + error "can't generate index within safe interpreter" + } + + set oldDir [pwd] + cd $dir + + append index "# Tcl autoload index file, version 2.0\n" + append index "# This file is generated by the \"auto_mkindex\" command\n" + append index "# and sourced to set up indexing information for one or\n" + append index "# more commands. Typically each line is a command that\n" + append index "# sets an element in the auto_index array, where the\n" + append index "# element name is the name of a command and the value is\n" + append index "# a script that loads the command.\n\n" + if {![llength $args]} { + set args *.tcl + } + + auto_mkindex_parser::init + foreach file [lsort [glob -- {*}$args]] { + try { + append index [auto_mkindex_parser::mkindex $file] + } on error {msg opts} { + cd $oldDir + return -options $opts $msg + } + } + auto_mkindex_parser::cleanup + + set fid [open "tclIndex" w] + puts -nonewline $fid $index + close $fid + cd $oldDir +} + +# Original version of auto_mkindex that just searches the source code for +# "proc" at the beginning of the line. + +proc auto_mkindex_old {dir args} { + set oldDir [pwd] + cd $dir + set dir [pwd] + append index "# Tcl autoload index file, version 2.0\n" + append index "# This file is generated by the \"auto_mkindex\" command\n" + append index "# and sourced to set up indexing information for one or\n" + append index "# more commands. Typically each line is a command that\n" + append index "# sets an element in the auto_index array, where the\n" + append index "# element name is the name of a command and the value is\n" + append index "# a script that loads the command.\n\n" + if {![llength $args]} { + set args *.tcl + } + foreach file [lsort [glob -- {*}$args]] { + set f "" + set error [catch { + set f [open $file] + fconfigure $f -eofchar "\032 {}" + while {[gets $f line] >= 0} { + if {[regexp {^proc[ ]+([^ ]*)} $line match procName]} { + set procName [lindex [auto_qualify $procName "::"] 0] + append index "set [list auto_index($procName)]" + append index " \[list source \[file join \$dir [list $file]\]\]\n" + } + } + close $f + } msg opts] + if {$error} { + catch {close $f} + cd $oldDir + return -options $opts $msg + } + } + set f "" + set error [catch { + set f [open tclIndex w] + puts -nonewline $f $index + close $f + cd $oldDir + } msg opts] + if {$error} { + catch {close $f} + cd $oldDir + error $msg $info $code + return -options $opts $msg + } +} + +# Create a safe interpreter that can be used to parse Tcl source files +# generate a tclIndex file for autoloading. This interp contains commands for +# things that need index entries. Each time a command is executed, it writes +# an entry out to the index file. + +namespace eval auto_mkindex_parser { + variable parser "" ;# parser used to build index + variable index "" ;# maintains index as it is built + variable scriptFile "" ;# name of file being processed + variable contextStack "" ;# stack of namespace scopes + variable imports "" ;# keeps track of all imported cmds + variable initCommands ;# list of commands that create aliases + if {![info exists initCommands]} { + set initCommands [list] + } + + proc init {} { + variable parser + variable initCommands + + if {![interp issafe]} { + set parser [interp create -safe] + $parser hide info + $parser hide rename + $parser hide proc + $parser hide namespace + $parser hide eval + $parser hide puts + foreach ns [$parser invokehidden namespace children ::] { + # MUST NOT DELETE "::tcl" OR BAD THINGS HAPPEN! + if {$ns eq "::tcl"} continue + $parser invokehidden namespace delete $ns + } + foreach cmd [$parser invokehidden info commands ::*] { + $parser invokehidden rename $cmd {} + } + $parser invokehidden proc unknown {args} {} + + # We'll need access to the "namespace" command within the + # interp. Put it back, but move it out of the way. + + $parser expose namespace + $parser invokehidden rename namespace _%@namespace + $parser expose eval + $parser invokehidden rename eval _%@eval + + # Install all the registered psuedo-command implementations + + foreach cmd $initCommands { + eval $cmd + } + } + } + proc cleanup {} { + variable parser + interp delete $parser + unset parser + } +} + +# auto_mkindex_parser::mkindex -- +# +# Used by the "auto_mkindex" command to create a "tclIndex" file for the given +# Tcl source file. Executes the commands in the file, and handles things like +# the "proc" command by adding an entry for the index file. Returns a string +# that represents the index file. +# +# Arguments: +# file Name of Tcl source file to be indexed. + +proc auto_mkindex_parser::mkindex {file} { + variable parser + variable index + variable scriptFile + variable contextStack + variable imports + + set scriptFile $file + + set fid [open $file] + fconfigure $fid -eofchar "\032 {}" + set contents [read $fid] + close $fid + + # There is one problem with sourcing files into the safe interpreter: + # references like "$x" will fail since code is not really being executed + # and variables do not really exist. To avoid this, we replace all $ with + # \0 (literally, the null char) later, when getting proc names we will + # have to reverse this replacement, in case there were any $ in the proc + # name. This will cause a problem if somebody actually tries to have a \0 + # in their proc name. Too bad for them. + set contents [string map [list \$ \0] $contents] + + set index "" + set contextStack "" + set imports "" + + $parser eval $contents + + foreach name $imports { + catch {$parser eval [list _%@namespace forget $name]} + } + return $index +} + +# auto_mkindex_parser::hook command +# +# Registers a Tcl command to evaluate when initializing the child interpreter +# used by the mkindex parser. The command is evaluated in the parent +# interpreter, and can use the variable auto_mkindex_parser::parser to get to +# the child + +proc auto_mkindex_parser::hook {cmd} { + variable initCommands + + lappend initCommands $cmd +} + +# auto_mkindex_parser::slavehook command +# +# Registers a Tcl command to evaluate when initializing the child interpreter +# used by the mkindex parser. The command is evaluated in the child +# interpreter. + +proc auto_mkindex_parser::slavehook {cmd} { + variable initCommands + + # The $parser variable is defined to be the name of the child interpreter + # when this command is used later. + + lappend initCommands "\$parser eval [list $cmd]" +} + +# auto_mkindex_parser::command -- +# +# Registers a new command with the "auto_mkindex_parser" interpreter that +# parses Tcl files. These commands are fake versions of things like the +# "proc" command. When you execute them, they simply write out an entry to a +# "tclIndex" file for auto-loading. +# +# This procedure allows extensions to register their own commands with the +# auto_mkindex facility. For example, a package like [incr Tcl] might +# register a "class" command so that class definitions could be added to a +# "tclIndex" file for auto-loading. +# +# Arguments: +# name Name of command recognized in Tcl files. +# arglist Argument list for command. +# body Implementation of command to handle indexing. + +proc auto_mkindex_parser::command {name arglist body} { + hook [list auto_mkindex_parser::commandInit $name $arglist $body] +} + +# auto_mkindex_parser::commandInit -- +# +# This does the actual work set up by auto_mkindex_parser::command. This is +# called when the interpreter used by the parser is created. +# +# Arguments: +# name Name of command recognized in Tcl files. +# arglist Argument list for command. +# body Implementation of command to handle indexing. + +proc auto_mkindex_parser::commandInit {name arglist body} { + variable parser + + set ns [namespace qualifiers $name] + set tail [namespace tail $name] + if {$ns eq ""} { + set fakeName [namespace current]::_%@fake_$tail + } else { + set fakeName [namespace current]::[string map {:: _} _%@fake_$name] + } + proc $fakeName $arglist $body + + # YUK! Tcl won't let us alias fully qualified command names, so we can't + # handle names like "::itcl::class". Instead, we have to build procs with + # the fully qualified names, and have the procs point to the aliases. + + if {[string match *::* $name]} { + set exportCmd [list _%@namespace export [namespace tail $name]] + $parser eval [list _%@namespace eval $ns $exportCmd] + + # The following proc definition does not work if you want to tolerate + # space or something else diabolical in the procedure name, (i.e., + # space in $alias). The following does not work: + # "_%@eval {$alias} \$args" + # because $alias gets concat'ed to $args. The following does not work + # because $cmd is somehow undefined + # "set cmd {$alias} \; _%@eval {\$cmd} \$args" + # A gold star to someone that can make test autoMkindex-3.3 work + # properly + + set alias [namespace tail $fakeName] + $parser invokehidden proc $name {args} "_%@eval {$alias} \$args" + $parser alias $alias $fakeName + } else { + $parser alias $name $fakeName + } + return +} + +# auto_mkindex_parser::fullname -- +# +# Used by commands like "proc" within the auto_mkindex parser. Returns the +# qualified namespace name for the "name" argument. If the "name" does not +# start with "::", elements are added from the current namespace stack to +# produce a qualified name. Then, the name is examined to see whether or not +# it should really be qualified. If the name has more than the leading "::", +# it is returned as a fully qualified name. Otherwise, it is returned as a +# simple name. That way, the Tcl autoloader will recognize it properly. +# +# Arguments: +# name - Name that is being added to index. + +proc auto_mkindex_parser::fullname {name} { + variable contextStack + + if {![string match ::* $name]} { + foreach ns $contextStack { + set name "${ns}::$name" + if {[string match ::* $name]} { + break + } + } + } + + if {[namespace qualifiers $name] eq ""} { + set name [namespace tail $name] + } elseif {![string match ::* $name]} { + set name "::$name" + } + + # Earlier, mkindex replaced all $'s with \0. Now, we have to reverse that + # replacement. + return [string map [list \0 \$] $name] +} + +# auto_mkindex_parser::indexEntry -- +# +# Used by commands like "proc" within the auto_mkindex parser to add a +# correctly-quoted entry to the index. This is shared code so it is done +# *right*, in one place. +# +# Arguments: +# name - Name that is being added to index. + +proc auto_mkindex_parser::indexEntry {name} { + variable index + variable scriptFile + + # We convert all metacharacters to their backslashed form, and pre-split + # the file name that we know about (which will be a proper list, and so + # correctly quoted). + + set name [string range [list \}[fullname $name]] 2 end] + set filenameParts [file split $scriptFile] + + append index [format \ + {set auto_index(%s) [list source [file join $dir %s]]%s} \ + $name $filenameParts \n] + return +} + +if {[llength $::auto_mkindex_parser::initCommands]} { + return +} + +# Register all of the procedures for the auto_mkindex parser that will build +# the "tclIndex" file. + +# AUTO MKINDEX: proc name arglist body +# Adds an entry to the auto index list for the given procedure name. + +auto_mkindex_parser::command proc {name args} { + indexEntry $name +} + +# Conditionally add support for Tcl byte code files. There are some tricky +# details here. First, we need to get the tbcload library initialized in the +# current interpreter. We cannot load tbcload into the child until we have +# done so because it needs access to the tcl_patchLevel variable. Second, +# because the package index file may defer loading the library until we invoke +# a command, we need to explicitly invoke auto_load to force it to be loaded. +# This should be a noop if the package has already been loaded + +auto_mkindex_parser::hook { + try { + package require tbcload + } on error {} { + # OK, don't have it so do nothing + } on ok {} { + if {[namespace which -command tbcload::bcproc] eq ""} { + auto_load tbcload::bcproc + } + load {} tbcload $auto_mkindex_parser::parser + + # AUTO MKINDEX: tbcload::bcproc name arglist body + # Adds an entry to the auto index list for the given pre-compiled + # procedure name. + + auto_mkindex_parser::commandInit tbcload::bcproc {name args} { + indexEntry $name + } + } +} + +# AUTO MKINDEX: namespace eval name command ?arg arg...? +# Adds the namespace name onto the context stack and evaluates the associated +# body of commands. +# +# AUTO MKINDEX: namespace import ?-force? pattern ?pattern...? +# Performs the "import" action in the parser interpreter. This is important +# for any commands contained in a namespace that affect the index. For +# example, a script may say "itcl::class ...", or it may import "itcl::*" and +# then say "class ...". This procedure does the import operation, but keeps +# track of imported patterns so we can remove the imports later. + +auto_mkindex_parser::command namespace {op args} { + switch -- $op { + eval { + variable parser + variable contextStack + + set name [lindex $args 0] + set args [lrange $args 1 end] + + set contextStack [linsert $contextStack 0 $name] + $parser eval [list _%@namespace eval $name] $args + set contextStack [lrange $contextStack 1 end] + } + import { + variable parser + variable imports + foreach pattern $args { + if {$pattern ne "-force"} { + lappend imports $pattern + } + } + catch {$parser eval "_%@namespace import $args"} + } + ensemble { + variable parser + variable contextStack + if {[lindex $args 0] eq "create"} { + set name ::[join [lreverse $contextStack] ::] + catch { + set name [dict get [lrange $args 1 end] -command] + if {![string match ::* $name]} { + set name ::[join [lreverse $contextStack] ::]$name + } + regsub -all ::+ $name :: name + } + # create artifical proc to force an entry in the tclIndex + $parser eval [list ::proc $name {} {}] + } + } + } +} + +# AUTO MKINDEX: oo::class create name ?definition? +# Adds an entry to the auto index list for the given class name. +auto_mkindex_parser::command oo::class {op name {body ""}} { + if {$op eq "create"} { + indexEntry $name + } +} +auto_mkindex_parser::command class {op name {body ""}} { + if {$op eq "create"} { + indexEntry $name + } +} + +return diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/clock.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/clock.tcl new file mode 100644 index 00000000..aa5d228b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/clock.tcl @@ -0,0 +1,4546 @@ +#---------------------------------------------------------------------- +# +# clock.tcl -- +# +# This file implements the portions of the [clock] ensemble that are +# coded in Tcl. Refer to the users' manual to see the description of +# the [clock] command and its subcommands. +# +# +#---------------------------------------------------------------------- +# +# Copyright (c) 2004-2007 Kevin B. Kenny +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +#---------------------------------------------------------------------- + +# We must have message catalogs that support the root locale, and we need +# access to the Registry on Windows systems. + +uplevel \#0 { + package require msgcat 1.6 + if { $::tcl_platform(platform) eq {windows} } { + if { [catch { package require registry 1.1 }] } { + namespace eval ::tcl::clock [list variable NoRegistry {}] + } + } +} + +# Put the library directory into the namespace for the ensemble so that the +# library code can find message catalogs and time zone definition files. + +namespace eval ::tcl::clock \ + [list variable LibDir [file dirname [info script]]] + +#---------------------------------------------------------------------- +# +# clock -- +# +# Manipulate times. +# +# The 'clock' command manipulates time. Refer to the user documentation for +# the available subcommands and what they do. +# +#---------------------------------------------------------------------- + +namespace eval ::tcl::clock { + + # Export the subcommands + + namespace export format + namespace export clicks + namespace export microseconds + namespace export milliseconds + namespace export scan + namespace export seconds + namespace export add + + # Import the message catalog commands that we use. + + namespace import ::msgcat::mcload + namespace import ::msgcat::mclocale + namespace import ::msgcat::mc + namespace import ::msgcat::mcpackagelocale + +} + +#---------------------------------------------------------------------- +# +# ::tcl::clock::Initialize -- +# +# Finish initializing the 'clock' subsystem +# +# Results: +# None. +# +# Side effects: +# Namespace variable in the 'clock' subsystem are initialized. +# +# The '::tcl::clock::Initialize' procedure initializes the namespace variables +# and root locale message catalog for the 'clock' subsystem. It is broken +# into a procedure rather than simply evaluated as a script so that it will be +# able to use local variables, avoiding the dangers of 'creative writing' as +# in Bug 1185933. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::Initialize {} { + + rename ::tcl::clock::Initialize {} + + variable LibDir + + # Define the Greenwich time zone + + proc InitTZData {} { + variable TZData + array unset TZData + set TZData(:Etc/GMT) { + {-9223372036854775808 0 0 GMT} + } + set TZData(:GMT) $TZData(:Etc/GMT) + set TZData(:Etc/UTC) { + {-9223372036854775808 0 0 UTC} + } + set TZData(:UTC) $TZData(:Etc/UTC) + set TZData(:localtime) {} + } + InitTZData + + mcpackagelocale set {} + ::msgcat::mcpackageconfig set mcfolder [file join $LibDir msgs] + ::msgcat::mcpackageconfig set unknowncmd "" + ::msgcat::mcpackageconfig set changecmd ChangeCurrentLocale + + # Define the message catalog for the root locale. + + ::msgcat::mcmset {} { + AM {am} + BCE {B.C.E.} + CE {C.E.} + DATE_FORMAT {%m/%d/%Y} + DATE_TIME_FORMAT {%a %b %e %H:%M:%S %Y} + DAYS_OF_WEEK_ABBREV { + Sun Mon Tue Wed Thu Fri Sat + } + DAYS_OF_WEEK_FULL { + Sunday Monday Tuesday Wednesday Thursday Friday Saturday + } + GREGORIAN_CHANGE_DATE 2299161 + LOCALE_DATE_FORMAT {%m/%d/%Y} + LOCALE_DATE_TIME_FORMAT {%a %b %e %H:%M:%S %Y} + LOCALE_ERAS {} + LOCALE_NUMERALS { + 00 01 02 03 04 05 06 07 08 09 + 10 11 12 13 14 15 16 17 18 19 + 20 21 22 23 24 25 26 27 28 29 + 30 31 32 33 34 35 36 37 38 39 + 40 41 42 43 44 45 46 47 48 49 + 50 51 52 53 54 55 56 57 58 59 + 60 61 62 63 64 65 66 67 68 69 + 70 71 72 73 74 75 76 77 78 79 + 80 81 82 83 84 85 86 87 88 89 + 90 91 92 93 94 95 96 97 98 99 + } + LOCALE_TIME_FORMAT {%H:%M:%S} + LOCALE_YEAR_FORMAT {%EC%Ey} + MONTHS_ABBREV { + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + } + MONTHS_FULL { + January February March + April May June + July August September + October November December + } + PM {pm} + TIME_FORMAT {%H:%M:%S} + TIME_FORMAT_12 {%I:%M:%S %P} + TIME_FORMAT_24 {%H:%M} + TIME_FORMAT_24_SECS {%H:%M:%S} + } + + # Define a few Gregorian change dates for other locales. In most cases + # the change date follows a language, because a nation's colonies changed + # at the same time as the nation itself. In many cases, different + # national boundaries existed; the dominating rule is to follow the + # nation's capital. + + # Italy, Spain, Portugal, Poland + + ::msgcat::mcset it GREGORIAN_CHANGE_DATE 2299161 + ::msgcat::mcset es GREGORIAN_CHANGE_DATE 2299161 + ::msgcat::mcset pt GREGORIAN_CHANGE_DATE 2299161 + ::msgcat::mcset pl GREGORIAN_CHANGE_DATE 2299161 + + # France, Austria + + ::msgcat::mcset fr GREGORIAN_CHANGE_DATE 2299227 + + # For Belgium, we follow Southern Netherlands; Liege Diocese changed + # several weeks later. + + ::msgcat::mcset fr_BE GREGORIAN_CHANGE_DATE 2299238 + ::msgcat::mcset nl_BE GREGORIAN_CHANGE_DATE 2299238 + + # Austria + + ::msgcat::mcset de_AT GREGORIAN_CHANGE_DATE 2299527 + + # Hungary + + ::msgcat::mcset hu GREGORIAN_CHANGE_DATE 2301004 + + # Germany, Norway, Denmark (Catholic Germany changed earlier) + + ::msgcat::mcset de_DE GREGORIAN_CHANGE_DATE 2342032 + ::msgcat::mcset nb GREGORIAN_CHANGE_DATE 2342032 + ::msgcat::mcset nn GREGORIAN_CHANGE_DATE 2342032 + ::msgcat::mcset no GREGORIAN_CHANGE_DATE 2342032 + ::msgcat::mcset da GREGORIAN_CHANGE_DATE 2342032 + + # Holland (Brabant, Gelderland, Flanders, Friesland, etc. changed at + # various times) + + ::msgcat::mcset nl GREGORIAN_CHANGE_DATE 2342165 + + # Protestant Switzerland (Catholic cantons changed earlier) + + ::msgcat::mcset fr_CH GREGORIAN_CHANGE_DATE 2361342 + ::msgcat::mcset it_CH GREGORIAN_CHANGE_DATE 2361342 + ::msgcat::mcset de_CH GREGORIAN_CHANGE_DATE 2361342 + + # English speaking countries + + ::msgcat::mcset en GREGORIAN_CHANGE_DATE 2361222 + + # Sweden (had several changes onto and off of the Gregorian calendar) + + ::msgcat::mcset sv GREGORIAN_CHANGE_DATE 2361390 + + # Russia + + ::msgcat::mcset ru GREGORIAN_CHANGE_DATE 2421639 + + # Romania (Transylvania changed earler - perhaps de_RO should show the + # earlier date?) + + ::msgcat::mcset ro GREGORIAN_CHANGE_DATE 2422063 + + # Greece + + ::msgcat::mcset el GREGORIAN_CHANGE_DATE 2423480 + + #------------------------------------------------------------------ + # + # CONSTANTS + # + #------------------------------------------------------------------ + + # Paths at which binary time zone data for the Olson libraries are known + # to reside on various operating systems + + variable ZoneinfoPaths {} + foreach path { + /usr/share/zoneinfo + /usr/share/lib/zoneinfo + /usr/lib/zoneinfo + /usr/local/etc/zoneinfo + } { + if { [file isdirectory $path] } { + lappend ZoneinfoPaths $path + } + } + + # Define the directories for time zone data and message catalogs. + + variable DataDir [file join $LibDir tzdata] + + # Number of days in the months, in common years and leap years. + + variable DaysInRomanMonthInCommonYear \ + { 31 28 31 30 31 30 31 31 30 31 30 31 } + variable DaysInRomanMonthInLeapYear \ + { 31 29 31 30 31 30 31 31 30 31 30 31 } + variable DaysInPriorMonthsInCommonYear [list 0] + variable DaysInPriorMonthsInLeapYear [list 0] + set i 0 + foreach j $DaysInRomanMonthInCommonYear { + lappend DaysInPriorMonthsInCommonYear [incr i $j] + } + set i 0 + foreach j $DaysInRomanMonthInLeapYear { + lappend DaysInPriorMonthsInLeapYear [incr i $j] + } + + # Another epoch (Hi, Jeff!) + + variable Roddenberry 1946 + + # Integer ranges + + variable MINWIDE -9223372036854775808 + variable MAXWIDE 9223372036854775807 + + # Day before Leap Day + + variable FEB_28 58 + + # Translation table to map Windows TZI onto cities, so that the Olson + # rules can apply. In some cases the mapping is ambiguous, so it's wise + # to specify $::env(TCL_TZ) rather than simply depending on the system + # time zone. + + # The keys are long lists of values obtained from the time zone + # information in the Registry. In order, the list elements are: + # Bias StandardBias DaylightBias + # StandardDate.wYear StandardDate.wMonth StandardDate.wDayOfWeek + # StandardDate.wDay StandardDate.wHour StandardDate.wMinute + # StandardDate.wSecond StandardDate.wMilliseconds + # DaylightDate.wYear DaylightDate.wMonth DaylightDate.wDayOfWeek + # DaylightDate.wDay DaylightDate.wHour DaylightDate.wMinute + # DaylightDate.wSecond DaylightDate.wMilliseconds + # The values are the names of time zones where those rules apply. There + # is considerable ambiguity in certain zones; an attempt has been made to + # make a reasonable guess, but this table needs to be taken with a grain + # of salt. + + variable WinZoneInfo [dict create {*}{ + {-43200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Kwajalein + {-39600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Midway + {-36000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Honolulu + {-32400 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Anchorage + {-28800 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Los_Angeles + {-28800 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Tijuana + {-25200 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Denver + {-25200 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Chihuahua + {-25200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Phoenix + {-21600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Regina + {-21600 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Chicago + {-21600 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Mexico_City + {-18000 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/New_York + {-18000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Indianapolis + {-14400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Caracas + {-14400 0 3600 0 3 6 2 23 59 59 999 0 10 6 2 23 59 59 999} + :America/Santiago + {-14400 0 3600 0 2 0 5 2 0 0 0 0 11 0 1 2 0 0 0} :America/Manaus + {-14400 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Halifax + {-12600 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/St_Johns + {-10800 0 3600 0 2 0 2 2 0 0 0 0 10 0 3 2 0 0 0} :America/Sao_Paulo + {-10800 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Godthab + {-10800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Buenos_Aires + {-10800 0 3600 0 2 0 5 2 0 0 0 0 11 0 1 2 0 0 0} :America/Bahia + {-10800 0 3600 0 3 0 2 2 0 0 0 0 10 0 1 2 0 0 0} :America/Montevideo + {-7200 0 3600 0 9 0 5 2 0 0 0 0 3 0 5 2 0 0 0} :America/Noronha + {-3600 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Atlantic/Azores + {-3600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Atlantic/Cape_Verde + {0 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :UTC + {0 0 3600 0 10 0 5 2 0 0 0 0 3 0 5 1 0 0 0} :Europe/London + {3600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Africa/Kinshasa + {3600 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :CET + {7200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Africa/Harare + {7200 0 3600 0 9 4 5 23 59 59 0 0 4 4 5 23 59 59 0} + :Africa/Cairo + {7200 0 3600 0 10 0 5 4 0 0 0 0 3 0 5 3 0 0 0} :Europe/Helsinki + {7200 0 3600 0 9 0 3 2 0 0 0 0 3 5 5 2 0 0 0} :Asia/Jerusalem + {7200 0 3600 0 9 0 5 1 0 0 0 0 3 0 5 0 0 0 0} :Europe/Bucharest + {7200 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Europe/Athens + {7200 0 3600 0 9 5 5 1 0 0 0 0 3 4 5 0 0 0 0} :Asia/Amman + {7200 0 3600 0 10 6 5 23 59 59 999 0 3 0 5 0 0 0 0} + :Asia/Beirut + {7200 0 -3600 0 4 0 1 2 0 0 0 0 9 0 1 2 0 0 0} :Africa/Windhoek + {10800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Riyadh + {10800 0 3600 0 10 0 1 4 0 0 0 0 4 0 1 3 0 0 0} :Asia/Baghdad + {10800 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Europe/Moscow + {12600 0 3600 0 9 2 4 2 0 0 0 0 3 0 1 2 0 0 0} :Asia/Tehran + {14400 0 3600 0 10 0 5 5 0 0 0 0 3 0 5 4 0 0 0} :Asia/Baku + {14400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Muscat + {14400 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Tbilisi + {16200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Kabul + {18000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Karachi + {18000 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Yekaterinburg + {19800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Calcutta + {20700 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Katmandu + {21600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Dhaka + {21600 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Novosibirsk + {23400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Rangoon + {25200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Bangkok + {25200 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Krasnoyarsk + {28800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Chongqing + {28800 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Irkutsk + {32400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Tokyo + {32400 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Yakutsk + {34200 0 3600 0 3 0 5 3 0 0 0 0 10 0 5 2 0 0 0} :Australia/Adelaide + {34200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Australia/Darwin + {36000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Australia/Brisbane + {36000 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Vladivostok + {36000 0 3600 0 3 0 5 3 0 0 0 0 10 0 1 2 0 0 0} :Australia/Hobart + {36000 0 3600 0 3 0 5 3 0 0 0 0 10 0 5 2 0 0 0} :Australia/Sydney + {39600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Noumea + {43200 0 3600 0 3 0 3 3 0 0 0 0 10 0 1 2 0 0 0} :Pacific/Auckland + {43200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Fiji + {46800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Tongatapu + }] + + # Groups of fields that specify the date, priorities, and code bursts that + # determine Julian Day Number given those groups. The code in [clock + # scan] will choose the highest priority (lowest numbered) set of fields + # that determines the date. + + variable DateParseActions { + + { seconds } 0 {} + + { julianDay } 1 {} + + { era century yearOfCentury month dayOfMonth } 2 { + dict set date year [expr { 100 * [dict get $date century] + + [dict get $date yearOfCentury] }] + set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ + $changeover] + } + { era century yearOfCentury dayOfYear } 2 { + dict set date year [expr { 100 * [dict get $date century] + + [dict get $date yearOfCentury] }] + set date [GetJulianDayFromEraYearDay $date[set date {}] \ + $changeover] + } + + { century yearOfCentury month dayOfMonth } 3 { + dict set date era CE + dict set date year [expr { 100 * [dict get $date century] + + [dict get $date yearOfCentury] }] + set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ + $changeover] + } + { century yearOfCentury dayOfYear } 3 { + dict set date era CE + dict set date year [expr { 100 * [dict get $date century] + + [dict get $date yearOfCentury] }] + set date [GetJulianDayFromEraYearDay $date[set date {}] \ + $changeover] + } + { iso8601Century iso8601YearOfCentury iso8601Week dayOfWeek } 3 { + dict set date era CE + dict set date iso8601Year \ + [expr { 100 * [dict get $date iso8601Century] + + [dict get $date iso8601YearOfCentury] }] + set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \ + $changeover] + } + + { yearOfCentury month dayOfMonth } 4 { + set date [InterpretTwoDigitYear $date[set date {}] $baseTime] + dict set date era CE + set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ + $changeover] + } + { yearOfCentury dayOfYear } 4 { + set date [InterpretTwoDigitYear $date[set date {}] $baseTime] + dict set date era CE + set date [GetJulianDayFromEraYearDay $date[set date {}] \ + $changeover] + } + { iso8601YearOfCentury iso8601Week dayOfWeek } 4 { + set date [InterpretTwoDigitYear \ + $date[set date {}] $baseTime \ + iso8601YearOfCentury iso8601Year] + dict set date era CE + set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \ + $changeover] + } + + { month dayOfMonth } 5 { + set date [AssignBaseYear $date[set date {}] \ + $baseTime $timeZone $changeover] + set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ + $changeover] + } + { dayOfYear } 5 { + set date [AssignBaseYear $date[set date {}] \ + $baseTime $timeZone $changeover] + set date [GetJulianDayFromEraYearDay $date[set date {}] \ + $changeover] + } + { iso8601Week dayOfWeek } 5 { + set date [AssignBaseIso8601Year $date[set date {}] \ + $baseTime $timeZone $changeover] + set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \ + $changeover] + } + + { dayOfMonth } 6 { + set date [AssignBaseMonth $date[set date {}] \ + $baseTime $timeZone $changeover] + set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ + $changeover] + } + + { dayOfWeek } 7 { + set date [AssignBaseWeek $date[set date {}] \ + $baseTime $timeZone $changeover] + set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \ + $changeover] + } + + {} 8 { + set date [AssignBaseJulianDay $date[set date {}] \ + $baseTime $timeZone $changeover] + } + } + + # Groups of fields that specify time of day, priorities, and code that + # processes them + + variable TimeParseActions { + + seconds 1 {} + + { hourAMPM minute second amPmIndicator } 2 { + dict set date secondOfDay [InterpretHMSP $date] + } + { hour minute second } 2 { + dict set date secondOfDay [InterpretHMS $date] + } + + { hourAMPM minute amPmIndicator } 3 { + dict set date second 0 + dict set date secondOfDay [InterpretHMSP $date] + } + { hour minute } 3 { + dict set date second 0 + dict set date secondOfDay [InterpretHMS $date] + } + + { hourAMPM amPmIndicator } 4 { + dict set date minute 0 + dict set date second 0 + dict set date secondOfDay [InterpretHMSP $date] + } + { hour } 4 { + dict set date minute 0 + dict set date second 0 + dict set date secondOfDay [InterpretHMS $date] + } + + { } 5 { + dict set date secondOfDay 0 + } + } + + # Legacy time zones, used primarily for parsing RFC822 dates. + + variable LegacyTimeZone [dict create \ + gmt +0000 \ + ut +0000 \ + utc +0000 \ + bst +0100 \ + wet +0000 \ + wat -0100 \ + at -0200 \ + nft -0330 \ + nst -0330 \ + ndt -0230 \ + ast -0400 \ + adt -0300 \ + est -0500 \ + edt -0400 \ + cst -0600 \ + cdt -0500 \ + mst -0700 \ + mdt -0600 \ + pst -0800 \ + pdt -0700 \ + yst -0900 \ + ydt -0800 \ + hst -1000 \ + hdt -0900 \ + cat -1000 \ + ahst -1000 \ + nt -1100 \ + idlw -1200 \ + cet +0100 \ + cest +0200 \ + met +0100 \ + mewt +0100 \ + mest +0200 \ + swt +0100 \ + sst +0200 \ + fwt +0100 \ + fst +0200 \ + eet +0200 \ + eest +0300 \ + bt +0300 \ + it +0330 \ + zp4 +0400 \ + zp5 +0500 \ + ist +0530 \ + zp6 +0600 \ + wast +0700 \ + wadt +0800 \ + jt +0730 \ + cct +0800 \ + jst +0900 \ + kst +0900 \ + cast +0930 \ + jdt +1000 \ + kdt +1000 \ + cadt +1030 \ + east +1000 \ + eadt +1030 \ + gst +1000 \ + nzt +1200 \ + nzst +1200 \ + nzdt +1300 \ + idle +1200 \ + a +0100 \ + b +0200 \ + c +0300 \ + d +0400 \ + e +0500 \ + f +0600 \ + g +0700 \ + h +0800 \ + i +0900 \ + k +1000 \ + l +1100 \ + m +1200 \ + n -0100 \ + o -0200 \ + p -0300 \ + q -0400 \ + r -0500 \ + s -0600 \ + t -0700 \ + u -0800 \ + v -0900 \ + w -1000 \ + x -1100 \ + y -1200 \ + z +0000 \ + ] + + # Caches + + variable LocaleNumeralCache {}; # Dictionary whose keys are locale + # names and whose values are pairs + # comprising regexes matching numerals + # in the given locales and dictionaries + # mapping the numerals to their numeric + # values. + # variable CachedSystemTimeZone; # If 'CachedSystemTimeZone' exists, + # it contains the value of the + # system time zone, as determined from + # the environment. + variable TimeZoneBad {}; # Dictionary whose keys are time zone + # names and whose values are 1 if + # the time zone is unknown and 0 + # if it is known. + variable TZData; # Array whose keys are time zone names + # and whose values are lists of quads + # comprising start time, UTC offset, + # Daylight Saving Time indicator, and + # time zone abbreviation. + variable FormatProc; # Array mapping format group + # and locale to the name of a procedure + # that renders the given format +} +::tcl::clock::Initialize + +#---------------------------------------------------------------------- +# +# clock format -- +# +# Formats a count of seconds since the Posix Epoch as a time of day. +# +# The 'clock format' command formats times of day for output. Refer to the +# user documentation to see what it does. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::format { args } { + + variable FormatProc + variable TZData + + lassign [ParseFormatArgs {*}$args] format locale timezone + set locale [string tolower $locale] + set clockval [lindex $args 0] + + # Get the data for time changes in the given zone + + if {$timezone eq ""} { + set timezone [GetSystemTimeZone] + } + if {![info exists TZData($timezone)]} { + if {[catch {SetupTimeZone $timezone} retval opts]} { + dict unset opts -errorinfo + return -options $opts $retval + } + } + + # Build a procedure to format the result. Cache the built procedure's name + # in the 'FormatProc' array to avoid losing its internal representation, + # which contains the name resolution. + + set procName formatproc'$format'$locale + set procName [namespace current]::[string map {: {\:} \\ {\\}} $procName] + if {[info exists FormatProc($procName)]} { + set procName $FormatProc($procName) + } else { + set FormatProc($procName) \ + [ParseClockFormatFormat $procName $format $locale] + } + + return [$procName $clockval $timezone] + +} + +#---------------------------------------------------------------------- +# +# ParseClockFormatFormat -- +# +# Builds and caches a procedure that formats a time value. +# +# Parameters: +# format -- Format string to use +# locale -- Locale in which the format string is to be interpreted +# +# Results: +# Returns the name of the newly-built procedure. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ParseClockFormatFormat {procName format locale} { + + if {[namespace which $procName] ne {}} { + return $procName + } + + # Map away the locale-dependent composite format groups + + EnterLocale $locale + + # Change locale if a fresh locale has been given on the command line. + + try { + return [ParseClockFormatFormat2 $format $locale $procName] + } trap CLOCK {result opts} { + dict unset opts -errorinfo + return -options $opts $result + } +} + +proc ::tcl::clock::ParseClockFormatFormat2 {format locale procName} { + set didLocaleEra 0 + set didLocaleNumerals 0 + set preFormatCode \ + [string map [list @GREGORIAN_CHANGE_DATE@ \ + [mc GREGORIAN_CHANGE_DATE]] \ + { + variable TZData + set date [GetDateFields $clockval \ + $TZData($timezone) \ + @GREGORIAN_CHANGE_DATE@] + }] + set formatString {} + set substituents {} + set state {} + + set format [LocalizeFormat $locale $format] + + foreach char [split $format {}] { + switch -exact -- $state { + {} { + if { [string equal % $char] } { + set state percent + } else { + append formatString $char + } + } + percent { # Character following a '%' character + set state {} + switch -exact -- $char { + % { # A literal character, '%' + append formatString %% + } + a { # Day of week, abbreviated + append formatString %s + append substituents \ + [string map \ + [list @DAYS_OF_WEEK_ABBREV@ \ + [list [mc DAYS_OF_WEEK_ABBREV]]] \ + { [lindex @DAYS_OF_WEEK_ABBREV@ \ + [expr {[dict get $date dayOfWeek] \ + % 7}]]}] + } + A { # Day of week, spelt out. + append formatString %s + append substituents \ + [string map \ + [list @DAYS_OF_WEEK_FULL@ \ + [list [mc DAYS_OF_WEEK_FULL]]] \ + { [lindex @DAYS_OF_WEEK_FULL@ \ + [expr {[dict get $date dayOfWeek] \ + % 7}]]}] + } + b - h { # Name of month, abbreviated. + append formatString %s + append substituents \ + [string map \ + [list @MONTHS_ABBREV@ \ + [list [mc MONTHS_ABBREV]]] \ + { [lindex @MONTHS_ABBREV@ \ + [expr {[dict get $date month]-1}]]}] + } + B { # Name of month, spelt out + append formatString %s + append substituents \ + [string map \ + [list @MONTHS_FULL@ \ + [list [mc MONTHS_FULL]]] \ + { [lindex @MONTHS_FULL@ \ + [expr {[dict get $date month]-1}]]}] + } + C { # Century number + append formatString %02d + append substituents \ + { [expr {[dict get $date year] / 100}]} + } + d { # Day of month, with leading zero + append formatString %02d + append substituents { [dict get $date dayOfMonth]} + } + e { # Day of month, without leading zero + append formatString %2d + append substituents { [dict get $date dayOfMonth]} + } + E { # Format group in a locale-dependent + # alternative era + set state percentE + if {!$didLocaleEra} { + append preFormatCode \ + [string map \ + [list @LOCALE_ERAS@ \ + [list [mc LOCALE_ERAS]]] \ + { + set date [GetLocaleEra \ + $date[set date {}] \ + @LOCALE_ERAS@]}] \n + set didLocaleEra 1 + } + if {!$didLocaleNumerals} { + append preFormatCode \ + [list set localeNumerals \ + [mc LOCALE_NUMERALS]] \n + set didLocaleNumerals 1 + } + } + g { # Two-digit year relative to ISO8601 + # week number + append formatString %02d + append substituents \ + { [expr { [dict get $date iso8601Year] % 100 }]} + } + G { # Four-digit year relative to ISO8601 + # week number + append formatString %02d + append substituents { [dict get $date iso8601Year]} + } + H { # Hour in the 24-hour day, leading zero + append formatString %02d + append substituents \ + { [expr { [dict get $date localSeconds] \ + / 3600 % 24}]} + } + I { # Hour AM/PM, with leading zero + append formatString %02d + append substituents \ + { [expr { ( ( ( [dict get $date localSeconds] \ + % 86400 ) \ + + 86400 \ + - 3600 ) \ + / 3600 ) \ + % 12 + 1 }] } + } + j { # Day of year (001-366) + append formatString %03d + append substituents { [dict get $date dayOfYear]} + } + J { # Julian Day Number + append formatString %07ld + append substituents { [dict get $date julianDay]} + } + k { # Hour (0-23), no leading zero + append formatString %2d + append substituents \ + { [expr { [dict get $date localSeconds] + / 3600 + % 24 }]} + } + l { # Hour (12-11), no leading zero + append formatString %2d + append substituents \ + { [expr { ( ( ( [dict get $date localSeconds] + % 86400 ) + + 86400 + - 3600 ) + / 3600 ) + % 12 + 1 }]} + } + m { # Month number, leading zero + append formatString %02d + append substituents { [dict get $date month]} + } + M { # Minute of the hour, leading zero + append formatString %02d + append substituents \ + { [expr { [dict get $date localSeconds] + / 60 + % 60 }]} + } + n { # A literal newline + append formatString \n + } + N { # Month number, no leading zero + append formatString %2d + append substituents { [dict get $date month]} + } + O { # A format group in the locale's + # alternative numerals + set state percentO + if {!$didLocaleNumerals} { + append preFormatCode \ + [list set localeNumerals \ + [mc LOCALE_NUMERALS]] \n + set didLocaleNumerals 1 + } + } + p { # Localized 'AM' or 'PM' indicator + # converted to uppercase + append formatString %s + append preFormatCode \ + [list set AM [string toupper [mc AM]]] \n \ + [list set PM [string toupper [mc PM]]] \n + append substituents \ + { [expr {(([dict get $date localSeconds] + % 86400) < 43200) ? + $AM : $PM}]} + } + P { # Localized 'AM' or 'PM' indicator + append formatString %s + append preFormatCode \ + [list set am [mc AM]] \n \ + [list set pm [mc PM]] \n + append substituents \ + { [expr {(([dict get $date localSeconds] + % 86400) < 43200) ? + $am : $pm}]} + + } + Q { # Hi, Jeff! + append formatString %s + append substituents { [FormatStarDate $date]} + } + s { # Seconds from the Posix Epoch + append formatString %s + append substituents { [dict get $date seconds]} + } + S { # Second of the minute, with + # leading zero + append formatString %02d + append substituents \ + { [expr { [dict get $date localSeconds] + % 60 }]} + } + t { # A literal tab character + append formatString \t + } + u { # Day of the week (1-Monday, 7-Sunday) + append formatString %1d + append substituents { [dict get $date dayOfWeek]} + } + U { # Week of the year (00-53). The + # first Sunday of the year is the + # first day of week 01 + append formatString %02d + append preFormatCode { + set dow [dict get $date dayOfWeek] + if { $dow == 7 } { + set dow 0 + } + incr dow + set UweekNumber \ + [expr { ( [dict get $date dayOfYear] + - $dow + 7 ) + / 7 }] + } + append substituents { $UweekNumber} + } + V { # The ISO8601 week number + append formatString %02d + append substituents { [dict get $date iso8601Week]} + } + w { # Day of the week (0-Sunday, + # 6-Saturday) + append formatString %1d + append substituents \ + { [expr { [dict get $date dayOfWeek] % 7 }]} + } + W { # Week of the year (00-53). The first + # Monday of the year is the first day + # of week 01. + append preFormatCode { + set WweekNumber \ + [expr { ( [dict get $date dayOfYear] + - [dict get $date dayOfWeek] + + 7 ) + / 7 }] + } + append formatString %02d + append substituents { $WweekNumber} + } + y { # The two-digit year of the century + append formatString %02d + append substituents \ + { [expr { [dict get $date year] % 100 }]} + } + Y { # The four-digit year + append formatString %04d + append substituents { [dict get $date year]} + } + z { # The time zone as hours and minutes + # east (+) or west (-) of Greenwich + append formatString %s + append substituents { [FormatNumericTimeZone \ + [dict get $date tzOffset]]} + } + Z { # The name of the time zone + append formatString %s + append substituents { [dict get $date tzName]} + } + % { # A literal percent character + append formatString %% + } + default { # An unknown escape sequence + append formatString %% $char + } + } + } + percentE { # Character following %E + set state {} + switch -exact -- $char { + E { + append formatString %s + append substituents { } \ + [string map \ + [list @BCE@ [list [mc BCE]] \ + @CE@ [list [mc CE]]] \ + {[dict get {BCE @BCE@ CE @CE@} \ + [dict get $date era]]}] + } + C { # Locale-dependent era + append formatString %s + append substituents { [dict get $date localeEra]} + } + y { # Locale-dependent year of the era + append preFormatCode { + set y [dict get $date localeYear] + if { $y >= 0 && $y < 100 } { + set Eyear [lindex $localeNumerals $y] + } else { + set Eyear $y + } + } + append formatString %s + append substituents { $Eyear} + } + default { # Unknown %E format group + append formatString %%E $char + } + } + } + percentO { # Character following %O + set state {} + switch -exact -- $char { + d - e { # Day of the month in alternative + # numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [dict get $date dayOfMonth]]} + } + H - k { # Hour of the day in alternative + # numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [expr { [dict get $date localSeconds] + / 3600 + % 24 }]]} + } + I - l { # Hour (12-11) AM/PM in alternative + # numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [expr { ( ( ( [dict get $date localSeconds] + % 86400 ) + + 86400 + - 3600 ) + / 3600 ) + % 12 + 1 }]]} + } + m { # Month number in alternative numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals [dict get $date month]]} + } + M { # Minute of the hour in alternative + # numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [expr { [dict get $date localSeconds] + / 60 + % 60 }]]} + } + S { # Second of the minute in alternative + # numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [expr { [dict get $date localSeconds] + % 60 }]]} + } + u { # Day of the week (Monday=1,Sunday=7) + # in alternative numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [dict get $date dayOfWeek]]} + } + w { # Day of the week (Sunday=0,Saturday=6) + # in alternative numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [expr { [dict get $date dayOfWeek] % 7 }]]} + } + y { # Year of the century in alternative + # numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [expr { [dict get $date year] % 100 }]]} + } + default { # Unknown format group + append formatString %%O $char + } + } + } + } + } + + # Clean up any improperly terminated groups + + switch -exact -- $state { + percent { + append formatString %% + } + percentE { + append retval %%E + } + percentO { + append retval %%O + } + } + + proc $procName {clockval timezone} " + $preFormatCode + return \[::format [list $formatString] $substituents\] + " + + # puts [list $procName [info args $procName] [info body $procName]] + + return $procName +} + +#---------------------------------------------------------------------- +# +# clock scan -- +# +# Inputs a count of seconds since the Posix Epoch as a time of day. +# +# The 'clock format' command scans times of day on input. Refer to the user +# documentation to see what it does. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::scan { args } { + + set format {} + + # Check the count of args + + if { [llength $args] < 1 || [llength $args] % 2 != 1 } { + set cmdName "clock scan" + return -code error \ + -errorcode [list CLOCK wrongNumArgs] \ + "wrong \# args: should be\ + \"$cmdName string\ + ?-base seconds?\ + ?-format string? ?-gmt boolean?\ + ?-locale LOCALE? ?-timezone ZONE?\"" + } + + # Set defaults + + set base [clock seconds] + set string [lindex $args 0] + set format {} + set gmt 0 + set locale c + set timezone [GetSystemTimeZone] + + # Pick up command line options. + + foreach { flag value } [lreplace $args 0 0] { + set saw($flag) {} + switch -exact -- $flag { + -b - -ba - -bas - -base { + set base $value + } + -f - -fo - -for - -form - -forma - -format { + set format $value + } + -g - -gm - -gmt { + set gmt $value + } + -l - -lo - -loc - -loca - -local - -locale { + set locale [string tolower $value] + } + -t - -ti - -tim - -time - -timez - -timezo - -timezon - -timezone { + set timezone $value + } + default { + return -code error \ + -errorcode [list CLOCK badOption $flag] \ + "bad option \"$flag\",\ + must be -base, -format, -gmt, -locale or -timezone" + } + } + } + + # Check options for validity + + if { [info exists saw(-gmt)] && [info exists saw(-timezone)] } { + return -code error \ + -errorcode [list CLOCK gmtWithTimezone] \ + "cannot use -gmt and -timezone in same call" + } + if { [catch { expr { wide($base) } } result] } { + return -code error "expected integer but got \"$base\"" + } + if { ![string is boolean -strict $gmt] } { + return -code error "expected boolean value but got \"$gmt\"" + } elseif { $gmt } { + set timezone :GMT + } + + if { ![info exists saw(-format)] } { + # Perhaps someday we'll localize the legacy code. Right now, it's not + # localized. + if { [info exists saw(-locale)] } { + return -code error \ + -errorcode [list CLOCK flagWithLegacyFormat] \ + "legacy \[clock scan\] does not support -locale" + + } + return [FreeScan $string $base $timezone $locale] + } + + # Change locale if a fresh locale has been given on the command line. + + EnterLocale $locale + + try { + # Map away the locale-dependent composite format groups + + set scanner [ParseClockScanFormat $format $locale] + return [$scanner $string $base $timezone] + } trap CLOCK {result opts} { + # Conceal location of generation of expected errors + dict unset opts -errorinfo + return -options $opts $result + } +} + +#---------------------------------------------------------------------- +# +# FreeScan -- +# +# Scans a time in free format +# +# Parameters: +# string - String containing the time to scan +# base - Base time, expressed in seconds from the Epoch +# timezone - Default time zone in which the time will be expressed +# locale - (Unused) Name of the locale where the time will be scanned. +# +# Results: +# Returns the date and time extracted from the string in seconds from +# the epoch +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::FreeScan { string base timezone locale } { + + variable TZData + + # Get the data for time changes in the given zone + + try { + SetupTimeZone $timezone + } on error {retval opts} { + dict unset opts -errorinfo + return -options $opts $retval + } + + # Extract year, month and day from the base time for the parser to use as + # defaults + + set date [GetDateFields $base $TZData($timezone) 2361222] + dict set date secondOfDay [expr { + [dict get $date localSeconds] % 86400 + }] + + # Parse the date. The parser will return a list comprising date, time, + # time zone, relative month/day/seconds, relative weekday, ordinal month. + + try { + set scanned [Oldscan $string \ + [dict get $date year] \ + [dict get $date month] \ + [dict get $date dayOfMonth]] + lassign $scanned \ + parseDate parseTime parseZone parseRel \ + parseWeekday parseOrdinalMonth + } on error message { + return -code error \ + "unable to convert date-time string \"$string\": $message" + } + + # If the caller supplied a date in the string, update the 'date' dict with + # the value. If the caller didn't specify a time with the date, default to + # midnight. + + if { [llength $parseDate] > 0 } { + lassign $parseDate y m d + if { $y < 100 } { + if { $y >= 39 } { + incr y 1900 + } else { + incr y 2000 + } + } + dict set date era CE + dict set date year $y + dict set date month $m + dict set date dayOfMonth $d + if { $parseTime eq {} } { + set parseTime 0 + } + } + + # If the caller supplied a time zone in the string, it comes back as a + # two-element list; the first element is the number of minutes east of + # Greenwich, and the second is a Daylight Saving Time indicator (1 == yes, + # 0 == no, -1 == unknown). We make it into a time zone indicator of + # +-hhmm. + + if { [llength $parseZone] > 0 } { + lassign $parseZone minEast dstFlag + set timezone [FormatNumericTimeZone \ + [expr { 60 * $minEast + 3600 * $dstFlag }]] + SetupTimeZone $timezone + } + dict set date tzName $timezone + + # Assemble date, time, zone into seconds-from-epoch + + set date [GetJulianDayFromEraYearMonthDay $date[set date {}] 2361222] + if { $parseTime ne {} } { + dict set date secondOfDay $parseTime + } elseif { [llength $parseWeekday] != 0 + || [llength $parseOrdinalMonth] != 0 + || ( [llength $parseRel] != 0 + && ( [lindex $parseRel 0] != 0 + || [lindex $parseRel 1] != 0 ) ) } { + dict set date secondOfDay 0 + } + + dict set date localSeconds [expr { + -210866803200 + + ( 86400 * wide([dict get $date julianDay]) ) + + [dict get $date secondOfDay] + }] + dict set date tzName $timezone + set date [ConvertLocalToUTC $date[set date {}] $TZData($timezone) 2361222] + set seconds [dict get $date seconds] + + # Do relative times + + if { [llength $parseRel] > 0 } { + lassign $parseRel relMonth relDay relSecond + set seconds [add $seconds \ + $relMonth months $relDay days $relSecond seconds \ + -timezone $timezone -locale $locale] + } + + # Do relative weekday + + if { [llength $parseWeekday] > 0 } { + lassign $parseWeekday dayOrdinal dayOfWeek + set date2 [GetDateFields $seconds $TZData($timezone) 2361222] + dict set date2 era CE + set jdwkday [WeekdayOnOrBefore $dayOfWeek [expr { + [dict get $date2 julianDay] + 6 + }]] + incr jdwkday [expr { 7 * $dayOrdinal }] + if { $dayOrdinal > 0 } { + incr jdwkday -7 + } + dict set date2 secondOfDay \ + [expr { [dict get $date2 localSeconds] % 86400 }] + dict set date2 julianDay $jdwkday + dict set date2 localSeconds [expr { + -210866803200 + + ( 86400 * wide([dict get $date2 julianDay]) ) + + [dict get $date secondOfDay] + }] + dict set date2 tzName $timezone + set date2 [ConvertLocalToUTC $date2[set date2 {}] $TZData($timezone) \ + 2361222] + set seconds [dict get $date2 seconds] + + } + + # Do relative month + + if { [llength $parseOrdinalMonth] > 0 } { + lassign $parseOrdinalMonth monthOrdinal monthNumber + if { $monthOrdinal > 0 } { + set monthDiff [expr { $monthNumber - [dict get $date month] }] + if { $monthDiff <= 0 } { + incr monthDiff 12 + } + incr monthOrdinal -1 + } else { + set monthDiff [expr { [dict get $date month] - $monthNumber }] + if { $monthDiff >= 0 } { + incr monthDiff -12 + } + incr monthOrdinal + } + set seconds [add $seconds $monthOrdinal years $monthDiff months \ + -timezone $timezone -locale $locale] + } + + return $seconds +} + + +#---------------------------------------------------------------------- +# +# ParseClockScanFormat -- +# +# Parses a format string given to [clock scan -format] +# +# Parameters: +# formatString - The format being parsed +# locale - The current locale +# +# Results: +# Constructs and returns a procedure that accepts the string being +# scanned, the base time, and the time zone. The procedure will either +# return the scanned time or else throw an error that should be rethrown +# to the caller of [clock scan] +# +# Side effects: +# The given procedure is defined in the ::tcl::clock namespace. Scan +# procedures are not deleted once installed. +# +# Why do we parse dates by defining a procedure to parse them? The reason is +# that by doing so, we have one convenient place to cache all the information: +# the regular expressions that match the patterns (which will be compiled), +# the code that assembles the date information, everything lands in one place. +# In this way, when a given format is reused at run time, all the information +# of how to apply it is available in a single place. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ParseClockScanFormat {formatString locale} { + # Check whether the format has been parsed previously, and return the + # existing recognizer if it has. + + set procName scanproc'$formatString'$locale + set procName [namespace current]::[string map {: {\:} \\ {\\}} $procName] + if { [namespace which $procName] != {} } { + return $procName + } + + variable DateParseActions + variable TimeParseActions + + # Localize the %x, %X, etc. groups + + set formatString [LocalizeFormat $locale $formatString] + + # Condense whitespace + + regsub -all {[[:space:]]+} $formatString { } formatString + + # Walk through the groups of the format string. In this loop, we + # accumulate: + # - a regular expression that matches the string, + # - the count of capturing brackets in the regexp + # - a set of code that post-processes the fields captured by the regexp, + # - a dictionary whose keys are the names of fields that are present + # in the format string. + + set re {^[[:space:]]*} + set captureCount 0 + set postcode {} + set fieldSet [dict create] + set fieldCount 0 + set postSep {} + set state {} + + foreach c [split $formatString {}] { + switch -exact -- $state { + {} { + if { $c eq "%" } { + set state % + } elseif { $c eq " " } { + append re {[[:space:]]+} + } else { + if { ! [string is alnum $c] } { + append re "\\" + } + append re $c + } + } + % { + set state {} + switch -exact -- $c { + % { + append re % + } + { } { + append re "\[\[:space:\]\]*" + } + a - A { # Day of week, in words + set l {} + foreach \ + i {7 1 2 3 4 5 6} \ + abr [mc DAYS_OF_WEEK_ABBREV] \ + full [mc DAYS_OF_WEEK_FULL] { + dict set l [string tolower $abr] $i + dict set l [string tolower $full] $i + incr i + } + lassign [UniquePrefixRegexp $l] regex lookup + append re ( $regex ) + dict set fieldSet dayOfWeek [incr fieldCount] + append postcode "dict set date dayOfWeek \[" \ + "dict get " [list $lookup] " " \ + \[ {string tolower $field} [incr captureCount] \] \ + "\]\n" + } + b - B - h { # Name of month + set i 0 + set l {} + foreach \ + abr [mc MONTHS_ABBREV] \ + full [mc MONTHS_FULL] { + incr i + dict set l [string tolower $abr] $i + dict set l [string tolower $full] $i + } + lassign [UniquePrefixRegexp $l] regex lookup + append re ( $regex ) + dict set fieldSet month [incr fieldCount] + append postcode "dict set date month \[" \ + "dict get " [list $lookup] \ + " " \[ {string tolower $field} \ + [incr captureCount] \] \ + "\]\n" + } + C { # Gregorian century + append re \\s*(\\d\\d?) + dict set fieldSet century [incr fieldCount] + append postcode "dict set date century \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + d - e { # Day of month + append re \\s*(\\d\\d?) + dict set fieldSet dayOfMonth [incr fieldCount] + append postcode "dict set date dayOfMonth \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + E { # Prefix for locale-specific codes + set state %E + } + g { # ISO8601 2-digit year + append re \\s*(\\d\\d) + dict set fieldSet iso8601YearOfCentury \ + [incr fieldCount] + append postcode \ + "dict set date iso8601YearOfCentury \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + G { # ISO8601 4-digit year + append re \\s*(\\d\\d)(\\d\\d) + dict set fieldSet iso8601Century [incr fieldCount] + dict set fieldSet iso8601YearOfCentury \ + [incr fieldCount] + append postcode \ + "dict set date iso8601Century \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" \ + "dict set date iso8601YearOfCentury \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + H - k { # Hour of day + append re \\s*(\\d\\d?) + dict set fieldSet hour [incr fieldCount] + append postcode "dict set date hour \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + I - l { # Hour, AM/PM + append re \\s*(\\d\\d?) + dict set fieldSet hourAMPM [incr fieldCount] + append postcode "dict set date hourAMPM \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + j { # Day of year + append re \\s*(\\d\\d?\\d?) + dict set fieldSet dayOfYear [incr fieldCount] + append postcode "dict set date dayOfYear \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + J { # Julian Day Number + append re \\s*(\\d+) + dict set fieldSet julianDay [incr fieldCount] + append postcode "dict set date julianDay \[" \ + "::scan \$field" [incr captureCount] " %ld" \ + "\]\n" + } + m - N { # Month number + append re \\s*(\\d\\d?) + dict set fieldSet month [incr fieldCount] + append postcode "dict set date month \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + M { # Minute + append re \\s*(\\d\\d?) + dict set fieldSet minute [incr fieldCount] + append postcode "dict set date minute \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + n { # Literal newline + append re \\n + } + O { # Prefix for locale numerics + set state %O + } + p - P { # AM/PM indicator + set l [list [string tolower [mc AM]] 0 \ + [string tolower [mc PM]] 1] + lassign [UniquePrefixRegexp $l] regex lookup + append re ( $regex ) + dict set fieldSet amPmIndicator [incr fieldCount] + append postcode "dict set date amPmIndicator \[" \ + "dict get " [list $lookup] " \[string tolower " \ + "\$field" \ + [incr captureCount] \ + "\]\]\n" + } + Q { # Hi, Jeff! + append re {Stardate\s+([-+]?\d+)(\d\d\d)[.](\d)} + incr captureCount + dict set fieldSet seconds [incr fieldCount] + append postcode {dict set date seconds } \[ \ + {ParseStarDate $field} [incr captureCount] \ + { $field} [incr captureCount] \ + { $field} [incr captureCount] \ + \] \n + } + s { # Seconds from Posix Epoch + # This next case is insanely difficult, because it's + # problematic to determine whether the field is + # actually within the range of a wide integer. + append re {\s*([-+]?\d+)} + dict set fieldSet seconds [incr fieldCount] + append postcode {dict set date seconds } \[ \ + {ScanWide $field} [incr captureCount] \] \n + } + S { # Second + append re \\s*(\\d\\d?) + dict set fieldSet second [incr fieldCount] + append postcode "dict set date second \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + t { # Literal tab character + append re \\t + } + u - w { # Day number within week, 0 or 7 == Sun + # 1=Mon, 6=Sat + append re \\s*(\\d) + dict set fieldSet dayOfWeek [incr fieldCount] + append postcode {::scan $field} [incr captureCount] \ + { %d dow} \n \ + { + if { $dow == 0 } { + set dow 7 + } elseif { $dow > 7 } { + return -code error \ + -errorcode [list CLOCK badDayOfWeek] \ + "day of week is greater than 7" + } + dict set date dayOfWeek $dow + } + } + U { # Week of year. The first Sunday of + # the year is the first day of week + # 01. No scan rule uses this group. + append re \\s*\\d\\d? + } + V { # Week of ISO8601 year + + append re \\s*(\\d\\d?) + dict set fieldSet iso8601Week [incr fieldCount] + append postcode "dict set date iso8601Week \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + W { # Week of the year (00-53). The first + # Monday of the year is the first day + # of week 01. No scan rule uses this + # group. + append re \\s*\\d\\d? + } + y { # Two-digit Gregorian year + append re \\s*(\\d\\d?) + dict set fieldSet yearOfCentury [incr fieldCount] + append postcode "dict set date yearOfCentury \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + Y { # 4-digit Gregorian year + append re \\s*(\\d\\d)(\\d\\d) + dict set fieldSet century [incr fieldCount] + dict set fieldSet yearOfCentury [incr fieldCount] + append postcode \ + "dict set date century \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" \ + "dict set date yearOfCentury \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + z - Z { # Time zone name + append re {(?:([-+]\d\d(?::?\d\d(?::?\d\d)?)?)|([[:alnum:]]{1,4}))} + dict set fieldSet tzName [incr fieldCount] + append postcode \ + {if } \{ { $field} [incr captureCount] \ + { ne "" } \} { } \{ \n \ + {dict set date tzName $field} \ + $captureCount \n \ + \} { else } \{ \n \ + {dict set date tzName } \[ \ + {ConvertLegacyTimeZone $field} \ + [incr captureCount] \] \n \ + \} \n \ + } + % { # Literal percent character + append re % + } + default { + append re % + if { ! [string is alnum $c] } { + append re \\ + } + append re $c + } + } + } + %E { + switch -exact -- $c { + C { # Locale-dependent era + set d {} + foreach triple [mc LOCALE_ERAS] { + lassign $triple t symbol year + dict set d [string tolower $symbol] $year + } + lassign [UniquePrefixRegexp $d] regex lookup + append re (?: $regex ) + } + E { + set l {} + dict set l [string tolower [mc BCE]] BCE + dict set l [string tolower [mc CE]] CE + dict set l b.c.e. BCE + dict set l c.e. CE + dict set l b.c. BCE + dict set l a.d. CE + lassign [UniquePrefixRegexp $l] regex lookup + append re ( $regex ) + dict set fieldSet era [incr fieldCount] + append postcode "dict set date era \["\ + "dict get " [list $lookup] \ + { } \[ {string tolower $field} \ + [incr captureCount] \] \ + "\]\n" + } + y { # Locale-dependent year of the era + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + incr captureCount + } + default { + append re %E + if { ! [string is alnum $c] } { + append re \\ + } + append re $c + } + } + set state {} + } + %O { + switch -exact -- $c { + d - e { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet dayOfMonth [incr fieldCount] + append postcode "dict set date dayOfMonth \[" \ + "dict get " [list $lookup] " \$field" \ + [incr captureCount] \ + "\]\n" + } + H - k { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet hour [incr fieldCount] + append postcode "dict set date hour \[" \ + "dict get " [list $lookup] " \$field" \ + [incr captureCount] \ + "\]\n" + } + I - l { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet hourAMPM [incr fieldCount] + append postcode "dict set date hourAMPM \[" \ + "dict get " [list $lookup] " \$field" \ + [incr captureCount] \ + "\]\n" + } + m { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet month [incr fieldCount] + append postcode "dict set date month \[" \ + "dict get " [list $lookup] " \$field" \ + [incr captureCount] \ + "\]\n" + } + M { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet minute [incr fieldCount] + append postcode "dict set date minute \[" \ + "dict get " [list $lookup] " \$field" \ + [incr captureCount] \ + "\]\n" + } + S { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet second [incr fieldCount] + append postcode "dict set date second \[" \ + "dict get " [list $lookup] " \$field" \ + [incr captureCount] \ + "\]\n" + } + u - w { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet dayOfWeek [incr fieldCount] + append postcode "set dow \[dict get " [list $lookup] \ + { $field} [incr captureCount] \] \n \ + { + if { $dow == 0 } { + set dow 7 + } elseif { $dow > 7 } { + return -code error \ + -errorcode [list CLOCK badDayOfWeek] \ + "day of week is greater than 7" + } + dict set date dayOfWeek $dow + } + } + y { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet yearOfCentury [incr fieldCount] + append postcode {dict set date yearOfCentury } \[ \ + {dict get } [list $lookup] { $field} \ + [incr captureCount] \] \n + } + default { + append re %O + if { ! [string is alnum $c] } { + append re \\ + } + append re $c + } + } + set state {} + } + } + } + + # Clean up any unfinished format groups + + append re $state \\s*\$ + + # Build the procedure + + set procBody {} + append procBody "variable ::tcl::clock::TZData" \n + append procBody "if \{ !\[ regexp -nocase [list $re] \$string ->" + for { set i 1 } { $i <= $captureCount } { incr i } { + append procBody " " field $i + } + append procBody "\] \} \{" \n + append procBody { + return -code error -errorcode [list CLOCK badInputString] \ + {input string does not match supplied format} + } + append procBody \}\n + append procBody "set date \[dict create\]" \n + append procBody {dict set date tzName $timeZone} \n + append procBody $postcode + append procBody [list set changeover [mc GREGORIAN_CHANGE_DATE]] \n + + # Set up the time zone before doing anything with a default base date + # that might need a timezone to interpret it. + + if { ![dict exists $fieldSet seconds] + && ![dict exists $fieldSet starDate] } { + if { [dict exists $fieldSet tzName] } { + append procBody { + set timeZone [dict get $date tzName] + } + } + append procBody { + ::tcl::clock::SetupTimeZone $timeZone + } + } + + # Add code that gets Julian Day Number from the fields. + + append procBody [MakeParseCodeFromFields $fieldSet $DateParseActions] + + # Get time of day + + append procBody [MakeParseCodeFromFields $fieldSet $TimeParseActions] + + # Assemble seconds from the Julian day and second of the day. + # Convert to local time unless epoch seconds or stardate are + # being processed - they're always absolute + + if { ![dict exists $fieldSet seconds] + && ![dict exists $fieldSet starDate] } { + append procBody { + if { [dict get $date julianDay] > 5373484 } { + return -code error -errorcode [list CLOCK dateTooLarge] \ + "requested date too large to represent" + } + dict set date localSeconds [expr { + -210866803200 + + ( 86400 * wide([dict get $date julianDay]) ) + + [dict get $date secondOfDay] + }] + } + + # Finally, convert the date to local time + + append procBody { + set date [::tcl::clock::ConvertLocalToUTC $date[set date {}] \ + $TZData($timeZone) $changeover] + } + } + + # Return result + + append procBody {return [dict get $date seconds]} \n + + proc $procName { string baseTime timeZone } $procBody + + # puts [list proc $procName [list string baseTime timeZone] $procBody] + + return $procName +} + +#---------------------------------------------------------------------- +# +# LocaleNumeralMatcher -- +# +# Composes a regexp that captures the numerals in the given locale, and +# a dictionary to map them to conventional numerals. +# +# Parameters: +# locale - Name of the current locale +# +# Results: +# Returns a two-element list comprising the regexp and the dictionary. +# +# Side effects: +# Caches the result. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::LocaleNumeralMatcher {l} { + variable LocaleNumeralCache + + if { ![dict exists $LocaleNumeralCache $l] } { + set d {} + set i 0 + set sep \( + foreach n [mc LOCALE_NUMERALS] { + dict set d $n $i + regsub -all {[^[:alnum:]]} $n \\\\& subex + append re $sep $subex + set sep | + incr i + } + append re \) + dict set LocaleNumeralCache $l [list $re $d] + } + return [dict get $LocaleNumeralCache $l] +} + + + +#---------------------------------------------------------------------- +# +# UniquePrefixRegexp -- +# +# Composes a regexp that performs unique-prefix matching. The RE +# matches one of a supplied set of strings, or any unique prefix +# thereof. +# +# Parameters: +# data - List of alternating match-strings and values. +# Match-strings with distinct values are considered +# distinct. +# +# Results: +# Returns a two-element list. The first is a regexp that matches any +# unique prefix of any of the strings. The second is a dictionary whose +# keys are match values from the regexp and whose values are the +# corresponding values from 'data'. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::UniquePrefixRegexp { data } { + # The 'successors' dictionary will contain, for each string that is a + # prefix of any key, all characters that may follow that prefix. The + # 'prefixMapping' dictionary will have keys that are prefixes of keys and + # values that correspond to the keys. + + set prefixMapping [dict create] + set successors [dict create {} {}] + + # Walk the key-value pairs + + foreach { key value } $data { + # Construct all prefixes of the key; + + set prefix {} + foreach char [split $key {}] { + set oldPrefix $prefix + dict set successors $oldPrefix $char {} + append prefix $char + + # Put the prefixes in the 'prefixMapping' and 'successors' + # dictionaries + + dict lappend prefixMapping $prefix $value + if { ![dict exists $successors $prefix] } { + dict set successors $prefix {} + } + } + } + + # Identify those prefixes that designate unique values, and those that are + # the full keys + + set uniquePrefixMapping {} + dict for { key valueList } $prefixMapping { + if { [llength $valueList] == 1 } { + dict set uniquePrefixMapping $key [lindex $valueList 0] + } + } + foreach { key value } $data { + dict set uniquePrefixMapping $key $value + } + + # Construct the re. + + return [list \ + [MakeUniquePrefixRegexp $successors $uniquePrefixMapping {}] \ + $uniquePrefixMapping] +} + +#---------------------------------------------------------------------- +# +# MakeUniquePrefixRegexp -- +# +# Service procedure for 'UniquePrefixRegexp' that constructs a regular +# expresison that matches the unique prefixes. +# +# Parameters: +# successors - Dictionary whose keys are all prefixes +# of keys passed to 'UniquePrefixRegexp' and whose +# values are dictionaries whose keys are the characters +# that may follow those prefixes. +# uniquePrefixMapping - Dictionary whose keys are the unique +# prefixes and whose values are not examined. +# prefixString - Current prefix being processed. +# +# Results: +# Returns a constructed regular expression that matches the set of +# unique prefixes beginning with the 'prefixString'. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::MakeUniquePrefixRegexp { successors + uniquePrefixMapping + prefixString } { + + # Get the characters that may follow the current prefix string + + set schars [lsort -ascii [dict keys [dict get $successors $prefixString]]] + if { [llength $schars] == 0 } { + return {} + } + + # If there is more than one successor character, or if the current prefix + # is a unique prefix, surround the generated re with non-capturing + # parentheses. + + set re {} + if { + [dict exists $uniquePrefixMapping $prefixString] + || [llength $schars] > 1 + } then { + append re "(?:" + } + + # Generate a regexp that matches the successors. + + set sep "" + foreach { c } $schars { + set nextPrefix $prefixString$c + regsub -all {[^[:alnum:]]} $c \\\\& rechar + append re $sep $rechar \ + [MakeUniquePrefixRegexp \ + $successors $uniquePrefixMapping $nextPrefix] + set sep | + } + + # If the current prefix is a unique prefix, make all following text + # optional. Otherwise, if there is more than one successor character, + # close the non-capturing parentheses. + + if { [dict exists $uniquePrefixMapping $prefixString] } { + append re ")?" + } elseif { [llength $schars] > 1 } { + append re ")" + } + + return $re +} + +#---------------------------------------------------------------------- +# +# MakeParseCodeFromFields -- +# +# Composes Tcl code to extract the Julian Day Number from a dictionary +# containing date fields. +# +# Parameters: +# dateFields -- Dictionary whose keys are fields of the date, +# and whose values are the rightmost positions +# at which those fields appear. +# parseActions -- List of triples: field set, priority, and +# code to emit. Smaller priorities are better, and +# the list must be in ascending order by priority +# +# Results: +# Returns a burst of code that extracts the day number from the given +# date. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::MakeParseCodeFromFields { dateFields parseActions } { + + set currPrio 999 + set currFieldPos [list] + set currCodeBurst { + error "in ::tcl::clock::MakeParseCodeFromFields: can't happen" + } + + foreach { fieldSet prio parseAction } $parseActions { + # If we've found an answer that's better than any that follow, quit + # now. + + if { $prio > $currPrio } { + break + } + + # Accumulate the field positions that are used in the current field + # grouping. + + set fieldPos [list] + set ok true + foreach field $fieldSet { + if { ! [dict exists $dateFields $field] } { + set ok 0 + break + } + lappend fieldPos [dict get $dateFields $field] + } + + # Quit if we don't have a complete set of fields + if { !$ok } { + continue + } + + # Determine whether the current answer is better than the last. + + set fPos [lsort -integer -decreasing $fieldPos] + + if { $prio == $currPrio } { + foreach currPos $currFieldPos newPos $fPos { + if { + ![string is integer $newPos] + || ![string is integer $currPos] + || $newPos > $currPos + } then { + break + } + if { $newPos < $currPos } { + set ok 0 + break + } + } + } + if { !$ok } { + continue + } + + # Remember the best possibility for extracting date information + + set currPrio $prio + set currFieldPos $fPos + set currCodeBurst $parseAction + } + + return $currCodeBurst +} + +#---------------------------------------------------------------------- +# +# EnterLocale -- +# +# Switch [mclocale] to a given locale if necessary +# +# Parameters: +# locale -- Desired locale +# +# Results: +# Returns the locale that was previously current. +# +# Side effects: +# Does [mclocale]. If necessary, loades the designated locale's files. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::EnterLocale { locale } { + if { $locale eq {system} } { + if { $::tcl_platform(platform) ne {windows} } { + # On a non-windows platform, the 'system' locale is the same as + # the 'current' locale + + set locale current + } else { + # On a windows platform, the 'system' locale is adapted from the + # 'current' locale by applying the date and time formats from the + # Control Panel. First, load the 'current' locale if it's not yet + # loaded + + mcpackagelocale set [mclocale] + + # Make a new locale string for the system locale, and get the + # Control Panel information + + set locale [mclocale]_windows + if { ! [mcpackagelocale present $locale] } { + LoadWindowsDateTimeFormats $locale + } + } + } + if { $locale eq {current}} { + set locale [mclocale] + } + # Eventually load the locale + mcpackagelocale set $locale +} + +#---------------------------------------------------------------------- +# +# LoadWindowsDateTimeFormats -- +# +# Load the date/time formats from the Control Panel in Windows and +# convert them so that they're usable by Tcl. +# +# Parameters: +# locale - Name of the locale in whose message catalog +# the converted formats are to be stored. +# +# Results: +# None. +# +# Side effects: +# Updates the given message catalog with the locale strings. +# +# Presumes that on entry, [mclocale] is set to the current locale, so that +# default strings can be obtained if the Registry query fails. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::LoadWindowsDateTimeFormats { locale } { + # Bail out if we can't find the Registry + + variable NoRegistry + if { [info exists NoRegistry] } return + + if { ![catch { + registry get "HKEY_CURRENT_USER\\Control Panel\\International" \ + sShortDate + } string] } { + set quote {} + set datefmt {} + foreach { unquoted quoted } [split $string '] { + append datefmt $quote [string map { + dddd %A + ddd %a + dd %d + d %e + MMMM %B + MMM %b + MM %m + M %N + yyyy %Y + yy %y + y %y + gg {} + } $unquoted] + if { $quoted eq {} } { + set quote ' + } else { + set quote $quoted + } + } + ::msgcat::mcset $locale DATE_FORMAT $datefmt + } + + if { ![catch { + registry get "HKEY_CURRENT_USER\\Control Panel\\International" \ + sLongDate + } string] } { + set quote {} + set ldatefmt {} + foreach { unquoted quoted } [split $string '] { + append ldatefmt $quote [string map { + dddd %A + ddd %a + dd %d + d %e + MMMM %B + MMM %b + MM %m + M %N + yyyy %Y + yy %y + y %y + gg {} + } $unquoted] + if { $quoted eq {} } { + set quote ' + } else { + set quote $quoted + } + } + ::msgcat::mcset $locale LOCALE_DATE_FORMAT $ldatefmt + } + + if { ![catch { + registry get "HKEY_CURRENT_USER\\Control Panel\\International" \ + sTimeFormat + } string] } { + set quote {} + set timefmt {} + foreach { unquoted quoted } [split $string '] { + append timefmt $quote [string map { + HH %H + H %k + hh %I + h %l + mm %M + m %M + ss %S + s %S + tt %p + t %p + } $unquoted] + if { $quoted eq {} } { + set quote ' + } else { + set quote $quoted + } + } + ::msgcat::mcset $locale TIME_FORMAT $timefmt + } + + catch { + ::msgcat::mcset $locale DATE_TIME_FORMAT "$datefmt $timefmt" + } + catch { + ::msgcat::mcset $locale LOCALE_DATE_TIME_FORMAT "$ldatefmt $timefmt" + } + + return + +} + +#---------------------------------------------------------------------- +# +# LocalizeFormat -- +# +# Map away locale-dependent format groups in a clock format. +# +# Parameters: +# locale -- Current [mclocale] locale, supplied to avoid +# an extra call +# format -- Format supplied to [clock scan] or [clock format] +# +# Results: +# Returns the string with locale-dependent composite format groups +# substituted out. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::LocalizeFormat { locale format } { + + # message catalog key to cache this format + set key FORMAT_$format + + if { [::msgcat::mcexists -exactlocale -exactnamespace $key] } { + return [mc $key] + } + # Handle locale-dependent format groups by mapping them out of the format + # string. Note that the order of the [string map] operations is + # significant because later formats can refer to later ones; for example + # %c can refer to %X, which in turn can refer to %T. + + set list { + %% %% + %D %m/%d/%Y + %+ {%a %b %e %H:%M:%S %Z %Y} + } + lappend list %EY [string map $list [mc LOCALE_YEAR_FORMAT]] + lappend list %T [string map $list [mc TIME_FORMAT_24_SECS]] + lappend list %R [string map $list [mc TIME_FORMAT_24]] + lappend list %r [string map $list [mc TIME_FORMAT_12]] + lappend list %X [string map $list [mc TIME_FORMAT]] + lappend list %EX [string map $list [mc LOCALE_TIME_FORMAT]] + lappend list %x [string map $list [mc DATE_FORMAT]] + lappend list %Ex [string map $list [mc LOCALE_DATE_FORMAT]] + lappend list %c [string map $list [mc DATE_TIME_FORMAT]] + lappend list %Ec [string map $list [mc LOCALE_DATE_TIME_FORMAT]] + set format [string map $list $format] + + ::msgcat::mcset $locale $key $format + return $format +} + +#---------------------------------------------------------------------- +# +# FormatNumericTimeZone -- +# +# Formats a time zone as +hhmmss +# +# Parameters: +# z - Time zone in seconds east of Greenwich +# +# Results: +# Returns the time zone formatted in a numeric form +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::FormatNumericTimeZone { z } { + if { $z < 0 } { + set z [expr { - $z }] + set retval - + } else { + set retval + + } + append retval [::format %02d [expr { $z / 3600 }]] + set z [expr { $z % 3600 }] + append retval [::format %02d [expr { $z / 60 }]] + set z [expr { $z % 60 }] + if { $z != 0 } { + append retval [::format %02d $z] + } + return $retval +} + +#---------------------------------------------------------------------- +# +# FormatStarDate -- +# +# Formats a date as a StarDate. +# +# Parameters: +# date - Dictionary containing 'year', 'dayOfYear', and +# 'localSeconds' fields. +# +# Results: +# Returns the given date formatted as a StarDate. +# +# Side effects: +# None. +# +# Jeff Hobbs put this in to support an atrocious pun about Tcl being +# "Enterprise ready." Now we're stuck with it. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::FormatStarDate { date } { + variable Roddenberry + + # Get day of year, zero based + + set doy [expr { [dict get $date dayOfYear] - 1 }] + + # Determine whether the year is a leap year + + set lp [IsGregorianLeapYear $date] + + # Convert day of year to a fractional year + + if { $lp } { + set fractYear [expr { 1000 * $doy / 366 }] + } else { + set fractYear [expr { 1000 * $doy / 365 }] + } + + # Put together the StarDate + + return [::format "Stardate %02d%03d.%1d" \ + [expr { [dict get $date year] - $Roddenberry }] \ + $fractYear \ + [expr { [dict get $date localSeconds] % 86400 + / ( 86400 / 10 ) }]] +} + +#---------------------------------------------------------------------- +# +# ParseStarDate -- +# +# Parses a StarDate +# +# Parameters: +# year - Year from the Roddenberry epoch +# fractYear - Fraction of a year specifiying the day of year. +# fractDay - Fraction of a day +# +# Results: +# Returns a count of seconds from the Posix epoch. +# +# Side effects: +# None. +# +# Jeff Hobbs put this in to support an atrocious pun about Tcl being +# "Enterprise ready." Now we're stuck with it. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ParseStarDate { year fractYear fractDay } { + variable Roddenberry + + # Build a tentative date from year and fraction. + + set date [dict create \ + gregorian 1 \ + era CE \ + year [expr { $year + $Roddenberry }] \ + dayOfYear [expr { $fractYear * 365 / 1000 + 1 }]] + set date [GetJulianDayFromGregorianEraYearDay $date[set date {}]] + + # Determine whether the given year is a leap year + + set lp [IsGregorianLeapYear $date] + + # Reconvert the fractional year according to whether the given year is a + # leap year + + if { $lp } { + dict set date dayOfYear \ + [expr { $fractYear * 366 / 1000 + 1 }] + } else { + dict set date dayOfYear \ + [expr { $fractYear * 365 / 1000 + 1 }] + } + dict unset date julianDay + dict unset date gregorian + set date [GetJulianDayFromGregorianEraYearDay $date[set date {}]] + + return [expr { + 86400 * [dict get $date julianDay] + - 210866803200 + + ( 86400 / 10 ) * $fractDay + }] +} + +#---------------------------------------------------------------------- +# +# ScanWide -- +# +# Scans a wide integer from an input +# +# Parameters: +# str - String containing a decimal wide integer +# +# Results: +# Returns the string as a pure wide integer. Throws an error if the +# string is misformatted or out of range. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ScanWide { str } { + set count [::scan $str {%ld %c} result junk] + if { $count != 1 } { + return -code error -errorcode [list CLOCK notAnInteger $str] \ + "\"$str\" is not an integer" + } + if { [incr result 0] != $str } { + return -code error -errorcode [list CLOCK integervalueTooLarge] \ + "integer value too large to represent" + } + return $result +} + +#---------------------------------------------------------------------- +# +# InterpretTwoDigitYear -- +# +# Given a date that contains only the year of the century, determines +# the target value of a two-digit year. +# +# Parameters: +# date - Dictionary containing fields of the date. +# baseTime - Base time relative to which the date is expressed. +# twoDigitField - Name of the field that stores the two-digit year. +# Default is 'yearOfCentury' +# fourDigitField - Name of the field that will receive the four-digit +# year. Default is 'year' +# +# Results: +# Returns the dictionary augmented with the four-digit year, stored in +# the given key. +# +# Side effects: +# None. +# +# The current rule for interpreting a two-digit year is that the year shall be +# between 1937 and 2037, thus staying within the range of a 32-bit signed +# value for time. This rule may change to a sliding window in future +# versions, so the 'baseTime' parameter (which is currently ignored) is +# provided in the procedure signature. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::InterpretTwoDigitYear { date baseTime + { twoDigitField yearOfCentury } + { fourDigitField year } } { + set yr [dict get $date $twoDigitField] + if { $yr <= 37 } { + dict set date $fourDigitField [expr { $yr + 2000 }] + } else { + dict set date $fourDigitField [expr { $yr + 1900 }] + } + return $date +} + +#---------------------------------------------------------------------- +# +# AssignBaseYear -- +# +# Places the number of the current year into a dictionary. +# +# Parameters: +# date - Dictionary value to update +# baseTime - Base time from which to extract the year, expressed +# in seconds from the Posix epoch +# timezone - the time zone in which the date is being scanned +# changeover - the Julian Day on which the Gregorian calendar +# was adopted in the target locale. +# +# Results: +# Returns the dictionary with the current year assigned. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AssignBaseYear { date baseTime timezone changeover } { + variable TZData + + # Find the Julian Day Number corresponding to the base time, and + # find the Gregorian year corresponding to that Julian Day. + + set date2 [GetDateFields $baseTime $TZData($timezone) $changeover] + + # Store the converted year + + dict set date era [dict get $date2 era] + dict set date year [dict get $date2 year] + + return $date +} + +#---------------------------------------------------------------------- +# +# AssignBaseIso8601Year -- +# +# Determines the base year in the ISO8601 fiscal calendar. +# +# Parameters: +# date - Dictionary containing the fields of the date that +# is to be augmented with the base year. +# baseTime - Base time expressed in seconds from the Posix epoch. +# timeZone - Target time zone +# changeover - Julian Day of adoption of the Gregorian calendar in +# the target locale. +# +# Results: +# Returns the given date with "iso8601Year" set to the +# base year. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AssignBaseIso8601Year {date baseTime timeZone changeover} { + variable TZData + + # Find the Julian Day Number corresponding to the base time + + set date2 [GetDateFields $baseTime $TZData($timeZone) $changeover] + + # Calculate the ISO8601 date and transfer the year + + dict set date era CE + dict set date iso8601Year [dict get $date2 iso8601Year] + return $date +} + +#---------------------------------------------------------------------- +# +# AssignBaseMonth -- +# +# Places the number of the current year and month into a +# dictionary. +# +# Parameters: +# date - Dictionary value to update +# baseTime - Time from which the year and month are to be +# obtained, expressed in seconds from the Posix epoch. +# timezone - Name of the desired time zone +# changeover - Julian Day on which the Gregorian calendar was adopted. +# +# Results: +# Returns the dictionary with the base year and month assigned. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AssignBaseMonth {date baseTime timezone changeover} { + variable TZData + + # Find the year and month corresponding to the base time + + set date2 [GetDateFields $baseTime $TZData($timezone) $changeover] + dict set date era [dict get $date2 era] + dict set date year [dict get $date2 year] + dict set date month [dict get $date2 month] + return $date +} + +#---------------------------------------------------------------------- +# +# AssignBaseWeek -- +# +# Determines the base year and week in the ISO8601 fiscal calendar. +# +# Parameters: +# date - Dictionary containing the fields of the date that +# is to be augmented with the base year and week. +# baseTime - Base time expressed in seconds from the Posix epoch. +# changeover - Julian Day on which the Gregorian calendar was adopted +# in the target locale. +# +# Results: +# Returns the given date with "iso8601Year" set to the +# base year and "iso8601Week" to the week number. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AssignBaseWeek {date baseTime timeZone changeover} { + variable TZData + + # Find the Julian Day Number corresponding to the base time + + set date2 [GetDateFields $baseTime $TZData($timeZone) $changeover] + + # Calculate the ISO8601 date and transfer the year + + dict set date era CE + dict set date iso8601Year [dict get $date2 iso8601Year] + dict set date iso8601Week [dict get $date2 iso8601Week] + return $date +} + +#---------------------------------------------------------------------- +# +# AssignBaseJulianDay -- +# +# Determines the base day for a time-of-day conversion. +# +# Parameters: +# date - Dictionary that is to get the base day +# baseTime - Base time expressed in seconds from the Posix epoch +# changeover - Julian day on which the Gregorian calendar was +# adpoted in the target locale. +# +# Results: +# Returns the given dictionary augmented with a 'julianDay' field +# that contains the base day. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AssignBaseJulianDay { date baseTime timeZone changeover } { + variable TZData + + # Find the Julian Day Number corresponding to the base time + + set date2 [GetDateFields $baseTime $TZData($timeZone) $changeover] + dict set date julianDay [dict get $date2 julianDay] + + return $date +} + +#---------------------------------------------------------------------- +# +# InterpretHMSP -- +# +# Interprets a time in the form "hh:mm:ss am". +# +# Parameters: +# date -- Dictionary containing "hourAMPM", "minute", "second" +# and "amPmIndicator" fields. +# +# Results: +# Returns the number of seconds from local midnight. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::InterpretHMSP { date } { + set hr [dict get $date hourAMPM] + if { $hr == 12 } { + set hr 0 + } + if { [dict get $date amPmIndicator] } { + incr hr 12 + } + dict set date hour $hr + return [InterpretHMS $date[set date {}]] +} + +#---------------------------------------------------------------------- +# +# InterpretHMS -- +# +# Interprets a 24-hour time "hh:mm:ss" +# +# Parameters: +# date -- Dictionary containing the "hour", "minute" and "second" +# fields. +# +# Results: +# Returns the given dictionary augmented with a "secondOfDay" +# field containing the number of seconds from local midnight. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::InterpretHMS { date } { + return [expr { + ( [dict get $date hour] * 60 + + [dict get $date minute] ) * 60 + + [dict get $date second] + }] +} + +#---------------------------------------------------------------------- +# +# GetSystemTimeZone -- +# +# Determines the system time zone, which is the default for the +# 'clock' command if no other zone is supplied. +# +# Parameters: +# None. +# +# Results: +# Returns the system time zone. +# +# Side effects: +# Stores the sustem time zone in the 'CachedSystemTimeZone' +# variable, since determining it may be an expensive process. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::GetSystemTimeZone {} { + variable CachedSystemTimeZone + variable TimeZoneBad + + if {[set result [getenv TCL_TZ]] ne {}} { + set timezone $result + } elseif {[set result [getenv TZ]] ne {}} { + set timezone $result + } else { + # Cache the time zone only if it was detected by one of the + # expensive methods. + if { [info exists CachedSystemTimeZone] } { + set timezone $CachedSystemTimeZone + } elseif { $::tcl_platform(platform) eq {windows} } { + set timezone [GuessWindowsTimeZone] + } elseif { [file exists /etc/localtime] + && ![catch {ReadZoneinfoFile \ + Tcl/Localtime /etc/localtime}] } { + set timezone :Tcl/Localtime + } else { + set timezone :localtime + } + set CachedSystemTimeZone $timezone + } + if { ![dict exists $TimeZoneBad $timezone] } { + dict set TimeZoneBad $timezone [catch {SetupTimeZone $timezone}] + } + if { [dict get $TimeZoneBad $timezone] } { + return :localtime + } else { + return $timezone + } +} + +#---------------------------------------------------------------------- +# +# ConvertLegacyTimeZone -- +# +# Given an alphanumeric time zone identifier and the system time zone, +# convert the alphanumeric identifier to an unambiguous time zone. +# +# Parameters: +# tzname - Name of the time zone to convert +# +# Results: +# Returns a time zone name corresponding to tzname, but in an +# unambiguous form, generally +hhmm. +# +# This procedure is implemented primarily to allow the parsing of RFC822 +# date/time strings. Processing a time zone name on input is not recommended +# practice, because there is considerable room for ambiguity; for instance, is +# BST Brazilian Standard Time, or British Summer Time? +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ConvertLegacyTimeZone { tzname } { + variable LegacyTimeZone + + set tzname [string tolower $tzname] + if { ![dict exists $LegacyTimeZone $tzname] } { + return -code error -errorcode [list CLOCK badTZName $tzname] \ + "time zone \"$tzname\" not found" + } + return [dict get $LegacyTimeZone $tzname] +} + +#---------------------------------------------------------------------- +# +# SetupTimeZone -- +# +# Given the name or specification of a time zone, sets up its in-memory +# data. +# +# Parameters: +# tzname - Name of a time zone +# +# Results: +# Unless the time zone is ':localtime', sets the TZData array to contain +# the lookup table for local<->UTC conversion. Returns an error if the +# time zone cannot be parsed. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::SetupTimeZone { timezone } { + variable TZData + + if {! [info exists TZData($timezone)] } { + variable MINWIDE + if { $timezone eq {:localtime} } { + # Nothing to do, we'll convert using the localtime function + + } elseif { + [regexp {^([-+])(\d\d)(?::?(\d\d)(?::?(\d\d))?)?} $timezone \ + -> s hh mm ss] + } then { + # Make a fixed offset + + ::scan $hh %d hh + if { $mm eq {} } { + set mm 0 + } else { + ::scan $mm %d mm + } + if { $ss eq {} } { + set ss 0 + } else { + ::scan $ss %d ss + } + set offset [expr { ( $hh * 60 + $mm ) * 60 + $ss }] + if { $s eq {-} } { + set offset [expr { - $offset }] + } + set TZData($timezone) [list [list $MINWIDE $offset -1 $timezone]] + + } elseif { [string index $timezone 0] eq {:} } { + # Convert using a time zone file + + if { + [catch { + LoadTimeZoneFile [string range $timezone 1 end] + }] && [catch { + LoadZoneinfoFile [string range $timezone 1 end] + }] + } then { + return -code error \ + -errorcode [list CLOCK badTimeZone $timezone] \ + "time zone \"$timezone\" not found" + } + } elseif { ![catch {ParsePosixTimeZone $timezone} tzfields] } { + # This looks like a POSIX time zone - try to process it + + if { [catch {ProcessPosixTimeZone $tzfields} data opts] } { + if { [lindex [dict get $opts -errorcode] 0] eq {CLOCK} } { + dict unset opts -errorinfo + } + return -options $opts $data + } else { + set TZData($timezone) $data + } + + } else { + # We couldn't parse this as a POSIX time zone. Try again with a + # time zone file - this time without a colon + + if { [catch { LoadTimeZoneFile $timezone }] + && [catch { LoadZoneinfoFile $timezone } - opts] } { + dict unset opts -errorinfo + return -options $opts "time zone $timezone not found" + } + set TZData($timezone) $TZData(:$timezone) + } + } + + return +} + +#---------------------------------------------------------------------- +# +# GuessWindowsTimeZone -- +# +# Determines the system time zone on windows. +# +# Parameters: +# None. +# +# Results: +# Returns a time zone specifier that corresponds to the system time zone +# information found in the Registry. +# +# Bugs: +# Fixed dates for DST change are unimplemented at present, because no +# time zone information supplied with Windows actually uses them! +# +# On a Windows system where neither $env(TCL_TZ) nor $env(TZ) is specified, +# GuessWindowsTimeZone looks in the Registry for the system time zone +# information. It then attempts to find an entry in WinZoneInfo for a time +# zone that uses the same rules. If it finds one, it returns it; otherwise, +# it constructs a Posix-style time zone string and returns that. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::GuessWindowsTimeZone {} { + variable WinZoneInfo + variable NoRegistry + variable TimeZoneBad + + if { [info exists NoRegistry] } { + return :localtime + } + + # Dredge time zone information out of the registry + + if { [catch { + set rpath HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\TimeZoneInformation + set data [list \ + [expr { -60 + * [registry get $rpath Bias] }] \ + [expr { -60 + * [registry get $rpath StandardBias] }] \ + [expr { -60 \ + * [registry get $rpath DaylightBias] }]] + set stdtzi [registry get $rpath StandardStart] + foreach ind {0 2 14 4 6 8 10 12} { + binary scan $stdtzi @${ind}s val + lappend data $val + } + set daytzi [registry get $rpath DaylightStart] + foreach ind {0 2 14 4 6 8 10 12} { + binary scan $daytzi @${ind}s val + lappend data $val + } + }] } { + # Missing values in the Registry - bail out + + return :localtime + } + + # Make up a Posix time zone specifier if we can't find one. Check here + # that the tzdata file exists, in case we're running in an environment + # (e.g. starpack) where tzdata is incomplete. (Bug 1237907) + + if { [dict exists $WinZoneInfo $data] } { + set tzname [dict get $WinZoneInfo $data] + if { ! [dict exists $TimeZoneBad $tzname] } { + dict set TimeZoneBad $tzname [catch {SetupTimeZone $tzname}] + } + } else { + set tzname {} + } + if { $tzname eq {} || [dict get $TimeZoneBad $tzname] } { + lassign $data \ + bias stdBias dstBias \ + stdYear stdMonth stdDayOfWeek stdDayOfMonth \ + stdHour stdMinute stdSecond stdMillisec \ + dstYear dstMonth dstDayOfWeek dstDayOfMonth \ + dstHour dstMinute dstSecond dstMillisec + set stdDelta [expr { $bias + $stdBias }] + set dstDelta [expr { $bias + $dstBias }] + if { $stdDelta <= 0 } { + set stdSignum + + set stdDelta [expr { - $stdDelta }] + set dispStdSignum - + } else { + set stdSignum - + set dispStdSignum + + } + set hh [::format %02d [expr { $stdDelta / 3600 }]] + set mm [::format %02d [expr { ($stdDelta / 60 ) % 60 }]] + set ss [::format %02d [expr { $stdDelta % 60 }]] + set tzname {} + append tzname < $dispStdSignum $hh $mm > $stdSignum $hh : $mm : $ss + if { $stdMonth >= 0 } { + if { $dstDelta <= 0 } { + set dstSignum + + set dstDelta [expr { - $dstDelta }] + set dispDstSignum - + } else { + set dstSignum - + set dispDstSignum + + } + set hh [::format %02d [expr { $dstDelta / 3600 }]] + set mm [::format %02d [expr { ($dstDelta / 60 ) % 60 }]] + set ss [::format %02d [expr { $dstDelta % 60 }]] + append tzname < $dispDstSignum $hh $mm > $dstSignum $hh : $mm : $ss + if { $dstYear == 0 } { + append tzname ,M $dstMonth . $dstDayOfMonth . $dstDayOfWeek + } else { + # I have not been able to find any locale on which Windows + # converts time zone on a fixed day of the year, hence don't + # know how to interpret the fields. If someone can inform me, + # I'd be glad to code it up. For right now, we bail out in + # such a case. + return :localtime + } + append tzname / [::format %02d $dstHour] \ + : [::format %02d $dstMinute] \ + : [::format %02d $dstSecond] + if { $stdYear == 0 } { + append tzname ,M $stdMonth . $stdDayOfMonth . $stdDayOfWeek + } else { + # I have not been able to find any locale on which Windows + # converts time zone on a fixed day of the year, hence don't + # know how to interpret the fields. If someone can inform me, + # I'd be glad to code it up. For right now, we bail out in + # such a case. + return :localtime + } + append tzname / [::format %02d $stdHour] \ + : [::format %02d $stdMinute] \ + : [::format %02d $stdSecond] + } + dict set WinZoneInfo $data $tzname + } + + return [dict get $WinZoneInfo $data] +} + +#---------------------------------------------------------------------- +# +# LoadTimeZoneFile -- +# +# Load the data file that specifies the conversion between a +# given time zone and Greenwich. +# +# Parameters: +# fileName -- Name of the file to load +# +# Results: +# None. +# +# Side effects: +# TZData(:fileName) contains the time zone data +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::LoadTimeZoneFile { fileName } { + variable DataDir + variable TZData + + if { [info exists TZData($fileName)] } { + return + } + + # Since an unsafe interp uses the [clock] command in the parent, this code + # is security sensitive. Make sure that the path name cannot escape the + # given directory. + + if { ![regexp {^[[.-.][:alpha:]_]+(?:/[[.-.][:alpha:]_]+)*$} $fileName] } { + return -code error \ + -errorcode [list CLOCK badTimeZone $:fileName] \ + "time zone \":$fileName\" not valid" + } + try { + source -encoding utf-8 [file join $DataDir $fileName] + } on error {} { + return -code error \ + -errorcode [list CLOCK badTimeZone :$fileName] \ + "time zone \":$fileName\" not found" + } + return +} + +#---------------------------------------------------------------------- +# +# LoadZoneinfoFile -- +# +# Loads a binary time zone information file in Olson format. +# +# Parameters: +# fileName - Relative path name of the file to load. +# +# Results: +# Returns an empty result normally; returns an error if no Olson file +# was found or the file was malformed in some way. +# +# Side effects: +# TZData(:fileName) contains the time zone data +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::LoadZoneinfoFile { fileName } { + variable ZoneinfoPaths + + # Since an unsafe interp uses the [clock] command in the parent, this code + # is security sensitive. Make sure that the path name cannot escape the + # given directory. + + if { ![regexp {^[[.-.][:alpha:]_]+(?:/[[.-.][:alpha:]_]+)*$} $fileName] } { + return -code error \ + -errorcode [list CLOCK badTimeZone $:fileName] \ + "time zone \":$fileName\" not valid" + } + foreach d $ZoneinfoPaths { + set fname [file join $d $fileName] + if { [file readable $fname] && [file isfile $fname] } { + break + } + unset fname + } + ReadZoneinfoFile $fileName $fname +} + +#---------------------------------------------------------------------- +# +# ReadZoneinfoFile -- +# +# Loads a binary time zone information file in Olson format. +# +# Parameters: +# fileName - Name of the time zone (relative path name of the +# file). +# fname - Absolute path name of the file. +# +# Results: +# Returns an empty result normally; returns an error if no Olson file +# was found or the file was malformed in some way. +# +# Side effects: +# TZData(:fileName) contains the time zone data +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ReadZoneinfoFile {fileName fname} { + variable MINWIDE + variable TZData + if { ![file exists $fname] } { + return -code error "$fileName not found" + } + + if { [file size $fname] > 262144 } { + return -code error "$fileName too big" + } + + # Suck in all the data from the file + + set f [open $fname r] + fconfigure $f -translation binary + set d [read $f] + close $f + + # The file begins with a magic number, sixteen reserved bytes, and then + # six 4-byte integers giving counts of fileds in the file. + + binary scan $d a4a1x15IIIIII \ + magic version nIsGMT nIsStd nLeap nTime nType nChar + set seek 44 + set ilen 4 + set iformat I + if { $magic != {TZif} } { + return -code error "$fileName not a time zone information file" + } + if { $nType > 255 } { + return -code error "$fileName contains too many time types" + } + # Accept only Posix-style zoneinfo. Sorry, 'leaps' bigots. + if { $nLeap != 0 } { + return -code error "$fileName contains leap seconds" + } + + # In a version 2 file, we use the second part of the file, which contains + # 64-bit transition times. + + if {$version eq "2"} { + set seek [expr { + 44 + + 5 * $nTime + + 6 * $nType + + 4 * $nLeap + + $nIsStd + + $nIsGMT + + $nChar + }] + binary scan $d @${seek}a4a1x15IIIIII \ + magic version nIsGMT nIsStd nLeap nTime nType nChar + if {$magic ne {TZif}} { + return -code error "seek address $seek miscomputed, magic = $magic" + } + set iformat W + set ilen 8 + incr seek 44 + } + + # Next come ${nTime} transition times, followed by ${nTime} time type + # codes. The type codes are unsigned 1-byte quantities. We insert an + # arbitrary start time in front of the transitions. + + binary scan $d @${seek}${iformat}${nTime}c${nTime} times tempCodes + incr seek [expr { ($ilen + 1) * $nTime }] + set times [linsert $times 0 $MINWIDE] + set codes {} + foreach c $tempCodes { + lappend codes [expr { $c & 0xFF }] + } + set codes [linsert $codes 0 0] + + # Next come ${nType} time type descriptions, each of which has an offset + # (seconds east of GMT), a DST indicator, and an index into the + # abbreviation text. + + for { set i 0 } { $i < $nType } { incr i } { + binary scan $d @${seek}Icc gmtOff isDst abbrInd + lappend types [list $gmtOff $isDst $abbrInd] + incr seek 6 + } + + # Next come $nChar characters of time zone name abbreviations, which are + # null-terminated. + # We build them up into a dictionary indexed by character index, because + # that's what's in the indices above. + + binary scan $d @${seek}a${nChar} abbrs + incr seek ${nChar} + set abbrList [split $abbrs \0] + set i 0 + set abbrevs {} + foreach a $abbrList { + for {set j 0} {$j <= [string length $a]} {incr j} { + dict set abbrevs $i [string range $a $j end] + incr i + } + } + + # Package up a list of tuples, each of which contains transition time, + # seconds east of Greenwich, DST flag and time zone abbreviation. + + set r {} + set lastTime $MINWIDE + foreach t $times c $codes { + if { $t < $lastTime } { + return -code error "$fileName has times out of order" + } + set lastTime $t + lassign [lindex $types $c] gmtoff isDst abbrInd + set abbrev [dict get $abbrevs $abbrInd] + lappend r [list $t $gmtoff $isDst $abbrev] + } + + # In a version 2 file, there is also a POSIX-style time zone description + # at the very end of the file. To get to it, skip over nLeap leap second + # values (8 bytes each), + # nIsStd standard/DST indicators and nIsGMT UTC/local indicators. + + if {$version eq {2}} { + set seek [expr {$seek + 8 * $nLeap + $nIsStd + $nIsGMT + 1}] + set last [string first \n $d $seek] + set posix [string range $d $seek [expr {$last-1}]] + if {[llength $posix] > 0} { + set posixFields [ParsePosixTimeZone $posix] + foreach tuple [ProcessPosixTimeZone $posixFields] { + lassign $tuple t gmtoff isDst abbrev + if {$t > $lastTime} { + lappend r $tuple + } + } + } + } + + set TZData(:$fileName) $r + + return +} + +#---------------------------------------------------------------------- +# +# ParsePosixTimeZone -- +# +# Parses the TZ environment variable in Posix form +# +# Parameters: +# tz Time zone specifier to be interpreted +# +# Results: +# Returns a dictionary whose values contain the various pieces of the +# time zone specification. +# +# Side effects: +# None. +# +# Errors: +# Throws an error if the syntax of the time zone is incorrect. +# +# The following keys are present in the dictionary: +# stdName - Name of the time zone when Daylight Saving Time +# is not in effect. +# stdSignum - Sign (+, -, or empty) of the offset from Greenwich +# to the given (non-DST) time zone. + and the empty +# string denote zones west of Greenwich, - denotes east +# of Greenwich; this is contrary to the ISO convention +# but follows Posix. +# stdHours - Hours part of the offset from Greenwich to the given +# (non-DST) time zone. +# stdMinutes - Minutes part of the offset from Greenwich to the +# given (non-DST) time zone. Empty denotes zero. +# stdSeconds - Seconds part of the offset from Greenwich to the +# given (non-DST) time zone. Empty denotes zero. +# dstName - Name of the time zone when DST is in effect, or the +# empty string if the time zone does not observe Daylight +# Saving Time. +# dstSignum, dstHours, dstMinutes, dstSeconds - +# Fields corresponding to stdSignum, stdHours, stdMinutes, +# stdSeconds for the Daylight Saving Time version of the +# time zone. If dstHours is empty, it is presumed to be 1. +# startDayOfYear - The ordinal number of the day of the year on which +# Daylight Saving Time begins. If this field is +# empty, then DST begins on a given month-week-day, +# as below. +# startJ - The letter J, or an empty string. If a J is present in +# this field, then startDayOfYear does not count February 29 +# even in leap years. +# startMonth - The number of the month in which Daylight Saving Time +# begins, supplied if startDayOfYear is empty. If both +# startDayOfYear and startMonth are empty, then US rules +# are presumed. +# startWeekOfMonth - The number of the week in the month in which +# Daylight Saving Time begins, in the range 1-5. +# 5 denotes the last week of the month even in a +# 4-week month. +# startDayOfWeek - The number of the day of the week (Sunday=0, +# Saturday=6) on which Daylight Saving Time begins. +# startHours - The hours part of the time of day at which Daylight +# Saving Time begins. An empty string is presumed to be 2. +# startMinutes - The minutes part of the time of day at which DST begins. +# An empty string is presumed zero. +# startSeconds - The seconds part of the time of day at which DST begins. +# An empty string is presumed zero. +# endDayOfYear, endJ, endMonth, endWeekOfMonth, endDayOfWeek, +# endHours, endMinutes, endSeconds - +# Specify the end of DST in the same way that the start* fields +# specify the beginning of DST. +# +# This procedure serves only to break the time specifier into fields. No +# attempt is made to canonicalize the fields or supply default values. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ParsePosixTimeZone { tz } { + if {[regexp -expanded -nocase -- { + ^ + # 1 - Standard time zone name + ([[:alpha:]]+ | <[-+[:alnum:]]+>) + # 2 - Standard time zone offset, signum + ([-+]?) + # 3 - Standard time zone offset, hours + ([[:digit:]]{1,2}) + (?: + # 4 - Standard time zone offset, minutes + : ([[:digit:]]{1,2}) + (?: + # 5 - Standard time zone offset, seconds + : ([[:digit:]]{1,2} ) + )? + )? + (?: + # 6 - DST time zone name + ([[:alpha:]]+ | <[-+[:alnum:]]+>) + (?: + (?: + # 7 - DST time zone offset, signum + ([-+]?) + # 8 - DST time zone offset, hours + ([[:digit:]]{1,2}) + (?: + # 9 - DST time zone offset, minutes + : ([[:digit:]]{1,2}) + (?: + # 10 - DST time zone offset, seconds + : ([[:digit:]]{1,2}) + )? + )? + )? + (?: + , + (?: + # 11 - Optional J in n and Jn form 12 - Day of year + ( J ? ) ( [[:digit:]]+ ) + | M + # 13 - Month number 14 - Week of month 15 - Day of week + ( [[:digit:]] + ) + [.] ( [[:digit:]] + ) + [.] ( [[:digit:]] + ) + ) + (?: + # 16 - Start time of DST - hours + / ( [[:digit:]]{1,2} ) + (?: + # 17 - Start time of DST - minutes + : ( [[:digit:]]{1,2} ) + (?: + # 18 - Start time of DST - seconds + : ( [[:digit:]]{1,2} ) + )? + )? + )? + , + (?: + # 19 - Optional J in n and Jn form 20 - Day of year + ( J ? ) ( [[:digit:]]+ ) + | M + # 21 - Month number 22 - Week of month 23 - Day of week + ( [[:digit:]] + ) + [.] ( [[:digit:]] + ) + [.] ( [[:digit:]] + ) + ) + (?: + # 24 - End time of DST - hours + / ( [[:digit:]]{1,2} ) + (?: + # 25 - End time of DST - minutes + : ( [[:digit:]]{1,2} ) + (?: + # 26 - End time of DST - seconds + : ( [[:digit:]]{1,2} ) + )? + )? + )? + )? + )? + )? + $ + } $tz -> x(stdName) x(stdSignum) x(stdHours) x(stdMinutes) x(stdSeconds) \ + x(dstName) x(dstSignum) x(dstHours) x(dstMinutes) x(dstSeconds) \ + x(startJ) x(startDayOfYear) \ + x(startMonth) x(startWeekOfMonth) x(startDayOfWeek) \ + x(startHours) x(startMinutes) x(startSeconds) \ + x(endJ) x(endDayOfYear) \ + x(endMonth) x(endWeekOfMonth) x(endDayOfWeek) \ + x(endHours) x(endMinutes) x(endSeconds)] } { + # it's a good timezone + + return [array get x] + } + + return -code error\ + -errorcode [list CLOCK badTimeZone $tz] \ + "unable to parse time zone specification \"$tz\"" +} + +#---------------------------------------------------------------------- +# +# ProcessPosixTimeZone -- +# +# Handle a Posix time zone after it's been broken out into fields. +# +# Parameters: +# z - Dictionary returned from 'ParsePosixTimeZone' +# +# Results: +# Returns time zone information for the 'TZData' array. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ProcessPosixTimeZone { z } { + variable MINWIDE + variable TZData + + # Determine the standard time zone name and seconds east of Greenwich + + set stdName [dict get $z stdName] + if { [string index $stdName 0] eq {<} } { + set stdName [string range $stdName 1 end-1] + } + if { [dict get $z stdSignum] eq {-} } { + set stdSignum +1 + } else { + set stdSignum -1 + } + set stdHours [lindex [::scan [dict get $z stdHours] %d] 0] + if { [dict get $z stdMinutes] ne {} } { + set stdMinutes [lindex [::scan [dict get $z stdMinutes] %d] 0] + } else { + set stdMinutes 0 + } + if { [dict get $z stdSeconds] ne {} } { + set stdSeconds [lindex [::scan [dict get $z stdSeconds] %d] 0] + } else { + set stdSeconds 0 + } + set stdOffset [expr { + (($stdHours * 60 + $stdMinutes) * 60 + $stdSeconds) * $stdSignum + }] + set data [list [list $MINWIDE $stdOffset 0 $stdName]] + + # If there's no daylight zone, we're done + + set dstName [dict get $z dstName] + if { $dstName eq {} } { + return $data + } + if { [string index $dstName 0] eq {<} } { + set dstName [string range $dstName 1 end-1] + } + + # Determine the daylight name + + if { [dict get $z dstSignum] eq {-} } { + set dstSignum +1 + } else { + set dstSignum -1 + } + if { [dict get $z dstHours] eq {} } { + set dstOffset [expr { 3600 + $stdOffset }] + } else { + set dstHours [lindex [::scan [dict get $z dstHours] %d] 0] + if { [dict get $z dstMinutes] ne {} } { + set dstMinutes [lindex [::scan [dict get $z dstMinutes] %d] 0] + } else { + set dstMinutes 0 + } + if { [dict get $z dstSeconds] ne {} } { + set dstSeconds [lindex [::scan [dict get $z dstSeconds] %d] 0] + } else { + set dstSeconds 0 + } + set dstOffset [expr { + (($dstHours*60 + $dstMinutes) * 60 + $dstSeconds) * $dstSignum + }] + } + + # Fill in defaults for European or US DST rules + # US start time is the second Sunday in March + # EU start time is the last Sunday in March + # US end time is the first Sunday in November. + # EU end time is the last Sunday in October + + if { + [dict get $z startDayOfYear] eq {} + && [dict get $z startMonth] eq {} + } then { + if {($stdSignum * $stdHours>=0) && ($stdSignum * $stdHours<=12)} { + # EU + dict set z startWeekOfMonth 5 + if {$stdHours>2} { + dict set z startHours 2 + } else { + dict set z startHours [expr {$stdHours+1}] + } + } else { + # US + dict set z startWeekOfMonth 2 + dict set z startHours 2 + } + dict set z startMonth 3 + dict set z startDayOfWeek 0 + dict set z startMinutes 0 + dict set z startSeconds 0 + } + if { + [dict get $z endDayOfYear] eq {} + && [dict get $z endMonth] eq {} + } then { + if {($stdSignum * $stdHours>=0) && ($stdSignum * $stdHours<=12)} { + # EU + dict set z endMonth 10 + dict set z endWeekOfMonth 5 + if {$stdHours>2} { + dict set z endHours 3 + } else { + dict set z endHours [expr {$stdHours+2}] + } + } else { + # US + dict set z endMonth 11 + dict set z endWeekOfMonth 1 + dict set z endHours 2 + } + dict set z endDayOfWeek 0 + dict set z endMinutes 0 + dict set z endSeconds 0 + } + + # Put DST in effect in all years from 1916 to 2099. + + for { set y 1916 } { $y < 2100 } { incr y } { + set startTime [DeterminePosixDSTTime $z start $y] + incr startTime [expr { - wide($stdOffset) }] + set endTime [DeterminePosixDSTTime $z end $y] + incr endTime [expr { - wide($dstOffset) }] + if { $startTime < $endTime } { + lappend data \ + [list $startTime $dstOffset 1 $dstName] \ + [list $endTime $stdOffset 0 $stdName] + } else { + lappend data \ + [list $endTime $stdOffset 0 $stdName] \ + [list $startTime $dstOffset 1 $dstName] + } + } + + return $data +} + +#---------------------------------------------------------------------- +# +# DeterminePosixDSTTime -- +# +# Determines the time that Daylight Saving Time starts or ends from a +# Posix time zone specification. +# +# Parameters: +# z - Time zone data returned from ParsePosixTimeZone. +# Missing fields are expected to be filled in with +# default values. +# bound - The word 'start' or 'end' +# y - The year for which the transition time is to be determined. +# +# Results: +# Returns the transition time as a count of seconds from the epoch. The +# time is relative to the wall clock, not UTC. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::DeterminePosixDSTTime { z bound y } { + + variable FEB_28 + + # Determine the start or end day of DST + + set date [dict create era CE year $y] + set doy [dict get $z ${bound}DayOfYear] + if { $doy ne {} } { + + # Time was specified as a day of the year + + if { [dict get $z ${bound}J] ne {} + && [IsGregorianLeapYear $y] + && ( $doy > $FEB_28 ) } { + incr doy + } + dict set date dayOfYear $doy + set date [GetJulianDayFromEraYearDay $date[set date {}] 2361222] + } else { + # Time was specified as a day of the week within a month + + dict set date month [dict get $z ${bound}Month] + dict set date dayOfWeek [dict get $z ${bound}DayOfWeek] + set dowim [dict get $z ${bound}WeekOfMonth] + if { $dowim >= 5 } { + set dowim -1 + } + dict set date dayOfWeekInMonth $dowim + set date [GetJulianDayFromEraYearMonthWeekDay $date[set date {}] 2361222] + + } + + set jd [dict get $date julianDay] + set seconds [expr { + wide($jd) * wide(86400) - wide(210866803200) + }] + + set h [dict get $z ${bound}Hours] + if { $h eq {} } { + set h 2 + } else { + set h [lindex [::scan $h %d] 0] + } + set m [dict get $z ${bound}Minutes] + if { $m eq {} } { + set m 0 + } else { + set m [lindex [::scan $m %d] 0] + } + set s [dict get $z ${bound}Seconds] + if { $s eq {} } { + set s 0 + } else { + set s [lindex [::scan $s %d] 0] + } + set tod [expr { ( $h * 60 + $m ) * 60 + $s }] + return [expr { $seconds + $tod }] +} + +#---------------------------------------------------------------------- +# +# GetLocaleEra -- +# +# Given local time expressed in seconds from the Posix epoch, +# determine localized era and year within the era. +# +# Parameters: +# date - Dictionary that must contain the keys, 'localSeconds', +# whose value is expressed as the appropriate local time; +# and 'year', whose value is the Gregorian year. +# etable - Value of the LOCALE_ERAS key in the message catalogue +# for the target locale. +# +# Results: +# Returns the dictionary, augmented with the keys, 'localeEra' and +# 'localeYear'. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::GetLocaleEra { date etable } { + set index [BSearch $etable [dict get $date localSeconds]] + if { $index < 0} { + dict set date localeEra \ + [::format %02d [expr { [dict get $date year] / 100 }]] + dict set date localeYear [expr { + [dict get $date year] % 100 + }] + } else { + dict set date localeEra [lindex $etable $index 1] + dict set date localeYear [expr { + [dict get $date year] - [lindex $etable $index 2] + }] + } + return $date +} + +#---------------------------------------------------------------------- +# +# GetJulianDayFromEraYearDay -- +# +# Given a year, month and day on the Gregorian calendar, determines +# the Julian Day Number beginning at noon on that date. +# +# Parameters: +# date -- A dictionary in which the 'era', 'year', and +# 'dayOfYear' slots are populated. The calendar in use +# is determined by the date itself relative to: +# changeover -- Julian day on which the Gregorian calendar was +# adopted in the current locale. +# +# Results: +# Returns the given dictionary augmented with a 'julianDay' key whose +# value is the desired Julian Day Number, and a 'gregorian' key that +# specifies whether the calendar is Gregorian (1) or Julian (0). +# +# Side effects: +# None. +# +# Bugs: +# This code needs to be moved to the C layer. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::GetJulianDayFromEraYearDay {date changeover} { + # Get absolute year number from the civil year + + switch -exact -- [dict get $date era] { + BCE { + set year [expr { 1 - [dict get $date year] }] + } + CE { + set year [dict get $date year] + } + } + set ym1 [expr { $year - 1 }] + + # Try the Gregorian calendar first. + + dict set date gregorian 1 + set jd [expr { + 1721425 + + [dict get $date dayOfYear] + + ( 365 * $ym1 ) + + ( $ym1 / 4 ) + - ( $ym1 / 100 ) + + ( $ym1 / 400 ) + }] + + # If the date is before the Gregorian change, use the Julian calendar. + + if { $jd < $changeover } { + dict set date gregorian 0 + set jd [expr { + 1721423 + + [dict get $date dayOfYear] + + ( 365 * $ym1 ) + + ( $ym1 / 4 ) + }] + } + + dict set date julianDay $jd + return $date +} + +#---------------------------------------------------------------------- +# +# GetJulianDayFromEraYearMonthWeekDay -- +# +# Determines the Julian Day number corresponding to the nth given +# day-of-the-week in a given month. +# +# Parameters: +# date - Dictionary containing the keys, 'era', 'year', 'month' +# 'weekOfMonth', 'dayOfWeek', and 'dayOfWeekInMonth'. +# changeover - Julian Day of adoption of the Gregorian calendar +# +# Results: +# Returns the given dictionary, augmented with a 'julianDay' key. +# +# Side effects: +# None. +# +# Bugs: +# This code needs to be moved to the C layer. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::GetJulianDayFromEraYearMonthWeekDay {date changeover} { + # Come up with a reference day; either the zeroeth day of the given month + # (dayOfWeekInMonth >= 0) or the seventh day of the following month + # (dayOfWeekInMonth < 0) + + set date2 $date + set week [dict get $date dayOfWeekInMonth] + if { $week >= 0 } { + dict set date2 dayOfMonth 0 + } else { + dict incr date2 month + dict set date2 dayOfMonth 7 + } + set date2 [GetJulianDayFromEraYearMonthDay $date2[set date2 {}] \ + $changeover] + set wd0 [WeekdayOnOrBefore [dict get $date dayOfWeek] \ + [dict get $date2 julianDay]] + dict set date julianDay [expr { $wd0 + 7 * $week }] + return $date +} + +#---------------------------------------------------------------------- +# +# IsGregorianLeapYear -- +# +# Determines whether a given date represents a leap year in the +# Gregorian calendar. +# +# Parameters: +# date -- The date to test. The fields, 'era', 'year' and 'gregorian' +# must be set. +# +# Results: +# Returns 1 if the year is a leap year, 0 otherwise. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::IsGregorianLeapYear { date } { + switch -exact -- [dict get $date era] { + BCE { + set year [expr { 1 - [dict get $date year]}] + } + CE { + set year [dict get $date year] + } + } + if { $year % 4 != 0 } { + return 0 + } elseif { ![dict get $date gregorian] } { + return 1 + } elseif { $year % 400 == 0 } { + return 1 + } elseif { $year % 100 == 0 } { + return 0 + } else { + return 1 + } +} + +#---------------------------------------------------------------------- +# +# WeekdayOnOrBefore -- +# +# Determine the nearest day of week (given by the 'weekday' parameter, +# Sunday==0) on or before a given Julian Day. +# +# Parameters: +# weekday -- Day of the week +# j -- Julian Day number +# +# Results: +# Returns the Julian Day Number of the desired date. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::WeekdayOnOrBefore { weekday j } { + set k [expr { ( $weekday + 6 ) % 7 }] + return [expr { $j - ( $j - $k ) % 7 }] +} + +#---------------------------------------------------------------------- +# +# BSearch -- +# +# Service procedure that does binary search in several places inside the +# 'clock' command. +# +# Parameters: +# list - List of lists, sorted in ascending order by the +# first elements +# key - Value to search for +# +# Results: +# Returns the index of the greatest element in $list that is less than +# or equal to $key. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::BSearch { list key } { + if {[llength $list] == 0} { + return -1 + } + if { $key < [lindex $list 0 0] } { + return -1 + } + + set l 0 + set u [expr { [llength $list] - 1 }] + + while { $l < $u } { + # At this point, we know that + # $k >= [lindex $list $l 0] + # Either $u == [llength $list] or else $k < [lindex $list $u+1 0] + # We find the midpoint of the interval {l,u} rounded UP, compare + # against it, and set l or u to maintain the invariant. Note that the + # interval shrinks at each step, guaranteeing convergence. + + set m [expr { ( $l + $u + 1 ) / 2 }] + if { $key >= [lindex $list $m 0] } { + set l $m + } else { + set u [expr { $m - 1 }] + } + } + + return $l +} + +#---------------------------------------------------------------------- +# +# clock add -- +# +# Adds an offset to a given time. +# +# Syntax: +# clock add clockval ?count unit?... ?-option value? +# +# Parameters: +# clockval -- Starting time value +# count -- Amount of a unit of time to add +# unit -- Unit of time to add, must be one of: +# years year months month weeks week +# days day hours hour minutes minute +# seconds second +# +# Options: +# -gmt BOOLEAN +# (Deprecated) Flag synonymous with '-timezone :GMT' +# -timezone ZONE +# Name of the time zone in which calculations are to be done. +# -locale NAME +# Name of the locale in which calculations are to be done. +# Used to determine the Gregorian change date. +# +# Results: +# Returns the given time adjusted by the given offset(s) in +# order. +# +# Notes: +# It is possible that adding a number of months or years will adjust the +# day of the month as well. For instance, the time at one month after +# 31 January is either 28 or 29 February, because February has fewer +# than 31 days. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::add { clockval args } { + if { [llength $args] % 2 != 0 } { + set cmdName "clock add" + return -code error \ + -errorcode [list CLOCK wrongNumArgs] \ + "wrong \# args: should be\ + \"$cmdName clockval ?number units?...\ + ?-gmt boolean? ?-locale LOCALE? ?-timezone ZONE?\"" + } + if { [catch { expr {wide($clockval)} } result] } { + return -code error $result + } + + set offsets {} + set gmt 0 + set locale c + set timezone [GetSystemTimeZone] + + foreach { a b } $args { + if { [string is integer -strict $a] } { + lappend offsets $a $b + } else { + switch -exact -- $a { + -g - -gm - -gmt { + set gmt $b + } + -l - -lo - -loc - -loca - -local - -locale { + set locale [string tolower $b] + } + -t - -ti - -tim - -time - -timez - -timezo - -timezon - + -timezone { + set timezone $b + } + default { + throw [list CLOCK badOption $a] \ + "bad option \"$a\",\ + must be -gmt, -locale or -timezone" + } + } + } + } + + # Check options for validity + + if { [info exists saw(-gmt)] && [info exists saw(-timezone)] } { + return -code error \ + -errorcode [list CLOCK gmtWithTimezone] \ + "cannot use -gmt and -timezone in same call" + } + if { [catch { expr { wide($clockval) } } result] } { + return -code error "expected integer but got \"$clockval\"" + } + if { ![string is boolean -strict $gmt] } { + return -code error "expected boolean value but got \"$gmt\"" + } elseif { $gmt } { + set timezone :GMT + } + + EnterLocale $locale + + set changeover [mc GREGORIAN_CHANGE_DATE] + + if {[catch {SetupTimeZone $timezone} retval opts]} { + dict unset opts -errorinfo + return -options $opts $retval + } + + try { + foreach { quantity unit } $offsets { + switch -exact -- $unit { + years - year { + set clockval [AddMonths [expr { 12 * $quantity }] \ + $clockval $timezone $changeover] + } + months - month { + set clockval [AddMonths $quantity $clockval $timezone \ + $changeover] + } + + weeks - week { + set clockval [AddDays [expr { 7 * $quantity }] \ + $clockval $timezone $changeover] + } + days - day { + set clockval [AddDays $quantity $clockval $timezone \ + $changeover] + } + + hours - hour { + set clockval [expr { 3600 * $quantity + $clockval }] + } + minutes - minute { + set clockval [expr { 60 * $quantity + $clockval }] + } + seconds - second { + set clockval [expr { $quantity + $clockval }] + } + + default { + throw [list CLOCK badUnit $unit] \ + "unknown unit \"$unit\", must be \ + years, months, weeks, days, hours, minutes or seconds" + } + } + } + return $clockval + } trap CLOCK {result opts} { + # Conceal the innards of [clock] when it's an expected error + dict unset opts -errorinfo + return -options $opts $result + } +} + +#---------------------------------------------------------------------- +# +# AddMonths -- +# +# Add a given number of months to a given clock value in a given +# time zone. +# +# Parameters: +# months - Number of months to add (may be negative) +# clockval - Seconds since the epoch before the operation +# timezone - Time zone in which the operation is to be performed +# +# Results: +# Returns the new clock value as a number of seconds since +# the epoch. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AddMonths { months clockval timezone changeover } { + variable DaysInRomanMonthInCommonYear + variable DaysInRomanMonthInLeapYear + variable TZData + + # Convert the time to year, month, day, and fraction of day. + + set date [GetDateFields $clockval $TZData($timezone) $changeover] + dict set date secondOfDay [expr { + [dict get $date localSeconds] % 86400 + }] + dict set date tzName $timezone + + # Add the requisite number of months + + set m [dict get $date month] + incr m $months + incr m -1 + set delta [expr { $m / 12 }] + set mm [expr { $m % 12 }] + dict set date month [expr { $mm + 1 }] + dict incr date year $delta + + # If the date doesn't exist in the current month, repair it + + if { [IsGregorianLeapYear $date] } { + set hath [lindex $DaysInRomanMonthInLeapYear $mm] + } else { + set hath [lindex $DaysInRomanMonthInCommonYear $mm] + } + if { [dict get $date dayOfMonth] > $hath } { + dict set date dayOfMonth $hath + } + + # Reconvert to a number of seconds + + set date [GetJulianDayFromEraYearMonthDay \ + $date[set date {}]\ + $changeover] + dict set date localSeconds [expr { + -210866803200 + + ( 86400 * wide([dict get $date julianDay]) ) + + [dict get $date secondOfDay] + }] + set date [ConvertLocalToUTC $date[set date {}] $TZData($timezone) \ + $changeover] + + return [dict get $date seconds] + +} + +#---------------------------------------------------------------------- +# +# AddDays -- +# +# Add a given number of days to a given clock value in a given time +# zone. +# +# Parameters: +# days - Number of days to add (may be negative) +# clockval - Seconds since the epoch before the operation +# timezone - Time zone in which the operation is to be performed +# changeover - Julian Day on which the Gregorian calendar was adopted +# in the target locale. +# +# Results: +# Returns the new clock value as a number of seconds since the epoch. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AddDays { days clockval timezone changeover } { + variable TZData + + # Convert the time to Julian Day + + set date [GetDateFields $clockval $TZData($timezone) $changeover] + dict set date secondOfDay [expr { + [dict get $date localSeconds] % 86400 + }] + dict set date tzName $timezone + + # Add the requisite number of days + + dict incr date julianDay $days + + # Reconvert to a number of seconds + + dict set date localSeconds [expr { + -210866803200 + + ( 86400 * wide([dict get $date julianDay]) ) + + [dict get $date secondOfDay] + }] + set date [ConvertLocalToUTC $date[set date {}] $TZData($timezone) \ + $changeover] + + return [dict get $date seconds] + +} + +#---------------------------------------------------------------------- +# +# ChangeCurrentLocale -- +# +# The global locale was changed within msgcat. +# Clears the buffered parse functions of the current locale. +# +# Parameters: +# loclist (ignored) +# +# Results: +# None. +# +# Side effects: +# Buffered parse functions are cleared. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ChangeCurrentLocale {args} { + variable FormatProc + variable LocaleNumeralCache + variable CachedSystemTimeZone + variable TimeZoneBad + + foreach p [info procs [namespace current]::scanproc'*'current] { + rename $p {} + } + foreach p [info procs [namespace current]::formatproc'*'current] { + rename $p {} + } + + catch {array unset FormatProc *'current} + set LocaleNumeralCache {} +} + +#---------------------------------------------------------------------- +# +# ClearCaches -- +# +# Clears all caches to reclaim the memory used in [clock] +# +# Parameters: +# None. +# +# Results: +# None. +# +# Side effects: +# Caches are cleared. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ClearCaches {} { + variable FormatProc + variable LocaleNumeralCache + variable CachedSystemTimeZone + variable TimeZoneBad + + foreach p [info procs [namespace current]::scanproc'*] { + rename $p {} + } + foreach p [info procs [namespace current]::formatproc'*] { + rename $p {} + } + + catch {unset FormatProc} + set LocaleNumeralCache {} + catch {unset CachedSystemTimeZone} + set TimeZoneBad {} + InitTZData +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/ascii.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/ascii.enc new file mode 100644 index 00000000..e0320b8c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/ascii.enc @@ -0,0 +1,20 @@ +# Encoding file: ascii, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/big5.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/big5.enc new file mode 100644 index 00000000..26179f43 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/big5.enc @@ -0,0 +1,1516 @@ +# Encoding file: big5, multi-byte +M +003F 0 89 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3000FF0C30013002FF0E2022FF1BFF1AFF1FFF01FE3020262025FE50FF64FE52 +00B7FE54FE55FE56FE57FF5C2013FE312014FE33FFFDFE34FE4FFF08FF09FE35 +FE36FF5BFF5DFE37FE3830143015FE39FE3A30103011FE3BFE3C300A300BFE3D +FE3E30083009FE3FFE40300C300DFE41FE42300E300FFE43FE44FE59FE5A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FE5BFE5CFE5DFE5E20182019201C201D301D301E20352032FF03FF06FF0A +203B00A7300325CB25CF25B325B225CE2606260525C725C625A125A025BD25BC +32A32105203EFFFDFF3FFFFDFE49FE4AFE4DFE4EFE4BFE4CFE5FFE60FE61FF0B +FF0D00D700F700B1221AFF1CFF1EFF1D226622672260221E22522261FE62FE63 +FE64FE65FE66223C2229222A22A52220221F22BF33D233D1222B222E22352234 +26402642264126092191219321902192219621972199219822252223FFFD0000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FFFDFF0FFF3CFF0400A5301200A200A3FF05FF2021032109FE69FE6AFE6B33D5 +339C339D339E33CE33A1338E338F33C400B05159515B515E515D5161516355E7 +74E97CCE25812582258325842585258625872588258F258E258D258C258B258A +2589253C2534252C2524251C2594250025022595250C251025142518256D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000256E2570256F2550255E256A256125E225E325E525E4257125722573FF10 +FF11FF12FF13FF14FF15FF16FF17FF18FF192160216121622163216421652166 +216721682169302130223023302430253026302730283029FFFD5344FFFDFF21 +FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30FF31 +FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF41FF42FF43FF44FF45FF46FF47 +FF48FF49FF4AFF4BFF4CFF4DFF4EFF4FFF50FF51FF52FF53FF54FF55FF560000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FF57FF58FF59FF5A039103920393039403950396039703980399039A039B039C +039D039E039F03A003A103A303A403A503A603A703A803A903B103B203B303B4 +03B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C103C303C403C5 +03C603C703C803C931053106310731083109310A310B310C310D310E310F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00003110311131123113311431153116311731183119311A311B311C311D311E +311F312031213122312331243125312631273128312902D902C902CA02C702CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E004E594E014E034E434E5D4E864E8C4EBA513F5165516B51E052005201529B +53155341535C53C84E094E0B4E084E0A4E2B4E3851E14E454E484E5F4E5E4E8E +4EA15140520352FA534353C953E3571F58EB5915592759735B505B515B535BF8 +5C0F5C225C385C715DDD5DE55DF15DF25DF35DFE5E725EFE5F0B5F13624D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E114E104E0D4E2D4E304E394E4B5C394E884E914E954E924E944EA24EC1 +4EC04EC34EC64EC74ECD4ECA4ECB4EC4514351415167516D516E516C519751F6 +52065207520852FB52FE52FF53165339534853475345535E538453CB53CA53CD +58EC5929592B592A592D5B545C115C245C3A5C6F5DF45E7B5EFF5F145F155FC3 +62086236624B624E652F6587659765A465B965E566F0670867286B206B626B79 +6BCB6BD46BDB6C0F6C34706B722A7236723B72477259725B72AC738B4E190000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E164E154E144E184E3B4E4D4E4F4E4E4EE54ED84ED44ED54ED64ED74EE34EE4 +4ED94EDE514551445189518A51AC51F951FA51F8520A52A0529F530553065317 +531D4EDF534A534953615360536F536E53BB53EF53E453F353EC53EE53E953E8 +53FC53F853F553EB53E653EA53F253F153F053E553ED53FB56DB56DA59160000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000592E5931597459765B555B835C3C5DE85DE75DE65E025E035E735E7C5F01 +5F185F175FC5620A625362546252625165A565E6672E672C672A672B672D6B63 +6BCD6C116C106C386C416C406C3E72AF7384738974DC74E67518751F75287529 +7530753175327533758B767D76AE76BF76EE77DB77E277F3793A79BE7A747ACB +4E1E4E1F4E524E534E694E994EA44EA64EA54EFF4F094F194F0A4F154F0D4F10 +4F114F0F4EF24EF64EFB4EF04EF34EFD4F014F0B514951475146514851680000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5171518D51B0521752115212520E521652A3530853215320537053715409540F +540C540A54105401540B54045411540D54085403540E5406541256E056DE56DD +573357305728572D572C572F57295919591A59375938598459785983597D5979 +598259815B575B585B875B885B855B895BFA5C165C795DDE5E065E765E740000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F0F5F1B5FD95FD6620E620C620D62106263625B6258653665E965E865EC +65ED66F266F36709673D6734673167356B216B646B7B6C166C5D6C576C596C5F +6C606C506C556C616C5B6C4D6C4E7070725F725D767E7AF97C737CF87F367F8A +7FBD80018003800C80128033807F8089808B808C81E381EA81F381FC820C821B +821F826E8272827E866B8840884C8863897F96214E324EA84F4D4F4F4F474F57 +4F5E4F344F5B4F554F304F504F514F3D4F3A4F384F434F544F3C4F464F630000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F5C4F604F2F4F4E4F364F594F5D4F484F5A514C514B514D517551B651B75225 +52245229522A522852AB52A952AA52AC532353735375541D542D541E543E5426 +544E542754465443543354485442541B5429544A5439543B5438542E54355436 +5420543C54405431542B541F542C56EA56F056E456EB574A57515740574D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005747574E573E5750574F573B58EF593E599D599259A8599E59A359995996 +598D59A45993598A59A55B5D5B5C5B5A5B5B5B8C5B8B5B8F5C2C5C405C415C3F +5C3E5C905C915C945C8C5DEB5E0C5E8F5E875E8A5EF75F045F1F5F645F625F77 +5F795FD85FCC5FD75FCD5FF15FEB5FF85FEA6212621162846297629662806276 +6289626D628A627C627E627962736292626F6298626E62956293629162866539 +653B653865F166F4675F674E674F67506751675C6756675E6749674667600000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +675367576B656BCF6C426C5E6C996C816C886C896C856C9B6C6A6C7A6C906C70 +6C8C6C686C966C926C7D6C836C726C7E6C746C866C766C8D6C946C986C827076 +707C707D707872627261726072C472C27396752C752B75377538768276EF77E3 +79C179C079BF7A767CFB7F5580968093809D8098809B809A80B2826F82920000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000828B828D898B89D28A008C378C468C558C9D8D648D708DB38EAB8ECA8F9B +8FB08FC28FC68FC58FC45DE1909190A290AA90A690A3914991C691CC9632962E +9631962A962C4E264E564E734E8B4E9B4E9E4EAB4EAC4F6F4F9D4F8D4F734F7F +4F6C4F9B4F8B4F864F834F704F754F884F694F7B4F964F7E4F8F4F914F7A5154 +51525155516951775176517851BD51FD523B52385237523A5230522E52365241 +52BE52BB5352535453535351536653775378537953D653D453D7547354750000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5496547854955480547B5477548454925486547C549054715476548C549A5462 +5468548B547D548E56FA57835777576A5769576157665764577C591C59495947 +59485944595459BE59BB59D459B959AE59D159C659D059CD59CB59D359CA59AF +59B359D259C55B5F5B645B635B975B9A5B985B9C5B995B9B5C1A5C485C450000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C465CB75CA15CB85CA95CAB5CB15CB35E185E1A5E165E155E1B5E115E78 +5E9A5E975E9C5E955E965EF65F265F275F295F805F815F7F5F7C5FDD5FE05FFD +5FF55FFF600F6014602F60356016602A6015602160276029602B601B62166215 +623F623E6240627F62C962CC62C462BF62C262B962D262DB62AB62D362D462CB +62C862A862BD62BC62D062D962C762CD62B562DA62B162D862D662D762C662AC +62CE653E65A765BC65FA66146613660C66066602660E6600660F6615660A0000 +AA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6607670D670B676D678B67956771679C677367776787679D6797676F6770677F +6789677E67906775679A6793677C676A67726B236B666B676B7F6C136C1B6CE3 +6CE86CF36CB16CCC6CE56CB36CBD6CBE6CBC6CE26CAB6CD56CD36CB86CC46CB9 +6CC16CAE6CD76CC56CF16CBF6CBB6CE16CDB6CCA6CAC6CEF6CDC6CD66CE00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007095708E7092708A7099722C722D723872487267726972C072CE72D972D7 +72D073A973A8739F73AB73A5753D759D7599759A768476C276F276F477E577FD +793E7940794179C979C87A7A7A797AFA7CFE7F547F8C7F8B800580BA80A580A2 +80B180A180AB80A980B480AA80AF81E581FE820D82B3829D829982AD82BD829F +82B982B182AC82A582AF82B882A382B082BE82B7864E8671521D88688ECB8FCE +8FD48FD190B590B890B190B691C791D195779580961C9640963F963B96440000 +AB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +964296B996E89752975E4E9F4EAD4EAE4FE14FB54FAF4FBF4FE04FD14FCF4FDD +4FC34FB64FD84FDF4FCA4FD74FAE4FD04FC44FC24FDA4FCE4FDE4FB751575192 +519151A0524E5243524A524D524C524B524752C752C952C352C1530D5357537B +539A53DB54AC54C054A854CE54C954B854A654B354C754C254BD54AA54C10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054C454C854AF54AB54B154BB54A954A754BF56FF5782578B57A057A357A2 +57CE57AE579359555951594F594E595059DC59D859FF59E359E85A0359E559EA +59DA59E65A0159FB5B695BA35BA65BA45BA25BA55C015C4E5C4F5C4D5C4B5CD9 +5CD25DF75E1D5E255E1F5E7D5EA05EA65EFA5F085F2D5F655F885F855F8A5F8B +5F875F8C5F896012601D60206025600E6028604D60706068606260466043606C +606B606A6064624162DC6316630962FC62ED630162EE62FD630762F162F70000 +AC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62EF62EC62FE62F463116302653F654565AB65BD65E26625662D66206627662F +661F66286631662466F767FF67D367F167D467D067EC67B667AF67F567E967EF +67C467D167B467DA67E567B867CF67DE67F367B067D967E267DD67D26B6A6B83 +6B866BB56BD26BD76C1F6CC96D0B6D326D2A6D416D256D0C6D316D1E6D170000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D3B6D3D6D3E6D366D1B6CF56D396D276D386D296D2E6D356D0E6D2B70AB +70BA70B370AC70AF70AD70B870AE70A472307272726F727472E972E072E173B7 +73CA73BB73B273CD73C073B3751A752D754F754C754E754B75AB75A475A575A2 +75A3767876867687768876C876C676C376C5770176F976F87709770B76FE76FC +770777DC78027814780C780D794679497948794779B979BA79D179D279CB7A7F +7A817AFF7AFD7C7D7D027D057D007D097D077D047D067F387F8E7FBF80040000 +AD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8010800D8011803680D680E580DA80C380C480CC80E180DB80CE80DE80E480DD +81F4822282E78303830582E382DB82E6830482E58302830982D282D782F18301 +82DC82D482D182DE82D382DF82EF830686508679867B867A884D886B898189D4 +8A088A028A038C9E8CA08D748D738DB48ECD8ECC8FF08FE68FE28FEA8FE50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008FED8FEB8FE48FE890CA90CE90C190C3914B914A91CD95829650964B964C +964D9762976997CB97ED97F3980198A898DB98DF999699994E584EB3500C500D +50234FEF502650254FF8502950165006503C501F501A501250114FFA50005014 +50284FF15021500B501950184FF34FEE502D502A4FFE502B5009517C51A451A5 +51A251CD51CC51C651CB5256525C5254525B525D532A537F539F539D53DF54E8 +55105501553754FC54E554F2550654FA551454E954ED54E1550954EE54EA0000 +AE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54E65527550754FD550F5703570457C257D457CB57C35809590F59575958595A +5A115A185A1C5A1F5A1B5A1359EC5A205A235A295A255A0C5A095B6B5C585BB0 +5BB35BB65BB45BAE5BB55BB95BB85C045C515C555C505CED5CFD5CFB5CEA5CE8 +5CF05CF65D015CF45DEE5E2D5E2B5EAB5EAD5EA75F315F925F915F9060590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006063606560506055606D6069606F6084609F609A608D6094608C60856096 +624762F3630862FF634E633E632F635563426346634F6349633A6350633D632A +632B6328634D634C65486549659965C165C566426649664F66436652664C6645 +664166F867146715671768216838684868466853683968426854682968B36817 +684C6851683D67F468506840683C6843682A68456813681868416B8A6B896BB7 +6C236C276C286C266C246CF06D6A6D956D886D876D666D786D776D596D930000 +AF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D6C6D896D6E6D5A6D746D696D8C6D8A6D796D856D656D9470CA70D870E470D9 +70C870CF7239727972FC72F972FD72F872F7738673ED740973EE73E073EA73DE +7554755D755C755A755975BE75C575C775B275B375BD75BC75B975C275B8768B +76B076CA76CD76CE7729771F7720772877E9783078277838781D783478370000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007825782D7820781F7832795579507960795F7956795E795D7957795A79E4 +79E379E779DF79E679E979D87A847A887AD97B067B117C897D217D177D0B7D0A +7D207D227D147D107D157D1A7D1C7D0D7D197D1B7F3A7F5F7F947FC57FC18006 +8018801580198017803D803F80F1810280F0810580ED80F4810680F880F38108 +80FD810A80FC80EF81ED81EC82008210822A822B8228822C82BB832B83528354 +834A83388350834983358334834F833283398336831783408331832883430000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8654868A86AA869386A486A9868C86A3869C8870887788818882887D88798A18 +8A108A0E8A0C8A158A0A8A178A138A168A0F8A118C488C7A8C798CA18CA28D77 +8EAC8ED28ED48ECF8FB1900190068FF790008FFA8FF490038FFD90058FF89095 +90E190DD90E29152914D914C91D891DD91D791DC91D995839662966396610000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000965B965D96649658965E96BB98E299AC9AA89AD89B259B329B3C4E7E507A +507D505C50475043504C505A504950655076504E5055507550745077504F500F +506F506D515C519551F0526A526F52D252D952D852D55310530F5319533F5340 +533E53C366FC5546556A55665544555E55615543554A55315556554F5555552F +55645538552E555C552C55635533554155575708570B570957DF5805580A5806 +57E057E457FA5802583557F757F9592059625A365A415A495A665A6A5A400000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A3C5A625A5A5A465A4A5B705BC75BC55BC45BC25BBF5BC65C095C085C075C60 +5C5C5C5D5D075D065D0E5D1B5D165D225D115D295D145D195D245D275D175DE2 +5E385E365E335E375EB75EB85EB65EB55EBE5F355F375F575F6C5F695F6B5F97 +5F995F9E5F985FA15FA05F9C607F60A3608960A060A860CB60B460E660BD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060C560BB60B560DC60BC60D860D560C660DF60B860DA60C7621A621B6248 +63A063A76372639663A263A563776367639863AA637163A963896383639B636B +63A863846388639963A163AC6392638F6380637B63696368637A655D65566551 +65596557555F654F655865556554659C659B65AC65CF65CB65CC65CE665D665A +666466686666665E66F952D7671B688168AF68A2689368B5687F687668B168A7 +689768B0688368C468AD688668856894689D68A8689F68A168826B326BBA0000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6BEB6BEC6C2B6D8E6DBC6DF36DD96DB26DE16DCC6DE46DFB6DFA6E056DC76DCB +6DAF6DD16DAE6DDE6DF96DB86DF76DF56DC56DD26E1A6DB56DDA6DEB6DD86DEA +6DF16DEE6DE86DC66DC46DAA6DEC6DBF6DE670F97109710A70FD70EF723D727D +7281731C731B73167313731973877405740A7403740673FE740D74E074F60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000074F7751C75227565756675627570758F75D475D575B575CA75CD768E76D4 +76D276DB7737773E773C77367738773A786B7843784E79657968796D79FB7A92 +7A957B207B287B1B7B2C7B267B197B1E7B2E7C927C977C957D467D437D717D2E +7D397D3C7D407D307D337D447D2F7D427D327D317F3D7F9E7F9A7FCC7FCE7FD2 +801C804A8046812F81168123812B81298130812482028235823782368239838E +839E8398837883A2839683BD83AB8392838A8393838983A08377837B837C0000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +838683A786555F6A86C786C086B686C486B586C686CB86B186AF86C98853889E +888888AB88928896888D888B8993898F8A2A8A1D8A238A258A318A2D8A1F8A1B +8A228C498C5A8CA98CAC8CAB8CA88CAA8CA78D678D668DBE8DBA8EDB8EDF9019 +900D901A90179023901F901D90109015901E9020900F90229016901B90140000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090E890ED90FD915791CE91F591E691E391E791ED91E99589966A96759673 +96789670967496769677966C96C096EA96E97AE07ADF980298039B5A9CE59E75 +9E7F9EA59EBB50A2508D508550995091508050965098509A670051F152725274 +5275526952DE52DD52DB535A53A5557B558055A7557C558A559D55985582559C +55AA55945587558B558355B355AE559F553E55B2559A55BB55AC55B1557E5589 +55AB5599570D582F582A58345824583058315821581D582058F958FA59600000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A775A9A5A7F5A925A9B5AA75B735B715BD25BCC5BD35BD05C0A5C0B5C315D4C +5D505D345D475DFD5E455E3D5E405E435E7E5ECA5EC15EC25EC45F3C5F6D5FA9 +5FAA5FA860D160E160B260B660E0611C612360FA611560F060FB60F4616860F1 +610E60F6610961006112621F624963A3638C63CF63C063E963C963C663CD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000063D263E363D063E163D663ED63EE637663F463EA63DB645263DA63F9655E +6566656265636591659065AF666E667066746676666F6691667A667E667766FE +66FF671F671D68FA68D568E068D868D7690568DF68F568EE68E768F968D268F2 +68E368CB68CD690D6912690E68C968DA696E68FB6B3E6B3A6B3D6B986B966BBC +6BEF6C2E6C2F6C2C6E2F6E386E546E216E326E676E4A6E206E256E236E1B6E5B +6E586E246E566E6E6E2D6E266E6F6E346E4D6E3A6E2C6E436E1D6E3E6ECB0000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E896E196E4E6E636E446E726E696E5F7119711A7126713071217136716E711C +724C728472807336732573347329743A742A743374227425743574367434742F +741B7426742875257526756B756A75E275DB75E375D975D875DE75E0767B767C +7696769376B476DC774F77ED785D786C786F7A0D7A087A0B7A057A007A980000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A977A967AE57AE37B497B567B467B507B527B547B4D7B4B7B4F7B517C9F +7CA57D5E7D507D687D557D2B7D6E7D727D617D667D627D707D7355847FD47FD5 +800B8052808581558154814B8151814E81398146813E814C815381748212821C +83E9840383F8840D83E083C5840B83C183EF83F183F48457840A83F0840C83CC +83FD83F283CA8438840E840483DC840783D483DF865B86DF86D986ED86D486DB +86E486D086DE885788C188C288B1898389968A3B8A608A558A5E8A3C8A410000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8A548A5B8A508A468A348A3A8A368A568C618C828CAF8CBC8CB38CBD8CC18CBB +8CC08CB48CB78CB68CBF8CB88D8A8D858D818DCE8DDD8DCB8DDA8DD18DCC8DDB +8DC68EFB8EF88EFC8F9C902E90359031903890329036910290F5910990FE9163 +916591CF9214921592239209921E920D9210920792119594958F958B95910000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000095939592958E968A968E968B967D96859686968D9672968496C196C596C4 +96C696C796EF96F297CC98059806980898E798EA98EF98E998F298ED99AE99AD +9EC39ECD9ED14E8250AD50B550B250B350C550BE50AC50B750BB50AF50C7527F +5277527D52DF52E652E452E252E3532F55DF55E855D355E655CE55DC55C755D1 +55E355E455EF55DA55E155C555C655E555C957125713585E585158585857585A +5854586B584C586D584A58625852584B59675AC15AC95ACC5ABE5ABD5ABC0000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5AB35AC25AB25D695D6F5E4C5E795EC95EC85F125F595FAC5FAE611A610F6148 +611F60F3611B60F961016108614E614C6144614D613E61346127610D61066137 +622162226413643E641E642A642D643D642C640F641C6414640D643664166417 +6406656C659F65B06697668966876688669666846698668D67036994696D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000695A697769606954697569306982694A6968696B695E695369796986695D +6963695B6B476B726BC06BBF6BD36BFD6EA26EAF6ED36EB66EC26E906E9D6EC7 +6EC56EA56E986EBC6EBA6EAB6ED16E966E9C6EC46ED46EAA6EA76EB4714E7159 +7169716471497167715C716C7166714C7165715E714671687156723A72527337 +7345733F733E746F745A7455745F745E7441743F7459745B745C757675787600 +75F0760175F275F175FA75FF75F475F376DE76DF775B776B7766775E77630000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7779776A776C775C77657768776277EE788E78B078977898788C7889787C7891 +7893787F797A797F7981842C79BD7A1C7A1A7A207A147A1F7A1E7A9F7AA07B77 +7BC07B607B6E7B677CB17CB37CB57D937D797D917D817D8F7D5B7F6E7F697F6A +7F727FA97FA87FA480568058808680848171817081788165816E8173816B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008179817A81668205824784828477843D843184758466846B8449846C845B +843C8435846184638469846D8446865E865C865F86F9871387088707870086FE +86FB870287038706870A885988DF88D488D988DC88D888DD88E188CA88D588D2 +899C89E38A6B8A728A738A668A698A708A878A7C8A638AA08A718A858A6D8A62 +8A6E8A6C8A798A7B8A3E8A688C628C8A8C898CCA8CC78CC88CC48CB28CC38CC2 +8CC58DE18DDF8DE88DEF8DF38DFA8DEA8DE48DE68EB28F038F098EFE8F0A0000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8F9F8FB2904B904A905390429054903C905590509047904F904E904D9051903E +904191129117916C916A916991C9923792579238923D9240923E925B924B9264 +925192349249924D92459239923F925A959896989694969596CD96CB96C996CA +96F796FB96F996F6975697749776981098119813980A9812980C98FC98F40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000098FD98FE99B399B199B49AE19CE99E829F0E9F139F2050E750EE50E550D6 +50ED50DA50D550CF50D150F150CE50E9516251F352835282533153AD55FE5600 +561B561755FD561456065609560D560E55F75616561F5608561055F657185716 +5875587E58835893588A58795885587D58FD592559225924596A59695AE15AE6 +5AE95AD75AD65AD85AE35B755BDE5BE75BE15BE55BE65BE85BE25BE45BDF5C0D +5C625D845D875E5B5E635E555E575E545ED35ED65F0A5F465F705FB961470000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +613F614B617761626163615F615A61586175622A64876458645464A46478645F +647A645164676434646D647B657265A165D765D666A266A8669D699C69A86995 +69C169AE69D369CB699B69B769BB69AB69B469D069CD69AD69CC69A669C369A3 +6B496B4C6C336F336F146EFE6F136EF46F296F3E6F206F2C6F0F6F026F220000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006EFF6EEF6F066F316F386F326F236F156F2B6F2F6F886F2A6EEC6F016EF2 +6ECC6EF771947199717D718A71847192723E729272967344735074647463746A +7470746D750475917627760D760B7609761376E176E37784777D777F776178C1 +789F78A778B378A978A3798E798F798D7A2E7A317AAA7AA97AED7AEF7BA17B95 +7B8B7B757B977B9D7B947B8F7BB87B877B847CB97CBD7CBE7DBB7DB07D9C7DBD +7DBE7DA07DCA7DB47DB27DB17DBA7DA27DBF7DB57DB87DAD7DD27DC77DAC0000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7F707FE07FE17FDF805E805A808781508180818F8188818A817F818281E781FA +82078214821E824B84C984BF84C684C48499849E84B2849C84CB84B884C084D3 +849084BC84D184CA873F871C873B872287258734871887558737872988F38902 +88F488F988F888FD88E8891A88EF8AA68A8C8A9E8AA38A8D8AA18A938AA40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AAA8AA58AA88A988A918A9A8AA78C6A8C8D8C8C8CD38CD18CD28D6B8D99 +8D958DFC8F148F128F158F138FA390609058905C90639059905E9062905D905B +91199118911E917591789177917492789280928592989296927B9293929C92A8 +927C929195A195A895A995A395A595A49699969C969B96CC96D29700977C9785 +97F69817981898AF98B199039905990C990999C19AAF9AB09AE69B419B429CF4 +9CF69CF39EBC9F3B9F4A5104510050FB50F550F9510251085109510551DC0000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +528752885289528D528A52F053B2562E563B56395632563F563456295653564E +565756745636562F56305880589F589E58B3589C58AE58A958A6596D5B095AFB +5B0B5AF55B0C5B085BEE5BEC5BE95BEB5C645C655D9D5D945E625E5F5E615EE2 +5EDA5EDF5EDD5EE35EE05F485F715FB75FB561766167616E615D615561820000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000617C6170616B617E61A7619061AB618E61AC619A61A4619461AE622E6469 +646F6479649E64B26488649064B064A56493649564A9649264AE64AD64AB649A +64AC649964A264B365756577657866AE66AB66B466B16A236A1F69E86A016A1E +6A1969FD6A216A136A0A69F36A026A0569ED6A116B506B4E6BA46BC56BC66F3F +6F7C6F846F516F666F546F866F6D6F5B6F786F6E6F8E6F7A6F706F646F976F58 +6ED56F6F6F606F5F719F71AC71B171A87256729B734E73577469748B74830000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +747E7480757F76207629761F7624762676217622769A76BA76E4778E7787778C +7791778B78CB78C578BA78CA78BE78D578BC78D07A3F7A3C7A407A3D7A377A3B +7AAF7AAE7BAD7BB17BC47BB47BC67BC77BC17BA07BCC7CCA7DE07DF47DEF7DFB +7DD87DEC7DDD7DE87DE37DDA7DDE7DE97D9E7DD97DF27DF97F757F777FAF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007FE98026819B819C819D81A0819A81988517853D851A84EE852C852D8513 +851185238521851484EC852584FF850687828774877687608766877887688759 +8757874C8753885B885D89108907891289138915890A8ABC8AD28AC78AC48A95 +8ACB8AF88AB28AC98AC28ABF8AB08AD68ACD8AB68AB98ADB8C4C8C4E8C6C8CE0 +8CDE8CE68CE48CEC8CED8CE28CE38CDC8CEA8CE18D6D8D9F8DA38E2B8E108E1D +8E228E0F8E298E1F8E218E1E8EBA8F1D8F1B8F1F8F298F268F2A8F1C8F1E0000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8F259069906E9068906D90779130912D9127913191879189918B918392C592BB +92B792EA92AC92E492C192B392BC92D292C792F092B295AD95B1970497069707 +97099760978D978B978F9821982B981C98B3990A99139912991899DD99D099DF +99DB99D199D599D299D99AB79AEE9AEF9B279B459B449B779B6F9D069D090000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D039EA99EBE9ECE58A89F5251125118511451105115518051AA51DD5291 +529352F35659566B5679566956645678566A566856655671566F566C56625676 +58C158BE58C758C5596E5B1D5B345B785BF05C0E5F4A61B2619161A9618A61CD +61B661BE61CA61C8623064C564C164CB64BB64BC64DA64C464C764C264CD64BF +64D264D464BE657466C666C966B966C466C766B86A3D6A386A3A6A596A6B6A58 +6A396A446A626A616A4B6A476A356A5F6A486B596B776C056FC26FB16FA10000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6FC36FA46FC16FA76FB36FC06FB96FB66FA66FA06FB471BE71C971D071D271C8 +71D571B971CE71D971DC71C371C47368749C74A37498749F749E74E2750C750D +76347638763A76E776E577A0779E779F77A578E878DA78EC78E779A67A4D7A4E +7A467A4C7A4B7ABA7BD97C117BC97BE47BDB7BE17BE97BE67CD57CD67E0A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E117E087E1B7E237E1E7E1D7E097E107F797FB27FF07FF17FEE802881B3 +81A981A881FB820882588259854A855985488568856985438549856D856A855E +8783879F879E87A2878D8861892A89328925892B892189AA89A68AE68AFA8AEB +8AF18B008ADC8AE78AEE8AFE8B018B028AF78AED8AF38AF68AFC8C6B8C6D8C93 +8CF48E448E318E348E428E398E358F3B8F2F8F388F338FA88FA6907590749078 +9072907C907A913491929320933692F89333932F932292FC932B9304931A0000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9310932693219315932E931995BB96A796A896AA96D5970E97119716970D9713 +970F975B975C9766979898309838983B9837982D9839982499109928991E991B +9921991A99ED99E299F19AB89ABC9AFB9AED9B289B919D159D239D269D289D12 +9D1B9ED89ED49F8D9F9C512A511F5121513252F5568E56805690568556870000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000568F58D558D358D158CE5B305B2A5B245B7A5C375C685DBC5DBA5DBD5DB8 +5E6B5F4C5FBD61C961C261C761E661CB6232623464CE64CA64D864E064F064E6 +64EC64F164E264ED6582658366D966D66A806A946A846AA26A9C6ADB6AA36A7E +6A976A906AA06B5C6BAE6BDA6C086FD86FF16FDF6FE06FDB6FE46FEB6FEF6F80 +6FEC6FE16FE96FD56FEE6FF071E771DF71EE71E671E571ED71EC71F471E07235 +72467370737274A974B074A674A876467642764C76EA77B377AA77B077AC0000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77A777AD77EF78F778FA78F478EF790179A779AA7A577ABF7C077C0D7BFE7BF7 +7C0C7BE07CE07CDC7CDE7CE27CDF7CD97CDD7E2E7E3E7E467E377E327E437E2B +7E3D7E317E457E417E347E397E487E357E3F7E2F7F447FF37FFC807180728070 +806F807381C681C381BA81C281C081BF81BD81C981BE81E88209827185AA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008584857E859C8591859485AF859B858785A8858A866787C087D187B387D2 +87C687AB87BB87BA87C887CB893B893689448938893D89AC8B0E8B178B198B1B +8B0A8B208B1D8B048B108C418C3F8C738CFA8CFD8CFC8CF88CFB8DA88E498E4B +8E488E4A8F448F3E8F428F458F3F907F907D9084908190829080913991A3919E +919C934D938293289375934A9365934B9318937E936C935B9370935A935495CA +95CB95CC95C895C696B196B896D6971C971E97A097D3984698B699359A010000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +99FF9BAE9BAB9BAA9BAD9D3B9D3F9E8B9ECF9EDE9EDC9EDD9EDB9F3E9F4B53E2 +569556AE58D958D85B385F5D61E3623364F464F264FE650664FA64FB64F765B7 +66DC67266AB36AAC6AC36ABB6AB86AC26AAE6AAF6B5F6B786BAF7009700B6FFE +70066FFA7011700F71FB71FC71FE71F87377737574A774BF7515765676580000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000765277BD77BF77BB77BC790E79AE7A617A627A607AC47AC57C2B7C277C2A +7C1E7C237C217CE77E547E557E5E7E5A7E617E527E597F487FF97FFB80778076 +81CD81CF820A85CF85A985CD85D085C985B085BA85B985A687EF87EC87F287E0 +898689B289F48B288B398B2C8B2B8C508D058E598E638E668E648E5F8E558EC0 +8F498F4D90879083908891AB91AC91D09394938A939693A293B393AE93AC93B0 +9398939A939795D495D695D095D596E296DC96D996DB96DE972497A397A60000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +97AD97F9984D984F984C984E985398BA993E993F993D992E99A59A0E9AC19B03 +9B069B4F9B4E9B4D9BCA9BC99BFD9BC89BC09D519D5D9D609EE09F159F2C5133 +56A558DE58DF58E25BF59F905EEC61F261F761F661F56500650F66E066DD6AE5 +6ADD6ADA6AD3701B701F7028701A701D701570187206720D725872A273780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000737A74BD74CA74E375877586765F766177C7791979B17A6B7A697C3E7C3F +7C387C3D7C377C407E6B7E6D7E797E697E6A7F857E737FB67FB97FB881D885E9 +85DD85EA85D585E485E585F787FB8805880D87F987FE8960895F8956895E8B41 +8B5C8B588B498B5A8B4E8B4F8B468B598D088D0A8E7C8E728E878E768E6C8E7A +8E748F548F4E8FAD908A908B91B191AE93E193D193DF93C393C893DC93DD93D6 +93E293CD93D893E493D793E895DC96B496E3972A9727976197DC97FB985E0000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9858985B98BC994599499A169A199B0D9BE89BE79BD69BDB9D899D619D729D6A +9D6C9E929E979E939EB452F856A856B756B656B456BC58E45B405B435B7D5BF6 +5DC961F861FA65186514651966E667276AEC703E703070327210737B74CF7662 +76657926792A792C792B7AC77AF67C4C7C437C4D7CEF7CF08FAE7E7D7E7C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E827F4C800081DA826685FB85F9861185FA8606860B8607860A88148815 +896489BA89F88B708B6C8B668B6F8B5F8B6B8D0F8D0D8E898E818E858E8291B4 +91CB9418940393FD95E1973098C49952995199A89A2B9A309A379A359C139C0D +9E799EB59EE89F2F9F5F9F639F615137513856C156C056C259145C6C5DCD61FC +61FE651D651C659566E96AFB6B046AFA6BB2704C721B72A774D674D4766977D3 +7C507E8F7E8C7FBC8617862D861A882388228821881F896A896C89BD8B740000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B778B7D8D138E8A8E8D8E8B8F5F8FAF91BA942E94339435943A94389432942B +95E297389739973297FF9867986599579A459A439A409A3E9ACF9B549B519C2D +9C259DAF9DB49DC29DB89E9D9EEF9F199F5C9F669F67513C513B56C856CA56C9 +5B7F5DD45DD25F4E61FF65246B0A6B6170517058738074E4758A766E766C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079B37C607C5F807E807D81DF8972896F89FC8B808D168D178E918E938F61 +9148944494519452973D973E97C397C1986B99559A559A4D9AD29B1A9C499C31 +9C3E9C3B9DD39DD79F349F6C9F6A9F9456CC5DD662006523652B652A66EC6B10 +74DA7ACA7C647C637C657E937E967E9481E28638863F88318B8A9090908F9463 +946094649768986F995C9A5A9A5B9A579AD39AD49AD19C549C579C569DE59E9F +9EF456D158E9652C705E7671767277D77F507F888836883988628B938B920000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B9682778D1B91C0946A97429748974497C698709A5F9B229B589C5F9DF99DFA +9E7C9E7D9F079F779F725EF36B1670637C6C7C6E883B89C08EA191C194729470 +9871995E9AD69B239ECC706477DA8B9A947797C99A629A657E9C8B9C8EAA91C5 +947D947E947C9C779C789EF78C54947F9E1A72289A6A9B319E1B9E1E7C720000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030FE309D309E3005304130423043304430453046304730483049304A304B +304C304D304E304F3050305130523053305430553056305730583059305A305B +305C305D305E305F3060306130623063306430653066306730683069306A306B +306C306D306E306F3070307130723073307430753076307730783079307A307B +307C307D307E307F3080308130823083308430853086308730883089308A308B +308C308D308E308F309030913092309330A130A230A330A430A530A630A70000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30A830A930AA30AB30AC30AD30AE30AF30B030B130B230B330B430B530B630B7 +30B830B930BA30BB30BC30BD30BE30BF30C030C130C230C330C430C530C630C7 +30C830C930CA30CB30CC30CD30CE30CF30D030D130D230D330D430D530D630D7 +30D830D930DA30DB30DC30DD30DE30DF30E030E130E230E330E430E530E60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030E730E830E930EA30EB30EC30ED30EE30EF30F030F130F230F330F430F5 +30F60414041504010416041704180419041A041B041C04230424042504260427 +04280429042A042B042C042D042E042F04300431043204330434043504510436 +043704380439043A043B043C043D043E043F0440044104420443044404450446 +044704480449044A044B044C044D044E044F2460246124622463246424652466 +246724682469247424752476247724782479247A247B247C247D000000000000 +C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E424E5C51F5531A53824E074E0C4E474E8D56D7FA0C5C6E5F734E0F51874E0E +4E2E4E934EC24EC94EC8519852FC536C53B957205903592C5C105DFF65E16BB3 +6BCC6C14723F4E314E3C4EE84EDC4EE94EE14EDD4EDA520C531C534C57225723 +5917592F5B815B845C125C3B5C745C735E045E805E825FC9620962506C150000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C366C436C3F6C3B72AE72B0738A79B8808A961E4F0E4F184F2C4EF54F14 +4EF14F004EF74F084F1D4F024F054F224F134F044EF44F1251B1521352095210 +52A65322531F534D538A540756E156DF572E572A5734593C5980597C5985597B +597E5977597F5B565C155C255C7C5C7A5C7B5C7E5DDF5E755E845F025F1A5F74 +5FD55FD45FCF625C625E626462616266626262596260625A626565EF65EE673E +67396738673B673A673F673C67336C186C466C526C5C6C4F6C4A6C546C4B0000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C4C7071725E72B472B5738E752A767F7A757F518278827C8280827D827F864D +897E909990979098909B909496229624962096234F564F3B4F624F494F534F64 +4F3E4F674F524F5F4F414F584F2D4F334F3F4F61518F51B9521C521E522152AD +52AE530953635372538E538F54305437542A545454455419541C542554180000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000543D544F544154285424544756EE56E756E557415745574C5749574B5752 +5906594059A6599859A05997598E59A25990598F59A759A15B8E5B925C285C2A +5C8D5C8F5C885C8B5C895C925C8A5C865C935C955DE05E0A5E0E5E8B5E895E8C +5E885E8D5F055F1D5F785F765FD25FD15FD05FED5FE85FEE5FF35FE15FE45FE3 +5FFA5FEF5FF75FFB60005FF4623A6283628C628E628F629462876271627B627A +6270628162886277627D62726274653765F065F465F365F265F5674567470000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67596755674C6748675D674D675A674B6BD06C196C1A6C786C676C6B6C846C8B +6C8F6C716C6F6C696C9A6C6D6C876C956C9C6C666C736C656C7B6C8E7074707A +726372BF72BD72C372C672C172BA72C573957397739373947392753A75397594 +75957681793D80348095809980908092809C8290828F8285828E829182930000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000828A828382848C788FC98FBF909F90A190A5909E90A790A096309628962F +962D4E334F984F7C4F854F7D4F804F874F764F744F894F844F774F4C4F974F6A +4F9A4F794F814F784F904F9C4F944F9E4F924F824F954F6B4F6E519E51BC51BE +5235523252335246523152BC530A530B533C539253945487547F548154915482 +5488546B547A547E5465546C54745466548D546F546154605498546354675464 +56F756F9576F5772576D576B57715770577657805775577B5773577457620000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5768577D590C594559B559BA59CF59CE59B259CC59C159B659BC59C359D659B1 +59BD59C059C859B459C75B625B655B935B955C445C475CAE5CA45CA05CB55CAF +5CA85CAC5C9F5CA35CAD5CA25CAA5CA75C9D5CA55CB65CB05CA65E175E145E19 +5F285F225F235F245F545F825F7E5F7D5FDE5FE5602D602660196032600B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006034600A60176033601A601E602C6022600D6010602E60136011600C6009 +601C6214623D62AD62B462D162BE62AA62B662CA62AE62B362AF62BB62A962B0 +62B8653D65A865BB660965FC66046612660865FB6603660B660D660565FD6611 +661066F6670A6785676C678E67926776677B6798678667846774678D678C677A +679F679167996783677D67816778677967946B256B806B7E6BDE6C1D6C936CEC +6CEB6CEE6CD96CB66CD46CAD6CE76CB76CD06CC26CBA6CC36CC66CED6CF20000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6CD26CDD6CB46C8A6C9D6C806CDE6CC06D306CCD6CC76CB06CF96CCF6CE96CD1 +709470987085709370867084709170967082709A7083726A72D672CB72D872C9 +72DC72D272D472DA72CC72D173A473A173AD73A673A273A073AC739D74DD74E8 +753F7540753E758C759876AF76F376F176F076F577F877FC77F977FB77FA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077F77942793F79C57A787A7B7AFB7C757CFD8035808F80AE80A380B880B5 +80AD822082A082C082AB829A8298829B82B582A782AE82BC829E82BA82B482A8 +82A182A982C282A482C382B682A28670866F866D866E8C568FD28FCB8FD38FCD +8FD68FD58FD790B290B490AF90B390B09639963D963C963A96434FCD4FC54FD3 +4FB24FC94FCB4FC14FD44FDC4FD94FBB4FB34FDB4FC74FD64FBA4FC04FB94FEC +5244524952C052C2533D537C539753965399539854BA54A154AD54A554CF0000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54C3830D54B754AE54D654B654C554C654A0547054BC54A254BE547254DE54B0 +57B5579E579F57A4578C5797579D579B57945798578F579957A5579A579558F4 +590D595359E159DE59EE5A0059F159DD59FA59FD59FC59F659E459F259F759DB +59E959F359F559E059FE59F459ED5BA85C4C5CD05CD85CCC5CD75CCB5CDB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005CDE5CDA5CC95CC75CCA5CD65CD35CD45CCF5CC85CC65CCE5CDF5CF85DF9 +5E215E225E235E205E245EB05EA45EA25E9B5EA35EA55F075F2E5F565F866037 +603960546072605E6045605360476049605B604C60406042605F602460446058 +6066606E6242624362CF630D630B62F5630E630362EB62F9630F630C62F862F6 +63006313631462FA631562FB62F06541654365AA65BF6636662166326635661C +662666226633662B663A661D66346639662E670F671067C167F267C867BA0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67DC67BB67F867D867C067B767C567EB67E467DF67B567CD67B367F767F667EE +67E367C267B967CE67E767F067B267FC67C667ED67CC67AE67E667DB67FA67C9 +67CA67C367EA67CB6B286B826B846BB66BD66BD86BE06C206C216D286D346D2D +6D1F6D3C6D3F6D126D0A6CDA6D336D046D196D3A6D1A6D116D006D1D6D420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D016D186D376D036D0F6D406D076D206D2C6D086D226D096D1070B7709F +70BE70B170B070A170B470B570A972417249724A726C72707273726E72CA72E4 +72E872EB72DF72EA72E672E3738573CC73C273C873C573B973B673B573B473EB +73BF73C773BE73C373C673B873CB74EC74EE752E7547754875A775AA767976C4 +7708770377047705770A76F776FB76FA77E777E878067811781278057810780F +780E780978037813794A794C794B7945794479D579CD79CF79D679CE7A800000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A7E7AD17B007B017C7A7C787C797C7F7C807C817D037D087D017F587F917F8D +7FBE8007800E800F8014803780D880C780E080D180C880C280D080C580E380D9 +80DC80CA80D580C980CF80D780E680CD81FF8221829482D982FE82F9830782E8 +830082D5833A82EB82D682F482EC82E182F282F5830C82FB82F682F082EA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000082E482E082FA82F382ED86778674867C86738841884E8867886A886989D3 +8A048A078D728FE38FE18FEE8FE090F190BD90BF90D590C590BE90C790CB90C8 +91D491D39654964F96519653964A964E501E50055007501350225030501B4FF5 +4FF450335037502C4FF64FF75017501C502050275035502F5031500E515A5194 +519351CA51C451C551C851CE5261525A5252525E525F5255526252CD530E539E +552654E25517551254E754F354E4551A54FF5504550854EB5511550554F10000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +550A54FB54F754F854E0550E5503550B5701570257CC583257D557D257BA57C6 +57BD57BC57B857B657BF57C757D057B957C1590E594A5A195A165A2D5A2E5A15 +5A0F5A175A0A5A1E5A335B6C5BA75BAD5BAC5C035C565C545CEC5CFF5CEE5CF1 +5CF75D005CF95E295E285EA85EAE5EAA5EAC5F335F305F67605D605A60670000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000604160A26088608060926081609D60836095609B60976087609C608E6219 +624662F263106356632C634463456336634363E46339634B634A633C63296341 +6334635863546359632D63476333635A63516338635763406348654A654665C6 +65C365C465C2664A665F6647665167126713681F681A684968326833683B684B +684F68166831681C6835682B682D682F684E68446834681D6812681468266828 +682E684D683A682568206B2C6B2F6B2D6B316B346B6D80826B886BE66BE40000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6BE86BE36BE26BE76C256D7A6D636D646D766D0D6D616D926D586D626D6D6D6F +6D916D8D6DEF6D7F6D866D5E6D676D606D976D706D7C6D5F6D826D986D2F6D68 +6D8B6D7E6D806D846D166D836D7B6D7D6D756D9070DC70D370D170DD70CB7F39 +70E270D770D270DE70E070D470CD70C570C670C770DA70CE70E1724272780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072777276730072FA72F472FE72F672F372FB730173D373D973E573D673BC +73E773E373E973DC73D273DB73D473DD73DA73D773D873E874DE74DF74F474F5 +7521755B755F75B075C175BB75C475C075BF75B675BA768A76C9771D771B7710 +771377127723771177157719771A772277277823782C78227835782F7828782E +782B782178297833782A78317954795B794F795C79537952795179EB79EC79E0 +79EE79ED79EA79DC79DE79DD7A867A897A857A8B7A8C7A8A7A877AD87B100000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7B047B137B057B0F7B087B0A7B0E7B097B127C847C917C8A7C8C7C887C8D7C85 +7D1E7D1D7D117D0E7D187D167D137D1F7D127D0F7D0C7F5C7F617F5E7F607F5D +7F5B7F967F927FC37FC27FC08016803E803980FA80F280F980F5810180FB8100 +8201822F82258333832D83448319835183258356833F83418326831C83220000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008342834E831B832A8308833C834D8316832483208337832F832983478345 +834C8353831E832C834B832783488653865286A286A88696868D8691869E8687 +86978686868B869A868586A5869986A186A786958698868E869D869086948843 +8844886D88758876887288808871887F886F8883887E8874887C8A128C478C57 +8C7B8CA48CA38D768D788DB58DB78DB68ED18ED38FFE8FF590028FFF8FFB9004 +8FFC8FF690D690E090D990DA90E390DF90E590D890DB90D790DC90E491500000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +914E914F91D591E291DA965C965F96BC98E39ADF9B2F4E7F5070506A5061505E +50605053504B505D50725048504D5041505B504A506250155045505F5069506B +5063506450465040506E50735057505151D0526B526D526C526E52D652D3532D +539C55755576553C554D55505534552A55515562553655355530555255450000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000550C55325565554E55395548552D553B5540554B570A570757FB581457E2 +57F657DC57F4580057ED57FD580857F8580B57F357CF580757EE57E357F257E5 +57EC57E1580E57FC581057E75801580C57F157E957F0580D5804595C5A605A58 +5A555A675A5E5A385A355A6D5A505A5F5A655A6C5A535A645A575A435A5D5A52 +5A445A5B5A485A8E5A3E5A4D5A395A4C5A705A695A475A515A565A425A5C5B72 +5B6E5BC15BC05C595D1E5D0B5D1D5D1A5D205D0C5D285D0D5D265D255D0F0000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D305D125D235D1F5D2E5E3E5E345EB15EB45EB95EB25EB35F365F385F9B5F96 +5F9F608A6090608660BE60B060BA60D360D460CF60E460D960DD60C860B160DB +60B760CA60BF60C360CD60C063326365638A6382637D63BD639E63AD639D6397 +63AB638E636F63876390636E63AF6375639C636D63AE637C63A4633B639F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006378638563816391638D6370655365CD66656661665B6659665C66626718 +687968876890689C686D686E68AE68AB6956686F68A368AC68A96875687468B2 +688F68776892687C686B687268AA68806871687E689B6896688B68A0688968A4 +6878687B6891688C688A687D6B366B336B376B386B916B8F6B8D6B8E6B8C6C2A +6DC06DAB6DB46DB36E746DAC6DE96DE26DB76DF66DD46E006DC86DE06DDF6DD6 +6DBE6DE56DDC6DDD6DDB6DF46DCA6DBD6DED6DF06DBA6DD56DC26DCF6DC90000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6DD06DF26DD36DFD6DD76DCD6DE36DBB70FA710D70F7711770F4710C70F07104 +70F3711070FC70FF71067113710070F870F6710B7102710E727E727B727C727F +731D7317730773117318730A730872FF730F731E738873F673F873F574047401 +73FD7407740073FA73FC73FF740C740B73F474087564756375CE75D275CF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075CB75CC75D175D0768F768976D37739772F772D7731773277347733773D +7725773B7735784878527849784D784A784C782678457850796479677969796A +7963796B796179BB79FA79F879F679F77A8F7A947A907B357B477B347B257B30 +7B227B247B337B187B2A7B1D7B317B2B7B2D7B2F7B327B387B1A7B237C947C98 +7C967CA37D357D3D7D387D367D3A7D457D2C7D297D417D477D3E7D3F7D4A7D3B +7D287F637F957F9C7F9D7F9B7FCA7FCB7FCD7FD07FD17FC77FCF7FC9801F0000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +801E801B804780438048811881258119811B812D811F812C811E812181158127 +811D8122821182388233823A823482328274839083A383A8838D837A837383A4 +8374838F8381839583998375839483A9837D8383838C839D839B83AA838B837E +83A583AF8388839783B0837F83A6838783AE8376839A8659865686BF86B70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000086C286C186C586BA86B086C886B986B386B886CC86B486BB86BC86C386BD +86BE88528889889588A888A288AA889A889188A1889F889888A78899889B8897 +88A488AC888C8893888E898289D689D989D58A308A278A2C8A1E8C398C3B8C5C +8C5D8C7D8CA58D7D8D7B8D798DBC8DC28DB98DBF8DC18ED88EDE8EDD8EDC8ED7 +8EE08EE19024900B9011901C900C902190EF90EA90F090F490F290F390D490EB +90EC90E991569158915A9153915591EC91F491F191F391F891E491F991EA0000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +91EB91F791E891EE957A95869588967C966D966B9671966F96BF976A980498E5 +9997509B50955094509E508B50A35083508C508E509D5068509C509250825087 +515F51D45312531153A453A7559155A855A555AD5577564555A255935588558F +55B5558155A3559255A4557D558C55A6557F559555A1558E570C582958370000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005819581E58275823582857F558485825581C581B5833583F5836582E5839 +5838582D582C583B59615AAF5A945A9F5A7A5AA25A9E5A785AA65A7C5AA55AAC +5A955AAE5A375A845A8A5A975A835A8B5AA95A7B5A7D5A8C5A9C5A8F5A935A9D +5BEA5BCD5BCB5BD45BD15BCA5BCE5C0C5C305D375D435D6B5D415D4B5D3F5D35 +5D515D4E5D555D335D3A5D525D3D5D315D595D425D395D495D385D3C5D325D36 +5D405D455E445E415F585FA65FA55FAB60C960B960CC60E260CE60C461140000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60F2610A6116610560F5611360F860FC60FE60C161036118611D611060FF6104 +610B624A639463B163B063CE63E563E863EF63C3649D63F363CA63E063F663D5 +63F263F5646163DF63BE63DD63DC63C463D863D363C263C763CC63CB63C863F0 +63D763D965326567656A6564655C65686565658C659D659E65AE65D065D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000667C666C667B668066716679666A66726701690C68D3690468DC692A68EC +68EA68F1690F68D668F768EB68E468F66913691068F368E1690768CC69086970 +68B4691168EF68C6691468F868D068FD68FC68E8690B690A691768CE68C868DD +68DE68E668F468D1690668D468E96915692568C76B396B3B6B3F6B3C6B946B97 +6B996B956BBD6BF06BF26BF36C306DFC6E466E476E1F6E496E886E3C6E3D6E45 +6E626E2B6E3F6E416E5D6E736E1C6E336E4B6E406E516E3B6E036E2E6E5E0000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E686E5C6E616E316E286E606E716E6B6E396E226E306E536E656E276E786E64 +6E776E556E796E526E666E356E366E5A7120711E712F70FB712E713171237125 +71227132711F7128713A711B724B725A7288728972867285728B7312730B7330 +73227331733373277332732D732673237335730C742E742C7430742B74160000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000741A7421742D743174247423741D74297420743274FB752F756F756C75E7 +75DA75E175E675DD75DF75E475D77695769276DA774677477744774D7745774A +774E774B774C77DE77EC786078647865785C786D7871786A786E787078697868 +785E786279747973797279707A027A0A7A037A0C7A047A997AE67AE47B4A7B3B +7B447B487B4C7B4E7B407B587B457CA27C9E7CA87CA17D587D6F7D637D537D56 +7D677D6A7D4F7D6D7D5C7D6B7D527D547D697D517D5F7D4E7F3E7F3F7F650000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7F667FA27FA07FA17FD78051804F805080FE80D48143814A8152814F8147813D +814D813A81E681EE81F781F881F98204823C823D823F8275833B83CF83F98423 +83C083E8841283E783E483FC83F6841083C683C883EB83E383BF840183DD83E5 +83D883FF83E183CB83CE83D683F583C98409840F83DE8411840683C283F30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000083D583FA83C783D183EA841383C383EC83EE83C483FB83D783E2841B83DB +83FE86D886E286E686D386E386DA86EA86DD86EB86DC86EC86E986D786E886D1 +88488856885588BA88D788B988B888C088BE88B688BC88B788BD88B2890188C9 +89958998899789DD89DA89DB8A4E8A4D8A398A598A408A578A588A448A458A52 +8A488A518A4A8A4C8A4F8C5F8C818C808CBA8CBE8CB08CB98CB58D848D808D89 +8DD88DD38DCD8DC78DD68DDC8DCF8DD58DD98DC88DD78DC58EEF8EF78EFA0000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8EF98EE68EEE8EE58EF58EE78EE88EF68EEB8EF18EEC8EF48EE9902D9034902F +9106912C910490FF90FC910890F990FB9101910091079105910391619164915F +916291609201920A92259203921A9226920F920C9200921291FF91FD92069204 +92279202921C92249219921792059216957B958D958C95909687967E96880000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000096899683968096C296C896C396F196F0976C9770976E980798A998EB9CE6 +9EF94E834E844EB650BD50BF50C650AE50C450CA50B450C850C250B050C150BA +50B150CB50C950B650B851D7527A5278527B527C55C355DB55CC55D055CB55CA +55DD55C055D455C455E955BF55D2558D55CF55D555E255D655C855F255CD55D9 +55C25714585358685864584F584D5849586F5855584E585D58595865585B583D +5863587158FC5AC75AC45ACB5ABA5AB85AB15AB55AB05ABF5AC85ABB5AC60000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5AB75AC05ACA5AB45AB65ACD5AB95A905BD65BD85BD95C1F5C335D715D635D4A +5D655D725D6C5D5E5D685D675D625DF05E4F5E4E5E4A5E4D5E4B5EC55ECC5EC6 +5ECB5EC75F405FAF5FAD60F76149614A612B614561366132612E6146612F614F +612961406220916862236225622463C563F163EB641064126409642064240000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064336443641F641564186439643764226423640C64266430642864416435 +642F640A641A644064256427640B63E7641B642E6421640E656F659265D36686 +668C66956690668B668A66996694667867206966695F6938694E69626971693F +6945696A6939694269576959697A694869496935696C6933693D696568F06978 +693469696940696F69446976695869416974694C693B694B6937695C694F6951 +69326952692F697B693C6B466B456B436B426B486B416B9BFA0D6BFB6BFC0000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6BF96BF76BF86E9B6ED66EC86E8F6EC06E9F6E936E946EA06EB16EB96EC66ED2 +6EBD6EC16E9E6EC96EB76EB06ECD6EA66ECF6EB26EBE6EC36EDC6ED86E996E92 +6E8E6E8D6EA46EA16EBF6EB36ED06ECA6E976EAE6EA371477154715271637160 +7141715D716271727178716A7161714271587143714B7170715F715071530000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007144714D715A724F728D728C72917290728E733C7342733B733A7340734A +73497444744A744B7452745174577440744F7450744E74427446744D745474E1 +74FF74FE74FD751D75797577698375EF760F760375F775FE75FC75F975F87610 +75FB75F675ED75F575FD769976B576DD7755775F776077527756775A77697767 +77547759776D77E07887789A7894788F788478957885788678A1788378797899 +78807896787B797C7982797D79797A117A187A197A127A177A157A227A130000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A1B7A107AA37AA27A9E7AEB7B667B647B6D7B747B697B727B657B737B717B70 +7B617B787B767B637CB27CB47CAF7D887D867D807D8D7D7F7D857D7A7D8E7D7B +7D837D7C7D8C7D947D847D7D7D927F6D7F6B7F677F687F6C7FA67FA57FA77FDB +7FDC8021816481608177815C8169815B816281726721815E81768167816F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081448161821D8249824482408242824584F1843F845684768479848F848D +846584518440848684678430844D847D845A845984748473845D8507845E8437 +843A8434847A8443847884328445842983D9844B842F8442842D845F84708439 +844E844C8452846F84C5848E843B8447843684338468847E8444842B84608454 +846E8450870B870486F7870C86FA86D686F5874D86F8870E8709870186F6870D +870588D688CB88CD88CE88DE88DB88DA88CC88D08985899B89DF89E589E40000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89E189E089E289DC89E68A768A868A7F8A618A3F8A778A828A848A758A838A81 +8A748A7A8C3C8C4B8C4A8C658C648C668C868C848C858CCC8D688D698D918D8C +8D8E8D8F8D8D8D938D948D908D928DF08DE08DEC8DF18DEE8DD08DE98DE38DE2 +8DE78DF28DEB8DF48F068EFF8F018F008F058F078F088F028F0B9052903F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090449049903D9110910D910F911191169114910B910E916E916F92489252 +9230923A926692339265925E9283922E924A9246926D926C924F92609267926F +92369261927092319254926392509272924E9253924C92569232959F959C959E +959B969296939691969796CE96FA96FD96F896F59773977797789772980F980D +980E98AC98F698F999AF99B299B099B59AAD9AAB9B5B9CEA9CED9CE79E809EFD +50E650D450D750E850F350DB50EA50DD50E450D350EC50F050EF50E350E00000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51D85280528152E952EB533053AC56275615560C561255FC560F561C56015613 +560255FA561D560455FF55F95889587C5890589858865881587F5874588B587A +58875891588E587658825888587B5894588F58FE596B5ADC5AEE5AE55AD55AEA +5ADA5AED5AEB5AF35AE25AE05ADB5AEC5ADE5ADD5AD95AE85ADF5B775BE00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005BE35C635D825D805D7D5D865D7A5D815D775D8A5D895D885D7E5D7C5D8D +5D795D7F5E585E595E535ED85ED15ED75ECE5EDC5ED55ED95ED25ED45F445F43 +5F6F5FB6612C61286141615E61716173615261536172616C618061746154617A +615B6165613B616A6161615662296227622B642B644D645B645D647464766472 +6473647D6475646664A6644E6482645E645C644B645364606450647F643F646C +646B645964656477657365A066A166A0669F67056704672269B169B669C90000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69A069CE699669B069AC69BC69916999698E69A7698D69A969BE69AF69BF69C4 +69BD69A469D469B969CA699A69CF69B3699369AA69A1699E69D96997699069C2 +69B569A569C66B4A6B4D6B4B6B9E6B9F6BA06BC36BC46BFE6ECE6EF56EF16F03 +6F256EF86F376EFB6F2E6F096F4E6F196F1A6F276F186F3B6F126EED6F0A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F366F736EF96EEE6F2D6F406F306F3C6F356EEB6F076F0E6F436F056EFD +6EF66F396F1C6EFC6F3A6F1F6F0D6F1E6F086F21718771907189718071857182 +718F717B718671817197724472537297729572937343734D7351734C74627473 +7471747574727467746E750075027503757D759076167608760C76157611760A +761476B87781777C77857782776E7780776F777E778378B278AA78B478AD78A8 +787E78AB789E78A578A078AC78A278A47998798A798B79967995799479930000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +79977988799279907A2B7A4A7A307A2F7A287A267AA87AAB7AAC7AEE7B887B9C +7B8A7B917B907B967B8D7B8C7B9B7B8E7B857B9852847B997BA47B827CBB7CBF +7CBC7CBA7DA77DB77DC27DA37DAA7DC17DC07DC57D9D7DCE7DC47DC67DCB7DCC +7DAF7DB97D967DBC7D9F7DA67DAE7DA97DA17DC97F737FE27FE37FE57FDE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008024805D805C8189818681838187818D818C818B8215849784A484A1849F +84BA84CE84C284AC84AE84AB84B984B484C184CD84AA849A84B184D0849D84A7 +84BB84A2849484C784CC849B84A984AF84A884D6849884B684CF84A084D784D4 +84D284DB84B084918661873387238728876B8740872E871E87218719871B8743 +872C8741873E874687208732872A872D873C8712873A87318735874287268727 +87388724871A8730871188F788E788F188F288FA88FE88EE88FC88F688FB0000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +88F088EC88EB899D89A1899F899E89E989EB89E88AAB8A998A8B8A928A8F8A96 +8C3D8C688C698CD58CCF8CD78D968E098E028DFF8E0D8DFD8E0A8E038E078E06 +8E058DFE8E008E048F108F118F0E8F0D9123911C91209122911F911D911A9124 +9121911B917A91729179917392A592A49276929B927A92A0929492AA928D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000092A6929A92AB92799297927F92A392EE928E9282929592A2927D928892A1 +928A9286928C929992A7927E928792A9929D928B922D969E96A196FF9758977D +977A977E978397809782977B97849781977F97CE97CD981698AD98AE99029900 +9907999D999C99C399B999BB99BA99C299BD99C79AB19AE39AE79B3E9B3F9B60 +9B619B5F9CF19CF29CF59EA750FF5103513050F85106510750F650FE510B510C +50FD510A528B528C52F152EF56485642564C56355641564A5649564656580000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +565A56405633563D562C563E5638562A563A571A58AB589D58B158A058A358AF +58AC58A558A158FF5AFF5AF45AFD5AF75AF65B035AF85B025AF95B015B075B05 +5B0F5C675D995D975D9F5D925DA25D935D955DA05D9C5DA15D9A5D9E5E695E5D +5E605E5C7DF35EDB5EDE5EE15F495FB2618B6183617961B161B061A261890000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000619B619361AF61AD619F619261AA61A1618D616661B3622D646E64706496 +64A064856497649C648F648B648A648C64A3649F646864B164986576657A6579 +657B65B265B366B566B066A966B266B766AA66AF6A006A066A1769E569F86A15 +69F169E46A2069FF69EC69E26A1B6A1D69FE6A2769F269EE6A1469F769E76A40 +6A0869E669FB6A0D69FC69EB6A096A046A186A256A0F69F66A266A0769F46A16 +6B516BA56BA36BA26BA66C016C006BFF6C026F416F266F7E6F876FC66F920000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F8D6F896F8C6F626F4F6F856F5A6F966F766F6C6F826F556F726F526F506F57 +6F946F936F5D6F006F616F6B6F7D6F676F906F536F8B6F696F7F6F956F636F77 +6F6A6F7B71B271AF719B71B071A0719A71A971B5719D71A5719E71A471A171AA +719C71A771B37298729A73587352735E735F7360735D735B7361735A73590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000736274877489748A74867481747D74857488747C747975087507757E7625 +761E7619761D761C7623761A7628761B769C769D769E769B778D778F77897788 +78CD78BB78CF78CC78D178CE78D478C878C378C478C9799A79A179A0799C79A2 +799B6B767A397AB27AB47AB37BB77BCB7BBE7BAC7BCE7BAF7BB97BCA7BB57CC5 +7CC87CCC7CCB7DF77DDB7DEA7DE77DD77DE17E037DFA7DE67DF67DF17DF07DEE +7DDF7F767FAC7FB07FAD7FED7FEB7FEA7FEC7FE67FE88064806781A3819F0000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +819E819581A2819981978216824F825382528250824E82518524853B850F8500 +8529850E8509850D851F850A8527851C84FB852B84FA8508850C84F4852A84F2 +851584F784EB84F384FC851284EA84E9851684FE8528851D852E850284FD851E +84F68531852684E784E884F084EF84F9851885208530850B8519852F86620000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000875687638764877787E1877387588754875B87528761875A8751875E876D +876A8750874E875F875D876F876C877A876E875C8765874F877B877587628767 +8769885A8905890C8914890B891789188919890689168911890E890989A289A4 +89A389ED89F089EC8ACF8AC68AB88AD38AD18AD48AD58ABB8AD78ABE8AC08AC5 +8AD88AC38ABA8ABD8AD98C3E8C4D8C8F8CE58CDF8CD98CE88CDA8CDD8CE78DA0 +8D9C8DA18D9B8E208E238E258E248E2E8E158E1B8E168E118E198E268E270000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E148E128E188E138E1C8E178E1A8F2C8F248F188F1A8F208F238F168F179073 +9070906F9067906B912F912B9129912A91329126912E91859186918A91819182 +9184918092D092C392C492C092D992B692CF92F192DF92D892E992D792DD92CC +92EF92C292E892CA92C892CE92E692CD92D592C992E092DE92E792D192D30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000092B592E192C692B4957C95AC95AB95AE95B096A496A296D3970597089702 +975A978A978E978897D097CF981E981D9826982998289820981B982798B29908 +98FA9911991499169917991599DC99CD99CF99D399D499CE99C999D699D899CB +99D799CC9AB39AEC9AEB9AF39AF29AF19B469B439B679B749B719B669B769B75 +9B709B689B649B6C9CFC9CFA9CFD9CFF9CF79D079D009CF99CFB9D089D059D04 +9E839ED39F0F9F10511C51135117511A511151DE533453E156705660566E0000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +567356665663566D5672565E5677571C571B58C858BD58C958BF58BA58C258BC +58C65B175B195B1B5B215B145B135B105B165B285B1A5B205B1E5BEF5DAC5DB1 +5DA95DA75DB55DB05DAE5DAA5DA85DB25DAD5DAF5DB45E675E685E665E6F5EE9 +5EE75EE65EE85EE55F4B5FBC619D61A8619661C561B461C661C161CC61BA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000061BF61B8618C64D764D664D064CF64C964BD648964C364DB64F364D96533 +657F657C65A266C866BE66C066CA66CB66CF66BD66BB66BA66CC67236A346A66 +6A496A676A326A686A3E6A5D6A6D6A766A5B6A516A286A5A6A3B6A3F6A416A6A +6A646A506A4F6A546A6F6A696A606A3C6A5E6A566A556A4D6A4E6A466B556B54 +6B566BA76BAA6BAB6BC86BC76C046C036C066FAD6FCB6FA36FC76FBC6FCE6FC8 +6F5E6FC46FBD6F9E6FCA6FA870046FA56FAE6FBA6FAC6FAA6FCF6FBF6FB80000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6FA26FC96FAB6FCD6FAF6FB26FB071C571C271BF71B871D671C071C171CB71D4 +71CA71C771CF71BD71D871BC71C671DA71DB729D729E736973667367736C7365 +736B736A747F749A74A074947492749574A1750B7580762F762D7631763D7633 +763C76357632763076BB76E6779A779D77A1779C779B77A277A3779577990000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000779778DD78E978E578EA78DE78E378DB78E178E278ED78DF78E079A47A44 +7A487A477AB67AB87AB57AB17AB77BDE7BE37BE77BDD7BD57BE57BDA7BE87BF9 +7BD47BEA7BE27BDC7BEB7BD87BDF7CD27CD47CD77CD07CD17E127E217E177E0C +7E1F7E207E137E0E7E1C7E157E1A7E227E0B7E0F7E167E0D7E147E257E247F43 +7F7B7F7C7F7A7FB17FEF802A8029806C81B181A681AE81B981B581AB81B081AC +81B481B281B781A781F282558256825785568545856B854D8553856185580000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +854085468564854185628544855185478563853E855B8571854E856E85758555 +85678560858C8566855D85548565856C866386658664879B878F879787938792 +87888781879687988779878787A3878587908791879D87848794879C879A8789 +891E89268930892D892E89278931892289298923892F892C891F89F18AE00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AE28AF28AF48AF58ADD8B148AE48ADF8AF08AC88ADE8AE18AE88AFF8AEF +8AFB8C918C928C908CF58CEE8CF18CF08CF38D6C8D6E8DA58DA78E338E3E8E38 +8E408E458E368E3C8E3D8E418E308E3F8EBD8F368F2E8F358F328F398F378F34 +90769079907B908690FA913391359136919391909191918D918F9327931E9308 +931F9306930F937A9338933C931B9323931293019346932D930E930D92CB931D +92FA9325931392F992F793349302932492FF932993399335932A9314930C0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +930B92FE9309930092FB931695BC95CD95BE95B995BA95B695BF95B595BD96A9 +96D4970B9712971097999797979497F097F89835982F98329924991F99279929 +999E99EE99EC99E599E499F099E399EA99E999E79AB99ABF9AB49ABB9AF69AFA +9AF99AF79B339B809B859B879B7C9B7E9B7B9B829B939B929B909B7A9B950000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B7D9B889D259D179D209D1E9D149D299D1D9D189D229D109D199D1F9E88 +9E869E879EAE9EAD9ED59ED69EFA9F129F3D51265125512251245120512952F4 +5693568C568D568656845683567E5682567F568158D658D458CF58D25B2D5B25 +5B325B235B2C5B275B265B2F5B2E5B7B5BF15BF25DB75E6C5E6A5FBE5FBB61C3 +61B561BC61E761E061E561E461E861DE64EF64E964E364EB64E464E865816580 +65B665DA66D26A8D6A966A816AA56A896A9F6A9B6AA16A9E6A876A936A8E0000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A956A836AA86AA46A916A7F6AA66A9A6A856A8C6A926B5B6BAD6C096FCC6FA9 +6FF46FD46FE36FDC6FED6FE76FE66FDE6FF26FDD6FE26FE871E171F171E871F2 +71E471F071E27373736E736F749774B274AB749074AA74AD74B174A574AF7510 +75117512750F7584764376487649764776A476E977B577AB77B277B777B60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077B477B177A877F078F378FD790278FB78FC78F2790578F978FE790479AB +79A87A5C7A5B7A567A587A547A5A7ABE7AC07AC17C057C0F7BF27C007BFF7BFB +7C0E7BF47C0B7BF37C027C097C037C017BF87BFD7C067BF07BF17C107C0A7CE8 +7E2D7E3C7E427E3398487E387E2A7E497E407E477E297E4C7E307E3B7E367E44 +7E3A7F457F7F7F7E7F7D7FF47FF2802C81BB81C481CC81CA81C581C781BC81E9 +825B825A825C85838580858F85A7859585A0858B85A3857B85A4859A859E0000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8577857C858985A1857A85788557858E85968586858D8599859D858185A28582 +858885858579857685988590859F866887BE87AA87AD87C587B087AC87B987B5 +87BC87AE87C987C387C287CC87B787AF87C487CA87B487B687BF87B887BD87DE +87B289358933893C893E894189528937894289AD89AF89AE89F289F38B1E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B188B168B118B058B0B8B228B0F8B128B158B078B0D8B088B068B1C8B13 +8B1A8C4F8C708C728C718C6F8C958C948CF98D6F8E4E8E4D8E538E508E4C8E47 +8F438F409085907E9138919A91A2919B9199919F91A1919D91A093A1938393AF +936493569347937C9358935C93769349935093519360936D938F934C936A9379 +935793559352934F93719377937B9361935E936393679380934E935995C795C0 +95C995C395C595B796AE96B096AC9720971F9718971D9719979A97A1979C0000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +979E979D97D597D497F198419844984A9849984598439925992B992C992A9933 +9932992F992D99319930999899A399A19A0299FA99F499F799F999F899F699FB +99FD99FE99FC9A039ABE9AFE9AFD9B019AFC9B489B9A9BA89B9E9B9B9BA69BA1 +9BA59BA49B869BA29BA09BAF9D339D419D679D369D2E9D2F9D319D389D300000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D459D429D439D3E9D379D409D3D7FF59D2D9E8A9E899E8D9EB09EC89EDA +9EFB9EFF9F249F239F229F549FA05131512D512E5698569C5697569A569D5699 +59705B3C5C695C6A5DC05E6D5E6E61D861DF61ED61EE61F161EA61F061EB61D6 +61E964FF650464FD64F86501650364FC659465DB66DA66DB66D86AC56AB96ABD +6AE16AC66ABA6AB66AB76AC76AB46AAD6B5E6BC96C0B7007700C700D70017005 +7014700E6FFF70006FFB70266FFC6FF7700A720171FF71F9720371FD73760000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74B874C074B574C174BE74B674BB74C275147513765C76647659765076537657 +765A76A676BD76EC77C277BA78FF790C79137914790979107912791179AD79AC +7A5F7C1C7C297C197C207C1F7C2D7C1D7C267C287C227C257C307E5C7E507E56 +7E637E587E627E5F7E517E607E577E537FB57FB37FF77FF8807581D181D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081D0825F825E85B485C685C085C385C285B385B585BD85C785C485BF85CB +85CE85C885C585B185B685D2862485B885B785BE866987E787E687E287DB87EB +87EA87E587DF87F387E487D487DC87D387ED87D887E387A487D787D9880187F4 +87E887DD8953894B894F894C89468950895189498B2A8B278B238B338B308B35 +8B478B2F8B3C8B3E8B318B258B378B268B368B2E8B248B3B8B3D8B3A8C428C75 +8C998C988C978CFE8D048D028D008E5C8E628E608E578E568E5E8E658E670000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E5B8E5A8E618E5D8E698E548F468F478F488F4B9128913A913B913E91A891A5 +91A791AF91AA93B5938C939293B7939B939D938993A7938E93AA939E93A69395 +93889399939F938D93B1939193B293A493A893B493A393A595D295D395D196B3 +96D796DA5DC296DF96D896DD97239722972597AC97AE97A897AB97A497AA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000097A297A597D797D997D697D897FA98509851985298B89941993C993A9A0F +9A0B9A099A0D9A049A119A0A9A059A079A069AC09ADC9B089B049B059B299B35 +9B4A9B4C9B4B9BC79BC69BC39BBF9BC19BB59BB89BD39BB69BC49BB99BBD9D5C +9D539D4F9D4A9D5B9D4B9D599D569D4C9D579D529D549D5F9D589D5A9E8E9E8C +9EDF9F019F009F169F259F2B9F2A9F299F289F4C9F5551345135529652F753B4 +56AB56AD56A656A756AA56AC58DA58DD58DB59125B3D5B3E5B3F5DC35E700000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5FBF61FB65076510650D6509650C650E658465DE65DD66DE6AE76AE06ACC6AD1 +6AD96ACB6ADF6ADC6AD06AEB6ACF6ACD6ADE6B606BB06C0C7019702770207016 +702B702170227023702970177024701C702A720C720A72077202720572A572A6 +72A472A372A174CB74C574B774C37516766077C977CA77C477F1791D791B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007921791C7917791E79B07A677A687C337C3C7C397C2C7C3B7CEC7CEA7E76 +7E757E787E707E777E6F7E7A7E727E747E687F4B7F4A7F837F867FB77FFD7FFE +807881D781D582648261826385EB85F185ED85D985E185E885DA85D785EC85F2 +85F885D885DF85E385DC85D185F085E685EF85DE85E2880087FA880387F687F7 +8809880C880B880687FC880887FF880A88028962895A895B89578961895C8958 +895D8959898889B789B689F68B508B488B4A8B408B538B568B548B4B8B550000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B518B428B528B578C438C778C768C9A8D068D078D098DAC8DAA8DAD8DAB8E6D +8E788E738E6A8E6F8E7B8EC28F528F518F4F8F508F538FB49140913F91B091AD +93DE93C793CF93C293DA93D093F993EC93CC93D993A993E693CA93D493EE93E3 +93D593C493CE93C093D293E7957D95DA95DB96E19729972B972C972897260000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000097B397B797B697DD97DE97DF985C9859985D985798BF98BD98BB98BE9948 +9947994399A699A79A1A9A159A259A1D9A249A1B9A229A209A279A239A1E9A1C +9A149AC29B0B9B0A9B0E9B0C9B379BEA9BEB9BE09BDE9BE49BE69BE29BF09BD4 +9BD79BEC9BDC9BD99BE59BD59BE19BDA9D779D819D8A9D849D889D719D809D78 +9D869D8B9D8C9D7D9D6B9D749D759D709D699D859D739D7B9D829D6F9D799D7F +9D879D689E949E919EC09EFC9F2D9F409F419F4D9F569F579F58533756B20000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56B556B358E35B455DC65DC75EEE5EEF5FC05FC161F9651765166515651365DF +66E866E366E46AF36AF06AEA6AE86AF96AF16AEE6AEF703C7035702F70377034 +703170427038703F703A70397040703B703370417213721472A8737D737C74BA +76AB76AA76BE76ED77CC77CE77CF77CD77F27925792379277928792479290000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079B27A6E7A6C7A6D7AF77C497C487C4A7C477C457CEE7E7B7E7E7E817E80 +7FBA7FFF807981DB81D9820B82688269862285FF860185FE861B860085F68604 +86098605860C85FD8819881088118817881388168963896689B989F78B608B6A +8B5D8B688B638B658B678B6D8DAE8E868E888E848F598F568F578F558F588F5A +908D9143914191B791B591B291B3940B941393FB9420940F941493FE94159410 +94289419940D93F5940093F79407940E9416941293FA940993F8940A93FF0000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +93FC940C93F69411940695DE95E095DF972E972F97B997BB97FD97FE98609862 +9863985F98C198C29950994E9959994C994B99539A329A349A319A2C9A2A9A36 +9A299A2E9A389A2D9AC79ACA9AC69B109B129B119C0B9C089BF79C059C129BF8 +9C409C079C0E9C069C179C149C099D9F9D999DA49D9D9D929D989D909D9B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009DA09D949D9C9DAA9D979DA19D9A9DA29DA89D9E9DA39DBF9DA99D969DA6 +9DA79E999E9B9E9A9EE59EE49EE79EE69F309F2E9F5B9F609F5E9F5D9F599F91 +513A51395298529756C356BD56BE5B485B475DCB5DCF5EF161FD651B6B026AFC +6B036AF86B0070437044704A7048704970457046721D721A7219737E7517766A +77D0792D7931792F7C547C537CF27E8A7E877E887E8B7E867E8D7F4D7FBB8030 +81DD8618862A8626861F8623861C86198627862E862186208629861E86250000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8829881D881B88208824881C882B884A896D8969896E896B89FA8B798B788B45 +8B7A8B7B8D108D148DAF8E8E8E8C8F5E8F5B8F5D91469144914591B9943F943B +94369429943D943C94309439942A9437942C9440943195E595E495E39735973A +97BF97E1986498C998C698C0995899569A399A3D9A469A449A429A419A3A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009A3F9ACD9B159B179B189B169B3A9B529C2B9C1D9C1C9C2C9C239C289C29 +9C249C219DB79DB69DBC9DC19DC79DCA9DCF9DBE9DC59DC39DBB9DB59DCE9DB9 +9DBA9DAC9DC89DB19DAD9DCC9DB39DCD9DB29E7A9E9C9EEB9EEE9EED9F1B9F18 +9F1A9F319F4E9F659F649F924EB956C656C556CB59715B4B5B4C5DD55DD15EF2 +65216520652665226B0B6B086B096C0D7055705670577052721E721F72A9737F +74D874D574D974D7766D76AD793579B47A707A717C577C5C7C597C5B7C5A0000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7CF47CF17E917F4F7F8781DE826B863486358633862C86328636882C88288826 +882A8825897189BF89BE89FB8B7E8B848B828B868B858B7F8D158E958E948E9A +8E928E908E968E978F608F629147944C9450944A944B944F9447944594489449 +9446973F97E3986A986998CB9954995B9A4E9A539A549A4C9A4F9A489A4A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009A499A529A509AD09B199B2B9B3B9B569B559C469C489C3F9C449C399C33 +9C419C3C9C379C349C329C3D9C369DDB9DD29DDE9DDA9DCB9DD09DDC9DD19DDF +9DE99DD99DD89DD69DF59DD59DDD9EB69EF09F359F339F329F429F6B9F959FA2 +513D529958E858E759725B4D5DD8882F5F4F62016203620465296525659666EB +6B116B126B0F6BCA705B705A7222738273817383767077D47C677C667E95826C +863A86408639863C8631863B863E88308832882E883389768974897389FE0000 +F8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B8C8B8E8B8B8B888C458D198E988F648F6391BC94629455945D9457945E97C4 +97C598009A569A599B1E9B1F9B209C529C589C509C4A9C4D9C4B9C559C599C4C +9C4E9DFB9DF79DEF9DE39DEB9DF89DE49DF69DE19DEE9DE69DF29DF09DE29DEC +9DF49DF39DE89DED9EC29ED09EF29EF39F069F1C9F389F379F369F439F4F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009F719F709F6E9F6F56D356CD5B4E5C6D652D66ED66EE6B13705F7061705D +7060722374DB74E577D5793879B779B67C6A7E977F89826D8643883888378835 +884B8B948B958E9E8E9F8EA08E9D91BE91BD91C2946B9468946996E597469743 +974797C797E59A5E9AD59B599C639C679C669C629C5E9C609E029DFE9E079E03 +9E069E059E009E019E099DFF9DFD9E049EA09F1E9F469F749F759F7656D4652E +65B86B186B196B176B1A7062722672AA77D877D979397C697C6B7CF67E9A0000 +F9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E987E9B7E9981E081E18646864786488979897A897C897B89FF8B988B998EA5 +8EA48EA3946E946D946F9471947397499872995F9C689C6E9C6D9E0B9E0D9E10 +9E0F9E129E119EA19EF59F099F479F789F7B9F7A9F79571E70667C6F883C8DB2 +8EA691C394749478947694759A609C749C739C719C759E149E139EF69F0A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009FA4706870657CF7866A883E883D883F8B9E8C9C8EA98EC9974B98739874 +98CC996199AB9A649A669A679B249E159E179F4862076B1E7227864C8EA89482 +948094819A699A689B2E9E197229864B8B9F94839C799EB776759A6B9C7A9E1D +7069706A9EA49F7E9F499F980000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cns11643.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cns11643.enc new file mode 100644 index 00000000..44dd9b7a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cns11643.enc @@ -0,0 +1,1584 @@ +# Encoding file: cns11643, double-byte +D +2134 0 93 +21 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E284E364E3F4E854E054E04518251965338536953B64E2A4E874E4951E2 +4E464E8F4EBC4EBE516651E35204529C53B95902590A5B805DDB5E7A5E7F5EF4 +5F505F515F61961D4E3C4E634E624EA351854EC54ECF4ECE4ECC518451865722 +572351E45205529E529D52FD5300533A5C735346535D538653B7620953CC6C15 +53CE57216C3F5E005F0C623762386534653565E04F0E738D4E974EE04F144EF1 +4EE74EF74EE64F1D4F024F054F2256D8518B518C519951E55213520B52A60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +22 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053225304530353075407531E535F536D538953BA53D0598053F653F753F9 +597E53F4597F5B565724590459185932593059345DDF59755E845B825BF95C14 +5FD55FD45FCF625C625E626462615E815E835F0D5F52625A5FCA5FC7623965EE +624F65E7672F6B7A6C39673F673C6C376C446C45738C75927676909390926C4B +6C4C4E214E204E224E684E894E984EF94EEF7F5182784EF84F064F034EFC4EEE +4F1690994F284F1C4F074F1A4EFA4F17514A962351724F3B51B451B351B20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +23 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F6451E84F675214520F5215521852A84F33534B534F518F5350521C538B +522153BE52AE53D2541653FF538E540054305405541354155445541956E35735 +57365731573258EE59054E545447593656E756E55741597A574C5986574B5752 +5B865F535C1859985C3D5C78598E59A25990598F5C8059A15E085B925C285C2A +5C8D5EF55F0E5C8B5C895C925FD35FDA5C935FDB5DE0620F625D625F62676257 +9F505E8D65EB65EA5F7867375FD2673267366B226BCE5FEE6C586C516C770000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +24 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C3C5FFA6C5A5FF76C53706F7072706E6283628C707372B172B26287738F +627B627A6270793C6288808D808E6272827B65F08D718FB99096909A67454E24 +4E7167554E9C4F454F4A4F394F37674B4F324F426C1A4F444F4B6C6B4F404F35 +4F3151516C6F5150514E6C6D6C87519D6C9C51B551B851EC522352275226521F +522B522052B452B372C65325533B537473957397739373947392544D75397594 +543A7681793D5444544C5423541A5432544B5421828F54345449545054220000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +25 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000543F5451545A542F8FC956E956F256F356EF56ED56EC56E6574896285744 +573F573C575357564F85575F5743575857574F744F894F8457464F4C573D4F6A +57425754575558F158F258F0590B9EA656F1593D4F955994598C519E599C51BE +5235599F5233599B52315989599A530B658853925B8D54875BFE5BFF5BFD5C2B +54885C845C8E5C9C5465546C5C855DF55E09546F54615E0B54985E925E905F03 +56F75F1E5F6357725FE75FFE5FE65FDC5FCE57805FFC5FDF5FEC5FF657620000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005FF25FF05FF95945621359BA59CF623B623C628259C159B659BC6278628B +59B1629E62A5629B629C6299628D6285629D62755C445C475CAE65F65CA05CB5 +5CAF66F5675B5C9F675467525CA267586744674A67615CB66C7F6C916C9E5E14 +6C6E6C7C6C9F6C755F246C566CA26C795F7D6CA15FE56CAA6CA0601970797077 +707E600A7075707B7264601E72BB72BC72C772B972BE72B66011600C7398601C +6214623D62AD7593768062BE768376C076C162AE62B377F477F562A97ACC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +27 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ACD7CFA809F80918097809466048286828C65FB8295660B866C66058FB5 +8FBE8FC766F68FC190A990A4678E6792677690A896279626962B963396349629 +4E3D679F4E9D4F934F8A677D67814F6D4F8E4FA04FA24FA14F9F4FA36C1D4F72 +6CEC4F8C51566CD96CB651906CAD6CE76CB751ED51FE522F6CC3523C52345239 +52B952B552BF53556C9D5376537A53936D3053C153C253D554856CCF545F5493 +548954799EFE548F5469546D70915494546A548A708356FD56FB56F872D80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +28 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000056FC56F6576557815763576772D1576E5778577F73A673A258F3594B594C +74DD74E8753F59AD753E59C4759859C259B076F176F076F577F859BF77F959C9 +59B859AC7942793F79C559B759D77AFB5B607CFD5B965B9E5B945B9F5B9D80B5 +5C005C1982A082C05C495C4A82985CBB5CC182A782AE82BC5CB95C9E5CB45CBA +5DF65E135E125E7782C35E9882A25E995E9D5EF8866E5EF98FD25F065F218FCD +5F255F558FD790B290B45F845F8360306007963D6036963A96434FCD5FE90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +29 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000603D60084FC94FCB62BA62B24FDC62B762E462A74FDB4FC74FD662D562E1 +62DD62A662C162C562C062DF62E062DE53976589539965A665BA54A165FF54A5 +66176618660165FE54AE670C54B6676B67966782678A54BC67A354BE67A2678F +54B067F967806B266B276B686B69579D6B816BB46BD1578F57996C1C579A5795 +58F4590D59536C976C6C6CDF5A006CEA59DD6CE46CD86CB26CCE6CC859F2708B +70887090708F59F570877089708D70815BA8708C5CD05CD872405CD75CCB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007265726672685CC95CC772CD72D372DB5CD472CF73A773A3739E5CDF73AF +5DF95E2173AA739C5E2075427544753B75415E9B759B759E5F0779C479C379C6 +6037603979C7607279CA604560537ACF7C767C747CFF7CFC6042605F7F5980A8 +6058606680B0624280B362CF80A480B680A780AC630380A65367820E82C4833E +829C63006313631462FA631582AA62F082C9654365AA82A682B2662166326635 +8FCC8FD98FCA8FD88FCF90B7661D90AD90B99637670F9641963E96B697510000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000097634E574E794EB24EB04EAF4EB14FD24FD567E44FBE4FB84FB04FB14FC8 +67F667EE4FC64FCC4FE54FE34FB4516A67B2519F67C651C167CC51C251C35245 +524867C967CA524F67EA67CB52C552CA52C453275358537D6BE053DD53DC53DA +53D954B96D1F54D054B454CA6D0A54A354DA54A46D1954B2549E549F54B56D1D +6D4254CD6D1854CC6D03570057AC5791578E578D579257A1579057A657A8709F +579C579657A770A170B470B570A958F572495909590872705952726E72CA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000059DF72E859EB59EF59F059D55A0D5A0459F95A0259F859E259D959E75B6A +73B473EB5BAB73C75C1B5C2F73C6663C73CB74EC74EE5CD15CDC5CE65CE15CCD +76795CE25CDD5CE55DFB5DFA5E1E76F75EA176FA77E75EFC5EFB5F2F78127805 +5F66780F780E7809605C7813604E6051794B794560236031607C605279D66060 +604A60617AD162187B017C7A7C787C797C7F7C807C81631F631762EA63216304 +63057FBE6531654465408014654265BE80C76629661B80C86623662C661A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006630663B661E6637663880C9670E80D780E667E867D6822167C767BC6852 +67BF67D567FE836367FB833A67B168016805680067D782F26B2A6B6B82FB82F6 +82F082EA6BE182E082FA6D236CFF6D146D056D136D066D21884E6D156CAF6CF4 +6D026D458A076D268FE36D448FEE6D2470A590BD70A390D570A270BB70A070AA +90C891D470A870B670B270A79653964A70B9722E5005723C5013726D5030501B +72E772ED503372EC72E572E24FF773C473BD73CF73C973C173D0503173CE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000074ED74EB519374EF754975507546754A5261754D75A6525E525F525575A8 +52CD530E76C776FF54E276FD77E6780A54F37804780B78075504781578085511 +79D379D479D079D77A7C54F854E07A7D7A837A8257017AD47AD57AD37AD07AD2 +7AFE7AFC7C777C7C7C7B57B657BF57C757D057B957C1590E594A7F8F80D35A2D +80CB80D25A0F810980E280DF80C65B6C822482F782D882DD5C565C5482F882FC +5CEE5CF182E95D0082EE5E2982D0830E82E2830B82FD517986765F6786780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000605A60678675867D6088884288666081898C8A0560958A0660978C9F609C +8FF18FE78FE98FEF90C290BC632C90C690C06336634390CD90C9634B90C4633C +958163419CEC50324FF9501D4FFF50044FF05003635150024FFC4FF250245008 +5036502E65C35010503850394FFD50564FFB51A351A651A1681A684951C751C9 +5260526452595265526752575263682B5253682F52CF684452CE52D052D152CC +68266828682E550D54F46825551354EF54F554F9550255006B6D808255180000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054F054F66BE86BE355196BE7570557C96D6357B757CD6D0D6D616D9257BE +57BB6D6D57DB57C857C457C557D157CA57C06D676D605A215A2A6D7C5A1D6D82 +5A0B6D2F6D686D8B6D7E5A226D846D165A246D7B5A145A316D905A2F5A1A5A12 +70DD70CB5A2670E270D75BBC5BBB5BB75C055C065C525C5370C770DA5CFA5CEB +72425CF35CF55CE95CEF72FA5E2A5E305E2E5E2C5E2F5EAF5EA973D95EFD5F32 +5F8E5F935F8F604F609973D2607E73D46074604B6073607573E874DE60560000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +31 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060A9608B60A6755B609360AE609E60A7624575C075BF632E75BA63526330 +635B771B6319631B77126331635D6337633563537722635C633F654B78227835 +658B7828659A66506646664E6640782A664B6648795B66606644664D79526837 +682479EC79E0681B683679EA682C681968566847683E681E7A8B681568226827 +685968586855683068236B2E6B2B6B306B6C7B096B8B7C846BE96BEA6BE56D6B +7C8D7C856D736D577D117D0E6D5D6D566D8F6D5B6D1C6D9A6D9B6D997F610000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +32 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D816D717F5D7F5B6D726D5C6D9670C470DB70CC70D070E370DF80F270D6 +70EE70D580FB81008201822F727A833372F573028319835173E273EC73D573F9 +73DF73E683228342834E831B73E473E174F3834D831683248320755675557558 +7557755E75C38353831E75B4834B75B18348865376CB76CC772A86967716770F +869E8687773F772B770E772486857721771877DD86A7869578247836869D7958 +79598843796279DA79D9887679E179E579E879DB886F79E279F08874887C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +33 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008A128C477ADA7ADD8CA47ADB7ADC8D788DB57B0D7B0B7B147C8E7C868FF5 +7C877C837C8B90048FFC8FF690D67D2490D990DA90E37D257F627F937F997F97 +90DC90E47FC47FC6800A91D591E28040803C803B80F680FF80EE810481038107 +506A506180F750605053822D505D82278229831F8357505B504A506250158321 +505F506983188358506450465040506E50738684869F869B868986A68692868F +86A0884F8878887A886E887B88848873555055348A0D8A0B8A19553655350000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +34 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000553055525545550C8FF990099008553990DE9151553B554091DB91DF91DE +91D691E095859660965957F4965657ED57FD96BD57F8580B5042505958075044 +50665052505450715050507B507C505857E758015079506C507851A851D151CF +5268527652D45A5553A053C45A385558554C55685A5F55495A6C5A53555D5529 +5A43555455535A44555A5A48553A553F552B57EA5A4C57EF5A695A4757DD57FE +5A4257DE57E65B6E57E857FF580358F768A6591F5D1A595B595D595E5D0D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +35 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005D265A2B5D0F5A3B5D125D235A615A3A5A6E5A4B5A6B5EB45EB95A455A4E +5A685A3D5A715A3F5A6F5A7560905A735A2C5A595A545A4F5A6360CF60E45BC8 +60DD5BC360B15C5B5C6160CA5D215D0A5D0960C05D2C5D08638A63825D2A5D15 +639E5D105D1363975D2F5D18636F5DE35E395E355E3A5E32639C636D63AE637C +5EBB5EBA5F345F39638563816391638D6098655360D066656661665B60D760AA +666260A160A4688760EE689C60E7686E68AE60DE6956686F637E638B68A90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +36 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000687563796386639368776373636A686B636C68AA637F687163B263BA6896 +688B6366637468A4655A687B654E654D658D658E65AD6B3365C765CA6B9165C9 +6B8D65E366576C2A66636667671A671967166DAC6DE9689E68B6689868736E00 +689A688E68B768DB68A5686C68C168846DDB6DF46895687A68996DF068B868B9 +68706DCF6B356DD06B906BBB6BED6DD76DCD6DE36DC16DC36DCE70F771176DAD +6E0470F06DB970F36DE770FC6E086E0671136E0A6DB070F66DF86E0C710E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +37 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006DB1727B6E026E076E096E016E176DFF6E12730A730871037107710170F5 +70F1710870F2710F740170FE7407740073FA731A7310730E740273F374087564 +73FB75CE75D275CF751B752375617568768F756775D37739772F769077317732 +76D576D776D67730773B7726784877407849771E784A784C782678477850784B +7851784F78427846796B796E796C79F279F879F179F579F379F97A907B357B3B +7A9A7A937A917AE17B247B337B217B1C7B167B177B367B1F7B2F7C937C990000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +38 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007C9A7C9C7C947D497C967D347D377D3D7D2D7D367D4C7D457D2C7D487D41 +7D477F3B7D3F7D4A7D3B7D288008801A7F9C801D7F9B8049804580447C9B7FD1 +7FC7812A812E801F801E81318047811A8134811781258119811B831D83718384 +8380837283A18127837983918211839F83AD823A8234832382748385839C83B7 +8658865A8373865786B2838F86AE8395839983758845889C889488A3888F88A5 +88A988A6888A88A0889089928991899483B08A268A328A2883AE83768A1C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +39 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000086568A2B8A2086C28A2986C586BA86B08A218C3A86B38C5B8C588C7C86BB +8CA68CAE8CAD8D6588528D7E88958D7C8D7F8D7A8DBD889188A18DC08DBB8EAD +8EAF8ED6889788A488AC888C88938ED9898289D69012900E90258A27901390EE +8C3990AB90F78C5D9159915491F291F091E591F68DC28DB995878DC1965A8EDE +8EDD966E8ED78EE08EE19679900B98E198E6900C9EC49ED24E8090F04E81508F +50975088508990EC90E950815160915A91535E4251D391F491F151D251D60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000527391F9527091EB91F791E853A853A653C5559755DE966D966B559655B4 +96BF55859804559B55A0509B555950945586508B50A355AF557A508E509D5068 +559E509255A9570F570E581A5312581F53A4583C5818583E582655AD583A5645 +5822559358FB5963596455815AA85AA35A825A885AA15A855A9855955A99558E +5A895A815A965A80581E58275A91582857F5584858255ACF581B5833583F5836 +582E58395A875AA0582C5A7959615A865AAB5AAA5AA45A8D5A7E5A785BD50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005A7C5AA55AAC5C1E5C5F5C5E5D445D3E5A975D485D1C5AA95D5B5D4D5A8C +5A9C5D575A935D535D4F5BCD5D3B5D465BD15BCA5E465E475C305E485EC05EBD +5EBF5D4B5F115D355F3E5F3B5D555F3A5D3A5D525D3D5FA75D5960EA5D396107 +6122610C5D325D3660B360D660D25E4160E360E560E95FAB60C9611160FD60E2 +60CE611E61206121621E611663E263DE63E660F860FC60FE60C163F8611863FE +63C163BF63F763D1655F6560656163B063CE65D163E863EF667D666B667F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000063CA63E066736681666D6669646163DF671E68ED63DC63C463D863D36903 +63C768FE68E5691E690263D763D9690968CA690065646901691868E268CF659D +692E68C568FF65D2691C68C3667B6B6F66716B6E666A6BBE67016BF46C2D6904 +6DB66E756E1E68EA6E18690F6E4868F76E4F68E46E426E6A6E706DFE68E16907 +6E6D69086E7B6E7E6E5968EF6E5769146E806E5068FD6E296E766E2A6E4C712A +68CE7135712C7137711D68F468D1713868D47134712B7133712771246B3B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000712D7232728372827287730673247338732A732C732B6DFC732F73287417 +6E496E88741974386E45741F7414743C73F7741C74157418743974F975246E51 +6E3B6E03756E756D7571758E6E6175E56E286E606E716E6B769476B36E3076D9 +6E657748774977436E776E55774277DF6E66786378766E5A785F786679667971 +712E713179767984797579FF7A0771287A0E7A09724B725A7288728972867285 +7AE77AE27B55733073227B437B577B6C7B427B5373267B417335730C7CA70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007CA07CA67CA47D74741A7D59742D7D607D577D6C7D7E7D6474207D5A7D5D +752F756F756C7D767D4D7D7575E67FD37FD675E475D78060804E8145813B7747 +814881428149814081148141774C81EF81F68203786483ED785C83DA841883D2 +8408787084007868785E786284178346841483D38405841F8402841683CD83E6 +7AE6865D86D586E17B447B487B4C7B4E86EE884788467CA27C9E88BB7CA188BF +88B47D6388B57D56899A8A437D4F7D6D8A5A7D6B7D527D548A358A388A420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008A498A5D8A4B8A3D7F667FA27FA07FA18C608C5E8C7F8C7E8C8380D48CB1 +8D878152814F8D888D83814D813A8D868D8B8D828DCA8DD28204823C8DD48DC9 +8EB0833B83CF83F98EF28EE48EF38EEA83E78EFD83FC8F9D902B902A83C89028 +9029902C840183DD903A90309037903B83CB910A83D683F583C991FE922083DE +920B84069218922283D5921B920883D1920E9213839A83C3959583EE83C483FB +968C967B967F968183FE968286E286E686D386E386DA96EE96ED86EB96EC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +40 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000975F976F86D7976D86D188488856885588BA88D798F088B888C088BE9AA9 +88BC88B79AE04EB7890188C950CC50BC899750AA50B989DB50AB50C350CD517E +527E52798A588A4452E152E052E7538053AB53AA53A953E055EA8C8055D78CBE +8CB055C157158D84586C8D89585C58505861586A5869585658605866585F5923 +596659688EEF8EF75ACE8EF95AC55AC38EE58EF55AD08EE88EF68EEB8EF18EEC +8EF45B745B765BDC5BD75BDA5BDB91045C205D6D5D6690F95D645D6E91000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +41 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005D605F425F5A5F6E9164915F6130613A612A614361196131921A613D920F +920C92006408643264389206643192276419921C6411921992176429641D957B +958D958C643C96876446644796899683643A640796C8656B96F16570656D9770 +65E4669398A998EB9CE69EF9668F4E844EB6669250BF668E50AE694650CA50B4 +50C850C250B050C150BA693150CB50C9693E50B8697C694352786973527C6955 +55DB55CC6985694D69506947696769366964696155BF697D6B446B406B710000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +42 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B736B9C55C855F255CD6BC155C26BFA6C316C325864584F6EB86EA8586F +6E916EBB585D6E9A5865585B6EA9586358716EB56E6C6EE85ACB6EDD6EDA6EE6 +6EAC5AB05ABF5AC86ED96EE36EE96EDB5ACA716F5AB65ACD71485A90714A716B +5BD9714F715771745D635D4A5D6571457151716D5D6872517250724E5E4F7341 +5E4A732E73465EC574275EC674487453743D5FAF745D74566149741E74477443 +74587449612E744C7445743E61297501751E91686223757A75EE760276970000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +43 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007698641064126409775D77647753775878827890788A6439787A787D6423 +788B787864306428788D788878927881797E798364256427640B7980641B642E +64217A0F656F65927A1D66867AA17AA466907AE97AEA66997B627B6B67207B5E +695F7B79694E69627B6F7B686945696A7CAE6942695769597CB069487D906935 +7D8A69337D8B7D997D9569787D877D787D977D897D986976695869417FA3694C +693B694B7FDD8057694F8163816A816C692F697B693C815D81756B43815F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B48817D816D6BFB6BFC8241844F84846E9B847F6EC88448842A847B8472 +8464842E845C84536EC6844184C86EC184628480843E848384716EA6844A8455 +84586EC36EDC6ED886FC86FD87156E8D871686FF6EBF6EB36ED0885888CF88E0 +6EA371477154715289E78A6A8A80715D8A6F8A6571788A788A7D8A8871587143 +8A648A7E715F8A678C638C88714D8CCD724F8CC9728C8DED7290728E733C7342 +733B733A73408EB1734974448F048F9E8FA090439046904890459040904C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +45 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000074427446910C9113911574FF916B9167925D9255923569839259922F923C +928F925C926A9262925F926B926E923B92449241959A7699959976DD7755775F +968F77529696775A7769776796F496FC776D9755788797797894788F788497EE +97F57886980B788398F37899788098F798FF98F5798298EC98F17A117A18999A +7A129AE29B3D9B5D9CE87A1B9CEB9CEF9CEE9E819F1450D050D950DC50D87B69 +50E150EB7B737B7150F450E250DE7B767B637CB251F47CAF7D887D8652ED0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +46 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000052EA7D7F53327D7A53AE53B07D8355FB5603560B7D8456077D9255F87F6B +5628561E7F6C5618561156515605571758928164588C817758785884587358AD +58975895587758725896588D59108161596C82495AE782405AE4824584F15AEF +5626847684795AF05D7B84655D83844084865D8B5D8C844D5D785E5284598474 +5ED05ECF85075FB35FB4843A8434847A617B8478616F6181613C614261386133 +844261606169617D6186622C62288452644C84C56457647C8447843664550000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +47 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064626471646A6456643B6481846E644F647E646486F7870C86FA86D686F5 +657186F8870E66A5669A669C870D66A688D666A4698F69C569C8699269B288CC +88D0898569E369C069D669D1699F69A269D289DC89E68A7669E169D5699D8A3F +8A7769988A846B746BA18A816EF06EF38C3C8C4B6F1B6F0C6F1D6F346F286F17 +8C856F446F426F046F116EFA6F4A7191718E8D93718B718D717F718C717E717C +71838DEE71888DE98DE372948DE773557353734F7354746C7465746674610000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +48 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000746B746874768F0B7460903F74747506760E91107607910F911176B99114 +76B776E2916E7774777777767775923A777877719265777A715B777B78A678AE +78B8926C924F926078B178AF923679897987923192547A2992507A2A924E7A2D +7A2C92567A32959F7AEC7AF07B817B9E7B8396917B9296CE7BA37B9F7B9396F5 +7B867CB87CB79772980F980D980E98AC7DC87DB699AF7DD199B07DA87DAB9AAB +7DB37DCD9CED7DCF7DA49EFD50E67F417F6F7F7150F350DB50EA50DD50E40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +49 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000050D38023805B50EF8061805F818152805281818482135330824A824C5615 +560C561284BD8495561C849284C35602849684A584B584B384A384E484D884D5 +589884B784AD84DA84938736587A58875891873D872B87478739587B8745871D +58FE88FF88EA5AEE88F55AD5890088ED890388E95AF35AE289EA5ADB8A9B8A8E +8AA25AD98A9C8A948A908AA98AAC5C638A9F5D805D7D8A9D5D7A8C675D775D8A +8CD08CD68CD48D988D9A8D975D7F5E585E598E0B8E088E018EB48EB35EDC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008FA18FA25ED2905A5F449061905F5FB6612C9125917B9176917C61739289 +92F692B192AD929292819284617A92AE9290929E616A6161615695A295A7622B +642B644D645B645D96A0969D969F96D0647D96D1646664A6975964829764645C +644B64539819645098149815981A646B645964656477990665A098F89901669F +99BE99BC99B799B699C069C999B869CE699669B099C469BC99BF69999ADA9AE4 +9AE99AE89AEA9AE569BF9B2669BD69A49B4069B969CA699A69CF69B369930000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000069AA9EBD699E69D969976990510E69B550F769C650FC510D510151DA51D9 +51DB5286528E52EE533353B16EF15647562D56546F37564B5652563156445656 +5650562B6F18564D5637564F58A258B76F7358B26EEE58AA58B558B06F3C58B4 +58A458A76F0E59265AFE6EFD5B046F395AFC6EFC5B065B0A5AFA5B0D5B005B0E +7187719071895D9171855D8F5D905D985DA45D9B5DA35D965DE45E5A72957293 +5E5E734D5FB86157615C61A661956188747261A3618F75006164750361590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006178761661856187619E7611760A6198619C7781777C622F6480649B648E +648D649464C678B264A8648378AD64B9648664B464AF649178A064AA64A164A7 +66B666B3798B66BC66AC799466AD6A0E79886A1C6A1A7A2B7A4A6A0B7A2F69EF +6A0C69F06A227AAC69D87B886A1269FA7B916A2A7B966A107B8C7B9B6A2969F9 +69EA6A2C6A247BA469E96B526B4F6B537CBA7DA76F106F656F757DAA7DC17DC0 +7DC56FD07DCE6F5C6F3D6F717DCC6F916F0B6F796F816F8F7DA66F596F740000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007DA171AE7F7371A371AD7FE57FDE71AB71A671A2818952F2725772557299 +734B747A8215849784A4748C748484BA84CE74827493747B84AB750984B484C1 +84CD84AA849A84B1778A849D779084BB78C678D378C078D278C778C284AF799F +799D799E84B67A4184A07A387A3A7A4284DB84B07A3E7AB07BAE7BB38728876B +7BBF872E871E7BCD87197BB28743872C8741873E8746872087327CC47CCD7CC2 +7CC67CC37CC97CC787427DF887277DED7DE2871A873087117DDC7E027E010000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000088F27DD688FE7DE47DFE88F67E007DFC7DFD88EB7DF57DFF899F7DEB7DE5 +7F787FAE7FE78A998065806A80668068806B819481A18192819681938D968E09 +85018DFF84F88DFD84F58E0385048E068E058DFE8E00851B85038533853484ED +9123911C853591228505911D911A91249121877D917A91729179877192A5885C +88E6890F891B92A089A989A589EE8AB1929A8ACC8ACE92978AB792A38AB58AE9 +8AB492958AB38AC18AAF8ACA8AD09286928C92998C8E927E92878CE98CDB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000928B8CEB8DA496A18DA28D9D977D977A977E97838E2A8E28977B97848EB8 +8EB68EB98EB78F228F2B8F278F198FA499078FB3999C9071906A99BB99BA9188 +918C92BF92B892BE92DC92E59B3F9B6092D492D69CF192DA92ED92F392DB5103 +92B992E292EB95AF50F695B295B3510C50FD510A96A396A552F152EF56485642 +970A563597879789978C97EF982A98225640981F563D9919563E99CA99DA563A +571A58AB99DE99C899E058A39AB69AB558A59AF458FF9B6B9B699B729B630000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005AF69D0D5AF89D019D0C5B019CF85B055B0F9CFE9D029E845D9F9EAB9EAA +511D51165DA0512B511E511B5290529453145E605E5C56675EDB567B5EE1565F +5661618B6183617961B161B061A2618958C358CA58BB58C058C459015B1F5B18 +5B115B1561B35B125B1C64705B225B795DA664975DB35DAB5EEA648A5F5B64A3 +649F61B761CE61B961BD61CF61C06199619765B361BB61D061C4623166B764D3 +64C06A006A066A1769E564DC64D164C869E464D566C369EC69E266BF66C50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000069FE66CD66C167066A1467246A636A426A5269E66A436A3369FC6A6C6A57 +6A046A4C6A6E6A0F69F66A266A0769F46A376B516A716A4A6A366BA66A536C00 +6A456A706F416F266A5C6B586B576F926F8D6F896F8C6F626F4F6FBB6F5A6F96 +6FBE6F6C6F826F556FB56FD36F9F6F576FB76FF571B76F0071BB6F6B71D16F67 +71BA6F5371B671CC6F7F6F9571D3749B6F6A6F7B749674A2749D750A750E719A +7581762C76377636763B71A476A171AA719C779871B37796729A735873520000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +52 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078D678EB736078DC735B79A579A998347A537A4574897A4F74867ABD7ABB +7AF17488747C7BEC7BED7507757E7CD3761E7CE1761D7E197623761A76287E27 +7E26769D769E806E81AF778F778981AD78CD81AA821878CC78D178CE78D4856F +854C78C48542799A855C8570855F79A2855A854B853F878A7AB4878B87A1878E +7BBE7BAC8799885E885F892489A78AEA8AFD8AF98AE38AE57DDB7DEA8AEC7DD7 +7DE17E037DFA8CF27DF68CEF7DF08DA67DDF7F767FAC8E3B8E437FED8E320000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008F318F307FE68F2D8F3C8FA78FA5819F819E819591379195918E82169196 +82539345930A824E825192FD9317931C930793319332932C9330930393058527 +95C284FB95B884FA95C1850C84F4852A96AB96B784F784EB97159714851284EA +970C971784FE9793851D97D2850284FD983698319833983C982E983A84F0983D +84F998B5992299239920991C991D866299A0876399EF99E899EB877387588754 +99E199E68761875A9AF89AF5876D876A9B839B949B84875D9B8B9B8F877A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B8C875C9B89874F9B8E8775876287679D249D0F89059D139D0A890B8917 +891889199D2A9D1A89119D279D169D2189A49E859EAC9EC69EC59ED79F538AB8 +5128512751DF8AD5533553B38ABE568A567D56898AC358CD58D08AD95B2B5B33 +5B295B355B315B375C365DBE8CDD5DB98DA05DBB8DA161E261DB61DD61DC61DA +8E2E61D98E1B8E1664DF8E198E2664E18E1464EE8E1865B566D466D58E1A66D0 +66D166CE66D78F208F236A7D6A8A90736AA7906F6A996A826A88912B91290000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +55 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006A8691326A986A9D918591866A8F91816AAA91846B5D92D06C0A92C46FD7 +6FD66FE592CF92F192DF6FD96FDA6FEA92DD6FF692EF92C271E392CA71E992CE +71EB71EF71F371EA92E092DE92E792D192D3737192E174AE92C674B3957C74AC +95AB95AE75837645764E764476A376A577A677A4978A77A977AF97D097CF981E +78F078F878F198287A49981B982798B27AC27AF27AF37BFA99167BF67BFC7C18 +7C087C1299D399D47CDB7CDA99D699D899CB7E2C7E4D9AB39AEC7F467FF60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000802B807481B881C89B679B749B71859285939B75857F85AB85979B6C9CFC +85AC9CFD9CFF9CF787CE9D0087CD9CFB9D0887C187B187C79ED389409F10893F +893951178943511151DE533489AB56708B1F8B098B0C566656638C4056728C96 +56778CF68CF758C88E468E4F58BF58BA58C28F3D8F4193669378935D93699374 +937D936E93729373936293489353935F93685DB1937F936B5DB595C45DAE96AF +96AD96B25DAD5DAF971A971B5E685E665E6F5EE9979B979F5EE85EE55F4B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005FBC5FBB619D61A86196984061B4984761C198B761BA61BF61B8618C64D7 +99A264D064CF9A0099F3648964C399F564F364D99ABD9B009B0265A29B349B49 +9B9F66CA9BA39BCD9B999B9D66BA66CC9D396A349D446A496A679D356A686A3E +9EAF6A6D512F6A5B6A519F8E6A5A569F569B569E5696569456A06A4F5B3B6A6F +6A695B3A5DC15F4D5F5D61F36A4D6A4E6A466B5564F664E564EA64E765056BC8 +64F96C046C036C066AAB6AED6AB26AB06AB56ABE6AC16AC86FC46AC06ABC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +58 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006AB16AC46ABF6FA56FAE700870036FFD7010700270136FA271FA720074B9 +74BC6FB2765B7651764F76EB77B871D677B977C177C077BE790B71C77907790A +790871BC790D7906791579AF729E736973667AF5736C73657C2E736A7C1B749A +7C1A7C24749274957CE67CE37580762F7E5D7E4F7E667E5B7F477FB476327630 +76BB7FFA802E779D77A181CE779B77A282197795779985CC85B278E985BB85C1 +78DE78E378DB87E987EE87F087D6880E87DA8948894A894E894D89B189B00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089B37AB78B388B327BE78B2D7BD58B347BDA8B298C747BD47BEA8D037BDC +7BEB8DA98E587CD27CD48EBF8EC18F4A8FAC7E219089913D913C91A993A07E0E +93907E159393938B93AD93BB93B87E0D7E14939C95D895D77F7B7F7C7F7A975D +97A997DA8029806C81B181A6985481B99855984B81B0983F98B981B281B781A7 +81F29938993699408556993B993999A4855385619A089A0C85469A1085419B07 +85449BD285479BC29BBB9BCC9BCB854E856E9D4D9D639D4E85609D509D550000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000855D9D5E85659E909EB29EB186649ECA9F029F279F26879356AF58E058DC +87965B39877987875B7C5BF3879087915C6B5DC4650B6508650A8789891E65DC +8930892D66E166DF6ACE6AD46AE36AD76AE2892C891F89F18AE06AD86AD56AD2 +8AF58ADD701E702C70256FF37204720872158AE874C474C974C774C876A977C6 +77C57918791A79208CF37A667A647A6A8DA78E338E3E8E388E408E457C357C34 +8E3D8E417E6C8E3F7E6E7E718F2E81D481D6821A82628265827685DB85D60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000908685E79133913585F4919387FD87D58807918F880F87F89308931F8987 +930F89B589F5933C8B3F8B438B4C93018D0B8E6B8E688E708E758E7792FA8EC3 +92F993E993EA93CB93C593C6932993ED93D3932A93E5930C930B93DB93EB93E0 +93C1931695BC95DD95BE95B995BA95B695BF95B595BD96A996D497B297B497B1 +97B597F2979497F097F89856982F98329924994499279A269A1F9A189A219A17 +99E49B0999E399EA9BC59BDF9AB99BE39AB49BE99BEE9AFA9AF99D669D7A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B809D6E9D919D839D769D7E9D6D9B939E959EE39B7A9B959F039F049D25 +9F179D2051369D1453369D1D5B429D229D105B445B465B7E5DCA5DC85DCC5EF0 +9ED5658566E566E79F3D512651256AF451246AE9512952F45693568C568D703D +56847036567E7216567F7212720F72177211720B5B2D5B2574CD74D074CC74CE +74D15B2F75895B7B7A6F7C4B7C445E6C5E6A5FBE61C361B57E7F8B7161E0802F +807A807B807C64EF64E964E385FC861086026581658085EE860366D2860D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000086138608860F881888126A9B6AA18967896589BB8B698B626A838B6E6AA4 +8B616A7F8B648B4D8C516A8C6A928E838EC66C09941F6FA99404941794089405 +6FED93F3941E9402941A941B9427941C71E196B571E871F2973371F097349731 +97B897BA749797FC74AB749098C374AD994D74A59A2F7510751175129AC97584 +9AC89AC49B2A9B389B5076E99C0A9BFB9C049BFC9BFE77B477B177A89C029BF6 +9C1B9BF99C159C109BFF9C009C0C78F978FE9D959DA579A87A5C7A5B7A560000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009E989EC17A5A9F5A516456BB7C0558E65B495BF77BFF7BFB5DD07BF45FC2 +7BF365117C096AFF6AFE6AFD7BFD6B017BF07BF1704B704D704774D376687667 +7E33984877D179307932792E7E479F9D7AC97AC87E3B7C567C517E3A7F457F7F +7E857E897E8E7E84802C826A862B862F862881C586168615861D881A825A825C +858389BC8B758B7C85958D118D128F5C91BB85A493F4859E8577942D858985A1 +96E497379736976797BE97BD97E29868986698C898CA98C798DC8585994F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000099A99A3C85909A3B9ACE87BE9B149B5387C59C2E87AC9C1F87B587BC87AE +87C99DB09DBD87CC87B79DAE9DC49E7B87B487B69E9E87B89F0587DE9F699FA1 +56C7571D5B4A5DD389525F72620289AD62356527651E651F8B1E8B186B076B06 +8B058B0B7054721C72207AF88B077C5D7C588B067E927F4E8B1A8C4F8C708827 +8C718B818B838C948C448D6F8E4E8E4D8E539442944D9454944E8F409443907E +9138973C974097C09199919F91A1919D995A9A5193839ADD936493569C380000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000937C9C459C3A93769C359350935193609EF1938F9F93529A937993578641 +5DD7934F65289377937B936170537059936772219359766F793779B57C627C5E +7CF596AE96B0863D9720882D89898B8D8B878B908D1A8E99979E979D97D5945F +97F1984194569461945B945A945C9465992B9741992A9933986E986C986D9931 +99AA9A5C9A589ADE9A029C4F9C5199F79C5399F899F699FB9DFC9F3999FC513E +9ABE56D29AFD5B4F6B149B487A727A739B9E9B9B9BA68B919BA59BA491BF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009BA2946C9BAF9D3396E697459D3697C897E4995D9D389B219D459B2C9B57 +9D3E9D379C5D9C619C659E089E8A9E899E8D9EB09EC89F459EFB9EFF620566EF +6B1B6B1D722572247C6D512E8642864956978978898A8B9759708C9B8D1C5C6A +8EA25E6D5E6E61D861DF61ED61EE61F161EA9C6C61EB9C6F61E99E0E65049F08 +9F1D9FA3650364FC5F606B1C66DA66DB66D87CF36AB98B9B8EA791C46ABA947A +6AB76AC79A619A639AD79C766C0B9FA5700C7067700172AB864A897D8B9D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008C538F65947B6FFC98CD98DD72019B309E16720371FD737674B874C096E7 +9E189EA274B69F7C74C27E9E9484765C9E1C76597C7197CA7657765A76A69EA3 +76EC9C7B9F97790C7913975079097910791257275C1379AC7A5F7C1C7C297C19 +7C205FC87C2D7C1D7C267C287C2267657C307E5C52BD7E565B667E5865F96788 +6CE66CCB7E574FBD5F8D7FB36018604880756B2970A681D07706825E85B485C6 +5A105CFC5CFE85B385B585BD85C785C485BF70C985CE85C885C585B185B60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000085D28624957985B796BA866987E787E687E287DB87EB87EA7B29812887F3 +8A2E87D487DC87D39AD987D8582B584587D963FA87F487E887DD6E86894B894F +894C89468950586789495BDD656E8B238B338B308C878B4750D250DF8B3E8B31 +8B258B3769BA8B366B9D8B2480598B3D8B3A8C428C758C998C988C978CFE8D04 +8D028D008E5C6F8A8E608E577BC37BC28E658E678E5B8E5A90F68E5D98238E54 +8F468F478F488F4B71CD7499913B913E91A891A591A7984291AA93B5938C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093927F84939B939D938993A7938E8D0E939E9861939593888B73939F9C27 +938D945877D69B2D93A493A893B493A395D295D395D196B396D796DA5DC296DF +96D896DD97239722972597AC97AE97A84F664F684FE7503F97A550A6510F523E +53245365539B517F54CB55735571556B55F456225620569256BA569156B05759 +578A580F581258135847589B5900594D5AD15AD35B675C575C775CD55D755D8E +5DA55DB65DBF5E655ECD5EED5F945F9A5FBA6125615062A36360636463B60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000640364B6651A7A255C2166E2670267A467AC68106806685E685A692C6929 +6A2D6A776A7A6ACA6AE66AF56B0D6B0E6BDC6BDD6BF66C1E6C636DA56E0F6E8A +6E846E8B6E7C6F4C6F486F496F9D6F996FF8702E702D705C79CC70BF70EA70E5 +71117112713F7139713B713D71777175717671717196719371B471DD71DE720E +591172187347734873EF7412743B74A4748D74B47673767776BC7819781B783D +78537854785878B778D878EE7922794D7986799979A379BC7AA77B377B590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007BD07C2F7C327C427C4E7C687CA97CED7DD07E077DD37E647F40791E8041 +806380BB6711672582488310836283128421841E84E284DE84E1857385D485F5 +863786458672874A87A987A587F5883488508887895489848B038C528CD88D0C +8D188DB08EBC8ED58FAA909C85E8915C922B9221927392F492F5933F93429386 +93BE93BC93BD93F193F293EF94229423942494679466959795CE95E7973B974D +98E499429B1D9B9889629D4964495E715E8561D3990E8002781E898889B70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005528557255BA55F055EE56B856B956C4805392B08B558B518B428B528B57 +8C438C778C768C9A8D068D078D098DAC8DAA8DAD8DAB8E6D8E788E738E6A8E6F +8E7B8EC28F528F518F4F8F508F538FB49140913F91B091AD93DE93C793CF93C2 +93DA93D093F993EC93CC93D993A993E693CA93D493EE93E393D593C493CE93C0 +93D293A593E7957D95DA95DB96E19729972B972C9728972697B397B797B697DD +97DE97DF985C9859985D985798BF98BD98BB98BE99489947994399A699A70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +68 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009A1A9A159A259A1D9A249A1B9A229A209A279A239A1E9A1C9A149AC29B0B +9B0A9B0E9B0C9B379BEA9BEB9BE09BDE9BE49BE69BE29BF09BD49BD79BEC9BDC +9BD99BE59BD59BE19BDA9D779D819D8A9D849D889D719D809D789D869D8B9D8C +9D7D9D6B9D749D759D709D699D859D739D7B9D829D6F9D799D7F9D879D689E94 +9E919EC09EFC9F2D9F409F419F4D9F569F579F58533756B256B556B358E35B45 +5DC65DC75EEE5EEF5FC05FC161F9651765166515651365DF66E866E366E40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006AF36AF06AEA6AE86AF96AF16AEE6AEF703C7035702F7037703470317042 +7038703F703A7039702A7040703B703370417213721472A8737D737C74BA76AB +76AA76BE76ED77CC77CE77CF77CD77F279257923792779287924792979B27A6E +7A6C7A6D7AF77C497C487C4A7C477C457CEE7E7B7E7E7E817E807FBA7FFF8079 +81DB81D982688269862285FF860185FE861B860085F6860486098605860C85FD +8819881088118817881388168963896689B989F78B608B6A8B5D8B688B630000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B658B678B6D8DAE8E868E888E848F598F568F578F558F588F5A908D9143 +914191B791B591B291B3940B941393FB9420940F941493FE9415941094289419 +940D93F5940093F79407940E9416941293FA940993F8943C940A93FF93FC940C +93F69411940695DE95E095DF972E972F97B997BB97FD97FE986098629863985F +98C198C29950994E9959994C994B99539A329A349A319A2C9A2A9A369A299A2E +9A389A2D9AC79ACA9AC69B109B129B119C0B9C089BF79C059C129BF89C400000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009C079C0E9C069C179C149C099D9F9D999DA49D9D9D929D989D909D9B9DA0 +9D949D9C9DAA9D979DA19D9A9DA29DA89D9E9DA39DBF9DA99D969DA69DA79E99 +9E9B9E9A9EE59EE49EE79EE69F309F2E9F5B9F609F5E9F5D9F599F91513A5139 +5298529756C356BD56BE5B485B475DCB5DCF5EF161FD651B6B026AFC6B036AF8 +6B0070437044704A7048704970457046721D721A7219737E7517766A77D0792D +7931792F7C547C537CF27E8A7E877E887E8B7E867E8D7F4D7FBB803081DD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008618862A8626861F8623861C86198627862E862186208629861E86258829 +881D881B88208824881C882B884A896D8969896E896B89FA8B798B788B458B7A +8B7B8D108D148DAF8E8E8E8C8F5E8F5B8F5D91469144914591B9943F943B9436 +9429943D94309439942A9437942C9440943195E595E495E39735973A97BF97E1 +986498C998C698C0995899569A399A3D9A469A449A429A419A3A9A3F9ACD9B15 +9B179B189B169B3A9B529C2B9C1D9C1C9C2C9C239C289C299C249C219DB70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009DB69DBC9DC19DC79DCA9DCF9DBE9DC59DC39DBB9DB59DCE9DB99DBA9DAC +9DC89DB19DAD9DCC9DB39DCD9DB29E7A9E9C9EEB9EEE9EED9F1B9F189F1A9F31 +9F4E9F659F649F924EB956C656C556CB59715B4B5B4C5DD55DD15EF265216520 +652665226B0B6B086B096C0D7055705670577052721E721F72A9737F74D874D5 +74D974D7766D76AD793579B47A707A717C577C5C7C597C5B7C5A7CF47CF17E91 +7F4F7F8781DE826B863486358633862C86328636882C88288826882A88250000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000897189BF89BE89FB8B7E8B848B828B868B858B7F8D158E958E948E9A8E92 +8E908E968E978F608F629147944C9450944A944B944F94479445944894499446 +973F97E3986A986998CB9954995B9A4E9A539A549A4C9A4F9A489A4A9A499A52 +9A509AD09B199B2B9B3B9B569B559C469C489C3F9C449C399C339C419C3C9C37 +9C349C329C3D9C369DDB9DD29DDE9DDA9DCB9DD09DDC9DD19DDF9DE99DD99DD8 +9DD69DF59DD59DDD9EB69EF09F359F339F329F429F6B9F959FA2513D52990000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000058E858E759725B4D5DD8882F5F4F62016203620465296525659666EB6B11 +6B126B0F6BCA705B705A7222738273817383767077D47C677C667E95826C863A +86408639863C8631863B863E88308832882E883389768974897389FE8B8C8B8E +8B8B8B888C458D198E988F648F6391BC94629455945D9457945E97C497C59800 +9A569A599B1E9B1F9B209C529C589C509C4A9C4D9C4B9C559C599C4C9C4E9DFB +9DF79DEF9DE39DEB9DF89DE49DF69DE19DEE9DE69DF29DF09DE29DEC9DF40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +70 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009DF39DE89DED9EC29ED09EF29EF39F069F1C9F389F379F369F439F4F9F71 +9F709F6E9F6F56D356CD5B4E5C6D652D66ED66EE6B13705F7061705D70607223 +74DB74E577D5793879B779B67C6A7E977F89826D8643883888378835884B8B94 +8B958E9E8E9F8EA08E9D91BE91BD91C2946B9468946996E597469743974797C7 +97E59A5E9AD59B599C639C679C669C629C5E9C609E029DFE9E079E039E069E05 +9E009E019E099DFF9DFD9E049EA09F1E9F469F749F759F7656D4652E65B80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +71 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B186B196B176B1A7062722672AA77D877D979397C697C6B7CF67E9A7E98 +7E9B7E9981E081E18646864786488979897A897C897B89FF8B988B998EA58EA4 +8EA3946E946D946F9471947397499872995F9C689C6E9C6D9E0B9E0D9E109E0F +9E129E119EA19EF59F099F479F789F7B9F7A9F79571E70667C6F883C8DB28EA6 +91C394749478947694759A609B2E9C749C739C719C759E149E139EF69F0A9FA4 +706870657CF7866A883E883D883F8B9E8C9C8EA98EC9974B9873987498CC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000996199AB9A649A669A679B249E159E179F4862076B1E7227864C8EA89482 +948094819A699A689E19864B8B9F94839C799EB776759A6B9C7A9E1D7069706A +72299EA49F7E9F499F988AF68AFC8C6B8C6D8C938CF48E448E318E348E428E39 +8E358F3B8F2F8F388F338FA88FA69075907490789072907C907A913491929320 +933692F89333932F932292FC932B9304931A9310932693219315932E931995BB +96A796A896AA96D5970E97119716970D9713970F975B975C9766979898300000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009838983B9837982D9839982499109928991E991B9921991A99ED99E299F1 +9AB89ABC9AFB9AED9B289B919D159D239D269D289D129D1B9ED89ED49F8D9F9C +512A511F5121513252F5568E5680569056855687568F58D558D358D158CE5B30 +5B2A5B245B7A5C375C685DBC5DBA5DBD5DB85E6B5F4C5FBD61C961C261C761E6 +61CB6232623464CE64CA64D864E064F064E664EC64F164E264ED6582658366D9 +66D66A806A946A846AA26A9C6ADB6AA36A7E6A976A906AA06B5C6BAE6BDA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C086FD86FF16FDF6FE06FDB6FE46FEB6FEF6F806FEC6FE16FE96FD56FEE +6FF071E771DF71EE71E671E571ED71EC71F471E0723572467370737274A974B0 +74A674A876467642764C76EA77B377AA77B077AC77A777AD77EF78F778FA78F4 +78EF790179A779AA7A577ABF7C077C0D7BFE7BF77C0C7BE07CE07CDC7CDE7CE2 +7CDF7CD97CDD7E2E7E3E7E467E377E327E437E2B7E3D7E317E457E417E347E39 +7E487E357E3F7E2F7F447FF37FFC807180728070806F807381C681C381BA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +75 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081C281C081BF81BD81C981BE81E88209827185AA8584857E859C85918594 +85AF859B858785A8858A85A6866787C087D187B387D287C687AB87BB87BA87C8 +87CB893B893689448938893D89AC8B0E8B178B198B1B8B0A8B208B1D8B048B10 +8C418C3F8C738CFA8CFD8CFC8CF88CFB8DA88E498E4B8E488E4A8F448F3E8F42 +8F458F3F907F907D9084908190829080913991A3919E919C934D938293289375 +934A9365934B9318937E936C935B9370935A935495CA95CB95CC95C895C60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +76 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000096B196B896D6971C971E97A097D3984698B699359A0199FF9BAE9BAB9BAA +9BAD9D3B9D3F9E8B9ECF9EDE9EDC9EDD9EDB9F3E9F4B53E2569556AE58D958D8 +5B385F5E61E3623364F464F264FE650664FA64FB64F765B766DC67266AB36AAC +6AC36ABB6AB86AC26AAE6AAF6B5F6B786BAF7009700B6FFE70066FFA7011700F +71FB71FC71FE71F87377737574A774BF751576567658765277BD77BF77BB77BC +790E79AE7A617A627A607AC47AC57C2B7C277C2A7C1E7C237C217CE77E540000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E557E5E7E5A7E617E527E597F487FF97FFB8077807681CD81CF820A85CF +85A985CD85D085C985B085BA85B987EF87EC87F287E0898689B289F48B288B39 +8B2C8B2B8C508D058E598E638E668E648E5F8E558EC08F498F4D908790839088 +91AB91AC91D09394938A939693A293B393AE93AC93B09398939A939795D495D6 +95D095D596E296DC96D996DB96DE972497A397A697AD97F9984D984F984C984E +985398BA993E993F993D992E99A59A0E9AC19B039B069B4F9B4E9B4D9BCA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +78 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009BC99BFD9BC89BC09D519D5D9D609EE09F159F2C513356A556A858DE58DF +58E25BF59F905EEC61F261F761F661F56500650F66E066DD6AE56ADD6ADA6AD3 +701B701F7028701A701D701570187206720D725872A27378737A74BD74CA74E3 +75877586765F766177C7791979B17A6B7A697C3E7C3F7C387C3D7C377C407E6B +7E6D7E797E697E6A7E737F857FB67FB97FB881D885E985DD85EA85D585E485E5 +85F787FB8805880D87F987FE8960895F8956895E8B418B5C8B588B498B5A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +79 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B4E8B4F8B468B598D088D0A8E7C8E728E878E768E6C8E7A8E748F548F4E +8FAD908A908B91B191AE93E193D193DF93C393C893DC93DD93D693E293CD93D8 +93E493D793E895DC96B496E3972A9727976197DC97FB985E9858985B98BC9945 +99499A169A199B0D9BE89BE79BD69BDB9D899D619D729D6A9D6C9E929E979E93 +9EB452F856B756B656B456BC58E45B405B435B7D5BF65DC961F861FA65186514 +651966E667276AEC703E703070327210737B74CF766276657926792A792C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000792B7AC77AF67C4C7C437C4D7CEF7CF08FAE7E7D7E7C7E827F4C800081DA +826685FB85F9861185FA8606860B8607860A88148815896489BA89F88B708B6C +8B668B6F8B5F8B6B8D0F8D0D8E898E818E858E8291B491CB9418940393FD95E1 +973098C49952995199A89A2B9A309A379A359C139C0D9E799EB59EE89F2F9F5F +9F639F615137513856C156C056C259145C6C5DCD61FC61FE651D651C659566E9 +6AFB6B046AFA6BB2704C721B72A774D674D4766977D37C507E8F7E8C7FBC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008617862D861A882388228821881F896A896C89BD8B748B778B7D8D138E8A +8E8D8E8B8F5F8FAF91BA942E94339435943A94389432942B95E2973897399732 +97FF9867986599579A459A439A409A3E9ACF9B549B519C2D9C259DAF9DB49DC2 +9DB89E9D9EEF9F199F5C9F669F67513C513B56C856CA56C95B7F5DD45DD25F4E +61FF65246B0A6B6170517058738074E4758A766E766C79B37C607C5F807E807D +81DF8972896F89FC8B808D168D178E918E938F619148944494519452973D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000973E97C397C1986B99559A559A4D9AD29B1A9C499C319C3E9C3B9DD39DD7 +9F349F6C9F6A9F9456CC5DD662006523652B652A66EC6B1074DA7ACA7C647C63 +7C657E937E967E9481E28638863F88318B8A9090908F9463946094649768986F +995C9A5A9A5B9A579AD39AD49AD19C549C579C569DE59E9F9EF456D158E9652C +705E7671767277D77F507F888836883988628B938B928B9682778D1B91C0946A +97429748974497C698709A5F9B229B589C5F9DF99DFA9E7C9E7D9F079F770000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009F725EF36B1670637C6C7C6E883B89C08EA191C1947294709871995E9AD6 +9B239ECC706477DA8B9A947797C99A629A657E9C8B9C8EAA91C5947D947E947C +9C779C789EF78C54947F9E1A72289A6A9B319E1B9E1E7C720000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1250.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1250.enc new file mode 100644 index 00000000..070ad901 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1250.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1250, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0083201E2026202020210088203001602039015A0164017D0179 +009020182019201C201D202220132014009821220161203A015B0165017E017A +00A002C702D8014100A4010400A600A700A800A9015E00AB00AC00AD00AE017B +00B000B102DB014200B400B500B600B700B80105015F00BB013D02DD013E017C +015400C100C2010200C40139010600C7010C00C9011800CB011A00CD00CE010E +01100143014700D300D4015000D600D70158016E00DA017000DC00DD016200DF +015500E100E2010300E4013A010700E7010D00E9011900EB011B00ED00EE010F +01110144014800F300F4015100F600F70159016F00FA017100FC00FD016302D9 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1251.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1251.enc new file mode 100644 index 00000000..376b1b40 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1251.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1251, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +04020403201A0453201E20262020202120AC203004092039040A040C040B040F +045220182019201C201D202220132014009821220459203A045A045C045B045F +00A0040E045E040800A4049000A600A7040100A9040400AB00AC00AD00AE0407 +00B000B104060456049100B500B600B704512116045400BB0458040504550457 +0410041104120413041404150416041704180419041A041B041C041D041E041F +0420042104220423042404250426042704280429042A042B042C042D042E042F +0430043104320433043404350436043704380439043A043B043C043D043E043F +0440044104420443044404450446044704480449044A044B044C044D044E044F diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1252.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1252.enc new file mode 100644 index 00000000..dd525ea4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1252.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1252, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0192201E20262020202102C62030016020390152008D017D008F +009020182019201C201D20222013201402DC21220161203A0153009D017E0178 +00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF +00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF +00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF +00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF +00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1253.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1253.enc new file mode 100644 index 00000000..a8754c37 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1253.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1253, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0192201E20262020202100882030008A2039008C008D008E008F +009020182019201C201D20222013201400982122009A203A009C009D009E009F +00A00385038600A300A400A500A600A700A800A9000000AB00AC00AD00AE2015 +00B000B100B200B3038400B500B600B703880389038A00BB038C00BD038E038F +0390039103920393039403950396039703980399039A039B039C039D039E039F +03A003A1000003A303A403A503A603A703A803A903AA03AB03AC03AD03AE03AF +03B003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C203C303C403C503C603C703C803C903CA03CB03CC03CD03CE0000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1254.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1254.enc new file mode 100644 index 00000000..b9e3b3c5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1254.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1254, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0192201E20262020202102C62030016020390152008D008E008F +009020182019201C201D20222013201402DC21220161203A0153009D009E0178 +00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF +00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF +011E00D100D200D300D400D500D600D700D800D900DA00DB00DC0130015E00DF +00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF +011F00F100F200F300F400F500F600F700F800F900FA00FB00FC0131015F00FF diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1255.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1255.enc new file mode 100644 index 00000000..6e78b954 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1255.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1255, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0192201E20262020202102C62030008A2039008C008D008E008F +009020182019201C201D20222013201402DC2122009A203A009C009D009E009F +00A000A100A200A320AA00A500A600A700A800A900D700AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900F700BB00BC00BD00BE00BF +05B005B105B205B305B405B505B605B705B805B9000005BB05BC05BD05BE05BF +05C005C105C205C305F005F105F205F305F40000000000000000000000000000 +05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF +05E005E105E205E305E405E505E605E705E805E905EA00000000200E200F0000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1256.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1256.enc new file mode 100644 index 00000000..a98762a0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1256.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1256, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC067E201A0192201E20262020202102C62030067920390152068606980688 +06AF20182019201C201D20222013201406A921220691203A0153200C200D06BA +00A0060C00A200A300A400A500A600A700A800A906BE00AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B9061B00BB00BC00BD00BE061F +06C1062106220623062406250626062706280629062A062B062C062D062E062F +063006310632063306340635063600D7063706380639063A0640064106420643 +00E0064400E2064506460647064800E700E800E900EA00EB0649064A00EE00EF +064B064C064D064E00F4064F065000F7065100F9065200FB00FC200E200F06D2 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1257.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1257.enc new file mode 100644 index 00000000..4aa135df --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1257.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1257, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0083201E20262020202100882030008A2039008C00A802C700B8 +009020182019201C201D20222013201400982122009A203A009C00AF02DB009F +00A0000000A200A300A4000000A600A700D800A9015600AB00AC00AD00AE00C6 +00B000B100B200B300B400B500B600B700F800B9015700BB00BC00BD00BE00E6 +0104012E0100010600C400C501180112010C00C90179011601220136012A013B +01600143014500D3014C00D500D600D701720141015A016A00DC017B017D00DF +0105012F0101010700E400E501190113010D00E9017A011701230137012B013C +01610144014600F3014D00F500F600F701730142015B016B00FC017C017E02D9 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1258.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1258.enc new file mode 100644 index 00000000..95fdef88 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp1258.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1258, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0192201E20262020202102C62030008A20390152008D008E008F +009020182019201C201D20222013201402DC2122009A203A0153009D009E0178 +00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF +00C000C100C2010200C400C500C600C700C800C900CA00CB030000CD00CE00CF +011000D1030900D300D401A000D600D700D800D900DA00DB00DC01AF030300DF +00E000E100E2010300E400E500E600E700E800E900EA00EB030100ED00EE00EF +011100F1032300F300F401A100F600F700F800F900FA00FB00FC01B020AB00FF diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp437.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp437.enc new file mode 100644 index 00000000..ecae4e65 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp437.enc @@ -0,0 +1,20 @@ +# Encoding file: cp437, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE00EC00C400C5 +00C900E600C600F400F600F200FB00F900FF00D600DC00A200A300A520A70192 +00E100ED00F300FA00F100D100AA00BA00BF231000AC00BD00BC00A100AB00BB +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 +226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp737.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp737.enc new file mode 100644 index 00000000..5b59661e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp737.enc @@ -0,0 +1,20 @@ +# Encoding file: cp737, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +039103920393039403950396039703980399039A039B039C039D039E039F03A0 +03A103A303A403A503A603A703A803A903B103B203B303B403B503B603B703B8 +03B903BA03BB03BC03BD03BE03BF03C003C103C303C203C403C503C603C703C8 +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03C903AC03AD03AE03CA03AF03CC03CD03CB03CE038603880389038A038C038E +038F00B12265226403AA03AB00F7224800B0221900B7221A207F00B225A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp775.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp775.enc new file mode 100644 index 00000000..71b65c32 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp775.enc @@ -0,0 +1,20 @@ +# Encoding file: cp775, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +010600FC00E9010100E4012300E501070142011301560157012B017900C400C5 +00C900E600C6014D00F6012200A2015A015B00D600DC00F800A300D800D700A4 +0100012A00F3017B017C017A201D00A600A900AE00AC00BD00BC014100AB00BB +259125922593250225240104010C01180116256325512557255D012E01602510 +25142534252C251C2500253C0172016A255A25542569256625602550256C017D +0105010D01190117012F01610173016B017E2518250C25882584258C25902580 +00D300DF014C014300F500D500B5014401360137013B013C0146011201452019 +00AD00B1201C00BE00B600A700F7201E00B0221900B700B900B300B225A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp850.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp850.enc new file mode 100644 index 00000000..4e7a90d7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp850.enc @@ -0,0 +1,20 @@ +# Encoding file: cp850, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE00EC00C400C5 +00C900E600C600F400F600F200FB00F900FF00D600DC00F800A300D800D70192 +00E100ED00F300FA00F100D100AA00BA00BF00AE00AC00BD00BC00A100AB00BB +2591259225932502252400C100C200C000A9256325512557255D00A200A52510 +25142534252C251C2500253C00E300C3255A25542569256625602550256C00A4 +00F000D000CA00CB00C8013100CD00CE00CF2518250C2588258400A600CC2580 +00D300DF00D400D200F500D500B500FE00DE00DA00DB00D900FD00DD00AF00B4 +00AD00B1201700BE00B600A700F700B800B000A800B700B900B300B225A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp852.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp852.enc new file mode 100644 index 00000000..f34899ee --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp852.enc @@ -0,0 +1,20 @@ +# Encoding file: cp852, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E4016F010700E7014200EB0150015100EE017900C40106 +00C90139013A00F400F6013D013E015A015B00D600DC01640165014100D7010D +00E100ED00F300FA01040105017D017E0118011900AC017A010C015F00AB00BB +2591259225932502252400C100C2011A015E256325512557255D017B017C2510 +25142534252C251C2500253C01020103255A25542569256625602550256C00A4 +01110110010E00CB010F014700CD00CE011B2518250C258825840162016E2580 +00D300DF00D401430144014801600161015400DA0155017000FD00DD016300B4 +00AD02DD02DB02C702D800A700F700B800B000A802D901710158015925A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp855.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp855.enc new file mode 100644 index 00000000..4d58b86c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp855.enc @@ -0,0 +1,20 @@ +# Encoding file: cp855, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0452040204530403045104010454040404550405045604060457040704580408 +04590409045A040A045B040B045C040C045E040E045F040F044E042E044A042A +0430041004310411044604260434041404350415044404240433041300AB00BB +259125922593250225240445042504380418256325512557255D043904192510 +25142534252C251C2500253C043A041A255A25542569256625602550256C00A4 +043B041B043C041C043D041D043E041E043F2518250C25882584041F044F2580 +042F044004200441042104420422044304230436041604320412044C042C2116 +00AD044B042B0437041704480428044D042D044904290447042700A725A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp857.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp857.enc new file mode 100644 index 00000000..b42ed557 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp857.enc @@ -0,0 +1,20 @@ +# Encoding file: cp857, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE013100C400C5 +00C900E600C600F400F600F200FB00F9013000D600DC00F800A300D8015E015F +00E100ED00F300FA00F100D1011E011F00BF00AE00AC00BD00BC00A100AB00BB +2591259225932502252400C100C200C000A9256325512557255D00A200A52510 +25142534252C251C2500253C00E300C3255A25542569256625602550256C00A4 +00BA00AA00CA00CB00C8000000CD00CE00CF2518250C2588258400A600CC2580 +00D300DF00D400D200F500D500B5000000D700DA00DB00D900EC00FF00AF00B4 +00AD00B1000000BE00B600A700F700B800B000A800B700B900B300B225A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp860.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp860.enc new file mode 100644 index 00000000..871943b3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp860.enc @@ -0,0 +1,20 @@ +# Encoding file: cp860, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E300E000C100E700EA00CA00E800CD00D400EC00C300C2 +00C900C000C800F400F500F200DA00F900CC00D500DC00A200A300D920A700D3 +00E100ED00F300FA00F100D100AA00BA00BF00D200AC00BD00BC00A100AB00BB +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 +226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp861.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp861.enc new file mode 100644 index 00000000..3f8f605e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp861.enc @@ -0,0 +1,20 @@ +# Encoding file: cp861, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E400E000E500E700EA00EB00E800D000F000DE00C400C5 +00C900E600C600F400F600FE00FB00DD00FD00D600DC00F800A300D820A70192 +00E100ED00F300FA00C100CD00D300DA00BF231000AC00BD00BC00A100AB00BB +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 +226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp862.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp862.enc new file mode 100644 index 00000000..5f9d16cc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp862.enc @@ -0,0 +1,20 @@ +# Encoding file: cp862, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF +05E005E105E205E305E405E505E605E705E805E905EA00A200A300A520A70192 +00E100ED00F300FA00F100D100AA00BA00BF231000AC00BD00BC00A100AB00BB +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 +226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp863.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp863.enc new file mode 100644 index 00000000..c8b8686f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp863.enc @@ -0,0 +1,20 @@ +# Encoding file: cp863, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200C200E000B600E700EA00EB00E800EF00EE201700C000A7 +00C900C800CA00F400CB00CF00FB00F900A400D400DC00A200A300D900DB0192 +00A600B400F300FA00A800B800B300AF00CE231000AC00BD00BC00BE00AB00BB +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 +226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp864.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp864.enc new file mode 100644 index 00000000..71f9e62b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp864.enc @@ -0,0 +1,20 @@ +# Encoding file: cp864, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +00200021002200230024066A0026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00B000B72219221A259225002502253C2524252C251C25342510250C25142518 +03B2221E03C600B100BD00BC224800AB00BBFEF7FEF8009B009CFEFBFEFC009F +00A000ADFE8200A300A4FE8400000000FE8EFE8FFE95FE99060CFE9DFEA1FEA5 +0660066106620663066406650666066706680669FED1061BFEB1FEB5FEB9061F +00A2FE80FE81FE83FE85FECAFE8BFE8DFE91FE93FE97FE9BFE9FFEA3FEA7FEA9 +FEABFEADFEAFFEB3FEB7FEBBFEBFFEC1FEC5FECBFECF00A600AC00F700D7FEC9 +0640FED3FED7FEDBFEDFFEE3FEE7FEEBFEEDFEEFFEF3FEBDFECCFECEFECDFEE1 +FE7D0651FEE5FEE9FEECFEF0FEF2FED0FED5FEF5FEF6FEDDFED9FEF125A00000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp865.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp865.enc new file mode 100644 index 00000000..543da9c5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp865.enc @@ -0,0 +1,20 @@ +# Encoding file: cp865, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE00EC00C400C5 +00C900E600C600F400F600F200FB00F900FF00D600DC00F800A300D820A70192 +00E100ED00F300FA00F100D100AA00BA00BF231000AC00BD00BC00A100AB00A4 +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 +226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp866.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp866.enc new file mode 100644 index 00000000..b851cf5b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp866.enc @@ -0,0 +1,20 @@ +# Encoding file: cp866, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0410041104120413041404150416041704180419041A041B041C041D041E041F +0420042104220423042404250426042704280429042A042B042C042D042E042F +0430043104320433043404350436043704380439043A043B043C043D043E043F +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +0440044104420443044404450446044704480449044A044B044C044D044E044F +040104510404045404070457040E045E00B0221900B7221A211600A425A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp869.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp869.enc new file mode 100644 index 00000000..9fd29290 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp869.enc @@ -0,0 +1,20 @@ +# Encoding file: cp869, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850386008700B700AC00A620182019038820150389 +038A03AA038C00930094038E03AB00A9038F00B200B303AC00A303AD03AE03AF +03CA039003CC03CD039103920393039403950396039700BD0398039900AB00BB +25912592259325022524039A039B039C039D256325512557255D039E039F2510 +25142534252C251C2500253C03A003A1255A25542569256625602550256C03A3 +03A403A503A603A703A803A903B103B203B32518250C2588258403B403B52580 +03B603B703B803B903BA03BB03BC03BD03BE03BF03C003C103C303C203C40384 +00AD00B103C503C603C700A703C8038500B000A803C903CB03B003CE25A000A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp874.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp874.enc new file mode 100644 index 00000000..0487b97d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp874.enc @@ -0,0 +1,20 @@ +# Encoding file: cp874, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC008100820083008420260086008700880089008A008B008C008D008E008F +009020182019201C201D20222013201400980099009A009B009C009D009E009F +00A00E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F +0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F +0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F +0E300E310E320E330E340E350E360E370E380E390E3A00000000000000000E3F +0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D0E4E0E4F +0E500E510E520E530E540E550E560E570E580E590E5A0E5B0000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp932.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp932.enc new file mode 100644 index 00000000..8da8cd69 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp932.enc @@ -0,0 +1,801 @@ +# Encoding file: cp932, multi-byte +M +003F 0 46 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080000000000000000000850086000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F +FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F +FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F +FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +81 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8FF3E +FFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0FFF3C +FF5E2225FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3DFF5B +FF5D30083009300A300B300C300D300E300F30103011FF0BFF0D00B100D70000 +00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 +FF04FFE0FFE1FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C725C6 +25A125A025B325B225BD25BC203B301221922190219121933013000000000000 +000000000000000000000000000000002208220B2286228722822283222A2229 +0000000000000000000000000000000022272228FFE221D221D4220022030000 +0000000000000000000000000000000000000000222022A52312220222072261 +2252226A226B221A223D221D2235222B222C0000000000000000000000000000 +212B2030266F266D266A2020202100B6000000000000000025EF000000000000 +82 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000FF10 +FF11FF12FF13FF14FF15FF16FF17FF18FF190000000000000000000000000000 +FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30 +FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A000000000000000000000000 +0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000003041 +30423043304430453046304730483049304A304B304C304D304E304F30503051 +30523053305430553056305730583059305A305B305C305D305E305F30603061 +30623063306430653066306730683069306A306B306C306D306E306F30703071 +30723073307430753076307730783079307A307B307C307D307E307F30803081 +30823083308430853086308730883089308A308B308C308D308E308F30903091 +3092309300000000000000000000000000000000000000000000000000000000 +83 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF30B0 +30B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF30C0 +30C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF30D0 +30D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF0000 +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000391 +03920393039403950396039703980399039A039B039C039D039E039F03A003A1 +03A303A403A503A603A703A803A90000000000000000000000000000000003B1 +03B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C1 +03C303C403C503C603C703C803C9000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +84 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +04100411041204130414041504010416041704180419041A041B041C041D041E +041F0420042104220423042404250426042704280429042A042B042C042D042E +042F000000000000000000000000000000000000000000000000000000000000 +04300431043204330434043504510436043704380439043A043B043C043D0000 +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000002500 +2502250C251025182514251C252C25242534253C25012503250F2513251B2517 +25232533252B253B254B2520252F25282537253F251D25302525253825420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +87 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2460246124622463246424652466246724682469246A246B246C246D246E246F +2470247124722473216021612162216321642165216621672168216900003349 +33143322334D331833273303333633513357330D33263323332B334A333B339C +339D339E338E338F33C433A100000000000000000000000000000000337B0000 +301D301F211633CD212132A432A532A632A732A8323132323239337E337D337C +22522261222B222E2211221A22A52220221F22BF22352229222A000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +88 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000004E9C +55165A03963F54C0611B632859F690228475831C7A5060AA63E16E2565ED8466 +82A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E62167C9F88B7 +5B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2593759D4 +5A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3840E8863 +8B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA290387A328328 +828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D000000000000 +89 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E117893 +81FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B96F2 +834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E9834 +82F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD51860000 +5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 +827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC62BC +65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B51045C4B61B6 +81C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F554F3D4FA1 +4F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3706B73C2 +798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA88FE6904E +971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D54ECB4F1A +89E356DE584A58CA5EFB5FEB602A6094606261D0621262D06539000000000000 +8A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE5916 +54B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D957A3 +67FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B899A +89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B0000 +6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 +53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584317CA5 +520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E65B8C5B98 +5BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B536C576F22 +6F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266839E89B3 +8ACC8CAB908494519593959195A2966597D3992882184E38542B5CB85DCC73A9 +764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C566857FA5947 +5B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C4000000000000 +8B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D778ECC +8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A075917947 +7FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A70782767759ECD +53745BA2811A865090064E184E454EC74F1153CA54385BAE5F13602565510000 +673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 +5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC4F9B +4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F375F4A602F +6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F793E197FF +99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C552E45747 +5DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F8B398FD1 +91D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C899D25177 +611A865E55B07A7A50765BD3904796854E326ADB91E75C515C48000000000000 +8C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B85AB +8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B5951 +5F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB7D4C +7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE80000 +5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 +503950265065517C5238526355A7570F58055ACC5EFA61B261F862F36372691C +6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED290639375967A +98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D4382378A008AFA +96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF6E5672D0 +7CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E924F0D5348 +5449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B7791904E5E9BC9 +4EA44F7C4FAF501950165149516C529F52B952FE539A53E35411000000000000 +8D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB75F18 +6052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A6D69 +6E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B18154 +818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D0000 +980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B +544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC6B64 +98034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D57D3A826E +9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A50939688DF5750 +5EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D6B736E08 +707D91C7728078157826796D658E7D3083DC88C18F09969B5264572867507F6A +8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A548B643E +6628671467F57A847B567D22932F685C9BAD7B395319518A5237000000000000 +8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF66524E09 +509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB9178 +991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB59C9 +59FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B620000 +6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C +8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166426B21 +6ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F5F0F8B58 +9D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F0675BE8CEA +5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66659C716E +793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235914C91C8 +932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E816B8DA3 +91529996511253D7546A5BFF63886A397DAC970056DA53CE5468000000000000 +8F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F84908846 +89728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E67D4 +6C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F51FA +88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF30000 +6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 +7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F52DD +5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C115C1A5E84 +5E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A26A1F6A35 +6CBC6D886E096E58713C7126716775C77701785D7901796579F07AE07B117CA7 +7D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A49266937E +9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E3860C564FE +676167566D4472B675737A6384B88B7291B89320563157F498FE000000000000 +90 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB55507 +5A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F795E +79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC152035875 +58EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A80000 +9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F +745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE6F84 +647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F6574661F +667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA08A938ACB +901D91929752975965897A0E810696BB5E2D60DC621A65A56614679077F37A4D +7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D7A837BC0 +8AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226624764B0 +681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA000000000000 +91 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE524D +55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A72D9 +758F758E790E795679DF7C977D207D4486078A34963B90619F2050E7527553CC +53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB0000 +64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 +83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E81D3 +85358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD75C5E8CCA +65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A592A6C70 +8A51553E581559A560F0625367C182356955964099C49A284F5358065BFE8010 +5CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB89000902E +968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD7027535355445B856258 +629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA000000000000 +92 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB04E39 +53585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D80C6 +86CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E557305F1B +6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C40000 +901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 +8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF55E16 +5E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A80748139 +817887768ABF8ADC8D858DF3929A957798029CE552C5635776F467156C8873CD +8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B469FB4F43 +6F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A91E39DB4 +4EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F608C62B5 +633A63D068AF6C407887798E7A0B7DE082478A028AE68E449013000000000000 +93 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +90B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F25FB9 +64A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B70B9 +4F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21767B +83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC0000 +51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF +76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152308463 +856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD52D5540C +58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F5F975FB3 +6D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A9CF682EB +5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D594890A3 +51854E4D51EA85998B0E7058637A934B696299B47E047577535769608EDF96E3 +6C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E735165000000000000 +94 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E745FF5 +637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF8FB2 +899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC4FF3 +5EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A9268850000 +6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD +67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA651FD +7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A91979AEA +4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD53DB5E06 +642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC491C67169 +981298EF633D6669756A76E478D0854386EE532A5351542659835E875F7C60B2 +6249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB8AB98CBB +907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E000000000000 +95 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C6867 +59EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C795EDF +63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA78CD3 +983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C6016627665770000 +65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB +6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D798F +8179890789866DF55F1762556CB84ECF72699B925206543B567458B361A4626E +711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E735F0A67C4 +4E26853D9589965B7C73980150FB58C1765678A7522577A585117B86504F5909 +72477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA57036355 +6B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E950234FF85305 +5446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B000000000000 +96 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D298FD +9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D068D2 +51927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A864B2 +6734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C60000 +646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE +9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E806F2B +85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A14810859997C8D6C11 +772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D660E76DF +8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A2183025984 +5B5F6BDB731B76F27DB280178499513267289ED976EE676252FF99055C24623B +7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F2577E25384 +5F797D0485AC8A338E8D975667F385AE9453610961086CB97652000000000000 +97 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E676D8C +733673377531795088D58A98904A909190F596C4878D59154E884F594E0E8A89 +8F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB67194 +75287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B320000 +6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A +4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A87406748375E2 +88CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C74097559 +786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC5BEE6599 +68816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B7DD1502B +539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F985E4EE4 +4F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E979F6266A6 +6B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F000000000000 +98 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +84EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717697C +69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B93328AD6 +502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C185686900 +6E7E789781550000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000005F0C +4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A82125F0D +4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED74EDE4EED +4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B4F694F70 +4F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE44FE5501A +50285014502A502550054F1C4FF650215029502C4FFE4FEF5011500650435047 +6703505550505048505A5056506C50785080509A508550B450B2000000000000 +99 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50C950CA50B350C250D650DE50E550ED50E350EE50F950F55109510151025116 +51155114511A5121513A5137513C513B513F51405152514C515451627AF85169 +516A516E5180518256D8518C5189518F519151935195519651A451A651A251A9 +51AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED0000 +51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C +525E5254526A527452695273527F527D528D529452925271528852918FA88FA7 +52AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F552F852F9 +530653087538530D5310530F5315531A5323532F533153335338534053465345 +4E175349534D51D6535E5369536E5918537B53775382539653A053A653A553AE +53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D5440542C +542D543C542E54365429541D544E548F5475548E545F5471547754705492547B +5480547654845490548654C754A254B854A554AC54C454C854A8000000000000 +9A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E25539 +55405563554C552E555C55455556555755385533555D5599558054AF558A559F +557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC55E4 +55D4561455F7561655FE55FD561B55F9564E565071DF56345636563256380000 +566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 +56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457095708 +570B570D57135718571655C7571C572657375738574E573B5740574F576957C0 +57885761577F5789579357A057B357A457AA57B057C357C657D457D257D3580A +57D657E3580B5819581D587258215862584B58706BC05852583D5879588558B9 +589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E558DC58E4 +58DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C592D5932 +5938593E7AD259555950594E595A5958596259605967596C5969000000000000 +9B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F5A11 +5A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC25ABD +5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E5B43 +5B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B800000 +5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 +5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C535C50 +5C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB65CBC5CB7 +5CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C5D1F5D1B +5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D875D845D82 +5DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB5DEB5DF2 +5DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E545E5F5E62 +5E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF000000000000 +9C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF85EFE +5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F5F51 +5F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E5F99 +5F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF602160600000 +601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F +604A6046604D6063604360646042606C606B60596081608D60E76083609A6084 +609B60966097609260A7608B60E160B860E060D360B45FF060BD60C660B560D8 +614D6115610660F660F7610060F460FA6103612160FB60F1610D610E6147613E +61286127614A613F613C612C6134613D614261446173617761586159615A616B +6174616F61656171615F615D6153617561996196618761AC6194619A618A6191 +61AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E661E361F6 +61FA61F461FF61FD61FC61FE620062086209620D620C6214621B000000000000 +9D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +621E6221622A622E6230623262336241624E625E6263625B62606268627C6282 +6289627E62926293629662D46283629462D762D162BB62CF62FF62C664D462C8 +62DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F56350 +633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B0000 +636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 +651D64176428640F6467646F6476644E652A6495649364A564A9648864BC64DA +64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF652C64F6 +64F464F264FA650064FD6518651C650565246523652B65346535653765366538 +754B654865566555654D6558655E655D65726578658265838B8A659B659F65AB +65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A660365FB +6773663566366634661C664F664466496641665E665D666466676668665F6662 +667066836688668E668966846698669D66C166B966C966BE66BC000000000000 +9E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E67266727 +9738672E673F67366741673867376746675E67606759676367646789677067A9 +677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E467DE +67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E0000 +68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 +68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD68D4 +68E768D569366912690468D768E3692568F968E068EF6928692A691A69236921 +68C669796977695C6978696B6954697E696E69396974693D695969306961695E +695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD69BB69C3 +69A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F969F269E7 +6A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A726A366A78 +6A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA3000000000000 +9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB6B05 +86166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B506B59 +6B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA46BAA +6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF0000 +9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B +6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE6CBA +6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D126D0C6D63 +6D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC76DE66DB8 +6DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D6E6E6E2E +6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E246EFF6E1D +6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F6EA56EC2 +6E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC000000000000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F586F8E +6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD86FF1 +6FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F7030 +703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD0000 +70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 +719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC71F9 +71FF720D7210721B7228722D722C72307232723B723C723F72407246724B7258 +7274727E7282728172877292729672A272A772B972B272C372C672C472CE72D2 +72E272E072E172F972F7500F7317730A731C7316731D7334732F73297325733E +734E734F9ED87357736A7368737073787375737B737A73C873B373CE73BB73C0 +73E573EE73DE74A27405746F742573F87432743A7455743F745F74597441745C +746974707463746A7476747E748B749E74A774CA74CF74D473F1000000000000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74E074E374E774E974EE74F274F074F174F874F7750475037505750C750E750D +75157513751E7526752C753C7544754D754A7549755B7546755A756975647567 +756B756D75787576758675877574758A758975827594759A759D75A575A375C2 +75B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF0000 +75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 +7630763B764776487646765C76587661766276687669766A7667766C76707672 +76767678767C768076837688768B768E769676937699769A76B076B476B876B9 +76BA76C276CD76D676D276DE76E176E576E776EA862F76FB7708770777047729 +7724771E77257726771B773777387747775A7768776B775B7765777F777E7779 +778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD77D777DA +77DC77E377EE77FC780C781279267820792A7845788E78747886787C789A788C +78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC000000000000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +78E778DA78FD78F47907791279117919792C792B794079607957795F795A7955 +7953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E779EC +79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A577A49 +7A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB00000 +7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 +7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B507B7A +7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D7B987B9F +7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC67BDD7BE9 +7C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C237C277C2A +7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C567C657C6C +7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB97CBD7CC0 +7CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D06000000000000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D727D68 +7D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD7DAB +7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E057E0A +7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E370000 +7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D +8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A7F45 +7F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F787F827F86 +7F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB67FB88B71 +7FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B80128018 +8019801C80218028803F803B804A804680528058805A805F8062806880738072 +807080768079807D807F808480868085809B8093809A80AD519080AC80DB80E5 +80D980DD80C480DA80D6810980EF80F1811B81298123812F814B000000000000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +968B8146813E8153815180FC8171816E81658166817481838188818A81808182 +81A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA81C9 +81CD81D181D981D881C881DA81DF81E081E781FA81FB81FE8201820282058207 +820A820D821082168229822B82388233824082598258825D825A825F82640000 +82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 +82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D98335 +83348316833283318340833983508345832F832B831783188385839A83AA839F +83A283968323838E8387838A837C83B58373837583A0838983A883F4841383EB +83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD84388506 +83FB846D842A843C855A84848477846B84AD846E848284698446842C846F8479 +843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D684A18521 +84FF84F485178518852C851F8515851484FC8540856385588548000000000000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +85418602854B8555858085A485888591858A85A8856D8594859B85EA8587859C +8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613860B +85FE85FA86068622861A8630863F864D4E558654865F86678671869386A386A9 +86AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC0000 +86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F +8737873B87258729871A8760875F8778874C874E877487578768876E87598753 +8763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C487B387C7 +87C687BB87EF87F287E0880F880D87FE87F687F7880E87D28811881688158822 +88218831883688398827883B8844884288528859885E8862886B8881887E889E +8875887D88B5887288828897889288AE889988A2888D88A488B088BF88B188C3 +88C488D488D888D988DD88F9890288FC88F488E888F28904890C890A89138943 +891E8925892A892B89418944893B89368938894C891D8960895E000000000000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89668964896D896A896F89748977897E89838988898A8993899889A189A989A6 +89AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A168A10 +8A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A858A82 +8A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE70000 +8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 +8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B8B5F +8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C418C3F8C48 +8C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E8C948C7C +8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA8CFD8CFA +8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D678D6D8D71 +8D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB8DDF8DE3 +8DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A000000000000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E818E87 +8E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE8EC5 +8EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C8F1F +8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C0000 +8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 +90058FF98FFA901190159021900D901E9016900B90279036903590398FF8904F +905090519052900E9049903E90569058905E9068906F907696A890729082907D +90819080908A9089908F90A890AF90B190B590E290E4624890DB910291129119 +91329130914A9156915891639165916991739172918B9189918291A291AB91AF +91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC91F591F6 +921E91FF9214922C92159211925E925792459249926492489295923F924B9250 +929C92969293929B925A92CF92B992B792E9930F92FA9344932E000000000000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +93199322931A9323933A9335933B935C9360937C936E935693B093AC93AD9394 +93B993D693D793E893E593D893C393DD93D093C893E4941A9414941394039407 +94109436942B94359421943A944194529444945B94609462945E946A92299470 +94759477947D945A947C947E9481947F95829587958A95949596959895990000 +95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 +95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E965D +965F96669672966C968D96989695969796AA96A796B196B296B096B496B696B8 +96B996CE96CB96C996CD894D96DC970D96D596F99704970697089713970E9711 +970F971697199724972A97309739973D973E97449746974897429749975C9760 +97649766976852D2976B977197799785977C9781977A9786978B978F9790979C +97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF97F697F5 +980F980C9838982498219837983D9846984F984B986B986F9870000000000000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +98719874987398AA98AF98B198B698C498C398C698E998EB9903990999129914 +99189921991D991E99249920992C992E993D993E9942994999459950994B9951 +9952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED99EE +99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A430000 +9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 +9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF79AFB +9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B329B449B43 +9B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA89BB49BC0 +9BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF19BF09C15 +9C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C219C309C47 +9C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB9D039D06 +9D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D48000000000000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA99DB2 +9DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD9E1A +9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA99EB8 +9EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF0000 +9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 +9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA0582F +69C79059746451DC719900000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E8A891C9348928884DC4FC970BB663168C892F966FB5F454E284EE14EFC4F00 +4F034F394F564F924F8A4F9A4F944FCD504050224FFF501E5046507050425094 +50F450D8514A5164519D51BE51EC5215529C52A652C052DB5300530753245372 +539353B253DDFA0E549C548A54A954FF55865759576557AC57C857C7FA0F0000 +FA10589E58B2590B5953595B595D596359A459BA5B565BC0752F5BD85BEC5C1E +5CA65CBA5CF55D275D53FA115D425D6D5DB85DB95DD05F215F345F675FB75FDE +605D6085608A60DE60D5612060F26111613761306198621362A663F56460649D +64CE654E66006615663B6609662E661E6624666566576659FA126673669966A0 +66B266BF66FA670EF929676667BB685267C06801684468CFFA136968FA146998 +69E26A306A6B6A466A736A7E6AE26AE46BD66C3F6C5C6C866C6F6CDA6D046D87 +6D6F6D966DAC6DCF6DF86DF26DFC6E396E5C6E276E3C6EBF6F886FB56FF57005 +70077028708570AB710F7104715C71467147FA1571C171FE72B1000000000000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72BE7324FA16737773BD73C973D673E373D2740773F57426742A7429742E7462 +7489749F7501756F7682769C769E769B76A6FA17774652AF7821784E7864787A +7930FA18FA19FA1A7994FA1B799B7AD17AE7FA1C7AEB7B9EFA1D7D487D5C7DB7 +7DA07DD67E527F477FA1FA1E83018362837F83C783F6844884B4855385590000 +856BFA1F85B0FA20FA21880788F58A128A378A798AA78ABE8ADFFA228AF68B53 +8B7F8CF08CF48D128D76FA238ECFFA24FA25906790DEFA269115912791DA91D7 +91DE91ED91EE91E491E592069210920A923A9240923C924E9259925192399267 +92A79277927892E792D792D992D0FA2792D592E092D39325932192FBFA28931E +92FF931D93029370935793A493C693DE93F89431944594489592F9DCFA29969D +96AF9733973B9743974D974F9751975598579865FA2AFA2B9927FA2C999E9A4E +9AD99ADC9B759B729B8F9BB19BBB9C009D709D6BFA2D9E199ED1000000002170 +217121722173217421752176217721782179FFE2FFE4FF07FF02000000000000 +FA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2170217121722173217421752176217721782179216021612162216321642165 +2166216721682169FFE2FFE4FF07FF0232312116212122357E8A891C93489288 +84DC4FC970BB663168C892F966FB5F454E284EE14EFC4F004F034F394F564F92 +4F8A4F9A4F944FCD504050224FFF501E504650705042509450F450D8514A0000 +5164519D51BE51EC5215529C52A652C052DB5300530753245372539353B253DD +FA0E549C548A54A954FF55865759576557AC57C857C7FA0FFA10589E58B2590B +5953595B595D596359A459BA5B565BC0752F5BD85BEC5C1E5CA65CBA5CF55D27 +5D53FA115D425D6D5DB85DB95DD05F215F345F675FB75FDE605D6085608A60DE +60D5612060F26111613761306198621362A663F56460649D64CE654E66006615 +663B6609662E661E6624666566576659FA126673669966A066B266BF66FA670E +F929676667BB685267C06801684468CFFA136968FA14699869E26A306A6B6A46 +6A736A7E6AE26AE46BD66C3F6C5C6C866C6F6CDA6D046D876D6F000000000000 +FB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D966DAC6DCF6DF86DF26DFC6E396E5C6E276E3C6EBF6F886FB56FF570057007 +7028708570AB710F7104715C71467147FA1571C171FE72B172BE7324FA167377 +73BD73C973D673E373D2740773F57426742A7429742E74627489749F7501756F +7682769C769E769B76A6FA17774652AF7821784E7864787A7930FA18FA190000 +FA1A7994FA1B799B7AD17AE7FA1C7AEB7B9EFA1D7D487D5C7DB77DA07DD67E52 +7F477FA1FA1E83018362837F83C783F6844884B485538559856BFA1F85B0FA20 +FA21880788F58A128A378A798AA78ABE8ADFFA228AF68B538B7F8CF08CF48D12 +8D76FA238ECFFA24FA25906790DEFA269115912791DA91D791DE91ED91EE91E4 +91E592069210920A923A9240923C924E925992519239926792A79277927892E7 +92D792D992D0FA2792D592E092D39325932192FBFA28931E92FF931D93029370 +935793A493C693DE93F89431944594489592F9DCFA29969D96AF9733973B9743 +974D974F9751975598579865FA2AFA2B9927FA2C999E9A4E9AD9000000000000 +FC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9ADC9B759B729B8F9BB19BBB9C009D709D6BFA2D9E199ED10000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +R +8160 301C FF5E +8161 2016 2225 +817C 2212 FF0D +8191 00A2 FFE0 +8192 00A3 FFE1 +81CA 00AC FFE2 +81BE 222a +81BF 2229 +81DA 2220 +81DB 22a5 +81DF 2261 +81E0 2252 +81E3 221a +81E6 2235 +81E7 222b diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp936.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp936.enc new file mode 100644 index 00000000..37bcc80d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp936.enc @@ -0,0 +1,2162 @@ +# Encoding file: cp936, multi-byte +M +003F 0 127 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +81 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E024E044E054E064E0F4E124E174E1F4E204E214E234E264E294E2E4E2F4E31 +4E334E354E374E3C4E404E414E424E444E464E4A4E514E554E574E5A4E5B4E62 +4E634E644E654E674E684E6A4E6B4E6C4E6D4E6E4E6F4E724E744E754E764E77 +4E784E794E7A4E7B4E7C4E7D4E7F4E804E814E824E834E844E854E874E8A0000 +4E904E964E974E994E9C4E9D4E9E4EA34EAA4EAF4EB04EB14EB44EB64EB74EB8 +4EB94EBC4EBD4EBE4EC84ECC4ECF4ED04ED24EDA4EDB4EDC4EE04EE24EE64EE7 +4EE94EED4EEE4EEF4EF14EF44EF84EF94EFA4EFC4EFE4F004F024F034F044F05 +4F064F074F084F0B4F0C4F124F134F144F154F164F1C4F1D4F214F234F284F29 +4F2C4F2D4F2E4F314F334F354F374F394F3B4F3E4F3F4F404F414F424F444F45 +4F474F484F494F4A4F4B4F4C4F524F544F564F614F624F664F684F6A4F6B4F6D +4F6E4F714F724F754F774F784F794F7A4F7D4F804F814F824F854F864F874F8A +4F8C4F8E4F904F924F934F954F964F984F994F9A4F9C4F9E4F9F4FA14FA20000 +82 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4FA44FAB4FAD4FB04FB14FB24FB34FB44FB64FB74FB84FB94FBA4FBB4FBC4FBD +4FBE4FC04FC14FC24FC64FC74FC84FC94FCB4FCC4FCD4FD24FD34FD44FD54FD6 +4FD94FDB4FE04FE24FE44FE54FE74FEB4FEC4FF04FF24FF44FF54FF64FF74FF9 +4FFB4FFC4FFD4FFF5000500150025003500450055006500750085009500A0000 +500B500E501050115013501550165017501B501D501E50205022502350245027 +502B502F5030503150325033503450355036503750385039503B503D503F5040 +504150425044504550465049504A504B504D5050505150525053505450565057 +50585059505B505D505E505F506050615062506350645066506750685069506A +506B506D506E506F50705071507250735074507550785079507A507C507D5081 +508250835084508650875089508A508B508C508E508F50905091509250935094 +50955096509750985099509A509B509C509D509E509F50A050A150A250A450A6 +50AA50AB50AD50AE50AF50B050B150B350B450B550B650B750B850B950BC0000 +83 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50BD50BE50BF50C050C150C250C350C450C550C650C750C850C950CA50CB50CC +50CD50CE50D050D150D250D350D450D550D750D850D950DB50DC50DD50DE50DF +50E050E150E250E350E450E550E850E950EA50EB50EF50F050F150F250F450F6 +50F750F850F950FA50FC50FD50FE50FF51005101510251035104510551080000 +5109510A510C510D510E510F511051115113511451155116511751185119511A +511B511C511D511E511F512051225123512451255126512751285129512A512B +512C512D512E512F5130513151325133513451355136513751385139513A513B +513C513D513E51425147514A514C514E514F515051525153515751585159515B +515D515E515F5160516151635164516651675169516A516F5172517A517E517F +5183518451865187518A518B518E518F51905191519351945198519A519D519E +519F51A151A351A651A751A851A951AA51AD51AE51B451B851B951BA51BE51BF +51C151C251C351C551C851CA51CD51CE51D051D251D351D451D551D651D70000 +84 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51D851D951DA51DC51DE51DF51E251E351E551E651E751E851E951EA51EC51EE +51F151F251F451F751FE520452055209520B520C520F5210521352145215521C +521E521F522152225223522552265227522A522C522F5231523252345235523C +523E524452455246524752485249524B524E524F525252535255525752580000 +5259525A525B525D525F526052625263526452665268526B526C526D526E5270 +52715273527452755276527752785279527A527B527C527E5280528352845285 +528652875289528A528B528C528D528E528F5291529252945295529652975298 +5299529A529C52A452A552A652A752AE52AF52B052B452B552B652B752B852B9 +52BA52BB52BC52BD52C052C152C252C452C552C652C852CA52CC52CD52CE52CF +52D152D352D452D552D752D952DA52DB52DC52DD52DE52E052E152E252E352E5 +52E652E752E852E952EA52EB52EC52ED52EE52EF52F152F252F352F452F552F6 +52F752F852FB52FC52FD530153025303530453075309530A530B530C530E0000 +85 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53115312531353145318531B531C531E531F532253245325532753285329532B +532C532D532F533053315332533353345335533653375338533C533D53405342 +53445346534B534C534D5350535453585359535B535D53655368536A536C536D +537253765379537B537C537D537E53805381538353875388538A538E538F0000 +53905391539253935394539653975399539B539C539E53A053A153A453A753AA +53AB53AC53AD53AF53B053B153B253B353B453B553B753B853B953BA53BC53BD +53BE53C053C353C453C553C653C753CE53CF53D053D253D353D553DA53DC53DD +53DE53E153E253E753F453FA53FE53FF5400540254055407540B541454185419 +541A541C542254245425542A5430543354365437543A543D543F544154425444 +544554475449544C544D544E544F5451545A545D545E545F5460546154635465 +54675469546A546B546C546D546E546F547054745479547A547E547F54815483 +5485548754885489548A548D5491549354975498549C549E549F54A054A10000 +86 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54A254A554AE54B054B254B554B654B754B954BA54BC54BE54C354C554CA54CB +54D654D854DB54E054E154E254E354E454EB54EC54EF54F054F154F454F554F6 +54F754F854F954FB54FE550055025503550455055508550A550B550C550D550E +5512551355155516551755185519551A551C551D551E551F5521552555260000 +55285529552B552D553255345535553655385539553A553B553D554055425545 +55475548554B554C554D554E554F5551555255535554555755585559555A555B +555D555E555F55605562556355685569556B556F557055715572557355745579 +557A557D557F55855586558C558D558E559055925593559555965597559A559B +559E55A055A155A255A355A455A555A655A855A955AA55AB55AC55AD55AE55AF +55B055B255B455B655B855BA55BC55BF55C055C155C255C355C655C755C855CA +55CB55CE55CF55D055D555D755D855D955DA55DB55DE55E055E255E755E955ED +55EE55F055F155F455F655F855F955FA55FB55FC55FF56025603560456050000 +87 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56065607560A560B560D561056115612561356145615561656175619561A561C +561D5620562156225625562656285629562A562B562E562F5630563356355637 +5638563A563C563D563E5640564156425643564456455646564756485649564A +564B564F565056515652565356555656565A565B565D565E565F566056610000 +5663566556665667566D566E566F56705672567356745675567756785679567A +567D567E567F56805681568256835684568756885689568A568B568C568D5690 +56915692569456955696569756985699569A569B569C569D569E569F56A056A1 +56A256A456A556A656A756A856A956AA56AB56AC56AD56AE56B056B156B256B3 +56B456B556B656B856B956BA56BB56BD56BE56BF56C056C156C256C356C456C5 +56C656C756C856C956CB56CC56CD56CE56CF56D056D156D256D356D556D656D8 +56D956DC56E356E556E656E756E856E956EA56EC56EE56EF56F256F356F656F7 +56F856FB56FC57005701570257055707570B570C570D570E570F571057110000 +88 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57125713571457155716571757185719571A571B571D571E5720572157225724 +572557265727572B5731573257345735573657375738573C573D573F57415743 +57445745574657485749574B5752575357545755575657585759576257635765 +5767576C576E5770577157725774577557785779577A577D577E577F57800000 +5781578757885789578A578D578E578F57905791579457955796579757985799 +579A579C579D579E579F57A557A857AA57AC57AF57B057B157B357B557B657B7 +57B957BA57BB57BC57BD57BE57BF57C057C157C457C557C657C757C857C957CA +57CC57CD57D057D157D357D657D757DB57DC57DE57E157E257E357E557E657E7 +57E857E957EA57EB57EC57EE57F057F157F257F357F557F657F757FB57FC57FE +57FF580158035804580558085809580A580C580E580F58105812581358145816 +58175818581A581B581C581D581F5822582358255826582758285829582B582C +582D582E582F58315832583358345836583758385839583A583B583C583D0000 +89 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +583E583F584058415842584358455846584758485849584A584B584E584F5850 +585258535855585658575859585A585B585C585D585F58605861586258635864 +5866586758685869586A586D586E586F58705871587258735874587558765877 +58785879587A587B587C587D587F58825884588658875888588A588B588C0000 +588D588E588F5890589158945895589658975898589B589C589D58A058A158A2 +58A358A458A558A658A758AA58AB58AC58AD58AE58AF58B058B158B258B358B4 +58B558B658B758B858B958BA58BB58BD58BE58BF58C058C258C358C458C658C7 +58C858C958CA58CB58CC58CD58CE58CF58D058D258D358D458D658D758D858D9 +58DA58DB58DC58DD58DE58DF58E058E158E258E358E558E658E758E858E958EA +58ED58EF58F158F258F458F558F758F858FA58FB58FC58FD58FE58FF59005901 +59035905590659085909590A590B590C590E591059115912591359175918591B +591D591E592059215922592359265928592C59305932593359355936593B0000 +8A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +593D593E593F5940594359455946594A594C594D5950595259535959595B595C +595D595E595F5961596359645966596759685969596A596B596C596D596E596F +59705971597259755977597A597B597C597E597F598059855989598B598C598E +598F59905991599459955998599A599B599C599D599F59A059A159A259A60000 +59A759AC59AD59B059B159B359B459B559B659B759B859BA59BC59BD59BF59C0 +59C159C259C359C459C559C759C859C959CC59CD59CE59CF59D559D659D959DB +59DE59DF59E059E159E259E459E659E759E959EA59EB59ED59EE59EF59F059F1 +59F259F359F459F559F659F759F859FA59FC59FD59FE5A005A025A0A5A0B5A0D +5A0E5A0F5A105A125A145A155A165A175A195A1A5A1B5A1D5A1E5A215A225A24 +5A265A275A285A2A5A2B5A2C5A2D5A2E5A2F5A305A335A355A375A385A395A3A +5A3B5A3D5A3E5A3F5A415A425A435A445A455A475A485A4B5A4C5A4D5A4E5A4F +5A505A515A525A535A545A565A575A585A595A5B5A5C5A5D5A5E5A5F5A600000 +8B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A615A635A645A655A665A685A695A6B5A6C5A6D5A6E5A6F5A705A715A725A73 +5A785A795A7B5A7C5A7D5A7E5A805A815A825A835A845A855A865A875A885A89 +5A8A5A8B5A8C5A8D5A8E5A8F5A905A915A935A945A955A965A975A985A995A9C +5A9D5A9E5A9F5AA05AA15AA25AA35AA45AA55AA65AA75AA85AA95AAB5AAC0000 +5AAD5AAE5AAF5AB05AB15AB45AB65AB75AB95ABA5ABB5ABC5ABD5ABF5AC05AC3 +5AC45AC55AC65AC75AC85ACA5ACB5ACD5ACE5ACF5AD05AD15AD35AD55AD75AD9 +5ADA5ADB5ADD5ADE5ADF5AE25AE45AE55AE75AE85AEA5AEC5AED5AEE5AEF5AF0 +5AF25AF35AF45AF55AF65AF75AF85AF95AFA5AFB5AFC5AFD5AFE5AFF5B005B01 +5B025B035B045B055B065B075B085B0A5B0B5B0C5B0D5B0E5B0F5B105B115B12 +5B135B145B155B185B195B1A5B1B5B1C5B1D5B1E5B1F5B205B215B225B235B24 +5B255B265B275B285B295B2A5B2B5B2C5B2D5B2E5B2F5B305B315B335B355B36 +5B385B395B3A5B3B5B3C5B3D5B3E5B3F5B415B425B435B445B455B465B470000 +8C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B485B495B4A5B4B5B4C5B4D5B4E5B4F5B525B565B5E5B605B615B675B685B6B +5B6D5B6E5B6F5B725B745B765B775B785B795B7B5B7C5B7E5B7F5B825B865B8A +5B8D5B8E5B905B915B925B945B965B9F5BA75BA85BA95BAC5BAD5BAE5BAF5BB1 +5BB25BB75BBA5BBB5BBC5BC05BC15BC35BC85BC95BCA5BCB5BCD5BCE5BCF0000 +5BD15BD45BD55BD65BD75BD85BD95BDA5BDB5BDC5BE05BE25BE35BE65BE75BE9 +5BEA5BEB5BEC5BED5BEF5BF15BF25BF35BF45BF55BF65BF75BFD5BFE5C005C02 +5C035C055C075C085C0B5C0C5C0D5C0E5C105C125C135C175C195C1B5C1E5C1F +5C205C215C235C265C285C295C2A5C2B5C2D5C2E5C2F5C305C325C335C355C36 +5C375C435C445C465C475C4C5C4D5C525C535C545C565C575C585C5A5C5B5C5C +5C5D5C5F5C625C645C675C685C695C6A5C6B5C6C5C6D5C705C725C735C745C75 +5C765C775C785C7B5C7C5C7D5C7E5C805C835C845C855C865C875C895C8A5C8B +5C8E5C8F5C925C935C955C9D5C9E5C9F5CA05CA15CA45CA55CA65CA75CA80000 +8D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5CAA5CAE5CAF5CB05CB25CB45CB65CB95CBA5CBB5CBC5CBE5CC05CC25CC35CC5 +5CC65CC75CC85CC95CCA5CCC5CCD5CCE5CCF5CD05CD15CD35CD45CD55CD65CD7 +5CD85CDA5CDB5CDC5CDD5CDE5CDF5CE05CE25CE35CE75CE95CEB5CEC5CEE5CEF +5CF15CF25CF35CF45CF55CF65CF75CF85CF95CFA5CFC5CFD5CFE5CFF5D000000 +5D015D045D055D085D095D0A5D0B5D0C5D0D5D0F5D105D115D125D135D155D17 +5D185D195D1A5D1C5D1D5D1F5D205D215D225D235D255D285D2A5D2B5D2C5D2F +5D305D315D325D335D355D365D375D385D395D3A5D3B5D3C5D3F5D405D415D42 +5D435D445D455D465D485D495D4D5D4E5D4F5D505D515D525D535D545D555D56 +5D575D595D5A5D5C5D5E5D5F5D605D615D625D635D645D655D665D675D685D6A +5D6D5D6E5D705D715D725D735D755D765D775D785D795D7A5D7B5D7C5D7D5D7E +5D7F5D805D815D835D845D855D865D875D885D895D8A5D8B5D8C5D8D5D8E5D8F +5D905D915D925D935D945D955D965D975D985D9A5D9B5D9C5D9E5D9F5DA00000 +8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5DA15DA25DA35DA45DA55DA65DA75DA85DA95DAA5DAB5DAC5DAD5DAE5DAF5DB0 +5DB15DB25DB35DB45DB55DB65DB85DB95DBA5DBB5DBC5DBD5DBE5DBF5DC05DC1 +5DC25DC35DC45DC65DC75DC85DC95DCA5DCB5DCC5DCE5DCF5DD05DD15DD25DD3 +5DD45DD55DD65DD75DD85DD95DDA5DDC5DDF5DE05DE35DE45DEA5DEC5DED0000 +5DF05DF55DF65DF85DF95DFA5DFB5DFC5DFF5E005E045E075E095E0A5E0B5E0D +5E0E5E125E135E175E1E5E1F5E205E215E225E235E245E255E285E295E2A5E2B +5E2C5E2F5E305E325E335E345E355E365E395E3A5E3E5E3F5E405E415E435E46 +5E475E485E495E4A5E4B5E4D5E4E5E4F5E505E515E525E535E565E575E585E59 +5E5A5E5C5E5D5E5F5E605E635E645E655E665E675E685E695E6A5E6B5E6C5E6D +5E6E5E6F5E705E715E755E775E795E7E5E815E825E835E855E885E895E8C5E8D +5E8E5E925E985E9B5E9D5EA15EA25EA35EA45EA85EA95EAA5EAB5EAC5EAE5EAF +5EB05EB15EB25EB45EBA5EBB5EBC5EBD5EBF5EC05EC15EC25EC35EC45EC50000 +8F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5EC65EC75EC85ECB5ECC5ECD5ECE5ECF5ED05ED45ED55ED75ED85ED95EDA5EDC +5EDD5EDE5EDF5EE05EE15EE25EE35EE45EE55EE65EE75EE95EEB5EEC5EED5EEE +5EEF5EF05EF15EF25EF35EF55EF85EF95EFB5EFC5EFD5F055F065F075F095F0C +5F0D5F0E5F105F125F145F165F195F1A5F1C5F1D5F1E5F215F225F235F240000 +5F285F2B5F2C5F2E5F305F325F335F345F355F365F375F385F3B5F3D5F3E5F3F +5F415F425F435F445F455F465F475F485F495F4A5F4B5F4C5F4D5F4E5F4F5F51 +5F545F595F5A5F5B5F5C5F5E5F5F5F605F635F655F675F685F6B5F6E5F6F5F72 +5F745F755F765F785F7A5F7D5F7E5F7F5F835F865F8D5F8E5F8F5F915F935F94 +5F965F9A5F9B5F9D5F9E5F9F5FA05FA25FA35FA45FA55FA65FA75FA95FAB5FAC +5FAF5FB05FB15FB25FB35FB45FB65FB85FB95FBA5FBB5FBE5FBF5FC05FC15FC2 +5FC75FC85FCA5FCB5FCE5FD35FD45FD55FDA5FDB5FDC5FDE5FDF5FE25FE35FE5 +5FE65FE85FE95FEC5FEF5FF05FF25FF35FF45FF65FF75FF95FFA5FFC60070000 +90 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60086009600B600C60106011601360176018601A601E601F602260236024602C +602D602E603060316032603360346036603760386039603A603D603E60406044 +60456046604760486049604A604C604E604F605160536054605660576058605B +605C605E605F6060606160656066606E60716072607460756077607E60800000 +608160826085608660876088608A608B608E608F609060916093609560976098 +6099609C609E60A160A260A460A560A760A960AA60AE60B060B360B560B660B7 +60B960BA60BD60BE60BF60C060C160C260C360C460C760C860C960CC60CD60CE +60CF60D060D260D360D460D660D760D960DB60DE60E160E260E360E460E560EA +60F160F260F560F760F860FB60FC60FD60FE60FF61026103610461056107610A +610B610C611061116112611361146116611761186119611B611C611D611E6121 +6122612561286129612A612C612D612E612F6130613161326133613461356136 +613761386139613A613B613C613D613E61406141614261436144614561460000 +91 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61476149614B614D614F61506152615361546156615761586159615A615B615C +615E615F6160616161636164616561666169616A616B616C616D616E616F6171 +617261736174617661786179617A617B617C617D617E617F6180618161826183 +618461856186618761886189618A618C618D618F619061916192619361950000 +6196619761986199619A619B619C619E619F61A061A161A261A361A461A561A6 +61AA61AB61AD61AE61AF61B061B161B261B361B461B561B661B861B961BA61BB +61BC61BD61BF61C061C161C361C461C561C661C761C961CC61CD61CE61CF61D0 +61D361D561D661D761D861D961DA61DB61DC61DD61DE61DF61E061E161E261E3 +61E461E561E761E861E961EA61EB61EC61ED61EE61EF61F061F161F261F361F4 +61F661F761F861F961FA61FB61FC61FD61FE6200620162026203620462056207 +6209621362146219621C621D621E622062236226622762286229622B622D622F +6230623162326235623662386239623A623B623C6242624462456246624A0000 +92 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +624F62506255625662576259625A625C625D625E625F62606261626262646265 +6268627162726274627562776278627A627B627D628162826283628562866287 +6288628B628C628D628E628F629062946299629C629D629E62A362A662A762A9 +62AA62AD62AE62AF62B062B262B362B462B662B762B862BA62BE62C062C10000 +62C362CB62CF62D162D562DD62DE62E062E162E462EA62EB62F062F262F562F8 +62F962FA62FB63006303630463056306630A630B630C630D630F631063126313 +63146315631763186319631C632663276329632C632D632E6330633163336334 +6335633663376338633B633C633E633F63406341634463476348634A63516352 +635363546356635763586359635A635B635C635D63606364636563666368636A +636B636C636F6370637263736374637563786379637C637D637E637F63816383 +638463856386638B638D639163936394639563976399639A639B639C639D639E +639F63A163A463A663AB63AF63B163B263B563B663B963BB63BD63BF63C00000 +93 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63C163C263C363C563C763C863CA63CB63CC63D163D363D463D563D763D863D9 +63DA63DB63DC63DD63DF63E263E463E563E663E763E863EB63EC63EE63EF63F0 +63F163F363F563F763F963FA63FB63FC63FE640364046406640764086409640A +640D640E6411641264156416641764186419641A641D641F6422642364240000 +6425642764286429642B642E642F643064316432643364356436643764386439 +643B643C643E6440644264436449644B644C644D644E644F6450645164536455 +645664576459645A645B645C645D645F64606461646264636464646564666468 +646A646B646C646E646F64706471647264736474647564766477647B647C647D +647E647F648064816483648664886489648A648B648C648D648E648F64906493 +649464976498649A649B649C649D649F64A064A164A264A364A564A664A764A8 +64AA64AB64AF64B164B264B364B464B664B964BB64BD64BE64BF64C164C364C4 +64C664C764C864C964CA64CB64CC64CF64D164D364D464D564D664D964DA0000 +94 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64DB64DC64DD64DF64E064E164E364E564E764E864E964EA64EB64EC64ED64EE +64EF64F064F164F264F364F464F564F664F764F864F964FA64FB64FC64FD64FE +64FF65016502650365046505650665076508650A650B650C650D650E650F6510 +6511651365146515651665176519651A651B651C651D651E651F652065210000 +6522652365246526652765286529652A652C652D65306531653265336537653A +653C653D6540654165426543654465466547654A654B654D654E655065526553 +655465576558655A655C655F6560656165646565656765686569656A656D656E +656F657165736575657665786579657A657B657C657D657E657F658065816582 +658365846585658665886589658A658D658E658F65926594659565966598659A +659D659E65A065A265A365A665A865AA65AC65AE65B165B265B365B465B565B6 +65B765B865BA65BB65BE65BF65C065C265C765C865C965CA65CD65D065D165D3 +65D465D565D865D965DA65DB65DC65DD65DE65DF65E165E365E465EA65EB0000 +95 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65F265F365F465F565F865F965FB65FC65FD65FE65FF66016604660566076608 +6609660B660D661066116612661666176618661A661B661C661E662166226623 +662466266629662A662B662C662E663066326633663766386639663A663B663D +663F66406642664466456646664766486649664A664D664E6650665166580000 +6659665B665C665D665E666066626663666566676669666A666B666C666D6671 +66726673667566786679667B667C667D667F6680668166836685668666886689 +668A668B668D668E668F6690669266936694669566986699669A669B669C669E +669F66A066A166A266A366A466A566A666A966AA66AB66AC66AD66AF66B066B1 +66B266B366B566B666B766B866BA66BB66BC66BD66BF66C066C166C266C366C4 +66C566C666C766C866C966CA66CB66CC66CD66CE66CF66D066D166D266D366D4 +66D566D666D766D866DA66DE66DF66E066E166E266E366E466E566E766E866EA +66EB66EC66ED66EE66EF66F166F566F666F866FA66FB66FD6701670267030000 +96 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6704670567066707670C670E670F671167126713671667186719671A671C671E +67206721672267236724672567276729672E6730673267336736673767386739 +673B673C673E673F6741674467456747674A674B674D67526754675567576758 +6759675A675B675D67626763676467666767676B676C676E6771677467760000 +67786779677A677B677D678067826783678567866788678A678C678D678E678F +679167926793679467966799679B679F67A067A167A467A667A967AC67AE67B1 +67B267B467B967BA67BB67BC67BD67BE67BF67C067C267C567C667C767C867C9 +67CA67CB67CC67CD67CE67D567D667D767DB67DF67E167E367E467E667E767E8 +67EA67EB67ED67EE67F267F567F667F767F867F967FA67FB67FC67FE68016802 +680368046806680D681068126814681568186819681A681B681C681E681F6820 +6822682368246825682668276828682B682C682D682E682F6830683168346835 +6836683A683B683F6847684B684D684F68526856685768586859685A685B0000 +97 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +685C685D685E685F686A686C686D686E686F6870687168726873687568786879 +687A687B687C687D687E687F688068826884688768886889688A688B688C688D +688E68906891689268946895689668986899689A689B689C689D689E689F68A0 +68A168A368A468A568A968AA68AB68AC68AE68B168B268B468B668B768B80000 +68B968BA68BB68BC68BD68BE68BF68C168C368C468C568C668C768C868CA68CC +68CE68CF68D068D168D368D468D668D768D968DB68DC68DD68DE68DF68E168E2 +68E468E568E668E768E868E968EA68EB68EC68ED68EF68F268F368F468F668F7 +68F868FB68FD68FE68FF69006902690369046906690769086909690A690C690F +69116913691469156916691769186919691A691B691C691D691E692169226923 +69256926692769286929692A692B692C692E692F693169326933693569366937 +6938693A693B693C693E694069416943694469456946694769486949694A694B +694C694D694E694F69506951695269536955695669586959695B695C695F0000 +98 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6961696269646965696769686969696A696C696D696F69706972697369746975 +6976697A697B697D697E697F698169836985698A698B698C698E698F69906991 +69926993699669976999699A699D699E699F69A069A169A269A369A469A569A6 +69A969AA69AC69AE69AF69B069B269B369B569B669B869B969BA69BC69BD0000 +69BE69BF69C069C269C369C469C569C669C769C869C969CB69CD69CF69D169D2 +69D369D569D669D769D869D969DA69DC69DD69DE69E169E269E369E469E569E6 +69E769E869E969EA69EB69EC69EE69EF69F069F169F369F469F569F669F769F8 +69F969FA69FB69FC69FE6A006A016A026A036A046A056A066A076A086A096A0B +6A0C6A0D6A0E6A0F6A106A116A126A136A146A156A166A196A1A6A1B6A1C6A1D +6A1E6A206A226A236A246A256A266A276A296A2B6A2C6A2D6A2E6A306A326A33 +6A346A366A376A386A396A3A6A3B6A3C6A3F6A406A416A426A436A456A466A48 +6A496A4A6A4B6A4C6A4D6A4E6A4F6A516A526A536A546A556A566A576A5A0000 +99 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A5C6A5D6A5E6A5F6A606A626A636A646A666A676A686A696A6A6A6B6A6C6A6D +6A6E6A6F6A706A726A736A746A756A766A776A786A7A6A7B6A7D6A7E6A7F6A81 +6A826A836A856A866A876A886A896A8A6A8B6A8C6A8D6A8F6A926A936A946A95 +6A966A986A996A9A6A9B6A9C6A9D6A9E6A9F6AA16AA26AA36AA46AA56AA60000 +6AA76AA86AAA6AAD6AAE6AAF6AB06AB16AB26AB36AB46AB56AB66AB76AB86AB9 +6ABA6ABB6ABC6ABD6ABE6ABF6AC06AC16AC26AC36AC46AC56AC66AC76AC86AC9 +6ACA6ACB6ACC6ACD6ACE6ACF6AD06AD16AD26AD36AD46AD56AD66AD76AD86AD9 +6ADA6ADB6ADC6ADD6ADE6ADF6AE06AE16AE26AE36AE46AE56AE66AE76AE86AE9 +6AEA6AEB6AEC6AED6AEE6AEF6AF06AF16AF26AF36AF46AF56AF66AF76AF86AF9 +6AFA6AFB6AFC6AFD6AFE6AFF6B006B016B026B036B046B056B066B076B086B09 +6B0A6B0B6B0C6B0D6B0E6B0F6B106B116B126B136B146B156B166B176B186B19 +6B1A6B1B6B1C6B1D6B1E6B1F6B256B266B286B296B2A6B2B6B2C6B2D6B2E0000 +9A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B2F6B306B316B336B346B356B366B386B3B6B3C6B3D6B3F6B406B416B426B44 +6B456B486B4A6B4B6B4D6B4E6B4F6B506B516B526B536B546B556B566B576B58 +6B5A6B5B6B5C6B5D6B5E6B5F6B606B616B686B696B6B6B6C6B6D6B6E6B6F6B70 +6B716B726B736B746B756B766B776B786B7A6B7D6B7E6B7F6B806B856B880000 +6B8C6B8E6B8F6B906B916B946B956B976B986B996B9C6B9D6B9E6B9F6BA06BA2 +6BA36BA46BA56BA66BA76BA86BA96BAB6BAC6BAD6BAE6BAF6BB06BB16BB26BB6 +6BB86BB96BBA6BBB6BBC6BBD6BBE6BC06BC36BC46BC66BC76BC86BC96BCA6BCC +6BCE6BD06BD16BD86BDA6BDC6BDD6BDE6BDF6BE06BE26BE36BE46BE56BE66BE7 +6BE86BE96BEC6BED6BEE6BF06BF16BF26BF46BF66BF76BF86BFA6BFB6BFC6BFE +6BFF6C006C016C026C036C046C086C096C0A6C0B6C0C6C0E6C126C176C1C6C1D +6C1E6C206C236C256C2B6C2C6C2D6C316C336C366C376C396C3A6C3B6C3C6C3E +6C3F6C436C446C456C486C4B6C4C6C4D6C4E6C4F6C516C526C536C566C580000 +9B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C596C5A6C626C636C656C666C676C6B6C6C6C6D6C6E6C6F6C716C736C756C77 +6C786C7A6C7B6C7C6C7F6C806C846C876C8A6C8B6C8D6C8E6C916C926C956C96 +6C976C986C9A6C9C6C9D6C9E6CA06CA26CA86CAC6CAF6CB06CB46CB56CB66CB7 +6CBA6CC06CC16CC26CC36CC66CC76CC86CCB6CCD6CCE6CCF6CD16CD26CD80000 +6CD96CDA6CDC6CDD6CDF6CE46CE66CE76CE96CEC6CED6CF26CF46CF96CFF6D00 +6D026D036D056D066D086D096D0A6D0D6D0F6D106D116D136D146D156D166D18 +6D1C6D1D6D1F6D206D216D226D236D246D266D286D296D2C6D2D6D2F6D306D34 +6D366D376D386D3A6D3F6D406D426D446D496D4C6D506D556D566D576D586D5B +6D5D6D5F6D616D626D646D656D676D686D6B6D6C6D6D6D706D716D726D736D75 +6D766D796D7A6D7B6D7D6D7E6D7F6D806D816D836D846D866D876D8A6D8B6D8D +6D8F6D906D926D966D976D986D996D9A6D9C6DA26DA56DAC6DAD6DB06DB16DB3 +6DB46DB66DB76DB96DBA6DBB6DBC6DBD6DBE6DC16DC26DC36DC86DC96DCA0000 +9C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6DCD6DCE6DCF6DD06DD26DD36DD46DD56DD76DDA6DDB6DDC6DDF6DE26DE36DE5 +6DE76DE86DE96DEA6DED6DEF6DF06DF26DF46DF56DF66DF86DFA6DFD6DFE6DFF +6E006E016E026E036E046E066E076E086E096E0B6E0F6E126E136E156E186E19 +6E1B6E1C6E1E6E1F6E226E266E276E286E2A6E2C6E2E6E306E316E336E350000 +6E366E376E396E3B6E3C6E3D6E3E6E3F6E406E416E426E456E466E476E486E49 +6E4A6E4B6E4C6E4F6E506E516E526E556E576E596E5A6E5C6E5D6E5E6E606E61 +6E626E636E646E656E666E676E686E696E6A6E6C6E6D6E6F6E706E716E726E73 +6E746E756E766E776E786E796E7A6E7B6E7C6E7D6E806E816E826E846E876E88 +6E8A6E8B6E8C6E8D6E8E6E916E926E936E946E956E966E976E996E9A6E9B6E9D +6E9E6EA06EA16EA36EA46EA66EA86EA96EAB6EAC6EAD6EAE6EB06EB36EB56EB8 +6EB96EBC6EBE6EBF6EC06EC36EC46EC56EC66EC86EC96ECA6ECC6ECD6ECE6ED0 +6ED26ED66ED86ED96EDB6EDC6EDD6EE36EE76EEA6EEB6EEC6EED6EEE6EEF0000 +9D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6EF06EF16EF26EF36EF56EF66EF76EF86EFA6EFB6EFC6EFD6EFE6EFF6F006F01 +6F036F046F056F076F086F0A6F0B6F0C6F0D6F0E6F106F116F126F166F176F18 +6F196F1A6F1B6F1C6F1D6F1E6F1F6F216F226F236F256F266F276F286F2C6F2E +6F306F326F346F356F376F386F396F3A6F3B6F3C6F3D6F3F6F406F416F420000 +6F436F446F456F486F496F4A6F4C6F4E6F4F6F506F516F526F536F546F556F56 +6F576F596F5A6F5B6F5D6F5F6F606F616F636F646F656F676F686F696F6A6F6B +6F6C6F6F6F706F716F736F756F766F776F796F7B6F7D6F7E6F7F6F806F816F82 +6F836F856F866F876F8A6F8B6F8F6F906F916F926F936F946F956F966F976F98 +6F996F9A6F9B6F9D6F9E6F9F6FA06FA26FA36FA46FA56FA66FA86FA96FAA6FAB +6FAC6FAD6FAE6FAF6FB06FB16FB26FB46FB56FB76FB86FBA6FBB6FBC6FBD6FBE +6FBF6FC16FC36FC46FC56FC66FC76FC86FCA6FCB6FCC6FCD6FCE6FCF6FD06FD3 +6FD46FD56FD66FD76FD86FD96FDA6FDB6FDC6FDD6FDF6FE26FE36FE46FE50000 +9E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6FE66FE76FE86FE96FEA6FEB6FEC6FED6FF06FF16FF26FF36FF46FF56FF66FF7 +6FF86FF96FFA6FFB6FFC6FFD6FFE6FFF70007001700270037004700570067007 +70087009700A700B700C700D700E700F70107012701370147015701670177018 +7019701C701D701E701F702070217022702470257026702770287029702A0000 +702B702C702D702E702F70307031703270337034703670377038703A703B703C +703D703E703F7040704170427043704470457046704770487049704A704B704D +704E7050705170527053705470557056705770587059705A705B705C705D705F +7060706170627063706470657066706770687069706A706E7071707270737074 +70777079707A707B707D7081708270837084708670877088708B708C708D708F +70907091709370977098709A709B709E709F70A070A170A270A370A470A570A6 +70A770A870A970AA70B070B270B470B570B670BA70BE70BF70C470C570C670C7 +70C970CB70CC70CD70CE70CF70D070D170D270D370D470D570D670D770DA0000 +9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +70DC70DD70DE70E070E170E270E370E570EA70EE70F070F170F270F370F470F5 +70F670F870FA70FB70FC70FE70FF710071017102710371047105710671077108 +710B710C710D710E710F7111711271147117711B711C711D711E711F71207121 +7122712371247125712771287129712A712B712C712D712E7132713371340000 +7135713771387139713A713B713C713D713E713F714071417142714371447146 +714771487149714B714D714F7150715171527153715471557156715771587159 +715A715B715D715F716071617162716371657169716A716B716C716D716F7170 +717171747175717671777179717B717C717E717F718071817182718371857186 +718771887189718B718C718D718E7190719171927193719571967197719A719B +719C719D719E71A171A271A371A471A571A671A771A971AA71AB71AD71AE71AF +71B071B171B271B471B671B771B871BA71BB71BC71BD71BE71BF71C071C171C2 +71C471C571C671C771C871C971CA71CB71CC71CD71CF71D071D171D271D30000 +A0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +71D671D771D871D971DA71DB71DC71DD71DE71DF71E171E271E371E471E671E8 +71E971EA71EB71EC71ED71EF71F071F171F271F371F471F571F671F771F871FA +71FB71FC71FD71FE71FF720072017202720372047205720772087209720A720B +720C720D720E720F7210721172127213721472157216721772187219721A0000 +721B721C721E721F722072217222722372247225722672277229722B722D722E +722F723272337234723A723C723E72407241724272437244724572467249724A +724B724E724F7250725172537254725572577258725A725C725E726072637264 +72657268726A726B726C726D7270727172737274727672777278727B727C727D +7282728372857286728772887289728C728E7290729172937294729572967297 +72987299729A729B729C729D729E72A072A172A272A372A472A572A672A772A8 +72A972AA72AB72AE72B172B272B372B572BA72BB72BC72BD72BE72BF72C072C5 +72C672C772C972CA72CB72CC72CF72D172D372D472D572D672D872DA72DB0000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300200B702C902C700A8300330052014FF5E2016202620182019 +201C201D3014301530083009300A300B300C300D300E300F3016301730103011 +00B100D700F72236222722282211220F222A222922082237221A22A522252220 +23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 +22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 +25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000217021712172217321742175217621772178217900000000000000000000 +000024882489248A248B248C248D248E248F2490249124922493249424952496 +249724982499249A249B247424752476247724782479247A247B247C247D247E +247F248024812482248324842485248624872460246124622463246424652466 +2467246824690000000032203221322232233224322532263227322832290000 +00002160216121622163216421652166216721682169216A216B000000000000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +FE35FE36FE39FE3AFE3FFE40FE3DFE3EFE41FE42FE43FE4400000000FE3BFE3C +FE37FE38FE310000FE33FE340000000000000000000000000000000000000000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +02CA02CB02D920132015202520352105210921962197219821992215221F2223 +22522266226722BF2550255125522553255425552556255725582559255A255B +255C255D255E255F2560256125622563256425652566256725682569256A256B +256C256D256E256F257025712572257325812582258325842585258625870000 +25882589258A258B258C258D258E258F25932594259525BC25BD25E225E325E4 +25E5260922953012301D301E0000000000000000000000000000000000000000 +0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 +00F2016B00FA01D400F901D601D801DA01DC00FC00EA02510000014401480000 +0261000000000000000031053106310731083109310A310B310C310D310E310F +3110311131123113311431153116311731183119311A311B311C311D311E311F +3120312131223123312431253126312731283129000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30213022302330243025302630273028302932A3338E338F339C339D339E33A1 +33C433CE33D133D233D5FE30FFE2FFE400002121323100002010000000000000 +30FC309B309C30FD30FE3006309D309EFE49FE4AFE4BFE4CFE4DFE4EFE4FFE50 +FE51FE52FE54FE55FE56FE57FE59FE5AFE5BFE5CFE5DFE5EFE5FFE60FE610000 +FE62FE63FE64FE65FE66FE68FE69FE6AFE6B0000000000000000000000000000 +0000000000000000000000003007000000000000000000000000000000000000 +00000000000000002500250125022503250425052506250725082509250A250B +250C250D250E250F2510251125122513251425152516251725182519251A251B +251C251D251E251F2520252125222523252425252526252725282529252A252B +252C252D252E252F2530253125322533253425352536253725382539253A253B +253C253D253E253F2540254125422543254425452546254725482549254A254B +0000000000000000000000000000000000000000000000000000000000000000 +AA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72DC72DD72DF72E272E372E472E572E672E772EA72EB72F572F672F972FD72FE +72FF73007302730473057306730773087309730B730C730D730F731073117312 +731473187319731A731F732073237324732673277328732D732F733073327333 +73357336733A733B733C733D7340734173427343734473457346734773480000 +7349734A734B734C734E734F7351735373547355735673587359735A735B735C +735D735E735F736173627363736473657366736773687369736A736B736E7370 +7371000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73727373737473757376737773787379737A737B737C737D737F738073817382 +7383738573867388738A738C738D738F73907392739373947395739773987399 +739A739C739D739E73A073A173A373A473A573A673A773A873AA73AC73AD73B1 +73B473B573B673B873B973BC73BD73BE73BF73C173C373C473C573C673C70000 +73CB73CC73CE73D273D373D473D573D673D773D873DA73DB73DC73DD73DF73E1 +73E273E373E473E673E873EA73EB73EC73EE73EF73F073F173F373F473F573F6 +73F7000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73F873F973FA73FB73FC73FD73FE73FF740074017402740474077408740B740C +740D740E741174127413741474157416741774187419741C741D741E741F7420 +74217423742474277429742B742D742F74317432743774387439743A743B743D +743E743F744074427443744474457446744774487449744A744B744C744D0000 +744E744F7450745174527453745474567458745D746074617462746374647465 +7466746774687469746A746B746C746E746F7471747274737474747574787479 +747A000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +747B747C747D747F748274847485748674887489748A748C748D748F74917492 +7493749474957496749774987499749A749B749D749F74A074A174A274A374A4 +74A574A674AA74AB74AC74AD74AE74AF74B074B174B274B374B474B574B674B7 +74B874B974BB74BC74BD74BE74BF74C074C174C274C374C474C574C674C70000 +74C874C974CA74CB74CC74CD74CE74CF74D074D174D374D474D574D674D774D8 +74D974DA74DB74DD74DF74E174E574E774E874E974EA74EB74EC74ED74F074F1 +74F2000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74F374F574F874F974FA74FB74FC74FD74FE7500750175027503750575067507 +75087509750A750B750C750E751075127514751575167517751B751D751E7520 +752175227523752475267527752A752E753475367539753C753D753F75417542 +75437544754675477549754A754D755075517552755375557556755775580000 +755D755E755F75607561756275637564756775687569756B756C756D756E756F +757075717573757575767577757A757B757C757D757E75807581758275847585 +7587000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +75887589758A758C758D758E7590759375957598759B759C759E75A275A675A7 +75A875A975AA75AD75B675B775BA75BB75BF75C075C175C675CB75CC75CE75CF +75D075D175D375D775D975DA75DC75DD75DF75E075E175E575E975EC75ED75EE +75EF75F275F375F575F675F775F875FA75FB75FD75FE76027604760676070000 +76087609760B760D760E760F76117612761376147616761A761C761D761E7621 +762376277628762C762E762F76317632763676377639763A763B763D76417642 +7644000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +76457646764776487649764A764B764E764F7650765176527653765576577658 +7659765A765B765D765F766076617662766476657666766776687669766A766C +766D766E767076717672767376747675767676777679767A767C767F76807681 +768376857689768A768C768D768F769076927694769576977698769A769B0000 +769C769D769E769F76A076A176A276A376A576A676A776A876A976AA76AB76AC +76AD76AF76B076B376B576B676B776B876B976BA76BB76BC76BD76BE76C076C1 +76C3554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698 +978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1 +888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB +9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591 +73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E +6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +76C476C776C976CB76CC76D376D576D976DA76DC76DD76DE76E076E176E276E3 +76E476E676E776E876E976EA76EB76EC76ED76F076F376F576F676F776FA76FB +76FD76FF77007702770377057706770A770C770E770F77107711771277137714 +7715771677177718771B771C771D771E77217723772477257727772A772B0000 +772C772E773077317732773377347739773B773D773E773F7742774477457746 +77487749774A774B774C774D774E774F77527753775477557756775777587759 +775C858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2 +535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28 +5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5 +6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9 +7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B +522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +775D775E775F7760776477677769776A776D776E776F77707771777277737774 +7775777677777778777A777B777C7781778277837786778777887789778A778B +778F77907793779477957796779777987799779A779B779C779D779E77A177A3 +77A477A677A877AB77AD77AE77AF77B177B277B477B677B777B877B977BA0000 +77BC77BE77C077C177C277C377C477C577C677C777C877C977CA77CB77CC77CE +77CF77D077D177D277D377D477D577D677D877D977DA77DD77DE77DF77E077E1 +77E475C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B +82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8 +601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695 +6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56 +4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7 +62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77E677E877EA77EF77F077F177F277F477F577F777F977FA77FB77FC78037804 +7805780678077808780A780B780E780F7810781378157819781B781E78207821 +782278247828782A782B782E782F78317832783378357836783D783F78417842 +78437844784678487849784A784B784D784F78517853785478587859785A0000 +785B785C785E785F7860786178627863786478657866786778687869786F7870 +78717872787378747875787678787879787A787B787D787E787F788078817882 +7883573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D +56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668 +5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA +627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A +8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79 +4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7884788578867888788A788B788F789078927894789578967899789D789E78A0 +78A278A478A678A878A978AA78AB78AC78AD78AE78AF78B578B678B778B878BA +78BB78BC78BD78BF78C078C278C378C478C678C778C878CC78CD78CE78CF78D1 +78D278D378D678D778D878DA78DB78DC78DD78DE78DF78E078E178E278E30000 +78E478E578E678E778E978EA78EB78ED78EE78EF78F078F178F378F578F678F8 +78F978FB78FC78FD78FE78FF79007902790379047906790779087909790A790B +790C784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE +7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF +882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A +847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC +810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE +7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +790D790E790F791079117912791479157916791779187919791A791B791C791D +791F792079217922792379257926792779287929792A792B792C792D792E792F +793079317932793379357936793779387939793D793F79427943794479457947 +794A794B794C794D794E794F7950795179527954795579587959796179630000 +796479667969796A796B796C796E79707971797279737974797579767979797B +797C797D797E797F798279837986798779887989798B798C798D798E79907991 +79926020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39 +86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC +905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA +654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0 +63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889 +53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7993799479957996799779987999799B799C799D799E799F79A079A179A279A3 +79A479A579A679A879A979AA79AB79AC79AD79AE79AF79B079B179B279B479B5 +79B679B779B879BC79BF79C279C479C579C779C879CA79CC79CE79CF79D079D3 +79D479D679D779D979DA79DB79DC79DD79DE79E079E179E279E579E879EA0000 +79EC79EE79F179F279F379F479F579F679F779F979FA79FC79FE79FF7A017A04 +7A057A077A087A097A0A7A0C7A0F7A107A117A127A137A157A167A187A197A1B +7A1C4E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8 +680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A +72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD +7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6 +591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9 +5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A1D7A1F7A217A227A247A257A267A277A287A297A2A7A2B7A2C7A2D7A2E7A2F +7A307A317A327A347A357A367A387A3A7A3E7A407A417A427A437A447A457A47 +7A487A497A4A7A4B7A4C7A4D7A4E7A4F7A507A527A537A547A557A567A587A59 +7A5A7A5B7A5C7A5D7A5E7A5F7A607A617A627A637A647A657A667A677A680000 +7A697A6A7A6B7A6C7A6D7A6E7A6F7A717A727A737A757A7B7A7C7A7D7A7E7A82 +7A857A877A897A8A7A8B7A8C7A8E7A8F7A907A937A947A997A9A7A9B7A9E7AA1 +7AA28D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE +94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F +963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F +6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124 +7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4 +4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7AA37AA47AA77AA97AAA7AAB7AAE7AAF7AB07AB17AB27AB47AB57AB67AB77AB8 +7AB97ABA7ABB7ABC7ABD7ABE7AC07AC17AC27AC37AC47AC57AC67AC77AC87AC9 +7ACA7ACC7ACD7ACE7ACF7AD07AD17AD27AD37AD47AD57AD77AD87ADA7ADB7ADC +7ADD7AE17AE27AE47AE77AE87AE97AEA7AEB7AEC7AEE7AF07AF17AF27AF30000 +7AF47AF57AF67AF77AF87AFB7AFC7AFE7B007B017B027B057B077B097B0C7B0D +7B0E7B107B127B137B167B177B187B1A7B1C7B1D7B1F7B217B227B237B277B29 +7B2D6D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150 +8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A +54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76 +611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8 +818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769 +845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7B2F7B307B327B347B357B367B377B397B3B7B3D7B3F7B407B417B427B437B44 +7B467B487B4A7B4D7B4E7B537B557B577B597B5C7B5E7B5F7B617B637B647B65 +7B667B677B687B697B6A7B6B7B6C7B6D7B6F7B707B737B747B767B787B7A7B7C +7B7D7B7F7B817B827B837B847B867B877B887B897B8A7B8B7B8C7B8E7B8F0000 +7B917B927B937B967B987B997B9A7B9B7B9E7B9F7BA07BA37BA47BA57BAE7BAF +7BB07BB27BB37BB57BB67BB77BB97BBA7BBB7BBC7BBD7BBE7BBF7BC07BC27BC3 +7BC457C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E +62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D +4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC +52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF +704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678 +684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7BC57BC87BC97BCA7BCB7BCD7BCE7BCF7BD07BD27BD47BD57BD67BD77BD87BDB +7BDC7BDE7BDF7BE07BE27BE37BE47BE77BE87BE97BEB7BEC7BED7BEF7BF07BF2 +7BF37BF47BF57BF67BF87BF97BFA7BFB7BFD7BFF7C007C017C027C037C047C05 +7C067C087C097C0A7C0D7C0E7C107C117C127C137C147C157C177C187C190000 +7C1A7C1B7C1C7C1D7C1E7C207C217C227C237C247C257C287C297C2B7C2C7C2D +7C2E7C2F7C307C317C327C337C347C357C367C377C397C3A7C3B7C3C7C3D7C3E +7C429AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD +558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E +8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408 +76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC +4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334 +543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7C437C447C457C467C477C487C497C4A7C4B7C4C7C4E7C4F7C507C517C527C53 +7C547C557C567C577C587C597C5A7C5B7C5C7C5D7C5E7C5F7C607C617C627C63 +7C647C657C667C677C687C697C6A7C6B7C6C7C6D7C6E7C6F7C707C717C727C75 +7C767C777C787C797C7A7C7E7C7F7C807C817C827C837C847C857C867C870000 +7C887C8A7C8B7C8C7C8D7C8E7C8F7C907C937C947C967C997C9A7C9B7CA07CA1 +7CA37CA67CA77CA87CA97CAB7CAC7CAD7CAF7CB07CB47CB57CB67CB77CB87CBA +7CBB5F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316 +8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62 +71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C +604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F +79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19 +706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7CBF7CC07CC27CC37CC47CC67CC97CCB7CCE7CCF7CD07CD17CD27CD37CD47CD8 +7CDA7CDB7CDD7CDE7CE17CE27CE37CE47CE57CE67CE77CE97CEA7CEB7CEC7CED +7CEE7CF07CF17CF27CF37CF47CF57CF67CF77CF97CFA7CFC7CFD7CFE7CFF7D00 +7D017D027D037D047D057D067D077D087D097D0B7D0C7D0D7D0E7D0F7D100000 +7D117D127D137D147D157D167D177D187D197D1A7D1B7D1C7D1D7D1E7D1F7D21 +7D237D247D257D267D287D297D2A7D2C7D2D7D2E7D307D317D327D337D347D35 +7D36808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6 +53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E +796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7 +59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C +76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877 +62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D377D387D397D3A7D3B7D3C7D3D7D3E7D3F7D407D417D427D437D447D457D46 +7D477D487D497D4A7D4B7D4C7D4D7D4E7D4F7D507D517D527D537D547D557D56 +7D577D587D597D5A7D5B7D5C7D5D7D5E7D5F7D607D617D627D637D647D657D66 +7D677D687D697D6A7D6B7D6C7D6D7D6F7D707D717D727D737D747D757D760000 +7D787D797D7A7D7B7D7C7D7D7D7E7D7F7D807D817D827D837D847D857D867D87 +7D887D897D8A7D8B7D8C7D8D7D8E7D8F7D907D917D927D937D947D957D967D97 +7D98506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B +686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07 +56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83 +53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED +6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4 +91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D997D9A7D9B7D9C7D9D7D9E7D9F7DA07DA17DA27DA37DA47DA57DA77DA87DA9 +7DAA7DAB7DAC7DAD7DAF7DB07DB17DB27DB37DB47DB57DB67DB77DB87DB97DBA +7DBB7DBC7DBD7DBE7DBF7DC07DC17DC27DC37DC47DC57DC67DC77DC87DC97DCA +7DCB7DCC7DCD7DCE7DCF7DD07DD17DD27DD37DD47DD57DD67DD77DD87DD90000 +7DDA7DDB7DDC7DDD7DDE7DDF7DE07DE17DE27DE37DE47DE57DE67DE77DE87DE9 +7DEA7DEB7DEC7DED7DEE7DEF7DF07DF17DF27DF37DF47DF57DF67DF77DF87DF9 +7DFA5C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66 +666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76 +7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0 +62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177 +8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485 +652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7DFB7DFC7DFD7DFE7DFF7E007E017E027E037E047E057E067E077E087E097E0A +7E0B7E0C7E0D7E0E7E0F7E107E117E127E137E147E157E167E177E187E197E1A +7E1B7E1C7E1D7E1E7E1F7E207E217E227E237E247E257E267E277E287E297E2A +7E2B7E2C7E2D7E2E7E2F7E307E317E327E337E347E357E367E377E387E390000 +7E3A7E3C7E3D7E3E7E3F7E407E427E437E447E457E467E487E497E4A7E4B7E4C +7E4D7E4E7E4F7E507E517E527E537E547E557E567E577E587E597E5A7E5B7E5C +7E5D4FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A +582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 +577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF +554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F +82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321 +7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E5E7E5F7E607E617E627E637E647E657E667E677E687E697E6A7E6B7E6C7E6D +7E6E7E6F7E707E717E727E737E747E757E767E777E787E797E7A7E7B7E7C7E7D +7E7E7E7F7E807E817E837E847E857E867E877E887E897E8A7E8B7E8C7E8D7E8E +7E8F7E907E917E927E937E947E957E967E977E987E997E9A7E9C7E9D7E9E0000 +7EAE7EB47EBB7EBC7ED67EE47EEC7EF97F0A7F107F1E7F377F397F3B7F3C7F3D +7F3E7F3F7F407F417F437F467F477F487F497F4A7F4B7F4C7F4D7F4E7F4F7F52 +7F53998861276E8357646606634656F062EC62695ED39614578362C955878721 +814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD +89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001 +4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B +7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC +9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7F567F597F5B7F5C7F5D7F5E7F607F637F647F657F667F677F6B7F6C7F6D7F6F +7F707F737F757F767F777F787F7A7F7B7F7C7F7D7F7F7F807F827F837F847F85 +7F867F877F887F897F8B7F8D7F8F7F907F917F927F937F957F967F977F987F99 +7F9B7F9C7FA07FA27FA37FA57FA67FA87FA97FAA7FAB7FAC7FAD7FAE7FB10000 +7FB37FB47FB57FB67FB77FBA7FBB7FBE7FC07FC27FC37FC47FC67FC77FC87FC9 +7FCB7FCD7FCF7FD07FD17FD27FD37FD67FD77FD97FDA7FDB7FDC7FDD7FDE7FE2 +7FE375E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C +6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF +667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599 +521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D +62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C +740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7FE47FE77FE87FEA7FEB7FEC7FED7FEF7FF27FF47FF57FF67FF77FF87FF97FFA +7FFD7FFE7FFF8002800780088009800A800E800F80118013801A801B801D801E +801F802180238024802B802C802D802E802F8030803280348039803A803C803E +8040804180448045804780488049804E804F8050805180538055805680570000 +8059805B805C805D805E805F806080618062806380648065806680678068806B +806C806D806E806F807080728073807480758076807780788079807A807B807C +807D9686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089 +63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74 +541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A +6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B +95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B +541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +807E8081808280858088808A808D808E808F8090809180928094809580978099 +809E80A380A680A780A880AC80B080B380B580B680B880B980BB80C580C780C8 +80C980CA80CB80CF80D080D180D280D380D480D580D880DF80E080E280E380E6 +80EE80F580F780F980FB80FE80FF8100810181038104810581078108810B0000 +810C811581178119811B811C811D811F81208121812281238124812581268127 +81288129812A812B812D812E813081338134813581378139813A813B813C813D +813F8C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302 +51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF +7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F +772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720 +7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511 +706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +81408141814281438144814581478149814D814E814F8152815681578158815B +815C815D815E815F816181628163816481668168816A816B816C816F81728173 +81758176817781788181818381848185818681878189818B818C818D818E8190 +8192819381948195819681978199819A819E819F81A081A181A281A481A50000 +81A781A981AB81AC81AD81AE81AF81B081B181B281B481B581B681B781B881B9 +81BC81BD81BE81BF81C481C581C781C881C981CB81CD81CE81CF81D081D181D2 +81D3647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE +964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE +776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357 +753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A +6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18 +917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +81D481D581D681D781D881D981DA81DB81DC81DD81DE81DF81E081E181E281E4 +81E581E681E881E981EB81EE81EF81F081F181F281F581F681F781F881F981FA +81FD81FF8203820782088209820A820B820E820F821182138215821682178218 +8219821A821D822082248225822682278229822E8232823A823C823D823F0000 +8240824182428243824582468248824A824C824D824E82508251825282538254 +8255825682578259825B825C825D825E82608261826282638264826582668267 +826962E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696 +8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4 +722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554 +522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA +57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA +787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +826A826B826C826D82718275827682778278827B827C82808281828382858286 +82878289828C82908293829482958296829A829B829E82A082A282A382A782B2 +82B582B682BA82BB82BC82BF82C082C282C382C582C682C982D082D682D982DA +82DD82E282E782E882E982EA82EC82ED82EE82F082F282F382F582F682F80000 +82FA82FC82FD82FE82FF8300830A830B830D831083128313831683188319831D +831E831F83208321832283238324832583268329832A832E833083328337833B +833D5564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02 +74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6 +8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461 +83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03 +51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91 +8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +833E833F83418342834483458348834A834B834C834D834E8353835583568357 +83588359835D836283708371837283738374837583768379837A837E837F8380 +838183828383838483878388838A838B838C838D838F83908391839483958396 +83978399839A839D839F83A183A283A383A483A583A683A783AC83AD83AE0000 +83AF83B583BB83BE83BF83C283C383C483C683C883C983CB83CD83CE83D083D1 +83D283D383D583D783D983DA83DB83DE83E283E383E483E683E783E883EB83EC +83ED60706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3 +524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A +62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D +520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81 +97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB +4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000 +C8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +83EE83EF83F383F483F583F683F783FA83FB83FC83FE83FF8400840284058407 +84088409840A84108412841384148415841684178419841A841B841E841F8420 +8421842284238429842A842B842C842D842E842F843084328433843484358436 +84378439843A843B843E843F8440844184428443844484458447844884490000 +844A844B844C844D844E844F8450845284538454845584568458845D845E845F +8460846284648465846684678468846A846E846F84708472847484778479847B +847C53D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238 +529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4 +58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4 +5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197 +63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A +745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000 +C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +847D847E847F848084818483848484858486848A848D848F8490849184928493 +8494849584968498849A849B849D849E849F84A084A284A384A484A584A684A7 +84A884A984AA84AB84AC84AD84AE84B084B184B384B584B684B784BB84BC84BE +84C084C284C384C584C684C784C884CB84CC84CE84CF84D284D484D584D70000 +84D884D984DA84DB84DC84DE84E184E284E484E784E884E984EA84EB84ED84EE +84EF84F184F284F384F484F584F684F784F884F984FA84FB84FD84FE85008501 +85024F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E +7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D +886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A +5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7 +820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20 +7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8503850485058506850785088509850A850B850D850E850F8510851285148515 +851685188519851B851C851D851E852085228523852485258526852785288529 +852A852D852E852F8530853185328533853485358536853E853F854085418542 +8544854585468547854B854C854D854E854F8550855185528553855485550000 +85578558855A855B855C855D855F85608561856285638565856685678569856A +856B856C856D856E856F8570857185738575857685778578857C857D857F8580 +8581770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3 +62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB +4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F +5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C +67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9 +7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +85828583858685888589858A858B858C858D858E859085918592859385948595 +8596859785988599859A859D859E859F85A085A185A285A385A585A685A785A9 +85AB85AC85AD85B185B285B385B485B585B685B885BA85BB85BC85BD85BE85BF +85C085C285C385C485C585C685C785C885CA85CB85CC85CD85CE85D185D20000 +85D485D685D785D885D985DA85DB85DD85DE85DF85E085E185E285E385E585E6 +85E785E885EA85EB85EC85ED85EE85EF85F085F185F285F385F485F585F685F7 +85F860555237800D6454887075295E05681362F4971C53CC723D8C016C347761 +7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D +6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC +8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9 +80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59 +635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +85F985FA85FC85FD85FE860086018602860386048606860786088609860A860B +860C860D860E860F86108612861386148615861786188619861A861B861C861D +861E861F86208621862286238624862586268628862A862B862C862D862E862F +863086318632863386348635863686378639863A863B863D863E863F86400000 +864186428643864486458646864786488649864A864B864C8652865386558656 +865786588659865B865C865D865F866086618663866486658666866786688669 +866A736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A +8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD +6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4 +7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22 +951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530 +751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +866D866F86708672867386748675867686778678868386848685868686878688 +8689868E868F86908691869286948696869786988699869A869B869E869F86A0 +86A186A286A586A686AB86AD86AE86B286B386B786B886B986BB86BC86BD86BE +86BF86C186C286C386C586C886CC86CD86D286D386D586D686D786DA86DC0000 +86DD86E086E186E286E386E586E686E786E886EA86EB86EC86EF86F586F686F7 +86FA86FB86FC86FD86FF8701870487058706870B870C870E870F871087118714 +87166C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5 +687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82 +5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6 +625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6 +889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB +5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8719871B871D871F87208724872687278728872A872B872C872D872F87308732 +87338735873687388739873A873C873D8740874187428743874487458746874A +874B874D874F8750875187528754875587568758875A875B875C875D875E875F +876187628766876787688769876A876B876C876D876F87718772877387750000 +877787788779877A877F878087818784878687878789878A878C878E878F8790 +8791879287948795879687988799879A879B879C879D879E87A087A187A287A3 +87A45DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4 +4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170 +536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717 +6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C +68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269 +52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +87A587A687A787A987AA87AE87B087B187B287B487B687B787B887B987BB87BC +87BE87BF87C187C287C387C487C587C787C887C987CC87CD87CE87CF87D087D4 +87D587D687D787D887D987DA87DC87DD87DE87DF87E187E287E387E487E687E7 +87E887E987EB87EC87ED87EF87F087F187F287F387F487F587F687F787F80000 +87FA87FB87FC87FD87FF880088018802880488058806880788088809880B880C +880D880E880F8810881188128814881788188819881A881C881D881E881F8820 +88237A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D +4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1 +4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237 +95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF +76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7 +6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +882488258826882788288829882A882B882C882D882E882F8830883188338834 +8835883688378838883A883B883D883E883F8841884288438846884788488849 +884A884B884E884F8850885188528853885588568858885A885B885C885D885E +885F886088668867886A886D886F8871887388748875887688788879887A0000 +887B887C88808883888688878889888A888C888E888F88908891889388948895 +889788988899889A889B889D889E889F88A088A188A388A588A688A788A888A9 +88AA5C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A +90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C +6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2 +884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E +673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157 +53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +88AC88AE88AF88B088B288B388B488B588B688B888B988BA88BB88BD88BE88BF +88C088C388C488C788C888CA88CB88CC88CD88CF88D088D188D388D688D788DA +88DB88DC88DD88DE88E088E188E688E788E988EA88EB88EC88ED88EE88EF88F2 +88F588F688F788FA88FB88FD88FF890089018903890489058906890789080000 +8909890B890C890D890E890F891189148915891689178918891C891D891E891F +89208922892389248926892789288929892C892D892E892F8931893289338935 +89379009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2 +5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD +7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25 +781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830 +71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C +4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89388939893A893B893C893D893E893F89408942894389458946894789488949 +894A894B894C894D894E894F8950895189528953895489558956895789588959 +895A895B895C895D896089618962896389648965896789688969896A896B896C +896D896E896F8970897189728973897489758976897789788979897A897C0000 +897D897E8980898289848985898789888989898A898B898C898D898E898F8990 +899189928993899489958996899789988999899A899B899C899D899E899F89A0 +89A164475C2790657A918C2359DA54AC8200836F898180006930564E80367237 +91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1 +4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681 +501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB +4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE +8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89A289A389A489A589A689A789A889A989AA89AB89AC89AD89AE89AF89B089B1 +89B289B389B489B589B689B789B889B989BA89BB89BC89BD89BE89BF89C089C3 +89CD89D389D489D589D789D889D989DB89DD89DF89E089E189E289E489E789E8 +89E989EA89EC89ED89EE89F089F189F289F489F589F689F789F889F989FA0000 +89FB89FC89FD89FE89FF8A018A028A038A048A058A068A088A098A0A8A0B8A0C +8A0D8A0E8A0F8A108A118A128A138A148A158A168A178A188A198A1A8A1B8A1C +8A1D537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8 +5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C +6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149 +670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206 +4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED +7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8A1E8A1F8A208A218A228A238A248A258A268A278A288A298A2A8A2B8A2C8A2D +8A2E8A2F8A308A318A328A338A348A358A368A378A388A398A3A8A3B8A3C8A3D +8A3F8A408A418A428A438A448A458A468A478A498A4A8A4B8A4C8A4D8A4E8A4F +8A508A518A528A538A548A558A568A578A588A598A5A8A5B8A5C8A5D8A5E0000 +8A5F8A608A618A628A638A648A658A668A678A688A698A6A8A6B8A6C8A6D8A6E +8A6F8A708A718A728A738A748A758A768A778A788A7A8A7B8A7C8A7D8A7E8A7F +8A806D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95 +56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5 +5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5 +5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43 +810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5 +8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8A818A828A838A848A858A868A878A888A8B8A8C8A8D8A8E8A8F8A908A918A92 +8A948A958A968A978A988A998A9A8A9B8A9C8A9D8A9E8A9F8AA08AA18AA28AA3 +8AA48AA58AA68AA78AA88AA98AAA8AAB8AAC8AAD8AAE8AAF8AB08AB18AB28AB3 +8AB48AB58AB68AB78AB88AB98ABA8ABB8ABC8ABD8ABE8ABF8AC08AC18AC20000 +8AC38AC48AC58AC68AC78AC88AC98ACA8ACB8ACC8ACD8ACE8ACF8AD08AD18AD2 +8AD38AD48AD58AD68AD78AD88AD98ADA8ADB8ADC8ADD8ADE8ADF8AE08AE18AE2 +8AE394E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8 +77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B +7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C +62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005 +951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA +9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8AE48AE58AE68AE78AE88AE98AEA8AEB8AEC8AED8AEE8AEF8AF08AF18AF28AF3 +8AF48AF58AF68AF78AF88AF98AFA8AFB8AFC8AFD8AFE8AFF8B008B018B028B03 +8B048B058B068B088B098B0A8B0B8B0C8B0D8B0E8B0F8B108B118B128B138B14 +8B158B168B178B188B198B1A8B1B8B1C8B1D8B1E8B1F8B208B218B228B230000 +8B248B258B278B288B298B2A8B2B8B2C8B2D8B2E8B2F8B308B318B328B338B34 +8B358B368B378B388B398B3A8B3B8B3C8B3D8B3E8B3F8B408B418B428B438B44 +8B455E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7 +804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A +63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92 +4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC +7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB +90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B468B478B488B498B4A8B4B8B4C8B4D8B4E8B4F8B508B518B528B538B548B55 +8B568B578B588B598B5A8B5B8B5C8B5D8B5E8B5F8B608B618B628B638B648B65 +8B678B688B698B6A8B6B8B6D8B6E8B6F8B708B718B728B738B748B758B768B77 +8B788B798B7A8B7B8B7C8B7D8B7E8B7F8B808B818B828B838B848B858B860000 +8B878B888B898B8A8B8B8B8C8B8D8B8E8B8F8B908B918B928B938B948B958B96 +8B978B988B998B9A8B9B8B9C8B9D8B9E8B9F8BAC8BB18BBB8BC78BD08BEA8C09 +8C1E4F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84 +88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353 +684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B +4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70 +594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A +5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8C388C398C3A8C3B8C3C8C3D8C3E8C3F8C408C428C438C448C458C488C4A8C4B +8C4D8C4E8C4F8C508C518C528C538C548C568C578C588C598C5B8C5C8C5D8C5E +8C5F8C608C638C648C658C668C678C688C698C6C8C6D8C6E8C6F8C708C718C72 +8C748C758C768C778C7B8C7C8C7D8C7E8C7F8C808C818C838C848C868C870000 +8C888C8B8C8D8C8E8C8F8C908C918C928C938C958C968C978C998C9A8C9B8C9C +8C9D8C9E8C9F8CA08CA18CA28CA38CA48CA58CA68CA78CA88CA98CAA8CAB8CAC +8CAD4E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F +53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C +4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5 +5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261 +525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB +4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8CAE8CAF8CB08CB18CB28CB38CB48CB58CB68CB78CB88CB98CBA8CBB8CBC8CBD +8CBE8CBF8CC08CC18CC28CC38CC48CC58CC68CC78CC88CC98CCA8CCB8CCC8CCD +8CCE8CCF8CD08CD18CD28CD38CD48CD58CD68CD78CD88CD98CDA8CDB8CDC8CDD +8CDE8CDF8CE08CE18CE28CE38CE48CE58CE68CE78CE88CE98CEA8CEB8CEC0000 +8CED8CEE8CEF8CF08CF18CF28CF38CF48CF58CF68CF78CF88CF98CFA8CFB8CFC +8CFD8CFE8CFF8D008D018D028D038D048D058D068D078D088D098D0A8D0B8D0C +8D0D4F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC +4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F +502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7 +50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0 +6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0 +51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8D0E8D0F8D108D118D128D138D148D158D168D178D188D198D1A8D1B8D1C8D20 +8D518D528D578D5F8D658D688D698D6A8D6C8D6E8D6F8D718D728D788D798D7A +8D7B8D7C8D7D8D7E8D7F8D808D828D838D868D878D888D898D8C8D8D8D8E8D8F +8D908D928D938D958D968D978D988D998D9A8D9B8D9C8D9D8D9E8DA08DA10000 +8DA28DA48DA58DA68DA78DA88DA98DAA8DAB8DAC8DAD8DAE8DAF8DB08DB28DB6 +8DB78DB98DBB8DBD8DC08DC18DC28DC58DC78DC88DC98DCA8DCD8DD08DD28DD3 +8DD451C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF +8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3 +8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19 +8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36 +5369537A961D962296219631962A963D963C964296499654965F9667966C9672 +96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8DD58DD88DD98DDC8DE08DE18DE28DE58DE68DE78DE98DED8DEE8DF08DF18DF2 +8DF48DF68DFC8DFE8DFF8E008E018E028E038E048E068E078E088E0B8E0D8E0E +8E108E118E128E138E158E168E178E188E198E1A8E1B8E1C8E208E218E248E25 +8E268E278E288E2B8E2D8E308E328E338E348E368E378E388E3B8E3C8E3E0000 +8E3F8E438E458E468E4C8E4D8E4E8E4F8E508E538E548E558E568E578E588E5A +8E5B8E5C8E5D8E5E8E5F8E608E618E628E638E648E658E678E688E6A8E6B8E6E +8E7190B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB +90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD +52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF +574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B +574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF +57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E738E758E778E788E798E7A8E7B8E7D8E7E8E808E828E838E848E868E888E89 +8E8A8E8B8E8C8E8D8E8E8E918E928E938E958E968E978E988E998E9A8E9B8E9D +8E9F8EA08EA18EA28EA38EA48EA58EA68EA78EA88EA98EAA8EAD8EAE8EB08EB1 +8EB38EB48EB58EB68EB78EB88EB98EBB8EBC8EBD8EBE8EBF8EC08EC18EC20000 +8EC38EC48EC58EC68EC78EC88EC98ECA8ECB8ECC8ECD8ECF8ED08ED18ED28ED3 +8ED48ED58ED68ED78ED88ED98EDA8EDB8EDC8EDD8EDE8EDF8EE08EE18EE28EE3 +8EE4580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 +99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8 +82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F +82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3 +8311831A83068314831582E082D5831C8351835B835C83088392833C83348331 +839B835E832F834F83478343835F834083178360832D833A8333836683650000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8EE58EE68EE78EE88EE98EEA8EEB8EEC8EED8EEE8EEF8EF08EF18EF28EF38EF4 +8EF58EF68EF78EF88EF98EFA8EFB8EFC8EFD8EFE8EFF8F008F018F028F038F04 +8F058F068F078F088F098F0A8F0B8F0C8F0D8F0E8F0F8F108F118F128F138F14 +8F158F168F178F188F198F1A8F1B8F1C8F1D8F1E8F1F8F208F218F228F230000 +8F248F258F268F278F288F298F2A8F2B8F2C8F2D8F2E8F2F8F308F318F328F33 +8F348F358F368F378F388F398F3A8F3B8F3C8F3D8F3E8F3F8F408F418F428F43 +8F448368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C +8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8 +58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 +83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478 +843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF +84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8F458F468F478F488F498F4A8F4B8F4C8F4D8F4E8F4F8F508F518F528F538F54 +8F558F568F578F588F598F5A8F5B8F5C8F5D8F5E8F5F8F608F618F628F638F64 +8F658F6A8F808F8C8F928F9D8FA08FA18FA28FA48FA58FA68FA78FAA8FAC8FAD +8FAE8FAF8FB28FB38FB48FB58FB78FB88FBA8FBB8FBC8FBF8FC08FC38FC60000 +8FC98FCA8FCB8FCC8FCD8FCF8FD28FD68FD78FDA8FE08FE18FE38FE78FEC8FEF +8FF18FF28FF48FF58FF68FFA8FFB8FFC8FFE8FFF90079008900C900E90139015 +90188556853B84FF84FC8559854885688564855E857A77A285438572857B85A4 +85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605 +86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34 +624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371 +637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE +645263C663BE64456441640B641B6420640C64266421645E6484646D64960000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9019901C902390249025902790289029902A902B902C90309031903290339034 +90379039903A903D903F904090439045904690489049904A904B904C904E9054 +905590569059905A905C905D905E905F906090619064906690679069906A906B +906C906F90709071907290739076907790789079907A907B907C907E90810000 +90849085908690879089908A908C908D908E908F90909092909490969098909A +909C909E909F90A090A490A590A790A890A990AB90AD90B290B790BC90BD90BF +90C0647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2 +75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456 +54435421545754595423543254825494547754715464549A549B548454765466 +549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC +54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522 +5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +90C290C390C690C890C990CB90CC90CD90D290D490D590D690D890D990DA90DE +90DF90E090E390E490E590E990EA90EC90EE90F090F190F290F390F590F690F7 +90F990FA90FB90FC90FF91009101910391059106910791089109910A910B910C +910D910E910F911091119112911391149115911691179118911A911B911C0000 +911D911F91209121912491259126912791289129912A912B912C912D912E9130 +9132913391349135913691379138913A913B913C913D913E913F914091419142 +91445537555655755576557755335530555C558B55D2558355B155B955885581 +559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB +55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E +5608560C56015624562355FE56005627562D565856395657562C564D56625659 +565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 +56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9145914791489151915391549155915691589159915B915C915F916091669167 +9168916B916D9173917A917B917C9180918191829183918491869188918A918E +918F9193919491959196919791989199919C919D919E919F91A091A191A491A5 +91A691A791A891A991AB91AC91B091B191B291B391B691B791B891B991BB0000 +91BC91BD91BE91BF91C091C191C291C391C491C591C691C891CB91D091D291D3 +91D491D591D691D791D891D991DA91DB91DD91DE91DF91E091E191E291E391E4 +91E55E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91 +5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5 +5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F +5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87 +5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8 +72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +91E691E791E891E991EA91EB91EC91ED91EE91EF91F091F191F291F391F491F5 +91F691F791F891F991FA91FB91FC91FD91FE91FF920092019202920392049205 +9206920792089209920A920B920C920D920E920F921092119212921392149215 +9216921792189219921A921B921C921D921E921F922092219222922392240000 +92259226922792289229922A922B922C922D922E922F92309231923292339234 +92359236923792389239923A923B923C923D923E923F92409241924292439244 +924572FB731773137321730A731E731D7315732273397325732C733873317350 +734D73577360736C736F737E821B592598E7592459029963996799689969996A +996B996C99749977997D998099849987998A998D999099919993999499955E80 +5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA +5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019 +60356026601B600F600D6029602B600A603F602160786079607B607A60420000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9246924792489249924A924B924C924D924E924F925092519252925392549255 +9256925792589259925A925B925C925D925E925F926092619262926392649265 +9266926792689269926A926B926C926D926E926F927092719272927392759276 +927792789279927A927B927C927D927E927F9280928192829283928492850000 +9286928792889289928A928B928C928D928F9290929192929293929492959296 +929792989299929A929B929C929D929E929F92A092A192A292A392A492A592A6 +92A7606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8 +60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7 +61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606 +9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35 +6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4 +6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +92A892A992AA92AB92AC92AD92AF92B092B192B292B392B492B592B692B792B8 +92B992BA92BB92BC92BD92BE92BF92C092C192C292C392C492C592C692C792C9 +92CA92CB92CC92CD92CE92CF92D092D192D292D392D492D592D692D792D892D9 +92DA92DB92DC92DD92DE92DF92E092E192E292E392E492E592E692E792E80000 +92E992EA92EB92EC92ED92EE92EF92F092F192F292F392F492F592F692F792F8 +92F992FA92FB92FC92FD92FE92FF930093019302930393049305930693079308 +93096D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F +6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7 +6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E +6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5 +6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9 +6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +930A930B930C930D930E930F9310931193129313931493159316931793189319 +931A931B931C931D931E931F9320932193229323932493259326932793289329 +932A932B932C932D932E932F9330933193329333933493359336933793389339 +933A933B933C933D933F93409341934293439344934593469347934893490000 +934A934B934C934D934E934F9350935193529353935493559356935793589359 +935A935B935C935D935E935F9360936193629363936493659366936793689369 +936B6FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 +704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47 +8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011 +900D9016902190359036902D902F9044905190529050906890589062905B66B9 +9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 +5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +936C936D936E936F9370937193729373937493759376937793789379937A937B +937C937D937E937F9380938193829383938493859386938793889389938A938B +938C938D938E9390939193929393939493959396939793989399939A939B939C +939D939E939F93A093A193A293A393A493A593A693A793A893A993AA93AB0000 +93AC93AD93AE93AF93B093B193B293B393B493B593B693B793B893B993BA93BB +93BC93BD93BE93BF93C093C193C293C393C493C593C693C793C893C993CB93CC +93CD599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3 +59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75 +80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6 +5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 +9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98 +9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +93CE93CF93D093D193D293D393D493D593D793D893D993DA93DB93DC93DD93DE +93DF93E093E193E293E393E493E593E693E793E893E993EA93EB93EC93ED93EE +93EF93F093F193F293F393F493F593F693F793F893F993FA93FB93FC93FD93FE +93FF9400940194029403940494059406940794089409940A940B940C940D0000 +940E940F9410941194129413941494159416941794189419941A941B941C941D +941E941F9420942194229423942494259426942794289429942A942B942C942D +942E7EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1 +7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08 +7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26 +7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095 +738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C +740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +942F9430943194329433943494359436943794389439943A943B943C943D943F +9440944194429443944494459446944794489449944A944B944C944D944E944F +9450945194529453945494559456945794589459945A945B945C945D945E945F +9460946194629463946494659466946794689469946A946C946D946E946F0000 +9470947194729473947494759476947794789479947A947B947C947D947E947F +9480948194829483948494919496949894C794CF94D394D494DA94E694FB951C +9520741B741A7441745C7457745574597477746D747E749C748E748074817487 +748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769 +67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8 +680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD +6832683368606861684E6862684468646883681D68556866684168676840683E +684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +95279533953D95439548954B9555955A9560956E95749575957795789579957A +957B957C957D957E9580958195829583958495859586958795889589958A958B +958C958D958E958F9590959195929593959495959596959795989599959A959B +959C959D959E959F95A095A195A295A395A495A595A695A795A895A995AA0000 +95AB95AC95AD95AE95AF95B095B195B295B395B495B595B695B795B895B995BA +95BB95BC95BD95BE95BF95C095C195C295C395C495C595C695C795C895C995CA +95CB692468F0690B6901695768E369106971693969606942695D6984696B6980 +69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD +69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44 +6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB +733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71 +8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +95CC95CD95CE95CF95D095D195D295D395D495D595D695D795D895D995DA95DB +95DC95DD95DE95DF95E095E195E295E395E495E595E695E795EC95FF96079613 +9618961B961E96209623962496259626962796289629962B962C962D962F9630 +963796389639963A963E96419643964A964E964F965196529653965696570000 +96589659965A965C965D965E9660966396659666966B966D966E966F96709671 +967396789679967A967B967C967D967E967F9680968196829683968496879689 +968A8F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C +81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615 +6600708566F7661D66346631663666358006665F66546641664F665666616657 +66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40 +8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1 +726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +968C968E96919692969396959696969A969B969D969E969F96A096A196A296A3 +96A496A596A696A896A996AA96AB96AC96AD96AE96AF96B196B296B496B596B7 +96B896BA96BB96BF96C296C396C896CA96CB96D096D196D396D496D696D796D8 +96D996DA96DB96DC96DD96DE96DF96E196E296E396E496E596E696E796EB0000 +96EC96ED96EE96F096F196F296F496F596F896FA96FB96FC96FD96FF97029703 +9705970A970B970C97109711971297149715971797189719971A971B971D971F +9720643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19 +6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F +809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2 +80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112 +8C5A8136811E812C811881328148814C815381748159815A817181608169817C +817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +972197229723972497259726972797289729972B972C972E972F973197339734 +973597369737973A973B973C973D973F97409741974297439744974597469747 +97489749974A974B974C974D974E974F975097519754975597579758975A975C +975D975F97639764976697679768976A976B976C976D976E976F977097710000 +97729775977797789779977A977B977D977E977F978097819782978397849786 +978797889789978A978C978E978F979097939795979697979799979A979B979C +979D81C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3 +5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C +7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C +716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D +7228706C7118716671B9623E623D624362486249793B794079467949795B795C +7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +979E979F97A197A297A497A597A697A797A897A997AA97AC97AE97B097B197B3 +97B597B697B797B897B997BA97BB97BC97BD97BE97BF97C097C197C297C397C4 +97C597C697C797C897C997CA97CB97CC97CD97CE97CF97D097D197D297D397D4 +97D597D697D797D897D997DA97DB97DC97DD97DE97DF97E097E197E297E30000 +97E497E597E897EE97EF97F097F197F297F497F797F897F997FA97FB97FC97FD +97FE97FF9800980198029803980498059806980798089809980A980B980C980D +980E603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1 +62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C +781D7839783A783B781F783C7825782C78237829784E786D7856785778267850 +7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9 +78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9 +77077708771A77227719772D7726773577387750775177477743775A77680000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +980F9810981198129813981498159816981798189819981A981B981C981D981E +981F9820982198229823982498259826982798289829982A982B982C982D982E +982F9830983198329833983498359836983798389839983A983B983C983D983E +983F9840984198429843984498459846984798489849984A984B984C984D0000 +984E984F9850985198529853985498559856985798589859985A985B985C985D +985E985F9860986198629863986498659866986798689869986A986B986C986D +986E77627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 +754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81 +7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495 +949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8 +94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2 +94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +986F98709871987298739874988B988E98929895989998A398A898A998AA98AB +98AC98AD98AE98AF98B098B198B298B398B498B598B698B798B898B998BA98BB +98BC98BD98BE98BF98C098C198C298C398C498C598C698C798C898C998CA98CB +98CC98CD98CF98D098D498D698D798DB98DC98DD98E098E198E298E398E40000 +98E598E698E998EA98EB98EC98ED98EE98EF98F098F198F298F398F498F598F6 +98F798F898F998FA98FB98FC98FD98FE98FF9900990199029903990499059906 +990794E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506 +95079509950A950D950E950F951295139514951595169518951B951D951E951F +9522952A952B9529952C953195329534953695379538953C953E953F95429535 +9544954595469549954C954E954F9552955395549556955795589559955B955E +955F955D95619562956495659566956795689569956A956B956C956F95719572 +9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +99089909990A990B990C990E990F991199129913991499159916991799189919 +991A991B991C991D991E991F9920992199229923992499259926992799289929 +992A992B992C992D992F9930993199329933993499359936993799389939993A +993B993C993D993E993F99409941994299439944994599469947994899490000 +994A994B994C994D994E994F99509951995299539956995799589959995A995B +995C995D995E995F99609961996299649966997399789979997B997E99829983 +99897A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20 +9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42 +9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63 +9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC +75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB +75E7760375F175FC75FF761076007605760C7617760A76257618761576190000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +998C998E999A999B999C999D999E999F99A099A199A299A399A499A699A799A9 +99AA99AB99AC99AD99AE99AF99B099B199B299B399B499B599B699B799B899B9 +99BA99BB99BC99BD99BE99BF99C099C199C299C399C499C599C699C799C899C9 +99CA99CB99CC99CD99CE99CF99D099D199D299D399D499D599D699D799D80000 +99D999DA99DB99DC99DD99DE99DF99E099E199E299E399E499E599E699E799E8 +99E999EA99EB99EC99ED99EE99EF99F099F199F299F399F499F599F699F799F8 +99F9761B763C762276207640762D7630763F76357643763E7633764D765E7654 +765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8 +7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3 +88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941 +8966897B758B80E576B276B477DC801280148016801C80208022802580268027 +802980288031800B803580438046804D80528069807189839878988098830000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +99FA99FB99FC99FD99FE99FF9A009A019A029A039A049A059A069A079A089A09 +9A0A9A0B9A0C9A0D9A0E9A0F9A109A119A129A139A149A159A169A179A189A19 +9A1A9A1B9A1C9A1D9A1E9A1F9A209A219A229A239A249A259A269A279A289A29 +9A2A9A2B9A2C9A2D9A2E9A2F9A309A319A329A339A349A359A369A379A380000 +9A399A3A9A3B9A3C9A3D9A3E9A3F9A409A419A429A439A449A459A469A479A48 +9A499A4A9A4B9A4C9A4D9A4E9A4F9A509A519A529A539A549A559A569A579A58 +9A599889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654 +866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9 +86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3 +86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B +871E8725872E871A873E87488734873187298737873F87828722877D877E877B +87608770874C876E878B87538763877C876487598765879387AF87A887D20000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9A5A9A5B9A5C9A5D9A5E9A5F9A609A619A629A639A649A659A669A679A689A69 +9A6A9A6B9A729A839A899A8D9A8E9A949A959A999AA69AA99AAA9AAB9AAC9AAD +9AAE9AAF9AB29AB39AB49AB59AB99ABB9ABD9ABE9ABF9AC39AC49AC69AC79AC8 +9AC99ACA9ACD9ACE9ACF9AD09AD29AD49AD59AD69AD79AD99ADA9ADB9ADC0000 +9ADD9ADE9AE09AE29AE39AE49AE59AE79AE89AE99AEA9AEC9AEE9AF09AF19AF2 +9AF39AF49AF59AF69AF79AF89AFA9AFC9AFD9AFE9AFF9B009B019B029B049B05 +9B0687C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 +87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42 +7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19 +7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E +7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB +7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9B079B099B0A9B0B9B0C9B0D9B0E9B109B119B129B149B159B169B179B189B19 +9B1A9B1B9B1C9B1D9B1E9B209B219B229B249B259B269B279B289B299B2A9B2B +9B2C9B2D9B2E9B309B319B339B349B359B369B379B389B399B3A9B3D9B3E9B3F +9B409B469B4A9B4B9B4C9B4E9B509B529B539B559B569B579B589B599B5A0000 +9B5B9B5C9B5D9B5E9B5F9B609B619B629B639B649B659B669B679B689B699B6A +9B6B9B6C9B6D9B6E9B6F9B709B719B729B739B749B759B769B779B789B799B7A +9B7B7C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223 +822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268 +887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D +7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8 +7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8 +9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9B7C9B7D9B7E9B7F9B809B819B829B839B849B859B869B879B889B899B8A9B8B +9B8C9B8D9B8E9B8F9B909B919B929B939B949B959B969B979B989B999B9A9B9B +9B9C9B9D9B9E9B9F9BA09BA19BA29BA39BA49BA59BA69BA79BA89BA99BAA9BAB +9BAC9BAD9BAE9BAF9BB09BB19BB29BB39BB49BB59BB69BB79BB89BB99BBA0000 +9BBB9BBC9BBD9BBE9BBF9BC09BC19BC29BC39BC49BC59BC69BC79BC89BC99BCA +9BCB9BCC9BCD9BCE9BCF9BD09BD19BD29BD39BD49BD59BD69BD79BD89BD99BDA +9BDB9162916191709169916F917D917E917291749179918C91859190918D9191 +91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69 +8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8 +8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39 +8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F +8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9BDC9BDD9BDE9BDF9BE09BE19BE29BE39BE49BE59BE69BE79BE89BE99BEA9BEB +9BEC9BED9BEE9BEF9BF09BF19BF29BF39BF49BF59BF69BF79BF89BF99BFA9BFB +9BFC9BFD9BFE9BFF9C009C019C029C039C049C059C069C079C089C099C0A9C0B +9C0C9C0D9C0E9C0F9C109C119C129C139C149C159C169C179C189C199C1A0000 +9C1B9C1C9C1D9C1E9C1F9C209C219C229C239C249C259C269C279C289C299C2A +9C2B9C2C9C2D9C2E9C2F9C309C319C329C339C349C359C369C379C389C399C3A +9C3B89E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A +972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9 +96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F +9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E +9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2 +9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9C3C9C3D9C3E9C3F9C409C419C429C439C449C459C469C479C489C499C4A9C4B +9C4C9C4D9C4E9C4F9C509C519C529C539C549C559C569C579C589C599C5A9C5B +9C5C9C5D9C5E9C5F9C609C619C629C639C649C659C669C679C689C699C6A9C6B +9C6C9C6D9C6E9C6F9C709C719C729C739C749C759C769C779C789C799C7A0000 +9C7B9C7D9C7E9C809C839C849C899C8A9C8C9C8F9C939C969C979C989C999C9D +9CAA9CAC9CAF9CB99CBE9CBF9CC09CC19CC29CC89CC99CD19CD29CDA9CDB9CE0 +9CE19CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2 +977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA +9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8 +990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F +9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 +9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 +F8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9CE39CE49CE59CE69CE79CE89CE99CEA9CEB9CEC9CED9CEE9CEF9CF09CF19CF2 +9CF39CF49CF59CF69CF79CF89CF99CFA9CFB9CFC9CFD9CFE9CFF9D009D019D02 +9D039D049D059D069D079D089D099D0A9D0B9D0C9D0D9D0E9D0F9D109D119D12 +9D139D149D159D169D179D189D199D1A9D1B9D1C9D1D9D1E9D1F9D209D210000 +9D229D239D249D259D269D279D289D299D2A9D2B9D2C9D2D9D2E9D2F9D309D31 +9D329D339D349D359D369D379D389D399D3A9D3B9D3C9D3D9D3E9D3F9D409D41 +9D42000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +F9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9D439D449D459D469D479D489D499D4A9D4B9D4C9D4D9D4E9D4F9D509D519D52 +9D539D549D559D569D579D589D599D5A9D5B9D5C9D5D9D5E9D5F9D609D619D62 +9D639D649D659D669D679D689D699D6A9D6B9D6C9D6D9D6E9D6F9D709D719D72 +9D739D749D759D769D779D789D799D7A9D7B9D7C9D7D9D7E9D7F9D809D810000 +9D829D839D849D859D869D879D889D899D8A9D8B9D8C9D8D9D8E9D8F9D909D91 +9D929D939D949D959D969D979D989D999D9A9D9B9D9C9D9D9D9E9D9F9DA09DA1 +9DA2000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9DA39DA49DA59DA69DA79DA89DA99DAA9DAB9DAC9DAD9DAE9DAF9DB09DB19DB2 +9DB39DB49DB59DB69DB79DB89DB99DBA9DBB9DBC9DBD9DBE9DBF9DC09DC19DC2 +9DC39DC49DC59DC69DC79DC89DC99DCA9DCB9DCC9DCD9DCE9DCF9DD09DD19DD2 +9DD39DD49DD59DD69DD79DD89DD99DDA9DDB9DDC9DDD9DDE9DDF9DE09DE10000 +9DE29DE39DE49DE59DE69DE79DE89DE99DEA9DEB9DEC9DED9DEE9DEF9DF09DF1 +9DF29DF39DF49DF59DF69DF79DF89DF99DFA9DFB9DFC9DFD9DFE9DFF9E009E01 +9E02000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9E039E049E059E069E079E089E099E0A9E0B9E0C9E0D9E0E9E0F9E109E119E12 +9E139E149E159E169E179E189E199E1A9E1B9E1C9E1D9E1E9E249E279E2E9E30 +9E349E3B9E3C9E409E4D9E509E529E539E549E569E599E5D9E5F9E609E619E62 +9E659E6E9E6F9E729E749E759E769E779E789E799E7A9E7B9E7C9E7D9E800000 +9E819E839E849E859E869E899E8A9E8C9E8D9E8E9E8F9E909E919E949E959E96 +9E979E989E999E9A9E9B9E9C9E9E9EA09EA19EA29EA39EA49EA59EA79EA89EA9 +9EAA000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9EAB9EAC9EAD9EAE9EAF9EB09EB19EB29EB39EB59EB69EB79EB99EBA9EBC9EBF +9EC09EC19EC29EC39EC59EC69EC79EC89ECA9ECB9ECC9ED09ED29ED39ED59ED6 +9ED79ED99EDA9EDE9EE19EE39EE49EE69EE89EEB9EEC9EED9EEE9EF09EF19EF2 +9EF39EF49EF59EF69EF79EF89EFA9EFD9EFF9F009F019F029F039F049F050000 +9F069F079F089F099F0A9F0C9F0F9F119F129F149F159F169F189F1A9F1B9F1C +9F1D9F1E9F1F9F219F239F249F259F269F279F289F299F2A9F2B9F2D9F2E9F30 +9F31000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9F329F339F349F359F369F389F3A9F3C9F3F9F409F419F429F439F459F469F47 +9F489F499F4A9F4B9F4C9F4D9F4E9F4F9F529F539F549F559F569F579F589F59 +9F5A9F5B9F5C9F5D9F5E9F5F9F609F619F629F639F649F659F669F679F689F69 +9F6A9F6B9F6C9F6D9F6E9F6F9F709F719F729F739F749F759F769F779F780000 +9F799F7A9F7B9F7C9F7D9F7E9F819F829F8D9F8E9F8F9F909F919F929F939F94 +9F959F969F979F989F9C9F9D9F9E9FA19FA29FA39FA49FA5F92CF979F995F9E7 +F9F1000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FA0CFA0DFA0EFA0FFA11FA13FA14FA18FA1FFA20FA21FA23FA24FA27FA28FA29 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp949.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp949.enc new file mode 100644 index 00000000..2f3ec39f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp949.enc @@ -0,0 +1,2128 @@ +# Encoding file: cp949, multi-byte +M +003F 0 125 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +81 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AC02AC03AC05AC06AC0BAC0CAC0DAC0EAC0FAC18AC1EAC1FAC21AC22AC23 +AC25AC26AC27AC28AC29AC2AAC2BAC2EAC32AC33AC3400000000000000000000 +0000AC35AC36AC37AC3AAC3BAC3DAC3EAC3FAC41AC42AC43AC44AC45AC46AC47 +AC48AC49AC4AAC4CAC4EAC4FAC50AC51AC52AC53AC5500000000000000000000 +0000AC56AC57AC59AC5AAC5BAC5DAC5EAC5FAC60AC61AC62AC63AC64AC65AC66 +AC67AC68AC69AC6AAC6BAC6CAC6DAC6EAC6FAC72AC73AC75AC76AC79AC7BAC7C +AC7DAC7EAC7FAC82AC87AC88AC8DAC8EAC8FAC91AC92AC93AC95AC96AC97AC98 +AC99AC9AAC9BAC9EACA2ACA3ACA4ACA5ACA6ACA7ACABACADACAEACB1ACB2ACB3 +ACB4ACB5ACB6ACB7ACBAACBEACBFACC0ACC2ACC3ACC5ACC6ACC7ACC9ACCAACCB +ACCDACCEACCFACD0ACD1ACD2ACD3ACD4ACD6ACD8ACD9ACDAACDBACDCACDDACDE +ACDFACE2ACE3ACE5ACE6ACE9ACEBACEDACEEACF2ACF4ACF7ACF8ACF9ACFAACFB +ACFEACFFAD01AD02AD03AD05AD07AD08AD09AD0AAD0BAD0EAD10AD12AD130000 +82 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AD14AD15AD16AD17AD19AD1AAD1BAD1DAD1EAD1FAD21AD22AD23AD24AD25 +AD26AD27AD28AD2AAD2BAD2EAD2FAD30AD31AD32AD3300000000000000000000 +0000AD36AD37AD39AD3AAD3BAD3DAD3EAD3FAD40AD41AD42AD43AD46AD48AD4A +AD4BAD4CAD4DAD4EAD4FAD51AD52AD53AD55AD56AD5700000000000000000000 +0000AD59AD5AAD5BAD5CAD5DAD5EAD5FAD60AD62AD64AD65AD66AD67AD68AD69 +AD6AAD6BAD6EAD6FAD71AD72AD77AD78AD79AD7AAD7EAD80AD83AD84AD85AD86 +AD87AD8AAD8BAD8DAD8EAD8FAD91AD92AD93AD94AD95AD96AD97AD98AD99AD9A +AD9BAD9EAD9FADA0ADA1ADA2ADA3ADA5ADA6ADA7ADA8ADA9ADAAADABADACADAD +ADAEADAFADB0ADB1ADB2ADB3ADB4ADB5ADB6ADB8ADB9ADBAADBBADBCADBDADBE +ADBFADC2ADC3ADC5ADC6ADC7ADC9ADCAADCBADCCADCDADCEADCFADD2ADD4ADD5 +ADD6ADD7ADD8ADD9ADDAADDBADDDADDEADDFADE1ADE2ADE3ADE5ADE6ADE7ADE8 +ADE9ADEAADEBADECADEDADEEADEFADF0ADF1ADF2ADF3ADF4ADF5ADF6ADF70000 +83 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000ADFAADFBADFDADFEAE02AE03AE04AE05AE06AE07AE0AAE0CAE0EAE0FAE10 +AE11AE12AE13AE15AE16AE17AE18AE19AE1AAE1BAE1C00000000000000000000 +0000AE1DAE1EAE1FAE20AE21AE22AE23AE24AE25AE26AE27AE28AE29AE2AAE2B +AE2CAE2DAE2EAE2FAE32AE33AE35AE36AE39AE3BAE3C00000000000000000000 +0000AE3DAE3EAE3FAE42AE44AE47AE48AE49AE4BAE4FAE51AE52AE53AE55AE57 +AE58AE59AE5AAE5BAE5EAE62AE63AE64AE66AE67AE6AAE6BAE6DAE6EAE6FAE71 +AE72AE73AE74AE75AE76AE77AE7AAE7EAE7FAE80AE81AE82AE83AE86AE87AE88 +AE89AE8AAE8BAE8DAE8EAE8FAE90AE91AE92AE93AE94AE95AE96AE97AE98AE99 +AE9AAE9BAE9CAE9DAE9EAE9FAEA0AEA1AEA2AEA3AEA4AEA5AEA6AEA7AEA8AEA9 +AEAAAEABAEACAEADAEAEAEAFAEB0AEB1AEB2AEB3AEB4AEB5AEB6AEB7AEB8AEB9 +AEBAAEBBAEBFAEC1AEC2AEC3AEC5AEC6AEC7AEC8AEC9AECAAECBAECEAED2AED3 +AED4AED5AED6AED7AEDAAEDBAEDDAEDEAEDFAEE0AEE1AEE2AEE3AEE4AEE50000 +84 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AEE6AEE7AEE9AEEAAEECAEEEAEEFAEF0AEF1AEF2AEF3AEF5AEF6AEF7AEF9 +AEFAAEFBAEFDAEFEAEFFAF00AF01AF02AF03AF04AF0500000000000000000000 +0000AF06AF09AF0AAF0BAF0CAF0EAF0FAF11AF12AF13AF14AF15AF16AF17AF18 +AF19AF1AAF1BAF1CAF1DAF1EAF1FAF20AF21AF22AF2300000000000000000000 +0000AF24AF25AF26AF27AF28AF29AF2AAF2BAF2EAF2FAF31AF33AF35AF36AF37 +AF38AF39AF3AAF3BAF3EAF40AF44AF45AF46AF47AF4AAF4BAF4CAF4DAF4EAF4F +AF51AF52AF53AF54AF55AF56AF57AF58AF59AF5AAF5BAF5EAF5FAF60AF61AF62 +AF63AF66AF67AF68AF69AF6AAF6BAF6CAF6DAF6EAF6FAF70AF71AF72AF73AF74 +AF75AF76AF77AF78AF7AAF7BAF7CAF7DAF7EAF7FAF81AF82AF83AF85AF86AF87 +AF89AF8AAF8BAF8CAF8DAF8EAF8FAF92AF93AF94AF96AF97AF98AF99AF9AAF9B +AF9DAF9EAF9FAFA0AFA1AFA2AFA3AFA4AFA5AFA6AFA7AFA8AFA9AFAAAFABAFAC +AFADAFAEAFAFAFB0AFB1AFB2AFB3AFB4AFB5AFB6AFB7AFBAAFBBAFBDAFBE0000 +85 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AFBFAFC1AFC2AFC3AFC4AFC5AFC6AFCAAFCCAFCFAFD0AFD1AFD2AFD3AFD5 +AFD6AFD7AFD8AFD9AFDAAFDBAFDDAFDEAFDFAFE0AFE100000000000000000000 +0000AFE2AFE3AFE4AFE5AFE6AFE7AFEAAFEBAFECAFEDAFEEAFEFAFF2AFF3AFF5 +AFF6AFF7AFF9AFFAAFFBAFFCAFFDAFFEAFFFB002B00300000000000000000000 +0000B005B006B007B008B009B00AB00BB00DB00EB00FB011B012B013B015B016 +B017B018B019B01AB01BB01EB01FB020B021B022B023B024B025B026B027B029 +B02AB02BB02CB02DB02EB02FB030B031B032B033B034B035B036B037B038B039 +B03AB03BB03CB03DB03EB03FB040B041B042B043B046B047B049B04BB04DB04F +B050B051B052B056B058B05AB05BB05CB05EB05FB060B061B062B063B064B065 +B066B067B068B069B06AB06BB06CB06DB06EB06FB070B071B072B073B074B075 +B076B077B078B079B07AB07BB07EB07FB081B082B083B085B086B087B088B089 +B08AB08BB08EB090B092B093B094B095B096B097B09BB09DB09EB0A3B0A40000 +86 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B0A5B0A6B0A7B0AAB0B0B0B2B0B6B0B7B0B9B0BAB0BBB0BDB0BEB0BFB0C0 +B0C1B0C2B0C3B0C6B0CAB0CBB0CCB0CDB0CEB0CFB0D200000000000000000000 +0000B0D3B0D5B0D6B0D7B0D9B0DAB0DBB0DCB0DDB0DEB0DFB0E1B0E2B0E3B0E4 +B0E6B0E7B0E8B0E9B0EAB0EBB0ECB0EDB0EEB0EFB0F000000000000000000000 +0000B0F1B0F2B0F3B0F4B0F5B0F6B0F7B0F8B0F9B0FAB0FBB0FCB0FDB0FEB0FF +B100B101B102B103B104B105B106B107B10AB10DB10EB10FB111B114B115B116 +B117B11AB11EB11FB120B121B122B126B127B129B12AB12BB12DB12EB12FB130 +B131B132B133B136B13AB13BB13CB13DB13EB13FB142B143B145B146B147B149 +B14AB14BB14CB14DB14EB14FB152B153B156B157B159B15AB15BB15DB15EB15F +B161B162B163B164B165B166B167B168B169B16AB16BB16CB16DB16EB16FB170 +B171B172B173B174B175B176B177B17AB17BB17DB17EB17FB181B183B184B185 +B186B187B18AB18CB18EB18FB190B191B195B196B197B199B19AB19BB19D0000 +87 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B19EB19FB1A0B1A1B1A2B1A3B1A4B1A5B1A6B1A7B1A9B1AAB1ABB1ACB1AD +B1AEB1AFB1B0B1B1B1B2B1B3B1B4B1B5B1B6B1B7B1B800000000000000000000 +0000B1B9B1BAB1BBB1BCB1BDB1BEB1BFB1C0B1C1B1C2B1C3B1C4B1C5B1C6B1C7 +B1C8B1C9B1CAB1CBB1CDB1CEB1CFB1D1B1D2B1D3B1D500000000000000000000 +0000B1D6B1D7B1D8B1D9B1DAB1DBB1DEB1E0B1E1B1E2B1E3B1E4B1E5B1E6B1E7 +B1EAB1EBB1EDB1EEB1EFB1F1B1F2B1F3B1F4B1F5B1F6B1F7B1F8B1FAB1FCB1FE +B1FFB200B201B202B203B206B207B209B20AB20DB20EB20FB210B211B212B213 +B216B218B21AB21BB21CB21DB21EB21FB221B222B223B224B225B226B227B228 +B229B22AB22BB22CB22DB22EB22FB230B231B232B233B235B236B237B238B239 +B23AB23BB23DB23EB23FB240B241B242B243B244B245B246B247B248B249B24A +B24BB24CB24DB24EB24FB250B251B252B253B254B255B256B257B259B25AB25B +B25DB25EB25FB261B262B263B264B265B266B267B26AB26BB26CB26DB26E0000 +88 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B26FB270B271B272B273B276B277B278B279B27AB27BB27DB27EB27FB280 +B281B282B283B286B287B288B28AB28BB28CB28DB28E00000000000000000000 +0000B28FB292B293B295B296B297B29BB29CB29DB29EB29FB2A2B2A4B2A7B2A8 +B2A9B2ABB2ADB2AEB2AFB2B1B2B2B2B3B2B5B2B6B2B700000000000000000000 +0000B2B8B2B9B2BAB2BBB2BCB2BDB2BEB2BFB2C0B2C1B2C2B2C3B2C4B2C5B2C6 +B2C7B2CAB2CBB2CDB2CEB2CFB2D1B2D3B2D4B2D5B2D6B2D7B2DAB2DCB2DEB2DF +B2E0B2E1B2E3B2E7B2E9B2EAB2F0B2F1B2F2B2F6B2FCB2FDB2FEB302B303B305 +B306B307B309B30AB30BB30CB30DB30EB30FB312B316B317B318B319B31AB31B +B31DB31EB31FB320B321B322B323B324B325B326B327B328B329B32AB32BB32C +B32DB32EB32FB330B331B332B333B334B335B336B337B338B339B33AB33BB33C +B33DB33EB33FB340B341B342B343B344B345B346B347B348B349B34AB34BB34C +B34DB34EB34FB350B351B352B353B357B359B35AB35DB360B361B362B3630000 +89 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B366B368B36AB36CB36DB36FB372B373B375B376B377B379B37AB37BB37C +B37DB37EB37FB382B386B387B388B389B38AB38BB38D00000000000000000000 +0000B38EB38FB391B392B393B395B396B397B398B399B39AB39BB39CB39DB39E +B39FB3A2B3A3B3A4B3A5B3A6B3A7B3A9B3AAB3ABB3AD00000000000000000000 +0000B3AEB3AFB3B0B3B1B3B2B3B3B3B4B3B5B3B6B3B7B3B8B3B9B3BAB3BBB3BC +B3BDB3BEB3BFB3C0B3C1B3C2B3C3B3C6B3C7B3C9B3CAB3CDB3CFB3D1B3D2B3D3 +B3D6B3D8B3DAB3DCB3DEB3DFB3E1B3E2B3E3B3E5B3E6B3E7B3E9B3EAB3EBB3EC +B3EDB3EEB3EFB3F0B3F1B3F2B3F3B3F4B3F5B3F6B3F7B3F8B3F9B3FAB3FBB3FD +B3FEB3FFB400B401B402B403B404B405B406B407B408B409B40AB40BB40CB40D +B40EB40FB411B412B413B414B415B416B417B419B41AB41BB41DB41EB41FB421 +B422B423B424B425B426B427B42AB42CB42DB42EB42FB430B431B432B433B435 +B436B437B438B439B43AB43BB43CB43DB43EB43FB440B441B442B443B4440000 +8A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B445B446B447B448B449B44AB44BB44CB44DB44EB44FB452B453B455B456 +B457B459B45AB45BB45CB45DB45EB45FB462B464B46600000000000000000000 +0000B467B468B469B46AB46BB46DB46EB46FB470B471B472B473B474B475B476 +B477B478B479B47AB47BB47CB47DB47EB47FB481B48200000000000000000000 +0000B483B484B485B486B487B489B48AB48BB48CB48DB48EB48FB490B491B492 +B493B494B495B496B497B498B499B49AB49BB49CB49EB49FB4A0B4A1B4A2B4A3 +B4A5B4A6B4A7B4A9B4AAB4ABB4ADB4AEB4AFB4B0B4B1B4B2B4B3B4B4B4B6B4B8 +B4BAB4BBB4BCB4BDB4BEB4BFB4C1B4C2B4C3B4C5B4C6B4C7B4C9B4CAB4CBB4CC +B4CDB4CEB4CFB4D1B4D2B4D3B4D4B4D6B4D7B4D8B4D9B4DAB4DBB4DEB4DFB4E1 +B4E2B4E5B4E7B4E8B4E9B4EAB4EBB4EEB4F0B4F2B4F3B4F4B4F5B4F6B4F7B4F9 +B4FAB4FBB4FCB4FDB4FEB4FFB500B501B502B503B504B505B506B507B508B509 +B50AB50BB50CB50DB50EB50FB510B511B512B513B516B517B519B51AB51D0000 +8B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B51EB51FB520B521B522B523B526B52BB52CB52DB52EB52FB532B533B535 +B536B537B539B53AB53BB53CB53DB53EB53FB542B54600000000000000000000 +0000B547B548B549B54AB54EB54FB551B552B553B555B556B557B558B559B55A +B55BB55EB562B563B564B565B566B567B568B569B56A00000000000000000000 +0000B56BB56CB56DB56EB56FB570B571B572B573B574B575B576B577B578B579 +B57AB57BB57CB57DB57EB57FB580B581B582B583B584B585B586B587B588B589 +B58AB58BB58CB58DB58EB58FB590B591B592B593B594B595B596B597B598B599 +B59AB59BB59CB59DB59EB59FB5A2B5A3B5A5B5A6B5A7B5A9B5ACB5ADB5AEB5AF +B5B2B5B6B5B7B5B8B5B9B5BAB5BEB5BFB5C1B5C2B5C3B5C5B5C6B5C7B5C8B5C9 +B5CAB5CBB5CEB5D2B5D3B5D4B5D5B5D6B5D7B5D9B5DAB5DBB5DCB5DDB5DEB5DF +B5E0B5E1B5E2B5E3B5E4B5E5B5E6B5E7B5E8B5E9B5EAB5EBB5EDB5EEB5EFB5F0 +B5F1B5F2B5F3B5F4B5F5B5F6B5F7B5F8B5F9B5FAB5FBB5FCB5FDB5FEB5FF0000 +8C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B600B601B602B603B604B605B606B607B608B609B60AB60BB60CB60DB60E +B60FB612B613B615B616B617B619B61AB61BB61CB61D00000000000000000000 +0000B61EB61FB620B621B622B623B624B626B627B628B629B62AB62BB62DB62E +B62FB630B631B632B633B635B636B637B638B639B63A00000000000000000000 +0000B63BB63CB63DB63EB63FB640B641B642B643B644B645B646B647B649B64A +B64BB64CB64DB64EB64FB650B651B652B653B654B655B656B657B658B659B65A +B65BB65CB65DB65EB65FB660B661B662B663B665B666B667B669B66AB66BB66C +B66DB66EB66FB670B671B672B673B674B675B676B677B678B679B67AB67BB67C +B67DB67EB67FB680B681B682B683B684B685B686B687B688B689B68AB68BB68C +B68DB68EB68FB690B691B692B693B694B695B696B697B698B699B69AB69BB69E +B69FB6A1B6A2B6A3B6A5B6A6B6A7B6A8B6A9B6AAB6ADB6AEB6AFB6B0B6B2B6B3 +B6B4B6B5B6B6B6B7B6B8B6B9B6BAB6BBB6BCB6BDB6BEB6BFB6C0B6C1B6C20000 +8D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B6C3B6C4B6C5B6C6B6C7B6C8B6C9B6CAB6CBB6CCB6CDB6CEB6CFB6D0B6D1 +B6D2B6D3B6D5B6D6B6D7B6D8B6D9B6DAB6DBB6DCB6DD00000000000000000000 +0000B6DEB6DFB6E0B6E1B6E2B6E3B6E4B6E5B6E6B6E7B6E8B6E9B6EAB6EBB6EC +B6EDB6EEB6EFB6F1B6F2B6F3B6F5B6F6B6F7B6F9B6FA00000000000000000000 +0000B6FBB6FCB6FDB6FEB6FFB702B703B704B706B707B708B709B70AB70BB70C +B70DB70EB70FB710B711B712B713B714B715B716B717B718B719B71AB71BB71C +B71DB71EB71FB720B721B722B723B724B725B726B727B72AB72BB72DB72EB731 +B732B733B734B735B736B737B73AB73CB73DB73EB73FB740B741B742B743B745 +B746B747B749B74AB74BB74DB74EB74FB750B751B752B753B756B757B758B759 +B75AB75BB75CB75DB75EB75FB761B762B763B765B766B767B769B76AB76BB76C +B76DB76EB76FB772B774B776B777B778B779B77AB77BB77EB77FB781B782B783 +B785B786B787B788B789B78AB78BB78EB793B794B795B79AB79BB79DB79E0000 +8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B79FB7A1B7A2B7A3B7A4B7A5B7A6B7A7B7AAB7AEB7AFB7B0B7B1B7B2B7B3 +B7B6B7B7B7B9B7BAB7BBB7BCB7BDB7BEB7BFB7C0B7C100000000000000000000 +0000B7C2B7C3B7C4B7C5B7C6B7C8B7CAB7CBB7CCB7CDB7CEB7CFB7D0B7D1B7D2 +B7D3B7D4B7D5B7D6B7D7B7D8B7D9B7DAB7DBB7DCB7DD00000000000000000000 +0000B7DEB7DFB7E0B7E1B7E2B7E3B7E4B7E5B7E6B7E7B7E8B7E9B7EAB7EBB7EE +B7EFB7F1B7F2B7F3B7F5B7F6B7F7B7F8B7F9B7FAB7FBB7FEB802B803B804B805 +B806B80AB80BB80DB80EB80FB811B812B813B814B815B816B817B81AB81CB81E +B81FB820B821B822B823B826B827B829B82AB82BB82DB82EB82FB830B831B832 +B833B836B83AB83BB83CB83DB83EB83FB841B842B843B845B846B847B848B849 +B84AB84BB84CB84DB84EB84FB850B852B854B855B856B857B858B859B85AB85B +B85EB85FB861B862B863B865B866B867B868B869B86AB86BB86EB870B872B873 +B874B875B876B877B879B87AB87BB87DB87EB87FB880B881B882B883B8840000 +8F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B885B886B887B888B889B88AB88BB88CB88EB88FB890B891B892B893B894 +B895B896B897B898B899B89AB89BB89CB89DB89EB89F00000000000000000000 +0000B8A0B8A1B8A2B8A3B8A4B8A5B8A6B8A7B8A9B8AAB8ABB8ACB8ADB8AEB8AF +B8B1B8B2B8B3B8B5B8B6B8B7B8B9B8BAB8BBB8BCB8BD00000000000000000000 +0000B8BEB8BFB8C2B8C4B8C6B8C7B8C8B8C9B8CAB8CBB8CDB8CEB8CFB8D1B8D2 +B8D3B8D5B8D6B8D7B8D8B8D9B8DAB8DBB8DCB8DEB8E0B8E2B8E3B8E4B8E5B8E6 +B8E7B8EAB8EBB8EDB8EEB8EFB8F1B8F2B8F3B8F4B8F5B8F6B8F7B8FAB8FCB8FE +B8FFB900B901B902B903B905B906B907B908B909B90AB90BB90CB90DB90EB90F +B910B911B912B913B914B915B916B917B919B91AB91BB91CB91DB91EB91FB921 +B922B923B924B925B926B927B928B929B92AB92BB92CB92DB92EB92FB930B931 +B932B933B934B935B936B937B938B939B93AB93BB93EB93FB941B942B943B945 +B946B947B948B949B94AB94BB94DB94EB950B952B953B954B955B956B9570000 +90 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B95AB95BB95DB95EB95FB961B962B963B964B965B966B967B96AB96CB96E +B96FB970B971B972B973B976B977B979B97AB97BB97D00000000000000000000 +0000B97EB97FB980B981B982B983B986B988B98BB98CB98FB990B991B992B993 +B994B995B996B997B998B999B99AB99BB99CB99DB99E00000000000000000000 +0000B99FB9A0B9A1B9A2B9A3B9A4B9A5B9A6B9A7B9A8B9A9B9AAB9ABB9AEB9AF +B9B1B9B2B9B3B9B5B9B6B9B7B9B8B9B9B9BAB9BBB9BEB9C0B9C2B9C3B9C4B9C5 +B9C6B9C7B9CAB9CBB9CDB9D3B9D4B9D5B9D6B9D7B9DAB9DCB9DFB9E0B9E2B9E6 +B9E7B9E9B9EAB9EBB9EDB9EEB9EFB9F0B9F1B9F2B9F3B9F6B9FBB9FCB9FDB9FE +B9FFBA02BA03BA04BA05BA06BA07BA09BA0ABA0BBA0CBA0DBA0EBA0FBA10BA11 +BA12BA13BA14BA16BA17BA18BA19BA1ABA1BBA1CBA1DBA1EBA1FBA20BA21BA22 +BA23BA24BA25BA26BA27BA28BA29BA2ABA2BBA2CBA2DBA2EBA2FBA30BA31BA32 +BA33BA34BA35BA36BA37BA3ABA3BBA3DBA3EBA3FBA41BA43BA44BA45BA460000 +91 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BA47BA4ABA4CBA4FBA50BA51BA52BA56BA57BA59BA5ABA5BBA5DBA5EBA5F +BA60BA61BA62BA63BA66BA6ABA6BBA6CBA6DBA6EBA6F00000000000000000000 +0000BA72BA73BA75BA76BA77BA79BA7ABA7BBA7CBA7DBA7EBA7FBA80BA81BA82 +BA86BA88BA89BA8ABA8BBA8DBA8EBA8FBA90BA91BA9200000000000000000000 +0000BA93BA94BA95BA96BA97BA98BA99BA9ABA9BBA9CBA9DBA9EBA9FBAA0BAA1 +BAA2BAA3BAA4BAA5BAA6BAA7BAAABAADBAAEBAAFBAB1BAB3BAB4BAB5BAB6BAB7 +BABABABCBABEBABFBAC0BAC1BAC2BAC3BAC5BAC6BAC7BAC9BACABACBBACCBACD +BACEBACFBAD0BAD1BAD2BAD3BAD4BAD5BAD6BAD7BADABADBBADCBADDBADEBADF +BAE0BAE1BAE2BAE3BAE4BAE5BAE6BAE7BAE8BAE9BAEABAEBBAECBAEDBAEEBAEF +BAF0BAF1BAF2BAF3BAF4BAF5BAF6BAF7BAF8BAF9BAFABAFBBAFDBAFEBAFFBB01 +BB02BB03BB05BB06BB07BB08BB09BB0ABB0BBB0CBB0EBB10BB12BB13BB14BB15 +BB16BB17BB19BB1ABB1BBB1DBB1EBB1FBB21BB22BB23BB24BB25BB26BB270000 +92 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BB28BB2ABB2CBB2DBB2EBB2FBB30BB31BB32BB33BB37BB39BB3ABB3FBB40 +BB41BB42BB43BB46BB48BB4ABB4BBB4CBB4EBB51BB5200000000000000000000 +0000BB53BB55BB56BB57BB59BB5ABB5BBB5CBB5DBB5EBB5FBB60BB62BB64BB65 +BB66BB67BB68BB69BB6ABB6BBB6DBB6EBB6FBB70BB7100000000000000000000 +0000BB72BB73BB74BB75BB76BB77BB78BB79BB7ABB7BBB7CBB7DBB7EBB7FBB80 +BB81BB82BB83BB84BB85BB86BB87BB89BB8ABB8BBB8DBB8EBB8FBB91BB92BB93 +BB94BB95BB96BB97BB98BB99BB9ABB9BBB9CBB9DBB9EBB9FBBA0BBA1BBA2BBA3 +BBA5BBA6BBA7BBA9BBAABBABBBADBBAEBBAFBBB0BBB1BBB2BBB3BBB5BBB6BBB8 +BBB9BBBABBBBBBBCBBBDBBBEBBBFBBC1BBC2BBC3BBC5BBC6BBC7BBC9BBCABBCB +BBCCBBCDBBCEBBCFBBD1BBD2BBD4BBD5BBD6BBD7BBD8BBD9BBDABBDBBBDCBBDD +BBDEBBDFBBE0BBE1BBE2BBE3BBE4BBE5BBE6BBE7BBE8BBE9BBEABBEBBBECBBED +BBEEBBEFBBF0BBF1BBF2BBF3BBF4BBF5BBF6BBF7BBFABBFBBBFDBBFEBC010000 +93 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BC03BC04BC05BC06BC07BC0ABC0EBC10BC12BC13BC19BC1ABC20BC21BC22 +BC23BC26BC28BC2ABC2BBC2CBC2EBC2FBC32BC33BC3500000000000000000000 +0000BC36BC37BC39BC3ABC3BBC3CBC3DBC3EBC3FBC42BC46BC47BC48BC4ABC4B +BC4EBC4FBC51BC52BC53BC54BC55BC56BC57BC58BC5900000000000000000000 +0000BC5ABC5BBC5CBC5EBC5FBC60BC61BC62BC63BC64BC65BC66BC67BC68BC69 +BC6ABC6BBC6CBC6DBC6EBC6FBC70BC71BC72BC73BC74BC75BC76BC77BC78BC79 +BC7ABC7BBC7CBC7DBC7EBC7FBC80BC81BC82BC83BC86BC87BC89BC8ABC8DBC8F +BC90BC91BC92BC93BC96BC98BC9BBC9CBC9DBC9EBC9FBCA2BCA3BCA5BCA6BCA9 +BCAABCABBCACBCADBCAEBCAFBCB2BCB6BCB7BCB8BCB9BCBABCBBBCBEBCBFBCC1 +BCC2BCC3BCC5BCC6BCC7BCC8BCC9BCCABCCBBCCCBCCEBCD2BCD3BCD4BCD6BCD7 +BCD9BCDABCDBBCDDBCDEBCDFBCE0BCE1BCE2BCE3BCE4BCE5BCE6BCE7BCE8BCE9 +BCEABCEBBCECBCEDBCEEBCEFBCF0BCF1BCF2BCF3BCF7BCF9BCFABCFBBCFD0000 +94 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BCFEBCFFBD00BD01BD02BD03BD06BD08BD0ABD0BBD0CBD0DBD0EBD0FBD11 +BD12BD13BD15BD16BD17BD18BD19BD1ABD1BBD1CBD1D00000000000000000000 +0000BD1EBD1FBD20BD21BD22BD23BD25BD26BD27BD28BD29BD2ABD2BBD2DBD2E +BD2FBD30BD31BD32BD33BD34BD35BD36BD37BD38BD3900000000000000000000 +0000BD3ABD3BBD3CBD3DBD3EBD3FBD41BD42BD43BD44BD45BD46BD47BD4ABD4B +BD4DBD4EBD4FBD51BD52BD53BD54BD55BD56BD57BD5ABD5BBD5CBD5DBD5EBD5F +BD60BD61BD62BD63BD65BD66BD67BD69BD6ABD6BBD6CBD6DBD6EBD6FBD70BD71 +BD72BD73BD74BD75BD76BD77BD78BD79BD7ABD7BBD7CBD7DBD7EBD7FBD82BD83 +BD85BD86BD8BBD8CBD8DBD8EBD8FBD92BD94BD96BD97BD98BD9BBD9DBD9EBD9F +BDA0BDA1BDA2BDA3BDA5BDA6BDA7BDA8BDA9BDAABDABBDACBDADBDAEBDAFBDB1 +BDB2BDB3BDB4BDB5BDB6BDB7BDB9BDBABDBBBDBCBDBDBDBEBDBFBDC0BDC1BDC2 +BDC3BDC4BDC5BDC6BDC7BDC8BDC9BDCABDCBBDCCBDCDBDCEBDCFBDD0BDD10000 +95 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BDD2BDD3BDD6BDD7BDD9BDDABDDBBDDDBDDEBDDFBDE0BDE1BDE2BDE3BDE4 +BDE5BDE6BDE7BDE8BDEABDEBBDECBDEDBDEEBDEFBDF100000000000000000000 +0000BDF2BDF3BDF5BDF6BDF7BDF9BDFABDFBBDFCBDFDBDFEBDFFBE01BE02BE04 +BE06BE07BE08BE09BE0ABE0BBE0EBE0FBE11BE12BE1300000000000000000000 +0000BE15BE16BE17BE18BE19BE1ABE1BBE1EBE20BE21BE22BE23BE24BE25BE26 +BE27BE28BE29BE2ABE2BBE2CBE2DBE2EBE2FBE30BE31BE32BE33BE34BE35BE36 +BE37BE38BE39BE3ABE3BBE3CBE3DBE3EBE3FBE40BE41BE42BE43BE46BE47BE49 +BE4ABE4BBE4DBE4FBE50BE51BE52BE53BE56BE58BE5CBE5DBE5EBE5FBE62BE63 +BE65BE66BE67BE69BE6BBE6CBE6DBE6EBE6FBE72BE76BE77BE78BE79BE7ABE7E +BE7FBE81BE82BE83BE85BE86BE87BE88BE89BE8ABE8BBE8EBE92BE93BE94BE95 +BE96BE97BE9ABE9BBE9CBE9DBE9EBE9FBEA0BEA1BEA2BEA3BEA4BEA5BEA6BEA7 +BEA9BEAABEABBEACBEADBEAEBEAFBEB0BEB1BEB2BEB3BEB4BEB5BEB6BEB70000 +96 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BEB8BEB9BEBABEBBBEBCBEBDBEBEBEBFBEC0BEC1BEC2BEC3BEC4BEC5BEC6 +BEC7BEC8BEC9BECABECBBECCBECDBECEBECFBED2BED300000000000000000000 +0000BED5BED6BED9BEDABEDBBEDCBEDDBEDEBEDFBEE1BEE2BEE6BEE7BEE8BEE9 +BEEABEEBBEEDBEEEBEEFBEF0BEF1BEF2BEF3BEF4BEF500000000000000000000 +0000BEF6BEF7BEF8BEF9BEFABEFBBEFCBEFDBEFEBEFFBF00BF02BF03BF04BF05 +BF06BF07BF0ABF0BBF0CBF0DBF0EBF0FBF10BF11BF12BF13BF14BF15BF16BF17 +BF1ABF1EBF1FBF20BF21BF22BF23BF24BF25BF26BF27BF28BF29BF2ABF2BBF2C +BF2DBF2EBF2FBF30BF31BF32BF33BF34BF35BF36BF37BF38BF39BF3ABF3BBF3C +BF3DBF3EBF3FBF42BF43BF45BF46BF47BF49BF4ABF4BBF4CBF4DBF4EBF4FBF52 +BF53BF54BF56BF57BF58BF59BF5ABF5BBF5CBF5DBF5EBF5FBF60BF61BF62BF63 +BF64BF65BF66BF67BF68BF69BF6ABF6BBF6CBF6DBF6EBF6FBF70BF71BF72BF73 +BF74BF75BF76BF77BF78BF79BF7ABF7BBF7CBF7DBF7EBF7FBF80BF81BF820000 +97 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BF83BF84BF85BF86BF87BF88BF89BF8ABF8BBF8CBF8DBF8EBF8FBF90BF91 +BF92BF93BF95BF96BF97BF98BF99BF9ABF9BBF9CBF9D00000000000000000000 +0000BF9EBF9FBFA0BFA1BFA2BFA3BFA4BFA5BFA6BFA7BFA8BFA9BFAABFABBFAC +BFADBFAEBFAFBFB1BFB2BFB3BFB4BFB5BFB6BFB7BFB800000000000000000000 +0000BFB9BFBABFBBBFBCBFBDBFBEBFBFBFC0BFC1BFC2BFC3BFC4BFC6BFC7BFC8 +BFC9BFCABFCBBFCEBFCFBFD1BFD2BFD3BFD5BFD6BFD7BFD8BFD9BFDABFDBBFDD +BFDEBFE0BFE2BFE3BFE4BFE5BFE6BFE7BFE8BFE9BFEABFEBBFECBFEDBFEEBFEF +BFF0BFF1BFF2BFF3BFF4BFF5BFF6BFF7BFF8BFF9BFFABFFBBFFCBFFDBFFEBFFF +C000C001C002C003C004C005C006C007C008C009C00AC00BC00CC00DC00EC00F +C010C011C012C013C014C015C016C017C018C019C01AC01BC01CC01DC01EC01F +C020C021C022C023C024C025C026C027C028C029C02AC02BC02CC02DC02EC02F +C030C031C032C033C034C035C036C037C038C039C03AC03BC03DC03EC03F0000 +98 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C040C041C042C043C044C045C046C047C048C049C04AC04BC04CC04DC04E +C04FC050C052C053C054C055C056C057C059C05AC05B00000000000000000000 +0000C05DC05EC05FC061C062C063C064C065C066C067C06AC06BC06CC06DC06E +C06FC070C071C072C073C074C075C076C077C078C07900000000000000000000 +0000C07AC07BC07CC07DC07EC07FC080C081C082C083C084C085C086C087C088 +C089C08AC08BC08CC08DC08EC08FC092C093C095C096C097C099C09AC09BC09C +C09DC09EC09FC0A2C0A4C0A6C0A7C0A8C0A9C0AAC0ABC0AEC0B1C0B2C0B7C0B8 +C0B9C0BAC0BBC0BEC0C2C0C3C0C4C0C6C0C7C0CAC0CBC0CDC0CEC0CFC0D1C0D2 +C0D3C0D4C0D5C0D6C0D7C0DAC0DEC0DFC0E0C0E1C0E2C0E3C0E6C0E7C0E9C0EA +C0EBC0EDC0EEC0EFC0F0C0F1C0F2C0F3C0F6C0F8C0FAC0FBC0FCC0FDC0FEC0FF +C101C102C103C105C106C107C109C10AC10BC10CC10DC10EC10FC111C112C113 +C114C116C117C118C119C11AC11BC121C122C125C128C129C12AC12BC12E0000 +99 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C132C133C134C135C137C13AC13BC13DC13EC13FC141C142C143C144C145 +C146C147C14AC14EC14FC150C151C152C153C156C15700000000000000000000 +0000C159C15AC15BC15DC15EC15FC160C161C162C163C166C16AC16BC16CC16D +C16EC16FC171C172C173C175C176C177C179C17AC17B00000000000000000000 +0000C17CC17DC17EC17FC180C181C182C183C184C186C187C188C189C18AC18B +C18FC191C192C193C195C197C198C199C19AC19BC19EC1A0C1A2C1A3C1A4C1A6 +C1A7C1AAC1ABC1ADC1AEC1AFC1B1C1B2C1B3C1B4C1B5C1B6C1B7C1B8C1B9C1BA +C1BBC1BCC1BEC1BFC1C0C1C1C1C2C1C3C1C5C1C6C1C7C1C9C1CAC1CBC1CDC1CE +C1CFC1D0C1D1C1D2C1D3C1D5C1D6C1D9C1DAC1DBC1DCC1DDC1DEC1DFC1E1C1E2 +C1E3C1E5C1E6C1E7C1E9C1EAC1EBC1ECC1EDC1EEC1EFC1F2C1F4C1F5C1F6C1F7 +C1F8C1F9C1FAC1FBC1FEC1FFC201C202C203C205C206C207C208C209C20AC20B +C20EC210C212C213C214C215C216C217C21AC21BC21DC21EC221C222C2230000 +9A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C224C225C226C227C22AC22CC22EC230C233C235C236C237C238C239C23A +C23BC23CC23DC23EC23FC240C241C242C243C244C24500000000000000000000 +0000C246C247C249C24AC24BC24CC24DC24EC24FC252C253C255C256C257C259 +C25AC25BC25CC25DC25EC25FC261C262C263C264C26600000000000000000000 +0000C267C268C269C26AC26BC26EC26FC271C272C273C275C276C277C278C279 +C27AC27BC27EC280C282C283C284C285C286C287C28AC28BC28CC28DC28EC28F +C291C292C293C294C295C296C297C299C29AC29CC29EC29FC2A0C2A1C2A2C2A3 +C2A6C2A7C2A9C2AAC2ABC2AEC2AFC2B0C2B1C2B2C2B3C2B6C2B8C2BAC2BBC2BC +C2BDC2BEC2BFC2C0C2C1C2C2C2C3C2C4C2C5C2C6C2C7C2C8C2C9C2CAC2CBC2CC +C2CDC2CEC2CFC2D0C2D1C2D2C2D3C2D4C2D5C2D6C2D7C2D8C2D9C2DAC2DBC2DE +C2DFC2E1C2E2C2E5C2E6C2E7C2E8C2E9C2EAC2EEC2F0C2F2C2F3C2F4C2F5C2F7 +C2FAC2FDC2FEC2FFC301C302C303C304C305C306C307C30AC30BC30EC30F0000 +9B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C310C311C312C316C317C319C31AC31BC31DC31EC31FC320C321C322C323 +C326C327C32AC32BC32CC32DC32EC32FC330C331C33200000000000000000000 +0000C333C334C335C336C337C338C339C33AC33BC33CC33DC33EC33FC340C341 +C342C343C344C346C347C348C349C34AC34BC34CC34D00000000000000000000 +0000C34EC34FC350C351C352C353C354C355C356C357C358C359C35AC35BC35C +C35DC35EC35FC360C361C362C363C364C365C366C367C36AC36BC36DC36EC36F +C371C373C374C375C376C377C37AC37BC37EC37FC380C381C382C383C385C386 +C387C389C38AC38BC38DC38EC38FC390C391C392C393C394C395C396C397C398 +C399C39AC39BC39CC39DC39EC39FC3A0C3A1C3A2C3A3C3A4C3A5C3A6C3A7C3A8 +C3A9C3AAC3ABC3ACC3ADC3AEC3AFC3B0C3B1C3B2C3B3C3B4C3B5C3B6C3B7C3B8 +C3B9C3BAC3BBC3BCC3BDC3BEC3BFC3C1C3C2C3C3C3C4C3C5C3C6C3C7C3C8C3C9 +C3CAC3CBC3CCC3CDC3CEC3CFC3D0C3D1C3D2C3D3C3D4C3D5C3D6C3D7C3DA0000 +9C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C3DBC3DDC3DEC3E1C3E3C3E4C3E5C3E6C3E7C3EAC3EBC3ECC3EEC3EFC3F0 +C3F1C3F2C3F3C3F6C3F7C3F9C3FAC3FBC3FCC3FDC3FE00000000000000000000 +0000C3FFC400C401C402C403C404C405C406C407C409C40AC40BC40CC40DC40E +C40FC411C412C413C414C415C416C417C418C419C41A00000000000000000000 +0000C41BC41CC41DC41EC41FC420C421C422C423C425C426C427C428C429C42A +C42BC42DC42EC42FC431C432C433C435C436C437C438C439C43AC43BC43EC43F +C440C441C442C443C444C445C446C447C449C44AC44BC44CC44DC44EC44FC450 +C451C452C453C454C455C456C457C458C459C45AC45BC45CC45DC45EC45FC460 +C461C462C463C466C467C469C46AC46BC46DC46EC46FC470C471C472C473C476 +C477C478C47AC47BC47CC47DC47EC47FC481C482C483C484C485C486C487C488 +C489C48AC48BC48CC48DC48EC48FC490C491C492C493C495C496C497C498C499 +C49AC49BC49DC49EC49FC4A0C4A1C4A2C4A3C4A4C4A5C4A6C4A7C4A8C4A90000 +9D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C4AAC4ABC4ACC4ADC4AEC4AFC4B0C4B1C4B2C4B3C4B4C4B5C4B6C4B7C4B9 +C4BAC4BBC4BDC4BEC4BFC4C0C4C1C4C2C4C3C4C4C4C500000000000000000000 +0000C4C6C4C7C4C8C4C9C4CAC4CBC4CCC4CDC4CEC4CFC4D0C4D1C4D2C4D3C4D4 +C4D5C4D6C4D7C4D8C4D9C4DAC4DBC4DCC4DDC4DEC4DF00000000000000000000 +0000C4E0C4E1C4E2C4E3C4E4C4E5C4E6C4E7C4E8C4EAC4EBC4ECC4EDC4EEC4EF +C4F2C4F3C4F5C4F6C4F7C4F9C4FBC4FCC4FDC4FEC502C503C504C505C506C507 +C508C509C50AC50BC50DC50EC50FC511C512C513C515C516C517C518C519C51A +C51BC51DC51EC51FC520C521C522C523C524C525C526C527C52AC52BC52DC52E +C52FC531C532C533C534C535C536C537C53AC53CC53EC53FC540C541C542C543 +C546C547C54BC54FC550C551C552C556C55AC55BC55CC55FC562C563C565C566 +C567C569C56AC56BC56CC56DC56EC56FC572C576C577C578C579C57AC57BC57E +C57FC581C582C583C585C586C588C589C58AC58BC58EC590C592C593C5940000 +9E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C596C599C59AC59BC59DC59EC59FC5A1C5A2C5A3C5A4C5A5C5A6C5A7C5A8 +C5AAC5ABC5ACC5ADC5AEC5AFC5B0C5B1C5B2C5B3C5B600000000000000000000 +0000C5B7C5BAC5BFC5C0C5C1C5C2C5C3C5CBC5CDC5CFC5D2C5D3C5D5C5D6C5D7 +C5D9C5DAC5DBC5DCC5DDC5DEC5DFC5E2C5E4C5E6C5E700000000000000000000 +0000C5E8C5E9C5EAC5EBC5EFC5F1C5F2C5F3C5F5C5F8C5F9C5FAC5FBC602C603 +C604C609C60AC60BC60DC60EC60FC611C612C613C614C615C616C617C61AC61D +C61EC61FC620C621C622C623C626C627C629C62AC62BC62FC631C632C636C638 +C63AC63CC63DC63EC63FC642C643C645C646C647C649C64AC64BC64CC64DC64E +C64FC652C656C657C658C659C65AC65BC65EC65FC661C662C663C664C665C666 +C667C668C669C66AC66BC66DC66EC670C672C673C674C675C676C677C67AC67B +C67DC67EC67FC681C682C683C684C685C686C687C68AC68CC68EC68FC690C691 +C692C693C696C697C699C69AC69BC69DC69EC69FC6A0C6A1C6A2C6A3C6A60000 +9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C6A8C6AAC6ABC6ACC6ADC6AEC6AFC6B2C6B3C6B5C6B6C6B7C6BBC6BCC6BD +C6BEC6BFC6C2C6C4C6C6C6C7C6C8C6C9C6CAC6CBC6CE00000000000000000000 +0000C6CFC6D1C6D2C6D3C6D5C6D6C6D7C6D8C6D9C6DAC6DBC6DEC6DFC6E2C6E3 +C6E4C6E5C6E6C6E7C6EAC6EBC6EDC6EEC6EFC6F1C6F200000000000000000000 +0000C6F3C6F4C6F5C6F6C6F7C6FAC6FBC6FCC6FEC6FFC700C701C702C703C706 +C707C709C70AC70BC70DC70EC70FC710C711C712C713C716C718C71AC71BC71C +C71DC71EC71FC722C723C725C726C727C729C72AC72BC72CC72DC72EC72FC732 +C734C736C738C739C73AC73BC73EC73FC741C742C743C745C746C747C748C749 +C74BC74EC750C759C75AC75BC75DC75EC75FC761C762C763C764C765C766C767 +C769C76AC76CC76DC76EC76FC770C771C772C773C776C777C779C77AC77BC77F +C780C781C782C786C78BC78CC78DC78FC792C793C795C799C79BC79CC79DC79E +C79FC7A2C7A7C7A8C7A9C7AAC7ABC7AEC7AFC7B1C7B2C7B3C7B5C7B6C7B70000 +A0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C7B8C7B9C7BAC7BBC7BEC7C2C7C3C7C4C7C5C7C6C7C7C7CAC7CBC7CDC7CF +C7D1C7D2C7D3C7D4C7D5C7D6C7D7C7D9C7DAC7DBC7DC00000000000000000000 +0000C7DEC7DFC7E0C7E1C7E2C7E3C7E5C7E6C7E7C7E9C7EAC7EBC7EDC7EEC7EF +C7F0C7F1C7F2C7F3C7F4C7F5C7F6C7F7C7F8C7F9C7FA00000000000000000000 +0000C7FBC7FCC7FDC7FEC7FFC802C803C805C806C807C809C80BC80CC80DC80E +C80FC812C814C817C818C819C81AC81BC81EC81FC821C822C823C825C826C827 +C828C829C82AC82BC82EC830C832C833C834C835C836C837C839C83AC83BC83D +C83EC83FC841C842C843C844C845C846C847C84AC84BC84EC84FC850C851C852 +C853C855C856C857C858C859C85AC85BC85CC85DC85EC85FC860C861C862C863 +C864C865C866C867C868C869C86AC86BC86CC86DC86EC86FC872C873C875C876 +C877C879C87BC87CC87DC87EC87FC882C884C888C889C88AC88EC88FC890C891 +C892C893C895C896C897C898C899C89AC89BC89CC89EC8A0C8A2C8A3C8A40000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C8A5C8A6C8A7C8A9C8AAC8ABC8ACC8ADC8AEC8AFC8B0C8B1C8B2C8B3C8B4 +C8B5C8B6C8B7C8B8C8B9C8BAC8BBC8BEC8BFC8C0C8C100000000000000000000 +0000C8C2C8C3C8C5C8C6C8C7C8C9C8CAC8CBC8CDC8CEC8CFC8D0C8D1C8D2C8D3 +C8D6C8D8C8DAC8DBC8DCC8DDC8DEC8DFC8E2C8E3C8E500000000000000000000 +0000C8E6C8E7C8E8C8E9C8EAC8EBC8ECC8EDC8EEC8EFC8F0C8F1C8F2C8F3C8F4 +C8F6C8F7C8F8C8F9C8FAC8FBC8FEC8FFC901C902C903C907C908C909C90AC90B +C90E30003001300200B72025202600A8300300AD20152225FF3C223C20182019 +201C201D3014301530083009300A300B300C300D300E300F3010301100B100D7 +00F7226022642265221E223400B0203220332103212BFFE0FFE1FFE526422640 +222022A52312220222072261225200A7203B2606260525CB25CF25CE25C725C6 +25A125A025B325B225BD25BC219221902191219321943013226A226B221A223D +221D2235222B222C2208220B2286228722822283222A222922272228FFE20000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C910C912C913C914C915C916C917C919C91AC91BC91CC91DC91EC91FC920 +C921C922C923C924C925C926C927C928C929C92AC92B00000000000000000000 +0000C92DC92EC92FC930C931C932C933C935C936C937C938C939C93AC93BC93C +C93DC93EC93FC940C941C942C943C944C945C946C94700000000000000000000 +0000C948C949C94AC94BC94CC94DC94EC94FC952C953C955C956C957C959C95A +C95BC95CC95DC95EC95FC962C964C965C966C967C968C969C96AC96BC96DC96E +C96F21D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF +02D0222E2211220F00A42109203025C125C025B725B626642660266126652667 +2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E +261C261E00B62020202121952197219921962198266D2669266A266C327F321C +211633C7212233C233D8212120AC00AE00000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C971C972C973C975C976C977C978C979C97AC97BC97DC97EC97FC980C981 +C982C983C984C985C986C987C98AC98BC98DC98EC98F00000000000000000000 +0000C991C992C993C994C995C996C997C99AC99CC99EC99FC9A0C9A1C9A2C9A3 +C9A4C9A5C9A6C9A7C9A8C9A9C9AAC9ABC9ACC9ADC9AE00000000000000000000 +0000C9AFC9B0C9B1C9B2C9B3C9B4C9B5C9B6C9B7C9B8C9B9C9BAC9BBC9BCC9BD +C9BEC9BFC9C2C9C3C9C5C9C6C9C9C9CBC9CCC9CDC9CEC9CFC9D2C9D4C9D7C9D8 +C9DBFF01FF02FF03FF04FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFFE6FF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C9DEC9DFC9E1C9E3C9E5C9E6C9E8C9E9C9EAC9EBC9EEC9F2C9F3C9F4C9F5 +C9F6C9F7C9FAC9FBC9FDC9FEC9FFCA01CA02CA03CA0400000000000000000000 +0000CA05CA06CA07CA0ACA0ECA0FCA10CA11CA12CA13CA15CA16CA17CA19CA1A +CA1BCA1CCA1DCA1ECA1FCA20CA21CA22CA23CA24CA2500000000000000000000 +0000CA26CA27CA28CA2ACA2BCA2CCA2DCA2ECA2FCA30CA31CA32CA33CA34CA35 +CA36CA37CA38CA39CA3ACA3BCA3CCA3DCA3ECA3FCA40CA41CA42CA43CA44CA45 +CA46313131323133313431353136313731383139313A313B313C313D313E313F +3140314131423143314431453146314731483149314A314B314C314D314E314F +3150315131523153315431553156315731583159315A315B315C315D315E315F +3160316131623163316431653166316731683169316A316B316C316D316E316F +3170317131723173317431753176317731783179317A317B317C317D317E317F +3180318131823183318431853186318731883189318A318B318C318D318E0000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CA47CA48CA49CA4ACA4BCA4ECA4FCA51CA52CA53CA55CA56CA57CA58CA59 +CA5ACA5BCA5ECA62CA63CA64CA65CA66CA67CA69CA6A00000000000000000000 +0000CA6BCA6CCA6DCA6ECA6FCA70CA71CA72CA73CA74CA75CA76CA77CA78CA79 +CA7ACA7BCA7CCA7ECA7FCA80CA81CA82CA83CA85CA8600000000000000000000 +0000CA87CA88CA89CA8ACA8BCA8CCA8DCA8ECA8FCA90CA91CA92CA93CA94CA95 +CA96CA97CA99CA9ACA9BCA9CCA9DCA9ECA9FCAA0CAA1CAA2CAA3CAA4CAA5CAA6 +CAA7217021712172217321742175217621772178217900000000000000000000 +2160216121622163216421652166216721682169000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CAA8CAA9CAAACAABCAACCAADCAAECAAFCAB0CAB1CAB2CAB3CAB4CAB5CAB6 +CAB7CAB8CAB9CABACABBCABECABFCAC1CAC2CAC3CAC500000000000000000000 +0000CAC6CAC7CAC8CAC9CACACACBCACECAD0CAD2CAD4CAD5CAD6CAD7CADACADB +CADCCADDCADECADFCAE1CAE2CAE3CAE4CAE5CAE6CAE700000000000000000000 +0000CAE8CAE9CAEACAEBCAEDCAEECAEFCAF0CAF1CAF2CAF3CAF5CAF6CAF7CAF8 +CAF9CAFACAFBCAFCCAFDCAFECAFFCB00CB01CB02CB03CB04CB05CB06CB07CB09 +CB0A25002502250C251025182514251C252C25242534253C25012503250F2513 +251B251725232533252B253B254B2520252F25282537253F251D253025252538 +254225122511251A251925162515250E250D251E251F25212522252625272529 +252A252D252E25312532253525362539253A253D253E25402541254325442545 +2546254725482549254A00000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CB0BCB0CCB0DCB0ECB0FCB11CB12CB13CB15CB16CB17CB19CB1ACB1BCB1C +CB1DCB1ECB1FCB22CB23CB24CB25CB26CB27CB28CB2900000000000000000000 +0000CB2ACB2BCB2CCB2DCB2ECB2FCB30CB31CB32CB33CB34CB35CB36CB37CB38 +CB39CB3ACB3BCB3CCB3DCB3ECB3FCB40CB42CB43CB4400000000000000000000 +0000CB45CB46CB47CB4ACB4BCB4DCB4ECB4FCB51CB52CB53CB54CB55CB56CB57 +CB5ACB5BCB5CCB5ECB5FCB60CB61CB62CB63CB65CB66CB67CB68CB69CB6ACB6B +CB6C3395339633972113339833C433A333A433A533A63399339A339B339C339D +339E339F33A033A133A233CA338D338E338F33CF3388338933C833A733A833B0 +33B133B233B333B433B533B633B733B833B93380338133823383338433BA33BB +33BC33BD33BE33BF33903391339233933394212633C033C1338A338B338C33D6 +33C533AD33AE33AF33DB33A933AA33AB33AC33DD33D033D333C333C933DC33C6 +0000000000000000000000000000000000000000000000000000000000000000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CB6DCB6ECB6FCB70CB71CB72CB73CB74CB75CB76CB77CB7ACB7BCB7CCB7D +CB7ECB7FCB80CB81CB82CB83CB84CB85CB86CB87CB8800000000000000000000 +0000CB89CB8ACB8BCB8CCB8DCB8ECB8FCB90CB91CB92CB93CB94CB95CB96CB97 +CB98CB99CB9ACB9BCB9DCB9ECB9FCBA0CBA1CBA2CBA300000000000000000000 +0000CBA4CBA5CBA6CBA7CBA8CBA9CBAACBABCBACCBADCBAECBAFCBB0CBB1CBB2 +CBB3CBB4CBB5CBB6CBB7CBB9CBBACBBBCBBCCBBDCBBECBBFCBC0CBC1CBC2CBC3 +CBC400C600D000AA0126000001320000013F014100D8015200BA00DE0166014A +00003260326132623263326432653266326732683269326A326B326C326D326E +326F3270327132723273327432753276327732783279327A327B24D024D124D2 +24D324D424D524D624D724D824D924DA24DB24DC24DD24DE24DF24E024E124E2 +24E324E424E524E624E724E824E9246024612462246324642465246624672468 +2469246A246B246C246D246E00BD2153215400BC00BE215B215C215D215E0000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CBC5CBC6CBC7CBC8CBC9CBCACBCBCBCCCBCDCBCECBCFCBD0CBD1CBD2CBD3 +CBD5CBD6CBD7CBD8CBD9CBDACBDBCBDCCBDDCBDECBDF00000000000000000000 +0000CBE0CBE1CBE2CBE3CBE5CBE6CBE8CBEACBEBCBECCBEDCBEECBEFCBF0CBF1 +CBF2CBF3CBF4CBF5CBF6CBF7CBF8CBF9CBFACBFBCBFC00000000000000000000 +0000CBFDCBFECBFFCC00CC01CC02CC03CC04CC05CC06CC07CC08CC09CC0ACC0B +CC0ECC0FCC11CC12CC13CC15CC16CC17CC18CC19CC1ACC1BCC1ECC1FCC20CC23 +CC2400E6011100F001270131013301380140014200F8015300DF00FE0167014B +01493200320132023203320432053206320732083209320A320B320C320D320E +320F3210321132123213321432153216321732183219321A321B249C249D249E +249F24A024A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE +24AF24B024B124B224B324B424B5247424752476247724782479247A247B247C +247D247E247F24802481248200B900B200B32074207F20812082208320840000 +AA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CC25CC26CC2ACC2BCC2DCC2FCC31CC32CC33CC34CC35CC36CC37CC3ACC3F +CC40CC41CC42CC43CC46CC47CC49CC4ACC4BCC4DCC4E00000000000000000000 +0000CC4FCC50CC51CC52CC53CC56CC5ACC5BCC5CCC5DCC5ECC5FCC61CC62CC63 +CC65CC67CC69CC6ACC6BCC6CCC6DCC6ECC6FCC71CC7200000000000000000000 +0000CC73CC74CC76CC77CC78CC79CC7ACC7BCC7CCC7DCC7ECC7FCC80CC81CC82 +CC83CC84CC85CC86CC87CC88CC89CC8ACC8BCC8CCC8DCC8ECC8FCC90CC91CC92 +CC93304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +AB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CC94CC95CC96CC97CC9ACC9BCC9DCC9ECC9FCCA1CCA2CCA3CCA4CCA5CCA6 +CCA7CCAACCAECCAFCCB0CCB1CCB2CCB3CCB6CCB7CCB900000000000000000000 +0000CCBACCBBCCBDCCBECCBFCCC0CCC1CCC2CCC3CCC6CCC8CCCACCCBCCCCCCCD +CCCECCCFCCD1CCD2CCD3CCD5CCD6CCD7CCD8CCD9CCDA00000000000000000000 +0000CCDBCCDCCCDDCCDECCDFCCE0CCE1CCE2CCE3CCE5CCE6CCE7CCE8CCE9CCEA +CCEBCCEDCCEECCEFCCF1CCF2CCF3CCF4CCF5CCF6CCF7CCF8CCF9CCFACCFBCCFC +CCFD30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +AC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CCFECCFFCD00CD02CD03CD04CD05CD06CD07CD0ACD0BCD0DCD0ECD0FCD11 +CD12CD13CD14CD15CD16CD17CD1ACD1CCD1ECD1FCD2000000000000000000000 +0000CD21CD22CD23CD25CD26CD27CD29CD2ACD2BCD2DCD2ECD2FCD30CD31CD32 +CD33CD34CD35CD36CD37CD38CD3ACD3BCD3CCD3DCD3E00000000000000000000 +0000CD3FCD40CD41CD42CD43CD44CD45CD46CD47CD48CD49CD4ACD4BCD4CCD4D +CD4ECD4FCD50CD51CD52CD53CD54CD55CD56CD57CD58CD59CD5ACD5BCD5DCD5E +CD5F04100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +AD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CD61CD62CD63CD65CD66CD67CD68CD69CD6ACD6BCD6ECD70CD72CD73CD74 +CD75CD76CD77CD79CD7ACD7BCD7CCD7DCD7ECD7FCD8000000000000000000000 +0000CD81CD82CD83CD84CD85CD86CD87CD89CD8ACD8BCD8CCD8DCD8ECD8FCD90 +CD91CD92CD93CD96CD97CD99CD9ACD9BCD9DCD9ECD9F00000000000000000000 +0000CDA0CDA1CDA2CDA3CDA6CDA8CDAACDABCDACCDADCDAECDAFCDB1CDB2CDB3 +CDB4CDB5CDB6CDB7CDB8CDB9CDBACDBBCDBCCDBDCDBECDBFCDC0CDC1CDC2CDC3 +CDC5000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CDC6CDC7CDC8CDC9CDCACDCBCDCDCDCECDCFCDD1CDD2CDD3CDD4CDD5CDD6 +CDD7CDD8CDD9CDDACDDBCDDCCDDDCDDECDDFCDE0CDE100000000000000000000 +0000CDE2CDE3CDE4CDE5CDE6CDE7CDE9CDEACDEBCDEDCDEECDEFCDF1CDF2CDF3 +CDF4CDF5CDF6CDF7CDFACDFCCDFECDFFCE00CE01CE0200000000000000000000 +0000CE03CE05CE06CE07CE09CE0ACE0BCE0DCE0ECE0FCE10CE11CE12CE13CE15 +CE16CE17CE18CE1ACE1BCE1CCE1DCE1ECE1FCE22CE23CE25CE26CE27CE29CE2A +CE2B000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CE2CCE2DCE2ECE2FCE32CE34CE36CE37CE38CE39CE3ACE3BCE3CCE3DCE3E +CE3FCE40CE41CE42CE43CE44CE45CE46CE47CE48CE4900000000000000000000 +0000CE4ACE4BCE4CCE4DCE4ECE4FCE50CE51CE52CE53CE54CE55CE56CE57CE5A +CE5BCE5DCE5ECE62CE63CE64CE65CE66CE67CE6ACE6C00000000000000000000 +0000CE6ECE6FCE70CE71CE72CE73CE76CE77CE79CE7ACE7BCE7DCE7ECE7FCE80 +CE81CE82CE83CE86CE88CE8ACE8BCE8CCE8DCE8ECE8FCE92CE93CE95CE96CE97 +CE99000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CE9ACE9BCE9CCE9DCE9ECE9FCEA2CEA6CEA7CEA8CEA9CEAACEABCEAECEAF +CEB0CEB1CEB2CEB3CEB4CEB5CEB6CEB7CEB8CEB9CEBA00000000000000000000 +0000CEBBCEBCCEBDCEBECEBFCEC0CEC2CEC3CEC4CEC5CEC6CEC7CEC8CEC9CECA +CECBCECCCECDCECECECFCED0CED1CED2CED3CED4CED500000000000000000000 +0000CED6CED7CED8CED9CEDACEDBCEDCCEDDCEDECEDFCEE0CEE1CEE2CEE3CEE6 +CEE7CEE9CEEACEEDCEEECEEFCEF0CEF1CEF2CEF3CEF6CEFACEFBCEFCCEFDCEFE +CEFFAC00AC01AC04AC07AC08AC09AC0AAC10AC11AC12AC13AC14AC15AC16AC17 +AC19AC1AAC1BAC1CAC1DAC20AC24AC2CAC2DAC2FAC30AC31AC38AC39AC3CAC40 +AC4BAC4DAC54AC58AC5CAC70AC71AC74AC77AC78AC7AAC80AC81AC83AC84AC85 +AC86AC89AC8AAC8BAC8CAC90AC94AC9CAC9DAC9FACA0ACA1ACA8ACA9ACAAACAC +ACAFACB0ACB8ACB9ACBBACBCACBDACC1ACC4ACC8ACCCACD5ACD7ACE0ACE1ACE4 +ACE7ACE8ACEAACECACEFACF0ACF1ACF3ACF5ACF6ACFCACFDAD00AD04AD060000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CF02CF03CF05CF06CF07CF09CF0ACF0BCF0CCF0DCF0ECF0FCF12CF14CF16 +CF17CF18CF19CF1ACF1BCF1DCF1ECF1FCF21CF22CF2300000000000000000000 +0000CF25CF26CF27CF28CF29CF2ACF2BCF2ECF32CF33CF34CF35CF36CF37CF39 +CF3ACF3BCF3CCF3DCF3ECF3FCF40CF41CF42CF43CF4400000000000000000000 +0000CF45CF46CF47CF48CF49CF4ACF4BCF4CCF4DCF4ECF4FCF50CF51CF52CF53 +CF56CF57CF59CF5ACF5BCF5DCF5ECF5FCF60CF61CF62CF63CF66CF68CF6ACF6B +CF6CAD0CAD0DAD0FAD11AD18AD1CAD20AD29AD2CAD2DAD34AD35AD38AD3CAD44 +AD45AD47AD49AD50AD54AD58AD61AD63AD6CAD6DAD70AD73AD74AD75AD76AD7B +AD7CAD7DAD7FAD81AD82AD88AD89AD8CAD90AD9CAD9DADA4ADB7ADC0ADC1ADC4 +ADC8ADD0ADD1ADD3ADDCADE0ADE4ADF8ADF9ADFCADFFAE00AE01AE08AE09AE0B +AE0DAE14AE30AE31AE34AE37AE38AE3AAE40AE41AE43AE45AE46AE4AAE4CAE4D +AE4EAE50AE54AE56AE5CAE5DAE5FAE60AE61AE65AE68AE69AE6CAE70AE780000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CF6DCF6ECF6FCF72CF73CF75CF76CF77CF79CF7ACF7BCF7CCF7DCF7ECF7F +CF81CF82CF83CF84CF86CF87CF88CF89CF8ACF8BCF8D00000000000000000000 +0000CF8ECF8FCF90CF91CF92CF93CF94CF95CF96CF97CF98CF99CF9ACF9BCF9C +CF9DCF9ECF9FCFA0CFA2CFA3CFA4CFA5CFA6CFA7CFA900000000000000000000 +0000CFAACFABCFACCFADCFAECFAFCFB1CFB2CFB3CFB4CFB5CFB6CFB7CFB8CFB9 +CFBACFBBCFBCCFBDCFBECFBFCFC0CFC1CFC2CFC3CFC5CFC6CFC7CFC8CFC9CFCA +CFCBAE79AE7BAE7CAE7DAE84AE85AE8CAEBCAEBDAEBEAEC0AEC4AECCAECDAECF +AED0AED1AED8AED9AEDCAEE8AEEBAEEDAEF4AEF8AEFCAF07AF08AF0DAF10AF2C +AF2DAF30AF32AF34AF3CAF3DAF3FAF41AF42AF43AF48AF49AF50AF5CAF5DAF64 +AF65AF79AF80AF84AF88AF90AF91AF95AF9CAFB8AFB9AFBCAFC0AFC7AFC8AFC9 +AFCBAFCDAFCEAFD4AFDCAFE8AFE9AFF0AFF1AFF4AFF8B000B001B004B00CB010 +B014B01CB01DB028B044B045B048B04AB04CB04EB053B054B055B057B0590000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CFCCCFCDCFCECFCFCFD0CFD1CFD2CFD3CFD4CFD5CFD6CFD7CFD8CFD9CFDA +CFDBCFDCCFDDCFDECFDFCFE2CFE3CFE5CFE6CFE7CFE900000000000000000000 +0000CFEACFEBCFECCFEDCFEECFEFCFF2CFF4CFF6CFF7CFF8CFF9CFFACFFBCFFD +CFFECFFFD001D002D003D005D006D007D008D009D00A00000000000000000000 +0000D00BD00CD00DD00ED00FD010D012D013D014D015D016D017D019D01AD01B +D01CD01DD01ED01FD020D021D022D023D024D025D026D027D028D029D02AD02B +D02CB05DB07CB07DB080B084B08CB08DB08FB091B098B099B09AB09CB09FB0A0 +B0A1B0A2B0A8B0A9B0ABB0ACB0ADB0AEB0AFB0B1B0B3B0B4B0B5B0B8B0BCB0C4 +B0C5B0C7B0C8B0C9B0D0B0D1B0D4B0D8B0E0B0E5B108B109B10BB10CB110B112 +B113B118B119B11BB11CB11DB123B124B125B128B12CB134B135B137B138B139 +B140B141B144B148B150B151B154B155B158B15CB160B178B179B17CB180B182 +B188B189B18BB18DB192B193B194B198B19CB1A8B1CCB1D0B1D4B1DCB1DD0000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D02ED02FD030D031D032D033D036D037D039D03AD03BD03DD03ED03FD040 +D041D042D043D046D048D04AD04BD04CD04DD04ED04F00000000000000000000 +0000D051D052D053D055D056D057D059D05AD05BD05CD05DD05ED05FD061D062 +D063D064D065D066D067D068D069D06AD06BD06ED06F00000000000000000000 +0000D071D072D073D075D076D077D078D079D07AD07BD07ED07FD080D082D083 +D084D085D086D087D088D089D08AD08BD08CD08DD08ED08FD090D091D092D093 +D094B1DFB1E8B1E9B1ECB1F0B1F9B1FBB1FDB204B205B208B20BB20CB214B215 +B217B219B220B234B23CB258B25CB260B268B269B274B275B27CB284B285B289 +B290B291B294B298B299B29AB2A0B2A1B2A3B2A5B2A6B2AAB2ACB2B0B2B4B2C8 +B2C9B2CCB2D0B2D2B2D8B2D9B2DBB2DDB2E2B2E4B2E5B2E6B2E8B2EBB2ECB2ED +B2EEB2EFB2F3B2F4B2F5B2F7B2F8B2F9B2FAB2FBB2FFB300B301B304B308B310 +B311B313B314B315B31CB354B355B356B358B35BB35CB35EB35FB364B3650000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D095D096D097D098D099D09AD09BD09CD09DD09ED09FD0A0D0A1D0A2D0A3 +D0A6D0A7D0A9D0AAD0ABD0ADD0AED0AFD0B0D0B1D0B200000000000000000000 +0000D0B3D0B6D0B8D0BAD0BBD0BCD0BDD0BED0BFD0C2D0C3D0C5D0C6D0C7D0CA +D0CBD0CCD0CDD0CED0CFD0D2D0D6D0D7D0D8D0D9D0DA00000000000000000000 +0000D0DBD0DED0DFD0E1D0E2D0E3D0E5D0E6D0E7D0E8D0E9D0EAD0EBD0EED0F2 +D0F3D0F4D0F5D0F6D0F7D0F9D0FAD0FBD0FCD0FDD0FED0FFD100D101D102D103 +D104B367B369B36BB36EB370B371B374B378B380B381B383B384B385B38CB390 +B394B3A0B3A1B3A8B3ACB3C4B3C5B3C8B3CBB3CCB3CEB3D0B3D4B3D5B3D7B3D9 +B3DBB3DDB3E0B3E4B3E8B3FCB410B418B41CB420B428B429B42BB434B450B451 +B454B458B460B461B463B465B46CB480B488B49DB4A4B4A8B4ACB4B5B4B7B4B9 +B4C0B4C4B4C8B4D0B4D5B4DCB4DDB4E0B4E3B4E4B4E6B4ECB4EDB4EFB4F1B4F8 +B514B515B518B51BB51CB524B525B527B528B529B52AB530B531B534B5380000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D105D106D107D108D109D10AD10BD10CD10ED10FD110D111D112D113D114 +D115D116D117D118D119D11AD11BD11CD11DD11ED11F00000000000000000000 +0000D120D121D122D123D124D125D126D127D128D129D12AD12BD12CD12DD12E +D12FD132D133D135D136D137D139D13BD13CD13DD13E00000000000000000000 +0000D13FD142D146D147D148D149D14AD14BD14ED14FD151D152D153D155D156 +D157D158D159D15AD15BD15ED160D162D163D164D165D166D167D169D16AD16B +D16DB540B541B543B544B545B54BB54CB54DB550B554B55CB55DB55FB560B561 +B5A0B5A1B5A4B5A8B5AAB5ABB5B0B5B1B5B3B5B4B5B5B5BBB5BCB5BDB5C0B5C4 +B5CCB5CDB5CFB5D0B5D1B5D8B5ECB610B611B614B618B625B62CB634B648B664 +B668B69CB69DB6A0B6A4B6ABB6ACB6B1B6D4B6F0B6F4B6F8B700B701B705B728 +B729B72CB72FB730B738B739B73BB744B748B74CB754B755B760B764B768B770 +B771B773B775B77CB77DB780B784B78CB78DB78FB790B791B792B796B7970000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D16ED16FD170D171D172D173D174D175D176D177D178D179D17AD17BD17D +D17ED17FD180D181D182D183D185D186D187D189D18A00000000000000000000 +0000D18BD18CD18DD18ED18FD190D191D192D193D194D195D196D197D198D199 +D19AD19BD19CD19DD19ED19FD1A2D1A3D1A5D1A6D1A700000000000000000000 +0000D1A9D1AAD1ABD1ACD1ADD1AED1AFD1B2D1B4D1B6D1B7D1B8D1B9D1BBD1BD +D1BED1BFD1C1D1C2D1C3D1C4D1C5D1C6D1C7D1C8D1C9D1CAD1CBD1CCD1CDD1CE +D1CFB798B799B79CB7A0B7A8B7A9B7ABB7ACB7ADB7B4B7B5B7B8B7C7B7C9B7EC +B7EDB7F0B7F4B7FCB7FDB7FFB800B801B807B808B809B80CB810B818B819B81B +B81DB824B825B828B82CB834B835B837B838B839B840B844B851B853B85CB85D +B860B864B86CB86DB86FB871B878B87CB88DB8A8B8B0B8B4B8B8B8C0B8C1B8C3 +B8C5B8CCB8D0B8D4B8DDB8DFB8E1B8E8B8E9B8ECB8F0B8F8B8F9B8FBB8FDB904 +B918B920B93CB93DB940B944B94CB94FB951B958B959B95CB960B968B9690000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D1D0D1D1D1D2D1D3D1D4D1D5D1D6D1D7D1D9D1DAD1DBD1DCD1DDD1DED1DF +D1E0D1E1D1E2D1E3D1E4D1E5D1E6D1E7D1E8D1E9D1EA00000000000000000000 +0000D1EBD1ECD1EDD1EED1EFD1F0D1F1D1F2D1F3D1F5D1F6D1F7D1F9D1FAD1FB +D1FCD1FDD1FED1FFD200D201D202D203D204D205D20600000000000000000000 +0000D208D20AD20BD20CD20DD20ED20FD211D212D213D214D215D216D217D218 +D219D21AD21BD21CD21DD21ED21FD220D221D222D223D224D225D226D227D228 +D229B96BB96DB974B975B978B97CB984B985B987B989B98AB98DB98EB9ACB9AD +B9B0B9B4B9BCB9BDB9BFB9C1B9C8B9C9B9CCB9CEB9CFB9D0B9D1B9D2B9D8B9D9 +B9DBB9DDB9DEB9E1B9E3B9E4B9E5B9E8B9ECB9F4B9F5B9F7B9F8B9F9B9FABA00 +BA01BA08BA15BA38BA39BA3CBA40BA42BA48BA49BA4BBA4DBA4EBA53BA54BA55 +BA58BA5CBA64BA65BA67BA68BA69BA70BA71BA74BA78BA83BA84BA85BA87BA8C +BAA8BAA9BAABBAACBAB0BAB2BAB8BAB9BABBBABDBAC4BAC8BAD8BAD9BAFC0000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D22AD22BD22ED22FD231D232D233D235D236D237D238D239D23AD23BD23E +D240D242D243D244D245D246D247D249D24AD24BD24C00000000000000000000 +0000D24DD24ED24FD250D251D252D253D254D255D256D257D258D259D25AD25B +D25DD25ED25FD260D261D262D263D265D266D267D26800000000000000000000 +0000D269D26AD26BD26CD26DD26ED26FD270D271D272D273D274D275D276D277 +D278D279D27AD27BD27CD27DD27ED27FD282D283D285D286D287D289D28AD28B +D28CBB00BB04BB0DBB0FBB11BB18BB1CBB20BB29BB2BBB34BB35BB36BB38BB3B +BB3CBB3DBB3EBB44BB45BB47BB49BB4DBB4FBB50BB54BB58BB61BB63BB6CBB88 +BB8CBB90BBA4BBA8BBACBBB4BBB7BBC0BBC4BBC8BBD0BBD3BBF8BBF9BBFCBBFF +BC00BC02BC08BC09BC0BBC0CBC0DBC0FBC11BC14BC15BC16BC17BC18BC1BBC1C +BC1DBC1EBC1FBC24BC25BC27BC29BC2DBC30BC31BC34BC38BC40BC41BC43BC44 +BC45BC49BC4CBC4DBC50BC5DBC84BC85BC88BC8BBC8CBC8EBC94BC95BC970000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D28DD28ED28FD292D293D294D296D297D298D299D29AD29BD29DD29ED29F +D2A1D2A2D2A3D2A5D2A6D2A7D2A8D2A9D2AAD2ABD2AD00000000000000000000 +0000D2AED2AFD2B0D2B2D2B3D2B4D2B5D2B6D2B7D2BAD2BBD2BDD2BED2C1D2C3 +D2C4D2C5D2C6D2C7D2CAD2CCD2CDD2CED2CFD2D0D2D100000000000000000000 +0000D2D2D2D3D2D5D2D6D2D7D2D9D2DAD2DBD2DDD2DED2DFD2E0D2E1D2E2D2E3 +D2E6D2E7D2E8D2E9D2EAD2EBD2ECD2EDD2EED2EFD2F2D2F3D2F5D2F6D2F7D2F9 +D2FABC99BC9ABCA0BCA1BCA4BCA7BCA8BCB0BCB1BCB3BCB4BCB5BCBCBCBDBCC0 +BCC4BCCDBCCFBCD0BCD1BCD5BCD8BCDCBCF4BCF5BCF6BCF8BCFCBD04BD05BD07 +BD09BD10BD14BD24BD2CBD40BD48BD49BD4CBD50BD58BD59BD64BD68BD80BD81 +BD84BD87BD88BD89BD8ABD90BD91BD93BD95BD99BD9ABD9CBDA4BDB0BDB8BDD4 +BDD5BDD8BDDCBDE9BDF0BDF4BDF8BE00BE03BE05BE0CBE0DBE10BE14BE1CBE1D +BE1FBE44BE45BE48BE4CBE4EBE54BE55BE57BE59BE5ABE5BBE60BE61BE640000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D2FBD2FCD2FDD2FED2FFD302D304D306D307D308D309D30AD30BD30FD311 +D312D313D315D317D318D319D31AD31BD31ED322D32300000000000000000000 +0000D324D326D327D32AD32BD32DD32ED32FD331D332D333D334D335D336D337 +D33AD33ED33FD340D341D342D343D346D347D348D34900000000000000000000 +0000D34AD34BD34CD34DD34ED34FD350D351D352D353D354D355D356D357D358 +D359D35AD35BD35CD35DD35ED35FD360D361D362D363D364D365D366D367D368 +D369BE68BE6ABE70BE71BE73BE74BE75BE7BBE7CBE7DBE80BE84BE8CBE8DBE8F +BE90BE91BE98BE99BEA8BED0BED1BED4BED7BED8BEE0BEE3BEE4BEE5BEECBF01 +BF08BF09BF18BF19BF1BBF1CBF1DBF40BF41BF44BF48BF50BF51BF55BF94BFB0 +BFC5BFCCBFCDBFD0BFD4BFDCBFDFBFE1C03CC051C058C05CC060C068C069C090 +C091C094C098C0A0C0A1C0A3C0A5C0ACC0ADC0AFC0B0C0B3C0B4C0B5C0B6C0BC +C0BDC0BFC0C0C0C1C0C5C0C8C0C9C0CCC0D0C0D8C0D9C0DBC0DCC0DDC0E40000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D36AD36BD36CD36DD36ED36FD370D371D372D373D374D375D376D377D378 +D379D37AD37BD37ED37FD381D382D383D385D386D38700000000000000000000 +0000D388D389D38AD38BD38ED392D393D394D395D396D397D39AD39BD39DD39E +D39FD3A1D3A2D3A3D3A4D3A5D3A6D3A7D3AAD3ACD3AE00000000000000000000 +0000D3AFD3B0D3B1D3B2D3B3D3B5D3B6D3B7D3B9D3BAD3BBD3BDD3BED3BFD3C0 +D3C1D3C2D3C3D3C6D3C7D3CAD3CBD3CCD3CDD3CED3CFD3D1D3D2D3D3D3D4D3D5 +D3D6C0E5C0E8C0ECC0F4C0F5C0F7C0F9C100C104C108C110C115C11CC11DC11E +C11FC120C123C124C126C127C12CC12DC12FC130C131C136C138C139C13CC140 +C148C149C14BC14CC14DC154C155C158C15CC164C165C167C168C169C170C174 +C178C185C18CC18DC18EC190C194C196C19CC19DC19FC1A1C1A5C1A8C1A9C1AC +C1B0C1BDC1C4C1C8C1CCC1D4C1D7C1D8C1E0C1E4C1E8C1F0C1F1C1F3C1FCC1FD +C200C204C20CC20DC20FC211C218C219C21CC21FC220C228C229C22BC22D0000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D3D7D3D9D3DAD3DBD3DCD3DDD3DED3DFD3E0D3E2D3E4D3E5D3E6D3E7D3E8 +D3E9D3EAD3EBD3EED3EFD3F1D3F2D3F3D3F5D3F6D3F700000000000000000000 +0000D3F8D3F9D3FAD3FBD3FED400D402D403D404D405D406D407D409D40AD40B +D40CD40DD40ED40FD410D411D412D413D414D415D41600000000000000000000 +0000D417D418D419D41AD41BD41CD41ED41FD420D421D422D423D424D425D426 +D427D428D429D42AD42BD42CD42DD42ED42FD430D431D432D433D434D435D436 +D437C22FC231C232C234C248C250C251C254C258C260C265C26CC26DC270C274 +C27CC27DC27FC281C288C289C290C298C29BC29DC2A4C2A5C2A8C2ACC2ADC2B4 +C2B5C2B7C2B9C2DCC2DDC2E0C2E3C2E4C2EBC2ECC2EDC2EFC2F1C2F6C2F8C2F9 +C2FBC2FCC300C308C309C30CC30DC313C314C315C318C31CC324C325C328C329 +C345C368C369C36CC370C372C378C379C37CC37DC384C388C38CC3C0C3D8C3D9 +C3DCC3DFC3E0C3E2C3E8C3E9C3EDC3F4C3F5C3F8C408C410C424C42CC4300000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D438D439D43AD43BD43CD43DD43ED43FD441D442D443D445D446D447D448 +D449D44AD44BD44CD44DD44ED44FD450D451D452D45300000000000000000000 +0000D454D455D456D457D458D459D45AD45BD45DD45ED45FD461D462D463D465 +D466D467D468D469D46AD46BD46CD46ED470D471D47200000000000000000000 +0000D473D474D475D476D477D47AD47BD47DD47ED481D483D484D485D486D487 +D48AD48CD48ED48FD490D491D492D493D495D496D497D498D499D49AD49BD49C +D49DC434C43CC43DC448C464C465C468C46CC474C475C479C480C494C49CC4B8 +C4BCC4E9C4F0C4F1C4F4C4F8C4FAC4FFC500C501C50CC510C514C51CC528C529 +C52CC530C538C539C53BC53DC544C545C548C549C54AC54CC54DC54EC553C554 +C555C557C558C559C55DC55EC560C561C564C568C570C571C573C574C575C57C +C57DC580C584C587C58CC58DC58FC591C595C597C598C59CC5A0C5A9C5B4C5B5 +C5B8C5B9C5BBC5BCC5BDC5BEC5C4C5C5C5C6C5C7C5C8C5C9C5CAC5CCC5CE0000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D49ED49FD4A0D4A1D4A2D4A3D4A4D4A5D4A6D4A7D4A8D4AAD4ABD4ACD4AD +D4AED4AFD4B0D4B1D4B2D4B3D4B4D4B5D4B6D4B7D4B800000000000000000000 +0000D4B9D4BAD4BBD4BCD4BDD4BED4BFD4C0D4C1D4C2D4C3D4C4D4C5D4C6D4C7 +D4C8D4C9D4CAD4CBD4CDD4CED4CFD4D1D4D2D4D3D4D500000000000000000000 +0000D4D6D4D7D4D8D4D9D4DAD4DBD4DDD4DED4E0D4E1D4E2D4E3D4E4D4E5D4E6 +D4E7D4E9D4EAD4EBD4EDD4EED4EFD4F1D4F2D4F3D4F4D4F5D4F6D4F7D4F9D4FA +D4FCC5D0C5D1C5D4C5D8C5E0C5E1C5E3C5E5C5ECC5EDC5EEC5F0C5F4C5F6C5F7 +C5FCC5FDC5FEC5FFC600C601C605C606C607C608C60CC610C618C619C61BC61C +C624C625C628C62CC62DC62EC630C633C634C635C637C639C63BC640C641C644 +C648C650C651C653C654C655C65CC65DC660C66CC66FC671C678C679C67CC680 +C688C689C68BC68DC694C695C698C69CC6A4C6A5C6A7C6A9C6B0C6B1C6B4C6B8 +C6B9C6BAC6C0C6C1C6C3C6C5C6CCC6CDC6D0C6D4C6DCC6DDC6E0C6E1C6E80000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D4FED4FFD500D501D502D503D505D506D507D509D50AD50BD50DD50ED50F +D510D511D512D513D516D518D519D51AD51BD51CD51D00000000000000000000 +0000D51ED51FD520D521D522D523D524D525D526D527D528D529D52AD52BD52C +D52DD52ED52FD530D531D532D533D534D535D536D53700000000000000000000 +0000D538D539D53AD53BD53ED53FD541D542D543D545D546D547D548D549D54A +D54BD54ED550D552D553D554D555D556D557D55AD55BD55DD55ED55FD561D562 +D563C6E9C6ECC6F0C6F8C6F9C6FDC704C705C708C70CC714C715C717C719C720 +C721C724C728C730C731C733C735C737C73CC73DC740C744C74AC74CC74DC74F +C751C752C753C754C755C756C757C758C75CC760C768C76BC774C775C778C77C +C77DC77EC783C784C785C787C788C789C78AC78EC790C791C794C796C797C798 +C79AC7A0C7A1C7A3C7A4C7A5C7A6C7ACC7ADC7B0C7B4C7BCC7BDC7BFC7C0C7C1 +C7C8C7C9C7CCC7CEC7D0C7D8C7DDC7E4C7E8C7ECC800C801C804C808C80A0000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D564D566D567D56AD56CD56ED56FD570D571D572D573D576D577D579D57A +D57BD57DD57ED57FD580D581D582D583D586D58AD58B00000000000000000000 +0000D58CD58DD58ED58FD591D592D593D594D595D596D597D598D599D59AD59B +D59CD59DD59ED59FD5A0D5A1D5A2D5A3D5A4D5A6D5A700000000000000000000 +0000D5A8D5A9D5AAD5ABD5ACD5ADD5AED5AFD5B0D5B1D5B2D5B3D5B4D5B5D5B6 +D5B7D5B8D5B9D5BAD5BBD5BCD5BDD5BED5BFD5C0D5C1D5C2D5C3D5C4D5C5D5C6 +D5C7C810C811C813C815C816C81CC81DC820C824C82CC82DC82FC831C838C83C +C840C848C849C84CC84DC854C870C871C874C878C87AC880C881C883C885C886 +C887C88BC88CC88DC894C89DC89FC8A1C8A8C8BCC8BDC8C4C8C8C8CCC8D4C8D5 +C8D7C8D9C8E0C8E1C8E4C8F5C8FCC8FDC900C904C905C906C90CC90DC90FC911 +C918C92CC934C950C951C954C958C960C961C963C96CC970C974C97CC988C989 +C98CC990C998C999C99BC99DC9C0C9C1C9C4C9C7C9C8C9CAC9D0C9D1C9D30000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D5CAD5CBD5CDD5CED5CFD5D1D5D3D5D4D5D5D5D6D5D7D5DAD5DCD5DED5DF +D5E0D5E1D5E2D5E3D5E6D5E7D5E9D5EAD5EBD5EDD5EE00000000000000000000 +0000D5EFD5F0D5F1D5F2D5F3D5F6D5F8D5FAD5FBD5FCD5FDD5FED5FFD602D603 +D605D606D607D609D60AD60BD60CD60DD60ED60FD61200000000000000000000 +0000D616D617D618D619D61AD61BD61DD61ED61FD621D622D623D625D626D627 +D628D629D62AD62BD62CD62ED62FD630D631D632D633D634D635D636D637D63A +D63BC9D5C9D6C9D9C9DAC9DCC9DDC9E0C9E2C9E4C9E7C9ECC9EDC9EFC9F0C9F1 +C9F8C9F9C9FCCA00CA08CA09CA0BCA0CCA0DCA14CA18CA29CA4CCA4DCA50CA54 +CA5CCA5DCA5FCA60CA61CA68CA7DCA84CA98CABCCABDCAC0CAC4CACCCACDCACF +CAD1CAD3CAD8CAD9CAE0CAECCAF4CB08CB10CB14CB18CB20CB21CB41CB48CB49 +CB4CCB50CB58CB59CB5DCB64CB78CB79CB9CCBB8CBD4CBE4CBE7CBE9CC0CCC0D +CC10CC14CC1CCC1DCC21CC22CC27CC28CC29CC2CCC2ECC30CC38CC39CC3B0000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D63DD63ED63FD641D642D643D644D646D647D64AD64CD64ED64FD650D652 +D653D656D657D659D65AD65BD65DD65ED65FD660D66100000000000000000000 +0000D662D663D664D665D666D668D66AD66BD66CD66DD66ED66FD672D673D675 +D676D677D678D679D67AD67BD67CD67DD67ED67FD68000000000000000000000 +0000D681D682D684D686D687D688D689D68AD68BD68ED68FD691D692D693D695 +D696D697D698D699D69AD69BD69CD69ED6A0D6A2D6A3D6A4D6A5D6A6D6A7D6A9 +D6AACC3CCC3DCC3ECC44CC45CC48CC4CCC54CC55CC57CC58CC59CC60CC64CC66 +CC68CC70CC75CC98CC99CC9CCCA0CCA8CCA9CCABCCACCCADCCB4CCB5CCB8CCBC +CCC4CCC5CCC7CCC9CCD0CCD4CCE4CCECCCF0CD01CD08CD09CD0CCD10CD18CD19 +CD1BCD1DCD24CD28CD2CCD39CD5CCD60CD64CD6CCD6DCD6FCD71CD78CD88CD94 +CD95CD98CD9CCDA4CDA5CDA7CDA9CDB0CDC4CDCCCDD0CDE8CDECCDF0CDF8CDF9 +CDFBCDFDCE04CE08CE0CCE14CE19CE20CE21CE24CE28CE30CE31CE33CE350000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D6ABD6ADD6AED6AFD6B1D6B2D6B3D6B4D6B5D6B6D6B7D6B8D6BAD6BCD6BD +D6BED6BFD6C0D6C1D6C2D6C3D6C6D6C7D6C9D6CAD6CB00000000000000000000 +0000D6CDD6CED6CFD6D0D6D2D6D3D6D5D6D6D6D8D6DAD6DBD6DCD6DDD6DED6DF +D6E1D6E2D6E3D6E5D6E6D6E7D6E9D6EAD6EBD6ECD6ED00000000000000000000 +0000D6EED6EFD6F1D6F2D6F3D6F4D6F6D6F7D6F8D6F9D6FAD6FBD6FED6FFD701 +D702D703D705D706D707D708D709D70AD70BD70CD70DD70ED70FD710D712D713 +D714CE58CE59CE5CCE5FCE60CE61CE68CE69CE6BCE6DCE74CE75CE78CE7CCE84 +CE85CE87CE89CE90CE91CE94CE98CEA0CEA1CEA3CEA4CEA5CEACCEADCEC1CEE4 +CEE5CEE8CEEBCEECCEF4CEF5CEF7CEF8CEF9CF00CF01CF04CF08CF10CF11CF13 +CF15CF1CCF20CF24CF2CCF2DCF2FCF30CF31CF38CF54CF55CF58CF5CCF64CF65 +CF67CF69CF70CF71CF74CF78CF80CF85CF8CCFA1CFA8CFB0CFC4CFE0CFE1CFE4 +CFE8CFF0CFF1CFF3CFF5CFFCD000D004D011D018D02DD034D035D038D03C0000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D715D716D717D71AD71BD71DD71ED71FD721D722D723D724D725D726D727 +D72AD72CD72ED72FD730D731D732D733D736D737D73900000000000000000000 +0000D73AD73BD73DD73ED73FD740D741D742D743D745D746D748D74AD74BD74C +D74DD74ED74FD752D753D755D75AD75BD75CD75DD75E00000000000000000000 +0000D75FD762D764D766D767D768D76AD76BD76DD76ED76FD771D772D773D775 +D776D777D778D779D77AD77BD77ED77FD780D782D783D784D785D786D787D78A +D78BD044D045D047D049D050D054D058D060D06CD06DD070D074D07CD07DD081 +D0A4D0A5D0A8D0ACD0B4D0B5D0B7D0B9D0C0D0C1D0C4D0C8D0C9D0D0D0D1D0D3 +D0D4D0D5D0DCD0DDD0E0D0E4D0ECD0EDD0EFD0F0D0F1D0F8D10DD130D131D134 +D138D13AD140D141D143D144D145D14CD14DD150D154D15CD15DD15FD161D168 +D16CD17CD184D188D1A0D1A1D1A4D1A8D1B0D1B1D1B3D1B5D1BAD1BCD1C0D1D8 +D1F4D1F8D207D209D210D22CD22DD230D234D23CD23DD23FD241D248D25C0000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D78DD78ED78FD791D792D793D794D795D796D797D79AD79CD79ED79FD7A0 +D7A1D7A2D7A30000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D264D280D281D284D288D290D291D295D29CD2A0D2A4D2ACD2B1D2B8D2B9 +D2BCD2BFD2C0D2C2D2C8D2C9D2CBD2D4D2D8D2DCD2E4D2E5D2F0D2F1D2F4D2F8 +D300D301D303D305D30CD30DD30ED310D314D316D31CD31DD31FD320D321D325 +D328D329D32CD330D338D339D33BD33CD33DD344D345D37CD37DD380D384D38C +D38DD38FD390D391D398D399D39CD3A0D3A8D3A9D3ABD3ADD3B4D3B8D3BCD3C4 +D3C5D3C8D3C9D3D0D3D8D3E1D3E3D3ECD3EDD3F0D3F4D3FCD3FDD3FFD4010000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D408D41DD440D444D45CD460D464D46DD46FD478D479D47CD47FD480D482 +D488D489D48BD48DD494D4A9D4CCD4D0D4D4D4DCD4DFD4E8D4ECD4F0D4F8D4FB +D4FDD504D508D50CD514D515D517D53CD53DD540D544D54CD54DD54FD551D558 +D559D55CD560D565D568D569D56BD56DD574D575D578D57CD584D585D587D588 +D589D590D5A5D5C8D5C9D5CCD5D0D5D2D5D8D5D9D5DBD5DDD5E4D5E5D5E8D5EC +D5F4D5F5D5F7D5F9D600D601D604D608D610D611D613D614D615D61CD6200000 +C8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D624D62DD638D639D63CD640D645D648D649D64BD64DD651D654D655D658 +D65CD667D669D670D671D674D683D685D68CD68DD690D694D69DD69FD6A1D6A8 +D6ACD6B0D6B9D6BBD6C4D6C5D6C8D6CCD6D1D6D4D6D7D6D9D6E0D6E4D6E8D6F0 +D6F5D6FCD6FDD700D704D711D718D719D71CD720D728D729D72BD72DD734D735 +D738D73CD744D747D749D750D751D754D756D757D758D759D760D761D763D765 +D769D76CD770D774D77CD77DD781D788D789D78CD790D798D799D79BD79D0000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F3D4F73504750F952A053EF547554E556095AC15BB6668767B667B767EF +6B4C73C275C27A3C82DB8304885788888A368CC88DCF8EFB8FE699D5523B5374 +5404606A61646BBC73CF811A89BA89D295A34F83520A58BE597859E65E725E79 +61C763C0674667EC687F6F97764E770B78F57A087AFF7C21809D826E82718AEB +95934E6B559D66F76E3478A37AED845B8910874E97A852D8574E582A5D4C611F +61BE6221656267D16A446E1B751875B376E377B07D3A90AF945194529F950000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053235CAC753280DB92409598525B580859DC5CA15D175EB75F3A5F4A6177 +6C5F757A75867CE07D737DB17F8C81548221859189418B1B92FC964D9C474ECB +4EF7500B51F1584F6137613E6168653969EA6F1175A5768676D67B8782A584CB +F90093A7958B55805BA25751F9017CB37FB991B5502853BB5C455DE862D2636E +64DA64E76E2070AC795B8DDD8E1EF902907D924592F84E7E4EF650655DFE5EFA +61066957817186548E4793759A2B4E5E5091677068405109528D52926AA20000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077BC92109ED452AB602F8FF2504861A963ED64CA683C6A846FC0818889A1 +96945805727D72AC75047D797E6D80A9898B8B7490639D5162896C7A6F547D50 +7F3A8A23517C614A7B9D8B199257938C4EAC4FD3501E50BE510652C152CD537F +577058835E9A5F91617661AC64CE656C666F66BB66F468976D87708570F1749F +74A574CA75D9786C78EC7ADF7AF67D457D938015803F811B83968B668F159015 +93E1980398389A5A9BE84FC25553583A59515B635C4660B86212684268B00000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068E86EAA754C767878CE7A3D7CFB7E6B7E7C8A088AA18C3F968E9DC453E4 +53E9544A547156FA59D15B645C3B5EAB62F765376545657266A067AF69C16CBD +75FC7690777E7A3F7F94800380A1818F82E682FD83F085C1883188B48AA5F903 +8F9C932E96C798679AD89F1354ED659B66F2688F7A408C379D6056F057645D11 +660668B168CD6EFE7428889E9BE46C68F9049AA84F9B516C5171529F5B545DE5 +6050606D62F163A7653B73D97A7A86A38CA2978F4E325BE16208679C74DC0000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079D183D38A878AB28DE8904E934B98465ED369E885FF90EDF90551A05B98 +5BEC616368FA6B3E704C742F74D87BA17F5083C589C08CAB95DC9928522E605D +62EC90024F8A5149532158D95EE366E06D38709A72C273D67B5080F1945B5366 +639B7F6B4E565080584A58DE602A612762D069D09B415B8F7D1880B18F5F4EA4 +50D154AC55AC5B0C5DA05DE7652A654E68216A4B72E1768E77EF7D5E7FF981A0 +854E86DF8F038F4E90CA99039A559BAB4E184E454E5D4EC74FF1517752FE0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000534053E353E5548E5614577557A25BC75D875ED061FC62D8655167B867E9 +69CB6B506BC66BEC6C426E9D707872D77396740377BF77E97A767D7F800981FC +8205820A82DF88628B338CFC8EC0901190B1926492B699D29A459CE99DD79F9C +570B5C4083CA97A097AB9EB4541B7A987FA488D98ECD90E158005C4863987A9F +5BAE5F137A797AAE828E8EAC5026523852F85377570862F363726B0A6DC37737 +53A5735785688E7695D5673A6AC36F708A6D8ECC994BF90666776B788CB40000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B3CF90753EB572D594E63C669FB73EA78457ABA7AC57CFE8475898F8D73 +903595A852FB574775477B6083CC921EF9086A58514B524B5287621F68D86975 +969950C552A452E461C365A4683969FF747E7B4B82B983EB89B28B398FD19949 +F9094ECA599764D266116A8E7434798179BD82A9887E887F895FF90A93264F0B +53CA602562716C727D1A7D664E98516277DC80AF4F014F0E5176518055DC5668 +573B57FA57FC5914594759935BC45C905D0E5DF15E7E5FCC628065D765E30000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000671E671F675E68CB68C46A5F6B3A6C236C7D6C826DC773987426742A7482 +74A37578757F788178EF794179477948797A7B957D007DBA7F888006802D808C +8A188B4F8C488D779321932498E299519A0E9A0F9A659E927DCA4F76540962EE +685491D155AB513AF90BF90C5A1C61E6F90D62CF62FFF90EF90FF910F911F912 +F91390A3F914F915F916F917F9188AFEF919F91AF91BF91C6696F91D7156F91E +F91F96E3F920634F637A5357F921678F69606E73F9227537F923F924F9250000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D0DF926F927887256CA5A18F928F929F92AF92BF92C4E43F92D51675948 +67F08010F92E59735E74649A79CA5FF5606C62C8637B5BE75BD752AAF92F5974 +5F296012F930F931F9327459F933F934F935F936F937F93899D1F939F93AF93B +F93CF93DF93EF93FF940F941F942F9436FC3F944F94581BF8FB260F1F946F947 +8166F948F9495C3FF94AF94BF94CF94DF94EF94FF950F9515AE98A25677B7D10 +F952F953F954F955F956F95780FDF958F9595C3C6CE5533F6EBA591A83360000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E394EB64F4655AE571858C75F5665B765E66A806BB56E4D77ED7AEF7C1E +7DDE86CB88929132935B64BB6FBE737A75B890545556574D61BA64D466C76DE1 +6E5B6F6D6FB975F0804381BD854189838AC78B5A931F6C9375537B548E0F905D +5510580258585E626207649E68E075767CD687B39EE84EE35788576E59275C0D +5CB15E365F85623464E173B381FA888B8CB8968A9EDB5B855FB760B350125200 +52305716583558575C0E5C605CF65D8B5EA65F9260BC63116389641768430000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068F96AC26DD86E216ED46FE471FE76DC777979B17A3B840489A98CED8DF3 +8E4890039014905390FD934D967697DC6BD27006725872A27368776379BF7BE4 +7E9B8B8058A960C7656665FD66BE6C8C711E71C98C5A98134E6D7A814EDD51AC +51CD52D5540C61A76771685068DF6D1E6F7C75BC77B37AE580F484639285515C +6597675C679375D87AC78373F95A8C469017982D5C6F81C0829A9041906F920D +5F975D9D6A5971C8767B7B4985E48B0491279A30558761F6F95B76697F850000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000863F87BA88F8908FF95C6D1B70D973DE7D61843DF95D916A99F1F95E4E82 +53756B046B12703E721B862D9E1E524C8FA35D5064E5652C6B166FEB7C437E9C +85CD896489BD62C981D8881F5ECA67176D6A72FC7405746F878290DE4F865D0D +5FA0840A51B763A075654EAE5006516951C968816A117CAE7CB17CE7826F8AD2 +8F1B91CF4FB6513752F554425EEC616E623E65C56ADA6FFE792A85DC882395AD +9A629A6A9E979ECE529B66C66B77701D792B8F6297426190620065236F230000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000714974897DF4806F84EE8F269023934A51BD521752A36D0C70C888C25EC9 +65826BAE6FC27C3E73754EE44F3656F9F95F5CBA5DBA601C73B27B2D7F9A7FCE +8046901E923496F6974898189F614F8B6FA779AE91B496B752DEF960648864C4 +6AD36F5E7018721076E780018606865C8DEF8F0597329B6F9DFA9E75788C797F +7DA083C993049E7F9E938AD658DF5F046727702774CF7C60807E512170287262 +78CA8CC28CDA8CF496F74E8650DA5BEE5ED6659971CE764277AD804A84FC0000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000907C9B279F8D58D85A415C626A136DDA6F0F763B7D2F7E37851E893893E4 +964B528965D267F369B46D416E9C700F7409746075597624786B8B2C985E516D +622E96784F96502B5D196DEA7DB88F2A5F8B61446817F961968652D2808B51DC +51CC695E7A1C7DBE83F196754FDA52295398540F550E5C6560A7674E68A86D6C +728172F874067483F96275E27C6C7F797FB8838988CF88E191CC91D096E29BC9 +541D6F7E71D0749885FA8EAA96A39C579E9F67976DCB743381E89716782C0000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ACB7B207C926469746A75F278BC78E899AC9B549EBB5BDE5E556F20819C +83AB90884E07534D5A295DD25F4E6162633D666966FC6EFF6F2B7063779E842C +8513883B8F1399459C3B551C62B9672B6CAB8309896A977A4EA159845FD85FD9 +671B7DB27F548292832B83BD8F1E909957CB59B95A925BD06627679A68856BCF +71647F758CB78CE390819B4581088C8A964C9A409EA55B5F6C13731B76F276DF +840C51AA8993514D519552C968C96C94770477207DBF7DEC97629EB56EC50000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000851151A5540D547D660E669D69276E9F76BF7791831784C2879F91699298 +9CF488824FAE519252DF59C65E3D61556478647966AE67D06A216BCD6BDB725F +72617441773877DB801782BC83058B008B288C8C67286C90726776EE77667A46 +9DA96B7F6C92592267268499536F589359995EDF63CF663467736E3A732B7AD7 +82D7932852D95DEB61AE61CB620A62C764AB65E069596B666BCB712173F7755D +7E46821E8302856A8AA38CBF97279D6158A89ED85011520E543B554F65870000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C767D0A7D0B805E868A958096EF52FF6C95726954735A9A5C3E5D4B5F4C +5FAE672A68B669636E3C6E4477097C737F8E85878B0E8FF797619EF45CB760B6 +610D61AB654F65FB65FC6C116CEF739F73C97DE195945BC6871C8B10525D535A +62CD640F64B267346A386CCA73C0749E7B947C957E1B818A823685848FEB96F9 +99C14F34534A53CD53DB62CC642C6500659169C36CEE6F5873ED7554762276E4 +76FC78D078FB792C7D46822C87E08FD4981298EF52C362D464A56E246F510000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000767C8DCB91B192629AEE9B435023508D574A59A85C285E475F77623F653E +65B965C16609678B699C6EC278C57D2180AA8180822B82B384A1868C8A2A8B17 +90A696329F90500D4FF3F96357F95F9862DC6392676F6E43711976C380CC80DA +88F488F589198CE08F29914D966A4F2F4F705E1B67CF6822767D767E9B445E61 +6A0A716971D4756AF9647E41854385E998DC4F107B4F7F7095A551E15E0668B5 +6C3E6C4E6CDB72AF7BC483036CD5743A50FB528858C164D86A9774A776560000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078A7861795E29739F965535E5F018B8A8FA88FAF908A522577A59C499F08 +4E19500251755C5B5E77661E663A67C468C570B3750175C579C97ADD8F279920 +9A084FDD582158315BF6666E6B656D116E7A6F7D73E4752B83E988DC89138B5C +8F144F0F50D55310535C5B935FA9670D798F8179832F8514890789868F398F3B +99A59C12672C4E764FF859495C015CEF5CF0636768D270FD71A2742B7E2B84EC +8702902292D29CF34E0D4ED84FEF50855256526F5426549057E0592B5A660000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005B5A5B755BCC5E9CF9666276657765A76D6E6EA572367B267C3F7F368150 +8151819A8240829983A98A038CA08CE68CFB8D748DBA90E891DC961C964499D9 +9CE7531752065429567458B35954596E5FFF61A4626E66106C7E711A76C67C89 +7CDE7D1B82AC8CC196F0F9674F5B5F175F7F62C25D29670B68DA787C7E439D6C +4E1550995315532A535159835A625E8760B2618A624962796590678769A76BD4 +6BD66BD76BD86CB8F968743575FA7812789179D579D87C837DCB7FE180A50000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000813E81C283F2871A88E88AB98B6C8CBB9119975E98DB9F3B56AC5B2A5F6C +658C6AB36BAF6D5C6FF17015725D73AD8CA78CD3983B61916C3780589A014E4D +4E8B4E9B4ED54F3A4F3C4F7F4FDF50FF53F253F8550655E356DB58EB59625A11 +5BEB5BFA5C045DF35E2B5F99601D6368659C65AF67F667FB68AD6B7B6C996CD7 +6E23700973457802793E7940796079C17BE97D177D728086820D838E84D186C7 +88DF8A508A5E8B1D8CDC8D668FAD90AA98FC99DF9E9D524AF9696714F96A0000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005098522A5C7165636C5573CA7523759D7B97849C917897304E7764926BBA +715E85A94E09F96B674968EE6E17829F8518886B63F76F81921298AF4E0A50B7 +50CF511F554655AA56175B405C195CE05E385E8A5EA05EC260F368516A616E58 +723D724072C076F879657BB17FD488F389F48A738C618CDE971C585E74BD8CFD +55C7F96C7A617D2282727272751F7525F96D7B19588558FB5DBC5E8F5EB65F90 +60556292637F654D669166D966F8681668F27280745E7B6E7D6E7DD67F720000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000080E5821285AF897F8A93901D92E49ECD9F205915596D5E2D60DC66146673 +67906C506DC56F5F77F378A984C691CB932B4ED950CA514855845B0B5BA36247 +657E65CB6E32717D74017444748774BF766C79AA7DDA7E557FA8817A81B38239 +861A87EC8A758DE3907892919425994D9BAE53685C5169546CC46D296E2B820C +859B893B8A2D8AAA96EA9F67526166B96BB27E9687FE8D0D9583965D651D6D89 +71EEF96E57CE59D35BAC602760FA6210661F665F732973F976DB77017B6C0000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008056807281658AA091924E1652E26B726D177A057B397D30F96F8CB053EC +562F58515BB55C0F5C115DE2624063836414662D68B36CBC6D886EAF701F70A4 +71D27526758F758E76197B117BE07C2B7D207D39852C856D86078A34900D9061 +90B592B797F69A374FD75C6C675F6D917C9F7E8C8B168D16901F5B6B5DFD640D +84C0905C98E173875B8B609A677E6DDE8A1F8AA69001980C5237F9707051788E +9396887091D74FEE53D755FD56DA578258FD5AC25B885CAB5CC05E2561010000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000620D624B6388641C653665786A396B8A6C346D196F3171E772E973787407 +74B27626776179C07A577AEA7CB97D8F7DAC7E617F9E81298331849084DA85EA +88968AB08B908F3890429083916C929692B9968B96A796A896D6970098089996 +9AD39B1A53D4587E59195B705BBF6DD16F5A719F742174B9808583FD5DE15F87 +5FAA604265EC6812696F6A536B896D356DF373E376FE77AC7B4D7D148123821C +834084F485638A628AC49187931E980699B4620C88538FF092655D075D270000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005D69745F819D87686FD562FE7FD2893689724E1E4E5850E752DD5347627F +66077E698805965E4F8D5319563659CB5AA45C385C4E5C4D5E025F11604365BD +662F664267BE67F4731C77E2793A7FC5849484CD89968A668A698AE18C558C7A +57F45BD45F0F606F62ED690D6B966E5C71847BD287558B588EFE98DF98FE4F38 +4F814FE1547B5A205BB8613C65B0666871FC7533795E7D33814E81E3839885AA +85CE87038A0A8EAB8F9BF9718FC559315BA45BE660895BE95C0B5FC36C810000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9726DF1700B751A82AF8AF64EC05341F97396D96C0F4E9E4FC45152555E +5A255CE86211725982BD83AA86FE88598A1D963F96C599139D099D5D580A5CB3 +5DBD5E4460E1611563E16A026E2591029354984E9C109F775B895CB86309664F +6848773C96C1978D98549B9F65A18B018ECB95BC55355CA95DD65EB56697764C +83F495C758D362BC72CE9D284EF0592E600F663B6B8379E79D26539354C057C3 +5D16611B66D66DAF788D827E969897445384627C63966DB27E0A814B984D0000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006AFB7F4C9DAF9E1A4E5F503B51B6591C60F963F66930723A8036F97491CE +5F31F975F9767D0482E5846F84BB85E58E8DF9774F6FF978F97958E45B436059 +63DA6518656D6698F97A694A6A236D0B7001716C75D2760D79B37A70F97B7F8A +F97C8944F97D8B9391C0967DF97E990A57045FA165BC6F01760079A68A9E99AD +9B5A9F6C510461B662916A8D81C6504358305F6671098A008AFA5B7C86164FFA +513C56B4594463A96DF95DAA696D51864E884F59F97FF980F9815982F9820000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9836B5F6C5DF98474B57916F9858207824583398F3F8F5DF9869918F987 +F988F9894EA6F98A57DF5F796613F98BF98C75AB7E798B6FF98D90069A5B56A5 +582759F85A1F5BB4F98E5EF6F98FF9906350633BF991693D6C876CBF6D8E6D93 +6DF56F14F99270DF71367159F99371C371D5F994784F786FF9957B757DE3F996 +7E2FF997884D8EDFF998F999F99A925BF99B9CF6F99CF99DF99E60856D85F99F +71B1F9A0F9A195B153ADF9A2F9A3F9A467D3F9A5708E71307430827682D20000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9A695BB9AE59E7D66C4F9A771C18449F9A8F9A9584BF9AAF9AB5DB85F71 +F9AC6620668E697969AE6C386CF36E366F416FDA701B702F715071DF7370F9AD +745BF9AE74D476C87A4E7E93F9AFF9B082F18A608FCEF9B19348F9B29719F9B3 +F9B44E42502AF9B5520853E166F36C6D6FCA730A777F7A6282AE85DD8602F9B6 +88D48A638B7D8C6BF9B792B3F9B8971398104E944F0D4FC950B25348543E5433 +55DA586258BA59675A1B5BE4609FF9B961CA655665FF666468A76C5A6FB30000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000070CF71AC73527B7D87088AA49C329F075C4B6C8373447389923A6EAB7465 +761F7A697E15860A514058C564C174EE751576707FC1909596CD99546E2674E6 +7AA97AAA81E586D987788A1B5A495B8C5B9B68A169006D6373A97413742C7897 +7DE97FEB81188155839E8C4C962E981166F05F8065FA67896C6A738B502D5A03 +6B6A77EE59165D6C5DCD7325754FF9BAF9BB50E551F9582F592D599659DA5BE5 +F9BCF9BD5DA262D76416649364FEF9BE66DCF9BF6A48F9C071FF7464F9C10000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A887AAF7E477E5E80008170F9C287EF89818B209059F9C390809952617E +6B326D747E1F89258FB14FD150AD519752C757C758895BB95EB8614269956D8C +6E676EB6719474627528752C8073833884C98E0A939493DEF9C44E8E4F515076 +512A53C853CB53F35B875BD35C24611A618265F4725B7397744076C279507991 +79B97D067FBD828B85D5865E8FC2904790F591EA968596E896E952D65F6765ED +6631682F715C7A3690C1980A4E91F9C56A526B9E6F907189801882B885530000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000904B969596F297FB851A9B314E90718A96C45143539F54E15713571257A3 +5A9B5AC45BC36028613F63F46C856D396E726E907230733F745782D188818F45 +9060F9C6966298589D1B67088D8A925E4F4D504950DE5371570D59D45A015C09 +617066906E2D7232744B7DEF80C3840E8466853F875F885B89188B02905597CB +9B4F4E734F915112516AF9C7552F55A95B7A5BA55E7C5E7D5EBE60A060DF6108 +610963C465386709F9C867D467DAF9C9696169626CB96D27F9CA6E38F9CB0000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FE173367337F9CC745C7531F9CD7652F9CEF9CF7DAD81FE843888D58A98 +8ADB8AED8E308E42904A903E907A914991C9936EF9D0F9D15809F9D26BD38089 +80B2F9D3F9D45141596B5C39F9D5F9D66F6473A780E48D07F9D79217958FF9D8 +F9D9F9DAF9DB807F620E701C7D68878DF9DC57A0606961476BB78ABE928096B1 +4E59541F6DEB852D967097F398EE63D66CE3909151DD61C981BA9DF94F9D501A +51005B9C610F61FF64EC69056BC5759177E37FA98264858F87FB88638ABC0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B7091AB4E8C4EE54F0AF9DDF9DE593759E8F9DF5DF25F1B5F5B6021F9E0 +F9E1F9E2F9E3723E73E5F9E4757075CDF9E579FBF9E6800C8033808482E18351 +F9E7F9E88CBD8CB39087F9E9F9EA98F4990CF9EBF9EC703776CA7FCA7FCC7FFC +8B1A4EBA4EC152035370F9ED54BD56E059FB5BC55F155FCD6E6EF9EEF9EF7D6A +8335F9F086938A8DF9F1976D9777F9F2F9F34E004F5A4F7E58F965E56EA29038 +93B099B94EFB58EC598A59D96041F9F4F9F57A14F9F6834F8CC3516553440000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9F7F9F8F9F94ECD52695B5582BF4ED4523A54A859C959FF5B505B575B5C +606361486ECB7099716E738674F775B578C17D2B800581EA8328851785C98AEE +8CC796CC4F5C52FA56BC65AB6628707C70B872357DBD828D914C96C09D725B71 +68E76B986F7A76DE5C9166AB6F5B7BB47C2A883696DC4E084ED75320583458BB +58EF596C5C075E335E845F35638C66B267566A1F6AA36B0C6F3F7246F9FA7350 +748B7AE07CA7817881DF81E7838A846C8523859485CF88DD8D1391AC95770000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000969C518D54C957285BB0624D6750683D68936E3D6ED3707D7E2188C18CA1 +8F099F4B9F4E722D7B8F8ACD931A4F474F4E5132548059D05E9562B56775696E +6A176CAE6E1A72D9732A75BD7BB87D3582E783F9845785F78A5B8CAF8E879019 +90B896CE9F5F52E3540A5AE15BC2645865756EF472C4F9FB76847A4D7B1B7C4D +7E3E7FDF837B8B2B8CCA8D648DE18E5F8FEA8FF9906993D14F434F7A50B35168 +5178524D526A5861587C59605C085C555EDB609B623068136BBF6C086FB10000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000714E742075307538755176727B4C7B8B7BAD7BC67E8F8A6E8F3E8F49923F +92939322942B96FB985A986B991E5207622A62986D5976647ACA7BC07D765360 +5CBE5E976F3870B97C9897119B8E9EDE63A5647A87764E014E954EAD505C5075 +544859C35B9A5E405EAD5EF75F8160C5633A653F657465CC6676667867FE6968 +6A896B636C406DC06DE86E1F6E5E701E70A1738E73FD753A775B7887798E7A0B +7A7D7CBE7D8E82478A028AEA8C9E912D914A91D8926692CC9320970697560000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000975C98029F0E52365291557C58245E1D5F1F608C63D068AF6FDF796D7B2C +81CD85BA88FD8AF88E44918D9664969B973D984C9F4A4FCE514651CB52A95632 +5F145F6B63AA64CD65E9664166FA66F9671D689D68D769FD6F156F6E716771E5 +722A74AA773A7956795A79DF7A207A957C977CDF7D447E70808785FB86A48A54 +8ABF8D998E819020906D91E3963B96D59CE565CF7C078DB393C35B585C0A5352 +62D9731D50275B975F9E60B0616B68D56DD9742E7A2E7D427D9C7E31816B0000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008E2A8E35937E94184F5057505DE65EA7632B7F6A4E3B4F4F4F8F505A59DD +80C4546A546855FE594F5B995DDE5EDA665D673167F1682A6CE86D326E4A6F8D +70B773E075877C4C7D027D2C7DA2821F86DB8A3B8A858D708E8A8F339031914E +9152944499D07AF97CA54FCA510151C657C85BEF5CFB66596A3D6D5A6E966FEC +710C756F7AE388229021907596CB99FF83014E2D4EF2884691CD537D6ADB696B +6C41847A589E618E66FE62EF70DD751175C77E5284B88B498D084E4B53EA0000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054AB573057405FD763016307646F652F65E8667A679D67B36B626C606C9A +6F2C77E57825794979577D1980A2810281F3829D82B787188A8CF9FC8D048DBE +907276F47A197A377E548077550755D45875632F64226649664B686D699B6B84 +6D256EB173CD746874A1755B75B976E1771E778B79E67E097E1D81FB852F8897 +8A3A8CD18EEB8FB0903293AD9663967397074F8453F159EA5AC95E19684E74C6 +75BE79E97A9281A386ED8CEA8DCC8FED659F6715F9FD57F76F577DDD8F2F0000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093F696C65FB561F26F844E144F98501F53C955DF5D6F5DEE6B216B6478CB +7B9AF9FE8E498ECA906E6349643E77407A84932F947F9F6A64B06FAF71E674A8 +74DA7AC47C127E827CB27E988B9A8D0A947D9910994C52395BDF64E6672D7D2E +50ED53C358796158615961FA65AC7AD98B928B9650095021527555315A3C5EE0 +5F706134655E660C663666A269CD6EC46F32731676217A938139825983D684BC +50B557F05BC05BE85F6963A178267DB583DC852191C791F5518A67F57B560000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008CAC51C459BB60BD8655501CF9FF52545C3A617D621A62D364F265A56ECC +7620810A8E60965F96BB4EDF5343559859295DDD64C56CC96DFA73947A7F821B +85A68CE48E10907791E795E1962197C651F854F255865FB964A46F887DB48F1F +8F4D943550C95C166CBE6DFB751B77BB7C3D7C648A798AC2581E59BE5E166377 +7252758A776B8ADC8CBC8F125EF366746DF8807D83C18ACB97519BD6FA005243 +66FF6D956EEF7DE08AE6902E905E9AD4521D527F54E86194628462DB68A20000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006912695A6A3570927126785D7901790E79D27A0D8096827882D583498549 +8C828D859162918B91AE4FC356D171ED77D7870089F85BF85FD6675190A853E2 +585A5BF560A4618164607E3D80708525928364AE50AC5D146700589C62BD63A8 +690E69786A1E6E6B76BA79CB82BB84298ACF8DA88FFD9112914B919C93109318 +939A96DB9A369C0D4E11755C795D7AFA7B517BC97E2E84C48E598E748EF89010 +6625693F744351FA672E9EDC51455FE06C9687F2885D887760B481B584030000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008D0553D6543956345A365C31708A7FE0805A810681ED8DA391899A5F9DF2 +50744EC453A060FB6E2C5C644F88502455E45CD95E5F606568946CBB6DC471BE +75D475F476617A1A7A497DC77DFB7F6E81F486A98F1C96C999B39F52524752C5 +98ED89AA4E0367D26F064FB55BE267956C886D78741B782791DD937C87C479E4 +7A315FEB4ED654A4553E58AE59A560F0625362D6673669558235964099B199DD +502C53535544577CFA016258FA0264E2666B67DD6FC16FEF742274388A170000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094385451560657665F48619A6B4E705870AD7DBB8A95596A812B63A27708 +803D8CAA5854642D69BB5B955E116E6FFA038569514C53F0592A6020614B6B86 +6C706CF07B1E80CE82D48DC690B098B1FA0464C76FA464916504514E5410571F +8A0E615F6876FA0575DB7B527D71901A580669CC817F892A9000983950785957 +59AC6295900F9B2A615D727995D657615A465DF4628A64AD64FA67776CE26D3E +722C743678347F7782AD8DDB981752245742677F724874E38CA98FA692110000 +F8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000962A516B53ED634C4F695504609665576C9B6D7F724C72FD7A1789878C9D +5F6D6F8E70F981A8610E4FBF504F624172477BC77DE87FE9904D97AD9A198CB6 +576A5E7367B0840D8A5554205B165E635EE25F0A658380BA853D9589965B4F48 +5305530D530F548654FA57035E036016629B62B16355FA066CE16D6675B17832 +80DE812F82DE846184B2888D8912900B92EA98FD9B915E4566B466DD70117206 +FA074FF5527D5F6A615367536A196F0274E2796888688C7998C798C49A430000 +F9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054C17A1F69538AF78C4A98A899AE5F7C62AB75B276AE88AB907F96425339 +5F3C5FC56CCC73CC7562758B7B4682FE999D4E4F903C4E0B4F5553A6590F5EC8 +66306CB37455837787668CC09050971E9C1558D15B7886508B149DB45BD26068 +608D65F16C576F226FA3701A7F557FF095919592965097D352728F4451FD542B +54B85563558A6ABB6DB57DD88266929C96779E79540854C876D286E495A495D4 +965C4EA24F0959EE5AE65DF760526297676D68416C866E2F7F38809B822A0000 +FA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FA08FA0998054EA5505554B35793595A5B695BB361C869776D77702387F9 +89E38A728AE7908299ED9AB852BE683850165E78674F8347884C4EAB541156AE +73E6911597FF9909995799995653589F865B8A3161B26AF6737B8ED26B4796AA +9A57595572008D6B97694FD45CF45F2661F8665B6CEB70AB738473B973FE7729 +774D7D437D627E2382378852FA0A8CE29249986F5B517A74884098015ACC4FE0 +5354593E5CFD633E6D7972F98105810783A292CF98304EA851445211578B0000 +FB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F626CC26ECE7005705070AF719273E97469834A87A28861900890A293A3 +99A8516E5F5760E0616766B385598E4A91AF978B4E4E4E92547C58D558FA597D +5CB55F2762366248660A66676BEB6D696DCF6E566EF86F946FE06FE9705D72D0 +7425745A74E07693795C7CCA7E1E80E182A6846B84BF864E865F87748B778C6A +93AC9800986560D1621691775A5A660F6DF76E3E743F9B425FFD60DA7B0F54C4 +5F186C5E6CD36D2A70D87D0586798A0C9D3B5316548C5B056A3A706B75750000 +FC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000798D79BE82B183EF8A718B418CA89774FA0B64F4652B78BA78BB7A6B4E38 +559A59505BA65E7B60A363DB6B61666568536E19716574B07D0890849A699C25 +6D3B6ED1733E8C4195CA51F05E4C5FA8604D60F66130614C6643664469A56CC1 +6E5F6EC96F62714C749C76877BC17C27835287579051968D9EC3532F56DE5EFB +5F8A6062609461F7666667036A9C6DEE6FAE7070736A7E6A81BE833486D48AA8 +8CC4528373725B966A6B940454EE56865B5D6548658566C9689F6D8D6DC60000 +FD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000723B80B491759A4D4FAF5019539A540E543C558955C55E3F5F8C673D7166 +73DD900552DB52F3586458CE7104718F71FB85B08A13668885A855A76684714A +8431534955996BC15F595FBD63EE668971478AF18F1D9EBE4F11643A70CB7566 +866760648B4E9DF8514751F653086D3680F89ED166156B23709875D554035C79 +7D078A166B206B3D6B46543860706D3D7FD5820850D651DE559C566B56CD59EC +5B095E0C619961986231665E66E6719971B971BA72A779A77A007FB28A700000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp950.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp950.enc new file mode 100644 index 00000000..f33d7854 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/cp950.enc @@ -0,0 +1,1499 @@ +# Encoding file: cp950, multi-byte +M +003F 0 88 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3000FF0C30013002FF0E2027FF1BFF1AFF1FFF01FE3020262025FE50FE51FE52 +00B7FE54FE55FE56FE57FF5C2013FE312014FE332574FE34FE4FFF08FF09FE35 +FE36FF5BFF5DFE37FE3830143015FE39FE3A30103011FE3BFE3C300A300BFE3D +FE3E30083009FE3FFE40300C300DFE41FE42300E300FFE43FE44FE59FE5A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FE5BFE5CFE5DFE5E20182019201C201D301D301E20352032FF03FF06FF0A +203B00A7300325CB25CF25B325B225CE2606260525C725C625A125A025BD25BC +32A3210500AFFFE3FF3F02CDFE49FE4AFE4DFE4EFE4BFE4CFE5FFE60FE61FF0B +FF0D00D700F700B1221AFF1CFF1EFF1D226622672260221E22522261FE62FE63 +FE64FE65FE66FF5E2229222A22A52220221F22BF33D233D1222B222E22352234 +26402642229522992191219321902192219621972199219822252223FF0F0000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FF3C2215FE68FF04FFE53012FFE0FFE1FF05FF2021032109FE69FE6AFE6B33D5 +339C339D339E33CE33A1338E338F33C400B05159515B515E515D5161516355E7 +74E97CCE25812582258325842585258625872588258F258E258D258C258B258A +2589253C2534252C2524251C2594250025022595250C251025142518256D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000256E2570256F2550255E256A256125E225E325E525E4257125722573FF10 +FF11FF12FF13FF14FF15FF16FF17FF18FF192160216121622163216421652166 +216721682169302130223023302430253026302730283029534153445345FF21 +FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30FF31 +FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF41FF42FF43FF44FF45FF46FF47 +FF48FF49FF4AFF4BFF4CFF4DFF4EFF4FFF50FF51FF52FF53FF54FF55FF560000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FF57FF58FF59FF5A039103920393039403950396039703980399039A039B039C +039D039E039F03A003A103A303A403A503A603A703A803A903B103B203B303B4 +03B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C103C303C403C5 +03C603C703C803C931053106310731083109310A310B310C310D310E310F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00003110311131123113311431153116311731183119311A311B311C311D311E +311F312031213122312331243125312631273128312902D902C902CA02C702CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000020AC00000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E004E594E014E034E434E5D4E864E8C4EBA513F5165516B51E052005201529B +53155341535C53C84E094E0B4E084E0A4E2B4E3851E14E454E484E5F4E5E4E8E +4EA15140520352FA534353C953E3571F58EB5915592759735B505B515B535BF8 +5C0F5C225C385C715DDD5DE55DF15DF25DF35DFE5E725EFE5F0B5F13624D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E114E104E0D4E2D4E304E394E4B5C394E884E914E954E924E944EA24EC1 +4EC04EC34EC64EC74ECD4ECA4ECB4EC4514351415167516D516E516C519751F6 +52065207520852FB52FE52FF53165339534853475345535E538453CB53CA53CD +58EC5929592B592A592D5B545C115C245C3A5C6F5DF45E7B5EFF5F145F155FC3 +62086236624B624E652F6587659765A465B965E566F0670867286B206B626B79 +6BCB6BD46BDB6C0F6C34706B722A7236723B72477259725B72AC738B4E190000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E164E154E144E184E3B4E4D4E4F4E4E4EE54ED84ED44ED54ED64ED74EE34EE4 +4ED94EDE514551445189518A51AC51F951FA51F8520A52A0529F530553065317 +531D4EDF534A534953615360536F536E53BB53EF53E453F353EC53EE53E953E8 +53FC53F853F553EB53E653EA53F253F153F053E553ED53FB56DB56DA59160000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000592E5931597459765B555B835C3C5DE85DE75DE65E025E035E735E7C5F01 +5F185F175FC5620A625362546252625165A565E6672E672C672A672B672D6B63 +6BCD6C116C106C386C416C406C3E72AF7384738974DC74E67518751F75287529 +7530753175327533758B767D76AE76BF76EE77DB77E277F3793A79BE7A747ACB +4E1E4E1F4E524E534E694E994EA44EA64EA54EFF4F094F194F0A4F154F0D4F10 +4F114F0F4EF24EF64EFB4EF04EF34EFD4F014F0B514951475146514851680000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5171518D51B0521752115212520E521652A3530853215320537053715409540F +540C540A54105401540B54045411540D54085403540E5406541256E056DE56DD +573357305728572D572C572F57295919591A59375938598459785983597D5979 +598259815B575B585B875B885B855B895BFA5C165C795DDE5E065E765E740000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F0F5F1B5FD95FD6620E620C620D62106263625B6258653665E965E865EC +65ED66F266F36709673D6734673167356B216B646B7B6C166C5D6C576C596C5F +6C606C506C556C616C5B6C4D6C4E7070725F725D767E7AF97C737CF87F367F8A +7FBD80018003800C80128033807F8089808B808C81E381EA81F381FC820C821B +821F826E8272827E866B8840884C8863897F96214E324EA84F4D4F4F4F474F57 +4F5E4F344F5B4F554F304F504F514F3D4F3A4F384F434F544F3C4F464F630000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F5C4F604F2F4F4E4F364F594F5D4F484F5A514C514B514D517551B651B75225 +52245229522A522852AB52A952AA52AC532353735375541D542D541E543E5426 +544E542754465443543354485442541B5429544A5439543B5438542E54355436 +5420543C54405431542B541F542C56EA56F056E456EB574A57515740574D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005747574E573E5750574F573B58EF593E599D599259A8599E59A359995996 +598D59A45993598A59A55B5D5B5C5B5A5B5B5B8C5B8B5B8F5C2C5C405C415C3F +5C3E5C905C915C945C8C5DEB5E0C5E8F5E875E8A5EF75F045F1F5F645F625F77 +5F795FD85FCC5FD75FCD5FF15FEB5FF85FEA6212621162846297629662806276 +6289626D628A627C627E627962736292626F6298626E62956293629162866539 +653B653865F166F4675F674E674F67506751675C6756675E6749674667600000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +675367576B656BCF6C426C5E6C996C816C886C896C856C9B6C6A6C7A6C906C70 +6C8C6C686C966C926C7D6C836C726C7E6C746C866C766C8D6C946C986C827076 +707C707D707872627261726072C472C27396752C752B75377538768276EF77E3 +79C179C079BF7A767CFB7F5580968093809D8098809B809A80B2826F82920000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000828B828D898B89D28A008C378C468C558C9D8D648D708DB38EAB8ECA8F9B +8FB08FC28FC68FC58FC45DE1909190A290AA90A690A3914991C691CC9632962E +9631962A962C4E264E564E734E8B4E9B4E9E4EAB4EAC4F6F4F9D4F8D4F734F7F +4F6C4F9B4F8B4F864F834F704F754F884F694F7B4F964F7E4F8F4F914F7A5154 +51525155516951775176517851BD51FD523B52385237523A5230522E52365241 +52BE52BB5352535453535351536653775378537953D653D453D7547354750000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5496547854955480547B5477548454925486547C549054715476548C549A5462 +5468548B547D548E56FA57835777576A5769576157665764577C591C59495947 +59485944595459BE59BB59D459B959AE59D159C659D059CD59CB59D359CA59AF +59B359D259C55B5F5B645B635B975B9A5B985B9C5B995B9B5C1A5C485C450000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C465CB75CA15CB85CA95CAB5CB15CB35E185E1A5E165E155E1B5E115E78 +5E9A5E975E9C5E955E965EF65F265F275F295F805F815F7F5F7C5FDD5FE05FFD +5FF55FFF600F6014602F60356016602A6015602160276029602B601B62166215 +623F623E6240627F62C962CC62C462BF62C262B962D262DB62AB62D362D462CB +62C862A862BD62BC62D062D962C762CD62B562DA62B162D862D662D762C662AC +62CE653E65A765BC65FA66146613660C66066602660E6600660F6615660A0000 +AA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6607670D670B676D678B67956771679C677367776787679D6797676F6770677F +6789677E67906775679A6793677C676A67726B236B666B676B7F6C136C1B6CE3 +6CE86CF36CB16CCC6CE56CB36CBD6CBE6CBC6CE26CAB6CD56CD36CB86CC46CB9 +6CC16CAE6CD76CC56CF16CBF6CBB6CE16CDB6CCA6CAC6CEF6CDC6CD66CE00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007095708E7092708A7099722C722D723872487267726972C072CE72D972D7 +72D073A973A8739F73AB73A5753D759D7599759A768476C276F276F477E577FD +793E7940794179C979C87A7A7A797AFA7CFE7F547F8C7F8B800580BA80A580A2 +80B180A180AB80A980B480AA80AF81E581FE820D82B3829D829982AD82BD829F +82B982B182AC82A582AF82B882A382B082BE82B7864E8671521D88688ECB8FCE +8FD48FD190B590B890B190B691C791D195779580961C9640963F963B96440000 +AB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +964296B996E89752975E4E9F4EAD4EAE4FE14FB54FAF4FBF4FE04FD14FCF4FDD +4FC34FB64FD84FDF4FCA4FD74FAE4FD04FC44FC24FDA4FCE4FDE4FB751575192 +519151A0524E5243524A524D524C524B524752C752C952C352C1530D5357537B +539A53DB54AC54C054A854CE54C954B854A654B354C754C254BD54AA54C10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054C454C854AF54AB54B154BB54A954A754BF56FF5782578B57A057A357A2 +57CE57AE579359555951594F594E595059DC59D859FF59E359E85A0359E559EA +59DA59E65A0159FB5B695BA35BA65BA45BA25BA55C015C4E5C4F5C4D5C4B5CD9 +5CD25DF75E1D5E255E1F5E7D5EA05EA65EFA5F085F2D5F655F885F855F8A5F8B +5F875F8C5F896012601D60206025600E6028604D60706068606260466043606C +606B606A6064624162DC6316630962FC62ED630162EE62FD630762F162F70000 +AC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62EF62EC62FE62F463116302653F654565AB65BD65E26625662D66206627662F +661F66286631662466F767FF67D367F167D467D067EC67B667AF67F567E967EF +67C467D167B467DA67E567B867CF67DE67F367B067D967E267DD67D26B6A6B83 +6B866BB56BD26BD76C1F6CC96D0B6D326D2A6D416D256D0C6D316D1E6D170000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D3B6D3D6D3E6D366D1B6CF56D396D276D386D296D2E6D356D0E6D2B70AB +70BA70B370AC70AF70AD70B870AE70A472307272726F727472E972E072E173B7 +73CA73BB73B273CD73C073B3751A752D754F754C754E754B75AB75A475A575A2 +75A3767876867687768876C876C676C376C5770176F976F87709770B76FE76FC +770777DC78027814780C780D794679497948794779B979BA79D179D279CB7A7F +7A817AFF7AFD7C7D7D027D057D007D097D077D047D067F387F8E7FBF80040000 +AD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8010800D8011803680D680E580DA80C380C480CC80E180DB80CE80DE80E480DD +81F4822282E78303830582E382DB82E6830482E58302830982D282D782F18301 +82DC82D482D182DE82D382DF82EF830686508679867B867A884D886B898189D4 +8A088A028A038C9E8CA08D748D738DB48ECD8ECC8FF08FE68FE28FEA8FE50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008FED8FEB8FE48FE890CA90CE90C190C3914B914A91CD95829650964B964C +964D9762976997CB97ED97F3980198A898DB98DF999699994E584EB3500C500D +50234FEF502650254FF8502950165006503C501F501A501250114FFA50005014 +50284FF15021500B501950184FF34FEE502D502A4FFE502B5009517C51A451A5 +51A251CD51CC51C651CB5256525C5254525B525D532A537F539F539D53DF54E8 +55105501553754FC54E554F2550654FA551454E954ED54E1550954EE54EA0000 +AE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54E65527550754FD550F5703570457C257D457CB57C35809590F59575958595A +5A115A185A1C5A1F5A1B5A1359EC5A205A235A295A255A0C5A095B6B5C585BB0 +5BB35BB65BB45BAE5BB55BB95BB85C045C515C555C505CED5CFD5CFB5CEA5CE8 +5CF05CF65D015CF45DEE5E2D5E2B5EAB5EAD5EA75F315F925F915F9060590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006063606560506055606D6069606F6084609F609A608D6094608C60856096 +624762F3630862FF634E633E632F635563426346634F6349633A6350633D632A +632B6328634D634C65486549659965C165C566426649664F66436652664C6645 +664166F867146715671768216838684868466853683968426854682968B36817 +684C6851683D67F468506840683C6843682A68456813681868416B8A6B896BB7 +6C236C276C286C266C246CF06D6A6D956D886D876D666D786D776D596D930000 +AF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D6C6D896D6E6D5A6D746D696D8C6D8A6D796D856D656D9470CA70D870E470D9 +70C870CF7239727972FC72F972FD72F872F7738673ED740973EE73E073EA73DE +7554755D755C755A755975BE75C575C775B275B375BD75BC75B975C275B8768B +76B076CA76CD76CE7729771F7720772877E9783078277838781D783478370000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007825782D7820781F7832795579507960795F7956795E795D7957795A79E4 +79E379E779DF79E679E979D87A847A887AD97B067B117C897D217D177D0B7D0A +7D207D227D147D107D157D1A7D1C7D0D7D197D1B7F3A7F5F7F947FC57FC18006 +8018801580198017803D803F80F1810280F0810580ED80F4810680F880F38108 +80FD810A80FC80EF81ED81EC82008210822A822B8228822C82BB832B83528354 +834A83388350834983358334834F833283398336831783408331832883430000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8654868A86AA869386A486A9868C86A3869C8870887788818882887D88798A18 +8A108A0E8A0C8A158A0A8A178A138A168A0F8A118C488C7A8C798CA18CA28D77 +8EAC8ED28ED48ECF8FB1900190068FF790008FFA8FF490038FFD90058FF89095 +90E190DD90E29152914D914C91D891DD91D791DC91D995839662966396610000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000965B965D96649658965E96BB98E299AC9AA89AD89B259B329B3C4E7E507A +507D505C50475043504C505A504950655076504E5055507550745077504F500F +506F506D515C519551F0526A526F52D252D952D852D55310530F5319533F5340 +533E53C366FC5546556A55665544555E55615543554A55315556554F5555552F +55645538552E555C552C55635533554155575708570B570957DF5805580A5806 +57E057E457FA5802583557F757F9592059625A365A415A495A665A6A5A400000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A3C5A625A5A5A465A4A5B705BC75BC55BC45BC25BBF5BC65C095C085C075C60 +5C5C5C5D5D075D065D0E5D1B5D165D225D115D295D145D195D245D275D175DE2 +5E385E365E335E375EB75EB85EB65EB55EBE5F355F375F575F6C5F695F6B5F97 +5F995F9E5F985FA15FA05F9C607F60A3608960A060A860CB60B460E660BD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060C560BB60B560DC60BC60D860D560C660DF60B860DA60C7621A621B6248 +63A063A76372639663A263A563776367639863AA637163A963896383639B636B +63A863846388639963A163AC6392638F6380637B63696368637A655D65566551 +65596557555F654F655865556554659C659B65AC65CF65CB65CC65CE665D665A +666466686666665E66F952D7671B688168AF68A2689368B5687F687668B168A7 +689768B0688368C468AD688668856894689D68A8689F68A168826B326BBA0000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6BEB6BEC6C2B6D8E6DBC6DF36DD96DB26DE16DCC6DE46DFB6DFA6E056DC76DCB +6DAF6DD16DAE6DDE6DF96DB86DF76DF56DC56DD26E1A6DB56DDA6DEB6DD86DEA +6DF16DEE6DE86DC66DC46DAA6DEC6DBF6DE670F97109710A70FD70EF723D727D +7281731C731B73167313731973877405740A7403740673FE740D74E074F60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000074F7751C75227565756675627570758F75D475D575B575CA75CD768E76D4 +76D276DB7737773E773C77367738773A786B7843784E79657968796D79FB7A92 +7A957B207B287B1B7B2C7B267B197B1E7B2E7C927C977C957D467D437D717D2E +7D397D3C7D407D307D337D447D2F7D427D327D317F3D7F9E7F9A7FCC7FCE7FD2 +801C804A8046812F81168123812B81298130812482028235823782368239838E +839E8398837883A2839683BD83AB8392838A8393838983A08377837B837C0000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +838683A786555F6A86C786C086B686C486B586C686CB86B186AF86C98853889E +888888AB88928896888D888B8993898F8A2A8A1D8A238A258A318A2D8A1F8A1B +8A228C498C5A8CA98CAC8CAB8CA88CAA8CA78D678D668DBE8DBA8EDB8EDF9019 +900D901A90179023901F901D90109015901E9020900F90229016901B90140000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090E890ED90FD915791CE91F591E691E391E791ED91E99589966A96759673 +96789670967496769677966C96C096EA96E97AE07ADF980298039B5A9CE59E75 +9E7F9EA59EBB50A2508D508550995091508050965098509A670051F152725274 +5275526952DE52DD52DB535A53A5557B558055A7557C558A559D55985582559C +55AA55945587558B558355B355AE559F553E55B2559A55BB55AC55B1557E5589 +55AB5599570D582F582A58345824583058315821581D582058F958FA59600000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A775A9A5A7F5A925A9B5AA75B735B715BD25BCC5BD35BD05C0A5C0B5C315D4C +5D505D345D475DFD5E455E3D5E405E435E7E5ECA5EC15EC25EC45F3C5F6D5FA9 +5FAA5FA860D160E160B260B660E0611C612360FA611560F060FB60F4616860F1 +610E60F6610961006112621F624963A3638C63CF63C063E963C963C663CD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000063D263E363D063E163D663ED63EE637663F463EA63DB645263DA63F9655E +6566656265636591659065AF666E667066746676666F6691667A667E667766FE +66FF671F671D68FA68D568E068D868D7690568DF68F568EE68E768F968D268F2 +68E368CB68CD690D6912690E68C968DA696E68FB6B3E6B3A6B3D6B986B966BBC +6BEF6C2E6C2F6C2C6E2F6E386E546E216E326E676E4A6E206E256E236E1B6E5B +6E586E246E566E6E6E2D6E266E6F6E346E4D6E3A6E2C6E436E1D6E3E6ECB0000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E896E196E4E6E636E446E726E696E5F7119711A7126713071217136716E711C +724C728472807336732573347329743A742A743374227425743574367434742F +741B7426742875257526756B756A75E275DB75E375D975D875DE75E0767B767C +7696769376B476DC774F77ED785D786C786F7A0D7A087A0B7A057A007A980000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A977A967AE57AE37B497B567B467B507B527B547B4D7B4B7B4F7B517C9F +7CA57D5E7D507D687D557D2B7D6E7D727D617D667D627D707D7355847FD47FD5 +800B8052808581558154814B8151814E81398146813E814C815381748212821C +83E9840383F8840D83E083C5840B83C183EF83F183F48457840A83F0840C83CC +83FD83F283CA8438840E840483DC840783D483DF865B86DF86D986ED86D486DB +86E486D086DE885788C188C288B1898389968A3B8A608A558A5E8A3C8A410000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8A548A5B8A508A468A348A3A8A368A568C618C828CAF8CBC8CB38CBD8CC18CBB +8CC08CB48CB78CB68CBF8CB88D8A8D858D818DCE8DDD8DCB8DDA8DD18DCC8DDB +8DC68EFB8EF88EFC8F9C902E90359031903890329036910290F5910990FE9163 +916591CF9214921592239209921E920D9210920792119594958F958B95910000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000095939592958E968A968E968B967D96859686968D9672968496C196C596C4 +96C696C796EF96F297CC98059806980898E798EA98EF98E998F298ED99AE99AD +9EC39ECD9ED14E8250AD50B550B250B350C550BE50AC50B750BB50AF50C7527F +5277527D52DF52E652E452E252E3532F55DF55E855D355E655CE55DC55C755D1 +55E355E455EF55DA55E155C555C655E555C957125713585E585158585857585A +5854586B584C586D584A58625852584B59675AC15AC95ACC5ABE5ABD5ABC0000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5AB35AC25AB25D695D6F5E4C5E795EC95EC85F125F595FAC5FAE611A610F6148 +611F60F3611B60F961016108614E614C6144614D613E61346127610D61066137 +622162226413643E641E642A642D643D642C640F641C6414640D643664166417 +6406656C659F65B06697668966876688669666846698668D67036994696D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000695A697769606954697569306982694A6968696B695E695369796986695D +6963695B6B476B726BC06BBF6BD36BFD6EA26EAF6ED36EB66EC26E906E9D6EC7 +6EC56EA56E986EBC6EBA6EAB6ED16E966E9C6EC46ED46EAA6EA76EB4714E7159 +7169716471497167715C716C7166714C7165715E714671687156723A72527337 +7345733F733E746F745A7455745F745E7441743F7459745B745C757675787600 +75F0760175F275F175FA75FF75F475F376DE76DF775B776B7766775E77630000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7779776A776C775C77657768776277EE788E78B078977898788C7889787C7891 +7893787F797A797F7981842C79BD7A1C7A1A7A207A147A1F7A1E7A9F7AA07B77 +7BC07B607B6E7B677CB17CB37CB57D937D797D917D817D8F7D5B7F6E7F697F6A +7F727FA97FA87FA480568058808680848171817081788165816E8173816B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008179817A81668205824784828477843D843184758466846B8449846C845B +843C8435846184638469846D8446865E865C865F86F9871387088707870086FE +86FB870287038706870A885988DF88D488D988DC88D888DD88E188CA88D588D2 +899C89E38A6B8A728A738A668A698A708A878A7C8A638AA08A718A858A6D8A62 +8A6E8A6C8A798A7B8A3E8A688C628C8A8C898CCA8CC78CC88CC48CB28CC38CC2 +8CC58DE18DDF8DE88DEF8DF38DFA8DEA8DE48DE68EB28F038F098EFE8F0A0000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8F9F8FB2904B904A905390429054903C905590509047904F904E904D9051903E +904191129117916C916A916991C9923792579238923D9240923E925B924B9264 +925192349249924D92459239923F925A959896989694969596CD96CB96C996CA +96F796FB96F996F6975697749776981098119813980A9812980C98FC98F40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000098FD98FE99B399B199B49AE19CE99E829F0E9F139F2050E750EE50E550D6 +50ED50DA50D550CF50D150F150CE50E9516251F352835282533153AD55FE5600 +561B561755FD561456065609560D560E55F75616561F5608561055F657185716 +5875587E58835893588A58795885587D58FD592559225924596A59695AE15AE6 +5AE95AD75AD65AD85AE35B755BDE5BE75BE15BE55BE65BE85BE25BE45BDF5C0D +5C625D845D875E5B5E635E555E575E545ED35ED65F0A5F465F705FB961470000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +613F614B617761626163615F615A61586175622A64876458645464A46478645F +647A645164676434646D647B657265A165D765D666A266A8669D699C69A86995 +69C169AE69D369CB699B69B769BB69AB69B469D069CD69AD69CC69A669C369A3 +6B496B4C6C336F336F146EFE6F136EF46F296F3E6F206F2C6F0F6F026F220000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006EFF6EEF6F066F316F386F326F236F156F2B6F2F6F886F2A6EEC6F016EF2 +6ECC6EF771947199717D718A71847192723E729272967344735074647463746A +7470746D750475917627760D760B7609761376E176E37784777D777F776178C1 +789F78A778B378A978A3798E798F798D7A2E7A317AAA7AA97AED7AEF7BA17B95 +7B8B7B757B977B9D7B947B8F7BB87B877B847CB97CBD7CBE7DBB7DB07D9C7DBD +7DBE7DA07DCA7DB47DB27DB17DBA7DA27DBF7DB57DB87DAD7DD27DC77DAC0000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7F707FE07FE17FDF805E805A808781508180818F8188818A817F818281E781FA +82078214821E824B84C984BF84C684C48499849E84B2849C84CB84B884C084D3 +849084BC84D184CA873F871C873B872287258734871887558737872988F38902 +88F488F988F888FD88E8891A88EF8AA68A8C8A9E8AA38A8D8AA18A938AA40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AAA8AA58AA88A988A918A9A8AA78C6A8C8D8C8C8CD38CD18CD28D6B8D99 +8D958DFC8F148F128F158F138FA390609058905C90639059905E9062905D905B +91199118911E917591789177917492789280928592989296927B9293929C92A8 +927C929195A195A895A995A395A595A49699969C969B96CC96D29700977C9785 +97F69817981898AF98B199039905990C990999C19AAF9AB09AE69B419B429CF4 +9CF69CF39EBC9F3B9F4A5104510050FB50F550F9510251085109510551DC0000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +528752885289528D528A52F053B2562E563B56395632563F563456295653564E +565756745636562F56305880589F589E58B3589C58AE58A958A6596D5B095AFB +5B0B5AF55B0C5B085BEE5BEC5BE95BEB5C645C655D9D5D945E625E5F5E615EE2 +5EDA5EDF5EDD5EE35EE05F485F715FB75FB561766167616E615D615561820000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000617C6170616B617E61A7619061AB618E61AC619A61A4619461AE622E6469 +646F6479649E64B26488649064B064A56493649564A9649264AE64AD64AB649A +64AC649964A264B365756577657866AE66AB66B466B16A236A1F69E86A016A1E +6A1969FD6A216A136A0A69F36A026A0569ED6A116B506B4E6BA46BC56BC66F3F +6F7C6F846F516F666F546F866F6D6F5B6F786F6E6F8E6F7A6F706F646F976F58 +6ED56F6F6F606F5F719F71AC71B171A87256729B734E73577469748B74830000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +747E7480757F76207629761F7624762676217622769A76BA76E4778E7787778C +7791778B78CB78C578BA78CA78BE78D578BC78D07A3F7A3C7A407A3D7A377A3B +7AAF7AAE7BAD7BB17BC47BB47BC67BC77BC17BA07BCC7CCA7DE07DF47DEF7DFB +7DD87DEC7DDD7DE87DE37DDA7DDE7DE97D9E7DD97DF27DF97F757F777FAF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007FE98026819B819C819D81A0819A81988517853D851A84EE852C852D8513 +851185238521851484EC852584FF850687828774877687608766877887688759 +8757874C8753885B885D89108907891289138915890A8ABC8AD28AC78AC48A95 +8ACB8AF88AB28AC98AC28ABF8AB08AD68ACD8AB68AB98ADB8C4C8C4E8C6C8CE0 +8CDE8CE68CE48CEC8CED8CE28CE38CDC8CEA8CE18D6D8D9F8DA38E2B8E108E1D +8E228E0F8E298E1F8E218E1E8EBA8F1D8F1B8F1F8F298F268F2A8F1C8F1E0000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8F259069906E9068906D90779130912D9127913191879189918B918392C592BB +92B792EA92AC92E492C192B392BC92D292C792F092B295AD95B1970497069707 +97099760978D978B978F9821982B981C98B3990A99139912991899DD99D099DF +99DB99D199D599D299D99AB79AEE9AEF9B279B459B449B779B6F9D069D090000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D039EA99EBE9ECE58A89F5251125118511451105115518051AA51DD5291 +529352F35659566B5679566956645678566A566856655671566F566C56625676 +58C158BE58C758C5596E5B1D5B345B785BF05C0E5F4A61B2619161A9618A61CD +61B661BE61CA61C8623064C564C164CB64BB64BC64DA64C464C764C264CD64BF +64D264D464BE657466C666C966B966C466C766B86A3D6A386A3A6A596A6B6A58 +6A396A446A626A616A4B6A476A356A5F6A486B596B776C056FC26FB16FA10000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6FC36FA46FC16FA76FB36FC06FB96FB66FA66FA06FB471BE71C971D071D271C8 +71D571B971CE71D971DC71C371C47368749C74A37498749F749E74E2750C750D +76347638763A76E776E577A0779E779F77A578E878DA78EC78E779A67A4D7A4E +7A467A4C7A4B7ABA7BD97C117BC97BE47BDB7BE17BE97BE67CD57CD67E0A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E117E087E1B7E237E1E7E1D7E097E107F797FB27FF07FF17FEE802881B3 +81A981A881FB820882588259854A855985488568856985438549856D856A855E +8783879F879E87A2878D8861892A89328925892B892189AA89A68AE68AFA8AEB +8AF18B008ADC8AE78AEE8AFE8B018B028AF78AED8AF38AF68AFC8C6B8C6D8C93 +8CF48E448E318E348E428E398E358F3B8F2F8F388F338FA88FA6907590749078 +9072907C907A913491929320933692F89333932F932292FC932B9304931A0000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9310932693219315932E931995BB96A796A896AA96D5970E97119716970D9713 +970F975B975C9766979898309838983B9837982D9839982499109928991E991B +9921991A99ED99E299F19AB89ABC9AFB9AED9B289B919D159D239D269D289D12 +9D1B9ED89ED49F8D9F9C512A511F5121513252F5568E56805690568556870000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000568F58D558D358D158CE5B305B2A5B245B7A5C375C685DBC5DBA5DBD5DB8 +5E6B5F4C5FBD61C961C261C761E661CB6232623464CE64CA64D864E064F064E6 +64EC64F164E264ED6582658366D966D66A806A946A846AA26A9C6ADB6AA36A7E +6A976A906AA06B5C6BAE6BDA6C086FD86FF16FDF6FE06FDB6FE46FEB6FEF6F80 +6FEC6FE16FE96FD56FEE6FF071E771DF71EE71E671E571ED71EC71F471E07235 +72467370737274A974B074A674A876467642764C76EA77B377AA77B077AC0000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77A777AD77EF78F778FA78F478EF790179A779AA7A577ABF7C077C0D7BFE7BF7 +7C0C7BE07CE07CDC7CDE7CE27CDF7CD97CDD7E2E7E3E7E467E377E327E437E2B +7E3D7E317E457E417E347E397E487E357E3F7E2F7F447FF37FFC807180728070 +806F807381C681C381BA81C281C081BF81BD81C981BE81E88209827185AA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008584857E859C8591859485AF859B858785A8858A866787C087D187B387D2 +87C687AB87BB87BA87C887CB893B893689448938893D89AC8B0E8B178B198B1B +8B0A8B208B1D8B048B108C418C3F8C738CFA8CFD8CFC8CF88CFB8DA88E498E4B +8E488E4A8F448F3E8F428F458F3F907F907D9084908190829080913991A3919E +919C934D938293289375934A9365934B9318937E936C935B9370935A935495CA +95CB95CC95C895C696B196B896D6971C971E97A097D3984698B699359A010000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +99FF9BAE9BAB9BAA9BAD9D3B9D3F9E8B9ECF9EDE9EDC9EDD9EDB9F3E9F4B53E2 +569556AE58D958D85B385F5D61E3623364F464F264FE650664FA64FB64F765B7 +66DC67266AB36AAC6AC36ABB6AB86AC26AAE6AAF6B5F6B786BAF7009700B6FFE +70066FFA7011700F71FB71FC71FE71F87377737574A774BF7515765676580000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000765277BD77BF77BB77BC790E79AE7A617A627A607AC47AC57C2B7C277C2A +7C1E7C237C217CE77E547E557E5E7E5A7E617E527E597F487FF97FFB80778076 +81CD81CF820A85CF85A985CD85D085C985B085BA85B985A687EF87EC87F287E0 +898689B289F48B288B398B2C8B2B8C508D058E598E638E668E648E5F8E558EC0 +8F498F4D90879083908891AB91AC91D09394938A939693A293B393AE93AC93B0 +9398939A939795D495D695D095D596E296DC96D996DB96DE972497A397A60000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +97AD97F9984D984F984C984E985398BA993E993F993D992E99A59A0E9AC19B03 +9B069B4F9B4E9B4D9BCA9BC99BFD9BC89BC09D519D5D9D609EE09F159F2C5133 +56A558DE58DF58E25BF59F905EEC61F261F761F661F56500650F66E066DD6AE5 +6ADD6ADA6AD3701B701F7028701A701D701570187206720D725872A273780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000737A74BD74CA74E375877586765F766177C7791979B17A6B7A697C3E7C3F +7C387C3D7C377C407E6B7E6D7E797E697E6A7F857E737FB67FB97FB881D885E9 +85DD85EA85D585E485E585F787FB8805880D87F987FE8960895F8956895E8B41 +8B5C8B588B498B5A8B4E8B4F8B468B598D088D0A8E7C8E728E878E768E6C8E7A +8E748F548F4E8FAD908A908B91B191AE93E193D193DF93C393C893DC93DD93D6 +93E293CD93D893E493D793E895DC96B496E3972A9727976197DC97FB985E0000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9858985B98BC994599499A169A199B0D9BE89BE79BD69BDB9D899D619D729D6A +9D6C9E929E979E939EB452F856A856B756B656B456BC58E45B405B435B7D5BF6 +5DC961F861FA65186514651966E667276AEC703E703070327210737B74CF7662 +76657926792A792C792B7AC77AF67C4C7C437C4D7CEF7CF08FAE7E7D7E7C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E827F4C800081DA826685FB85F9861185FA8606860B8607860A88148815 +896489BA89F88B708B6C8B668B6F8B5F8B6B8D0F8D0D8E898E818E858E8291B4 +91CB9418940393FD95E1973098C49952995199A89A2B9A309A379A359C139C0D +9E799EB59EE89F2F9F5F9F639F615137513856C156C056C259145C6C5DCD61FC +61FE651D651C659566E96AFB6B046AFA6BB2704C721B72A774D674D4766977D3 +7C507E8F7E8C7FBC8617862D861A882388228821881F896A896C89BD8B740000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B778B7D8D138E8A8E8D8E8B8F5F8FAF91BA942E94339435943A94389432942B +95E297389739973297FF9867986599579A459A439A409A3E9ACF9B549B519C2D +9C259DAF9DB49DC29DB89E9D9EEF9F199F5C9F669F67513C513B56C856CA56C9 +5B7F5DD45DD25F4E61FF65246B0A6B6170517058738074E4758A766E766C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079B37C607C5F807E807D81DF8972896F89FC8B808D168D178E918E938F61 +9148944494519452973D973E97C397C1986B99559A559A4D9AD29B1A9C499C31 +9C3E9C3B9DD39DD79F349F6C9F6A9F9456CC5DD662006523652B652A66EC6B10 +74DA7ACA7C647C637C657E937E967E9481E28638863F88318B8A9090908F9463 +946094649768986F995C9A5A9A5B9A579AD39AD49AD19C549C579C569DE59E9F +9EF456D158E9652C705E7671767277D77F507F888836883988628B938B920000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B9682778D1B91C0946A97429748974497C698709A5F9B229B589C5F9DF99DFA +9E7C9E7D9F079F779F725EF36B1670637C6C7C6E883B89C08EA191C194729470 +9871995E9AD69B239ECC706477DA8B9A947797C99A629A657E9C8B9C8EAA91C5 +947D947E947C9C779C789EF78C54947F9E1A72289A6A9B319E1B9E1E7C720000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E424E5C51F5531A53824E074E0C4E474E8D56D7FA0C5C6E5F734E0F51874E0E +4E2E4E934EC24EC94EC8519852FC536C53B957205903592C5C105DFF65E16BB3 +6BCC6C14723F4E314E3C4EE84EDC4EE94EE14EDD4EDA520C531C534C57225723 +5917592F5B815B845C125C3B5C745C735E045E805E825FC9620962506C150000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C366C436C3F6C3B72AE72B0738A79B8808A961E4F0E4F184F2C4EF54F14 +4EF14F004EF74F084F1D4F024F054F224F134F044EF44F1251B1521352095210 +52A65322531F534D538A540756E156DF572E572A5734593C5980597C5985597B +597E5977597F5B565C155C255C7C5C7A5C7B5C7E5DDF5E755E845F025F1A5F74 +5FD55FD45FCF625C625E626462616266626262596260625A626565EF65EE673E +67396738673B673A673F673C67336C186C466C526C5C6C4F6C4A6C546C4B0000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C4C7071725E72B472B5738E752A767F7A757F518278827C8280827D827F864D +897E909990979098909B909496229624962096234F564F3B4F624F494F534F64 +4F3E4F674F524F5F4F414F584F2D4F334F3F4F61518F51B9521C521E522152AD +52AE530953635372538E538F54305437542A545454455419541C542554180000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000543D544F544154285424544756EE56E756E557415745574C5749574B5752 +5906594059A6599859A05997598E59A25990598F59A759A15B8E5B925C285C2A +5C8D5C8F5C885C8B5C895C925C8A5C865C935C955DE05E0A5E0E5E8B5E895E8C +5E885E8D5F055F1D5F785F765FD25FD15FD05FED5FE85FEE5FF35FE15FE45FE3 +5FFA5FEF5FF75FFB60005FF4623A6283628C628E628F629462876271627B627A +6270628162886277627D62726274653765F065F465F365F265F5674567470000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67596755674C6748675D674D675A674B6BD06C196C1A6C786C676C6B6C846C8B +6C8F6C716C6F6C696C9A6C6D6C876C956C9C6C666C736C656C7B6C8E7074707A +726372BF72BD72C372C672C172BA72C573957397739373947392753A75397594 +75957681793D80348095809980908092809C8290828F8285828E829182930000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000828A828382848C788FC98FBF909F90A190A5909E90A790A096309628962F +962D4E334F984F7C4F854F7D4F804F874F764F744F894F844F774F4C4F974F6A +4F9A4F794F814F784F904F9C4F944F9E4F924F824F954F6B4F6E519E51BC51BE +5235523252335246523152BC530A530B533C539253945487547F548154915482 +5488546B547A547E5465546C54745466548D546F546154605498546354675464 +56F756F9576F5772576D576B57715770577657805775577B5773577457620000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5768577D590C594559B559BA59CF59CE59B259CC59C159B659BC59C359D659B1 +59BD59C059C859B459C75B625B655B935B955C445C475CAE5CA45CA05CB55CAF +5CA85CAC5C9F5CA35CAD5CA25CAA5CA75C9D5CA55CB65CB05CA65E175E145E19 +5F285F225F235F245F545F825F7E5F7D5FDE5FE5602D602660196032600B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006034600A60176033601A601E602C6022600D6010602E60136011600C6009 +601C6214623D62AD62B462D162BE62AA62B662CA62AE62B362AF62BB62A962B0 +62B8653D65A865BB660965FC66046612660865FB6603660B660D660565FD6611 +661066F6670A6785676C678E67926776677B6798678667846774678D678C677A +679F679167996783677D67816778677967946B256B806B7E6BDE6C1D6C936CEC +6CEB6CEE6CD96CB66CD46CAD6CE76CB76CD06CC26CBA6CC36CC66CED6CF20000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6CD26CDD6CB46C8A6C9D6C806CDE6CC06D306CCD6CC76CB06CF96CCF6CE96CD1 +709470987085709370867084709170967082709A7083726A72D672CB72D872C9 +72DC72D272D472DA72CC72D173A473A173AD73A673A273A073AC739D74DD74E8 +753F7540753E758C759876AF76F376F176F076F577F877FC77F977FB77FA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077F77942793F79C57A787A7B7AFB7C757CFD8035808F80AE80A380B880B5 +80AD822082A082C082AB829A8298829B82B582A782AE82BC829E82BA82B482A8 +82A182A982C282A482C382B682A28670866F866D866E8C568FD28FCB8FD38FCD +8FD68FD58FD790B290B490AF90B390B09639963D963C963A96434FCD4FC54FD3 +4FB24FC94FCB4FC14FD44FDC4FD94FBB4FB34FDB4FC74FD64FBA4FC04FB94FEC +5244524952C052C2533D537C539753965399539854BA54A154AD54A554CF0000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54C3830D54B754AE54D654B654C554C654A0547054BC54A254BE547254DE54B0 +57B5579E579F57A4578C5797579D579B57945798578F579957A5579A579558F4 +590D595359E159DE59EE5A0059F159DD59FA59FD59FC59F659E459F259F759DB +59E959F359F559E059FE59F459ED5BA85C4C5CD05CD85CCC5CD75CCB5CDB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005CDE5CDA5CC95CC75CCA5CD65CD35CD45CCF5CC85CC65CCE5CDF5CF85DF9 +5E215E225E235E205E245EB05EA45EA25E9B5EA35EA55F075F2E5F565F866037 +603960546072605E6045605360476049605B604C60406042605F602460446058 +6066606E6242624362CF630D630B62F5630E630362EB62F9630F630C62F862F6 +63006313631462FA631562FB62F06541654365AA65BF6636662166326635661C +662666226633662B663A661D66346639662E670F671067C167F267C867BA0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67DC67BB67F867D867C067B767C567EB67E467DF67B567CD67B367F767F667EE +67E367C267B967CE67E767F067B267FC67C667ED67CC67AE67E667DB67FA67C9 +67CA67C367EA67CB6B286B826B846BB66BD66BD86BE06C206C216D286D346D2D +6D1F6D3C6D3F6D126D0A6CDA6D336D046D196D3A6D1A6D116D006D1D6D420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D016D186D376D036D0F6D406D076D206D2C6D086D226D096D1070B7709F +70BE70B170B070A170B470B570A972417249724A726C72707273726E72CA72E4 +72E872EB72DF72EA72E672E3738573CC73C273C873C573B973B673B573B473EB +73BF73C773BE73C373C673B873CB74EC74EE752E7547754875A775AA767976C4 +7708770377047705770A76F776FB76FA77E777E878067811781278057810780F +780E780978037813794A794C794B7945794479D579CD79CF79D679CE7A800000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A7E7AD17B007B017C7A7C787C797C7F7C807C817D037D087D017F587F917F8D +7FBE8007800E800F8014803780D880C780E080D180C880C280D080C580E380D9 +80DC80CA80D580C980CF80D780E680CD81FF8221829482D982FE82F9830782E8 +830082D5833A82EB82D682F482EC82E182F282F5830C82FB82F682F082EA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000082E482E082FA82F382ED86778674867C86738841884E8867886A886989D3 +8A048A078D728FE38FE18FEE8FE090F190BD90BF90D590C590BE90C790CB90C8 +91D491D39654964F96519653964A964E501E50055007501350225030501B4FF5 +4FF450335037502C4FF64FF75017501C502050275035502F5031500E515A5194 +519351CA51C451C551C851CE5261525A5252525E525F5255526252CD530E539E +552654E25517551254E754F354E4551A54FF5504550854EB5511550554F10000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +550A54FB54F754F854E0550E5503550B5701570257CC583257D557D257BA57C6 +57BD57BC57B857B657BF57C757D057B957C1590E594A5A195A165A2D5A2E5A15 +5A0F5A175A0A5A1E5A335B6C5BA75BAD5BAC5C035C565C545CEC5CFF5CEE5CF1 +5CF75D005CF95E295E285EA85EAE5EAA5EAC5F335F305F67605D605A60670000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000604160A26088608060926081609D60836095609B60976087609C608E6219 +624662F263106356632C634463456336634363E46339634B634A633C63296341 +6334635863546359632D63476333635A63516338635763406348654A654665C6 +65C365C465C2664A665F6647665167126713681F681A684968326833683B684B +684F68166831681C6835682B682D682F684E68446834681D6812681468266828 +682E684D683A682568206B2C6B2F6B2D6B316B346B6D80826B886BE66BE40000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6BE86BE36BE26BE76C256D7A6D636D646D766D0D6D616D926D586D626D6D6D6F +6D916D8D6DEF6D7F6D866D5E6D676D606D976D706D7C6D5F6D826D986D2F6D68 +6D8B6D7E6D806D846D166D836D7B6D7D6D756D9070DC70D370D170DD70CB7F39 +70E270D770D270DE70E070D470CD70C570C670C770DA70CE70E1724272780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072777276730072FA72F472FE72F672F372FB730173D373D973E573D673BC +73E773E373E973DC73D273DB73D473DD73DA73D773D873E874DE74DF74F474F5 +7521755B755F75B075C175BB75C475C075BF75B675BA768A76C9771D771B7710 +771377127723771177157719771A772277277823782C78227835782F7828782E +782B782178297833782A78317954795B794F795C79537952795179EB79EC79E0 +79EE79ED79EA79DC79DE79DD7A867A897A857A8B7A8C7A8A7A877AD87B100000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7B047B137B057B0F7B087B0A7B0E7B097B127C847C917C8A7C8C7C887C8D7C85 +7D1E7D1D7D117D0E7D187D167D137D1F7D127D0F7D0C7F5C7F617F5E7F607F5D +7F5B7F967F927FC37FC27FC08016803E803980FA80F280F980F5810180FB8100 +8201822F82258333832D83448319835183258356833F83418326831C83220000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008342834E831B832A8308833C834D8316832483208337832F832983478345 +834C8353831E832C834B832783488653865286A286A88696868D8691869E8687 +86978686868B869A868586A5869986A186A786958698868E869D869086948843 +8844886D88758876887288808871887F886F8883887E8874887C8A128C478C57 +8C7B8CA48CA38D768D788DB58DB78DB68ED18ED38FFE8FF590028FFF8FFB9004 +8FFC8FF690D690E090D990DA90E390DF90E590D890DB90D790DC90E491500000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +914E914F91D591E291DA965C965F96BC98E39ADF9B2F4E7F5070506A5061505E +50605053504B505D50725048504D5041505B504A506250155045505F5069506B +5063506450465040506E50735057505151D0526B526D526C526E52D652D3532D +539C55755576553C554D55505534552A55515562553655355530555255450000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000550C55325565554E55395548552D553B5540554B570A570757FB581457E2 +57F657DC57F4580057ED57FD580857F8580B57F357CF580757EE57E357F257E5 +57EC57E1580E57FC581057E75801580C57F157E957F0580D5804595C5A605A58 +5A555A675A5E5A385A355A6D5A505A5F5A655A6C5A535A645A575A435A5D5A52 +5A445A5B5A485A8E5A3E5A4D5A395A4C5A705A695A475A515A565A425A5C5B72 +5B6E5BC15BC05C595D1E5D0B5D1D5D1A5D205D0C5D285D0D5D265D255D0F0000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D305D125D235D1F5D2E5E3E5E345EB15EB45EB95EB25EB35F365F385F9B5F96 +5F9F608A6090608660BE60B060BA60D360D460CF60E460D960DD60C860B160DB +60B760CA60BF60C360CD60C063326365638A6382637D63BD639E63AD639D6397 +63AB638E636F63876390636E63AF6375639C636D63AE637C63A4633B639F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006378638563816391638D6370655365CD66656661665B6659665C66626718 +687968876890689C686D686E68AE68AB6956686F68A368AC68A96875687468B2 +688F68776892687C686B687268AA68806871687E689B6896688B68A0688968A4 +6878687B6891688C688A687D6B366B336B376B386B916B8F6B8D6B8E6B8C6C2A +6DC06DAB6DB46DB36E746DAC6DE96DE26DB76DF66DD46E006DC86DE06DDF6DD6 +6DBE6DE56DDC6DDD6DDB6DF46DCA6DBD6DED6DF06DBA6DD56DC26DCF6DC90000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6DD06DF26DD36DFD6DD76DCD6DE36DBB70FA710D70F7711770F4710C70F07104 +70F3711070FC70FF71067113710070F870F6710B7102710E727E727B727C727F +731D7317730773117318730A730872FF730F731E738873F673F873F574047401 +73FD7407740073FA73FC73FF740C740B73F474087564756375CE75D275CF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075CB75CC75D175D0768F768976D37739772F772D7731773277347733773D +7725773B7735784878527849784D784A784C782678457850796479677969796A +7963796B796179BB79FA79F879F679F77A8F7A947A907B357B477B347B257B30 +7B227B247B337B187B2A7B1D7B317B2B7B2D7B2F7B327B387B1A7B237C947C98 +7C967CA37D357D3D7D387D367D3A7D457D2C7D297D417D477D3E7D3F7D4A7D3B +7D287F637F957F9C7F9D7F9B7FCA7FCB7FCD7FD07FD17FC77FCF7FC9801F0000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +801E801B804780438048811881258119811B812D811F812C811E812181158127 +811D8122821182388233823A823482328274839083A383A8838D837A837383A4 +8374838F8381839583998375839483A9837D8383838C839D839B83AA838B837E +83A583AF8388839783B0837F83A6838783AE8376839A8659865686BF86B70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000086C286C186C586BA86B086C886B986B386B886CC86B486BB86BC86C386BD +86BE88528889889588A888A288AA889A889188A1889F889888A78899889B8897 +88A488AC888C8893888E898289D689D989D58A308A278A2C8A1E8C398C3B8C5C +8C5D8C7D8CA58D7D8D7B8D798DBC8DC28DB98DBF8DC18ED88EDE8EDD8EDC8ED7 +8EE08EE19024900B9011901C900C902190EF90EA90F090F490F290F390D490EB +90EC90E991569158915A9153915591EC91F491F191F391F891E491F991EA0000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +91EB91F791E891EE957A95869588967C966D966B9671966F96BF976A980498E5 +9997509B50955094509E508B50A35083508C508E509D5068509C509250825087 +515F51D45312531153A453A7559155A855A555AD5577564555A255935588558F +55B5558155A3559255A4557D558C55A6557F559555A1558E570C582958370000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005819581E58275823582857F558485825581C581B5833583F5836582E5839 +5838582D582C583B59615AAF5A945A9F5A7A5AA25A9E5A785AA65A7C5AA55AAC +5A955AAE5A375A845A8A5A975A835A8B5AA95A7B5A7D5A8C5A9C5A8F5A935A9D +5BEA5BCD5BCB5BD45BD15BCA5BCE5C0C5C305D375D435D6B5D415D4B5D3F5D35 +5D515D4E5D555D335D3A5D525D3D5D315D595D425D395D495D385D3C5D325D36 +5D405D455E445E415F585FA65FA55FAB60C960B960CC60E260CE60C461140000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60F2610A6116610560F5611360F860FC60FE60C161036118611D611060FF6104 +610B624A639463B163B063CE63E563E863EF63C3649D63F363CA63E063F663D5 +63F263F5646163DF63BE63DD63DC63C463D863D363C263C763CC63CB63C863F0 +63D763D965326567656A6564655C65686565658C659D659E65AE65D065D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000667C666C667B668066716679666A66726701690C68D3690468DC692A68EC +68EA68F1690F68D668F768EB68E468F66913691068F368E1690768CC69086970 +68B4691168EF68C6691468F868D068FD68FC68E8690B690A691768CE68C868DD +68DE68E668F468D1690668D468E96915692568C76B396B3B6B3F6B3C6B946B97 +6B996B956BBD6BF06BF26BF36C306DFC6E466E476E1F6E496E886E3C6E3D6E45 +6E626E2B6E3F6E416E5D6E736E1C6E336E4B6E406E516E3B6E036E2E6E5E0000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E686E5C6E616E316E286E606E716E6B6E396E226E306E536E656E276E786E64 +6E776E556E796E526E666E356E366E5A7120711E712F70FB712E713171237125 +71227132711F7128713A711B724B725A7288728972867285728B7312730B7330 +73227331733373277332732D732673237335730C742E742C7430742B74160000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000741A7421742D743174247423741D74297420743274FB752F756F756C75E7 +75DA75E175E675DD75DF75E475D77695769276DA774677477744774D7745774A +774E774B774C77DE77EC786078647865785C786D7871786A786E787078697868 +785E786279747973797279707A027A0A7A037A0C7A047A997AE67AE47B4A7B3B +7B447B487B4C7B4E7B407B587B457CA27C9E7CA87CA17D587D6F7D637D537D56 +7D677D6A7D4F7D6D7D5C7D6B7D527D547D697D517D5F7D4E7F3E7F3F7F650000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7F667FA27FA07FA17FD78051804F805080FE80D48143814A8152814F8147813D +814D813A81E681EE81F781F881F98204823C823D823F8275833B83CF83F98423 +83C083E8841283E783E483FC83F6841083C683C883EB83E383BF840183DD83E5 +83D883FF83E183CB83CE83D683F583C98409840F83DE8411840683C283F30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000083D583FA83C783D183EA841383C383EC83EE83C483FB83D783E2841B83DB +83FE86D886E286E686D386E386DA86EA86DD86EB86DC86EC86E986D786E886D1 +88488856885588BA88D788B988B888C088BE88B688BC88B788BD88B2890188C9 +89958998899789DD89DA89DB8A4E8A4D8A398A598A408A578A588A448A458A52 +8A488A518A4A8A4C8A4F8C5F8C818C808CBA8CBE8CB08CB98CB58D848D808D89 +8DD88DD38DCD8DC78DD68DDC8DCF8DD58DD98DC88DD78DC58EEF8EF78EFA0000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8EF98EE68EEE8EE58EF58EE78EE88EF68EEB8EF18EEC8EF48EE9902D9034902F +9106912C910490FF90FC910890F990FB9101910091079105910391619164915F +916291609201920A92259203921A9226920F920C9200921291FF91FD92069204 +92279202921C92249219921792059216957B958D958C95909687967E96880000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000096899683968096C296C896C396F196F0976C9770976E980798A998EB9CE6 +9EF94E834E844EB650BD50BF50C650AE50C450CA50B450C850C250B050C150BA +50B150CB50C950B650B851D7527A5278527B527C55C355DB55CC55D055CB55CA +55DD55C055D455C455E955BF55D2558D55CF55D555E255D655C855F255CD55D9 +55C25714585358685864584F584D5849586F5855584E585D58595865585B583D +5863587158FC5AC75AC45ACB5ABA5AB85AB15AB55AB05ABF5AC85ABB5AC60000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5AB75AC05ACA5AB45AB65ACD5AB95A905BD65BD85BD95C1F5C335D715D635D4A +5D655D725D6C5D5E5D685D675D625DF05E4F5E4E5E4A5E4D5E4B5EC55ECC5EC6 +5ECB5EC75F405FAF5FAD60F76149614A612B614561366132612E6146612F614F +612961406220916862236225622463C563F163EB641064126409642064240000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064336443641F641564186439643764226423640C64266430642864416435 +642F640A641A644064256427640B63E7641B642E6421640E656F659265D36686 +668C66956690668B668A66996694667867206966695F6938694E69626971693F +6945696A6939694269576959697A694869496935696C6933693D696568F06978 +693469696940696F69446976695869416974694C693B694B6937695C694F6951 +69326952692F697B693C6B466B456B436B426B486B416B9BFA0D6BFB6BFC0000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6BF96BF76BF86E9B6ED66EC86E8F6EC06E9F6E936E946EA06EB16EB96EC66ED2 +6EBD6EC16E9E6EC96EB76EB06ECD6EA66ECF6EB26EBE6EC36EDC6ED86E996E92 +6E8E6E8D6EA46EA16EBF6EB36ED06ECA6E976EAE6EA371477154715271637160 +7141715D716271727178716A7161714271587143714B7170715F715071530000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007144714D715A724F728D728C72917290728E733C7342733B733A7340734A +73497444744A744B7452745174577440744F7450744E74427446744D745474E1 +74FF74FE74FD751D75797577698375EF760F760375F775FE75FC75F975F87610 +75FB75F675ED75F575FD769976B576DD7755775F776077527756775A77697767 +77547759776D77E07887789A7894788F788478957885788678A1788378797899 +78807896787B797C7982797D79797A117A187A197A127A177A157A227A130000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A1B7A107AA37AA27A9E7AEB7B667B647B6D7B747B697B727B657B737B717B70 +7B617B787B767B637CB27CB47CAF7D887D867D807D8D7D7F7D857D7A7D8E7D7B +7D837D7C7D8C7D947D847D7D7D927F6D7F6B7F677F687F6C7FA67FA57FA77FDB +7FDC8021816481608177815C8169815B816281726721815E81768167816F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081448161821D8249824482408242824584F1843F845684768479848F848D +846584518440848684678430844D847D845A845984748473845D8507845E8437 +843A8434847A8443847884328445842983D9844B842F8442842D845F84708439 +844E844C8452846F84C5848E843B8447843684338468847E8444842B84608454 +846E8450870B870486F7870C86FA86D686F5874D86F8870E8709870186F6870D +870588D688CB88CD88CE88DE88DB88DA88CC88D08985899B89DF89E589E40000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89E189E089E289DC89E68A768A868A7F8A618A3F8A778A828A848A758A838A81 +8A748A7A8C3C8C4B8C4A8C658C648C668C868C848C858CCC8D688D698D918D8C +8D8E8D8F8D8D8D938D948D908D928DF08DE08DEC8DF18DEE8DD08DE98DE38DE2 +8DE78DF28DEB8DF48F068EFF8F018F008F058F078F088F028F0B9052903F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090449049903D9110910D910F911191169114910B910E916E916F92489252 +9230923A926692339265925E9283922E924A9246926D926C924F92609267926F +92369261927092319254926392509272924E9253924C92569232959F959C959E +959B969296939691969796CE96FA96FD96F896F59773977797789772980F980D +980E98AC98F698F999AF99B299B099B59AAD9AAB9B5B9CEA9CED9CE79E809EFD +50E650D450D750E850F350DB50EA50DD50E450D350EC50F050EF50E350E00000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51D85280528152E952EB533053AC56275615560C561255FC560F561C56015613 +560255FA561D560455FF55F95889587C5890589858865881587F5874588B587A +58875891588E587658825888587B5894588F58FE596B5ADC5AEE5AE55AD55AEA +5ADA5AED5AEB5AF35AE25AE05ADB5AEC5ADE5ADD5AD95AE85ADF5B775BE00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005BE35C635D825D805D7D5D865D7A5D815D775D8A5D895D885D7E5D7C5D8D +5D795D7F5E585E595E535ED85ED15ED75ECE5EDC5ED55ED95ED25ED45F445F43 +5F6F5FB6612C61286141615E61716173615261536172616C618061746154617A +615B6165613B616A6161615662296227622B642B644D645B645D647464766472 +6473647D6475646664A6644E6482645E645C644B645364606450647F643F646C +646B645964656477657365A066A166A0669F67056704672269B169B669C90000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69A069CE699669B069AC69BC69916999698E69A7698D69A969BE69AF69BF69C4 +69BD69A469D469B969CA699A69CF69B3699369AA69A1699E69D96997699069C2 +69B569A569C66B4A6B4D6B4B6B9E6B9F6BA06BC36BC46BFE6ECE6EF56EF16F03 +6F256EF86F376EFB6F2E6F096F4E6F196F1A6F276F186F3B6F126EED6F0A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F366F736EF96EEE6F2D6F406F306F3C6F356EEB6F076F0E6F436F056EFD +6EF66F396F1C6EFC6F3A6F1F6F0D6F1E6F086F21718771907189718071857182 +718F717B718671817197724472537297729572937343734D7351734C74627473 +7471747574727467746E750075027503757D759076167608760C76157611760A +761476B87781777C77857782776E7780776F777E778378B278AA78B478AD78A8 +787E78AB789E78A578A078AC78A278A47998798A798B79967995799479930000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +79977988799279907A2B7A4A7A307A2F7A287A267AA87AAB7AAC7AEE7B887B9C +7B8A7B917B907B967B8D7B8C7B9B7B8E7B857B9852847B997BA47B827CBB7CBF +7CBC7CBA7DA77DB77DC27DA37DAA7DC17DC07DC57D9D7DCE7DC47DC67DCB7DCC +7DAF7DB97D967DBC7D9F7DA67DAE7DA97DA17DC97F737FE27FE37FE57FDE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008024805D805C8189818681838187818D818C818B8215849784A484A1849F +84BA84CE84C284AC84AE84AB84B984B484C184CD84AA849A84B184D0849D84A7 +84BB84A2849484C784CC849B84A984AF84A884D6849884B684CF84A084D784D4 +84D284DB84B084918661873387238728876B8740872E871E87218719871B8743 +872C8741873E874687208732872A872D873C8712873A87318735874287268727 +87388724871A8730871188F788E788F188F288FA88FE88EE88FC88F688FB0000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +88F088EC88EB899D89A1899F899E89E989EB89E88AAB8A998A8B8A928A8F8A96 +8C3D8C688C698CD58CCF8CD78D968E098E028DFF8E0D8DFD8E0A8E038E078E06 +8E058DFE8E008E048F108F118F0E8F0D9123911C91209122911F911D911A9124 +9121911B917A91729179917392A592A49276929B927A92A0929492AA928D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000092A6929A92AB92799297927F92A392EE928E9282929592A2927D928892A1 +928A9286928C929992A7927E928792A9929D928B922D969E96A196FF9758977D +977A977E978397809782977B97849781977F97CE97CD981698AD98AE99029900 +9907999D999C99C399B999BB99BA99C299BD99C79AB19AE39AE79B3E9B3F9B60 +9B619B5F9CF19CF29CF59EA750FF5103513050F85106510750F650FE510B510C +50FD510A528B528C52F152EF56485642564C56355641564A5649564656580000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +565A56405633563D562C563E5638562A563A571A58AB589D58B158A058A358AF +58AC58A558A158FF5AFF5AF45AFD5AF75AF65B035AF85B025AF95B015B075B05 +5B0F5C675D995D975D9F5D925DA25D935D955DA05D9C5DA15D9A5D9E5E695E5D +5E605E5C7DF35EDB5EDE5EE15F495FB2618B6183617961B161B061A261890000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000619B619361AF61AD619F619261AA61A1618D616661B3622D646E64706496 +64A064856497649C648F648B648A648C64A3649F646864B164986576657A6579 +657B65B265B366B566B066A966B266B766AA66AF6A006A066A1769E569F86A15 +69F169E46A2069FF69EC69E26A1B6A1D69FE6A2769F269EE6A1469F769E76A40 +6A0869E669FB6A0D69FC69EB6A096A046A186A256A0F69F66A266A0769F46A16 +6B516BA56BA36BA26BA66C016C006BFF6C026F416F266F7E6F876FC66F920000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F8D6F896F8C6F626F4F6F856F5A6F966F766F6C6F826F556F726F526F506F57 +6F946F936F5D6F006F616F6B6F7D6F676F906F536F8B6F696F7F6F956F636F77 +6F6A6F7B71B271AF719B71B071A0719A71A971B5719D71A5719E71A471A171AA +719C71A771B37298729A73587352735E735F7360735D735B7361735A73590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000736274877489748A74867481747D74857488747C747975087507757E7625 +761E7619761D761C7623761A7628761B769C769D769E769B778D778F77897788 +78CD78BB78CF78CC78D178CE78D478C878C378C478C9799A79A179A0799C79A2 +799B6B767A397AB27AB47AB37BB77BCB7BBE7BAC7BCE7BAF7BB97BCA7BB57CC5 +7CC87CCC7CCB7DF77DDB7DEA7DE77DD77DE17E037DFA7DE67DF67DF17DF07DEE +7DDF7F767FAC7FB07FAD7FED7FEB7FEA7FEC7FE67FE88064806781A3819F0000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +819E819581A2819981978216824F825382528250824E82518524853B850F8500 +8529850E8509850D851F850A8527851C84FB852B84FA8508850C84F4852A84F2 +851584F784EB84F384FC851284EA84E9851684FE8528851D852E850284FD851E +84F68531852684E784E884F084EF84F9851885208530850B8519852F86620000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000875687638764877787E1877387588754875B87528761875A8751875E876D +876A8750874E875F875D876F876C877A876E875C8765874F877B877587628767 +8769885A8905890C8914890B891789188919890689168911890E890989A289A4 +89A389ED89F089EC8ACF8AC68AB88AD38AD18AD48AD58ABB8AD78ABE8AC08AC5 +8AD88AC38ABA8ABD8AD98C3E8C4D8C8F8CE58CDF8CD98CE88CDA8CDD8CE78DA0 +8D9C8DA18D9B8E208E238E258E248E2E8E158E1B8E168E118E198E268E270000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E148E128E188E138E1C8E178E1A8F2C8F248F188F1A8F208F238F168F179073 +9070906F9067906B912F912B9129912A91329126912E91859186918A91819182 +9184918092D092C392C492C092D992B692CF92F192DF92D892E992D792DD92CC +92EF92C292E892CA92C892CE92E692CD92D592C992E092DE92E792D192D30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000092B592E192C692B4957C95AC95AB95AE95B096A496A296D3970597089702 +975A978A978E978897D097CF981E981D9826982998289820981B982798B29908 +98FA9911991499169917991599DC99CD99CF99D399D499CE99C999D699D899CB +99D799CC9AB39AEC9AEB9AF39AF29AF19B469B439B679B749B719B669B769B75 +9B709B689B649B6C9CFC9CFA9CFD9CFF9CF79D079D009CF99CFB9D089D059D04 +9E839ED39F0F9F10511C51135117511A511151DE533453E156705660566E0000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +567356665663566D5672565E5677571C571B58C858BD58C958BF58BA58C258BC +58C65B175B195B1B5B215B145B135B105B165B285B1A5B205B1E5BEF5DAC5DB1 +5DA95DA75DB55DB05DAE5DAA5DA85DB25DAD5DAF5DB45E675E685E665E6F5EE9 +5EE75EE65EE85EE55F4B5FBC619D61A8619661C561B461C661C161CC61BA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000061BF61B8618C64D764D664D064CF64C964BD648964C364DB64F364D96533 +657F657C65A266C866BE66C066CA66CB66CF66BD66BB66BA66CC67236A346A66 +6A496A676A326A686A3E6A5D6A6D6A766A5B6A516A286A5A6A3B6A3F6A416A6A +6A646A506A4F6A546A6F6A696A606A3C6A5E6A566A556A4D6A4E6A466B556B54 +6B566BA76BAA6BAB6BC86BC76C046C036C066FAD6FCB6FA36FC76FBC6FCE6FC8 +6F5E6FC46FBD6F9E6FCA6FA870046FA56FAE6FBA6FAC6FAA6FCF6FBF6FB80000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6FA26FC96FAB6FCD6FAF6FB26FB071C571C271BF71B871D671C071C171CB71D4 +71CA71C771CF71BD71D871BC71C671DA71DB729D729E736973667367736C7365 +736B736A747F749A74A074947492749574A1750B7580762F762D7631763D7633 +763C76357632763076BB76E6779A779D77A1779C779B77A277A3779577990000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000779778DD78E978E578EA78DE78E378DB78E178E278ED78DF78E079A47A44 +7A487A477AB67AB87AB57AB17AB77BDE7BE37BE77BDD7BD57BE57BDA7BE87BF9 +7BD47BEA7BE27BDC7BEB7BD87BDF7CD27CD47CD77CD07CD17E127E217E177E0C +7E1F7E207E137E0E7E1C7E157E1A7E227E0B7E0F7E167E0D7E147E257E247F43 +7F7B7F7C7F7A7FB17FEF802A8029806C81B181A681AE81B981B581AB81B081AC +81B481B281B781A781F282558256825785568545856B854D8553856185580000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +854085468564854185628544855185478563853E855B8571854E856E85758555 +85678560858C8566855D85548565856C866386658664879B878F879787938792 +87888781879687988779878787A3878587908791879D87848794879C879A8789 +891E89268930892D892E89278931892289298923892F892C891F89F18AE00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AE28AF28AF48AF58ADD8B148AE48ADF8AF08AC88ADE8AE18AE88AFF8AEF +8AFB8C918C928C908CF58CEE8CF18CF08CF38D6C8D6E8DA58DA78E338E3E8E38 +8E408E458E368E3C8E3D8E418E308E3F8EBD8F368F2E8F358F328F398F378F34 +90769079907B908690FA913391359136919391909191918D918F9327931E9308 +931F9306930F937A9338933C931B9323931293019346932D930E930D92CB931D +92FA9325931392F992F793349302932492FF932993399335932A9314930C0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +930B92FE9309930092FB931695BC95CD95BE95B995BA95B695BF95B595BD96A9 +96D4970B9712971097999797979497F097F89835982F98329924991F99279929 +999E99EE99EC99E599E499F099E399EA99E999E79AB99ABF9AB49ABB9AF69AFA +9AF99AF79B339B809B859B879B7C9B7E9B7B9B829B939B929B909B7A9B950000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B7D9B889D259D179D209D1E9D149D299D1D9D189D229D109D199D1F9E88 +9E869E879EAE9EAD9ED59ED69EFA9F129F3D51265125512251245120512952F4 +5693568C568D568656845683567E5682567F568158D658D458CF58D25B2D5B25 +5B325B235B2C5B275B265B2F5B2E5B7B5BF15BF25DB75E6C5E6A5FBE5FBB61C3 +61B561BC61E761E061E561E461E861DE64EF64E964E364EB64E464E865816580 +65B665DA66D26A8D6A966A816AA56A896A9F6A9B6AA16A9E6A876A936A8E0000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A956A836AA86AA46A916A7F6AA66A9A6A856A8C6A926B5B6BAD6C096FCC6FA9 +6FF46FD46FE36FDC6FED6FE76FE66FDE6FF26FDD6FE26FE871E171F171E871F2 +71E471F071E27373736E736F749774B274AB749074AA74AD74B174A574AF7510 +75117512750F7584764376487649764776A476E977B577AB77B277B777B60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077B477B177A877F078F378FD790278FB78FC78F2790578F978FE790479AB +79A87A5C7A5B7A567A587A547A5A7ABE7AC07AC17C057C0F7BF27C007BFF7BFB +7C0E7BF47C0B7BF37C027C097C037C017BF87BFD7C067BF07BF17C107C0A7CE8 +7E2D7E3C7E427E3398487E387E2A7E497E407E477E297E4C7E307E3B7E367E44 +7E3A7F457F7F7F7E7F7D7FF47FF2802C81BB81C481CC81CA81C581C781BC81E9 +825B825A825C85838580858F85A7859585A0858B85A3857B85A4859A859E0000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8577857C858985A1857A85788557858E85968586858D8599859D858185A28582 +858885858579857685988590859F866887BE87AA87AD87C587B087AC87B987B5 +87BC87AE87C987C387C287CC87B787AF87C487CA87B487B687BF87B887BD87DE +87B289358933893C893E894189528937894289AD89AF89AE89F289F38B1E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B188B168B118B058B0B8B228B0F8B128B158B078B0D8B088B068B1C8B13 +8B1A8C4F8C708C728C718C6F8C958C948CF98D6F8E4E8E4D8E538E508E4C8E47 +8F438F409085907E9138919A91A2919B9199919F91A1919D91A093A1938393AF +936493569347937C9358935C93769349935093519360936D938F934C936A9379 +935793559352934F93719377937B9361935E936393679380934E935995C795C0 +95C995C395C595B796AE96B096AC9720971F9718971D9719979A97A1979C0000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +979E979D97D597D497F198419844984A9849984598439925992B992C992A9933 +9932992F992D99319930999899A399A19A0299FA99F499F799F999F899F699FB +99FD99FE99FC9A039ABE9AFE9AFD9B019AFC9B489B9A9BA89B9E9B9B9BA69BA1 +9BA59BA49B869BA29BA09BAF9D339D419D679D369D2E9D2F9D319D389D300000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D459D429D439D3E9D379D409D3D7FF59D2D9E8A9E899E8D9EB09EC89EDA +9EFB9EFF9F249F239F229F549FA05131512D512E5698569C5697569A569D5699 +59705B3C5C695C6A5DC05E6D5E6E61D861DF61ED61EE61F161EA61F061EB61D6 +61E964FF650464FD64F86501650364FC659465DB66DA66DB66D86AC56AB96ABD +6AE16AC66ABA6AB66AB76AC76AB46AAD6B5E6BC96C0B7007700C700D70017005 +7014700E6FFF70006FFB70266FFC6FF7700A720171FF71F9720371FD73760000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74B874C074B574C174BE74B674BB74C275147513765C76647659765076537657 +765A76A676BD76EC77C277BA78FF790C79137914790979107912791179AD79AC +7A5F7C1C7C297C197C207C1F7C2D7C1D7C267C287C227C257C307E5C7E507E56 +7E637E587E627E5F7E517E607E577E537FB57FB37FF77FF8807581D181D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081D0825F825E85B485C685C085C385C285B385B585BD85C785C485BF85CB +85CE85C885C585B185B685D2862485B885B785BE866987E787E687E287DB87EB +87EA87E587DF87F387E487D487DC87D387ED87D887E387A487D787D9880187F4 +87E887DD8953894B894F894C89468950895189498B2A8B278B238B338B308B35 +8B478B2F8B3C8B3E8B318B258B378B268B368B2E8B248B3B8B3D8B3A8C428C75 +8C998C988C978CFE8D048D028D008E5C8E628E608E578E568E5E8E658E670000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E5B8E5A8E618E5D8E698E548F468F478F488F4B9128913A913B913E91A891A5 +91A791AF91AA93B5938C939293B7939B939D938993A7938E93AA939E93A69395 +93889399939F938D93B1939193B293A493A893B493A393A595D295D395D196B3 +96D796DA5DC296DF96D896DD97239722972597AC97AE97A897AB97A497AA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000097A297A597D797D997D697D897FA98509851985298B89941993C993A9A0F +9A0B9A099A0D9A049A119A0A9A059A079A069AC09ADC9B089B049B059B299B35 +9B4A9B4C9B4B9BC79BC69BC39BBF9BC19BB59BB89BD39BB69BC49BB99BBD9D5C +9D539D4F9D4A9D5B9D4B9D599D569D4C9D579D529D549D5F9D589D5A9E8E9E8C +9EDF9F019F009F169F259F2B9F2A9F299F289F4C9F5551345135529652F753B4 +56AB56AD56A656A756AA56AC58DA58DD58DB59125B3D5B3E5B3F5DC35E700000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5FBF61FB65076510650D6509650C650E658465DE65DD66DE6AE76AE06ACC6AD1 +6AD96ACB6ADF6ADC6AD06AEB6ACF6ACD6ADE6B606BB06C0C7019702770207016 +702B702170227023702970177024701C702A720C720A72077202720572A572A6 +72A472A372A174CB74C574B774C37516766077C977CA77C477F1791D791B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007921791C7917791E79B07A677A687C337C3C7C397C2C7C3B7CEC7CEA7E76 +7E757E787E707E777E6F7E7A7E727E747E687F4B7F4A7F837F867FB77FFD7FFE +807881D781D582648261826385EB85F185ED85D985E185E885DA85D785EC85F2 +85F885D885DF85E385DC85D185F085E685EF85DE85E2880087FA880387F687F7 +8809880C880B880687FC880887FF880A88028962895A895B89578961895C8958 +895D8959898889B789B689F68B508B488B4A8B408B538B568B548B4B8B550000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B518B428B528B578C438C778C768C9A8D068D078D098DAC8DAA8DAD8DAB8E6D +8E788E738E6A8E6F8E7B8EC28F528F518F4F8F508F538FB49140913F91B091AD +93DE93C793CF93C293DA93D093F993EC93CC93D993A993E693CA93D493EE93E3 +93D593C493CE93C093D293E7957D95DA95DB96E19729972B972C972897260000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000097B397B797B697DD97DE97DF985C9859985D985798BF98BD98BB98BE9948 +9947994399A699A79A1A9A159A259A1D9A249A1B9A229A209A279A239A1E9A1C +9A149AC29B0B9B0A9B0E9B0C9B379BEA9BEB9BE09BDE9BE49BE69BE29BF09BD4 +9BD79BEC9BDC9BD99BE59BD59BE19BDA9D779D819D8A9D849D889D719D809D78 +9D869D8B9D8C9D7D9D6B9D749D759D709D699D859D739D7B9D829D6F9D799D7F +9D879D689E949E919EC09EFC9F2D9F409F419F4D9F569F579F58533756B20000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56B556B358E35B455DC65DC75EEE5EEF5FC05FC161F9651765166515651365DF +66E866E366E46AF36AF06AEA6AE86AF96AF16AEE6AEF703C7035702F70377034 +703170427038703F703A70397040703B703370417213721472A8737D737C74BA +76AB76AA76BE76ED77CC77CE77CF77CD77F27925792379277928792479290000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079B27A6E7A6C7A6D7AF77C497C487C4A7C477C457CEE7E7B7E7E7E817E80 +7FBA7FFF807981DB81D9820B82688269862285FF860185FE861B860085F68604 +86098605860C85FD8819881088118817881388168963896689B989F78B608B6A +8B5D8B688B638B658B678B6D8DAE8E868E888E848F598F568F578F558F588F5A +908D9143914191B791B591B291B3940B941393FB9420940F941493FE94159410 +94289419940D93F5940093F79407940E9416941293FA940993F8940A93FF0000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +93FC940C93F69411940695DE95E095DF972E972F97B997BB97FD97FE98609862 +9863985F98C198C29950994E9959994C994B99539A329A349A319A2C9A2A9A36 +9A299A2E9A389A2D9AC79ACA9AC69B109B129B119C0B9C089BF79C059C129BF8 +9C409C079C0E9C069C179C149C099D9F9D999DA49D9D9D929D989D909D9B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009DA09D949D9C9DAA9D979DA19D9A9DA29DA89D9E9DA39DBF9DA99D969DA6 +9DA79E999E9B9E9A9EE59EE49EE79EE69F309F2E9F5B9F609F5E9F5D9F599F91 +513A51395298529756C356BD56BE5B485B475DCB5DCF5EF161FD651B6B026AFC +6B036AF86B0070437044704A7048704970457046721D721A7219737E7517766A +77D0792D7931792F7C547C537CF27E8A7E877E887E8B7E867E8D7F4D7FBB8030 +81DD8618862A8626861F8623861C86198627862E862186208629861E86250000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8829881D881B88208824881C882B884A896D8969896E896B89FA8B798B788B45 +8B7A8B7B8D108D148DAF8E8E8E8C8F5E8F5B8F5D91469144914591B9943F943B +94369429943D943C94309439942A9437942C9440943195E595E495E39735973A +97BF97E1986498C998C698C0995899569A399A3D9A469A449A429A419A3A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009A3F9ACD9B159B179B189B169B3A9B529C2B9C1D9C1C9C2C9C239C289C29 +9C249C219DB79DB69DBC9DC19DC79DCA9DCF9DBE9DC59DC39DBB9DB59DCE9DB9 +9DBA9DAC9DC89DB19DAD9DCC9DB39DCD9DB29E7A9E9C9EEB9EEE9EED9F1B9F18 +9F1A9F319F4E9F659F649F924EB956C656C556CB59715B4B5B4C5DD55DD15EF2 +65216520652665226B0B6B086B096C0D7055705670577052721E721F72A9737F +74D874D574D974D7766D76AD793579B47A707A717C577C5C7C597C5B7C5A0000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7CF47CF17E917F4F7F8781DE826B863486358633862C86328636882C88288826 +882A8825897189BF89BE89FB8B7E8B848B828B868B858B7F8D158E958E948E9A +8E928E908E968E978F608F629147944C9450944A944B944F9447944594489449 +9446973F97E3986A986998CB9954995B9A4E9A539A549A4C9A4F9A489A4A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009A499A529A509AD09B199B2B9B3B9B569B559C469C489C3F9C449C399C33 +9C419C3C9C379C349C329C3D9C369DDB9DD29DDE9DDA9DCB9DD09DDC9DD19DDF +9DE99DD99DD89DD69DF59DD59DDD9EB69EF09F359F339F329F429F6B9F959FA2 +513D529958E858E759725B4D5DD8882F5F4F62016203620465296525659666EB +6B116B126B0F6BCA705B705A7222738273817383767077D47C677C667E95826C +863A86408639863C8631863B863E88308832882E883389768974897389FE0000 +F8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B8C8B8E8B8B8B888C458D198E988F648F6391BC94629455945D9457945E97C4 +97C598009A569A599B1E9B1F9B209C529C589C509C4A9C4D9C4B9C559C599C4C +9C4E9DFB9DF79DEF9DE39DEB9DF89DE49DF69DE19DEE9DE69DF29DF09DE29DEC +9DF49DF39DE89DED9EC29ED09EF29EF39F069F1C9F389F379F369F439F4F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009F719F709F6E9F6F56D356CD5B4E5C6D652D66ED66EE6B13705F7061705D +7060722374DB74E577D5793879B779B67C6A7E977F89826D8643883888378835 +884B8B948B958E9E8E9F8EA08E9D91BE91BD91C2946B9468946996E597469743 +974797C797E59A5E9AD59B599C639C679C669C629C5E9C609E029DFE9E079E03 +9E069E059E009E019E099DFF9DFD9E049EA09F1E9F469F749F759F7656D4652E +65B86B186B196B176B1A7062722672AA77D877D979397C697C6B7CF67E9A0000 +F9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E987E9B7E9981E081E18646864786488979897A897C897B89FF8B988B998EA5 +8EA48EA3946E946D946F9471947397499872995F9C689C6E9C6D9E0B9E0D9E10 +9E0F9E129E119EA19EF59F099F479F789F7B9F7A9F79571E70667C6F883C8DB2 +8EA691C394749478947694759A609C749C739C719C759E149E139EF69F0A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009FA4706870657CF7866A883E883D883F8B9E8C9C8EA98EC9974B98739874 +98CC996199AB9A649A669A679B249E159E179F4862076B1E7227864C8EA89482 +948094819A699A689B2E9E197229864B8B9F94839C799EB776759A6B9C7A9E1D +7069706A9EA49F7E9F499F98788192B988CF58BB60527CA75AFA255425662557 +2560256C2563255A2569255D255225642555255E256A256125582567255B2553 +25652556255F256B256225592568255C25512550256D256E2570256F25930000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/dingbats.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/dingbats.enc new file mode 100644 index 00000000..97294876 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/dingbats.enc @@ -0,0 +1,20 @@ +# Encoding file: dingbats, single-byte +S +003F 1 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +00202701270227032704260E2706270727082709261B261E270C270D270E270F +2710271127122713271427152716271727182719271A271B271C271D271E271F +2720272127222723272427252726272726052729272A272B272C272D272E272F +2730273127322733273427352736273727382739273A273B273C273D273E273F +2740274127422743274427452746274727482749274A274B25CF274D25A0274F +27502751275225B225BC25C6275625D727582759275A275B275C275D275E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000276127622763276427652766276726632666266526602460246124622463 +2464246524662467246824692776277727782779277A277B277C277D277E277F +2780278127822783278427852786278727882789278A278B278C278D278E278F +2790279127922793279421922194219527982799279A279B279C279D279E279F +27A027A127A227A327A427A527A627A727A827A927AA27AB27AC27AD27AE27AF +000027B127B227B327B427B527B627B727B827B927BA27BB27BC27BD27BE0000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/ebcdic.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/ebcdic.enc new file mode 100644 index 00000000..f451de59 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/ebcdic.enc @@ -0,0 +1,19 @@ +S +006F 0 1 +00 +0000000100020003008500090086007F0087008D008E000B000C000D000E000F +0010001100120013008F000A0008009700180019009C009D001C001D001E001F +0080008100820083008400920017001B00880089008A008B008C000500060007 +0090009100160093009400950096000400980099009A009B00140015009E001A +002000A000E200E400E000E100E300E500E700F10060002E003C0028002B007C +002600E900EA00EB00E800ED00EE00EF00EC00DF00210024002A0029003B009F +002D002F00C200C400C000C100C300C500C700D1005E002C0025005F003E003F +00F800C900CA00CB00C800CD00CE00CF00CC00A8003A002300400027003D0022 +00D800610062006300640065006600670068006900AB00BB00F000FD00FE00B1 +00B0006A006B006C006D006E006F00700071007200AA00BA00E600B800C600A4 +00B500AF0073007400750076007700780079007A00A100BF00D000DD00DE00AE +00A200A300A500B700A900A700B600BC00BD00BE00AC005B005C005D00B400D7 +00F900410042004300440045004600470048004900AD00F400F600F200F300F5 +00A6004A004B004C004D004E004F00500051005200B900FB00FC00DB00FA00FF +00D900F70053005400550056005700580059005A00B200D400D600D200D300D5 +003000310032003300340035003600370038003900B3007B00DC007D00DA007E diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/euc-cn.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/euc-cn.enc new file mode 100644 index 00000000..4b2f8c73 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/euc-cn.enc @@ -0,0 +1,1397 @@ +# Encoding file: euc-cn, multi-byte +M +003F 0 82 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300230FB02C902C700A8300330052015FF5E2225202620182019 +201C201D3014301530083009300A300B300C300D300E300F3016301730103011 +00B100D700F72236222722282211220F222A222922082237221A22A522252220 +23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 +22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 +25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000024882489248A248B248C248D248E248F2490249124922493249424952496 +249724982499249A249B247424752476247724782479247A247B247C247D247E +247F248024812482248324842485248624872460246124622463246424652466 +2467246824690000000032203221322232233224322532263227322832290000 +00002160216121622163216421652166216721682169216A216B000000000000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 +00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000 +0000000000000000000031053106310731083109310A310B310C310D310E310F +3110311131123113311431153116311731183119311A311B311C311D311E311F +3120312131223123312431253126312731283129000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000002500250125022503250425052506250725082509250A250B +250C250D250E250F2510251125122513251425152516251725182519251A251B +251C251D251E251F2520252125222523252425252526252725282529252A252B +252C252D252E252F2530253125322533253425352536253725382539253A253B +253C253D253E253F2540254125422543254425452546254725482549254A254B +0000000000000000000000000000000000000000000000000000000000000000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698 +978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1 +888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB +9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591 +73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E +6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2 +535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28 +5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5 +6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9 +7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B +522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B +82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8 +601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695 +6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56 +4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7 +62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D +56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668 +5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA +627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A +8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79 +4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE +7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF +882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A +847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC +810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE +7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39 +86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC +905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA +654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0 +63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889 +53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8 +680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A +72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD +7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6 +591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9 +5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE +94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F +963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F +6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124 +7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4 +4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150 +8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A +54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76 +611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8 +818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769 +845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000057C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E +62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D +4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC +52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF +704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678 +684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD +558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E +8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408 +76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC +4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334 +543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316 +8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62 +71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C +604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F +79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19 +706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6 +53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E +796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7 +59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C +76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877 +62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B +686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07 +56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83 +53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED +6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4 +91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66 +666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76 +7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0 +62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177 +8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485 +652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A +582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 +577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF +554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F +82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321 +7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000998861276E8357646606634656F062EC62695ED39614578362C955878721 +814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD +89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001 +4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B +7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC +9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C +6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF +667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599 +521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D +62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C +740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089 +63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74 +541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A +6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B +95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B +541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302 +51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF +7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F +772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720 +7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511 +706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE +964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE +776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357 +753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A +6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18 +917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696 +8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4 +722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554 +522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA +57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA +787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02 +74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6 +8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461 +83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03 +51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91 +8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3 +524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A +62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D +520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81 +97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB +4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000 +C8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238 +529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4 +58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4 +5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197 +63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A +745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000 +C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E +7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D +886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A +5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7 +820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20 +7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3 +62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB +4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F +5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C +67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9 +7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060555237800D6454887075295E05681362F4971C53CC723D8C016C347761 +7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D +6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC +8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9 +80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59 +635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A +8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD +6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4 +7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22 +951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530 +751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5 +687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82 +5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6 +625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6 +889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB +5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4 +4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170 +536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717 +6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C +68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269 +52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D +4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1 +4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237 +95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF +76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7 +6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A +90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C +6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2 +884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E +673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157 +53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2 +5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD +7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25 +781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830 +71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C +4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064475C2790657A918C2359DA54AC8200836F898180006930564E80367237 +91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1 +4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681 +501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB +4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE +8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8 +5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C +6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149 +670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206 +4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED +7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95 +56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5 +5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5 +5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43 +810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5 +8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8 +77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B +7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C +62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005 +951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA +9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7 +804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A +63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92 +4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC +7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB +90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84 +88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353 +684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B +4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70 +594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A +5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F +53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C +4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5 +5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261 +525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB +4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC +4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F +502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7 +50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0 +6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0 +51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF +8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3 +8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19 +8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36 +5369537A961D962296219631962A963D963C964296499654965F9667966C9672 +96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB +90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD +52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF +574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B +574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF +57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 +99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8 +82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F +82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3 +8311831A83068314831582E082D5831C8351835B835C83088392833C83348331 +839B835E832F834F83478343835F834083178360832D833A8333836683650000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C +8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8 +58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 +83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478 +843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF +84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008556853B84FF84FC8559854885688564855E857A77A285438572857B85A4 +85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605 +86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34 +624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371 +637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE +645263C663BE64456441640B641B6420640C64266421645E6484646D64960000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2 +75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456 +54435421545754595423543254825494547754715464549A549B548454765466 +549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC +54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522 +5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005537555655755576557755335530555C558B55D2558355B155B955885581 +559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB +55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E +5608560C56015624562355FE56005627562D565856395657562C564D56625659 +565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 +56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91 +5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5 +5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F +5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87 +5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8 +72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072FB731773137321730A731E731D7315732273397325732C733873317350 +734D73577360736C736F737E821B592598E7592459029963996799689969996A +996B996C99749977997D998099849987998A998D999099919993999499955E80 +5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA +5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019 +60356026601B600F600D6029602B600A603F602160786079607B607A60420000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8 +60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7 +61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606 +9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35 +6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4 +6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F +6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7 +6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E +6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5 +6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9 +6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 +704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47 +8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011 +900D9016902190359036902D902F9044905190529050906890589062905B66B9 +9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 +5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3 +59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75 +80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6 +5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 +9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98 +9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1 +7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08 +7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26 +7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095 +738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C +740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000741B741A7441745C7457745574597477746D747E749C748E748074817487 +748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769 +67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8 +680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD +6832683368606861684E6862684468646883681D68556866684168676840683E +684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000692468F0690B6901695768E369106971693969606942695D6984696B6980 +69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD +69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44 +6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB +733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71 +8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C +81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615 +6600708566F7661D66346631663666358006665F66546641664F665666616657 +66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40 +8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1 +726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19 +6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F +809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2 +80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112 +8C5A8136811E812C811881328148814C815381748159815A817181608169817C +817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3 +5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C +7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C +716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D +7228706C7118716671B9623E623D624362486249793B794079467949795B795C +7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1 +62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C +781D7839783A783B781F783C7825782C78237829784E786D7856785778267850 +7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9 +78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9 +77077708771A77227719772D7726773577387750775177477743775A77680000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 +754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81 +7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495 +949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8 +94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2 +94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506 +95079509950A950D950E950F951295139514951595169518951B951D951E951F +9522952A952B9529952C953195329534953695379538953C953E953F95429535 +9544954595469549954C954E954F9552955395549556955795589559955B955E +955F955D95619562956495659566956795689569956A956B956C956F95719572 +9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20 +9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42 +9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63 +9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC +75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB +75E7760375F175FC75FF761076007605760C7617760A76257618761576190000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000761B763C762276207640762D7630763F76357643763E7633764D765E7654 +765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8 +7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3 +88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941 +8966897B758B80E576B276B477DC801280148016801C80208022802580268027 +802980288031800B803580438046804D80528069807189839878988098830000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654 +866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9 +86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3 +86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B +871E8725872E871A873E87488734873187298737873F87828722877D877E877B +87608770874C876E878B87538763877C876487598765879387AF87A887D20000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 +87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42 +7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19 +7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E +7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB +7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223 +822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268 +887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D +7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8 +7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8 +9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009162916191709169916F917D917E917291749179918C91859190918D9191 +91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69 +8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8 +8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39 +8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F +8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A +972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9 +96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F +9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E +9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2 +9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2 +977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA +9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8 +990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F +9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 +9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/euc-jp.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/euc-jp.enc new file mode 100644 index 00000000..db56c888 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/euc-jp.enc @@ -0,0 +1,1353 @@ +# Encoding file: euc-jp, multi-byte +M +003F 0 79 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D0000008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F +FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F +FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F +FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8 +FF3EFFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0F +FF3C301C2016FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3D +FF5BFF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D7 +00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 +FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C70000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000025C625A125A025B325B225BD25BC203B3012219221902191219330130000 +00000000000000000000000000000000000000002208220B2286228722822283 +222A2229000000000000000000000000000000002227222800AC21D221D42200 +220300000000000000000000000000000000000000000000222022A523122202 +220722612252226A226B221A223D221D2235222B222C00000000000000000000 +00000000212B2030266F266D266A2020202100B6000000000000000025EF0000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19000000000000000000000000 +0000FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A00000000000000000000 +0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000000000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000025002502250C251025182514251C252C25242534253C25012503250F2513 +251B251725232533252B253B254B2520252F25282537253F251D253025252538 +2542000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E9C55165A03963F54C0611B632859F690228475831C7A5060AA63E16E25 +65ED846682A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E6216 +7C9F88B75B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2 +593759D45A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3 +840E88638B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA29038 +7A328328828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D0000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E11 +789381FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B +96F2834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E +983482F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD5186 +5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 +827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC0000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062BC65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B5104 +5C4B61B681C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F55 +4F3D4FA14F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3 +706B73C2798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA8 +8FE6904E971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D5 +4ECB4F1A89E356DE584A58CA5EFB5FEB602A6094606261D0621262D065390000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE +591654B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D9 +57A367FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B +899A89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B +6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 +53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584310000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007CA5520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E6 +5B8C5B985BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B53 +6C576F226F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266 +839E89B38ACC8CAB908494519593959195A2966597D3992882184E38542B5CB8 +5DCC73A9764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C5668 +57FA59475B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C40000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D77 +8ECC8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A07591 +79477FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A7078276775 +9ECD53745BA2811A865090064E184E454EC74F1153CA54385BAE5F1360256551 +673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 +5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC0000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F9B4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F37 +5F4A602F6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F7 +93E197FF99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C5 +52E457475DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F +8B398FD191D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C8 +99D25177611A865E55B07A7A50765BD3904796854E326ADB91E75C515C480000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000063987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B +85AB8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B +59515F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB +7D4C7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE8 +5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 +503950265065517C5238526355A7570F58055ACC5EFA61B261F862F363720000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000691C6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED29063 +9375967A98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D438237 +8A008AFA96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF +6E5672D07CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E92 +4F0D53485449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B779190 +4E5E9BC94EA44F7C4FAF501950165149516C529F52B952FE539A53E354110000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB7 +5F186052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A +6D696E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B1 +8154818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D +980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B +544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC0000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B6498034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D5 +7D3A826E9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A509396 +88DF57505EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D +6B736E08707D91C7728078157826796D658E7D3083DC88C18F09969B52645728 +67507F6A8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A +548B643E6628671467F57A847B567D22932F685C9BAD7B395319518A52370000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF6652 +4E09509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB +9178991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB +59C959FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B62 +6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C +8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166420000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B216ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F +5F0F8B589D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F06 +75BE8CEA5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66 +659C716E793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235 +914C91C8932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E +816B8DA391529996511253D7546A5BFF63886A397DAC970056DA53CE54680000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F8490 +884689728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E +67D46C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F +51FA88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF3 +6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 +7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F0000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000052DD5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C11 +5C1A5E845E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A2 +6A1F6A356CBC6D886E096E58713C7126716775C77701785D7901796579F07AE0 +7B117CA77D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A4 +9266937E9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E38 +60C564FE676167566D4472B675737A6384B88B7291B89320563157F498FE0000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB5 +55075A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F +795E79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC15203 +587558EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A8 +9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F +745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE0000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F84647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F +6574661F667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA0 +8A938ACB901D91929752975965897A0E810696BB5E2D60DC621A65A566146790 +77F37A4D7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D +7A837BC08AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226 +624764B0681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA0000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE +524D55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A +72D9758F758E790E795679DF7C977D207D4486078A34963B90619F2050E75275 +53CC53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB +64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 +83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E0000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081D385358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD7 +5C5E8CCA65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A +592A6C708A51553E581559A560F0625367C182356955964099C49A284F535806 +5BFE80105CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB8 +9000902E968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD702753535544 +5B856258629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA0000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB0 +4E3953585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D +80C686CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E55730 +5F1B6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C4 +901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 +8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF50000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E165E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A +80748139817887768ABF8ADC8D858DF3929A957798029CE552C5635776F46715 +6C8873CD8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B4 +69FB4F436F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A +91E39DB44EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F +608C62B5633A63D068AF6C407887798E7A0B7DE082478A028AE68E4490130000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F2 +5FB964A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B +70B94F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21 +767B83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC +51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF +76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152300000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008463856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD +52D5540C58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F +5F975FB36D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A +9CF682EB5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D +594890A351854E4D51EA85998B0E7058637A934B696299B47E04757753576960 +8EDF96E36C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E7351650000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000059825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E74 +5FF5637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF +8FB2899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC +4FF35EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A926885 +6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD +67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA60000 +C8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051FD7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A +91979AEA4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD +53DB5E06642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC4 +91C67169981298EF633D6669756A76E478D0854386EE532A5351542659835E87 +5F7C60B26249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB +8AB98CBB907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E0000 +C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C +686759EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C79 +5EDF63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA7 +8CD3983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C601662766577 +65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB +6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D0000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000798F8179890789866DF55F1762556CB84ECF72699B925206543B567458B3 +61A4626E711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E73 +5F0A67C44E26853D9589965B7C73980150FB58C1765678A7522577A585117B86 +504F590972477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA +570363556B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E95023 +4FF853055446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B0000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D2 +98FD9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D0 +68D251927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A8 +64B26734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C6 +646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE +9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E800000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F2B85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A1481085999 +7C8D6C11772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D +660E76DF8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A21 +830259845B5F6BDB731B76F27DB280178499513267289ED976EE676252FF9905 +5C24623B7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F25 +77E253845F797D0485AC8A338E8D975667F385AE9453610961086CB976520000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E67 +6D8C733673377531795088D58A98904A909190F596C4878D59154E884F594E0E +8A898F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB6 +719475287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B32 +6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A +4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A8740674830000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075E288CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C +74097559786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC +5BEE659968816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B +7DD1502B539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F +985E4EE44F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E97 +9F6266A66B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000084EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717 +697C69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B9332 +8AD6502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C18568 +69006E7E78978155000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F0C4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A +82125F0D4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED7 +4EDE4EED4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B +4F694F704F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE4 +4FE5501A50285014502A502550054F1C4FF650215029502C4FFE4FEF50115006 +504350476703505550505048505A5056506C50785080509A508550B450B20000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000050C950CA50B350C250D650DE50E550ED50E350EE50F950F5510951015102 +511651155114511A5121513A5137513C513B513F51405152514C515451627AF8 +5169516A516E5180518256D8518C5189518F519151935195519651A451A651A2 +51A951AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED +51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C +525E5254526A527452695273527F527D528D529452925271528852918FA80000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008FA752AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F5 +52F852F9530653087538530D5310530F5315531A5323532F5331533353385340 +534653454E175349534D51D6535E5369536E5918537B53775382539653A053A6 +53A553AE53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D +5440542C542D543C542E54365429541D544E548F5475548E545F547154775470 +5492547B5480547654845490548654C754A254B854A554AC54C454C854A80000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E2 +553955405563554C552E555C55455556555755385533555D5599558054AF558A +559F557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC +55E455D4561455F7561655FE55FD561B55F9564E565071DF5634563656325638 +566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 +56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457090000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005708570B570D57135718571655C7571C572657375738574E573B5740574F +576957C057885761577F5789579357A057B357A457AA57B057C357C657D457D2 +57D3580A57D657E3580B5819581D587258215862584B58706BC05852583D5879 +588558B9589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E5 +58DC58E458DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C +592D59325938593E7AD259555950594E595A5958596259605967596C59690000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000059785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F +5A115A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC2 +5ABD5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E +5B435B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B80 +5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 +5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C530000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C505C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB6 +5CBC5CB75CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C +5D1F5D1B5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D87 +5D845D825DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB +5DEB5DF25DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E54 +5E5F5E625E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF0000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF8 +5EFE5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F +5F515F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E +5F995F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF60216060 +601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F +604A6046604D6063604360646042606C606B60596081608D60E76083609A0000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006084609B60966097609260A7608B60E160B860E060D360B45FF060BD60C6 +60B560D8614D6115610660F660F7610060F460FA6103612160FB60F1610D610E +6147613E61286127614A613F613C612C6134613D614261446173617761586159 +615A616B6174616F61656171615F615D6153617561996196618761AC6194619A +618A619161AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E6 +61E361F661FA61F461FF61FD61FC61FE620062086209620D620C6214621B0000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000621E6221622A622E6230623262336241624E625E6263625B62606268627C +62826289627E62926293629662D46283629462D762D162BB62CF62FF62C664D4 +62C862DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F5 +6350633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B +636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 +651D64176428640F6467646F6476644E652A6495649364A564A9648864BC0000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064DA64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF +652C64F664F464F264FA650064FD6518651C650565246523652B653465356537 +65366538754B654865566555654D6558655E655D65726578658265838B8A659B +659F65AB65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A +660365FB6773663566366634661C664F664466496641665E665D666466676668 +665F6662667066836688668E668966846698669D66C166B966C966BE66BC0000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000066C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E6726 +67279738672E673F67366741673867376746675E676067596763676467896770 +67A9677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E4 +67DE67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E +68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 +68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD0000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068D468E768D569366912690468D768E3692568F968E068EF6928692A691A +6923692168C669796977695C6978696B6954697E696E69396974693D69596930 +6961695E695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD +69BB69C369A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F9 +69F269E76A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A72 +6A366A786A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA30000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB +6B0586166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B50 +6B596B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA4 +6BAA6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF +9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B +6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE0000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006CBA6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D12 +6D0C6D636D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC7 +6DE66DB86DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D +6E6E6E2E6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E24 +6EFF6E1D6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F +6EA56EC26E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC0000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F58 +6F8E6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD8 +6FF16FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F +7030703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD +70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 +719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC0000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000071F971FF720D7210721B7228722D722C72307232723B723C723F72407246 +724B72587274727E7282728172877292729672A272A772B972B272C372C672C4 +72CE72D272E272E072E172F972F7500F7317730A731C7316731D7334732F7329 +7325733E734E734F9ED87357736A7368737073787375737B737A73C873B373CE +73BB73C073E573EE73DE74A27405746F742573F87432743A7455743F745F7459 +7441745C746974707463746A7476747E748B749E74A774CA74CF74D473F10000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000074E074E374E774E974EE74F274F074F174F874F7750475037505750C750E +750D75157513751E7526752C753C7544754D754A7549755B7546755A75697564 +7567756B756D75787576758675877574758A758975827594759A759D75A575A3 +75C275B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF +75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 +7630763B764776487646765C76587661766276687669766A7667766C76700000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000767276767678767C768076837688768B768E769676937699769A76B076B4 +76B876B976BA76C276CD76D676D276DE76E176E576E776EA862F76FB77087707 +770477297724771E77257726771B773777387747775A7768776B775B7765777F +777E7779778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD +77D777DA77DC77E377EE77FC780C781279267820792A7845788E78747886787C +789A788C78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC0000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078E778DA78FD78F47907791279117919792C792B794079607957795F795A +79557953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E7 +79EC79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A57 +7A497A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB0 +7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 +7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B500000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007B7A7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D +7B987B9F7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC6 +7BDD7BE97C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C23 +7C277C2A7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C56 +7C657C6C7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB9 +7CBD7CC07CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D060000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D72 +7D687D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD +7DAB7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E05 +7E0A7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E37 +7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D +8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A0000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007F457F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F78 +7F827F867F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB6 +7FB88B717FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B +801280188019801C80218028803F803B804A804680528058805A805F80628068 +80738072807080768079807D807F808480868085809B8093809A80AD519080AC +80DB80E580D980DD80C480DA80D6810980EF80F1811B81298123812F814B0000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000968B8146813E8153815180FC8171816E81658166817481838188818A8180 +818281A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA +81C981CD81D181D981D881C881DA81DF81E081E781FA81FB81FE820182028205 +8207820A820D821082168229822B82388233824082598258825D825A825F8264 +82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 +82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D90000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000833583348316833283318340833983508345832F832B831783188385839A +83AA839F83A283968323838E8387838A837C83B58373837583A0838983A883F4 +841383EB83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD +8438850683FB846D842A843C855A84848477846B84AD846E848284698446842C +846F8479843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D6 +84A1852184FF84F485178518852C851F8515851484FC85408563855885480000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000085418602854B8555858085A485888591858A85A8856D8594859B85EA8587 +859C8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613 +860B85FE85FA86068622861A8630863F864D4E558654865F86678671869386A3 +86A986AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC +86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F +8737873B87258729871A8760875F8778874C874E877487578768876E87590000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000087538763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C4 +87B387C787C687BB87EF87F287E0880F880D87FE87F687F7880E87D288118816 +8815882288218831883688398827883B8844884288528859885E8862886B8881 +887E889E8875887D88B5887288828897889288AE889988A2888D88A488B088BF +88B188C388C488D488D888D988DD88F9890288FC88F488E888F28904890C890A +89138943891E8925892A892B89418944893B89368938894C891D8960895E0000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089668964896D896A896F89748977897E89838988898A8993899889A189A9 +89A689AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A16 +8A108A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A85 +8A828A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE7 +8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 +8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B5F8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C41 +8C3F8C488C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E +8C948C7C8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA +8CFD8CFA8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D67 +8D6D8D718D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB +8DDF8DE38DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A0000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E81 +8E878E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE +8EC58EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C +8F1F8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C +8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 +90058FF98FFA901190159021900D901E9016900B90279036903590398FF80000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000904F905090519052900E9049903E90569058905E9068906F907696A89072 +9082907D90819080908A9089908F90A890AF90B190B590E290E4624890DB9102 +9112911991329130914A9156915891639165916991739172918B9189918291A2 +91AB91AF91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC +91F591F6921E91FF9214922C92159211925E925792459249926492489295923F +924B9250929C92969293929B925A92CF92B992B792E9930F92FA9344932E0000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093199322931A9323933A9335933B935C9360937C936E935693B093AC93AD +939493B993D693D793E893E593D893C393DD93D093C893E4941A941494139403 +940794109436942B94359421943A944194529444945B94609462945E946A9229 +947094759477947D945A947C947E9481947F95829587958A9594959695989599 +95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 +95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E0000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000965D965F96669672966C968D96989695969796AA96A796B196B296B096B4 +96B696B896B996CE96CB96C996CD894D96DC970D96D596F99704970697089713 +970E9711970F971697199724972A97309739973D973E97449746974897429749 +975C976097649766976852D2976B977197799785977C9781977A9786978B978F +9790979C97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF +97F697F5980F980C9838982498219837983D9846984F984B986B986F98700000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000098719874987398AA98AF98B198B698C498C398C698E998EB990399099912 +991499189921991D991E99249920992C992E993D993E9942994999459950994B +99519952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED +99EE99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A43 +9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 +9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF70000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009AFB9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B32 +9B449B439B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA8 +9BB49BC09BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF1 +9BF09C159C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C21 +9C309C479C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB +9D039D069D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D480000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA9 +9DB29DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD +9E1A9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA9 +9EB89EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF +9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 +9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA00000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000582F69C79059746451DC7199000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +R +A1C1 301C FF5E +A1C2 2016 2225 +A1DD 2212 FF0D +A1F1 00A2 FFE0 +A1F2 00A3 FFE1 +A2CC 00AC FFE2 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/euc-kr.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/euc-kr.enc new file mode 100644 index 00000000..5e9bb93b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/euc-kr.enc @@ -0,0 +1,1533 @@ +# Encoding file: euc-kr, multi-byte +M +003F 0 90 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300200B72025202600A8300300AD20152225FF3C223C20182019 +201C201D3014301530083009300A300B300C300D300E300F3010301100B100D7 +00F7226022642265221E223400B0203220332103212BFFE0FFE1FFE526422640 +222022A52312220222072261225200A7203B2606260525CB25CF25CE25C725C6 +25A125A025B325B225BD25BC219221902191219321943013226A226B221A223D +221D2235222B222C2208220B2286228722822283222A222922272228FFE20000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000021D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF +02D0222E2211220F00A42109203025C125C025B725B626642660266126652667 +2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E +261C261E00B62020202121952197219921962198266D2669266A266C327F321C +211633C7212233C233D821210000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FF04FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFFE6FF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000313131323133313431353136313731383139313A313B313C313D313E313F +3140314131423143314431453146314731483149314A314B314C314D314E314F +3150315131523153315431553156315731583159315A315B315C315D315E315F +3160316131623163316431653166316731683169316A316B316C316D316E316F +3170317131723173317431753176317731783179317A317B317C317D317E317F +3180318131823183318431853186318731883189318A318B318C318D318E0000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000217021712172217321742175217621772178217900000000000000000000 +2160216121622163216421652166216721682169000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000025002502250C251025182514251C252C25242534253C25012503250F2513 +251B251725232533252B253B254B2520252F25282537253F251D253025252538 +254225122511251A251925162515250E250D251E251F25212522252625272529 +252A252D252E25312532253525362539253A253D253E25402541254325442545 +2546254725482549254A00000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00003395339633972113339833C433A333A433A533A63399339A339B339C339D +339E339F33A033A133A233CA338D338E338F33CF3388338933C833A733A833B0 +33B133B233B333B433B533B633B733B833B93380338133823383338433BA33BB +33BC33BD33BE33BF33903391339233933394212633C033C1338A338B338C33D6 +33C533AD33AE33AF33DB33A933AA33AB33AC33DD33D033D333C333C933DC33C6 +0000000000000000000000000000000000000000000000000000000000000000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000C600D000AA0126000001320000013F014100D8015200BA00DE0166014A +00003260326132623263326432653266326732683269326A326B326C326D326E +326F3270327132723273327432753276327732783279327A327B24D024D124D2 +24D324D424D524D624D724D824D924DA24DB24DC24DD24DE24DF24E024E124E2 +24E324E424E524E624E724E824E9246024612462246324642465246624672468 +2469246A246B246C246D246E00BD2153215400BC00BE215B215C215D215E0000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000E6011100F001270131013301380140014200F8015300DF00FE0167014B +01493200320132023203320432053206320732083209320A320B320C320D320E +320F3210321132123213321432153216321732183219321A321B249C249D249E +249F24A024A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE +24AF24B024B124B224B324B424B5247424752476247724782479247A247B247C +247D247E247F24802481248200B900B200B32074207F20812082208320840000 +AA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +AB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +AC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AC00AC01AC04AC07AC08AC09AC0AAC10AC11AC12AC13AC14AC15AC16AC17 +AC19AC1AAC1BAC1CAC1DAC20AC24AC2CAC2DAC2FAC30AC31AC38AC39AC3CAC40 +AC4BAC4DAC54AC58AC5CAC70AC71AC74AC77AC78AC7AAC80AC81AC83AC84AC85 +AC86AC89AC8AAC8BAC8CAC90AC94AC9CAC9DAC9FACA0ACA1ACA8ACA9ACAAACAC +ACAFACB0ACB8ACB9ACBBACBCACBDACC1ACC4ACC8ACCCACD5ACD7ACE0ACE1ACE4 +ACE7ACE8ACEAACECACEFACF0ACF1ACF3ACF5ACF6ACFCACFDAD00AD04AD060000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AD0CAD0DAD0FAD11AD18AD1CAD20AD29AD2CAD2DAD34AD35AD38AD3CAD44 +AD45AD47AD49AD50AD54AD58AD61AD63AD6CAD6DAD70AD73AD74AD75AD76AD7B +AD7CAD7DAD7FAD81AD82AD88AD89AD8CAD90AD9CAD9DADA4ADB7ADC0ADC1ADC4 +ADC8ADD0ADD1ADD3ADDCADE0ADE4ADF8ADF9ADFCADFFAE00AE01AE08AE09AE0B +AE0DAE14AE30AE31AE34AE37AE38AE3AAE40AE41AE43AE45AE46AE4AAE4CAE4D +AE4EAE50AE54AE56AE5CAE5DAE5FAE60AE61AE65AE68AE69AE6CAE70AE780000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AE79AE7BAE7CAE7DAE84AE85AE8CAEBCAEBDAEBEAEC0AEC4AECCAECDAECF +AED0AED1AED8AED9AEDCAEE8AEEBAEEDAEF4AEF8AEFCAF07AF08AF0DAF10AF2C +AF2DAF30AF32AF34AF3CAF3DAF3FAF41AF42AF43AF48AF49AF50AF5CAF5DAF64 +AF65AF79AF80AF84AF88AF90AF91AF95AF9CAFB8AFB9AFBCAFC0AFC7AFC8AFC9 +AFCBAFCDAFCEAFD4AFDCAFE8AFE9AFF0AFF1AFF4AFF8B000B001B004B00CB010 +B014B01CB01DB028B044B045B048B04AB04CB04EB053B054B055B057B0590000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B05DB07CB07DB080B084B08CB08DB08FB091B098B099B09AB09CB09FB0A0 +B0A1B0A2B0A8B0A9B0ABB0ACB0ADB0AEB0AFB0B1B0B3B0B4B0B5B0B8B0BCB0C4 +B0C5B0C7B0C8B0C9B0D0B0D1B0D4B0D8B0E0B0E5B108B109B10BB10CB110B112 +B113B118B119B11BB11CB11DB123B124B125B128B12CB134B135B137B138B139 +B140B141B144B148B150B151B154B155B158B15CB160B178B179B17CB180B182 +B188B189B18BB18DB192B193B194B198B19CB1A8B1CCB1D0B1D4B1DCB1DD0000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B1DFB1E8B1E9B1ECB1F0B1F9B1FBB1FDB204B205B208B20BB20CB214B215 +B217B219B220B234B23CB258B25CB260B268B269B274B275B27CB284B285B289 +B290B291B294B298B299B29AB2A0B2A1B2A3B2A5B2A6B2AAB2ACB2B0B2B4B2C8 +B2C9B2CCB2D0B2D2B2D8B2D9B2DBB2DDB2E2B2E4B2E5B2E6B2E8B2EBB2ECB2ED +B2EEB2EFB2F3B2F4B2F5B2F7B2F8B2F9B2FAB2FBB2FFB300B301B304B308B310 +B311B313B314B315B31CB354B355B356B358B35BB35CB35EB35FB364B3650000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B367B369B36BB36EB370B371B374B378B380B381B383B384B385B38CB390 +B394B3A0B3A1B3A8B3ACB3C4B3C5B3C8B3CBB3CCB3CEB3D0B3D4B3D5B3D7B3D9 +B3DBB3DDB3E0B3E4B3E8B3FCB410B418B41CB420B428B429B42BB434B450B451 +B454B458B460B461B463B465B46CB480B488B49DB4A4B4A8B4ACB4B5B4B7B4B9 +B4C0B4C4B4C8B4D0B4D5B4DCB4DDB4E0B4E3B4E4B4E6B4ECB4EDB4EFB4F1B4F8 +B514B515B518B51BB51CB524B525B527B528B529B52AB530B531B534B5380000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B540B541B543B544B545B54BB54CB54DB550B554B55CB55DB55FB560B561 +B5A0B5A1B5A4B5A8B5AAB5ABB5B0B5B1B5B3B5B4B5B5B5BBB5BCB5BDB5C0B5C4 +B5CCB5CDB5CFB5D0B5D1B5D8B5ECB610B611B614B618B625B62CB634B648B664 +B668B69CB69DB6A0B6A4B6ABB6ACB6B1B6D4B6F0B6F4B6F8B700B701B705B728 +B729B72CB72FB730B738B739B73BB744B748B74CB754B755B760B764B768B770 +B771B773B775B77CB77DB780B784B78CB78DB78FB790B791B792B796B7970000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B798B799B79CB7A0B7A8B7A9B7ABB7ACB7ADB7B4B7B5B7B8B7C7B7C9B7EC +B7EDB7F0B7F4B7FCB7FDB7FFB800B801B807B808B809B80CB810B818B819B81B +B81DB824B825B828B82CB834B835B837B838B839B840B844B851B853B85CB85D +B860B864B86CB86DB86FB871B878B87CB88DB8A8B8B0B8B4B8B8B8C0B8C1B8C3 +B8C5B8CCB8D0B8D4B8DDB8DFB8E1B8E8B8E9B8ECB8F0B8F8B8F9B8FBB8FDB904 +B918B920B93CB93DB940B944B94CB94FB951B958B959B95CB960B968B9690000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B96BB96DB974B975B978B97CB984B985B987B989B98AB98DB98EB9ACB9AD +B9B0B9B4B9BCB9BDB9BFB9C1B9C8B9C9B9CCB9CEB9CFB9D0B9D1B9D2B9D8B9D9 +B9DBB9DDB9DEB9E1B9E3B9E4B9E5B9E8B9ECB9F4B9F5B9F7B9F8B9F9B9FABA00 +BA01BA08BA15BA38BA39BA3CBA40BA42BA48BA49BA4BBA4DBA4EBA53BA54BA55 +BA58BA5CBA64BA65BA67BA68BA69BA70BA71BA74BA78BA83BA84BA85BA87BA8C +BAA8BAA9BAABBAACBAB0BAB2BAB8BAB9BABBBABDBAC4BAC8BAD8BAD9BAFC0000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BB00BB04BB0DBB0FBB11BB18BB1CBB20BB29BB2BBB34BB35BB36BB38BB3B +BB3CBB3DBB3EBB44BB45BB47BB49BB4DBB4FBB50BB54BB58BB61BB63BB6CBB88 +BB8CBB90BBA4BBA8BBACBBB4BBB7BBC0BBC4BBC8BBD0BBD3BBF8BBF9BBFCBBFF +BC00BC02BC08BC09BC0BBC0CBC0DBC0FBC11BC14BC15BC16BC17BC18BC1BBC1C +BC1DBC1EBC1FBC24BC25BC27BC29BC2DBC30BC31BC34BC38BC40BC41BC43BC44 +BC45BC49BC4CBC4DBC50BC5DBC84BC85BC88BC8BBC8CBC8EBC94BC95BC970000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BC99BC9ABCA0BCA1BCA4BCA7BCA8BCB0BCB1BCB3BCB4BCB5BCBCBCBDBCC0 +BCC4BCCDBCCFBCD0BCD1BCD5BCD8BCDCBCF4BCF5BCF6BCF8BCFCBD04BD05BD07 +BD09BD10BD14BD24BD2CBD40BD48BD49BD4CBD50BD58BD59BD64BD68BD80BD81 +BD84BD87BD88BD89BD8ABD90BD91BD93BD95BD99BD9ABD9CBDA4BDB0BDB8BDD4 +BDD5BDD8BDDCBDE9BDF0BDF4BDF8BE00BE03BE05BE0CBE0DBE10BE14BE1CBE1D +BE1FBE44BE45BE48BE4CBE4EBE54BE55BE57BE59BE5ABE5BBE60BE61BE640000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BE68BE6ABE70BE71BE73BE74BE75BE7BBE7CBE7DBE80BE84BE8CBE8DBE8F +BE90BE91BE98BE99BEA8BED0BED1BED4BED7BED8BEE0BEE3BEE4BEE5BEECBF01 +BF08BF09BF18BF19BF1BBF1CBF1DBF40BF41BF44BF48BF50BF51BF55BF94BFB0 +BFC5BFCCBFCDBFD0BFD4BFDCBFDFBFE1C03CC051C058C05CC060C068C069C090 +C091C094C098C0A0C0A1C0A3C0A5C0ACC0ADC0AFC0B0C0B3C0B4C0B5C0B6C0BC +C0BDC0BFC0C0C0C1C0C5C0C8C0C9C0CCC0D0C0D8C0D9C0DBC0DCC0DDC0E40000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C0E5C0E8C0ECC0F4C0F5C0F7C0F9C100C104C108C110C115C11CC11DC11E +C11FC120C123C124C126C127C12CC12DC12FC130C131C136C138C139C13CC140 +C148C149C14BC14CC14DC154C155C158C15CC164C165C167C168C169C170C174 +C178C185C18CC18DC18EC190C194C196C19CC19DC19FC1A1C1A5C1A8C1A9C1AC +C1B0C1BDC1C4C1C8C1CCC1D4C1D7C1D8C1E0C1E4C1E8C1F0C1F1C1F3C1FCC1FD +C200C204C20CC20DC20FC211C218C219C21CC21FC220C228C229C22BC22D0000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C22FC231C232C234C248C250C251C254C258C260C265C26CC26DC270C274 +C27CC27DC27FC281C288C289C290C298C29BC29DC2A4C2A5C2A8C2ACC2ADC2B4 +C2B5C2B7C2B9C2DCC2DDC2E0C2E3C2E4C2EBC2ECC2EDC2EFC2F1C2F6C2F8C2F9 +C2FBC2FCC300C308C309C30CC30DC313C314C315C318C31CC324C325C328C329 +C345C368C369C36CC370C372C378C379C37CC37DC384C388C38CC3C0C3D8C3D9 +C3DCC3DFC3E0C3E2C3E8C3E9C3EDC3F4C3F5C3F8C408C410C424C42CC4300000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C434C43CC43DC448C464C465C468C46CC474C475C479C480C494C49CC4B8 +C4BCC4E9C4F0C4F1C4F4C4F8C4FAC4FFC500C501C50CC510C514C51CC528C529 +C52CC530C538C539C53BC53DC544C545C548C549C54AC54CC54DC54EC553C554 +C555C557C558C559C55DC55EC560C561C564C568C570C571C573C574C575C57C +C57DC580C584C587C58CC58DC58FC591C595C597C598C59CC5A0C5A9C5B4C5B5 +C5B8C5B9C5BBC5BCC5BDC5BEC5C4C5C5C5C6C5C7C5C8C5C9C5CAC5CCC5CE0000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C5D0C5D1C5D4C5D8C5E0C5E1C5E3C5E5C5ECC5EDC5EEC5F0C5F4C5F6C5F7 +C5FCC5FDC5FEC5FFC600C601C605C606C607C608C60CC610C618C619C61BC61C +C624C625C628C62CC62DC62EC630C633C634C635C637C639C63BC640C641C644 +C648C650C651C653C654C655C65CC65DC660C66CC66FC671C678C679C67CC680 +C688C689C68BC68DC694C695C698C69CC6A4C6A5C6A7C6A9C6B0C6B1C6B4C6B8 +C6B9C6BAC6C0C6C1C6C3C6C5C6CCC6CDC6D0C6D4C6DCC6DDC6E0C6E1C6E80000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C6E9C6ECC6F0C6F8C6F9C6FDC704C705C708C70CC714C715C717C719C720 +C721C724C728C730C731C733C735C737C73CC73DC740C744C74AC74CC74DC74F +C751C752C753C754C755C756C757C758C75CC760C768C76BC774C775C778C77C +C77DC77EC783C784C785C787C788C789C78AC78EC790C791C794C796C797C798 +C79AC7A0C7A1C7A3C7A4C7A5C7A6C7ACC7ADC7B0C7B4C7BCC7BDC7BFC7C0C7C1 +C7C8C7C9C7CCC7CEC7D0C7D8C7DDC7E4C7E8C7ECC800C801C804C808C80A0000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C810C811C813C815C816C81CC81DC820C824C82CC82DC82FC831C838C83C +C840C848C849C84CC84DC854C870C871C874C878C87AC880C881C883C885C886 +C887C88BC88CC88DC894C89DC89FC8A1C8A8C8BCC8BDC8C4C8C8C8CCC8D4C8D5 +C8D7C8D9C8E0C8E1C8E4C8F5C8FCC8FDC900C904C905C906C90CC90DC90FC911 +C918C92CC934C950C951C954C958C960C961C963C96CC970C974C97CC988C989 +C98CC990C998C999C99BC99DC9C0C9C1C9C4C9C7C9C8C9CAC9D0C9D1C9D30000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C9D5C9D6C9D9C9DAC9DCC9DDC9E0C9E2C9E4C9E7C9ECC9EDC9EFC9F0C9F1 +C9F8C9F9C9FCCA00CA08CA09CA0BCA0CCA0DCA14CA18CA29CA4CCA4DCA50CA54 +CA5CCA5DCA5FCA60CA61CA68CA7DCA84CA98CABCCABDCAC0CAC4CACCCACDCACF +CAD1CAD3CAD8CAD9CAE0CAECCAF4CB08CB10CB14CB18CB20CB21CB41CB48CB49 +CB4CCB50CB58CB59CB5DCB64CB78CB79CB9CCBB8CBD4CBE4CBE7CBE9CC0CCC0D +CC10CC14CC1CCC1DCC21CC22CC27CC28CC29CC2CCC2ECC30CC38CC39CC3B0000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CC3CCC3DCC3ECC44CC45CC48CC4CCC54CC55CC57CC58CC59CC60CC64CC66 +CC68CC70CC75CC98CC99CC9CCCA0CCA8CCA9CCABCCACCCADCCB4CCB5CCB8CCBC +CCC4CCC5CCC7CCC9CCD0CCD4CCE4CCECCCF0CD01CD08CD09CD0CCD10CD18CD19 +CD1BCD1DCD24CD28CD2CCD39CD5CCD60CD64CD6CCD6DCD6FCD71CD78CD88CD94 +CD95CD98CD9CCDA4CDA5CDA7CDA9CDB0CDC4CDCCCDD0CDE8CDECCDF0CDF8CDF9 +CDFBCDFDCE04CE08CE0CCE14CE19CE20CE21CE24CE28CE30CE31CE33CE350000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CE58CE59CE5CCE5FCE60CE61CE68CE69CE6BCE6DCE74CE75CE78CE7CCE84 +CE85CE87CE89CE90CE91CE94CE98CEA0CEA1CEA3CEA4CEA5CEACCEADCEC1CEE4 +CEE5CEE8CEEBCEECCEF4CEF5CEF7CEF8CEF9CF00CF01CF04CF08CF10CF11CF13 +CF15CF1CCF20CF24CF2CCF2DCF2FCF30CF31CF38CF54CF55CF58CF5CCF64CF65 +CF67CF69CF70CF71CF74CF78CF80CF85CF8CCFA1CFA8CFB0CFC4CFE0CFE1CFE4 +CFE8CFF0CFF1CFF3CFF5CFFCD000D004D011D018D02DD034D035D038D03C0000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D044D045D047D049D050D054D058D060D06CD06DD070D074D07CD07DD081 +D0A4D0A5D0A8D0ACD0B4D0B5D0B7D0B9D0C0D0C1D0C4D0C8D0C9D0D0D0D1D0D3 +D0D4D0D5D0DCD0DDD0E0D0E4D0ECD0EDD0EFD0F0D0F1D0F8D10DD130D131D134 +D138D13AD140D141D143D144D145D14CD14DD150D154D15CD15DD15FD161D168 +D16CD17CD184D188D1A0D1A1D1A4D1A8D1B0D1B1D1B3D1B5D1BAD1BCD1C0D1D8 +D1F4D1F8D207D209D210D22CD22DD230D234D23CD23DD23FD241D248D25C0000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D264D280D281D284D288D290D291D295D29CD2A0D2A4D2ACD2B1D2B8D2B9 +D2BCD2BFD2C0D2C2D2C8D2C9D2CBD2D4D2D8D2DCD2E4D2E5D2F0D2F1D2F4D2F8 +D300D301D303D305D30CD30DD30ED310D314D316D31CD31DD31FD320D321D325 +D328D329D32CD330D338D339D33BD33CD33DD344D345D37CD37DD380D384D38C +D38DD38FD390D391D398D399D39CD3A0D3A8D3A9D3ABD3ADD3B4D3B8D3BCD3C4 +D3C5D3C8D3C9D3D0D3D8D3E1D3E3D3ECD3EDD3F0D3F4D3FCD3FDD3FFD4010000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D408D41DD440D444D45CD460D464D46DD46FD478D479D47CD47FD480D482 +D488D489D48BD48DD494D4A9D4CCD4D0D4D4D4DCD4DFD4E8D4ECD4F0D4F8D4FB +D4FDD504D508D50CD514D515D517D53CD53DD540D544D54CD54DD54FD551D558 +D559D55CD560D565D568D569D56BD56DD574D575D578D57CD584D585D587D588 +D589D590D5A5D5C8D5C9D5CCD5D0D5D2D5D8D5D9D5DBD5DDD5E4D5E5D5E8D5EC +D5F4D5F5D5F7D5F9D600D601D604D608D610D611D613D614D615D61CD6200000 +C8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D624D62DD638D639D63CD640D645D648D649D64BD64DD651D654D655D658 +D65CD667D669D670D671D674D683D685D68CD68DD690D694D69DD69FD6A1D6A8 +D6ACD6B0D6B9D6BBD6C4D6C5D6C8D6CCD6D1D6D4D6D7D6D9D6E0D6E4D6E8D6F0 +D6F5D6FCD6FDD700D704D711D718D719D71CD720D728D729D72BD72DD734D735 +D738D73CD744D747D749D750D751D754D756D757D758D759D760D761D763D765 +D769D76CD770D774D77CD77DD781D788D789D78CD790D798D799D79BD79D0000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F3D4F73504750F952A053EF547554E556095AC15BB6668767B667B767EF +6B4C73C275C27A3C82DB8304885788888A368CC88DCF8EFB8FE699D5523B5374 +5404606A61646BBC73CF811A89BA89D295A34F83520A58BE597859E65E725E79 +61C763C0674667EC687F6F97764E770B78F57A087AFF7C21809D826E82718AEB +95934E6B559D66F76E3478A37AED845B8910874E97A852D8574E582A5D4C611F +61BE6221656267D16A446E1B751875B376E377B07D3A90AF945194529F950000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053235CAC753280DB92409598525B580859DC5CA15D175EB75F3A5F4A6177 +6C5F757A75867CE07D737DB17F8C81548221859189418B1B92FC964D9C474ECB +4EF7500B51F1584F6137613E6168653969EA6F1175A5768676D67B8782A584CB +F90093A7958B55805BA25751F9017CB37FB991B5502853BB5C455DE862D2636E +64DA64E76E2070AC795B8DDD8E1EF902907D924592F84E7E4EF650655DFE5EFA +61066957817186548E4793759A2B4E5E5091677068405109528D52926AA20000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077BC92109ED452AB602F8FF2504861A963ED64CA683C6A846FC0818889A1 +96945805727D72AC75047D797E6D80A9898B8B7490639D5162896C7A6F547D50 +7F3A8A23517C614A7B9D8B199257938C4EAC4FD3501E50BE510652C152CD537F +577058835E9A5F91617661AC64CE656C666F66BB66F468976D87708570F1749F +74A574CA75D9786C78EC7ADF7AF67D457D938015803F811B83968B668F159015 +93E1980398389A5A9BE84FC25553583A59515B635C4660B86212684268B00000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068E86EAA754C767878CE7A3D7CFB7E6B7E7C8A088AA18C3F968E9DC453E4 +53E9544A547156FA59D15B645C3B5EAB62F765376545657266A067AF69C16CBD +75FC7690777E7A3F7F94800380A1818F82E682FD83F085C1883188B48AA5F903 +8F9C932E96C798679AD89F1354ED659B66F2688F7A408C379D6056F057645D11 +660668B168CD6EFE7428889E9BE46C68F9049AA84F9B516C5171529F5B545DE5 +6050606D62F163A7653B73D97A7A86A38CA2978F4E325BE16208679C74DC0000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079D183D38A878AB28DE8904E934B98465ED369E885FF90EDF90551A05B98 +5BEC616368FA6B3E704C742F74D87BA17F5083C589C08CAB95DC9928522E605D +62EC90024F8A5149532158D95EE366E06D38709A72C273D67B5080F1945B5366 +639B7F6B4E565080584A58DE602A612762D069D09B415B8F7D1880B18F5F4EA4 +50D154AC55AC5B0C5DA05DE7652A654E68216A4B72E1768E77EF7D5E7FF981A0 +854E86DF8F038F4E90CA99039A559BAB4E184E454E5D4EC74FF1517752FE0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000534053E353E5548E5614577557A25BC75D875ED061FC62D8655167B867E9 +69CB6B506BC66BEC6C426E9D707872D77396740377BF77E97A767D7F800981FC +8205820A82DF88628B338CFC8EC0901190B1926492B699D29A459CE99DD79F9C +570B5C4083CA97A097AB9EB4541B7A987FA488D98ECD90E158005C4863987A9F +5BAE5F137A797AAE828E8EAC5026523852F85377570862F363726B0A6DC37737 +53A5735785688E7695D5673A6AC36F708A6D8ECC994BF90666776B788CB40000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B3CF90753EB572D594E63C669FB73EA78457ABA7AC57CFE8475898F8D73 +903595A852FB574775477B6083CC921EF9086A58514B524B5287621F68D86975 +969950C552A452E461C365A4683969FF747E7B4B82B983EB89B28B398FD19949 +F9094ECA599764D266116A8E7434798179BD82A9887E887F895FF90A93264F0B +53CA602562716C727D1A7D664E98516277DC80AF4F014F0E5176518055DC5668 +573B57FA57FC5914594759935BC45C905D0E5DF15E7E5FCC628065D765E30000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000671E671F675E68CB68C46A5F6B3A6C236C7D6C826DC773987426742A7482 +74A37578757F788178EF794179477948797A7B957D007DBA7F888006802D808C +8A188B4F8C488D779321932498E299519A0E9A0F9A659E927DCA4F76540962EE +685491D155AB513AF90BF90C5A1C61E6F90D62CF62FFF90EF90FF910F911F912 +F91390A3F914F915F916F917F9188AFEF919F91AF91BF91C6696F91D7156F91E +F91F96E3F920634F637A5357F921678F69606E73F9227537F923F924F9250000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D0DF926F927887256CA5A18F928F929F92AF92BF92C4E43F92D51675948 +67F08010F92E59735E74649A79CA5FF5606C62C8637B5BE75BD752AAF92F5974 +5F296012F930F931F9327459F933F934F935F936F937F93899D1F939F93AF93B +F93CF93DF93EF93FF940F941F942F9436FC3F944F94581BF8FB260F1F946F947 +8166F948F9495C3FF94AF94BF94CF94DF94EF94FF950F9515AE98A25677B7D10 +F952F953F954F955F956F95780FDF958F9595C3C6CE5533F6EBA591A83360000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E394EB64F4655AE571858C75F5665B765E66A806BB56E4D77ED7AEF7C1E +7DDE86CB88929132935B64BB6FBE737A75B890545556574D61BA64D466C76DE1 +6E5B6F6D6FB975F0804381BD854189838AC78B5A931F6C9375537B548E0F905D +5510580258585E626207649E68E075767CD687B39EE84EE35788576E59275C0D +5CB15E365F85623464E173B381FA888B8CB8968A9EDB5B855FB760B350125200 +52305716583558575C0E5C605CF65D8B5EA65F9260BC63116389641768430000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068F96AC26DD86E216ED46FE471FE76DC777979B17A3B840489A98CED8DF3 +8E4890039014905390FD934D967697DC6BD27006725872A27368776379BF7BE4 +7E9B8B8058A960C7656665FD66BE6C8C711E71C98C5A98134E6D7A814EDD51AC +51CD52D5540C61A76771685068DF6D1E6F7C75BC77B37AE580F484639285515C +6597675C679375D87AC78373F95A8C469017982D5C6F81C0829A9041906F920D +5F975D9D6A5971C8767B7B4985E48B0491279A30558761F6F95B76697F850000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000863F87BA88F8908FF95C6D1B70D973DE7D61843DF95D916A99F1F95E4E82 +53756B046B12703E721B862D9E1E524C8FA35D5064E5652C6B166FEB7C437E9C +85CD896489BD62C981D8881F5ECA67176D6A72FC7405746F878290DE4F865D0D +5FA0840A51B763A075654EAE5006516951C968816A117CAE7CB17CE7826F8AD2 +8F1B91CF4FB6513752F554425EEC616E623E65C56ADA6FFE792A85DC882395AD +9A629A6A9E979ECE529B66C66B77701D792B8F6297426190620065236F230000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000714974897DF4806F84EE8F269023934A51BD521752A36D0C70C888C25EC9 +65826BAE6FC27C3E73754EE44F3656F9F95F5CBA5DBA601C73B27B2D7F9A7FCE +8046901E923496F6974898189F614F8B6FA779AE91B496B752DEF960648864C4 +6AD36F5E7018721076E780018606865C8DEF8F0597329B6F9DFA9E75788C797F +7DA083C993049E7F9E938AD658DF5F046727702774CF7C60807E512170287262 +78CA8CC28CDA8CF496F74E8650DA5BEE5ED6659971CE764277AD804A84FC0000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000907C9B279F8D58D85A415C626A136DDA6F0F763B7D2F7E37851E893893E4 +964B528965D267F369B46D416E9C700F7409746075597624786B8B2C985E516D +622E96784F96502B5D196DEA7DB88F2A5F8B61446817F961968652D2808B51DC +51CC695E7A1C7DBE83F196754FDA52295398540F550E5C6560A7674E68A86D6C +728172F874067483F96275E27C6C7F797FB8838988CF88E191CC91D096E29BC9 +541D6F7E71D0749885FA8EAA96A39C579E9F67976DCB743381E89716782C0000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ACB7B207C926469746A75F278BC78E899AC9B549EBB5BDE5E556F20819C +83AB90884E07534D5A295DD25F4E6162633D666966FC6EFF6F2B7063779E842C +8513883B8F1399459C3B551C62B9672B6CAB8309896A977A4EA159845FD85FD9 +671B7DB27F548292832B83BD8F1E909957CB59B95A925BD06627679A68856BCF +71647F758CB78CE390819B4581088C8A964C9A409EA55B5F6C13731B76F276DF +840C51AA8993514D519552C968C96C94770477207DBF7DEC97629EB56EC50000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000851151A5540D547D660E669D69276E9F76BF7791831784C2879F91699298 +9CF488824FAE519252DF59C65E3D61556478647966AE67D06A216BCD6BDB725F +72617441773877DB801782BC83058B008B288C8C67286C90726776EE77667A46 +9DA96B7F6C92592267268499536F589359995EDF63CF663467736E3A732B7AD7 +82D7932852D95DEB61AE61CB620A62C764AB65E069596B666BCB712173F7755D +7E46821E8302856A8AA38CBF97279D6158A89ED85011520E543B554F65870000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C767D0A7D0B805E868A958096EF52FF6C95726954735A9A5C3E5D4B5F4C +5FAE672A68B669636E3C6E4477097C737F8E85878B0E8FF797619EF45CB760B6 +610D61AB654F65FB65FC6C116CEF739F73C97DE195945BC6871C8B10525D535A +62CD640F64B267346A386CCA73C0749E7B947C957E1B818A823685848FEB96F9 +99C14F34534A53CD53DB62CC642C6500659169C36CEE6F5873ED7554762276E4 +76FC78D078FB792C7D46822C87E08FD4981298EF52C362D464A56E246F510000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000767C8DCB91B192629AEE9B435023508D574A59A85C285E475F77623F653E +65B965C16609678B699C6EC278C57D2180AA8180822B82B384A1868C8A2A8B17 +90A696329F90500D4FF3F96357F95F9862DC6392676F6E43711976C380CC80DA +88F488F589198CE08F29914D966A4F2F4F705E1B67CF6822767D767E9B445E61 +6A0A716971D4756AF9647E41854385E998DC4F107B4F7F7095A551E15E0668B5 +6C3E6C4E6CDB72AF7BC483036CD5743A50FB528858C164D86A9774A776560000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078A7861795E29739F965535E5F018B8A8FA88FAF908A522577A59C499F08 +4E19500251755C5B5E77661E663A67C468C570B3750175C579C97ADD8F279920 +9A084FDD582158315BF6666E6B656D116E7A6F7D73E4752B83E988DC89138B5C +8F144F0F50D55310535C5B935FA9670D798F8179832F8514890789868F398F3B +99A59C12672C4E764FF859495C015CEF5CF0636768D270FD71A2742B7E2B84EC +8702902292D29CF34E0D4ED84FEF50855256526F5426549057E0592B5A660000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005B5A5B755BCC5E9CF9666276657765A76D6E6EA572367B267C3F7F368150 +8151819A8240829983A98A038CA08CE68CFB8D748DBA90E891DC961C964499D9 +9CE7531752065429567458B35954596E5FFF61A4626E66106C7E711A76C67C89 +7CDE7D1B82AC8CC196F0F9674F5B5F175F7F62C25D29670B68DA787C7E439D6C +4E1550995315532A535159835A625E8760B2618A624962796590678769A76BD4 +6BD66BD76BD86CB8F968743575FA7812789179D579D87C837DCB7FE180A50000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000813E81C283F2871A88E88AB98B6C8CBB9119975E98DB9F3B56AC5B2A5F6C +658C6AB36BAF6D5C6FF17015725D73AD8CA78CD3983B61916C3780589A014E4D +4E8B4E9B4ED54F3A4F3C4F7F4FDF50FF53F253F8550655E356DB58EB59625A11 +5BEB5BFA5C045DF35E2B5F99601D6368659C65AF67F667FB68AD6B7B6C996CD7 +6E23700973457802793E7940796079C17BE97D177D728086820D838E84D186C7 +88DF8A508A5E8B1D8CDC8D668FAD90AA98FC99DF9E9D524AF9696714F96A0000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005098522A5C7165636C5573CA7523759D7B97849C917897304E7764926BBA +715E85A94E09F96B674968EE6E17829F8518886B63F76F81921298AF4E0A50B7 +50CF511F554655AA56175B405C195CE05E385E8A5EA05EC260F368516A616E58 +723D724072C076F879657BB17FD488F389F48A738C618CDE971C585E74BD8CFD +55C7F96C7A617D2282727272751F7525F96D7B19588558FB5DBC5E8F5EB65F90 +60556292637F654D669166D966F8681668F27280745E7B6E7D6E7DD67F720000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000080E5821285AF897F8A93901D92E49ECD9F205915596D5E2D60DC66146673 +67906C506DC56F5F77F378A984C691CB932B4ED950CA514855845B0B5BA36247 +657E65CB6E32717D74017444748774BF766C79AA7DDA7E557FA8817A81B38239 +861A87EC8A758DE3907892919425994D9BAE53685C5169546CC46D296E2B820C +859B893B8A2D8AAA96EA9F67526166B96BB27E9687FE8D0D9583965D651D6D89 +71EEF96E57CE59D35BAC602760FA6210661F665F732973F976DB77017B6C0000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008056807281658AA091924E1652E26B726D177A057B397D30F96F8CB053EC +562F58515BB55C0F5C115DE2624063836414662D68B36CBC6D886EAF701F70A4 +71D27526758F758E76197B117BE07C2B7D207D39852C856D86078A34900D9061 +90B592B797F69A374FD75C6C675F6D917C9F7E8C8B168D16901F5B6B5DFD640D +84C0905C98E173875B8B609A677E6DDE8A1F8AA69001980C5237F9707051788E +9396887091D74FEE53D755FD56DA578258FD5AC25B885CAB5CC05E2561010000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000620D624B6388641C653665786A396B8A6C346D196F3171E772E973787407 +74B27626776179C07A577AEA7CB97D8F7DAC7E617F9E81298331849084DA85EA +88968AB08B908F3890429083916C929692B9968B96A796A896D6970098089996 +9AD39B1A53D4587E59195B705BBF6DD16F5A719F742174B9808583FD5DE15F87 +5FAA604265EC6812696F6A536B896D356DF373E376FE77AC7B4D7D148123821C +834084F485638A628AC49187931E980699B4620C88538FF092655D075D270000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005D69745F819D87686FD562FE7FD2893689724E1E4E5850E752DD5347627F +66077E698805965E4F8D5319563659CB5AA45C385C4E5C4D5E025F11604365BD +662F664267BE67F4731C77E2793A7FC5849484CD89968A668A698AE18C558C7A +57F45BD45F0F606F62ED690D6B966E5C71847BD287558B588EFE98DF98FE4F38 +4F814FE1547B5A205BB8613C65B0666871FC7533795E7D33814E81E3839885AA +85CE87038A0A8EAB8F9BF9718FC559315BA45BE660895BE95C0B5FC36C810000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9726DF1700B751A82AF8AF64EC05341F97396D96C0F4E9E4FC45152555E +5A255CE86211725982BD83AA86FE88598A1D963F96C599139D099D5D580A5CB3 +5DBD5E4460E1611563E16A026E2591029354984E9C109F775B895CB86309664F +6848773C96C1978D98549B9F65A18B018ECB95BC55355CA95DD65EB56697764C +83F495C758D362BC72CE9D284EF0592E600F663B6B8379E79D26539354C057C3 +5D16611B66D66DAF788D827E969897445384627C63966DB27E0A814B984D0000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006AFB7F4C9DAF9E1A4E5F503B51B6591C60F963F66930723A8036F97491CE +5F31F975F9767D0482E5846F84BB85E58E8DF9774F6FF978F97958E45B436059 +63DA6518656D6698F97A694A6A236D0B7001716C75D2760D79B37A70F97B7F8A +F97C8944F97D8B9391C0967DF97E990A57045FA165BC6F01760079A68A9E99AD +9B5A9F6C510461B662916A8D81C6504358305F6671098A008AFA5B7C86164FFA +513C56B4594463A96DF95DAA696D51864E884F59F97FF980F9815982F9820000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9836B5F6C5DF98474B57916F9858207824583398F3F8F5DF9869918F987 +F988F9894EA6F98A57DF5F796613F98BF98C75AB7E798B6FF98D90069A5B56A5 +582759F85A1F5BB4F98E5EF6F98FF9906350633BF991693D6C876CBF6D8E6D93 +6DF56F14F99270DF71367159F99371C371D5F994784F786FF9957B757DE3F996 +7E2FF997884D8EDFF998F999F99A925BF99B9CF6F99CF99DF99E60856D85F99F +71B1F9A0F9A195B153ADF9A2F9A3F9A467D3F9A5708E71307430827682D20000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9A695BB9AE59E7D66C4F9A771C18449F9A8F9A9584BF9AAF9AB5DB85F71 +F9AC6620668E697969AE6C386CF36E366F416FDA701B702F715071DF7370F9AD +745BF9AE74D476C87A4E7E93F9AFF9B082F18A608FCEF9B19348F9B29719F9B3 +F9B44E42502AF9B5520853E166F36C6D6FCA730A777F7A6282AE85DD8602F9B6 +88D48A638B7D8C6BF9B792B3F9B8971398104E944F0D4FC950B25348543E5433 +55DA586258BA59675A1B5BE4609FF9B961CA655665FF666468A76C5A6FB30000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000070CF71AC73527B7D87088AA49C329F075C4B6C8373447389923A6EAB7465 +761F7A697E15860A514058C564C174EE751576707FC1909596CD99546E2674E6 +7AA97AAA81E586D987788A1B5A495B8C5B9B68A169006D6373A97413742C7897 +7DE97FEB81188155839E8C4C962E981166F05F8065FA67896C6A738B502D5A03 +6B6A77EE59165D6C5DCD7325754FF9BAF9BB50E551F9582F592D599659DA5BE5 +F9BCF9BD5DA262D76416649364FEF9BE66DCF9BF6A48F9C071FF7464F9C10000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A887AAF7E477E5E80008170F9C287EF89818B209059F9C390809952617E +6B326D747E1F89258FB14FD150AD519752C757C758895BB95EB8614269956D8C +6E676EB6719474627528752C8073833884C98E0A939493DEF9C44E8E4F515076 +512A53C853CB53F35B875BD35C24611A618265F4725B7397744076C279507991 +79B97D067FBD828B85D5865E8FC2904790F591EA968596E896E952D65F6765ED +6631682F715C7A3690C1980A4E91F9C56A526B9E6F907189801882B885530000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000904B969596F297FB851A9B314E90718A96C45143539F54E15713571257A3 +5A9B5AC45BC36028613F63F46C856D396E726E907230733F745782D188818F45 +9060F9C6966298589D1B67088D8A925E4F4D504950DE5371570D59D45A015C09 +617066906E2D7232744B7DEF80C3840E8466853F875F885B89188B02905597CB +9B4F4E734F915112516AF9C7552F55A95B7A5BA55E7C5E7D5EBE60A060DF6108 +610963C465386709F9C867D467DAF9C9696169626CB96D27F9CA6E38F9CB0000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FE173367337F9CC745C7531F9CD7652F9CEF9CF7DAD81FE843888D58A98 +8ADB8AED8E308E42904A903E907A914991C9936EF9D0F9D15809F9D26BD38089 +80B2F9D3F9D45141596B5C39F9D5F9D66F6473A780E48D07F9D79217958FF9D8 +F9D9F9DAF9DB807F620E701C7D68878DF9DC57A0606961476BB78ABE928096B1 +4E59541F6DEB852D967097F398EE63D66CE3909151DD61C981BA9DF94F9D501A +51005B9C610F61FF64EC69056BC5759177E37FA98264858F87FB88638ABC0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B7091AB4E8C4EE54F0AF9DDF9DE593759E8F9DF5DF25F1B5F5B6021F9E0 +F9E1F9E2F9E3723E73E5F9E4757075CDF9E579FBF9E6800C8033808482E18351 +F9E7F9E88CBD8CB39087F9E9F9EA98F4990CF9EBF9EC703776CA7FCA7FCC7FFC +8B1A4EBA4EC152035370F9ED54BD56E059FB5BC55F155FCD6E6EF9EEF9EF7D6A +8335F9F086938A8DF9F1976D9777F9F2F9F34E004F5A4F7E58F965E56EA29038 +93B099B94EFB58EC598A59D96041F9F4F9F57A14F9F6834F8CC3516553440000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9F7F9F8F9F94ECD52695B5582BF4ED4523A54A859C959FF5B505B575B5C +606361486ECB7099716E738674F775B578C17D2B800581EA8328851785C98AEE +8CC796CC4F5C52FA56BC65AB6628707C70B872357DBD828D914C96C09D725B71 +68E76B986F7A76DE5C9166AB6F5B7BB47C2A883696DC4E084ED75320583458BB +58EF596C5C075E335E845F35638C66B267566A1F6AA36B0C6F3F7246F9FA7350 +748B7AE07CA7817881DF81E7838A846C8523859485CF88DD8D1391AC95770000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000969C518D54C957285BB0624D6750683D68936E3D6ED3707D7E2188C18CA1 +8F099F4B9F4E722D7B8F8ACD931A4F474F4E5132548059D05E9562B56775696E +6A176CAE6E1A72D9732A75BD7BB87D3582E783F9845785F78A5B8CAF8E879019 +90B896CE9F5F52E3540A5AE15BC2645865756EF472C4F9FB76847A4D7B1B7C4D +7E3E7FDF837B8B2B8CCA8D648DE18E5F8FEA8FF9906993D14F434F7A50B35168 +5178524D526A5861587C59605C085C555EDB609B623068136BBF6C086FB10000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000714E742075307538755176727B4C7B8B7BAD7BC67E8F8A6E8F3E8F49923F +92939322942B96FB985A986B991E5207622A62986D5976647ACA7BC07D765360 +5CBE5E976F3870B97C9897119B8E9EDE63A5647A87764E014E954EAD505C5075 +544859C35B9A5E405EAD5EF75F8160C5633A653F657465CC6676667867FE6968 +6A896B636C406DC06DE86E1F6E5E701E70A1738E73FD753A775B7887798E7A0B +7A7D7CBE7D8E82478A028AEA8C9E912D914A91D8926692CC9320970697560000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000975C98029F0E52365291557C58245E1D5F1F608C63D068AF6FDF796D7B2C +81CD85BA88FD8AF88E44918D9664969B973D984C9F4A4FCE514651CB52A95632 +5F145F6B63AA64CD65E9664166FA66F9671D689D68D769FD6F156F6E716771E5 +722A74AA773A7956795A79DF7A207A957C977CDF7D447E70808785FB86A48A54 +8ABF8D998E819020906D91E3963B96D59CE565CF7C078DB393C35B585C0A5352 +62D9731D50275B975F9E60B0616B68D56DD9742E7A2E7D427D9C7E31816B0000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008E2A8E35937E94184F5057505DE65EA7632B7F6A4E3B4F4F4F8F505A59DD +80C4546A546855FE594F5B995DDE5EDA665D673167F1682A6CE86D326E4A6F8D +70B773E075877C4C7D027D2C7DA2821F86DB8A3B8A858D708E8A8F339031914E +9152944499D07AF97CA54FCA510151C657C85BEF5CFB66596A3D6D5A6E966FEC +710C756F7AE388229021907596CB99FF83014E2D4EF2884691CD537D6ADB696B +6C41847A589E618E66FE62EF70DD751175C77E5284B88B498D084E4B53EA0000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054AB573057405FD763016307646F652F65E8667A679D67B36B626C606C9A +6F2C77E57825794979577D1980A2810281F3829D82B787188A8CF9FC8D048DBE +907276F47A197A377E548077550755D45875632F64226649664B686D699B6B84 +6D256EB173CD746874A1755B75B976E1771E778B79E67E097E1D81FB852F8897 +8A3A8CD18EEB8FB0903293AD9663967397074F8453F159EA5AC95E19684E74C6 +75BE79E97A9281A386ED8CEA8DCC8FED659F6715F9FD57F76F577DDD8F2F0000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093F696C65FB561F26F844E144F98501F53C955DF5D6F5DEE6B216B6478CB +7B9AF9FE8E498ECA906E6349643E77407A84932F947F9F6A64B06FAF71E674A8 +74DA7AC47C127E827CB27E988B9A8D0A947D9910994C52395BDF64E6672D7D2E +50ED53C358796158615961FA65AC7AD98B928B9650095021527555315A3C5EE0 +5F706134655E660C663666A269CD6EC46F32731676217A938139825983D684BC +50B557F05BC05BE85F6963A178267DB583DC852191C791F5518A67F57B560000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008CAC51C459BB60BD8655501CF9FF52545C3A617D621A62D364F265A56ECC +7620810A8E60965F96BB4EDF5343559859295DDD64C56CC96DFA73947A7F821B +85A68CE48E10907791E795E1962197C651F854F255865FB964A46F887DB48F1F +8F4D943550C95C166CBE6DFB751B77BB7C3D7C648A798AC2581E59BE5E166377 +7252758A776B8ADC8CBC8F125EF366746DF8807D83C18ACB97519BD6FA005243 +66FF6D956EEF7DE08AE6902E905E9AD4521D527F54E86194628462DB68A20000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006912695A6A3570927126785D7901790E79D27A0D8096827882D583498549 +8C828D859162918B91AE4FC356D171ED77D7870089F85BF85FD6675190A853E2 +585A5BF560A4618164607E3D80708525928364AE50AC5D146700589C62BD63A8 +690E69786A1E6E6B76BA79CB82BB84298ACF8DA88FFD9112914B919C93109318 +939A96DB9A369C0D4E11755C795D7AFA7B517BC97E2E84C48E598E748EF89010 +6625693F744351FA672E9EDC51455FE06C9687F2885D887760B481B584030000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008D0553D6543956345A365C31708A7FE0805A810681ED8DA391899A5F9DF2 +50744EC453A060FB6E2C5C644F88502455E45CD95E5F606568946CBB6DC471BE +75D475F476617A1A7A497DC77DFB7F6E81F486A98F1C96C999B39F52524752C5 +98ED89AA4E0367D26F064FB55BE267956C886D78741B782791DD937C87C479E4 +7A315FEB4ED654A4553E58AE59A560F0625362D6673669558235964099B199DD +502C53535544577CFA016258FA0264E2666B67DD6FC16FEF742274388A170000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094385451560657665F48619A6B4E705870AD7DBB8A95596A812B63A27708 +803D8CAA5854642D69BB5B955E116E6FFA038569514C53F0592A6020614B6B86 +6C706CF07B1E80CE82D48DC690B098B1FA0464C76FA464916504514E5410571F +8A0E615F6876FA0575DB7B527D71901A580669CC817F892A9000983950785957 +59AC6295900F9B2A615D727995D657615A465DF4628A64AD64FA67776CE26D3E +722C743678347F7782AD8DDB981752245742677F724874E38CA98FA692110000 +F8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000962A516B53ED634C4F695504609665576C9B6D7F724C72FD7A1789878C9D +5F6D6F8E70F981A8610E4FBF504F624172477BC77DE87FE9904D97AD9A198CB6 +576A5E7367B0840D8A5554205B165E635EE25F0A658380BA853D9589965B4F48 +5305530D530F548654FA57035E036016629B62B16355FA066CE16D6675B17832 +80DE812F82DE846184B2888D8912900B92EA98FD9B915E4566B466DD70117206 +FA074FF5527D5F6A615367536A196F0274E2796888688C7998C798C49A430000 +F9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054C17A1F69538AF78C4A98A899AE5F7C62AB75B276AE88AB907F96425339 +5F3C5FC56CCC73CC7562758B7B4682FE999D4E4F903C4E0B4F5553A6590F5EC8 +66306CB37455837787668CC09050971E9C1558D15B7886508B149DB45BD26068 +608D65F16C576F226FA3701A7F557FF095919592965097D352728F4451FD542B +54B85563558A6ABB6DB57DD88266929C96779E79540854C876D286E495A495D4 +965C4EA24F0959EE5AE65DF760526297676D68416C866E2F7F38809B822A0000 +FA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FA08FA0998054EA5505554B35793595A5B695BB361C869776D77702387F9 +89E38A728AE7908299ED9AB852BE683850165E78674F8347884C4EAB541156AE +73E6911597FF9909995799995653589F865B8A3161B26AF6737B8ED26B4796AA +9A57595572008D6B97694FD45CF45F2661F8665B6CEB70AB738473B973FE7729 +774D7D437D627E2382378852FA0A8CE29249986F5B517A74884098015ACC4FE0 +5354593E5CFD633E6D7972F98105810783A292CF98304EA851445211578B0000 +FB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F626CC26ECE7005705070AF719273E97469834A87A28861900890A293A3 +99A8516E5F5760E0616766B385598E4A91AF978B4E4E4E92547C58D558FA597D +5CB55F2762366248660A66676BEB6D696DCF6E566EF86F946FE06FE9705D72D0 +7425745A74E07693795C7CCA7E1E80E182A6846B84BF864E865F87748B778C6A +93AC9800986560D1621691775A5A660F6DF76E3E743F9B425FFD60DA7B0F54C4 +5F186C5E6CD36D2A70D87D0586798A0C9D3B5316548C5B056A3A706B75750000 +FC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000798D79BE82B183EF8A718B418CA89774FA0B64F4652B78BA78BB7A6B4E38 +559A59505BA65E7B60A363DB6B61666568536E19716574B07D0890849A699C25 +6D3B6ED1733E8C4195CA51F05E4C5FA8604D60F66130614C6643664469A56CC1 +6E5F6EC96F62714C749C76877BC17C27835287579051968D9EC3532F56DE5EFB +5F8A6062609461F7666667036A9C6DEE6FAE7070736A7E6A81BE833486D48AA8 +8CC4528373725B966A6B940454EE56865B5D6548658566C9689F6D8D6DC60000 +FD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000723B80B491759A4D4FAF5019539A540E543C558955C55E3F5F8C673D7166 +73DD900552DB52F3586458CE7104718F71FB85B08A13668885A855A76684714A +8431534955996BC15F595FBD63EE668971478AF18F1D9EBE4F11643A70CB7566 +866760648B4E9DF8514751F653086D3680F89ED166156B23709875D554035C79 +7D078A166B206B3D6B46543860706D3D7FD5820850D651DE559C566B56CD59EC +5B095E0C619961986231665E66E6719971B971BA72A779A77A007FB28A700000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb12345.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb12345.enc new file mode 100644 index 00000000..3f3f4d25 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb12345.enc @@ -0,0 +1,1414 @@ +# Encoding file: gb12345, double-byte +D +233F 0 83 +21 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300230FB02C902C700A8300330052015FF5E2225202620182019 +201C201D3014301530083009300A300B300C300D300E300F3016301730103011 +00B100D700F72236222722282211220F222A222922082237221A22A522252220 +23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 +22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 +25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +22 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000024882489248A248B248C248D248E248F2490249124922493249424952496 +249724982499249A249B247424752476247724782479247A247B247C247D247E +247F248024812482248324842485248624872460246124622463246424652466 +2467246824690000000032203221322232233224322532263227322832290000 +00002160216121622163216421652166216721682169216A216B000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +23 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +24 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +25 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +27 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +28 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 +00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000 +0000000000000000000031053106310731083109310A310B310C310D310E310F +3110311131123113311431153116311731183119311A311B311C311D311E311F +3120312131223123312431253126312731283129000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +29 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000002500250125022503250425052506250725082509250A250B +250C250D250E250F2510251125122513251425152516251725182519251A251B +251C251D251E251F2520252125222523252425252526252725282529252A252B +252C252D252E252F2530253125322533253425352536253725382539253A253B +253C253D253E253F2540254125422543254425452546254725482549254A254B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000554A963F57C3632854CE550954C0769A764C85F977EE827E7919611B9698 +978D6C285B894FFA630966975CB880FA68489AAF660276CE51F9655671AC7FF1 +895650B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB +9776628A801958E997387F777238767D67CF767E64FA4F70655762DC7A176591 +73ED642C6273822C9812677F7248626E62CC4F3474E3534A8FA67D4690A65E6B +6886699C81807D8168D278C5868C938A508D8B1782DE80DE5305891252650000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +31 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000858496F94FDD582198FD5BF662B1583166B48C799B917206676F789160B2 +535153178F2980CC8C9D92C7500D72FD5099618A711988AB595482EF672C7B28 +5D297DB3752D6CF58E668FF8903C9F3B6BD491197B465F7C78A784D6853D7562 +65836BD65E635E8775F99589655D5F0A5FC58F9F58C181C2907F965B97AD908A +7DE88CB662414FBF8B8A535E8FA88FAF8FAE904D6A195F6A819888689C49618B +522B765F5F6C658C70156FF18CD364EF517551B067C44E1979C9990570B30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +32 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075C55E7673BB83E064AD64A592626CE2535A52C3640F92517B944F2F5E1B +82368116818A6E246CCA99C16355535C54FA88DC57E04E0D5E036B657C3F90E8 +601664E6731C88C16750624D8CA1776C8E2991C75F6983DC8521991053C38836 +6B98615A615871E684BC825950096EC485CF64CD7CD969FD66F9834953A07B56 +5074518C6E2C5C648E6D63D253C9832C833667E578B4643D5BDF5C945DEE8A6B +62C667F48C7A6519647B87EC995E8B927E8F93DF752395E1986B660C73160000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +33 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000583456175E389577511F81785EE0655E66A2553150218D8562849214671D +56326F6E5DE2543570928ECA626F64A463A35FB96F8890F481E38FB058756668 +5FF16C8996738D81896F64917A3157CE6A59621054484E587A0B61F26F848AA0 +627F901E9A0179E4540375F4630153196C6090725F1B99B3803B9F524F885C3A +8D647FC565A571BE5145885D87F25D075BF562BD916C75878E8A7A2061017C4C +4EC77DA27785919C81ED521D51FA6A7153A88E8792E496DB6EC19664695A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +34 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000790E513277D7641089F8865563E35DDD7A7F693D50B3823955984E327621 +7A975E625E8A95D652755439708A6376931857826625693F918755076DF37D14 +882262337DBD75B5832878C196CC8FAD614874F78A5E6B64523A8CDC6B218070 +847156F153065F9E53E251D17C97918B7C074FC38EA57BE17AC464675D1450AC +810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B932F642D9054 +7B5476296253592754466B7950A362345E366B864EE38CB8888B5F85902E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +35 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006020803D64D44E3955AE913264A381BD65E66C2E4F46619A6DE18A955F48 +86CB757664CB9EE885696A94520064178E4850125CF679B15C0E52307A3B60BC +905376D75FB75F9776848E6C71C8767B7B4977AA51F3912758244F4E6EF48FEA +65757B1B72C46ECC7FDF5AE162B55E95573084827B2C5E1D5F1F905E7DE0985B +63826EC778989EDE5178975B588A96FB4F4375385E9760E659606FB16BBF7889 +53FC96D551CB52016389540A91E38ABF8DCC7239789F87768FED8ADC758A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +36 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E0176EF53EE91D898029F0E93205B9A8A024E22677151AC846361C252D5 +68DF4F97606B51CD6D1E515C62969B2596618C46901775D890FD77636BD272A2 +73688B80583577798CED675C934D809A5EA66E2159927AEF77ED935B6BB565B7 +7DDE58065151968A5C0D58A956788E726566981356E4920D76FE9041638754C6 +591A596A579B8EB267358DFA8235524160F058AE86FE5CE89D5D4FC4984D8A1B +5A2560E15384627C904F910299136069800C51528033723E990C6D314E8C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +37 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008CB3767C7F707B4F4F104E4F95A56CD573D085E95E06756A7FFB6A0A792C +91E97E4151E1716953CD8FD47BC48CA972AF98EF6CDB574A82B365B980AA623F +963259A84EFF8A2A7D21653E83F2975E556198DB80A5532A8AB9542080BA5EE2 +6CB88CBB82AC915A54296C1B52067D1B58B3711A6C7E7C89596E4EFD5FFF61A4 +7CDE8C505C01695387025CF092D298A8760B70FD902299AE7E2B8AF759499CF3 +4F5B5426592B6577819A5B75627662C28F3B5E456C1F7B264F0F4FD8670D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +38 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D6E6DAA798F88B15F17752B64AB8F144FEF91DC65A7812F81515E9C8150 +8D74526F89868CE65FA950854ED8961C723681798CA05BCC8A0396445A667E1B +54905676560E8A7265396982922384CB6E895E797518674667D17AFF809D8D95 +611F79C665628D1B5CA1525B92FC7F38809B7DB15D176E2F67607BD9768B9AD8 +818F7F947CD5641E93AC7A3F544A54E56B4C64F162089D3F80F3759952729769 +845B683C86E495A39694927B500B54047D6668398DDF801566F45E9A7FB90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +39 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000057C2803F68975DE5653B529F606D9F944F9B8EAC516C5BAB5F13978F6C5E +62F18CA25171920E52FE6E9D82DF72D757A269CB8CFC591F8F9C83C754957B8D +4F306CBD5B6459D19F1353E488319AA88C3780A16545986756FA96C7522E74DC +526E5BE1630289024E5662D0602A68FA95DC5B9851A089C07BA199287F506163 +704C8CAB51495EE3901B7470898F572D78456B789F9C95A88ECC9B3C8A6D7678 +68426AC38DEA8CB4528A8F256EDA68CD934B90ED570B679C88F9904E54C80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009AB85B696D776C264EA55BB399ED916361A890AF97D3542B6DB55BD251FD +558A7F557FF064BC634D65F161BE608D710A6C576F22592F676D822A58D5568E +8C6A6BEB90DD597D8017865F6D695475559D837783CF683879BE548C4F555408 +76D28C8995A16CB36DB88D6B89109DB48CC0563F9ED175D55F8872E0606854FC +4EA86A2A886160528F5F54C470D886799D3B6D2A5B8F5F187D0555894FAF7334 +543C539A50195F8C547C4E4E5FFD745A58FA846B80E1877472D07CCA6E560000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F27864E552C8B774E926EEC623782B1562983EF733E6ED1756B52835316 +8A7169D05F8A61F76DEE58DE6B6174B0685390847DE963DB60A3559A76138C62 +71656E195BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C +604D8B0A707063EE8F1D5FBD606286D456DE6BC160946167534960E066668CC4 +7A62670371F4532F8AF18AA87E6A8477660F5A5A9B426E3E6DF78C416D3B4F19 +706B7372621660D1970D8CA8798D64CA573E57FA6A5F75787A3D7A4D7B950000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000808C99518FF96FC08B4F9DC459EC7E3E7DDD5409697568D88F2F7C4D96C6 +53CA602575BE6C7253735AC97D1A64E05E7E810A5DF1858A628051805B634F0E +796D529160B86FDF5BC45BC28A088A1865E25FCC969B59937E7C7D00560967B7 +593E4F735BB652A083A298308CC87532924050477A3C50F967B699D55AC16BB2 +76E358055C167B8B9593714E517C80A9827159787DD87E6D6AA267EC78B19E7C +63C064BF7C215109526A51CF85A66ABB94528E108CE4898B93757BAD4EF60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000050658266528D991E6F386FFA6F975EFA50F559DC5C076F3F6C5F75868523 +69F3596C8B1B532091AC964D854969127901712681A04EA490CA6F869A555B0C +56BC652A927877EF50E5811A72E189D299037E737D5E527F655991758F4E8F03 +53EB7A9663ED63A5768679F88857968E622A52AB7BC0685467706377776B7AED +6F547D5089E359D0621285C982A5754C501F4ECB75A58AA15C4A5DFE7B4B65A4 +91D14ECA6D25895F7DCA932650C58B3990329773664979818FD171FC6D780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000076E152C1834651628396775B66769BE84EAC9A5A7CBE7CB37D934E958B66 +666F9838975C5883656C93E15F9175D997567ADF7AF651C870AF7A9863EA7A76 +7CFE739697ED4E4570784E5D915253A96551820A81FC8205548E5C31759A97A0 +62D872D975BD5C4599D283CA5C40548077E982096CAE805A62D264DA5DE85177 +8DDD8E1E92F84FF153E561FC70AC528763509D515A1F5026773753777D796485 +652B628963985014723589BA51B38A237D76574783CC921E8ECD541B5CFB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004FCA7AE36D5A90E199FF55805496536154AF958B63E9697751F16168520A +582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 +577782DB67EF68F578D5984679D16BBB54B353EF6E34514B523B5BA28AB280AF +554358BE61C75751542D7A7A60505B5463A7647353E362635BC767AF54ED7A9F +82E691775EAB89328A8757AE630E8DE880EF584A7B7751085FEB5BEC6B3E5321 +7B5072C268467926773666E051B5866776D45DCB7ABA8475594E9B4150800000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +40 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000994B61276F7057646606634656F062EC64F45ED395CA578362C95587881F +81D88FA35566840A4F868CF485CD5A6A6B0465147C4395CC862D703E8B95652C +89BD61F67E9C721B6FEB7405699472FC5ECA90CE67176D6A648852DE72628001 +4F6C59E5916A70D96F8752D26A0296F79433857E78CA7D2F512158D864C2808B +985E6CEA68F1695E51B7539868A872819ECE7C6C72F896E270557406674E88CF +9BC979AE83898354540F68179E9753B252F5792B6B77522950884F8B4FD00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +41 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075E27ACB7C92701D96B8529B748354E95006806F84EE9023942E5EC96190 +6F237C3E658281C993C8620071497DF47CE751C968817CB1826F51698F1B91CF +667E4EAE8AD264A9804A50DA764271CE5BE5907C6F664E86648294105ED66599 +521788C270C852A373757433679778F7971681E891309C576DCB51DB8CC3541D +62CE73B283F196F69F6192344F367F9A51CC974896755DBA981853E64EE46E9C +740969B4786B993E7559528976246D4167F3516D9F8D807E56A87C607ABF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +42 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000968658DF650F96B46A135A41645F7C0D6F0F964B860676E798715EEC7210 +64C46EF7865C9B6F9E93788C97328DEF8CC29E7F6F5E798493329678622E9A62 +541592C14FA365C55C655C627E37616E6C2F5F8B73876FFE7DD15DD265235B7F +706453754E8263A0756563848F2A502B4F966DEA7DB88AD6863F87BA7F85908F +947C7C6E9A3E88F8843D6D1B99F17D615ABD9EBB746A78BC879E99AC99E1561B +55CE57CB8CB79EA58CE390818109779E9945883B6EFF851366FC61626F2B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +43 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B3E8292832B76F26C135FD983BD732B830593286BDB77DB925A536F8302 +51925E3D8C8C8CBF9EBD73AB679A68859176970971646CA177095A9293826BCF +7F8E66275BD059B95A9A958060B65011840C84996AAC76DF9333731B59225B5F +772F919A97617CDC8FF78B0E5F4C7C7379D889936CCC871C5BC65E4268C97720 +7DBF5195514D52C95A297DEC976282D763CF778485D079D26E3A5EDF59998511 +6EC56C1162BF76BF654F61AB95A9660E879F9CF49298540D547D8B2C64780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE +964C8B00725F67D062C77261755D59C66BCD589366AE5E5552DF6155672876EE +776672677A4662FF54EA5450920990A35A1C7D0D6C164E435976801059485357 +753796E356CA6493816660F19B276DD65462991251855AE980FD59AE9713502A +6CE55C3C64EC4F60533F81A990066EBA852B62C85E7478BE6506637B5FF55A18 +91C09CE55C3F634F80765B7D5699947793B36D8560A86AB8737051DD5BE70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +45 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064F06FD8725B626D92157D1081BF6FC38FB25F04597452AA601259736696 +86507627632A61E67CEF8AFE54E66B509DD76BC685D5561450766F1A556A8DB4 +722C5E156015743662CD6392724C5F986E436D3E65006F5876E478D076FC7554 +522453DB4E539F9065C1802A80D6629B5486522870AE888D8DD16CE1547880DA +57F988F48CE0966A914D4F696C9B567476C6783062A870F96F8E5F6D84EC68DA +787C7BF781A8670B9D6C636778B0576F78129739627962AB528874356BD70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +46 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A1998C46F02 +74E27968648777A562FC983B8CA754C180584E52576A860B840D5E73619174F6 +8A555C4F57616F5198175A4678349B448FEB7C95525664B292EA50D583868461 +83E984B257D46A385703666E6D668B5C66DD7011671F6B3A68F2621A59BB4E03 +51C46F0667D26C8F517668CB59476B6775665D0E81CD9F4A65D7794879419A0E +8D778C484E5E4F0155535951780C56686C238FC468C46C7D6CE38A1663900000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +47 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060706D3D727D626691FA925B534390777C3D4EDF8B194E7E9ED493229257 +524D6F5B90636DFA8B7458795D4C6B206B4969CD55C681547F8C58BB85945F3A +64366A47936C657260846A4B77A755AC50D15DE7979864AC7FF95CED4FCF7AC5 +520783044E14602F7ACA6B3D4FB589AA79E6743452E482B964D279BD5BE26C81 +97528F156C2B50BE537F6E0564CE66746C3060C598038ACB617674CA7AAE79CB +4E1890B174036C4256DA914B6CC58DA8534086C666F28EC05C489A456E200000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +48 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053D65A369F728DA353BB570898746B0A919B6CC9516875CA62F372AC5238 +52F87F3A7094763853749D7269B778BA96C088D97FA4713671C3518967D374E4 +58E4651856B78B93995264FE7E5E60F971B158EC4EC14EBA5FCD97CC4EFB8A8D +5203598A7D0962544ECD65E5620E833884C969AE878D71946EB65BB97D685197 +63C967D480898339881551125B7A59828FB14E736C5D516589258EDF962E854A +745E92ED958F6F6482E55F316492705185A9816E9C13585E8CFD4E0953C10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +49 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000050986563685155D355AA64149A3763835AC2745F82726F8068EE50E7838E +78026BBA52396C997D1750BB5565715E7BE966EC73CA82EB67495C715220717D +886B9583965D64C58D0D81B355846C5562477E55589250B755468CDE664C4E0A +5C1A88F368A2634E7A0D71D2828D52FA97F65C1154E890B57D3959628CD286C7 +820C63688D66651D5C0461FE6D89793E8A2D78377533547B4F388EAB6DF15A20 +7D33795E6C885BE95B38751A814E614E6EF28072751F7525727253477E690000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000770176DB526952DD80565E2B5931734565BD6FD58A695C388671534177F3 +62FE66424EC098DF87555BE68B5853F277E24F7F5C4E99DB59CB5F0F793A58EB +4E1667FF4E8B62ED8A93901D52E2662F55DC566C90694ED54F8D91CB98FE6C0F +5E0260435BA489968A666536624B99965B8858FD6388552E53D776267378852C +6A1E68B36B8A62928F3853D482126DD1758F66F88D165B70719F85AF669166D9 +7F7287009ECD9F205C6C88538FF06A39675F620D7AEA58855EB665786F310000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060555237800D6454887075295E25681362F4971C96D9723D8AB06C347761 +7A0E542E77AC9806821C8AAC78A96714720D65AF64955636601D79C153F87D72 +6B7B80865BFA55E356DB4F3A4F3C98FC5DF39B068073616B980C90015B8B8A1F +8AA6641C825864FB55FD860791654FD77D20901F7C9F50F358516EAF5BBF8A34 +80859178849C7B9796D6968B96A87D8F9AD3788E6B727A57904296A7795F5B6B +640D7B0B84D168AD55067E2E74637D2293966240584C4ED65B83597958540000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000737A64BB8E4B8E0F80CE82D462AC81FA6CF0915E592A614B6C70574D6524 +8CAA7671705858C76A8075F06F6D8B5A8AC757666BEF889278B363A2560670AD +6E6F5858642A580268E0819B55107CD650188EBA6DCC8D9F71D9638F6FE46ED4 +7E278404684390036DD896768A0E5957727985E49A3075BC8B0468AF52548E22 +92BB63D0984C8E44557C9AD466FF568F60D56D9552435C4959296DFB586B7530 +751C606C821481466311689D8FE2773A8DF38CBC94355E165EF3807D70F40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C92855F647AE5 +687663457B527D7175DB50776295982D900F51F879C37A8157165F9290145857 +5C60571F541051546E4D571863A8983D817F8715892A9000541E5C6F81C062D6 +625881319D15964099B199DD6A6259A562D3553E631654C786D97AAA5A0374E6 +896A6B6A59168C4C5F4E706373A998114E3870F75B8C7897633D665A769660CB +5B9B5A49842C81556C6A738B4EA167897DB25F8065FA671B5FD859845A010000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005DCD5FAE537197CB90556845570D552F60DF72326FF07DAD8466840E59D4 +504950DE5C3E7DEF672A851A5473754F80C355829B4F4F4D6E2D8B025C096170 +885B761F6E29868A6587805E7D0B543B7A697D0A554F55E17FC174EE64BE8778 +6E267AA9621165A1536763E16C835DEB55DA93A270CF6C618AA35C4B7121856A +68A7543E54346BCB6B664E9463425348821E4F0D4FAE5862620A972766647269 +52FF52D9609F8AA4661471996790897F785277FD6670563B5438932B72A70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8489725E2D +7FD25AB3559C92916D177CFB969962327D30778E87665323971E8F4466875CFD +4FE072F94E0B53A6590F56876380934151484ED99BAE7E9654B88CE2929C8237 +95916D8E5F265ACC986F96AA73FE737B7E23817A99217FA161B2967796507DAB +76F853A2947299997BB189446E5891097FD479658A7360F397FF4EAB98055DF7 +6A6150CF54118C61856D785D9704524A54EE56C292B76D885BB56DC666C90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C0F5B5D68218096562F7B11654869544E9B6B47874E978B5354633E643A +90AA659C81058AE75BEB68B0537887F961C86CC470098B1D5C5185AA82AF92C5 +6B238F9B65B05FFB5FC34FE191C1661F8165732960FA82085211578B5F6290A2 +884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E +673D55C592B979C088967D89589F620C9700865A561898085F908A3184C49157 +53D965ED5E8F755C60647D6E5A7F7DD27E8C8ED255A75BA361F865CB73840000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009078766C77297D629774859B5B787A7496EA884052DB718F5FAA65EC8A62 +5C0B99B45DE16B896C5B8A138A0A905C8FC558D362BC9D099D2854404E2B82BD +7259869C5D1688596DAF96C5555E4E9E8A1D710954BD95B970DF6DF99E7D56B4 +781487125CA95EF68A00985495BB708E6CBF594463A9773C884D6F1482775830 +71D553AD786F96C155015F6671305BB48AFA9A576B83592E9D2679E7694A63DA +4F6F760D7F8A6D0B967D6C274EF07662990A6A236F3E90808170599674760000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +52 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006447582F90657A918B2159DA54AC820085E5898180006930564E8036723A +91CE51B64E5F98016396696D844966F3814B591C6DB24E0058F991AB63D692A5 +4F9D4F0A886398245937907A79FB510080F075916C825B9C59E85F5D690587FB +501A5DF24E5977E34EE585DD6291661390915C7951045F7981C69038808475AB +4EA688D4610F6BC561B67FA976CA6EA28A638B708ABC8B6F5F027FFC7FCC7E79 +8335852D56E06BB797F3967059FB541F92806DEB5BC598F25C395F1596B10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000537082F16AFB5B309DF961C97E93746987A271DF719288058FCE8D0F76C8 +5F717A4E786C662055B264C150AD81C376705EB896CD8E3486F9548F6CF36D8C +6C38607F52C775285E7D512A60A061825C24753190F5923E73366CB96E389149 +670953CB53F34F5191C98A9853C85E7C8FC26DE44E8E76C26986865E611A8F3F +99184FDE903E9B5A61096E1D6F0196854E885A3196E882075DBC79B95B878A9E +7FBD738957DF828B9B315401904755BB5CEA5FA161086B32734480B28B7D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D745BD388D598108C6B99AD9D1B6DF551A4514357A38881539F63F48F45 +571254E15713733F6E907DE3906082D198586028966266F07D048D8A8E8D9470 +5CB37CA4670860A695B2801896F29116530096955141904B85F49196668897F5 +5B55531D783896DC683D54C9707E5BB08F09518D572854B1652266AB8D0A8D1C +81DF846C906D7CDF947F85FB68D765E96FA186A48E81566A902076827AC871E5 +8CAC64C752476FA48CCA600E589E618E66FE8D08624E55B36E23672D8ECB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +55 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000935895987728680569A8548B4E4D70B88A5064589F4B5B857A8450B55BE8 +77BB6C088A797C986CBE76DE65AC8F3E5D845C55863868E7536062307AD96E5B +7DBB6A1F7AE05F706F335F35638C6F3267564E085E338CEC4ED781397634969C +62DB662D627E6CBC8D9971677F695146808753EC906E629854F287C48F4D8005 +937A851790196D5973CD659F771F7504782781FB8C9E91DD5075679575B98A3A +9707632F93AE966384B86399775C5F817319722D6014657462EF6B63653F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E407665912D8B49829D679D652F5431871877E580A281026C414E4B7E54 +807776F4690D6B9657F7503C4F84574063076B628DBE887965E87D195FD7646F +64F281F381F47F6E5E5F5CD95236667A79E97A1A8CEA709975D46EEF6CBB7A92 +4E2D76C55FE0941888777D427A2E816B91CD4EF28846821F54685DDE6D328B05 +7CA58EF880985E1A549276BA5B99665D9A5F73E0682A86DB6731732A8AF88A85 +90107AF971ED716E62C477DA56D14E3B845767F152A986C08CAF94447BC90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F4F6CE8795D99D06293722A62FD5C0878DA8F4964B08CFA7BC66A01838A +88DD599D649E58EF72C0690E93108FFD8D05589C7DB48AC46E96634962D95353 +684C74228301914C55447740707C6FC1517954A88CC759FF6ECB6DC45B5C7D2B +4ED47C7D6ED35B5081EA6F2C5B579B0368D58E2A5B977D9C7E3D7E3191128D70 +594F63CD79DF8DB3535265CF79568A5B963B7D44947D7E825634918967007F6A +5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +58 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F +53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C +4E694E9382885B5B55C7560F4EC45399539D53B453A553AE97688D0B531A53F5 +532D5331533E8CFE5366536352025208520E52445233528C5274524C525E5261 +525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB +4EDE50B44EF34F224F644EF5500050964F094F474F5E4F6765384F5A4F5D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B51154F7C5102 +4F945114513C51374FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F +502E502D4FFE501C500C5025502850E8504350555048504E506C50C2513B5110 +513A50BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F5850C94FCE9FA0 +6C467CF4516E5DFD9ECC999856C5591452F9530D8A0753109CEC591951554EA0 +51564EB3886E88A4893B81E088D279805B3488037FB851AB51B151BD51BC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051C7519651A251A58A018A108A0C8A158B338A4E8A258A418A368A468A54 +8A588A528A868A848A7F8A708A7C8A758A6C8A6E8ACD8AE28A618A9A8AA58A91 +8A928ACF8AD18AC98ADB8AD78AC28AB68AF68AEB8B148B018AE48AED8AFC8AF3 +8AE68AEE8ADE8B288B9C8B168B1A8B108B2B8B2D8B568B598B4E8B9E8B6B8B96 +5369537A961D962296219631962A963D963C964296589654965F9689966C9672 +96749688968D969796B09097909B913A9099911490A190B490B390B691340000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090B890B090DF90C590BE913690C490C79106914890E290DC90D790DB90EB +90EF90FE91049122911E91239131912F91399143914682BB595052F152AC52AD +52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DF0 +574C580A57A1587E58BC58C558D15729572C572A573358D9572E572F58E2573B +5742576958E0576B58DA577C577B5768576D5776577357E157A4578C584F57CF +57A75816579357A057D55852581D586457D257B857F457EF57F857E457DD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 +99A89F1961FF8279827D827F828F828A82A88284828E8291858C829982AB8553 +82BE82B085F682CA82E3829882B782AE83A7840784EF82A982B482A182AA829F +82C482E782A482E1830982F782E48622830782DC82F482D282D8830C82FB82D3 +8526831A8306584B716282E082D5831C8351855884FD83088392833C83348331 +839B854E832F834F8347834385888340831785BA832D833A833372966ECE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008541831B85CE855284C08452846483B083788494843583A083AA8393839C +8385837C859F83A9837D8555837B8398839E83A89DAF849383C1840183E583D8 +58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 +83EA83C583C07E0883F083E1845C8451845A8459847385468488847A85628478 +843C844684698476851E848E8431846D84C184CD84D09A4084BD84D384CA84BF +84BA863A84A184B984B4849793A38577850C750D853884F0861E851F85FA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008556853B84FF84FC8559854885688564855E857A77A285438604857B85A4 +85A88587858F857985EA859C858585B985B785B0861A85C185DC85FF86278605 +86298616863C5EFE5F08593C596980375955595A5958530F5C225C255C2C5C37 +624C636B647662BB62CA62DA62D762EE649F62F66339634B634363AD63F66371 +637A638E6451636D63AC638A636963AE645C63F263F863E064B363C463DE63CE +645263C663BE65046441640B641B6420640C64266421645E6516646D64960000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647A64F764FC6499651B64C064D064D764E464E265096525652E5F0B5FD2 +75195F11535F53F1563053E953E853FB541254165406544B563856C8545456A6 +54435421550454BC5423543254825494547754715464549A5680548454765466 +565D54D054AD54C254B4566054A754A6563555F6547254A3566654BB54BF54CC +567254DA568C54A954AA54A4566554CF54DE561C54E7562E54FD551454F355E9 +5523550F55115527552A5616558F55B5554956C055415555553F5550553C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005537555655755576557755335530555C558B55D2558355B155B955885581 +559F557E55D65591557B55DF560D56B35594559955EA55F755C9561F55D156C1 +55EC55D455E655DD55C455EF55E555F2566F55CC55CD55E855F555E48F61561E +5608560C560156B6562355FE56005627562D565856395657562C564D56625659 +5695564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 +570756EB56F956FF5704570A5709571C5E435E195E145E115E6C5E585E570000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905D875C885CF45C995C91 +5D505C9C5CB55CA25D2C5CAC5CAB5CB15CA35CC15CB75DA75CD25DA05CCB5D22 +5D975D0D5D275D265D2E5D245D1E5D065D1B5DB85D3E5D345D3D5D6C5D5B5D6F +5D815D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DD45F735F775F825F87 +5F89540E5FA05F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B473777341 +72C372C172CE72CD72D272E8736A72E9733B72F472F7730172F3736B72FA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072FB731773137380730A731E731D737C732273397325732C733873317350 +734D73577360736C736F737E821B592598E75924590298E0993398E9993C98EA +98EB98ED98F4990999114F59991B9937993F994399489949994A994C99625E80 +5EE15E8B5E965EA55EA05EB95EB55EBE5EB38CE15ED25ED15EDB5EE85EEA81BA +5FC45FC95FD661FA61AE5FEE616A5FE15FE4613E60B561345FEA5FED5FF86019 +60356026601B600F600D6029602B600A61CC6021615F61E860FB613760420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000606A60F26096609A6173609D60836092608C609B611C60BB60B160DD60D8 +60C660DA60B4612061926115612360F46100610E612B614A617561AC619461A7 +61B761D461F55FDD96B39582958695C8958E9594958C95E595AD95AB9B2E95AC +95BE95B69B2995BF95BD95BC95C395CB95D495D095D595DE4E2C723F62156C35 +6C546C5C6C4A70436C856C906C946C8C6C686C696C746C766C866F596CD06CD4 +6CAD702770186CF16CD76CB26CE06CD66FFC6CEB6CEE6CB16CD36CEF6D870000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D396D276D0C6D796E5E6D076D046D196D0E6D2B6FAE6D2E6D356D1A700F +6EF86F6F6D336D916D6F6DF66F7F6D5E6D936D946D5C6D606D7C6D636E1A6DC7 +6DC56DDE70066DBF6DE06FA06DE66DDD6DD9700B6DAB6E0C6DAE6E2B6E6E6E4E +6E6B6EB26E5F6E866E536E546E326E256E4470676EB16E9870446F2D70056EA5 +6EA76EBD6EBB6EB76F776EB46ECF6E8F6EC26E9F6F627020701F6F246F156EF9 +6F2F6F3670326F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A70280000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 +705D705E5B805B845B955B935BA55BB8752F9A2B64345BE45BEE89305BF08E47 +8B078FB68FD38FD58FE58FEE8FE490878FE690158FE890059004900B90909011 +900D9016902190359036902D902F9044905190529050906890589062905B66B9 +9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 +5C687FBC5F335F295F2D82745F3C9B3B5C6E59815983598D5AF55AD759A30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000599759CA5B00599E59A459D259B259AF59D759BE5A6D5B0859DD5B4C59E3 +59D859F95A0C5A095AA75AFB5A115A235A135A405A675A4A5A555A3C5A625B0B +80EC5AAA5A9B5A775A7A5ABE5AEB5AB25B215B2A5AB85AE05AE35B195AD65AE6 +5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 +99D499DF99D99A369A5B99D199D89A4D9A4A99E29A6A9A0F9A0D9A059A429A2D +9A169A419A2E9A389A439A449A4F9A659A647CF97D067D027D077D087E8A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D1C7D157D137D3A7D327D317E107D3C7D407D3F7D5D7D4E7D737D867D83 +7D887DBE7DBA7DCB7DD47DC47D9E7DAC7DB97DA37DB07DC77DD97DD77DF97DF2 +7E627DE67DF67DF17E0B7DE17E097E1D7E1F7E1E7E2D7E0A7E117E7D7E397E35 +7E327E467E457E887E5A7E527E6E7E7E7E707E6F7E985E7A757F5DDB753E9095 +738E74A3744B73A2739F73CF73C274CF73B773B373C073C973C873E573D9980A +740A73E973E773DE74BD743F7489742A745B7426742574287430742E742C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +68 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000741B741A7441745C74577455745974A6746D747E749C74D4748074817487 +748B749E74A874A9749074A774DA74BA97D997DE97DC674C6753675E674869AA +6AEA6787676A677367986898677568D66A05689F678B6777677C67F06ADB67D8 +6AF367E967B06AE867D967B567DA67B367DD680067C367B867E26ADF67C16A89 +68326833690F6A48684E6968684469BF6883681D68556A3A68416A9C68406B12 +684A6849682968B5688F687468776893686B6B1E696E68FC6ADD69E768F90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B0F68F0690B6901695768E369106971693969606942695D6B16696B6980 +69986978693469CC6AEC6ADA69CE6AF8696669636979699B69A769BB69AB69AD +69D469B169C169CA6AB369956AE7698D69FF6AA369ED6A176A186A6569F26A44 +6A3E6AA06A506A5B6A356A8E6AD36A3D6A286A586ADE6A916A906AA96A976AAB +733773526B816B826BA46B846B9E6BAE6B8D6BAB6B9B6BAF6BAA8ED48EDB8EF2 +8EFB8F648EF98EFC8EEB8EE48F628EFA8EFE8F0A8F078F058F128F268F1E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008F1F8F1C8F338F468F548ECE62146227621B621F62226221622562246229 +81E7750C74F474FF750F75117513653465EE65EF65F0660A66C7677266036615 +6600708566F7661D66346631663666358006665F66C46641664F668966616657 +66776684668C66D6669D66BE66DB66DC66E666E98CC18CB08CBA8CBD8D048CB2 +8CC58D108CD18CDA8CD58CEB8CE78CFB899889AC89A189BF89A689AF89B289B7 +726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000643F64D880046BEA6BF36BFD6BFF6BF96C056C0C6C066C0D6C156C186C19 +6C1A6C216C2C6C246C2A6C3265356555656B725872527256723086625216809F +809C809380BC670A80BD80B180AB80AD80B480B76727815680E981DA80DB80C2 +80C480D980CD80D7671080DD811B80F180F480ED81BE810E80F280FC67158112 +8C5A8161811E812C811881328148814C815381748159815A817181608169817C +817D816D8167584D5AB58188818281CF6ED581A381AA81CC672681CA81BB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081C181A66B5F6B376B396B436B466B5998AE98AF98B698BC98C698C86BB3 +5F408F4289F365909F4F659565BC65C665C465C365CC65CE65D265D6716C7152 +7096719770BB70C070B770AB70B171C170CA7110711371DC712F71317173715C +716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D +7228706C71FE716671B9623E623D624362486249793B794079467949795B795C +7953795A79B079577960798E7967797A79AA798A799A79A779B35FD15FD00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000061DF605D605A606760416059606361646106610D615D61A9619D61CB61E3 +62078080807F6C936FA96DFC78EF77F878AD780978687818781165AB782D78B8 +781D7839792A7931781F783C7825782C78237829784E786D786478FD78267850 +7847784C786A78E77893789A788778E378A178A378B278B978A578D478D978C9 +78EC78F2790578F479137924791E79349F959EF99EFB9EFC76F17704779876F9 +77077708771A77227719772D772677357738775E77BC77477743775A77680000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 +754E754B7548755B7572757975837F587F617F5F8A487F687F867F717F797F88 +7F7E76CD76E5883291D291D391D491D991D791D591F791E791E4934691F591F9 +9208922692459211921092019227920492259200923A9266923792339255923D +9238925E926C926D923F9460923092499248924D922E9239943892AC92A0927A +92AA92EE92CF940392E3943A92B192A693A7929692CC92A993F59293927F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093A9929A931A92AB9283940B92A892A39412933892F193D792E592F092EF +92E892BC92DD92F69426942792C392DF92E6931293069369931B934093019315 +932E934393079308931F93199365934793769354936493AA9370938493E493D8 +9428938793CC939893B893BF93A693B093B5944C93E293DC93DD93CD93DE93C3 +93C793D19414941D93F794659413946D9420947993F99419944A9432943F9454 +9463937E77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +70 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A397A377A619ECF99A57A707688768E7693769976A474DE74E0752C9CE9 +9CF69D079D069D239D879E159D1D9D1F9DE59D2F9DD99D309D429E1E9D539E1D +9D609D529DF39D5C9D619D939D6A9D6F9D899D989D9A9DC09DA59DA99DC29DBC +9E1A9DD39DDA9DEF9DE69DF29DF89E0C9DFA9E1B7592759476647658759D7667 +75A375B375B475B875C475B175B075C375C2760275CD75E3764675E675E47647 +75E7760375F175FC75FF761076007649760C761E760A7625763B761576190000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +71 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000761B763C762276207640762D7630766D76357643766E7633764D76697654 +765C76567672766F7FCA7AE67A787A797A807A867A887A957AC77AA07AAC7AA8 +7AB67AB3886488698872887D887F888288A2896088B788BC88C9893388CE895D +894788F1891A88FC88E888FE88F08921891989138938890A8964892B89368941 +8966897B758B80E576B876B477DC801280148016801C8020802E80258026802C +802980288031800B803580438046807980528075807189839807980E980F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009821981C6F4198269837984E98539873986298599865986C9870864D8654 +866C87E38806867A867C867B86A8868D868B8706869D86A786A386AA869386A9 +86B686C486B5882386B086BA86B186AF86C987F686B486E986FA87EF86ED8784 +86D0871386DE881086DF86D886D18703870786F88708870A870D87098723873B +871E8725872E871A873E87C88734873187298737873F87828722877D8811877B +87608770874C876E878B8753876387BB876487598765879387AF87CE87D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 +87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F4C +7F447F4582107AFA7AFD7B087BE47B047B677B0A7B2B7B0F7B477B387B2A7B19 +7B2E7B317B207B257B247B337C697B1E7B587BF37B457B757B4C7B8F7B607B6E +7B7B7B627B727B717B907C007BCB7BB87BAC7B9D7C5C7B857C1E7B9C7BA27C2B +7BB47C237BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C6A7C0B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007C1F7C2A7C267C387C5F7C4081FE82018202820481EC8844822182228264 +822D822F8228822B8238826B82338234823E82448249824B824F825A825F8268 +887E88CA888888D888DF895E7F9D7FA57FA77FAF7FB07FB27C7C65497C917CF2 +7CF67C9E7CA27CB27CBC7CBD7CDD7CC77CCC7CCD7CC87CC57CD77CE8826E66A8 +7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87E367DA67DAE7E477E9B9EA9 +9EB48D738D848D948D918DB28D678D6D8C478C49914A9150914E914F91640000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +75 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009162916191709169916F91C591C3917291749179918C91859190918D9191 +91A291A391AA91AD91AE91AF91B591B491BA8C559E7A8E898DEB8E058E598E69 +8DB58DBF8DBC8DBA8E4C8DD68DD78DDA8E928DCE8DCF8DDB8DC68DEC8E7A8E55 +8DE38E9A8E8B8DE48E098DFD8E148E1D8E1F8E938E2E8E238E918E3A8E408E39 +8E358E3D8E318E498E418E428EA18E638E4A8E708E768E7C8E6F8E748E858EAA +8E948E908EA68E9E8C788C828C8A8C858C988C94659B89D689F489DA89DC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +76 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089E589EB89F68A3E8B26975A96E9974296EF9706973D9708970F970E972A +97449730973E9F549F5F9F599F609F5C9F669F6C9F6A9F779EFD9EFF9F0996B9 +96BC96BD96CE96D277BF8B8E928E947E92C893E8936A93CA938F943E946B9B77 +9B749B819B839B8E9C787A4C9B929C5F9B909BAD9B9A9BAA9B9E9C6D9BAB9B9D +9C589BC19C7A9C319C399C239C379BC09BCA9BC79BFD9BD69BEA9BEB9BE19BE4 +9BE79BDD9BE29BF09BDB9BF49BD49C5D9C089C109C0D9C129C099BFF9C200000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009C329C2D9C289C259C299C339C3E9C489C3B9C359C459C569C549C529C67 +977C978597C397BD979497C997AB97A397B297B49AB19AB09AB79DBB9AB69ABA +9ABC9AC19AC09ACF9AC29AD69AD59AD19B459B439B589B4E9B489B4D9B519957 +995C992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B229B1F +9B234E489EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 +9EDF9EE29EF79EE79EE59EF29EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +78 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000896C95C693365F4685147E94538251B24E119F635679515A6DC09F156597 +56419AEE83034E3089075E727A4098B35E7F95A49B0D52128FF45F597A6B98E2 +51E050A24EF7835085915118636E6372524B5938774F8721814A7E8D91CC66C6 +5E1877AD9E7556C99EF46FDB61DE77C770309EB5884A95E282F951ED62514EC6 +673497C67C647E3497A69EAF786E820D672F677E56CC53F098B16AAF7F4E6D82 +7CF04E074FC27E6B9E7956AE9B1A846F53F690C179A67C72613F4E919AD20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +79 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075C796BB53EA7DFB88FD79CD78437B5151C6000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb1988.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb1988.enc new file mode 100644 index 00000000..298732cc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb1988.enc @@ -0,0 +1,20 @@ +# Encoding file: gb1988, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +002000210022002300A500250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D203E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F +FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F +FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F +FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb2312-raw.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb2312-raw.enc new file mode 100644 index 00000000..813d7a6f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb2312-raw.enc @@ -0,0 +1,1380 @@ +# Encoding file: gb2312, double-byte +D +233F 0 81 +21 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300230FB02C902C700A8300330052015FF5E2225202620182019 +201C201D3014301530083009300A300B300C300D300E300F3016301730103011 +00B100D700F72236222722282211220F222A222922082237221A22A522252220 +23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 +22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 +25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +22 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000024882489248A248B248C248D248E248F2490249124922493249424952496 +249724982499249A249B247424752476247724782479247A247B247C247D247E +247F248024812482248324842485248624872460246124622463246424652466 +2467246824690000000032203221322232233224322532263227322832290000 +00002160216121622163216421652166216721682169216A216B000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +23 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +24 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +25 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +27 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +28 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 +00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000 +0000000000000000000031053106310731083109310A310B310C310D310E310F +3110311131123113311431153116311731183119311A311B311C311D311E311F +3120312131223123312431253126312731283129000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +29 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000002500250125022503250425052506250725082509250A250B +250C250D250E250F2510251125122513251425152516251725182519251A251B +251C251D251E251F2520252125222523252425252526252725282529252A252B +252C252D252E252F2530253125322533253425352536253725382539253A253B +253C253D253E253F2540254125422543254425452546254725482549254A254B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698 +978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1 +888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB +9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591 +73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E +6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +31 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2 +535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28 +5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5 +6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9 +7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B +522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +32 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B +82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8 +601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695 +6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56 +4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7 +62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +33 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D +56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668 +5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA +627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A +8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79 +4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +34 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE +7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF +882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A +847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC +810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE +7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +35 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39 +86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC +905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA +654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0 +63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889 +53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +36 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8 +680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A +72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD +7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6 +591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9 +5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +37 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE +94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F +963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F +6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124 +7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4 +4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +38 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150 +8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A +54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76 +611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8 +818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769 +845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +39 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000057C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E +62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D +4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC +52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF +704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678 +684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD +558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E +8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408 +76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC +4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334 +543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316 +8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62 +71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C +604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F +79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19 +706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6 +53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E +796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7 +59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C +76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877 +62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B +686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07 +56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83 +53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED +6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4 +91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66 +666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76 +7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0 +62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177 +8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485 +652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A +582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 +577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF +554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F +82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321 +7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +40 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000998861276E8357646606634656F062EC62695ED39614578362C955878721 +814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD +89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001 +4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B +7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC +9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +41 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C +6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF +667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599 +521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D +62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C +740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +42 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089 +63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74 +541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A +6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B +95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B +541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +43 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302 +51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF +7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F +772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720 +7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511 +706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE +964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE +776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357 +753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A +6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18 +917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +45 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696 +8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4 +722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554 +522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA +57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA +787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +46 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02 +74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6 +8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461 +83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03 +51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91 +8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +47 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3 +524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A +62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D +520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81 +97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB +4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +48 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238 +529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4 +58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4 +5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197 +63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A +745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +49 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E +7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D +886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A +5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7 +820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20 +7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3 +62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB +4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F +5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C +67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9 +7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060555237800D6454887075295E05681362F4971C53CC723D8C016C347761 +7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D +6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC +8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9 +80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59 +635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A +8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD +6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4 +7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22 +951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530 +751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5 +687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82 +5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6 +625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6 +889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB +5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4 +4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170 +536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717 +6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C +68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269 +52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D +4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1 +4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237 +95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF +76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7 +6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A +90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C +6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2 +884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E +673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157 +53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2 +5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD +7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25 +781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830 +71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C +4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +52 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064475C2790657A918C2359DA54AC8200836F898180006930564E80367237 +91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1 +4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681 +501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB +4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE +8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8 +5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C +6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149 +670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206 +4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED +7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95 +56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5 +5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5 +5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43 +810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5 +8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +55 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8 +77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B +7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C +62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005 +951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA +9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7 +804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A +63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92 +4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC +7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB +90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84 +88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353 +684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B +4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70 +594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A +5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +58 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F +53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C +4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5 +5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261 +525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB +4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC +4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F +502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7 +50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0 +6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0 +51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF +8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3 +8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19 +8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36 +5369537A961D962296219631962A963D963C964296499654965F9667966C9672 +96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB +90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD +52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF +574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B +574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF +57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 +99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8 +82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F +82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3 +8311831A83068314831582E082D5831C8351835B835C83088392833C83348331 +839B835E832F834F83478343835F834083178360832D833A8333836683650000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C +8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8 +58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 +83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478 +843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF +84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008556853B84FF84FC8559854885688564855E857A77A285438572857B85A4 +85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605 +86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34 +624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371 +637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE +645263C663BE64456441640B641B6420640C64266421645E6484646D64960000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2 +75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456 +54435421545754595423543254825494547754715464549A549B548454765466 +549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC +54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522 +5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005537555655755576557755335530555C558B55D2558355B155B955885581 +559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB +55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E +5608560C56015624562355FE56005627562D565856395657562C564D56625659 +565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 +56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91 +5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5 +5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F +5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87 +5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8 +72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072FB731773137321730A731E731D7315732273397325732C733873317350 +734D73577360736C736F737E821B592598E7592459029963996799689969996A +996B996C99749977997D998099849987998A998D999099919993999499955E80 +5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA +5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019 +60356026601B600F600D6029602B600A603F602160786079607B607A60420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8 +60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7 +61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606 +9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35 +6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4 +6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F +6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7 +6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E +6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5 +6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9 +6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 +704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47 +8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011 +900D9016902190359036902D902F9044905190529050906890589062905B66B9 +9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 +5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3 +59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75 +80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6 +5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 +9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98 +9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1 +7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08 +7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26 +7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095 +738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C +740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +68 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000741B741A7441745C7457745574597477746D747E749C748E748074817487 +748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769 +67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8 +680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD +6832683368606861684E6862684468646883681D68556866684168676840683E +684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000692468F0690B6901695768E369106971693969606942695D6984696B6980 +69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD +69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44 +6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB +733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71 +8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C +81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615 +6600708566F7661D66346631663666358006665F66546641664F665666616657 +66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40 +8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1 +726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19 +6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F +809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2 +80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112 +8C5A8136811E812C811881328148814C815381748159815A817181608169817C +817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3 +5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C +7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C +716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D +7228706C7118716671B9623E623D624362486249793B794079467949795B795C +7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1 +62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C +781D7839783A783B781F783C7825782C78237829784E786D7856785778267850 +7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9 +78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9 +77077708771A77227719772D7726773577387750775177477743775A77680000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 +754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81 +7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495 +949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8 +94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2 +94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506 +95079509950A950D950E950F951295139514951595169518951B951D951E951F +9522952A952B9529952C953195329534953695379538953C953E953F95429535 +9544954595469549954C954E954F9552955395549556955795589559955B955E +955F955D95619562956495659566956795689569956A956B956C956F95719572 +9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +70 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20 +9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42 +9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63 +9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC +75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB +75E7760375F175FC75FF761076007605760C7617760A76257618761576190000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +71 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000761B763C762276207640762D7630763F76357643763E7633764D765E7654 +765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8 +7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3 +88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941 +8966897B758B80E576B276B477DC801280148016801C80208022802580268027 +802980288031800B803580438046804D80528069807189839878988098830000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654 +866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9 +86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3 +86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B +871E8725872E871A873E87488734873187298737873F87828722877D877E877B +87608770874C876E878B87538763877C876487598765879387AF87A887D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 +87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42 +7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19 +7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E +7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB +7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223 +822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268 +887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D +7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8 +7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8 +9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +75 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009162916191709169916F917D917E917291749179918C91859190918D9191 +91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69 +8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8 +8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39 +8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F +8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +76 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A +972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9 +96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F +9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E +9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2 +9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2 +977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA +9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8 +990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F +9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 +9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb2312.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb2312.enc new file mode 100644 index 00000000..4b2f8c73 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/gb2312.enc @@ -0,0 +1,1397 @@ +# Encoding file: euc-cn, multi-byte +M +003F 0 82 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300230FB02C902C700A8300330052015FF5E2225202620182019 +201C201D3014301530083009300A300B300C300D300E300F3016301730103011 +00B100D700F72236222722282211220F222A222922082237221A22A522252220 +23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 +22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 +25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000024882489248A248B248C248D248E248F2490249124922493249424952496 +249724982499249A249B247424752476247724782479247A247B247C247D247E +247F248024812482248324842485248624872460246124622463246424652466 +2467246824690000000032203221322232233224322532263227322832290000 +00002160216121622163216421652166216721682169216A216B000000000000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 +00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000 +0000000000000000000031053106310731083109310A310B310C310D310E310F +3110311131123113311431153116311731183119311A311B311C311D311E311F +3120312131223123312431253126312731283129000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000002500250125022503250425052506250725082509250A250B +250C250D250E250F2510251125122513251425152516251725182519251A251B +251C251D251E251F2520252125222523252425252526252725282529252A252B +252C252D252E252F2530253125322533253425352536253725382539253A253B +253C253D253E253F2540254125422543254425452546254725482549254A254B +0000000000000000000000000000000000000000000000000000000000000000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698 +978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1 +888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB +9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591 +73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E +6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2 +535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28 +5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5 +6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9 +7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B +522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B +82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8 +601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695 +6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56 +4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7 +62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D +56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668 +5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA +627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A +8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79 +4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE +7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF +882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A +847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC +810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE +7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39 +86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC +905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA +654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0 +63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889 +53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8 +680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A +72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD +7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6 +591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9 +5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE +94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F +963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F +6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124 +7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4 +4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150 +8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A +54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76 +611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8 +818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769 +845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000057C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E +62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D +4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC +52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF +704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678 +684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD +558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E +8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408 +76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC +4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334 +543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316 +8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62 +71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C +604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F +79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19 +706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6 +53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E +796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7 +59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C +76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877 +62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B +686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07 +56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83 +53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED +6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4 +91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66 +666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76 +7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0 +62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177 +8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485 +652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A +582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 +577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF +554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F +82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321 +7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000998861276E8357646606634656F062EC62695ED39614578362C955878721 +814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD +89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001 +4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B +7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC +9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C +6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF +667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599 +521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D +62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C +740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089 +63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74 +541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A +6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B +95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B +541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302 +51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF +7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F +772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720 +7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511 +706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE +964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE +776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357 +753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A +6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18 +917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696 +8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4 +722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554 +522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA +57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA +787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02 +74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6 +8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461 +83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03 +51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91 +8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3 +524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A +62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D +520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81 +97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB +4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000 +C8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238 +529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4 +58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4 +5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197 +63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A +745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000 +C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E +7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D +886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A +5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7 +820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20 +7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3 +62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB +4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F +5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C +67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9 +7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060555237800D6454887075295E05681362F4971C53CC723D8C016C347761 +7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D +6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC +8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9 +80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59 +635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A +8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD +6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4 +7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22 +951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530 +751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5 +687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82 +5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6 +625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6 +889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB +5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4 +4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170 +536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717 +6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C +68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269 +52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D +4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1 +4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237 +95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF +76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7 +6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A +90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C +6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2 +884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E +673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157 +53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2 +5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD +7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25 +781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830 +71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C +4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064475C2790657A918C2359DA54AC8200836F898180006930564E80367237 +91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1 +4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681 +501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB +4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE +8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8 +5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C +6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149 +670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206 +4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED +7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95 +56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5 +5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5 +5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43 +810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5 +8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8 +77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B +7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C +62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005 +951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA +9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7 +804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A +63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92 +4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC +7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB +90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84 +88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353 +684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B +4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70 +594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A +5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F +53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C +4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5 +5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261 +525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB +4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC +4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F +502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7 +50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0 +6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0 +51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF +8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3 +8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19 +8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36 +5369537A961D962296219631962A963D963C964296499654965F9667966C9672 +96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB +90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD +52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF +574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B +574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF +57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 +99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8 +82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F +82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3 +8311831A83068314831582E082D5831C8351835B835C83088392833C83348331 +839B835E832F834F83478343835F834083178360832D833A8333836683650000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C +8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8 +58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 +83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478 +843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF +84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008556853B84FF84FC8559854885688564855E857A77A285438572857B85A4 +85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605 +86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34 +624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371 +637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE +645263C663BE64456441640B641B6420640C64266421645E6484646D64960000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2 +75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456 +54435421545754595423543254825494547754715464549A549B548454765466 +549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC +54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522 +5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005537555655755576557755335530555C558B55D2558355B155B955885581 +559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB +55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E +5608560C56015624562355FE56005627562D565856395657562C564D56625659 +565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 +56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91 +5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5 +5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F +5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87 +5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8 +72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072FB731773137321730A731E731D7315732273397325732C733873317350 +734D73577360736C736F737E821B592598E7592459029963996799689969996A +996B996C99749977997D998099849987998A998D999099919993999499955E80 +5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA +5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019 +60356026601B600F600D6029602B600A603F602160786079607B607A60420000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8 +60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7 +61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606 +9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35 +6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4 +6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F +6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7 +6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E +6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5 +6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9 +6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 +704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47 +8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011 +900D9016902190359036902D902F9044905190529050906890589062905B66B9 +9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 +5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3 +59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75 +80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6 +5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 +9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98 +9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1 +7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08 +7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26 +7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095 +738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C +740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000741B741A7441745C7457745574597477746D747E749C748E748074817487 +748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769 +67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8 +680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD +6832683368606861684E6862684468646883681D68556866684168676840683E +684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000692468F0690B6901695768E369106971693969606942695D6984696B6980 +69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD +69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44 +6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB +733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71 +8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C +81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615 +6600708566F7661D66346631663666358006665F66546641664F665666616657 +66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40 +8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1 +726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19 +6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F +809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2 +80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112 +8C5A8136811E812C811881328148814C815381748159815A817181608169817C +817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3 +5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C +7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C +716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D +7228706C7118716671B9623E623D624362486249793B794079467949795B795C +7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1 +62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C +781D7839783A783B781F783C7825782C78237829784E786D7856785778267850 +7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9 +78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9 +77077708771A77227719772D7726773577387750775177477743775A77680000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 +754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81 +7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495 +949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8 +94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2 +94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506 +95079509950A950D950E950F951295139514951595169518951B951D951E951F +9522952A952B9529952C953195329534953695379538953C953E953F95429535 +9544954595469549954C954E954F9552955395549556955795589559955B955E +955F955D95619562956495659566956795689569956A956B956C956F95719572 +9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20 +9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42 +9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63 +9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC +75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB +75E7760375F175FC75FF761076007605760C7617760A76257618761576190000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000761B763C762276207640762D7630763F76357643763E7633764D765E7654 +765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8 +7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3 +88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941 +8966897B758B80E576B276B477DC801280148016801C80208022802580268027 +802980288031800B803580438046804D80528069807189839878988098830000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654 +866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9 +86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3 +86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B +871E8725872E871A873E87488734873187298737873F87828722877D877E877B +87608770874C876E878B87538763877C876487598765879387AF87A887D20000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 +87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42 +7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19 +7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E +7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB +7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223 +822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268 +887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D +7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8 +7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8 +9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009162916191709169916F917D917E917291749179918C91859190918D9191 +91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69 +8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8 +8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39 +8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F +8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A +972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9 +96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F +9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E +9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2 +9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2 +977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA +9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8 +990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F +9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 +9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso2022-jp.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso2022-jp.enc new file mode 100644 index 00000000..f6dabe56 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso2022-jp.enc @@ -0,0 +1,12 @@ +# Encoding file: iso2022-jp, escape-driven +E +name iso2022-jp +init {} +final {} +ascii \x1b(B +jis0201 \x1b(J +jis0208 \x1b$B +jis0208 \x1b$@ +jis0212 \x1b$(D +gb2312 \x1b$A +ksc5601 \x1b$(C diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso2022-kr.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso2022-kr.enc new file mode 100644 index 00000000..d20ce2bc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso2022-kr.enc @@ -0,0 +1,7 @@ +# Encoding file: iso2022-kr, escape-driven +E +name iso2022-kr +init \x1b$)C +final {} +iso8859-1 \x0f +ksc5601 \x0e diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso2022.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso2022.enc new file mode 100644 index 00000000..a58f8e3e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso2022.enc @@ -0,0 +1,14 @@ +# Encoding file: iso2022, escape-driven +E +name iso2022 +init {} +final {} +iso8859-1 \x1b(B +jis0201 \x1b(J +gb1988 \x1b(T +jis0208 \x1b$B +jis0208 \x1b$@ +jis0212 \x1b$(D +gb2312 \x1b$A +ksc5601 \x1b$(C +jis0208 \x1b&@\x1b$B diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-1.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-1.enc new file mode 100644 index 00000000..045d8fa2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-1.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-1, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF +00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF +00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF +00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF +00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-10.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-10.enc new file mode 100644 index 00000000..934b3b92 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-10.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-10, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A0010401120122012A0128013600A7013B011001600166017D00AD016A014A +00B0010501130123012B0129013700B7013C011101610167017E2015016B014B +010000C100C200C300C400C500C6012E010C00C9011800CB011600CD00CE00CF +00D00145014C00D300D400D500D6016800D8017200DA00DB00DC00DD00DE00DF +010100E100E200E300E400E500E6012F010D00E9011900EB011700ED00EE00EF +00F00146014D00F300F400F500F6016900F8017300FA00FB00FC00FD00FE0138 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-11.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-11.enc new file mode 100644 index 00000000..d6834535 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-11.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-11, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A00E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F +0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F +0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F +0E300E310E320E330E340E350E360E370E380E390E3A00000000000000000E3F +0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D0E4E0E4F +0E500E510E520E530E540E550E560E570E580E590E5A0E5B0000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-13.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-13.enc new file mode 100644 index 00000000..b7edcaf3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-13.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-13, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A0201D00A200A300A4201E00A600A700D800A9015600AB00AC00AD00AE00C6 +00B000B100B200B3201C00B500B600B700F800B9015700BB00BC00BD00BE00E6 +0104012E0100010600C400C501180112010C00C90179011601220136012A013B +01600143014500D3014C00D500D600D701720141015A016A00DC017B017D00DF +0105012F0101010700E400E501190113010D00E9017A011701230137012B013C +01610144014600F3014D00F500F600F701730142015B016B00FC017C017E2019 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-14.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-14.enc new file mode 100644 index 00000000..a65ba05b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-14.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-14, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A01E021E0300A3010A010B1E0A00A71E8000A91E821E0B1EF200AD00AE0178 +1E1E1E1F012001211E401E4100B61E561E811E571E831E601EF31E841E851E61 +00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF +017400D100D200D300D400D500D61E6A00D800D900DA00DB00DC00DD017600DF +00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF +017500F100F200F300F400F500F61E6B00F800F900FA00FB00FC00FD017700FF diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-15.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-15.enc new file mode 100644 index 00000000..823af466 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-15.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-15, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A000A100A200A320AC00A5016000A7016100A900AA00AB00AC00AD00AE00AF +00B000B100B200B3017D00B500B600B7017E00B900BA00BB01520153017800BF +00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF +00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF +00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF +00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-16.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-16.enc new file mode 100644 index 00000000..da337093 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-16.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-16, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A001040105014120AC201E016000A7016100A9021800AB017900AD017A017B +00B000B1010C0142017D201D00B600B7017E010D021900BB015201530178017C +00C000C100C2010200C4010600C600C700C800C900CA00CB00CC00CD00CE00CF +0110014300D200D300D4015000D6015A017000D900DA00DB00DC0118021A00DF +00E000E100E2010300E4010700E600E700E800E900EA00EB00EC00ED00EE00EF +0111014400F200F300F4015100F6015B017100F900FA00FB00FC0119021B00FF diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-2.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-2.enc new file mode 100644 index 00000000..16faab66 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-2.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-2, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A0010402D8014100A4013D015A00A700A80160015E0164017900AD017D017B +00B0010502DB014200B4013E015B02C700B80161015F0165017A02DD017E017C +015400C100C2010200C40139010600C7010C00C9011800CB011A00CD00CE010E +01100143014700D300D4015000D600D70158016E00DA017000DC00DD016200DF +015500E100E2010300E4013A010700E7010D00E9011900EB011B00ED00EE010F +01110144014800F300F4015100F600F70159016F00FA017100FC00FD016302D9 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-3.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-3.enc new file mode 100644 index 00000000..c914bce7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-3.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-3, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A0012602D800A300A40000012400A700A80130015E011E013400AD0000017B +00B0012700B200B300B400B5012500B700B80131015F011F013500BD0000017C +00C000C100C2000000C4010A010800C700C800C900CA00CB00CC00CD00CE00CF +000000D100D200D300D4012000D600D7011C00D900DA00DB00DC016C015C00DF +00E000E100E2000000E4010B010900E700E800E900EA00EB00EC00ED00EE00EF +000000F100F200F300F4012100F600F7011D00F900FA00FB00FC016D015D02D9 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-4.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-4.enc new file mode 100644 index 00000000..ef5c5a99 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-4.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-4, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A001040138015600A40128013B00A700A8016001120122016600AD017D00AF +00B0010502DB015700B40129013C02C700B80161011301230167014A017E014B +010000C100C200C300C400C500C6012E010C00C9011800CB011600CD00CE012A +01100145014C013600D400D500D600D700D8017200DA00DB00DC0168016A00DF +010100E100E200E300E400E500E6012F010D00E9011900EB011700ED00EE012B +01110146014D013700F400F500F600F700F8017300FA00FB00FC0169016B02D9 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-5.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-5.enc new file mode 100644 index 00000000..bf4ee82b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-5.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-5, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A0040104020403040404050406040704080409040A040B040C00AD040E040F +0410041104120413041404150416041704180419041A041B041C041D041E041F +0420042104220423042404250426042704280429042A042B042C042D042E042F +0430043104320433043404350436043704380439043A043B043C043D043E043F +0440044104420443044404450446044704480449044A044B044C044D044E044F +2116045104520453045404550456045704580459045A045B045C00A7045E045F diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-6.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-6.enc new file mode 100644 index 00000000..19ddefbc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-6.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-6, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A000000000000000A40000000000000000000000000000060C00AD00000000 +00000000000000000000000000000000000000000000061B000000000000061F +0000062106220623062406250626062706280629062A062B062C062D062E062F +0630063106320633063406350636063706380639063A00000000000000000000 +0640064106420643064406450646064706480649064A064B064C064D064E064F +0650065106520000000000000000000000000000000000000000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-7.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-7.enc new file mode 100644 index 00000000..a46112f1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-7.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-7, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A02018201900A320AC20AF00A600A700A800A9037A00AB00AC00AD00002015 +00B000B100B200B303840385038600B703880389038A00BB038C00BD038E038F +0390039103920393039403950396039703980399039A039B039C039D039E039F +03A003A1000003A303A403A503A603A703A803A903AA03AB03AC03AD03AE03AF +03B003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C203C303C403C503C603C703C803C903CA03CB03CC03CD03CE0000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-8.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-8.enc new file mode 100644 index 00000000..579fa5b4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-8.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-8, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A0000000A200A300A400A500A600A700A800A900D700AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900F700BB00BC00BD00BE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000002017 +05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF +05E005E105E205E305E405E505E605E705E805E905EA00000000200E200F0000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-9.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-9.enc new file mode 100644 index 00000000..6eed3f1a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/iso8859-9.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-9, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF +00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF +011E00D100D200D300D400D500D600D700D800D900DA00DB00DC0130015E00DF +00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF +011F00F100F200F300F400F500F600F700F800F900FA00FB00FC0131015F00FF diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/jis0201.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/jis0201.enc new file mode 100644 index 00000000..64f423f1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/jis0201.enc @@ -0,0 +1,20 @@ +# Encoding file: jis0201, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D203E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F +FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F +FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F +FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/jis0208.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/jis0208.enc new file mode 100644 index 00000000..11c49a4a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/jis0208.enc @@ -0,0 +1,1319 @@ +# Encoding file: jis0208, double-byte +D +2129 0 77 +21 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8 +FF3EFFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0F +FF3C301C2016FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3D +FF5BFF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D7 +00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 +FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +22 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000025C625A125A025B325B225BD25BC203B3012219221902191219330130000 +00000000000000000000000000000000000000002208220B2286228722822283 +222A2229000000000000000000000000000000002227222800AC21D221D42200 +220300000000000000000000000000000000000000000000222022A523122202 +220722612252226A226B221A223D221D2235222B222C00000000000000000000 +00000000212B2030266F266D266A2020202100B6000000000000000025EF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +23 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19000000000000000000000000 +0000FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A00000000000000000000 +0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +24 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +25 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +27 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +28 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000025002502250C251025182514251C252C25242534253C25012503250F2513 +251B251725232533252B253B254B2520252F25282537253F251D253025252538 +2542000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E9C55165A03963F54C0611B632859F690228475831C7A5060AA63E16E25 +65ED846682A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E6216 +7C9F88B75B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2 +593759D45A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3 +840E88638B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA29038 +7A328328828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +31 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E11 +789381FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B +96F2834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E +983482F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD5186 +5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 +827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +32 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062BC65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B5104 +5C4B61B681C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F55 +4F3D4FA14F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3 +706B73C2798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA8 +8FE6904E971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D5 +4ECB4F1A89E356DE584A58CA5EFB5FEB602A6094606261D0621262D065390000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +33 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE +591654B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D9 +57A367FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B +899A89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B +6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 +53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584310000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +34 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007CA5520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E6 +5B8C5B985BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B53 +6C576F226F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266 +839E89B38ACC8CAB908494519593959195A2966597D3992882184E38542B5CB8 +5DCC73A9764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C5668 +57FA59475B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +35 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D77 +8ECC8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A07591 +79477FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A7078276775 +9ECD53745BA2811A865090064E184E454EC74F1153CA54385BAE5F1360256551 +673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 +5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +36 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F9B4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F37 +5F4A602F6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F7 +93E197FF99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C5 +52E457475DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F +8B398FD191D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C8 +99D25177611A865E55B07A7A50765BD3904796854E326ADB91E75C515C480000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +37 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000063987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B +85AB8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B +59515F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB +7D4C7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE8 +5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 +503950265065517C5238526355A7570F58055ACC5EFA61B261F862F363720000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +38 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000691C6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED29063 +9375967A98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D438237 +8A008AFA96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF +6E5672D07CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E92 +4F0D53485449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B779190 +4E5E9BC94EA44F7C4FAF501950165149516C529F52B952FE539A53E354110000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +39 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB7 +5F186052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A +6D696E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B1 +8154818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D +980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B +544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B6498034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D5 +7D3A826E9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A509396 +88DF57505EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D +6B736E08707D91C7728078157826796D658E7D3083DC88C18F09969B52645728 +67507F6A8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A +548B643E6628671467F57A847B567D22932F685C9BAD7B395319518A52370000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF6652 +4E09509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB +9178991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB +59C959FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B62 +6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C +8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B216ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F +5F0F8B589D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F06 +75BE8CEA5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66 +659C716E793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235 +914C91C8932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E +816B8DA391529996511253D7546A5BFF63886A397DAC970056DA53CE54680000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F8490 +884689728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E +67D46C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F +51FA88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF3 +6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 +7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000052DD5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C11 +5C1A5E845E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A2 +6A1F6A356CBC6D886E096E58713C7126716775C77701785D7901796579F07AE0 +7B117CA77D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A4 +9266937E9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E38 +60C564FE676167566D4472B675737A6384B88B7291B89320563157F498FE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB5 +55075A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F +795E79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC15203 +587558EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A8 +9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F +745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +40 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F84647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F +6574661F667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA0 +8A938ACB901D91929752975965897A0E810696BB5E2D60DC621A65A566146790 +77F37A4D7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D +7A837BC08AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226 +624764B0681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +41 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE +524D55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A +72D9758F758E790E795679DF7C977D207D4486078A34963B90619F2050E75275 +53CC53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB +64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 +83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +42 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081D385358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD7 +5C5E8CCA65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A +592A6C708A51553E581559A560F0625367C182356955964099C49A284F535806 +5BFE80105CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB8 +9000902E968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD702753535544 +5B856258629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +43 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB0 +4E3953585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D +80C686CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E55730 +5F1B6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C4 +901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 +8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E165E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A +80748139817887768ABF8ADC8D858DF3929A957798029CE552C5635776F46715 +6C8873CD8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B4 +69FB4F436F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A +91E39DB44EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F +608C62B5633A63D068AF6C407887798E7A0B7DE082478A028AE68E4490130000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +45 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F2 +5FB964A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B +70B94F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21 +767B83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC +51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF +76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152300000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +46 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008463856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD +52D5540C58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F +5F975FB36D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A +9CF682EB5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D +594890A351854E4D51EA85998B0E7058637A934B696299B47E04757753576960 +8EDF96E36C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E7351650000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +47 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000059825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E74 +5FF5637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF +8FB2899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC +4FF35EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A926885 +6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD +67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +48 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051FD7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A +91979AEA4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD +53DB5E06642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC4 +91C67169981298EF633D6669756A76E478D0854386EE532A5351542659835E87 +5F7C60B26249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB +8AB98CBB907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +49 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C +686759EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C79 +5EDF63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA7 +8CD3983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C601662766577 +65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB +6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000798F8179890789866DF55F1762556CB84ECF72699B925206543B567458B3 +61A4626E711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E73 +5F0A67C44E26853D9589965B7C73980150FB58C1765678A7522577A585117B86 +504F590972477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA +570363556B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E95023 +4FF853055446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D2 +98FD9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D0 +68D251927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A8 +64B26734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C6 +646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE +9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E800000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F2B85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A1481085999 +7C8D6C11772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D +660E76DF8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A21 +830259845B5F6BDB731B76F27DB280178499513267289ED976EE676252FF9905 +5C24623B7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F25 +77E253845F797D0485AC8A338E8D975667F385AE9453610961086CB976520000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E67 +6D8C733673377531795088D58A98904A909190F596C4878D59154E884F594E0E +8A898F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB6 +719475287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B32 +6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A +4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A8740674830000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075E288CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C +74097559786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC +5BEE659968816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B +7DD1502B539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F +985E4EE44F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E97 +9F6266A66B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000084EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717 +697C69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B9332 +8AD6502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C18568 +69006E7E78978155000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F0C4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A +82125F0D4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED7 +4EDE4EED4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B +4F694F704F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE4 +4FE5501A50285014502A502550054F1C4FF650215029502C4FFE4FEF50115006 +504350476703505550505048505A5056506C50785080509A508550B450B20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000050C950CA50B350C250D650DE50E550ED50E350EE50F950F5510951015102 +511651155114511A5121513A5137513C513B513F51405152514C515451627AF8 +5169516A516E5180518256D8518C5189518F519151935195519651A451A651A2 +51A951AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED +51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C +525E5254526A527452695273527F527D528D529452925271528852918FA80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +52 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008FA752AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F5 +52F852F9530653087538530D5310530F5315531A5323532F5331533353385340 +534653454E175349534D51D6535E5369536E5918537B53775382539653A053A6 +53A553AE53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D +5440542C542D543C542E54365429541D544E548F5475548E545F547154775470 +5492547B5480547654845490548654C754A254B854A554AC54C454C854A80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E2 +553955405563554C552E555C55455556555755385533555D5599558054AF558A +559F557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC +55E455D4561455F7561655FE55FD561B55F9564E565071DF5634563656325638 +566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 +56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457090000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005708570B570D57135718571655C7571C572657375738574E573B5740574F +576957C057885761577F5789579357A057B357A457AA57B057C357C657D457D2 +57D3580A57D657E3580B5819581D587258215862584B58706BC05852583D5879 +588558B9589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E5 +58DC58E458DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C +592D59325938593E7AD259555950594E595A5958596259605967596C59690000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +55 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000059785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F +5A115A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC2 +5ABD5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E +5B435B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B80 +5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 +5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C530000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C505C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB6 +5CBC5CB75CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C +5D1F5D1B5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D87 +5D845D825DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB +5DEB5DF25DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E54 +5E5F5E625E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF8 +5EFE5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F +5F515F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E +5F995F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF60216060 +601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F +604A6046604D6063604360646042606C606B60596081608D60E76083609A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +58 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006084609B60966097609260A7608B60E160B860E060D360B45FF060BD60C6 +60B560D8614D6115610660F660F7610060F460FA6103612160FB60F1610D610E +6147613E61286127614A613F613C612C6134613D614261446173617761586159 +615A616B6174616F61656171615F615D6153617561996196618761AC6194619A +618A619161AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E6 +61E361F661FA61F461FF61FD61FC61FE620062086209620D620C6214621B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000621E6221622A622E6230623262336241624E625E6263625B62606268627C +62826289627E62926293629662D46283629462D762D162BB62CF62FF62C664D4 +62C862DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F5 +6350633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B +636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 +651D64176428640F6467646F6476644E652A6495649364A564A9648864BC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064DA64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF +652C64F664F464F264FA650064FD6518651C650565246523652B653465356537 +65366538754B654865566555654D6558655E655D65726578658265838B8A659B +659F65AB65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A +660365FB6773663566366634661C664F664466496641665E665D666466676668 +665F6662667066836688668E668966846698669D66C166B966C966BE66BC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000066C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E6726 +67279738672E673F67366741673867376746675E676067596763676467896770 +67A9677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E4 +67DE67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E +68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 +68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068D468E768D569366912690468D768E3692568F968E068EF6928692A691A +6923692168C669796977695C6978696B6954697E696E69396974693D69596930 +6961695E695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD +69BB69C369A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F9 +69F269E76A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A72 +6A366A786A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB +6B0586166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B50 +6B596B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA4 +6BAA6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF +9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B +6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006CBA6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D12 +6D0C6D636D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC7 +6DE66DB86DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D +6E6E6E2E6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E24 +6EFF6E1D6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F +6EA56EC26E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F58 +6F8E6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD8 +6FF16FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F +7030703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD +70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 +719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000071F971FF720D7210721B7228722D722C72307232723B723C723F72407246 +724B72587274727E7282728172877292729672A272A772B972B272C372C672C4 +72CE72D272E272E072E172F972F7500F7317730A731C7316731D7334732F7329 +7325733E734E734F9ED87357736A7368737073787375737B737A73C873B373CE +73BB73C073E573EE73DE74A27405746F742573F87432743A7455743F745F7459 +7441745C746974707463746A7476747E748B749E74A774CA74CF74D473F10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000074E074E374E774E974EE74F274F074F174F874F7750475037505750C750E +750D75157513751E7526752C753C7544754D754A7549755B7546755A75697564 +7567756B756D75787576758675877574758A758975827594759A759D75A575A3 +75C275B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF +75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 +7630763B764776487646765C76587661766276687669766A7667766C76700000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000767276767678767C768076837688768B768E769676937699769A76B076B4 +76B876B976BA76C276CD76D676D276DE76E176E576E776EA862F76FB77087707 +770477297724771E77257726771B773777387747775A7768776B775B7765777F +777E7779778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD +77D777DA77DC77E377EE77FC780C781279267820792A7845788E78747886787C +789A788C78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078E778DA78FD78F47907791279117919792C792B794079607957795F795A +79557953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E7 +79EC79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A57 +7A497A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB0 +7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 +7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B500000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007B7A7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D +7B987B9F7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC6 +7BDD7BE97C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C23 +7C277C2A7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C56 +7C657C6C7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB9 +7CBD7CC07CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D060000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D72 +7D687D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD +7DAB7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E05 +7E0A7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E37 +7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D +8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007F457F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F78 +7F827F867F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB6 +7FB88B717FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B +801280188019801C80218028803F803B804A804680528058805A805F80628068 +80738072807080768079807D807F808480868085809B8093809A80AD519080AC +80DB80E580D980DD80C480DA80D6810980EF80F1811B81298123812F814B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000968B8146813E8153815180FC8171816E81658166817481838188818A8180 +818281A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA +81C981CD81D181D981D881C881DA81DF81E081E781FA81FB81FE820182028205 +8207820A820D821082168229822B82388233824082598258825D825A825F8264 +82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 +82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +68 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000833583348316833283318340833983508345832F832B831783188385839A +83AA839F83A283968323838E8387838A837C83B58373837583A0838983A883F4 +841383EB83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD +8438850683FB846D842A843C855A84848477846B84AD846E848284698446842C +846F8479843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D6 +84A1852184FF84F485178518852C851F8515851484FC85408563855885480000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000085418602854B8555858085A485888591858A85A8856D8594859B85EA8587 +859C8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613 +860B85FE85FA86068622861A8630863F864D4E558654865F86678671869386A3 +86A986AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC +86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F +8737873B87258729871A8760875F8778874C874E877487578768876E87590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000087538763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C4 +87B387C787C687BB87EF87F287E0880F880D87FE87F687F7880E87D288118816 +8815882288218831883688398827883B8844884288528859885E8862886B8881 +887E889E8875887D88B5887288828897889288AE889988A2888D88A488B088BF +88B188C388C488D488D888D988DD88F9890288FC88F488E888F28904890C890A +89138943891E8925892A892B89418944893B89368938894C891D8960895E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089668964896D896A896F89748977897E89838988898A8993899889A189A9 +89A689AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A16 +8A108A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A85 +8A828A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE7 +8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 +8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B5F8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C41 +8C3F8C488C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E +8C948C7C8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA +8CFD8CFA8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D67 +8D6D8D718D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB +8DDF8DE38DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E81 +8E878E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE +8EC58EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C +8F1F8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C +8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 +90058FF98FFA901190159021900D901E9016900B90279036903590398FF80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000904F905090519052900E9049903E90569058905E9068906F907696A89072 +9082907D90819080908A9089908F90A890AF90B190B590E290E4624890DB9102 +9112911991329130914A9156915891639165916991739172918B9189918291A2 +91AB91AF91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC +91F591F6921E91FF9214922C92159211925E925792459249926492489295923F +924B9250929C92969293929B925A92CF92B992B792E9930F92FA9344932E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093199322931A9323933A9335933B935C9360937C936E935693B093AC93AD +939493B993D693D793E893E593D893C393DD93D093C893E4941A941494139403 +940794109436942B94359421943A944194529444945B94609462945E946A9229 +947094759477947D945A947C947E9481947F95829587958A9594959695989599 +95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 +95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +70 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000965D965F96669672966C968D96989695969796AA96A796B196B296B096B4 +96B696B896B996CE96CB96C996CD894D96DC970D96D596F99704970697089713 +970E9711970F971697199724972A97309739973D973E97449746974897429749 +975C976097649766976852D2976B977197799785977C9781977A9786978B978F +9790979C97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF +97F697F5980F980C9838982498219837983D9846984F984B986B986F98700000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +71 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000098719874987398AA98AF98B198B698C498C398C698E998EB990399099912 +991499189921991D991E99249920992C992E993D993E9942994999459950994B +99519952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED +99EE99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A43 +9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 +9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009AFB9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B32 +9B449B439B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA8 +9BB49BC09BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF1 +9BF09C159C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C21 +9C309C479C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB +9D039D069D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D480000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA9 +9DB29DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD +9E1A9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA9 +9EB89EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF +9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 +9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000582F69C79059746451DC7199000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +R +2141 301C FF5E +2142 2016 2225 +215D 2212 FF0D +2171 00A2 FFE0 +2172 00A3 FFE1 +224C 00AC FFE2 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/jis0212.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/jis0212.enc new file mode 100644 index 00000000..cddbbba9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/jis0212.enc @@ -0,0 +1,1159 @@ +# Encoding file: jis0212, double-byte +D +2244 0 68 +22 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000002D8 +02C700B802D902DD00AF02DB02DA007E03840385000000000000000000000000 +0000000000A100A600BF00000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000BA00AA00A900AE2122 +00A4211600000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000038603880389038A03AA0000038C0000038E03AB0000038F000000000000 +000003AC03AD03AE03AF03CA039003CC03C203CD03CB03B003CE000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +27 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000004020403040404050406040704080409040A040B040C040E040F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000004520453045404550456045704580459045A045B045C045E045F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +29 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000C60110000001260000013200000141013F0000014A00D8015200000166 +00DE000000000000000000000000000000000000000000000000000000000000 +000000E6011100F00127013101330138014201400149014B00F8015300DF0167 +00FE000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000C100C000C400C2010201CD0100010400C500C301060108010C00C7010A +010E00C900C800CB00CA011A0116011201180000011C011E01220120012400CD +00CC00CF00CE01CF0130012A012E0128013401360139013D013B014301470145 +00D100D300D200D600D401D10150014C00D5015401580156015A015C0160015E +0164016200DA00D900DC00DB016C01D30170016A0172016E016801D701DB01D9 +01D5017400DD017801760179017D017B00000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000E100E000E400E2010301CE0101010500E500E301070109010D00E7010B +010F00E900E800EB00EA011B01170113011901F5011D011F00000121012500ED +00EC00EF00EE01D00000012B012F012901350137013A013E013C014401480146 +00F100F300F200F600F401D20151014D00F5015501590157015B015D0161015F +0165016300FA00F900FC00FB016D01D40171016B0173016F016901D801DC01DA +01D6017500FD00FF0177017A017E017C00000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E024E044E054E0C4E124E1F4E234E244E284E2B4E2E4E2F4E304E354E40 +4E414E444E474E514E5A4E5C4E634E684E694E744E754E794E7F4E8D4E964E97 +4E9D4EAF4EB94EC34ED04EDA4EDB4EE04EE14EE24EE84EEF4EF14EF34EF54EFD +4EFE4EFF4F004F024F034F084F0B4F0C4F124F154F164F174F194F2E4F314F60 +4F334F354F374F394F3B4F3E4F404F424F484F494F4B4F4C4F524F544F564F58 +4F5F4F634F6A4F6C4F6E4F714F774F784F794F7A4F7D4F7E4F814F824F840000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +31 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F854F894F8A4F8C4F8E4F904F924F934F944F974F994F9A4F9E4F9F4FB2 +4FB74FB94FBB4FBC4FBD4FBE4FC04FC14FC54FC64FC84FC94FCB4FCC4FCD4FCF +4FD24FDC4FE04FE24FF04FF24FFC4FFD4FFF5000500150045007500A500C500E +5010501350175018501B501C501D501E50225027502E50305032503350355040 +5041504250455046504A504C504E50515052505350575059505F506050625063 +50665067506A506D50705071503B5081508350845086508A508E508F50900000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +32 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005092509350945096509B509C509E509F50A050A150A250AA50AF50B050B9 +50BA50BD50C050C350C450C750CC50CE50D050D350D450D850DC50DD50DF50E2 +50E450E650E850E950EF50F150F650FA50FE5103510651075108510B510C510D +510E50F2511051175119511B511C511D511E512351275128512C512D512F5131 +513351345135513851395142514A514F5153515551575158515F51645166517E +51835184518B518E5198519D51A151A351AD51B851BA51BC51BE51BF51C20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +33 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051C851CF51D151D251D351D551D851DE51E251E551EE51F251F351F451F7 +5201520252055212521352155216521852225228523152325235523C52455249 +525552575258525A525C525F526052615266526E527752785279528052825285 +528A528C52935295529652975298529A529C52A452A552A652A752AF52B052B6 +52B752B852BA52BB52BD52C052C452C652C852CC52CF52D152D452D652DB52DC +52E152E552E852E952EA52EC52F052F152F452F652F753005303530A530B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +34 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000530C531153135318531B531C531E531F5325532753285329532B532C532D +533053325335533C533D533E5342534C534B5359535B536153635365536C536D +53725379537E538353875388538E539353945399539D53A153A453AA53AB53AF +53B253B453B553B753B853BA53BD53C053C553CF53D253D353D553DA53DD53DE +53E053E653E753F554025413541A542154275428542A542F5431543454355443 +54445447544D544F545E54625464546654675469546B546D546E5474547F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +35 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054815483548554885489548D549154955496549C549F54A154A654A754A9 +54AA54AD54AE54B154B754B954BA54BB54BF54C654CA54CD54CE54E054EA54EC +54EF54F654FC54FE54FF55005501550555085509550C550D550E5515552A552B +553255355536553B553C553D554155475549554A554D555055515558555A555B +555E5560556155645566557F5581558255865588558E558F5591559255935594 +559755A355A455AD55B255BF55C155C355C655C955CB55CC55CE55D155D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +36 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000055D355D755D855DB55DE55E255E955F655FF56055608560A560D560E560F +5610561156125619562C56305633563556375639563B563C563D563F56405641 +5643564456465649564B564D564F5654565E566056615662566356665669566D +566F567156725675568456855688568B568C56955699569A569D569E569F56A6 +56A756A856A956AB56AC56AD56B156B356B756BE56C556C956CA56CB56CF56D0 +56CC56CD56D956DC56DD56DF56E156E456E556E656E756E856F156EB56ED0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +37 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000056F656F7570157025707570A570C57115715571A571B571D572057225723 +572457255729572A572C572E572F57335734573D573E573F57455746574C574D +57525762576557675768576B576D576E576F5770577157735774577557775779 +577A577B577C577E57815783578C579457975799579A579C579D579E579F57A1 +579557A757A857A957AC57B857BD57C757C857CC57CF57D557DD57DE57E457E6 +57E757E957ED57F057F557F657F857FD57FE57FF580358045808580957E10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +38 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000580C580D581B581E581F582058265827582D58325839583F5849584C584D +584F58505855585F58615864586758685878587C587F58805881588758885889 +588A588C588D588F589058945896589D58A058A158A258A658A958B158B258C4 +58BC58C258C858CD58CE58D058D258D458D658DA58DD58E158E258E958F35905 +5906590B590C5912591359148641591D5921592359245928592F593059335935 +5936593F59435946595259535959595B595D595E595F59615963596B596D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +39 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000596F5972597559765979597B597C598B598C598E599259955997599F59A4 +59A759AD59AE59AF59B059B359B759BA59BC59C159C359C459C859CA59CD59D2 +59DD59DE59DF59E359E459E759EE59EF59F159F259F459F75A005A045A0C5A0D +5A0E5A125A135A1E5A235A245A275A285A2A5A2D5A305A445A455A475A485A4C +5A505A555A5E5A635A655A675A6D5A775A7A5A7B5A7E5A8B5A905A935A965A99 +5A9C5A9E5A9F5AA05AA25AA75AAC5AB15AB25AB35AB55AB85ABA5ABB5ABF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005AC45AC65AC85ACF5ADA5ADC5AE05AE55AEA5AEE5AF55AF65AFD5B005B01 +5B085B175B345B195B1B5B1D5B215B255B2D5B385B415B4B5B4C5B525B565B5E +5B685B6E5B6F5B7C5B7D5B7E5B7F5B815B845B865B8A5B8E5B905B915B935B94 +5B965BA85BA95BAC5BAD5BAF5BB15BB25BB75BBA5BBC5BC05BC15BCD5BCF5BD6 +5BD75BD85BD95BDA5BE05BEF5BF15BF45BFD5C0C5C175C1E5C1F5C235C265C29 +5C2B5C2C5C2E5C305C325C355C365C595C5A5C5C5C625C635C675C685C690000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C6D5C705C745C755C7A5C7B5C7C5C7D5C875C885C8A5C8F5C925C9D5C9F +5CA05CA25CA35CA65CAA5CB25CB45CB55CBA5CC95CCB5CD25CDD5CD75CEE5CF1 +5CF25CF45D015D065D0D5D125D2B5D235D245D265D275D315D345D395D3D5D3F +5D425D435D465D485D555D515D595D4A5D5F5D605D615D625D645D6A5D6D5D70 +5D795D7A5D7E5D7F5D815D835D885D8A5D925D935D945D955D995D9B5D9F5DA0 +5DA75DAB5DB05DB45DB85DB95DC35DC75DCB5DD05DCE5DD85DD95DE05DE40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005DE95DF85DF95E005E075E0D5E125E145E155E185E1F5E205E2E5E285E32 +5E355E3E5E4B5E505E495E515E565E585E5B5E5C5E5E5E685E6A5E6B5E6C5E6D +5E6E5E705E805E8B5E8E5EA25EA45EA55EA85EAA5EAC5EB15EB35EBD5EBE5EBF +5EC65ECC5ECB5ECE5ED15ED25ED45ED55EDC5EDE5EE55EEB5F025F065F075F08 +5F0E5F195F1C5F1D5F215F225F235F245F285F2B5F2C5F2E5F305F345F365F3B +5F3D5F3F5F405F445F455F475F4D5F505F545F585F5B5F605F635F645F670000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F6F5F725F745F755F785F7A5F7D5F7E5F895F8D5F8F5F965F9C5F9D5FA2 +5FA75FAB5FA45FAC5FAF5FB05FB15FB85FC45FC75FC85FC95FCB5FD05FD15FD2 +5FD35FD45FDE5FE15FE25FE85FE95FEA5FEC5FED5FEE5FEF5FF25FF35FF65FFA +5FFC6007600A600D6013601460176018601A601F6024602D6033603560406047 +60486049604C6051605460566057605D606160676071607E607F608260866088 +608A608E6091609360956098609D609E60A260A460A560A860B060B160B70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060BB60BE60C260C460C860C960CA60CB60CE60CF60D460D560D960DB60DD +60DE60E260E560F260F560F860FC60FD61026107610A610C6110611161126113 +6114611661176119611C611E6122612A612B6130613161356136613761396141 +614561466149615E6160616C61726178617B617C617F6180618161836184618B +618D6192619361976198619C619D619F61A061A561A861AA61AD61B861B961BC +61C061C161C261CE61CF61D561DC61DD61DE61DF61E161E261E761E961E50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000061EC61ED61EF620162036204620762136215621C62206222622362276229 +622B6239623D6242624362446246624C62506251625262546256625A625C6264 +626D626F6273627A627D628D628E628F629062A662A862B362B662B762BA62BE +62BF62C462CE62D562D662DA62EA62F262F462FC62FD63036304630A630B630D +63106313631663186329632A632D633563366339633C63416342634363446346 +634A634B634E6352635363546358635B63656366636C636D6371637463750000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +40 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006378637C637D637F638263846387638A6390639463956399639A639E63A4 +63A663AD63AE63AF63BD63C163C563C863CE63D163D363D463D563DC63E063E5 +63EA63EC63F263F363F563F863F96409640A6410641264146418641E64206422 +642464256429642A642F64306435643D643F644B644F6451645264536454645A +645B645C645D645F646064616463646D64736474647B647D64856487648F6490 +649164986499649B649D649F64A164A364A664A864AC64B364BD64BE64BF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +41 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064C464C964CA64CB64CC64CE64D064D164D564D764E464E564E964EA64ED +64F064F564F764FB64FF6501650465086509650A650F6513651465166519651B +651E651F652265266529652E6531653A653C653D654365476549655065526554 +655F65606567656B657A657D65816585658A659265956598659D65A065A365A6 +65AE65B265B365B465BF65C265C865C965CE65D065D465D665D865DF65F065F2 +65F465F565F965FE65FF6600660466086609660D6611661266156616661D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +42 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000661E662166226623662466266629662A662B662C662E6630663166336639 +6637664066456646664A664C6651664E665766586659665B665C6660666166FB +666A666B666C667E66736675667F667766786679667B6680667C668B668C668D +669066926699669A669B669C669F66A066A466AD66B166B266B566BB66BF66C0 +66C266C366C866CC66CE66CF66D466DB66DF66E866EB66EC66EE66FA67056707 +670E67136719671C672067226733673E674567476748674C67546755675D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +43 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006766676C676E67746776677B67816784678E678F67916793679667986799 +679B67B067B167B267B567BB67BC67BD67F967C067C267C367C567C867C967D2 +67D767D967DC67E167E667F067F267F667F7685268146819681D681F68286827 +682C682D682F683068316833683B683F68446845684A684C685568576858685B +686B686E686F68706871687268756879687A687B687C68826884688668886896 +6898689A689C68A168A368A568A968AA68AE68B268BB68C568C868CC68CF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068D068D168D368D668D968DC68DD68E568E868EA68EB68EC68ED68F068F1 +68F568F668FB68FC68FD69066909690A69106911691369166917693169336935 +6938693B694269456949694E6957695B696369646965696669686969696C6970 +69716972697A697B697F6980698D69926996699869A169A569A669A869AB69AD +69AF69B769B869BA69BC69C569C869D169D669D769E269E569EE69EF69F169F3 +69F569FE6A006A016A036A0F6A116A156A1A6A1D6A206A246A286A306A320000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +45 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006A346A376A3B6A3E6A3F6A456A466A496A4A6A4E6A506A516A526A556A56 +6A5B6A646A676A6A6A716A736A7E6A816A836A866A876A896A8B6A916A9B6A9D +6A9E6A9F6AA56AAB6AAF6AB06AB16AB46ABD6ABE6ABF6AC66AC96AC86ACC6AD0 +6AD46AD56AD66ADC6ADD6AE46AE76AEC6AF06AF16AF26AFC6AFD6B026B036B06 +6B076B096B0F6B106B116B176B1B6B1E6B246B286B2B6B2C6B2F6B356B366B3B +6B3F6B466B4A6B4D6B526B566B586B5D6B606B676B6B6B6E6B706B756B7D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +46 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B7E6B826B856B976B9B6B9F6BA06BA26BA36BA86BA96BAC6BAD6BAE6BB0 +6BB86BB96BBD6BBE6BC36BC46BC96BCC6BD66BDA6BE16BE36BE66BE76BEE6BF1 +6BF76BF96BFF6C026C046C056C096C0D6C0E6C106C126C196C1F6C266C276C28 +6C2C6C2E6C336C356C366C3A6C3B6C3F6C4A6C4B6C4D6C4F6C526C546C596C5B +6C5C6C6B6C6D6C6F6C746C766C786C796C7B6C856C866C876C896C946C956C97 +6C986C9C6C9F6CB06CB26CB46CC26CC66CCD6CCF6CD06CD16CD26CD46CD60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +47 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006CDA6CDC6CE06CE76CE96CEB6CEC6CEE6CF26CF46D046D076D0A6D0E6D0F +6D116D136D1A6D266D276D286C676D2E6D2F6D316D396D3C6D3F6D576D5E6D5F +6D616D656D676D6F6D706D7C6D826D876D916D926D946D966D976D986DAA6DAC +6DB46DB76DB96DBD6DBF6DC46DC86DCA6DCE6DCF6DD66DDB6DDD6DDF6DE06DE2 +6DE56DE96DEF6DF06DF46DF66DFC6E006E046E1E6E226E276E326E366E396E3B +6E3C6E446E456E486E496E4B6E4F6E516E526E536E546E576E5C6E5D6E5E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +48 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006E626E636E686E736E7B6E7D6E8D6E936E996EA06EA76EAD6EAE6EB16EB3 +6EBB6EBF6EC06EC16EC36EC76EC86ECA6ECD6ECE6ECF6EEB6EED6EEE6EF96EFB +6EFD6F046F086F0A6F0C6F0D6F166F186F1A6F1B6F266F296F2A6F2F6F306F33 +6F366F3B6F3C6F2D6F4F6F516F526F536F576F596F5A6F5D6F5E6F616F626F68 +6F6C6F7D6F7E6F836F876F886F8B6F8C6F8D6F906F926F936F946F966F9A6F9F +6FA06FA56FA66FA76FA86FAE6FAF6FB06FB56FB66FBC6FC56FC76FC86FCA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +49 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FDA6FDE6FE86FE96FF06FF56FF96FFC6FFD7000700570067007700D7017 +70207023702F703470377039703C7043704470487049704A704B70547055705D +705E704E70647065706C706E70757076707E7081708570867094709570967097 +7098709B70A470AB70B070B170B470B770CA70D170D370D470D570D670D870DC +70E470FA71037104710571067107710B710C710F711E7120712B712D712F7130 +713171387141714571467147714A714B715071527157715A715C715E71600000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000071687179718071857187718C7192719A719B71A071A271AF71B071B271B3 +71BA71BF71C071C171C471CB71CC71D371D671D971DA71DC71F871FE72007207 +7208720972137217721A721D721F7224722B722F723472387239724172427243 +7245724E724F7250725372557256725A725C725E726072637268726B726E726F +727172777278727B727C727F72847289728D728E7293729B72A872AD72AE72B1 +72B472BE72C172C772C972CC72D572D672D872DF72E572F372F472FA72FB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072FE7302730473057307730B730D7312731373187319731E732273247327 +7328732C733173327335733A733B733D7343734D7350735273567358735D735E +735F7360736673677369736B736C736E736F737173777379737C738073817383 +73857386738E73907393739573977398739C739E739F73A073A273A573A673AA +73AB73AD73B573B773B973BC73BD73BF73C573C673C973CB73CC73CF73D273D3 +73D673D973DD73E173E373E673E773E973F473F573F773F973FA73FB73FD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000073FF7400740174047407740A7411741A741B7424742674287429742A742B +742C742D742E742F74307431743974407443744474467447744B744D74517452 +7457745D7462746674677468746B746D746E7471747274807481748574867487 +7489748F74907491749274987499749A749C749F74A074A174A374A674A874A9 +74AA74AB74AE74AF74B174B274B574B974BB74BF74C874C974CC74D074D374D8 +74DA74DB74DE74DF74E474E874EA74EB74EF74F474FA74FB74FC74FF75060000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075127516751775207521752475277529752A752F75367539753D753E753F +7540754375477548754E755075527557755E755F7561756F75717579757A757B +757C757D757E7581758575907592759375957599759C75A275A475B475BA75BF +75C075C175C475C675CC75CE75CF75D775DC75DF75E075E175E475E775EC75EE +75EF75F175F9760076027603760476077608760A760C760F7612761376157616 +7619761B761C761D761E7623762576267629762D763276337635763876390000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000763A763C764A764076417643764476457649764B76557659765F76647665 +766D766E766F7671767476817685768C768D7695769B769C769D769F76A076A2 +76A376A476A576A676A776A876AA76AD76BD76C176C576C976CB76CC76CE76D4 +76D976E076E676E876EC76F076F176F676F976FC77007706770A770E77127714 +771577177719771A771C77227728772D772E772F7734773577367739773D773E +774277457746774A774D774E774F775277567757775C775E775F776077620000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077647767776A776C7770777277737774777A777D77807784778C778D7794 +77957796779A779F77A277A777AA77AE77AF77B177B577BE77C377C977D177D2 +77D577D977DE77DF77E077E477E677EA77EC77F077F177F477F877FB78057806 +7809780D780E7811781D782178227823782D782E783078357837784378447847 +7848784C784E7852785C785E78607861786378647868786A786E787A787E788A +788F7894789878A1789D789E789F78A478A878AC78AD78B078B178B278B30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078BB78BD78BF78C778C878C978CC78CE78D278D378D578D678E478DB78DF +78E078E178E678EA78F278F3790078F678F778FA78FB78FF7906790C7910791A +791C791E791F7920792579277929792D793179347935793B793D793F79447945 +7946794A794B794F795179547958795B795C79677969796B79727979797B797C +797E798B798C799179937994799579967998799B799C79A179A879A979AB79AF +79B179B479B879BB79C279C479C779C879CA79CF79D479D679DA79DD79DE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079E079E279E579EA79EB79ED79F179F879FC7A027A037A077A097A0A7A0C +7A117A157A1B7A1E7A217A277A2B7A2D7A2F7A307A347A357A387A397A3A7A44 +7A457A477A487A4C7A557A567A597A5C7A5D7A5F7A607A657A677A6A7A6D7A75 +7A787A7E7A807A827A857A867A8A7A8B7A907A917A947A9E7AA07AA37AAC7AB3 +7AB57AB97ABB7ABC7AC67AC97ACC7ACE7AD17ADB7AE87AE97AEB7AEC7AF17AF4 +7AFB7AFD7AFE7B077B147B1F7B237B277B297B2A7B2B7B2D7B2E7B2F7B300000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +52 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007B317B347B3D7B3F7B407B417B477B4E7B557B607B647B667B697B6A7B6D +7B6F7B727B737B777B847B897B8E7B907B917B967B9B7B9E7BA07BA57BAC7BAF +7BB07BB27BB57BB67BBA7BBB7BBC7BBD7BC27BC57BC87BCA7BD47BD67BD77BD9 +7BDA7BDB7BE87BEA7BF27BF47BF57BF87BF97BFA7BFC7BFE7C017C027C037C04 +7C067C097C0B7C0C7C0E7C0F7C197C1B7C207C257C267C287C2C7C317C337C34 +7C367C397C3A7C467C4A7C557C517C527C537C597C5A7C5B7C5C7C5D7C5E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007C617C637C677C697C6D7C6E7C707C727C797C7C7C7D7C867C877C8F7C94 +7C9E7CA07CA67CB07CB67CB77CBA7CBB7CBC7CBF7CC47CC77CC87CC97CCD7CCF +7CD37CD47CD57CD77CD97CDA7CDD7CE67CE97CEB7CF57D037D077D087D097D0F +7D117D127D137D167D1D7D1E7D237D267D2A7D2D7D317D3C7D3D7D3E7D407D41 +7D477D487D4D7D517D537D577D597D5A7D5C7D5D7D657D677D6A7D707D787D7A +7D7B7D7F7D817D827D837D857D867D887D8B7D8C7D8D7D917D967D977D9D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D9E7DA67DA77DAA7DB37DB67DB77DB97DC27DC37DC47DC57DC67DCC7DCD +7DCE7DD77DD97E007DE27DE57DE67DEA7DEB7DED7DF17DF57DF67DF97DFA7E08 +7E107E117E157E177E1C7E1D7E207E277E287E2C7E2D7E2F7E337E367E3F7E44 +7E457E477E4E7E507E527E587E5F7E617E627E657E6B7E6E7E6F7E737E787E7E +7E817E867E877E8A7E8D7E917E957E987E9A7E9D7E9E7F3C7F3B7F3D7F3E7F3F +7F437F447F477F4F7F527F537F5B7F5C7F5D7F617F637F647F657F667F6D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +55 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007F717F7D7F7E7F7F7F807F8B7F8D7F8F7F907F917F967F977F9C7FA17FA2 +7FA67FAA7FAD7FB47FBC7FBF7FC07FC37FC87FCE7FCF7FDB7FDF7FE37FE57FE8 +7FEC7FEE7FEF7FF27FFA7FFD7FFE7FFF80078008800A800D800E800F80118013 +80148016801D801E801F802080248026802C802E80308034803580378039803A +803C803E80408044806080648066806D8071807580818088808E809C809E80A6 +80A780AB80B880B980C880CD80CF80D280D480D580D780D880E080ED80EE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000080F080F280F380F680F980FA80FE8103810B811681178118811C811E8120 +81248127812C81308135813A813C81458147814A814C81528157816081618167 +81688169816D816F817781818190818481858186818B818E81968198819B819E +81A281AE81B281B481BB81CB81C381C581CA81CE81CF81D581D781DB81DD81DE +81E181E481EB81EC81F081F181F281F581F681F881F981FD81FF82008203820F +821382148219821A821D82218222822882328234823A82438244824582460000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000824B824E824F82518256825C826082638267826D8274827B827D827F8280 +82818283828482878289828A828E8291829482968298829A829B82A082A182A3 +82A482A782A882A982AA82AE82B082B282B482B782BA82BC82BE82BF82C682D0 +82D582DA82E082E282E482E882EA82ED82EF82F682F782FD82FE830083018307 +8308830A830B8354831B831D831E831F83218322832C832D832E833083338337 +833A833C833D8342834383448347834D834E8351835583568357837083780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +58 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000837D837F8380838283848386838D83928394839583988399839B839C839D +83A683A783A983AC83BE83BF83C083C783C983CF83D083D183D483DD835383E8 +83EA83F683F883F983FC84018406840A840F84118415841983AD842F84398445 +84478448844A844D844F84518452845684588459845A845C8460846484658467 +846A84708473847484768478847C847D84818485849284938495849E84A684A8 +84A984AA84AF84B184B484BA84BD84BE84C084C284C784C884CC84CF84D30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000084DC84E784EA84EF84F084F184F284F7853284FA84FB84FD850285038507 +850C850E8510851C851E85228523852485258527852A852B852F853385348536 +853F8546854F855085518552855385568559855C855D855E855F856085618562 +8564856B856F8579857A857B857D857F8581858585868589858B858C858F8593 +8598859D859F85A085A285A585A785B485B685B785B885BC85BD85BE85BF85C2 +85C785CA85CB85CE85AD85D885DA85DF85E085E685E885ED85F385F685FC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000085FF860086048605860D860E86108611861286188619861B861E86218627 +862986368638863A863C863D864086428646865286538656865786588659865D +866086618662866386648669866C866F867586768677867A868D869186968698 +869A869C86A186A686A786A886AD86B186B386B486B586B786B886B986BF86C0 +86C186C386C586D186D286D586D786DA86DC86E086E386E586E7868886FA86FC +86FD870487058707870B870E870F8710871387148719871E871F872187230000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008728872E872F873187328739873A873C873D873E874087438745874D8758 +875D876187648765876F87718772877B8783878487858786878787888789878B +878C879087938795879787988799879E87A087A387A787AC87AD87AE87B187B5 +87BE87BF87C187C887C987CA87CE87D587D687D987DA87DC87DF87E287E387E4 +87EA87EB87ED87F187F387F887FA87FF8801880388068809880A880B88108819 +8812881388148818881A881B881C881E881F8828882D882E8830883288350000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000883A883C88418843884588488849884A884B884E8851885588568858885A +885C885F88608864886988718879887B88808898889A889B889C889F88A088A8 +88AA88BA88BD88BE88C088CA88CB88CC88CD88CE88D188D288D388DB88DE88E7 +88EF88F088F188F588F789018906890D890E890F8915891689188919891A891C +892089268927892889308931893289358939893A893E89408942894589468949 +894F89528957895A895B895C896189628963896B896E897089738975897A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000897B897C897D8989898D899089948995899B899C899F89A089A589B089B4 +89B589B689B789BC89D489D589D689D789D889E589E989EB89ED89F189F389F6 +89F989FD89FF8A048A058A078A0F8A118A128A148A158A1E8A208A228A248A26 +8A2B8A2C8A2F8A358A378A3D8A3E8A408A438A458A478A498A4D8A4E8A538A56 +8A578A588A5C8A5D8A618A658A678A758A768A778A798A7A8A7B8A7E8A7F8A80 +8A838A868A8B8A8F8A908A928A968A978A998A9F8AA78AA98AAE8AAF8AB30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AB68AB78ABB8ABE8AC38AC68AC88AC98ACA8AD18AD38AD48AD58AD78ADD +8ADF8AEC8AF08AF48AF58AF68AFC8AFF8B058B068B0B8B118B1C8B1E8B1F8B0A +8B2D8B308B378B3C8B428B438B448B458B468B488B528B538B548B598B4D8B5E +8B638B6D8B768B788B798B7C8B7E8B818B848B858B8B8B8D8B8F8B948B958B9C +8B9E8B9F8C388C398C3D8C3E8C458C478C498C4B8C4F8C518C538C548C578C58 +8C5B8C5D8C598C638C648C668C688C698C6D8C738C758C768C7B8C7E8C860000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008C878C8B8C908C928C938C998C9B8C9C8CA48CB98CBA8CC58CC68CC98CCB +8CCF8CD68CD58CD98CDD8CE18CE88CEC8CEF8CF08CF28CF58CF78CF88CFE8CFF +8D018D038D098D128D178D1B8D658D698D6C8D6E8D7F8D828D848D888D8D8D90 +8D918D958D9E8D9F8DA08DA68DAB8DAC8DAF8DB28DB58DB78DB98DBB8DC08DC5 +8DC68DC78DC88DCA8DCE8DD18DD48DD58DD78DD98DE48DE58DE78DEC8DF08DBC +8DF18DF28DF48DFD8E018E048E058E068E0B8E118E148E168E208E218E220000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008E238E268E278E318E338E368E378E388E398E3D8E408E418E4B8E4D8E4E +8E4F8E548E5B8E5C8E5D8E5E8E618E628E698E6C8E6D8E6F8E708E718E798E7A +8E7B8E828E838E898E908E928E958E9A8E9B8E9D8E9E8EA28EA78EA98EAD8EAE +8EB38EB58EBA8EBB8EC08EC18EC38EC48EC78ECF8ED18ED48EDC8EE88EEE8EF0 +8EF18EF78EF98EFA8EED8F008F028F078F088F0F8F108F168F178F188F1E8F20 +8F218F238F258F278F288F2C8F2D8F2E8F348F358F368F378F3A8F408F410000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008F438F478F4F8F518F528F538F548F558F588F5D8F5E8F658F9D8FA08FA1 +8FA48FA58FA68FB58FB68FB88FBE8FC08FC18FC68FCA8FCB8FCD8FD08FD28FD3 +8FD58FE08FE38FE48FE88FEE8FF18FF58FF68FFB8FFE900290049008900C9018 +901B90289029902F902A902C902D903390349037903F90439044904C905B905D +906290669067906C90709074907990859088908B908C908E9090909590979098 +9099909B90A090A190A290A590B090B290B390B490B690BD90CC90BE90C30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090C490C590C790C890D590D790D890D990DC90DD90DF90E590D290F690EB +90EF90F090F490FE90FF91009104910591069108910D91109114911691179118 +911A911C911E912091259122912391279129912E912F91319134913691379139 +913A913C913D914391479148914F915391579159915A915B916191649167916D +91749179917A917B9181918391859186918A918E91919193919491959198919E +91A191A691A891AC91AD91AE91B091B191B291B391B691BB91BC91BD91BF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000091C291C391C591D391D491D791D991DA91DE91E491E591E991EA91EC91ED +91EE91EF91F091F191F791F991FB91FD9200920192049205920692079209920A +920C92109212921392169218921C921D92239224922592269228922E922F9230 +92339235923692389239923A923C923E92409242924392469247924A924D924E +924F925192589259925C925D926092619265926792689269926E926F92709275 +9276927792789279927B927C927D927F92889289928A928D928E929292970000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009299929F92A092A492A592A792A892AB92AF92B292B692B892BA92BB92BC +92BD92BF92C092C192C292C392C592C692C792C892CB92CC92CD92CE92D092D3 +92D592D792D892D992DC92DD92DF92E092E192E392E592E792E892EC92EE92F0 +92F992FB92FF930093029308930D931193149315931C931D931E931F93219324 +932593279329932A933393349336933793479348934993509351935293559357 +9358935A935E9364936593679369936A936D936F937093719373937493760000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000937A937D937F9380938193829388938A938B938D938F939293959398939B +939E93A193A393A493A693A893AB93B493B593B693BA93A993C193C493C593C6 +93C793C993CA93CB93CC93CD93D393D993DC93DE93DF93E293E693E793F993F7 +93F893FA93FB93FD94019402940494089409940D940E940F941594169417941F +942E942F9431943294339434943B943F943D944394459448944A944C94559459 +945C945F946194639468946B946D946E946F9471947294849483957895790000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000957E95849588958C958D958E959D959E959F95A195A695A995AB95AC95B4 +95B695BA95BD95BF95C695C895C995CB95D095D195D295D395D995DA95DD95DE +95DF95E095E495E6961D961E9622962496259626962C96319633963796389639 +963A963C963D9641965296549656965796589661966E9674967B967C967E967F +9681968296839684968996919696969A969D969F96A496A596A696A996AE96AF +96B396BA96CA96D25DB296D896DA96DD96DE96DF96E996EF96F196FA97020000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000970397059709971A971B971D97219722972397289731973397419743974A +974E974F975597579758975A975B97639767976A976E9773977697779778977B +977D977F978097899795979697979799979A979E979F97A297AC97AE97B197B2 +97B597B697B897B997BA97BC97BE97BF97C197C497C597C797C997CA97CC97CD +97CE97D097D197D497D797D897D997DD97DE97E097DB97E197E497EF97F197F4 +97F797F897FA9807980A9819980D980E98149816981C981E9820982398260000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +68 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000982B982E982F98309832983398359825983E98449847984A985198529853 +985698579859985A9862986398659866986A986C98AB98AD98AE98B098B498B7 +98B898BA98BB98BF98C298C598C898CC98E198E398E598E698E798EA98F398F6 +9902990799089911991599169917991A991B991C991F992299269927992B9931 +99329933993499359939993A993B993C99409941994699479948994D994E9954 +99589959995B995C995E995F9960999B999D999F99A699B099B199B299B50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000099B999BA99BD99BF99C399C999D399D499D999DA99DC99DE99E799EA99EB +99EC99F099F499F599F999FD99FE9A029A039A049A0B9A0C9A109A119A169A1E +9A209A229A239A249A279A2D9A2E9A339A359A369A389A479A419A449A4A9A4B +9A4C9A4E9A519A549A569A5D9AAA9AAC9AAE9AAF9AB29AB49AB59AB69AB99ABB +9ABE9ABF9AC19AC39AC69AC89ACE9AD09AD29AD59AD69AD79ADB9ADC9AE09AE4 +9AE59AE79AE99AEC9AF29AF39AF59AF99AFA9AFD9AFF9B009B019B029B030000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B049B059B089B099B0B9B0C9B0D9B0E9B109B129B169B199B1B9B1C9B20 +9B269B2B9B2D9B339B349B359B379B399B3A9B3D9B489B4B9B4C9B559B569B57 +9B5B9B5E9B619B639B659B669B689B6A9B6B9B6C9B6D9B6E9B739B759B779B78 +9B799B7F9B809B849B859B869B879B899B8A9B8B9B8D9B8F9B909B949B9A9B9D +9B9E9BA69BA79BA99BAC9BB09BB19BB29BB79BB89BBB9BBC9BBE9BBF9BC19BC7 +9BC89BCE9BD09BD79BD89BDD9BDF9BE59BE79BEA9BEB9BEF9BF39BF79BF80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009BF99BFA9BFD9BFF9C009C029C0B9C0F9C119C169C189C199C1A9C1C9C1E +9C229C239C269C279C289C299C2A9C319C359C369C379C3D9C419C439C449C45 +9C499C4A9C4E9C4F9C509C539C549C569C589C5B9C5D9C5E9C5F9C639C699C6A +9C5C9C6B9C689C6E9C709C729C759C779C7B9CE69CF29CF79CF99D0B9D029D11 +9D179D189D1C9D1D9D1E9D2F9D309D329D339D349D3A9D3C9D459D3D9D429D43 +9D479D4A9D539D549D5F9D639D629D659D699D6A9D6B9D709D769D779D7B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D7C9D7E9D839D849D869D8A9D8D9D8E9D929D939D959D969D979D989DA1 +9DAA9DAC9DAE9DB19DB59DB99DBC9DBF9DC39DC79DC99DCA9DD49DD59DD69DD7 +9DDA9DDE9DDF9DE09DE59DE79DE99DEB9DEE9DF09DF39DF49DFE9E0A9E029E07 +9E0E9E109E119E129E159E169E199E1C9E1D9E7A9E7B9E7C9E809E829E839E84 +9E859E879E8E9E8F9E969E989E9B9E9E9EA49EA89EAC9EAE9EAF9EB09EB39EB4 +9EB59EC69EC89ECB9ED59EDF9EE49EE79EEC9EED9EEE9EF09EF19EF29EF50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009EF89EFF9F029F039F099F0F9F109F119F129F149F169F179F199F1A9F1B +9F1F9F229F269F2A9F2B9F2F9F319F329F349F379F399F3A9F3C9F3D9F3F9F41 +9F439F449F459F469F479F539F559F569F579F589F5A9F5D9F5E9F689F699F6D +9F6E9F6F9F709F719F739F759F7A9F7D9F8F9F909F919F929F949F969F979F9E +9FA19FA29FA39FA5000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/koi8-r.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/koi8-r.enc new file mode 100644 index 00000000..49bf2ea6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/koi8-r.enc @@ -0,0 +1,20 @@ +# Encoding file: koi8-r, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +25002502250C251025142518251C2524252C2534253C258025842588258C2590 +259125922593232025A02219221A22482264226500A0232100B000B200B700F7 +25502551255204512553255425552556255725582559255A255B255C255D255E +255F25602561040125622563256425652566256725682569256A256B256C00A9 +044E0430043104460434043504440433044504380439043A043B043C043D043E +043F044F044004410442044304360432044C044B04370448044D04490447044A +042E0410041104260414041504240413042504180419041A041B041C041D041E +041F042F042004210422042304160412042C042B04170428042D04290427042A diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/koi8-u.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/koi8-u.enc new file mode 100644 index 00000000..e4eeb845 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/koi8-u.enc @@ -0,0 +1,20 @@ +# Encoding file: koi8-u, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +25002502250C251025142518251C2524252C2534253C258025842588258C2590 +259125922593232025A02219221A22482264226500A0232100B000B200B700F7 +25502551255204510454255404560457255725582559255A255B0491255D255E +255F25602561040104032563040604072566256725682569256A0490256C00A9 +044E0430043104460434043504440433044504380439043A043B043C043D043E +043F044F044004410442044304360432044C044B04370448044D04490447044A +042E0410041104260414041504240413042504180419041A041B041C041D041E +041F042F042004210422042304160412042C042B04170428042D04290427042A diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/ksc5601.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/ksc5601.enc new file mode 100644 index 00000000..bec61d0f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/ksc5601.enc @@ -0,0 +1,1516 @@ +# Encoding file: ksc5601, double-byte +D +233F 0 89 +21 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300200B72025202600A8300300AD20152225FF3C223C20182019 +201C201D3014301530083009300A300B300C300D300E300F3010301100B100D7 +00F7226022642265221E223400B0203220332103212BFFE0FFE1FFE526422640 +222022A52312220222072261225200A7203B2606260525CB25CF25CE25C725C6 +25A125A025B325B225BD25BC219221902191219321943013226A226B221A223D +221D2235222B222C2208220B2286228722822283222A222922272228FFE20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +22 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000021D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF +02D0222E2211220F00A42109203025C125C025B725B626642660266126652667 +2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E +261C261E00B62020202121952197219921962198266D2669266A266C327F321C +211633C7212233C233D821210000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +23 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FF04FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFFE6FF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +24 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000313131323133313431353136313731383139313A313B313C313D313E313F +3140314131423143314431453146314731483149314A314B314C314D314E314F +3150315131523153315431553156315731583159315A315B315C315D315E315F +3160316131623163316431653166316731683169316A316B316C316D316E316F +3170317131723173317431753176317731783179317A317B317C317D317E317F +3180318131823183318431853186318731883189318A318B318C318D318E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +25 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000217021712172217321742175217621772178217900000000000000000000 +2160216121622163216421652166216721682169000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000025002502250C251025182514251C252C25242534253C25012503250F2513 +251B251725232533252B253B254B2520252F25282537253F251D253025252538 +254225122511251A251925162515250E250D251E251F25212522252625272529 +252A252D252E25312532253525362539253A253D253E25402541254325442545 +2546254725482549254A00000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +27 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00003395339633972113339833C433A333A433A533A63399339A339B339C339D +339E339F33A033A133A233CA338D338E338F33CF3388338933C833A733A833B0 +33B133B233B333B433B533B633B733B833B93380338133823383338433BA33BB +33BC33BD33BE33BF33903391339233933394212633C033C1338A338B338C33D6 +33C533AD33AE33AF33DB33A933AA33AB33AC33DD33D033D333C333C933DC33C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +28 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000C600D000AA0126000001320000013F014100D8015200BA00DE0166014A +00003260326132623263326432653266326732683269326A326B326C326D326E +326F3270327132723273327432753276327732783279327A327B24D024D124D2 +24D324D424D524D624D724D824D924DA24DB24DC24DD24DE24DF24E024E124E2 +24E324E424E524E624E724E824E9246024612462246324642465246624672468 +2469246A246B246C246D246E00BD2153215400BC00BE215B215C215D215E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +29 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000E6011100F001270131013301380140014200F8015300DF00FE0167014B +01493200320132023203320432053206320732083209320A320B320C320D320E +320F3210321132123213321432153216321732183219321A321B249C249D249E +249F24A024A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE +24AF24B024B124B224B324B424B5247424752476247724782479247A247B247C +247D247E247F24802481248200B900B200B32074207F20812082208320840000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AC00AC01AC04AC07AC08AC09AC0AAC10AC11AC12AC13AC14AC15AC16AC17 +AC19AC1AAC1BAC1CAC1DAC20AC24AC2CAC2DAC2FAC30AC31AC38AC39AC3CAC40 +AC4BAC4DAC54AC58AC5CAC70AC71AC74AC77AC78AC7AAC80AC81AC83AC84AC85 +AC86AC89AC8AAC8BAC8CAC90AC94AC9CAC9DAC9FACA0ACA1ACA8ACA9ACAAACAC +ACAFACB0ACB8ACB9ACBBACBCACBDACC1ACC4ACC8ACCCACD5ACD7ACE0ACE1ACE4 +ACE7ACE8ACEAACECACEFACF0ACF1ACF3ACF5ACF6ACFCACFDAD00AD04AD060000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +31 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AD0CAD0DAD0FAD11AD18AD1CAD20AD29AD2CAD2DAD34AD35AD38AD3CAD44 +AD45AD47AD49AD50AD54AD58AD61AD63AD6CAD6DAD70AD73AD74AD75AD76AD7B +AD7CAD7DAD7FAD81AD82AD88AD89AD8CAD90AD9CAD9DADA4ADB7ADC0ADC1ADC4 +ADC8ADD0ADD1ADD3ADDCADE0ADE4ADF8ADF9ADFCADFFAE00AE01AE08AE09AE0B +AE0DAE14AE30AE31AE34AE37AE38AE3AAE40AE41AE43AE45AE46AE4AAE4CAE4D +AE4EAE50AE54AE56AE5CAE5DAE5FAE60AE61AE65AE68AE69AE6CAE70AE780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +32 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AE79AE7BAE7CAE7DAE84AE85AE8CAEBCAEBDAEBEAEC0AEC4AECCAECDAECF +AED0AED1AED8AED9AEDCAEE8AEEBAEEDAEF4AEF8AEFCAF07AF08AF0DAF10AF2C +AF2DAF30AF32AF34AF3CAF3DAF3FAF41AF42AF43AF48AF49AF50AF5CAF5DAF64 +AF65AF79AF80AF84AF88AF90AF91AF95AF9CAFB8AFB9AFBCAFC0AFC7AFC8AFC9 +AFCBAFCDAFCEAFD4AFDCAFE8AFE9AFF0AFF1AFF4AFF8B000B001B004B00CB010 +B014B01CB01DB028B044B045B048B04AB04CB04EB053B054B055B057B0590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +33 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B05DB07CB07DB080B084B08CB08DB08FB091B098B099B09AB09CB09FB0A0 +B0A1B0A2B0A8B0A9B0ABB0ACB0ADB0AEB0AFB0B1B0B3B0B4B0B5B0B8B0BCB0C4 +B0C5B0C7B0C8B0C9B0D0B0D1B0D4B0D8B0E0B0E5B108B109B10BB10CB110B112 +B113B118B119B11BB11CB11DB123B124B125B128B12CB134B135B137B138B139 +B140B141B144B148B150B151B154B155B158B15CB160B178B179B17CB180B182 +B188B189B18BB18DB192B193B194B198B19CB1A8B1CCB1D0B1D4B1DCB1DD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +34 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B1DFB1E8B1E9B1ECB1F0B1F9B1FBB1FDB204B205B208B20BB20CB214B215 +B217B219B220B234B23CB258B25CB260B268B269B274B275B27CB284B285B289 +B290B291B294B298B299B29AB2A0B2A1B2A3B2A5B2A6B2AAB2ACB2B0B2B4B2C8 +B2C9B2CCB2D0B2D2B2D8B2D9B2DBB2DDB2E2B2E4B2E5B2E6B2E8B2EBB2ECB2ED +B2EEB2EFB2F3B2F4B2F5B2F7B2F8B2F9B2FAB2FBB2FFB300B301B304B308B310 +B311B313B314B315B31CB354B355B356B358B35BB35CB35EB35FB364B3650000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +35 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B367B369B36BB36EB370B371B374B378B380B381B383B384B385B38CB390 +B394B3A0B3A1B3A8B3ACB3C4B3C5B3C8B3CBB3CCB3CEB3D0B3D4B3D5B3D7B3D9 +B3DBB3DDB3E0B3E4B3E8B3FCB410B418B41CB420B428B429B42BB434B450B451 +B454B458B460B461B463B465B46CB480B488B49DB4A4B4A8B4ACB4B5B4B7B4B9 +B4C0B4C4B4C8B4D0B4D5B4DCB4DDB4E0B4E3B4E4B4E6B4ECB4EDB4EFB4F1B4F8 +B514B515B518B51BB51CB524B525B527B528B529B52AB530B531B534B5380000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +36 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B540B541B543B544B545B54BB54CB54DB550B554B55CB55DB55FB560B561 +B5A0B5A1B5A4B5A8B5AAB5ABB5B0B5B1B5B3B5B4B5B5B5BBB5BCB5BDB5C0B5C4 +B5CCB5CDB5CFB5D0B5D1B5D8B5ECB610B611B614B618B625B62CB634B648B664 +B668B69CB69DB6A0B6A4B6ABB6ACB6B1B6D4B6F0B6F4B6F8B700B701B705B728 +B729B72CB72FB730B738B739B73BB744B748B74CB754B755B760B764B768B770 +B771B773B775B77CB77DB780B784B78CB78DB78FB790B791B792B796B7970000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +37 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B798B799B79CB7A0B7A8B7A9B7ABB7ACB7ADB7B4B7B5B7B8B7C7B7C9B7EC +B7EDB7F0B7F4B7FCB7FDB7FFB800B801B807B808B809B80CB810B818B819B81B +B81DB824B825B828B82CB834B835B837B838B839B840B844B851B853B85CB85D +B860B864B86CB86DB86FB871B878B87CB88DB8A8B8B0B8B4B8B8B8C0B8C1B8C3 +B8C5B8CCB8D0B8D4B8DDB8DFB8E1B8E8B8E9B8ECB8F0B8F8B8F9B8FBB8FDB904 +B918B920B93CB93DB940B944B94CB94FB951B958B959B95CB960B968B9690000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +38 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B96BB96DB974B975B978B97CB984B985B987B989B98AB98DB98EB9ACB9AD +B9B0B9B4B9BCB9BDB9BFB9C1B9C8B9C9B9CCB9CEB9CFB9D0B9D1B9D2B9D8B9D9 +B9DBB9DDB9DEB9E1B9E3B9E4B9E5B9E8B9ECB9F4B9F5B9F7B9F8B9F9B9FABA00 +BA01BA08BA15BA38BA39BA3CBA40BA42BA48BA49BA4BBA4DBA4EBA53BA54BA55 +BA58BA5CBA64BA65BA67BA68BA69BA70BA71BA74BA78BA83BA84BA85BA87BA8C +BAA8BAA9BAABBAACBAB0BAB2BAB8BAB9BABBBABDBAC4BAC8BAD8BAD9BAFC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +39 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BB00BB04BB0DBB0FBB11BB18BB1CBB20BB29BB2BBB34BB35BB36BB38BB3B +BB3CBB3DBB3EBB44BB45BB47BB49BB4DBB4FBB50BB54BB58BB61BB63BB6CBB88 +BB8CBB90BBA4BBA8BBACBBB4BBB7BBC0BBC4BBC8BBD0BBD3BBF8BBF9BBFCBBFF +BC00BC02BC08BC09BC0BBC0CBC0DBC0FBC11BC14BC15BC16BC17BC18BC1BBC1C +BC1DBC1EBC1FBC24BC25BC27BC29BC2DBC30BC31BC34BC38BC40BC41BC43BC44 +BC45BC49BC4CBC4DBC50BC5DBC84BC85BC88BC8BBC8CBC8EBC94BC95BC970000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BC99BC9ABCA0BCA1BCA4BCA7BCA8BCB0BCB1BCB3BCB4BCB5BCBCBCBDBCC0 +BCC4BCCDBCCFBCD0BCD1BCD5BCD8BCDCBCF4BCF5BCF6BCF8BCFCBD04BD05BD07 +BD09BD10BD14BD24BD2CBD40BD48BD49BD4CBD50BD58BD59BD64BD68BD80BD81 +BD84BD87BD88BD89BD8ABD90BD91BD93BD95BD99BD9ABD9CBDA4BDB0BDB8BDD4 +BDD5BDD8BDDCBDE9BDF0BDF4BDF8BE00BE03BE05BE0CBE0DBE10BE14BE1CBE1D +BE1FBE44BE45BE48BE4CBE4EBE54BE55BE57BE59BE5ABE5BBE60BE61BE640000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BE68BE6ABE70BE71BE73BE74BE75BE7BBE7CBE7DBE80BE84BE8CBE8DBE8F +BE90BE91BE98BE99BEA8BED0BED1BED4BED7BED8BEE0BEE3BEE4BEE5BEECBF01 +BF08BF09BF18BF19BF1BBF1CBF1DBF40BF41BF44BF48BF50BF51BF55BF94BFB0 +BFC5BFCCBFCDBFD0BFD4BFDCBFDFBFE1C03CC051C058C05CC060C068C069C090 +C091C094C098C0A0C0A1C0A3C0A5C0ACC0ADC0AFC0B0C0B3C0B4C0B5C0B6C0BC +C0BDC0BFC0C0C0C1C0C5C0C8C0C9C0CCC0D0C0D8C0D9C0DBC0DCC0DDC0E40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C0E5C0E8C0ECC0F4C0F5C0F7C0F9C100C104C108C110C115C11CC11DC11E +C11FC120C123C124C126C127C12CC12DC12FC130C131C136C138C139C13CC140 +C148C149C14BC14CC14DC154C155C158C15CC164C165C167C168C169C170C174 +C178C185C18CC18DC18EC190C194C196C19CC19DC19FC1A1C1A5C1A8C1A9C1AC +C1B0C1BDC1C4C1C8C1CCC1D4C1D7C1D8C1E0C1E4C1E8C1F0C1F1C1F3C1FCC1FD +C200C204C20CC20DC20FC211C218C219C21CC21FC220C228C229C22BC22D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C22FC231C232C234C248C250C251C254C258C260C265C26CC26DC270C274 +C27CC27DC27FC281C288C289C290C298C29BC29DC2A4C2A5C2A8C2ACC2ADC2B4 +C2B5C2B7C2B9C2DCC2DDC2E0C2E3C2E4C2EBC2ECC2EDC2EFC2F1C2F6C2F8C2F9 +C2FBC2FCC300C308C309C30CC30DC313C314C315C318C31CC324C325C328C329 +C345C368C369C36CC370C372C378C379C37CC37DC384C388C38CC3C0C3D8C3D9 +C3DCC3DFC3E0C3E2C3E8C3E9C3EDC3F4C3F5C3F8C408C410C424C42CC4300000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C434C43CC43DC448C464C465C468C46CC474C475C479C480C494C49CC4B8 +C4BCC4E9C4F0C4F1C4F4C4F8C4FAC4FFC500C501C50CC510C514C51CC528C529 +C52CC530C538C539C53BC53DC544C545C548C549C54AC54CC54DC54EC553C554 +C555C557C558C559C55DC55EC560C561C564C568C570C571C573C574C575C57C +C57DC580C584C587C58CC58DC58FC591C595C597C598C59CC5A0C5A9C5B4C5B5 +C5B8C5B9C5BBC5BCC5BDC5BEC5C4C5C5C5C6C5C7C5C8C5C9C5CAC5CCC5CE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C5D0C5D1C5D4C5D8C5E0C5E1C5E3C5E5C5ECC5EDC5EEC5F0C5F4C5F6C5F7 +C5FCC5FDC5FEC5FFC600C601C605C606C607C608C60CC610C618C619C61BC61C +C624C625C628C62CC62DC62EC630C633C634C635C637C639C63BC640C641C644 +C648C650C651C653C654C655C65CC65DC660C66CC66FC671C678C679C67CC680 +C688C689C68BC68DC694C695C698C69CC6A4C6A5C6A7C6A9C6B0C6B1C6B4C6B8 +C6B9C6BAC6C0C6C1C6C3C6C5C6CCC6CDC6D0C6D4C6DCC6DDC6E0C6E1C6E80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +40 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C6E9C6ECC6F0C6F8C6F9C6FDC704C705C708C70CC714C715C717C719C720 +C721C724C728C730C731C733C735C737C73CC73DC740C744C74AC74CC74DC74F +C751C752C753C754C755C756C757C758C75CC760C768C76BC774C775C778C77C +C77DC77EC783C784C785C787C788C789C78AC78EC790C791C794C796C797C798 +C79AC7A0C7A1C7A3C7A4C7A5C7A6C7ACC7ADC7B0C7B4C7BCC7BDC7BFC7C0C7C1 +C7C8C7C9C7CCC7CEC7D0C7D8C7DDC7E4C7E8C7ECC800C801C804C808C80A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +41 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C810C811C813C815C816C81CC81DC820C824C82CC82DC82FC831C838C83C +C840C848C849C84CC84DC854C870C871C874C878C87AC880C881C883C885C886 +C887C88BC88CC88DC894C89DC89FC8A1C8A8C8BCC8BDC8C4C8C8C8CCC8D4C8D5 +C8D7C8D9C8E0C8E1C8E4C8F5C8FCC8FDC900C904C905C906C90CC90DC90FC911 +C918C92CC934C950C951C954C958C960C961C963C96CC970C974C97CC988C989 +C98CC990C998C999C99BC99DC9C0C9C1C9C4C9C7C9C8C9CAC9D0C9D1C9D30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +42 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C9D5C9D6C9D9C9DAC9DCC9DDC9E0C9E2C9E4C9E7C9ECC9EDC9EFC9F0C9F1 +C9F8C9F9C9FCCA00CA08CA09CA0BCA0CCA0DCA14CA18CA29CA4CCA4DCA50CA54 +CA5CCA5DCA5FCA60CA61CA68CA7DCA84CA98CABCCABDCAC0CAC4CACCCACDCACF +CAD1CAD3CAD8CAD9CAE0CAECCAF4CB08CB10CB14CB18CB20CB21CB41CB48CB49 +CB4CCB50CB58CB59CB5DCB64CB78CB79CB9CCBB8CBD4CBE4CBE7CBE9CC0CCC0D +CC10CC14CC1CCC1DCC21CC22CC27CC28CC29CC2CCC2ECC30CC38CC39CC3B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +43 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CC3CCC3DCC3ECC44CC45CC48CC4CCC54CC55CC57CC58CC59CC60CC64CC66 +CC68CC70CC75CC98CC99CC9CCCA0CCA8CCA9CCABCCACCCADCCB4CCB5CCB8CCBC +CCC4CCC5CCC7CCC9CCD0CCD4CCE4CCECCCF0CD01CD08CD09CD0CCD10CD18CD19 +CD1BCD1DCD24CD28CD2CCD39CD5CCD60CD64CD6CCD6DCD6FCD71CD78CD88CD94 +CD95CD98CD9CCDA4CDA5CDA7CDA9CDB0CDC4CDCCCDD0CDE8CDECCDF0CDF8CDF9 +CDFBCDFDCE04CE08CE0CCE14CE19CE20CE21CE24CE28CE30CE31CE33CE350000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CE58CE59CE5CCE5FCE60CE61CE68CE69CE6BCE6DCE74CE75CE78CE7CCE84 +CE85CE87CE89CE90CE91CE94CE98CEA0CEA1CEA3CEA4CEA5CEACCEADCEC1CEE4 +CEE5CEE8CEEBCEECCEF4CEF5CEF7CEF8CEF9CF00CF01CF04CF08CF10CF11CF13 +CF15CF1CCF20CF24CF2CCF2DCF2FCF30CF31CF38CF54CF55CF58CF5CCF64CF65 +CF67CF69CF70CF71CF74CF78CF80CF85CF8CCFA1CFA8CFB0CFC4CFE0CFE1CFE4 +CFE8CFF0CFF1CFF3CFF5CFFCD000D004D011D018D02DD034D035D038D03C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +45 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D044D045D047D049D050D054D058D060D06CD06DD070D074D07CD07DD081 +D0A4D0A5D0A8D0ACD0B4D0B5D0B7D0B9D0C0D0C1D0C4D0C8D0C9D0D0D0D1D0D3 +D0D4D0D5D0DCD0DDD0E0D0E4D0ECD0EDD0EFD0F0D0F1D0F8D10DD130D131D134 +D138D13AD140D141D143D144D145D14CD14DD150D154D15CD15DD15FD161D168 +D16CD17CD184D188D1A0D1A1D1A4D1A8D1B0D1B1D1B3D1B5D1BAD1BCD1C0D1D8 +D1F4D1F8D207D209D210D22CD22DD230D234D23CD23DD23FD241D248D25C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +46 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D264D280D281D284D288D290D291D295D29CD2A0D2A4D2ACD2B1D2B8D2B9 +D2BCD2BFD2C0D2C2D2C8D2C9D2CBD2D4D2D8D2DCD2E4D2E5D2F0D2F1D2F4D2F8 +D300D301D303D305D30CD30DD30ED310D314D316D31CD31DD31FD320D321D325 +D328D329D32CD330D338D339D33BD33CD33DD344D345D37CD37DD380D384D38C +D38DD38FD390D391D398D399D39CD3A0D3A8D3A9D3ABD3ADD3B4D3B8D3BCD3C4 +D3C5D3C8D3C9D3D0D3D8D3E1D3E3D3ECD3EDD3F0D3F4D3FCD3FDD3FFD4010000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +47 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D408D41DD440D444D45CD460D464D46DD46FD478D479D47CD47FD480D482 +D488D489D48BD48DD494D4A9D4CCD4D0D4D4D4DCD4DFD4E8D4ECD4F0D4F8D4FB +D4FDD504D508D50CD514D515D517D53CD53DD540D544D54CD54DD54FD551D558 +D559D55CD560D565D568D569D56BD56DD574D575D578D57CD584D585D587D588 +D589D590D5A5D5C8D5C9D5CCD5D0D5D2D5D8D5D9D5DBD5DDD5E4D5E5D5E8D5EC +D5F4D5F5D5F7D5F9D600D601D604D608D610D611D613D614D615D61CD6200000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +48 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D624D62DD638D639D63CD640D645D648D649D64BD64DD651D654D655D658 +D65CD667D669D670D671D674D683D685D68CD68DD690D694D69DD69FD6A1D6A8 +D6ACD6B0D6B9D6BBD6C4D6C5D6C8D6CCD6D1D6D4D6D7D6D9D6E0D6E4D6E8D6F0 +D6F5D6FCD6FDD700D704D711D718D719D71CD720D728D729D72BD72DD734D735 +D738D73CD744D747D749D750D751D754D756D757D758D759D760D761D763D765 +D769D76CD770D774D77CD77DD781D788D789D78CD790D798D799D79BD79D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F3D4F73504750F952A053EF547554E556095AC15BB6668767B667B767EF +6B4C73C275C27A3C82DB8304885788888A368CC88DCF8EFB8FE699D5523B5374 +5404606A61646BBC73CF811A89BA89D295A34F83520A58BE597859E65E725E79 +61C763C0674667EC687F6F97764E770B78F57A087AFF7C21809D826E82718AEB +95934E6B559D66F76E3478A37AED845B8910874E97A852D8574E582A5D4C611F +61BE6221656267D16A446E1B751875B376E377B07D3A90AF945194529F950000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053235CAC753280DB92409598525B580859DC5CA15D175EB75F3A5F4A6177 +6C5F757A75867CE07D737DB17F8C81548221859189418B1B92FC964D9C474ECB +4EF7500B51F1584F6137613E6168653969EA6F1175A5768676D67B8782A584CB +F90093A7958B55805BA25751F9017CB37FB991B5502853BB5C455DE862D2636E +64DA64E76E2070AC795B8DDD8E1EF902907D924592F84E7E4EF650655DFE5EFA +61066957817186548E4793759A2B4E5E5091677068405109528D52926AA20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077BC92109ED452AB602F8FF2504861A963ED64CA683C6A846FC0818889A1 +96945805727D72AC75047D797E6D80A9898B8B7490639D5162896C7A6F547D50 +7F3A8A23517C614A7B9D8B199257938C4EAC4FD3501E50BE510652C152CD537F +577058835E9A5F91617661AC64CE656C666F66BB66F468976D87708570F1749F +74A574CA75D9786C78EC7ADF7AF67D457D938015803F811B83968B668F159015 +93E1980398389A5A9BE84FC25553583A59515B635C4660B86212684268B00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068E86EAA754C767878CE7A3D7CFB7E6B7E7C8A088AA18C3F968E9DC453E4 +53E9544A547156FA59D15B645C3B5EAB62F765376545657266A067AF69C16CBD +75FC7690777E7A3F7F94800380A1818F82E682FD83F085C1883188B48AA5F903 +8F9C932E96C798679AD89F1354ED659B66F2688F7A408C379D6056F057645D11 +660668B168CD6EFE7428889E9BE46C68F9049AA84F9B516C5171529F5B545DE5 +6050606D62F163A7653B73D97A7A86A38CA2978F4E325BE16208679C74DC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079D183D38A878AB28DE8904E934B98465ED369E885FF90EDF90551A05B98 +5BEC616368FA6B3E704C742F74D87BA17F5083C589C08CAB95DC9928522E605D +62EC90024F8A5149532158D95EE366E06D38709A72C273D67B5080F1945B5366 +639B7F6B4E565080584A58DE602A612762D069D09B415B8F7D1880B18F5F4EA4 +50D154AC55AC5B0C5DA05DE7652A654E68216A4B72E1768E77EF7D5E7FF981A0 +854E86DF8F038F4E90CA99039A559BAB4E184E454E5D4EC74FF1517752FE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000534053E353E5548E5614577557A25BC75D875ED061FC62D8655167B867E9 +69CB6B506BC66BEC6C426E9D707872D77396740377BF77E97A767D7F800981FC +8205820A82DF88628B338CFC8EC0901190B1926492B699D29A459CE99DD79F9C +570B5C4083CA97A097AB9EB4541B7A987FA488D98ECD90E158005C4863987A9F +5BAE5F137A797AAE828E8EAC5026523852F85377570862F363726B0A6DC37737 +53A5735785688E7695D5673A6AC36F708A6D8ECC994BF90666776B788CB40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B3CF90753EB572D594E63C669FB73EA78457ABA7AC57CFE8475898F8D73 +903595A852FB574775477B6083CC921EF9086A58514B524B5287621F68D86975 +969950C552A452E461C365A4683969FF747E7B4B82B983EB89B28B398FD19949 +F9094ECA599764D266116A8E7434798179BD82A9887E887F895FF90A93264F0B +53CA602562716C727D1A7D664E98516277DC80AF4F014F0E5176518055DC5668 +573B57FA57FC5914594759935BC45C905D0E5DF15E7E5FCC628065D765E30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000671E671F675E68CB68C46A5F6B3A6C236C7D6C826DC773987426742A7482 +74A37578757F788178EF794179477948797A7B957D007DBA7F888006802D808C +8A188B4F8C488D779321932498E299519A0E9A0F9A659E927DCA4F76540962EE +685491D155AB513AF90BF90C5A1C61E6F90D62CF62FFF90EF90FF910F911F912 +F91390A3F914F915F916F917F9188AFEF919F91AF91BF91C6696F91D7156F91E +F91F96E3F920634F637A5357F921678F69606E73F9227537F923F924F9250000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +52 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D0DF926F927887256CA5A18F928F929F92AF92BF92C4E43F92D51675948 +67F08010F92E59735E74649A79CA5FF5606C62C8637B5BE75BD752AAF92F5974 +5F296012F930F931F9327459F933F934F935F936F937F93899D1F939F93AF93B +F93CF93DF93EF93FF940F941F942F9436FC3F944F94581BF8FB260F1F946F947 +8166F948F9495C3FF94AF94BF94CF94DF94EF94FF950F9515AE98A25677B7D10 +F952F953F954F955F956F95780FDF958F9595C3C6CE5533F6EBA591A83360000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E394EB64F4655AE571858C75F5665B765E66A806BB56E4D77ED7AEF7C1E +7DDE86CB88929132935B64BB6FBE737A75B890545556574D61BA64D466C76DE1 +6E5B6F6D6FB975F0804381BD854189838AC78B5A931F6C9375537B548E0F905D +5510580258585E626207649E68E075767CD687B39EE84EE35788576E59275C0D +5CB15E365F85623464E173B381FA888B8CB8968A9EDB5B855FB760B350125200 +52305716583558575C0E5C605CF65D8B5EA65F9260BC63116389641768430000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068F96AC26DD86E216ED46FE471FE76DC777979B17A3B840489A98CED8DF3 +8E4890039014905390FD934D967697DC6BD27006725872A27368776379BF7BE4 +7E9B8B8058A960C7656665FD66BE6C8C711E71C98C5A98134E6D7A814EDD51AC +51CD52D5540C61A76771685068DF6D1E6F7C75BC77B37AE580F484639285515C +6597675C679375D87AC78373F95A8C469017982D5C6F81C0829A9041906F920D +5F975D9D6A5971C8767B7B4985E48B0491279A30558761F6F95B76697F850000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +55 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000863F87BA88F8908FF95C6D1B70D973DE7D61843DF95D916A99F1F95E4E82 +53756B046B12703E721B862D9E1E524C8FA35D5064E5652C6B166FEB7C437E9C +85CD896489BD62C981D8881F5ECA67176D6A72FC7405746F878290DE4F865D0D +5FA0840A51B763A075654EAE5006516951C968816A117CAE7CB17CE7826F8AD2 +8F1B91CF4FB6513752F554425EEC616E623E65C56ADA6FFE792A85DC882395AD +9A629A6A9E979ECE529B66C66B77701D792B8F6297426190620065236F230000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000714974897DF4806F84EE8F269023934A51BD521752A36D0C70C888C25EC9 +65826BAE6FC27C3E73754EE44F3656F9F95F5CBA5DBA601C73B27B2D7F9A7FCE +8046901E923496F6974898189F614F8B6FA779AE91B496B752DEF960648864C4 +6AD36F5E7018721076E780018606865C8DEF8F0597329B6F9DFA9E75788C797F +7DA083C993049E7F9E938AD658DF5F046727702774CF7C60807E512170287262 +78CA8CC28CDA8CF496F74E8650DA5BEE5ED6659971CE764277AD804A84FC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000907C9B279F8D58D85A415C626A136DDA6F0F763B7D2F7E37851E893893E4 +964B528965D267F369B46D416E9C700F7409746075597624786B8B2C985E516D +622E96784F96502B5D196DEA7DB88F2A5F8B61446817F961968652D2808B51DC +51CC695E7A1C7DBE83F196754FDA52295398540F550E5C6560A7674E68A86D6C +728172F874067483F96275E27C6C7F797FB8838988CF88E191CC91D096E29BC9 +541D6F7E71D0749885FA8EAA96A39C579E9F67976DCB743381E89716782C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +58 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ACB7B207C926469746A75F278BC78E899AC9B549EBB5BDE5E556F20819C +83AB90884E07534D5A295DD25F4E6162633D666966FC6EFF6F2B7063779E842C +8513883B8F1399459C3B551C62B9672B6CAB8309896A977A4EA159845FD85FD9 +671B7DB27F548292832B83BD8F1E909957CB59B95A925BD06627679A68856BCF +71647F758CB78CE390819B4581088C8A964C9A409EA55B5F6C13731B76F276DF +840C51AA8993514D519552C968C96C94770477207DBF7DEC97629EB56EC50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000851151A5540D547D660E669D69276E9F76BF7791831784C2879F91699298 +9CF488824FAE519252DF59C65E3D61556478647966AE67D06A216BCD6BDB725F +72617441773877DB801782BC83058B008B288C8C67286C90726776EE77667A46 +9DA96B7F6C92592267268499536F589359995EDF63CF663467736E3A732B7AD7 +82D7932852D95DEB61AE61CB620A62C764AB65E069596B666BCB712173F7755D +7E46821E8302856A8AA38CBF97279D6158A89ED85011520E543B554F65870000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C767D0A7D0B805E868A958096EF52FF6C95726954735A9A5C3E5D4B5F4C +5FAE672A68B669636E3C6E4477097C737F8E85878B0E8FF797619EF45CB760B6 +610D61AB654F65FB65FC6C116CEF739F73C97DE195945BC6871C8B10525D535A +62CD640F64B267346A386CCA73C0749E7B947C957E1B818A823685848FEB96F9 +99C14F34534A53CD53DB62CC642C6500659169C36CEE6F5873ED7554762276E4 +76FC78D078FB792C7D46822C87E08FD4981298EF52C362D464A56E246F510000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000767C8DCB91B192629AEE9B435023508D574A59A85C285E475F77623F653E +65B965C16609678B699C6EC278C57D2180AA8180822B82B384A1868C8A2A8B17 +90A696329F90500D4FF3F96357F95F9862DC6392676F6E43711976C380CC80DA +88F488F589198CE08F29914D966A4F2F4F705E1B67CF6822767D767E9B445E61 +6A0A716971D4756AF9647E41854385E998DC4F107B4F7F7095A551E15E0668B5 +6C3E6C4E6CDB72AF7BC483036CD5743A50FB528858C164D86A9774A776560000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078A7861795E29739F965535E5F018B8A8FA88FAF908A522577A59C499F08 +4E19500251755C5B5E77661E663A67C468C570B3750175C579C97ADD8F279920 +9A084FDD582158315BF6666E6B656D116E7A6F7D73E4752B83E988DC89138B5C +8F144F0F50D55310535C5B935FA9670D798F8179832F8514890789868F398F3B +99A59C12672C4E764FF859495C015CEF5CF0636768D270FD71A2742B7E2B84EC +8702902292D29CF34E0D4ED84FEF50855256526F5426549057E0592B5A660000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005B5A5B755BCC5E9CF9666276657765A76D6E6EA572367B267C3F7F368150 +8151819A8240829983A98A038CA08CE68CFB8D748DBA90E891DC961C964499D9 +9CE7531752065429567458B35954596E5FFF61A4626E66106C7E711A76C67C89 +7CDE7D1B82AC8CC196F0F9674F5B5F175F7F62C25D29670B68DA787C7E439D6C +4E1550995315532A535159835A625E8760B2618A624962796590678769A76BD4 +6BD66BD76BD86CB8F968743575FA7812789179D579D87C837DCB7FE180A50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000813E81C283F2871A88E88AB98B6C8CBB9119975E98DB9F3B56AC5B2A5F6C +658C6AB36BAF6D5C6FF17015725D73AD8CA78CD3983B61916C3780589A014E4D +4E8B4E9B4ED54F3A4F3C4F7F4FDF50FF53F253F8550655E356DB58EB59625A11 +5BEB5BFA5C045DF35E2B5F99601D6368659C65AF67F667FB68AD6B7B6C996CD7 +6E23700973457802793E7940796079C17BE97D177D728086820D838E84D186C7 +88DF8A508A5E8B1D8CDC8D668FAD90AA98FC99DF9E9D524AF9696714F96A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005098522A5C7165636C5573CA7523759D7B97849C917897304E7764926BBA +715E85A94E09F96B674968EE6E17829F8518886B63F76F81921298AF4E0A50B7 +50CF511F554655AA56175B405C195CE05E385E8A5EA05EC260F368516A616E58 +723D724072C076F879657BB17FD488F389F48A738C618CDE971C585E74BD8CFD +55C7F96C7A617D2282727272751F7525F96D7B19588558FB5DBC5E8F5EB65F90 +60556292637F654D669166D966F8681668F27280745E7B6E7D6E7DD67F720000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000080E5821285AF897F8A93901D92E49ECD9F205915596D5E2D60DC66146673 +67906C506DC56F5F77F378A984C691CB932B4ED950CA514855845B0B5BA36247 +657E65CB6E32717D74017444748774BF766C79AA7DDA7E557FA8817A81B38239 +861A87EC8A758DE3907892919425994D9BAE53685C5169546CC46D296E2B820C +859B893B8A2D8AAA96EA9F67526166B96BB27E9687FE8D0D9583965D651D6D89 +71EEF96E57CE59D35BAC602760FA6210661F665F732973F976DB77017B6C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008056807281658AA091924E1652E26B726D177A057B397D30F96F8CB053EC +562F58515BB55C0F5C115DE2624063836414662D68B36CBC6D886EAF701F70A4 +71D27526758F758E76197B117BE07C2B7D207D39852C856D86078A34900D9061 +90B592B797F69A374FD75C6C675F6D917C9F7E8C8B168D16901F5B6B5DFD640D +84C0905C98E173875B8B609A677E6DDE8A1F8AA69001980C5237F9707051788E +9396887091D74FEE53D755FD56DA578258FD5AC25B885CAB5CC05E2561010000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000620D624B6388641C653665786A396B8A6C346D196F3171E772E973787407 +74B27626776179C07A577AEA7CB97D8F7DAC7E617F9E81298331849084DA85EA +88968AB08B908F3890429083916C929692B9968B96A796A896D6970098089996 +9AD39B1A53D4587E59195B705BBF6DD16F5A719F742174B9808583FD5DE15F87 +5FAA604265EC6812696F6A536B896D356DF373E376FE77AC7B4D7D148123821C +834084F485638A628AC49187931E980699B4620C88538FF092655D075D270000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005D69745F819D87686FD562FE7FD2893689724E1E4E5850E752DD5347627F +66077E698805965E4F8D5319563659CB5AA45C385C4E5C4D5E025F11604365BD +662F664267BE67F4731C77E2793A7FC5849484CD89968A668A698AE18C558C7A +57F45BD45F0F606F62ED690D6B966E5C71847BD287558B588EFE98DF98FE4F38 +4F814FE1547B5A205BB8613C65B0666871FC7533795E7D33814E81E3839885AA +85CE87038A0A8EAB8F9BF9718FC559315BA45BE660895BE95C0B5FC36C810000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9726DF1700B751A82AF8AF64EC05341F97396D96C0F4E9E4FC45152555E +5A255CE86211725982BD83AA86FE88598A1D963F96C599139D099D5D580A5CB3 +5DBD5E4460E1611563E16A026E2591029354984E9C109F775B895CB86309664F +6848773C96C1978D98549B9F65A18B018ECB95BC55355CA95DD65EB56697764C +83F495C758D362BC72CE9D284EF0592E600F663B6B8379E79D26539354C057C3 +5D16611B66D66DAF788D827E969897445384627C63966DB27E0A814B984D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006AFB7F4C9DAF9E1A4E5F503B51B6591C60F963F66930723A8036F97491CE +5F31F975F9767D0482E5846F84BB85E58E8DF9774F6FF978F97958E45B436059 +63DA6518656D6698F97A694A6A236D0B7001716C75D2760D79B37A70F97B7F8A +F97C8944F97D8B9391C0967DF97E990A57045FA165BC6F01760079A68A9E99AD +9B5A9F6C510461B662916A8D81C6504358305F6671098A008AFA5B7C86164FFA +513C56B4594463A96DF95DAA696D51864E884F59F97FF980F9815982F9820000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9836B5F6C5DF98474B57916F9858207824583398F3F8F5DF9869918F987 +F988F9894EA6F98A57DF5F796613F98BF98C75AB7E798B6FF98D90069A5B56A5 +582759F85A1F5BB4F98E5EF6F98FF9906350633BF991693D6C876CBF6D8E6D93 +6DF56F14F99270DF71367159F99371C371D5F994784F786FF9957B757DE3F996 +7E2FF997884D8EDFF998F999F99A925BF99B9CF6F99CF99DF99E60856D85F99F +71B1F9A0F9A195B153ADF9A2F9A3F9A467D3F9A5708E71307430827682D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9A695BB9AE59E7D66C4F9A771C18449F9A8F9A9584BF9AAF9AB5DB85F71 +F9AC6620668E697969AE6C386CF36E366F416FDA701B702F715071DF7370F9AD +745BF9AE74D476C87A4E7E93F9AFF9B082F18A608FCEF9B19348F9B29719F9B3 +F9B44E42502AF9B5520853E166F36C6D6FCA730A777F7A6282AE85DD8602F9B6 +88D48A638B7D8C6BF9B792B3F9B8971398104E944F0D4FC950B25348543E5433 +55DA586258BA59675A1B5BE4609FF9B961CA655665FF666468A76C5A6FB30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +68 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000070CF71AC73527B7D87088AA49C329F075C4B6C8373447389923A6EAB7465 +761F7A697E15860A514058C564C174EE751576707FC1909596CD99546E2674E6 +7AA97AAA81E586D987788A1B5A495B8C5B9B68A169006D6373A97413742C7897 +7DE97FEB81188155839E8C4C962E981166F05F8065FA67896C6A738B502D5A03 +6B6A77EE59165D6C5DCD7325754FF9BAF9BB50E551F9582F592D599659DA5BE5 +F9BCF9BD5DA262D76416649364FEF9BE66DCF9BF6A48F9C071FF7464F9C10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A887AAF7E477E5E80008170F9C287EF89818B209059F9C390809952617E +6B326D747E1F89258FB14FD150AD519752C757C758895BB95EB8614269956D8C +6E676EB6719474627528752C8073833884C98E0A939493DEF9C44E8E4F515076 +512A53C853CB53F35B875BD35C24611A618265F4725B7397744076C279507991 +79B97D067FBD828B85D5865E8FC2904790F591EA968596E896E952D65F6765ED +6631682F715C7A3690C1980A4E91F9C56A526B9E6F907189801882B885530000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000904B969596F297FB851A9B314E90718A96C45143539F54E15713571257A3 +5A9B5AC45BC36028613F63F46C856D396E726E907230733F745782D188818F45 +9060F9C6966298589D1B67088D8A925E4F4D504950DE5371570D59D45A015C09 +617066906E2D7232744B7DEF80C3840E8466853F875F885B89188B02905597CB +9B4F4E734F915112516AF9C7552F55A95B7A5BA55E7C5E7D5EBE60A060DF6108 +610963C465386709F9C867D467DAF9C9696169626CB96D27F9CA6E38F9CB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FE173367337F9CC745C7531F9CD7652F9CEF9CF7DAD81FE843888D58A98 +8ADB8AED8E308E42904A903E907A914991C9936EF9D0F9D15809F9D26BD38089 +80B2F9D3F9D45141596B5C39F9D5F9D66F6473A780E48D07F9D79217958FF9D8 +F9D9F9DAF9DB807F620E701C7D68878DF9DC57A0606961476BB78ABE928096B1 +4E59541F6DEB852D967097F398EE63D66CE3909151DD61C981BA9DF94F9D501A +51005B9C610F61FF64EC69056BC5759177E37FA98264858F87FB88638ABC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B7091AB4E8C4EE54F0AF9DDF9DE593759E8F9DF5DF25F1B5F5B6021F9E0 +F9E1F9E2F9E3723E73E5F9E4757075CDF9E579FBF9E6800C8033808482E18351 +F9E7F9E88CBD8CB39087F9E9F9EA98F4990CF9EBF9EC703776CA7FCA7FCC7FFC +8B1A4EBA4EC152035370F9ED54BD56E059FB5BC55F155FCD6E6EF9EEF9EF7D6A +8335F9F086938A8DF9F1976D9777F9F2F9F34E004F5A4F7E58F965E56EA29038 +93B099B94EFB58EC598A59D96041F9F4F9F57A14F9F6834F8CC3516553440000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9F7F9F8F9F94ECD52695B5582BF4ED4523A54A859C959FF5B505B575B5C +606361486ECB7099716E738674F775B578C17D2B800581EA8328851785C98AEE +8CC796CC4F5C52FA56BC65AB6628707C70B872357DBD828D914C96C09D725B71 +68E76B986F7A76DE5C9166AB6F5B7BB47C2A883696DC4E084ED75320583458BB +58EF596C5C075E335E845F35638C66B267566A1F6AA36B0C6F3F7246F9FA7350 +748B7AE07CA7817881DF81E7838A846C8523859485CF88DD8D1391AC95770000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000969C518D54C957285BB0624D6750683D68936E3D6ED3707D7E2188C18CA1 +8F099F4B9F4E722D7B8F8ACD931A4F474F4E5132548059D05E9562B56775696E +6A176CAE6E1A72D9732A75BD7BB87D3582E783F9845785F78A5B8CAF8E879019 +90B896CE9F5F52E3540A5AE15BC2645865756EF472C4F9FB76847A4D7B1B7C4D +7E3E7FDF837B8B2B8CCA8D648DE18E5F8FEA8FF9906993D14F434F7A50B35168 +5178524D526A5861587C59605C085C555EDB609B623068136BBF6C086FB10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000714E742075307538755176727B4C7B8B7BAD7BC67E8F8A6E8F3E8F49923F +92939322942B96FB985A986B991E5207622A62986D5976647ACA7BC07D765360 +5CBE5E976F3870B97C9897119B8E9EDE63A5647A87764E014E954EAD505C5075 +544859C35B9A5E405EAD5EF75F8160C5633A653F657465CC6676667867FE6968 +6A896B636C406DC06DE86E1F6E5E701E70A1738E73FD753A775B7887798E7A0B +7A7D7CBE7D8E82478A028AEA8C9E912D914A91D8926692CC9320970697560000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +70 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000975C98029F0E52365291557C58245E1D5F1F608C63D068AF6FDF796D7B2C +81CD85BA88FD8AF88E44918D9664969B973D984C9F4A4FCE514651CB52A95632 +5F145F6B63AA64CD65E9664166FA66F9671D689D68D769FD6F156F6E716771E5 +722A74AA773A7956795A79DF7A207A957C977CDF7D447E70808785FB86A48A54 +8ABF8D998E819020906D91E3963B96D59CE565CF7C078DB393C35B585C0A5352 +62D9731D50275B975F9E60B0616B68D56DD9742E7A2E7D427D9C7E31816B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +71 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008E2A8E35937E94184F5057505DE65EA7632B7F6A4E3B4F4F4F8F505A59DD +80C4546A546855FE594F5B995DDE5EDA665D673167F1682A6CE86D326E4A6F8D +70B773E075877C4C7D027D2C7DA2821F86DB8A3B8A858D708E8A8F339031914E +9152944499D07AF97CA54FCA510151C657C85BEF5CFB66596A3D6D5A6E966FEC +710C756F7AE388229021907596CB99FF83014E2D4EF2884691CD537D6ADB696B +6C41847A589E618E66FE62EF70DD751175C77E5284B88B498D084E4B53EA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054AB573057405FD763016307646F652F65E8667A679D67B36B626C606C9A +6F2C77E57825794979577D1980A2810281F3829D82B787188A8CF9FC8D048DBE +907276F47A197A377E548077550755D45875632F64226649664B686D699B6B84 +6D256EB173CD746874A1755B75B976E1771E778B79E67E097E1D81FB852F8897 +8A3A8CD18EEB8FB0903293AD9663967397074F8453F159EA5AC95E19684E74C6 +75BE79E97A9281A386ED8CEA8DCC8FED659F6715F9FD57F76F577DDD8F2F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093F696C65FB561F26F844E144F98501F53C955DF5D6F5DEE6B216B6478CB +7B9AF9FE8E498ECA906E6349643E77407A84932F947F9F6A64B06FAF71E674A8 +74DA7AC47C127E827CB27E988B9A8D0A947D9910994C52395BDF64E6672D7D2E +50ED53C358796158615961FA65AC7AD98B928B9650095021527555315A3C5EE0 +5F706134655E660C663666A269CD6EC46F32731676217A938139825983D684BC +50B557F05BC05BE85F6963A178267DB583DC852191C791F5518A67F57B560000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008CAC51C459BB60BD8655501CF9FF52545C3A617D621A62D364F265A56ECC +7620810A8E60965F96BB4EDF5343559859295DDD64C56CC96DFA73947A7F821B +85A68CE48E10907791E795E1962197C651F854F255865FB964A46F887DB48F1F +8F4D943550C95C166CBE6DFB751B77BB7C3D7C648A798AC2581E59BE5E166377 +7252758A776B8ADC8CBC8F125EF366746DF8807D83C18ACB97519BD6FA005243 +66FF6D956EEF7DE08AE6902E905E9AD4521D527F54E86194628462DB68A20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +75 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006912695A6A3570927126785D7901790E79D27A0D8096827882D583498549 +8C828D859162918B91AE4FC356D171ED77D7870089F85BF85FD6675190A853E2 +585A5BF560A4618164607E3D80708525928364AE50AC5D146700589C62BD63A8 +690E69786A1E6E6B76BA79CB82BB84298ACF8DA88FFD9112914B919C93109318 +939A96DB9A369C0D4E11755C795D7AFA7B517BC97E2E84C48E598E748EF89010 +6625693F744351FA672E9EDC51455FE06C9687F2885D887760B481B584030000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +76 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008D0553D6543956345A365C31708A7FE0805A810681ED8DA391899A5F9DF2 +50744EC453A060FB6E2C5C644F88502455E45CD95E5F606568946CBB6DC471BE +75D475F476617A1A7A497DC77DFB7F6E81F486A98F1C96C999B39F52524752C5 +98ED89AA4E0367D26F064FB55BE267956C886D78741B782791DD937C87C479E4 +7A315FEB4ED654A4553E58AE59A560F0625362D6673669558235964099B199DD +502C53535544577CFA016258FA0264E2666B67DD6FC16FEF742274388A170000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094385451560657665F48619A6B4E705870AD7DBB8A95596A812B63A27708 +803D8CAA5854642D69BB5B955E116E6FFA038569514C53F0592A6020614B6B86 +6C706CF07B1E80CE82D48DC690B098B1FA0464C76FA464916504514E5410571F +8A0E615F6876FA0575DB7B527D71901A580669CC817F892A9000983950785957 +59AC6295900F9B2A615D727995D657615A465DF4628A64AD64FA67776CE26D3E +722C743678347F7782AD8DDB981752245742677F724874E38CA98FA692110000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +78 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000962A516B53ED634C4F695504609665576C9B6D7F724C72FD7A1789878C9D +5F6D6F8E70F981A8610E4FBF504F624172477BC77DE87FE9904D97AD9A198CB6 +576A5E7367B0840D8A5554205B165E635EE25F0A658380BA853D9589965B4F48 +5305530D530F548654FA57035E036016629B62B16355FA066CE16D6675B17832 +80DE812F82DE846184B2888D8912900B92EA98FD9B915E4566B466DD70117206 +FA074FF5527D5F6A615367536A196F0274E2796888688C7998C798C49A430000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +79 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054C17A1F69538AF78C4A98A899AE5F7C62AB75B276AE88AB907F96425339 +5F3C5FC56CCC73CC7562758B7B4682FE999D4E4F903C4E0B4F5553A6590F5EC8 +66306CB37455837787668CC09050971E9C1558D15B7886508B149DB45BD26068 +608D65F16C576F226FA3701A7F557FF095919592965097D352728F4451FD542B +54B85563558A6ABB6DB57DD88266929C96779E79540854C876D286E495A495D4 +965C4EA24F0959EE5AE65DF760526297676D68416C866E2F7F38809B822A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FA08FA0998054EA5505554B35793595A5B695BB361C869776D77702387F9 +89E38A728AE7908299ED9AB852BE683850165E78674F8347884C4EAB541156AE +73E6911597FF9909995799995653589F865B8A3161B26AF6737B8ED26B4796AA +9A57595572008D6B97694FD45CF45F2661F8665B6CEB70AB738473B973FE7729 +774D7D437D627E2382378852FA0A8CE29249986F5B517A74884098015ACC4FE0 +5354593E5CFD633E6D7972F98105810783A292CF98304EA851445211578B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F626CC26ECE7005705070AF719273E97469834A87A28861900890A293A3 +99A8516E5F5760E0616766B385598E4A91AF978B4E4E4E92547C58D558FA597D +5CB55F2762366248660A66676BEB6D696DCF6E566EF86F946FE06FE9705D72D0 +7425745A74E07693795C7CCA7E1E80E182A6846B84BF864E865F87748B778C6A +93AC9800986560D1621691775A5A660F6DF76E3E743F9B425FFD60DA7B0F54C4 +5F186C5E6CD36D2A70D87D0586798A0C9D3B5316548C5B056A3A706B75750000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000798D79BE82B183EF8A718B418CA89774FA0B64F4652B78BA78BB7A6B4E38 +559A59505BA65E7B60A363DB6B61666568536E19716574B07D0890849A699C25 +6D3B6ED1733E8C4195CA51F05E4C5FA8604D60F66130614C6643664469A56CC1 +6E5F6EC96F62714C749C76877BC17C27835287579051968D9EC3532F56DE5EFB +5F8A6062609461F7666667036A9C6DEE6FAE7070736A7E6A81BE833486D48AA8 +8CC4528373725B966A6B940454EE56865B5D6548658566C9689F6D8D6DC60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000723B80B491759A4D4FAF5019539A540E543C558955C55E3F5F8C673D7166 +73DD900552DB52F3586458CE7104718F71FB85B08A13668885A855A76684714A +8431534955996BC15F595FBD63EE668971478AF18F1D9EBE4F11643A70CB7566 +866760648B4E9DF8514751F653086D3680F89ED166156B23709875D554035C79 +7D078A166B206B3D6B46543860706D3D7FD5820850D651DE559C566B56CD59EC +5B095E0C619961986231665E66E6719971B971BA72A779A77A007FB28A700000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macCentEuro.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macCentEuro.enc new file mode 100644 index 00000000..dde616a4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macCentEuro.enc @@ -0,0 +1,20 @@ +# Encoding file: macCentEuro, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C40100010100C9010400D600DC00E10105010C00E4010D0106010700E90179 +017A010E00ED010F01120113011600F3011700F400F600F500FA011A011B00FC +202000B0011800A300A7202200B600DF00AE00A92122011900A822600123012E +012F012A22642265012B0136220222110142013B013C013D013E0139013A0145 +0146014300AC221A01440147220600AB00BB202600A00148015000D50151014C +20132014201C201D2018201900F725CA014D0154015501582039203A01590156 +01570160201A201E0161015A015B00C10164016500CD017D017E016A00D300D4 +016B016E00DA016F017001710172017300DD00FD0137017B0141017C012202C7 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macCroatian.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macCroatian.enc new file mode 100644 index 00000000..c23d0f0b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macCroatian.enc @@ -0,0 +1,20 @@ +# Encoding file: macCroatian, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 +00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC +202000B000A200A300A7202200B600DF00AE0160212200B400A82260017D00D8 +221E00B122642265220600B522022211220F0161222B00AA00BA03A9017E00F8 +00BF00A100AC221A01922248010600AB010C202600A000C000C300D501520153 +01102014201C201D2018201900F725CAF8FF00A9204420AC2039203A00C600BB +201300B7201A201E203000C2010700C1010D00C800CD00CE00CF00CC00D300D4 +011100D200DA00DB00D9013102C602DC00AF03C000CB02DA00B800CA00E602C7 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macCyrillic.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macCyrillic.enc new file mode 100644 index 00000000..e657739b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macCyrillic.enc @@ -0,0 +1,20 @@ +# Encoding file: macCyrillic, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0410041104120413041404150416041704180419041A041B041C041D041E041F +0420042104220423042404250426042704280429042A042B042C042D042E042F +202000B0049000A300A7202200B6040600AE00A9212204020452226004030453 +221E00B122642265045600B504910408040404540407045704090459040A045A +0458040500AC221A01922248220600AB00BB202600A0040B045B040C045C0455 +20132014201C201D2018201900F7201E040E045E040F045F211604010451044F +0430043104320433043404350436043704380439043A043B043C043D043E043F +0440044104420443044404450446044704480449044A044B044C044D044E20AC diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macDingbats.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macDingbats.enc new file mode 100644 index 00000000..28449cdd --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macDingbats.enc @@ -0,0 +1,20 @@ +# Encoding file: macDingbats, single-byte +S +003F 1 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +00202701270227032704260E2706270727082709261B261E270C270D270E270F +2710271127122713271427152716271727182719271A271B271C271D271E271F +2720272127222723272427252726272726052729272A272B272C272D272E272F +2730273127322733273427352736273727382739273A273B273C273D273E273F +2740274127422743274427452746274727482749274A274B25CF274D25A0274F +27502751275225B225BC25C6275625D727582759275A275B275C275D275E007F +F8D7F8D8F8D9F8DAF8DBF8DCF8DDF8DEF8DFF8E0F8E1F8E2F8E3F8E4008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000276127622763276427652766276726632666266526602460246124622463 +2464246524662467246824692776277727782779277A277B277C277D277E277F +2780278127822783278427852786278727882789278A278B278C278D278E278F +2790279127922793279421922194219527982799279A279B279C279D279E279F +27A027A127A227A327A427A527A627A727A827A927AA27AB27AC27AD27AE27AF +000027B127B227B327B427B527B627B727B827B927BA27BB27BC27BD27BE0000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macGreek.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macGreek.enc new file mode 100644 index 00000000..67b9953d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macGreek.enc @@ -0,0 +1,20 @@ +# Encoding file: macGreek, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C400B900B200C900B300D600DC038500E000E200E4038400A800E700E900E8 +00EA00EB00A3212200EE00EF202200BD203000F400F600A600AD00F900FB00FC +2020039303940398039B039E03A000DF00AE00A903A303AA00A7226000B000B7 +039100B12264226500A503920395039603970399039A039C03A603AB03A803A9 +03AC039D00AC039F03A1224803A400AB00BB202600A003A503A7038603880153 +20132015201C201D2018201900F70389038A038C038E03AD03AE03AF03CC038F +03CD03B103B203C803B403B503C603B303B703B903BE03BA03BB03BC03BD03BF +03C003CE03C103C303C403B803C903C203C703C503B603CA03CB039003B0F8A0 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macIceland.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macIceland.enc new file mode 100644 index 00000000..c6360698 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macIceland.enc @@ -0,0 +1,20 @@ +# Encoding file: macIceland, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 +00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC +00DD00B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8 +221E00B12264226500A500B522022211220F03C0222B00AA00BA03A900E600F8 +00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153 +20132014201C201D2018201900F725CA00FF0178204420AC00D000F000DE00FE +00FD00B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4 +F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macJapan.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macJapan.enc new file mode 100644 index 00000000..dba24bd8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macJapan.enc @@ -0,0 +1,785 @@ +# Encoding file: macJapan, multi-byte +M +003F 0 46 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00A0FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F +FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F +FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F +FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000A921222026 +81 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8FF3E +203EFF3F30FD30FE309D309E30034EDD30053006300730FC20142010FF0FFF3C +301C2016FF5C22EF202520182019201C201DFF08FF0930143015FF3BFF3DFF5B +FF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D70000 +00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 +FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C725C6 +25A125A025B325B225BD25BC203B301221922190219121933013000000000000 +000000000000000000000000000000002208220B2286228722822283222A2229 +000000000000000000000000000000002227222800AC21D221D4220022030000 +0000000000000000000000000000000000000000222022A52312220222072261 +2252226A226B221A223D221D2235222B222C0000000000000000000000000000 +212B2030266F266D266A2020202100B6000000000000000025EF000000000000 +82 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000FF10 +FF11FF12FF13FF14FF15FF16FF17FF18FF190000000000000000000000000000 +FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30 +FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A000000000000000000000000 +0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000003041 +30423043304430453046304730483049304A304B304C304D304E304F30503051 +30523053305430553056305730583059305A305B305C305D305E305F30603061 +30623063306430653066306730683069306A306B306C306D306E306F30703071 +30723073307430753076307730783079307A307B307C307D307E307F30803081 +30823083308430853086308730883089308A308B308C308D308E308F30903091 +3092309300000000000000000000000000000000000000000000000000000000 +83 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF30B0 +30B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF30C0 +30C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF30D0 +30D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF0000 +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000391 +03920393039403950396039703980399039A039B039C039D039E039F03A003A1 +03A303A403A503A603A703A803A90000000000000000000000000000000003B1 +03B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C1 +03C303C403C503C603C703C803C9000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +84 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +04100411041204130414041504010416041704180419041A041B041C041D041E +041F0420042104220423042404250426042704280429042A042B042C042D042E +042F000000000000000000000000000000000000000000000000000000000000 +04300431043204330434043504510436043704380439043A043B043C043D0000 +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000002500 +2502250C251025182514251C252C25242534253C25012503250F2513251B2517 +25232533252B253B254B2520252F25282537253F251D25302525253825420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +85 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2460246124622463246424652466246724682469246A246B246C246D246E246F +2470247124722473000000000000000000000000000000000000000024742475 +2476247724782479247A247B247C247D247E247F248024812482248324842485 +2486248700000000000000000000000000000000000000002776277727780000 +2779277A277B277C277D277E0000000000000000000000000000000000000000 +0000F8A124882489248A248B248C248D248E248F249000000000000000002160 +216121622163216421652166216721682169216A216BF8A2F8A3F8A400000000 +0000000000002170217121722173217421752176217721782179217A217BF8A5 +F8A6F8A700000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000249C249D249E249F24A0 +24A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE24AF24B0 +24B124B224B324B424B500000000000000000000000000000000000000000000 +86 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +339C339F339D33A033A4F8A833A133A5339E33A2338EF8A9338F33C433963397 +F8AA339833B333B233B133B0210933D433CB3390338533863387F8AB00000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000211633CD2121F8AC2664 +2667266126622660266326652666000000000000000000000000000000000000 +0000000000003020260E30040000000000000000000000000000000000000000 +0000000000000000000000000000261E261C261D261F21C621C421C5F8AD21E8 +21E621E721E9F8AEF8AFF8B0F8B1000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +87 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3230322A322B322C322D322E322F32403237324232433239323A3231323E3234 +3232323B323632333235323C323D323F32380000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000059275C0F32A432A532A632A732A832A93296329D3298329E63A732993349 +3322334D3314331633053333334E330333363318331533273351334A33393357 +330D334233233326333B332B00000000000000000000000000003300331E332A +3331334700000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000337E337D337C337B0000000000000000000000000000 +0000000000000000000000000000000000000000337FF8B2F8B3000000000000 +88 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +222E221F22BF0000000000000000000000000000000000000000000000000000 +0000000000000000301DF8B40000000000000000000000000000000000000000 +000000000000000000000000000000003094000030F730F830F930FA00000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000004E9C +55165A03963F54C0611B632859F690228475831C7A5060AA63E16E2565ED8466 +82A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E62167C9F88B7 +5B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2593759D4 +5A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3840E8863 +8B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA290387A328328 +828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D000000000000 +89 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E117893 +81FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B96F2 +834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E9834 +82F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD51860000 +5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 +827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC62BC +65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B51045C4B61B6 +81C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F554F3D4FA1 +4F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3706B73C2 +798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA88FE6904E +971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D54ECB4F1A +89E356DE584A58CA5EFB5FEB602A6094606261D0621262D06539000000000000 +8A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE5916 +54B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D957A3 +67FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B899A +89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B0000 +6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 +53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584317CA5 +520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E65B8C5B98 +5BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B536C576F22 +6F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266839E89B3 +8ACC8CAB908494519593959195A2966597D3992882184E38542B5CB85DCC73A9 +764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C566857FA5947 +5B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C4000000000000 +8B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D778ECC +8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A075917947 +7FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A70782767759ECD +53745BA2811A865090064E184E454EC74F1153CA54385BAE5F13602565510000 +673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 +5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC4F9B +4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F375F4A602F +6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F793E197FF +99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C552E45747 +5DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F8B398FD1 +91D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C899D25177 +611A865E55B07A7A50765BD3904796854E326ADB91E75C515C48000000000000 +8C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B85AB +8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B5951 +5F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB7D4C +7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE80000 +5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 +503950265065517C5238526355A7570F58055ACC5EFA61B261F862F36372691C +6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED290639375967A +98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D4382378A008AFA +96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF6E5672D0 +7CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E924F0D5348 +5449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B7791904E5E9BC9 +4EA44F7C4FAF501950165149516C529F52B952FE539A53E35411000000000000 +8D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB75F18 +6052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A6D69 +6E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B18154 +818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D0000 +980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B +544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC6B64 +98034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D57D3A826E +9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A50939688DF5750 +5EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D6B736E08 +707D91C7728078157826796D658E7D3083DC88C18F09969B5264572867507F6A +8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A548B643E +6628671467F57A847B567D22932F685C9BAD7B395319518A5237000000000000 +8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF66524E09 +509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB9178 +991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB59C9 +59FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B620000 +6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C +8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166426B21 +6ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F5F0F8B58 +9D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F0675BE8CEA +5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66659C716E +793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235914C91C8 +932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E816B8DA3 +91529996511253D7546A5BFF63886A397DAC970056DA53CE5468000000000000 +8F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F84908846 +89728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E67D4 +6C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F51FA +88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF30000 +6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 +7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F52DD +5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C115C1A5E84 +5E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A26A1F6A35 +6CBC6D886E096E58713C7126716775C77701785D7901796579F07AE07B117CA7 +7D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A49266937E +9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E3860C564FE +676167566D4472B675737A6384B88B7291B89320563157F498FE000000000000 +90 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB55507 +5A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F795E +79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC152035875 +58EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A80000 +9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F +745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE6F84 +647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F6574661F +667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA08A938ACB +901D91929752975965897A0E810696BB5E2D60DC621A65A56614679077F37A4D +7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D7A837BC0 +8AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226624764B0 +681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA000000000000 +91 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE524D +55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A72D9 +758F758E790E795679DF7C977D207D4486078A34963B90619F2050E7527553CC +53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB0000 +64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 +83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E81D3 +85358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD75C5E8CCA +65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A592A6C70 +8A51553E581559A560F0625367C182356955964099C49A284F5358065BFE8010 +5CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB89000902E +968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD7027535355445B856258 +629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA000000000000 +92 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB04E39 +53585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D80C6 +86CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E557305F1B +6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C40000 +901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 +8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF55E16 +5E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A80748139 +817887768ABF8ADC8D858DF3929A957798029CE552C5635776F467156C8873CD +8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B469FB4F43 +6F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A91E39DB4 +4EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F608C62B5 +633A63D068AF6C407887798E7A0B7DE082478A028AE68E449013000000000000 +93 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +90B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F25FB9 +64A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B70B9 +4F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21767B +83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC0000 +51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF +76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152308463 +856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD52D5540C +58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F5F975FB3 +6D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A9CF682EB +5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D594890A3 +51854E4D51EA85998B0E7058637A934B696299B47E047577535769608EDF96E3 +6C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E735165000000000000 +94 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E745FF5 +637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF8FB2 +899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC4FF3 +5EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A9268850000 +6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD +67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA651FD +7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A91979AEA +4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD53DB5E06 +642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC491C67169 +981298EF633D6669756A76E478D0854386EE532A5351542659835E875F7C60B2 +6249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB8AB98CBB +907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E000000000000 +95 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C6867 +59EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C795EDF +63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA78CD3 +983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C6016627665770000 +65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB +6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D798F +8179890789866DF55F1762556CB84ECF72699B925206543B567458B361A4626E +711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E735F0A67C4 +4E26853D9589965B7C73980150FB58C1765678A7522577A585117B86504F5909 +72477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA57036355 +6B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E950234FF85305 +5446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B000000000000 +96 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D298FD +9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D068D2 +51927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A864B2 +6734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C60000 +646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE +9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E806F2B +85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A14810859997C8D6C11 +772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D660E76DF +8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A2183025984 +5B5F6BDB731B76F27DB280178499513267289ED976EE676252FF99055C24623B +7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F2577E25384 +5F797D0485AC8A338E8D975667F385AE9453610961086CB97652000000000000 +97 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E676D8C +733673377531795088D58A98904A909190F596C4878D59154E884F594E0E8A89 +8F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB67194 +75287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B320000 +6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A +4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A87406748375E2 +88CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C74097559 +786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC5BEE6599 +68816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B7DD1502B +539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F985E4EE4 +4F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E979F6266A6 +6B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F000000000000 +98 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +84EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717697C +69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B93328AD6 +502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C185686900 +6E7E789781550000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000005F0C +4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A82125F0D +4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED74EDE4EED +4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B4F694F70 +4F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE44FE5501A +50285014502A502550054F1C4FF650215029502C4FFE4FEF5011500650435047 +6703505550505048505A5056506C50785080509A508550B450B2000000000000 +99 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50C950CA50B350C250D650DE50E550ED50E350EE50F950F55109510151025116 +51155114511A5121513A5137513C513B513F51405152514C515451627AF85169 +516A516E5180518256D8518C5189518F519151935195519651A451A651A251A9 +51AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED0000 +51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C +525E5254526A527452695273527F527D528D529452925271528852918FA88FA7 +52AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F552F852F9 +530653087538530D5310530F5315531A5323532F533153335338534053465345 +4E175349534D51D6535E5369536E5918537B53775382539653A053A653A553AE +53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D5440542C +542D543C542E54365429541D544E548F5475548E545F5471547754705492547B +5480547654845490548654C754A254B854A554AC54C454C854A8000000000000 +9A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E25539 +55405563554C552E555C55455556555755385533555D5599558054AF558A559F +557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC55E4 +55D4561455F7561655FE55FD561B55F9564E565071DF56345636563256380000 +566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 +56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457095708 +570B570D57135718571655C7571C572657375738574E573B5740574F576957C0 +57885761577F5789579357A057B357A457AA57B057C357C657D457D257D3580A +57D657E3580B5819581D587258215862584B58706BC05852583D5879588558B9 +589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E558DC58E4 +58DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C592D5932 +5938593E7AD259555950594E595A5958596259605967596C5969000000000000 +9B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F5A11 +5A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC25ABD +5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E5B43 +5B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B800000 +5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 +5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C535C50 +5C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB65CBC5CB7 +5CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C5D1F5D1B +5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D875D845D82 +5DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB5DEB5DF2 +5DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E545E5F5E62 +5E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF000000000000 +9C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF85EFE +5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F5F51 +5F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E5F99 +5F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF602160600000 +601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F +604A6046604D6063604360646042606C606B60596081608D60E76083609A6084 +609B60966097609260A7608B60E160B860E060D360B45FF060BD60C660B560D8 +614D6115610660F660F7610060F460FA6103612160FB60F1610D610E6147613E +61286127614A613F613C612C6134613D614261446173617761586159615A616B +6174616F61656171615F615D6153617561996196618761AC6194619A618A6191 +61AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E661E361F6 +61FA61F461FF61FD61FC61FE620062086209620D620C6214621B000000000000 +9D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +621E6221622A622E6230623262336241624E625E6263625B62606268627C6282 +6289627E62926293629662D46283629462D762D162BB62CF62FF62C664D462C8 +62DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F56350 +633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B0000 +636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 +651D64176428640F6467646F6476644E652A6495649364A564A9648864BC64DA +64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF652C64F6 +64F464F264FA650064FD6518651C650565246523652B65346535653765366538 +754B654865566555654D6558655E655D65726578658265838B8A659B659F65AB +65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A660365FB +6773663566366634661C664F664466496641665E665D666466676668665F6662 +667066836688668E668966846698669D66C166B966C966BE66BC000000000000 +9E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E67266727 +9738672E673F67366741673867376746675E67606759676367646789677067A9 +677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E467DE +67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E0000 +68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 +68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD68D4 +68E768D569366912690468D768E3692568F968E068EF6928692A691A69236921 +68C669796977695C6978696B6954697E696E69396974693D695969306961695E +695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD69BB69C3 +69A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F969F269E7 +6A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A726A366A78 +6A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA3000000000000 +9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB6B05 +86166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B506B59 +6B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA46BAA +6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF0000 +9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B +6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE6CBA +6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D126D0C6D63 +6D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC76DE66DB8 +6DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D6E6E6E2E +6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E246EFF6E1D +6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F6EA56EC2 +6E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC000000000000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F586F8E +6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD86FF1 +6FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F7030 +703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD0000 +70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 +719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC71F9 +71FF720D7210721B7228722D722C72307232723B723C723F72407246724B7258 +7274727E7282728172877292729672A272A772B972B272C372C672C472CE72D2 +72E272E072E172F972F7500F7317730A731C7316731D7334732F73297325733E +734E734F9ED87357736A7368737073787375737B737A73C873B373CE73BB73C0 +73E573EE73DE74A27405746F742573F87432743A7455743F745F74597441745C +746974707463746A7476747E748B749E74A774CA74CF74D473F1000000000000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74E074E374E774E974EE74F274F074F174F874F7750475037505750C750E750D +75157513751E7526752C753C7544754D754A7549755B7546755A756975647567 +756B756D75787576758675877574758A758975827594759A759D75A575A375C2 +75B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF0000 +75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 +7630763B764776487646765C76587661766276687669766A7667766C76707672 +76767678767C768076837688768B768E769676937699769A76B076B476B876B9 +76BA76C276CD76D676D276DE76E176E576E776EA862F76FB7708770777047729 +7724771E77257726771B773777387747775A7768776B775B7765777F777E7779 +778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD77D777DA +77DC77E377EE77FC780C781279267820792A7845788E78747886787C789A788C +78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC000000000000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +78E778DA78FD78F47907791279117919792C792B794079607957795F795A7955 +7953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E779EC +79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A577A49 +7A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB00000 +7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 +7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B507B7A +7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D7B987B9F +7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC67BDD7BE9 +7C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C237C277C2A +7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C567C657C6C +7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB97CBD7CC0 +7CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D06000000000000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D727D68 +7D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD7DAB +7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E057E0A +7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E370000 +7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D +8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A7F45 +7F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F787F827F86 +7F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB67FB88B71 +7FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B80128018 +8019801C80218028803F803B804A804680528058805A805F8062806880738072 +807080768079807D807F808480868085809B8093809A80AD519080AC80DB80E5 +80D980DD80C480DA80D6810980EF80F1811B81298123812F814B000000000000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +968B8146813E8153815180FC8171816E81658166817481838188818A81808182 +81A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA81C9 +81CD81D181D981D881C881DA81DF81E081E781FA81FB81FE8201820282058207 +820A820D821082168229822B82388233824082598258825D825A825F82640000 +82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 +82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D98335 +83348316833283318340833983508345832F832B831783188385839A83AA839F +83A283968323838E8387838A837C83B58373837583A0838983A883F4841383EB +83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD84388506 +83FB846D842A843C855A84848477846B84AD846E848284698446842C846F8479 +843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D684A18521 +84FF84F485178518852C851F8515851484FC8540856385588548000000000000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +85418602854B8555858085A485888591858A85A8856D8594859B85EA8587859C +8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613860B +85FE85FA86068622861A8630863F864D4E558654865F86678671869386A386A9 +86AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC0000 +86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F +8737873B87258729871A8760875F8778874C874E877487578768876E87598753 +8763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C487B387C7 +87C687BB87EF87F287E0880F880D87FE87F687F7880E87D28811881688158822 +88218831883688398827883B8844884288528859885E8862886B8881887E889E +8875887D88B5887288828897889288AE889988A2888D88A488B088BF88B188C3 +88C488D488D888D988DD88F9890288FC88F488E888F28904890C890A89138943 +891E8925892A892B89418944893B89368938894C891D8960895E000000000000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89668964896D896A896F89748977897E89838988898A8993899889A189A989A6 +89AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A168A10 +8A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A858A82 +8A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE70000 +8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 +8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B8B5F +8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C418C3F8C48 +8C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E8C948C7C +8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA8CFD8CFA +8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D678D6D8D71 +8D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB8DDF8DE3 +8DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A000000000000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E818E87 +8E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE8EC5 +8EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C8F1F +8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C0000 +8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 +90058FF98FFA901190159021900D901E9016900B90279036903590398FF8904F +905090519052900E9049903E90569058905E9068906F907696A890729082907D +90819080908A9089908F90A890AF90B190B590E290E4624890DB910291129119 +91329130914A9156915891639165916991739172918B9189918291A291AB91AF +91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC91F591F6 +921E91FF9214922C92159211925E925792459249926492489295923F924B9250 +929C92969293929B925A92CF92B992B792E9930F92FA9344932E000000000000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +93199322931A9323933A9335933B935C9360937C936E935693B093AC93AD9394 +93B993D693D793E893E593D893C393DD93D093C893E4941A9414941394039407 +94109436942B94359421943A944194529444945B94609462945E946A92299470 +94759477947D945A947C947E9481947F95829587958A95949596959895990000 +95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 +95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E965D +965F96669672966C968D96989695969796AA96A796B196B296B096B496B696B8 +96B996CE96CB96C996CD894D96DC970D96D596F99704970697089713970E9711 +970F971697199724972A97309739973D973E97449746974897429749975C9760 +97649766976852D2976B977197799785977C9781977A9786978B978F9790979C +97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF97F697F5 +980F980C9838982498219837983D9846984F984B986B986F9870000000000000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +98719874987398AA98AF98B198B698C498C398C698E998EB9903990999129914 +99189921991D991E99249920992C992E993D993E9942994999459950994B9951 +9952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED99EE +99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A430000 +9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 +9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF79AFB +9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B329B449B43 +9B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA89BB49BC0 +9BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF19BF09C15 +9C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C219C309C47 +9C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB9D039D06 +9D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D48000000000000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA99DB2 +9DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD9E1A +9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA99EB8 +9EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF0000 +9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 +9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA0582F +69C79059746451DC719900000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F8B5F8B60000000000000000000000000000000000000000000000000000 +F8B7FE33000000000000000000000000000000000000F8B8FE31F8B900000000 +F8BAF8BBF8BCF8BDFE300000000000000000FE35FE36FE39FE3AF8BEF8BFFE37 +FE38FE3FFE40FE3DFE3EFE41FE42FE43FE44FE3BFE3C00000000000000000000 +0000F8C000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000F8C1 +0000F8C20000F8C30000F8C40000F8C500000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F8C600000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F8C70000F8C80000F8C9000000000000000000000000F8CA000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +F8CB0000F8CC0000F8CD0000F8CE0000F8CF0000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000F8D00000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000F8D10000F8D20000F8D3000000000000000000000000F8D40000 +00000000000000000000F8D5F8D6000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macRoman.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macRoman.enc new file mode 100644 index 00000000..15de2662 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macRoman.enc @@ -0,0 +1,20 @@ +# Encoding file: macRoman, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 +00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC +202000B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8 +221E00B12264226500A500B522022211220F03C0222B00AA00BA03A900E600F8 +00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153 +20132014201C201D2018201900F725CA00FF0178204420AC2039203AFB01FB02 +202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4 +F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macRomania.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macRomania.enc new file mode 100644 index 00000000..ce41cf42 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macRomania.enc @@ -0,0 +1,20 @@ +# Encoding file: macRomania, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 +00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC +202000B000A200A300A7202200B600DF00AE00A9212200B400A822600102015E +221E00B12264226500A500B522022211220F03C0222B00AA00BA21260103015F +00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153 +20132014201C201D2018201900F725CA00FF0178204400A42039203A01620163 +202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4 +F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macThai.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macThai.enc new file mode 100644 index 00000000..7d9c8ad4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macThai.enc @@ -0,0 +1,20 @@ +# Encoding file: macThai, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00AB00BB2026F88CF88FF892F895F898F88BF88EF891F894F897201C201DF899 +FFFD2022F884F889F885F886F887F888F88AF88DF890F893F89620182019FFFD +00A00E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F +0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F +0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F +0E300E310E320E330E340E350E360E370E380E390E3AFEFF200B201320140E3F +0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D21220E4F +0E500E510E520E530E540E550E560E570E580E5900AE00A9FFFDFFFDFFFDFFFD diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macTurkish.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macTurkish.enc new file mode 100644 index 00000000..f9542ae5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macTurkish.enc @@ -0,0 +1,20 @@ +# Encoding file: macTurkish, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 +00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC +202000B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8 +221E00B12264226500A500B522022211220F03C0222B00AA00BA03A900E600F8 +00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153 +20132014201C201D2018201900F725CA00FF0178011E011F01300131015E015F +202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4 +F8FF00D200DA00DB00D9F8A002C602DC00AF02D802D902DA00B802DD02DB02C7 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macUkraine.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macUkraine.enc new file mode 100644 index 00000000..643cc45e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/macUkraine.enc @@ -0,0 +1,20 @@ +# Encoding file: macUkraine, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0410041104120413041404150416041704180419041A041B041C041D041E041F +0420042104220423042404250426042704280429042A042B042C042D042E042F +202000B0049000A300A7202200B6040600AE00A9212204020452226004030453 +221E00B122642265045600B504910408040404540407045704090459040A045A +0458040500AC221A01922248220600AB00BB202600A0040B045B040C045C0455 +20132014201C201D2018201900F7201E040E045E040F045F211604010451044F +0430043104320433043404350436043704380439043A043B043C043D043E043F +0440044104420443044404450446044704480449044A044B044C044D044E00A4 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/shiftjis.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/shiftjis.enc new file mode 100644 index 00000000..140aec4c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/shiftjis.enc @@ -0,0 +1,690 @@ +# Encoding file: shiftjis, multi-byte +M +003F 0 40 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080000000000000000000850086008700000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F +FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F +FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F +FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +81 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8FF3E +FFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0FFF3C +301C2016FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3DFF5B +FF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D70000 +00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 +FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C725C6 +25A125A025B325B225BD25BC203B301221922190219121933013000000000000 +000000000000000000000000000000002208220B2286228722822283222A2229 +000000000000000000000000000000002227222800AC21D221D4220022030000 +0000000000000000000000000000000000000000222022A52312220222072261 +2252226A226B221A223D221D2235222B222C0000000000000000000000000000 +212B2030266F266D266A2020202100B6000000000000000025EF000000000000 +82 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000FF10 +FF11FF12FF13FF14FF15FF16FF17FF18FF190000000000000000000000000000 +FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30 +FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A000000000000000000000000 +0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000003041 +30423043304430453046304730483049304A304B304C304D304E304F30503051 +30523053305430553056305730583059305A305B305C305D305E305F30603061 +30623063306430653066306730683069306A306B306C306D306E306F30703071 +30723073307430753076307730783079307A307B307C307D307E307F30803081 +30823083308430853086308730883089308A308B308C308D308E308F30903091 +3092309300000000000000000000000000000000000000000000000000000000 +83 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF30B0 +30B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF30C0 +30C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF30D0 +30D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF0000 +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000391 +03920393039403950396039703980399039A039B039C039D039E039F03A003A1 +03A303A403A503A603A703A803A90000000000000000000000000000000003B1 +03B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C1 +03C303C403C503C603C703C803C9000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +84 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +04100411041204130414041504010416041704180419041A041B041C041D041E +041F0420042104220423042404250426042704280429042A042B042C042D042E +042F000000000000000000000000000000000000000000000000000000000000 +04300431043204330434043504510436043704380439043A043B043C043D0000 +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000002500 +2502250C251025182514251C252C25242534253C25012503250F2513251B2517 +25232533252B253B254B2520252F25282537253F251D25302525253825420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +88 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000004E9C +55165A03963F54C0611B632859F690228475831C7A5060AA63E16E2565ED8466 +82A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E62167C9F88B7 +5B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2593759D4 +5A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3840E8863 +8B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA290387A328328 +828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D000000000000 +89 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E117893 +81FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B96F2 +834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E9834 +82F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD51860000 +5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 +827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC62BC +65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B51045C4B61B6 +81C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F554F3D4FA1 +4F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3706B73C2 +798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA88FE6904E +971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D54ECB4F1A +89E356DE584A58CA5EFB5FEB602A6094606261D0621262D06539000000000000 +8A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE5916 +54B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D957A3 +67FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B899A +89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B0000 +6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 +53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584317CA5 +520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E65B8C5B98 +5BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B536C576F22 +6F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266839E89B3 +8ACC8CAB908494519593959195A2966597D3992882184E38542B5CB85DCC73A9 +764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C566857FA5947 +5B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C4000000000000 +8B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D778ECC +8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A075917947 +7FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A70782767759ECD +53745BA2811A865090064E184E454EC74F1153CA54385BAE5F13602565510000 +673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 +5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC4F9B +4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F375F4A602F +6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F793E197FF +99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C552E45747 +5DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F8B398FD1 +91D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C899D25177 +611A865E55B07A7A50765BD3904796854E326ADB91E75C515C48000000000000 +8C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B85AB +8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B5951 +5F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB7D4C +7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE80000 +5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 +503950265065517C5238526355A7570F58055ACC5EFA61B261F862F36372691C +6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED290639375967A +98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D4382378A008AFA +96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF6E5672D0 +7CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E924F0D5348 +5449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B7791904E5E9BC9 +4EA44F7C4FAF501950165149516C529F52B952FE539A53E35411000000000000 +8D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB75F18 +6052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A6D69 +6E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B18154 +818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D0000 +980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B +544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC6B64 +98034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D57D3A826E +9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A50939688DF5750 +5EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D6B736E08 +707D91C7728078157826796D658E7D3083DC88C18F09969B5264572867507F6A +8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A548B643E +6628671467F57A847B567D22932F685C9BAD7B395319518A5237000000000000 +8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF66524E09 +509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB9178 +991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB59C9 +59FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B620000 +6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C +8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166426B21 +6ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F5F0F8B58 +9D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F0675BE8CEA +5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66659C716E +793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235914C91C8 +932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E816B8DA3 +91529996511253D7546A5BFF63886A397DAC970056DA53CE5468000000000000 +8F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F84908846 +89728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E67D4 +6C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F51FA +88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF30000 +6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 +7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F52DD +5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C115C1A5E84 +5E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A26A1F6A35 +6CBC6D886E096E58713C7126716775C77701785D7901796579F07AE07B117CA7 +7D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A49266937E +9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E3860C564FE +676167566D4472B675737A6384B88B7291B89320563157F498FE000000000000 +90 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB55507 +5A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F795E +79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC152035875 +58EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A80000 +9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F +745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE6F84 +647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F6574661F +667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA08A938ACB +901D91929752975965897A0E810696BB5E2D60DC621A65A56614679077F37A4D +7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D7A837BC0 +8AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226624764B0 +681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA000000000000 +91 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE524D +55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A72D9 +758F758E790E795679DF7C977D207D4486078A34963B90619F2050E7527553CC +53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB0000 +64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 +83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E81D3 +85358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD75C5E8CCA +65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A592A6C70 +8A51553E581559A560F0625367C182356955964099C49A284F5358065BFE8010 +5CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB89000902E +968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD7027535355445B856258 +629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA000000000000 +92 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB04E39 +53585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D80C6 +86CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E557305F1B +6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C40000 +901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 +8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF55E16 +5E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A80748139 +817887768ABF8ADC8D858DF3929A957798029CE552C5635776F467156C8873CD +8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B469FB4F43 +6F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A91E39DB4 +4EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F608C62B5 +633A63D068AF6C407887798E7A0B7DE082478A028AE68E449013000000000000 +93 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +90B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F25FB9 +64A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B70B9 +4F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21767B +83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC0000 +51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF +76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152308463 +856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD52D5540C +58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F5F975FB3 +6D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A9CF682EB +5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D594890A3 +51854E4D51EA85998B0E7058637A934B696299B47E047577535769608EDF96E3 +6C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E735165000000000000 +94 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E745FF5 +637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF8FB2 +899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC4FF3 +5EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A9268850000 +6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD +67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA651FD +7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A91979AEA +4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD53DB5E06 +642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC491C67169 +981298EF633D6669756A76E478D0854386EE532A5351542659835E875F7C60B2 +6249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB8AB98CBB +907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E000000000000 +95 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C6867 +59EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C795EDF +63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA78CD3 +983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C6016627665770000 +65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB +6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D798F +8179890789866DF55F1762556CB84ECF72699B925206543B567458B361A4626E +711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E735F0A67C4 +4E26853D9589965B7C73980150FB58C1765678A7522577A585117B86504F5909 +72477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA57036355 +6B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E950234FF85305 +5446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B000000000000 +96 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D298FD +9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D068D2 +51927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A864B2 +6734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C60000 +646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE +9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E806F2B +85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A14810859997C8D6C11 +772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D660E76DF +8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A2183025984 +5B5F6BDB731B76F27DB280178499513267289ED976EE676252FF99055C24623B +7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F2577E25384 +5F797D0485AC8A338E8D975667F385AE9453610961086CB9765200000000FF5E +97 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E676D8C +733673377531795088D58A98904A909190F596C4878D59154E884F594E0E8A89 +8F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB67194 +75287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B320000 +6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A +4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A87406748375E2 +88CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C74097559 +786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC5BEE6599 +68816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B7DD1502B +539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F985E4EE4 +4F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E979F6266A6 +6B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F000000000000 +98 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +84EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717697C +69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B93328AD6 +502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C185686900 +6E7E789781550000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000005F0C +4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A82125F0D +4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED74EDE4EED +4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B4F694F70 +4F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE44FE5501A +50285014502A502550054F1C4FF650215029502C4FFE4FEF5011500650435047 +6703505550505048505A5056506C50785080509A508550B450B2000000000000 +99 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50C950CA50B350C250D650DE50E550ED50E350EE50F950F55109510151025116 +51155114511A5121513A5137513C513B513F51405152514C515451627AF85169 +516A516E5180518256D8518C5189518F519151935195519651A451A651A251A9 +51AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED0000 +51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C +525E5254526A527452695273527F527D528D529452925271528852918FA88FA7 +52AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F552F852F9 +530653087538530D5310530F5315531A5323532F533153335338534053465345 +4E175349534D51D6535E5369536E5918537B53775382539653A053A653A553AE +53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D5440542C +542D543C542E54365429541D544E548F5475548E545F5471547754705492547B +5480547654845490548654C754A254B854A554AC54C454C854A8000000000000 +9A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E25539 +55405563554C552E555C55455556555755385533555D5599558054AF558A559F +557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC55E4 +55D4561455F7561655FE55FD561B55F9564E565071DF56345636563256380000 +566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 +56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457095708 +570B570D57135718571655C7571C572657375738574E573B5740574F576957C0 +57885761577F5789579357A057B357A457AA57B057C357C657D457D257D3580A +57D657E3580B5819581D587258215862584B58706BC05852583D5879588558B9 +589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E558DC58E4 +58DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C592D5932 +5938593E7AD259555950594E595A5958596259605967596C5969000000000000 +9B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F5A11 +5A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC25ABD +5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E5B43 +5B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B800000 +5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 +5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C535C50 +5C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB65CBC5CB7 +5CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C5D1F5D1B +5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D875D845D82 +5DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB5DEB5DF2 +5DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E545E5F5E62 +5E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF000000000000 +9C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF85EFE +5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F5F51 +5F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E5F99 +5F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF602160600000 +601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F +604A6046604D6063604360646042606C606B60596081608D60E76083609A6084 +609B60966097609260A7608B60E160B860E060D360B45FF060BD60C660B560D8 +614D6115610660F660F7610060F460FA6103612160FB60F1610D610E6147613E +61286127614A613F613C612C6134613D614261446173617761586159615A616B +6174616F61656171615F615D6153617561996196618761AC6194619A618A6191 +61AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E661E361F6 +61FA61F461FF61FD61FC61FE620062086209620D620C6214621B000000000000 +9D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +621E6221622A622E6230623262336241624E625E6263625B62606268627C6282 +6289627E62926293629662D46283629462D762D162BB62CF62FF62C664D462C8 +62DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F56350 +633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B0000 +636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 +651D64176428640F6467646F6476644E652A6495649364A564A9648864BC64DA +64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF652C64F6 +64F464F264FA650064FD6518651C650565246523652B65346535653765366538 +754B654865566555654D6558655E655D65726578658265838B8A659B659F65AB +65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A660365FB +6773663566366634661C664F664466496641665E665D666466676668665F6662 +667066836688668E668966846698669D66C166B966C966BE66BC000000000000 +9E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E67266727 +9738672E673F67366741673867376746675E67606759676367646789677067A9 +677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E467DE +67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E0000 +68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 +68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD68D4 +68E768D569366912690468D768E3692568F968E068EF6928692A691A69236921 +68C669796977695C6978696B6954697E696E69396974693D695969306961695E +695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD69BB69C3 +69A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F969F269E7 +6A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A726A366A78 +6A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA3000000000000 +9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB6B05 +86166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B506B59 +6B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA46BAA +6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF0000 +9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B +6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE6CBA +6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D126D0C6D63 +6D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC76DE66DB8 +6DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D6E6E6E2E +6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E246EFF6E1D +6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F6EA56EC2 +6E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC000000000000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F586F8E +6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD86FF1 +6FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F7030 +703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD0000 +70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 +719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC71F9 +71FF720D7210721B7228722D722C72307232723B723C723F72407246724B7258 +7274727E7282728172877292729672A272A772B972B272C372C672C472CE72D2 +72E272E072E172F972F7500F7317730A731C7316731D7334732F73297325733E +734E734F9ED87357736A7368737073787375737B737A73C873B373CE73BB73C0 +73E573EE73DE74A27405746F742573F87432743A7455743F745F74597441745C +746974707463746A7476747E748B749E74A774CA74CF74D473F1000000000000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74E074E374E774E974EE74F274F074F174F874F7750475037505750C750E750D +75157513751E7526752C753C7544754D754A7549755B7546755A756975647567 +756B756D75787576758675877574758A758975827594759A759D75A575A375C2 +75B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF0000 +75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 +7630763B764776487646765C76587661766276687669766A7667766C76707672 +76767678767C768076837688768B768E769676937699769A76B076B476B876B9 +76BA76C276CD76D676D276DE76E176E576E776EA862F76FB7708770777047729 +7724771E77257726771B773777387747775A7768776B775B7765777F777E7779 +778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD77D777DA +77DC77E377EE77FC780C781279267820792A7845788E78747886787C789A788C +78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC000000000000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +78E778DA78FD78F47907791279117919792C792B794079607957795F795A7955 +7953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E779EC +79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A577A49 +7A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB00000 +7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 +7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B507B7A +7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D7B987B9F +7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC67BDD7BE9 +7C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C237C277C2A +7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C567C657C6C +7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB97CBD7CC0 +7CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D06000000000000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D727D68 +7D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD7DAB +7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E057E0A +7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E370000 +7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D +8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A7F45 +7F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F787F827F86 +7F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB67FB88B71 +7FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B80128018 +8019801C80218028803F803B804A804680528058805A805F8062806880738072 +807080768079807D807F808480868085809B8093809A80AD519080AC80DB80E5 +80D980DD80C480DA80D6810980EF80F1811B81298123812F814B000000000000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +968B8146813E8153815180FC8171816E81658166817481838188818A81808182 +81A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA81C9 +81CD81D181D981D881C881DA81DF81E081E781FA81FB81FE8201820282058207 +820A820D821082168229822B82388233824082598258825D825A825F82640000 +82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 +82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D98335 +83348316833283318340833983508345832F832B831783188385839A83AA839F +83A283968323838E8387838A837C83B58373837583A0838983A883F4841383EB +83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD84388506 +83FB846D842A843C855A84848477846B84AD846E848284698446842C846F8479 +843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D684A18521 +84FF84F485178518852C851F8515851484FC8540856385588548000000000000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +85418602854B8555858085A485888591858A85A8856D8594859B85EA8587859C +8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613860B +85FE85FA86068622861A8630863F864D4E558654865F86678671869386A386A9 +86AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC0000 +86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F +8737873B87258729871A8760875F8778874C874E877487578768876E87598753 +8763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C487B387C7 +87C687BB87EF87F287E0880F880D87FE87F687F7880E87D28811881688158822 +88218831883688398827883B8844884288528859885E8862886B8881887E889E +8875887D88B5887288828897889288AE889988A2888D88A488B088BF88B188C3 +88C488D488D888D988DD88F9890288FC88F488E888F28904890C890A89138943 +891E8925892A892B89418944893B89368938894C891D8960895E000000000000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89668964896D896A896F89748977897E89838988898A8993899889A189A989A6 +89AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A168A10 +8A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A858A82 +8A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE70000 +8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 +8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B8B5F +8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C418C3F8C48 +8C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E8C948C7C +8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA8CFD8CFA +8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D678D6D8D71 +8D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB8DDF8DE3 +8DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A000000000000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E818E87 +8E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE8EC5 +8EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C8F1F +8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C0000 +8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 +90058FF98FFA901190159021900D901E9016900B90279036903590398FF8904F +905090519052900E9049903E90569058905E9068906F907696A890729082907D +90819080908A9089908F90A890AF90B190B590E290E4624890DB910291129119 +91329130914A9156915891639165916991739172918B9189918291A291AB91AF +91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC91F591F6 +921E91FF9214922C92159211925E925792459249926492489295923F924B9250 +929C92969293929B925A92CF92B992B792E9930F92FA9344932E000000000000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +93199322931A9323933A9335933B935C9360937C936E935693B093AC93AD9394 +93B993D693D793E893E593D893C393DD93D093C893E4941A9414941394039407 +94109436942B94359421943A944194529444945B94609462945E946A92299470 +94759477947D945A947C947E9481947F95829587958A95949596959895990000 +95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 +95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E965D +965F96669672966C968D96989695969796AA96A796B196B296B096B496B696B8 +96B996CE96CB96C996CD894D96DC970D96D596F99704970697089713970E9711 +970F971697199724972A97309739973D973E97449746974897429749975C9760 +97649766976852D2976B977197799785977C9781977A9786978B978F9790979C +97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF97F697F5 +980F980C9838982498219837983D9846984F984B986B986F9870000000000000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +98719874987398AA98AF98B198B698C498C398C698E998EB9903990999129914 +99189921991D991E99249920992C992E993D993E9942994999459950994B9951 +9952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED99EE +99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A430000 +9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 +9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF79AFB +9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B329B449B43 +9B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA89BB49BC0 +9BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF19BF09C15 +9C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C219C309C47 +9C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB9D039D06 +9D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D48000000000000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA99DB2 +9DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD9E1A +9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA99EB8 +9EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF0000 +9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 +9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA0582F +69C79059746451DC719900000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +R +8160 301C FF5E +8161 2016 2225 +817C 2212 FF0D +8191 00A2 FFE0 +8192 00A3 FFE1 +81CA 00AC FFE2 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/symbol.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/symbol.enc new file mode 100644 index 00000000..ffda9e3e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/symbol.enc @@ -0,0 +1,20 @@ +# Encoding file: symbol, single-byte +S +003F 1 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002122000023220300250026220D002800292217002B002C2212002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +22450391039203A70394039503A603930397039903D1039A039B039C039D039F +03A0039803A103A303A403A503C203A9039E03A80396005B2234005D22A5005F +F8E503B103B203C703B403B503C603B303B703B903D503BA03BB03BC03BD03BF +03C003B803C103C303C403C503D603C903BE03C803B6007B007C007D223C007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +000003D2203222642044221E0192266326662665266021942190219121922193 +00B000B12033226500D7221D2202202200F72260226122482026F8E6F8E721B5 +21352111211C21182297229522052229222A2283228722842282228622082209 +2220220700AE00A92122220F221A22C500AC2227222821D421D021D121D221D3 +22C42329F8E8F8E9F8EA2211F8EBF8ECF8EDF8EEF8EFF8F0F8F1F8F2F8F3F8F4 +F8FF232A222B2320F8F52321F8F6F8F7F8F8F8F9F8FAF8FBF8FCF8FDF8FE0000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/encoding/tis-620.enc b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/tis-620.enc new file mode 100644 index 00000000..2e9142a4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/encoding/tis-620.enc @@ -0,0 +1,20 @@ +# Encoding file: tis-620, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F +0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F +0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F +0E300E310E320E330E340E350E360E370E380E390E3A00000000000000000E3F +0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D0E4E0E4F +0E500E510E520E530E540E550E560E570E580E590E5A0E5B0000000000000000 diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/history.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/history.tcl new file mode 100644 index 00000000..ef9099be --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/history.tcl @@ -0,0 +1,335 @@ +# history.tcl -- +# +# Implementation of the history command. +# +# Copyright (c) 1997 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution of +# this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# The tcl::history array holds the history list and some additional +# bookkeeping variables. +# +# nextid the index used for the next history list item. +# keep the max size of the history list +# oldest the index of the oldest item in the history. + +namespace eval ::tcl { + variable history + if {![info exists history]} { + array set history { + nextid 0 + keep 20 + oldest -20 + } + } + + namespace ensemble create -command ::tcl::history -map { + add ::tcl::HistAdd + change ::tcl::HistChange + clear ::tcl::HistClear + event ::tcl::HistEvent + info ::tcl::HistInfo + keep ::tcl::HistKeep + nextid ::tcl::HistNextID + redo ::tcl::HistRedo + } +} + +# history -- +# +# This is the main history command. See the man page for its interface. +# This does some argument checking and calls the helper ensemble in the +# tcl namespace. + +proc ::history {args} { + # If no command given, we're doing 'history info'. Can't be done with an + # ensemble unknown handler, as those don't fire when no subcommand is + # given at all. + + if {![llength $args]} { + set args info + } + + # Tricky stuff needed to make stack and errors come out right! + tailcall apply {arglist {tailcall history {*}$arglist} ::tcl} $args +} + +# (unnamed) -- +# +# Callback when [::history] is destroyed. Destroys the implementation. +# +# Parameters: +# oldName what the command was called. +# newName what the command is now called (an empty string). +# op the operation (= delete). +# +# Results: +# none +# +# Side Effects: +# The implementation of the [::history] command ceases to exist. + +trace add command ::history delete [list apply {{oldName newName op} { + variable history + unset -nocomplain history + foreach c [info procs ::tcl::Hist*] { + rename $c {} + } + rename ::tcl::history {} +} ::tcl}] + +# tcl::HistAdd -- +# +# Add an item to the history, and optionally eval it at the global scope +# +# Parameters: +# event the command to add +# exec (optional) a substring of "exec" causes the command to +# be evaled. +# Results: +# If executing, then the results of the command are returned +# +# Side Effects: +# Adds to the history list + +proc ::tcl::HistAdd {event {exec {}}} { + variable history + + if { + [prefix longest {exec {}} $exec] eq "" + && [llength [info level 0]] == 3 + } then { + return -code error "bad argument \"$exec\": should be \"exec\"" + } + + # Do not add empty commands to the history + if {[string trim $event] eq ""} { + return "" + } + + # Maintain the history + set history([incr history(nextid)]) $event + unset -nocomplain history([incr history(oldest)]) + + # Only execute if 'exec' (or non-empty prefix of it) given + if {$exec eq ""} { + return "" + } + tailcall eval $event +} + +# tcl::HistKeep -- +# +# Set or query the limit on the length of the history list +# +# Parameters: +# limit (optional) the length of the history list +# +# Results: +# If no limit is specified, the current limit is returned +# +# Side Effects: +# Updates history(keep) if a limit is specified + +proc ::tcl::HistKeep {{count {}}} { + variable history + if {[llength [info level 0]] == 1} { + return $history(keep) + } + if {![string is integer -strict $count] || ($count < 0)} { + return -code error "illegal keep count \"$count\"" + } + set oldold $history(oldest) + set history(oldest) [expr {$history(nextid) - $count}] + for {} {$oldold <= $history(oldest)} {incr oldold} { + unset -nocomplain history($oldold) + } + set history(keep) $count +} + +# tcl::HistClear -- +# +# Erase the history list +# +# Parameters: +# none +# +# Results: +# none +# +# Side Effects: +# Resets the history array, except for the keep limit + +proc ::tcl::HistClear {} { + variable history + set keep $history(keep) + unset history + array set history [list \ + nextid 0 \ + keep $keep \ + oldest -$keep \ + ] +} + +# tcl::HistInfo -- +# +# Return a pretty-printed version of the history list +# +# Parameters: +# num (optional) the length of the history list to return +# +# Results: +# A formatted history list + +proc ::tcl::HistInfo {{count {}}} { + variable history + if {[llength [info level 0]] == 1} { + set count [expr {$history(keep) + 1}] + } elseif {![string is integer -strict $count]} { + return -code error "bad integer \"$count\"" + } + set result {} + set newline "" + for {set i [expr {$history(nextid) - $count + 1}]} \ + {$i <= $history(nextid)} {incr i} { + if {![info exists history($i)]} { + continue + } + set cmd [string map [list \n \n\t] [string trimright $history($i) \ \n]] + append result $newline[format "%6d %s" $i $cmd] + set newline \n + } + return $result +} + +# tcl::HistRedo -- +# +# Fetch the previous or specified event, execute it, and then replace +# the current history item with that event. +# +# Parameters: +# event (optional) index of history item to redo. Defaults to -1, +# which means the previous event. +# +# Results: +# Those of the command being redone. +# +# Side Effects: +# Replaces the current history list item with the one being redone. + +proc ::tcl::HistRedo {{event -1}} { + variable history + + set i [HistIndex $event] + if {$i == $history(nextid)} { + return -code error "cannot redo the current event" + } + set cmd $history($i) + HistChange $cmd 0 + tailcall eval $cmd +} + +# tcl::HistIndex -- +# +# Map from an event specifier to an index in the history list. +# +# Parameters: +# event index of history item to redo. +# If this is a positive number, it is used directly. +# If it is a negative number, then it counts back to a previous +# event, where -1 is the most recent event. +# A string can be matched, either by being the prefix of a +# command or by matching a command with string match. +# +# Results: +# The index into history, or an error if the index didn't match. + +proc ::tcl::HistIndex {event} { + variable history + if {![string is integer -strict $event]} { + for {set i [expr {$history(nextid)-1}]} {[info exists history($i)]} \ + {incr i -1} { + if {[string match $event* $history($i)]} { + return $i + } + if {[string match $event $history($i)]} { + return $i + } + } + return -code error "no event matches \"$event\"" + } elseif {$event <= 0} { + set i [expr {$history(nextid) + $event}] + } else { + set i $event + } + if {$i <= $history(oldest)} { + return -code error "event \"$event\" is too far in the past" + } + if {$i > $history(nextid)} { + return -code error "event \"$event\" hasn't occured yet" + } + return $i +} + +# tcl::HistEvent -- +# +# Map from an event specifier to the value in the history list. +# +# Parameters: +# event index of history item to redo. See index for a description of +# possible event patterns. +# +# Results: +# The value from the history list. + +proc ::tcl::HistEvent {{event -1}} { + variable history + set i [HistIndex $event] + if {![info exists history($i)]} { + return "" + } + return [string trimright $history($i) \ \n] +} + +# tcl::HistChange -- +# +# Replace a value in the history list. +# +# Parameters: +# newValue The new value to put into the history list. +# event (optional) index of history item to redo. See index for a +# description of possible event patterns. This defaults to 0, +# which specifies the current event. +# +# Side Effects: +# Changes the history list. + +proc ::tcl::HistChange {newValue {event 0}} { + variable history + set i [HistIndex $event] + set history($i) $newValue +} + +# tcl::HistNextID -- +# +# Returns the number of the next history event. +# +# Parameters: +# None. +# +# Side Effects: +# None. + +proc ::tcl::HistNextID {} { + variable history + return [expr {$history(nextid) + 1}] +} + +return + +# Local Variables: +# mode: tcl +# fill-column: 78 +# End: diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/http1.0/http.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/http1.0/http.tcl new file mode 100644 index 00000000..8329de41 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/http1.0/http.tcl @@ -0,0 +1,377 @@ +# http.tcl +# Client-side HTTP for GET, POST, and HEAD commands. +# These routines can be used in untrusted code that uses the Safesock +# security policy. +# These procedures use a callback interface to avoid using vwait, +# which is not defined in the safe base. +# +# See the http.n man page for documentation + +package provide http 1.0 + +array set http { + -accept */* + -proxyhost {} + -proxyport {} + -useragent {Tcl http client package 1.0} + -proxyfilter httpProxyRequired +} +proc http_config {args} { + global http + set options [lsort [array names http -*]] + set usage [join $options ", "] + if {[llength $args] == 0} { + set result {} + foreach name $options { + lappend result $name $http($name) + } + return $result + } + regsub -all -- - $options {} options + set pat ^-([join $options |])$ + if {[llength $args] == 1} { + set flag [lindex $args 0] + if {[regexp -- $pat $flag]} { + return $http($flag) + } else { + return -code error "Unknown option $flag, must be: $usage" + } + } else { + foreach {flag value} $args { + if {[regexp -- $pat $flag]} { + set http($flag) $value + } else { + return -code error "Unknown option $flag, must be: $usage" + } + } + } +} + + proc httpFinish { token {errormsg ""} } { + upvar #0 $token state + global errorInfo errorCode + if {[string length $errormsg] != 0} { + set state(error) [list $errormsg $errorInfo $errorCode] + set state(status) error + } + catch {close $state(sock)} + catch {after cancel $state(after)} + if {[info exists state(-command)]} { + if {[catch {eval $state(-command) {$token}} err]} { + if {[string length $errormsg] == 0} { + set state(error) [list $err $errorInfo $errorCode] + set state(status) error + } + } + unset state(-command) + } +} +proc http_reset { token {why reset} } { + upvar #0 $token state + set state(status) $why + catch {fileevent $state(sock) readable {}} + httpFinish $token + if {[info exists state(error)]} { + set errorlist $state(error) + unset state(error) + eval error $errorlist + } +} +proc http_get { url args } { + global http + if {![info exists http(uid)]} { + set http(uid) 0 + } + set token http#[incr http(uid)] + upvar #0 $token state + http_reset $token + array set state { + -blocksize 8192 + -validate 0 + -headers {} + -timeout 0 + state header + meta {} + currentsize 0 + totalsize 0 + type text/html + body {} + status "" + } + set options {-blocksize -channel -command -handler -headers \ + -progress -query -validate -timeout} + set usage [join $options ", "] + regsub -all -- - $options {} options + set pat ^-([join $options |])$ + foreach {flag value} $args { + if {[regexp $pat $flag]} { + # Validate numbers + if {[info exists state($flag)] && \ + [regexp {^[0-9]+$} $state($flag)] && \ + ![regexp {^[0-9]+$} $value]} { + return -code error "Bad value for $flag ($value), must be integer" + } + set state($flag) $value + } else { + return -code error "Unknown option $flag, can be: $usage" + } + } + if {! [regexp -nocase {^(http://)?([^/:]+)(:([0-9]+))?(/.*)?$} $url \ + x proto host y port srvurl]} { + error "Unsupported URL: $url" + } + if {[string length $port] == 0} { + set port 80 + } + if {[string length $srvurl] == 0} { + set srvurl / + } + if {[string length $proto] == 0} { + set url http://$url + } + set state(url) $url + if {![catch {$http(-proxyfilter) $host} proxy]} { + set phost [lindex $proxy 0] + set pport [lindex $proxy 1] + } + if {$state(-timeout) > 0} { + set state(after) [after $state(-timeout) [list http_reset $token timeout]] + } + if {[info exists phost] && [string length $phost]} { + set srvurl $url + set s [socket $phost $pport] + } else { + set s [socket $host $port] + } + set state(sock) $s + + # Send data in cr-lf format, but accept any line terminators + + fconfigure $s -translation {auto crlf} -buffersize $state(-blocksize) + + # The following is disallowed in safe interpreters, but the socket + # is already in non-blocking mode in that case. + + catch {fconfigure $s -blocking off} + set len 0 + set how GET + if {[info exists state(-query)]} { + set len [string length $state(-query)] + if {$len > 0} { + set how POST + } + } elseif {$state(-validate)} { + set how HEAD + } + puts $s "$how $srvurl HTTP/1.0" + puts $s "Accept: $http(-accept)" + puts $s "Host: $host" + puts $s "User-Agent: $http(-useragent)" + foreach {key value} $state(-headers) { + regsub -all \[\n\r\] $value {} value + set key [string trim $key] + if {[string length $key]} { + puts $s "$key: $value" + } + } + if {$len > 0} { + puts $s "Content-Length: $len" + puts $s "Content-Type: application/x-www-form-urlencoded" + puts $s "" + fconfigure $s -translation {auto binary} + puts -nonewline $s $state(-query) + } else { + puts $s "" + } + flush $s + fileevent $s readable [list httpEvent $token] + if {! [info exists state(-command)]} { + http_wait $token + } + return $token +} +proc http_data {token} { + upvar #0 $token state + return $state(body) +} +proc http_status {token} { + upvar #0 $token state + return $state(status) +} +proc http_code {token} { + upvar #0 $token state + return $state(http) +} +proc http_size {token} { + upvar #0 $token state + return $state(currentsize) +} + + proc httpEvent {token} { + upvar #0 $token state + set s $state(sock) + + if {[eof $s]} { + httpEof $token + return + } + if {$state(state) == "header"} { + set n [gets $s line] + if {$n == 0} { + set state(state) body + if {![regexp -nocase ^text $state(type)]} { + # Turn off conversions for non-text data + fconfigure $s -translation binary + if {[info exists state(-channel)]} { + fconfigure $state(-channel) -translation binary + } + } + if {[info exists state(-channel)] && + ![info exists state(-handler)]} { + # Initiate a sequence of background fcopies + fileevent $s readable {} + httpCopyStart $s $token + } + } elseif {$n > 0} { + if {[regexp -nocase {^content-type:(.+)$} $line x type]} { + set state(type) [string trim $type] + } + if {[regexp -nocase {^content-length:(.+)$} $line x length]} { + set state(totalsize) [string trim $length] + } + if {[regexp -nocase {^([^:]+):(.+)$} $line x key value]} { + lappend state(meta) $key $value + } elseif {[regexp ^HTTP $line]} { + set state(http) $line + } + } + } else { + if {[catch { + if {[info exists state(-handler)]} { + set n [eval $state(-handler) {$s $token}] + } else { + set block [read $s $state(-blocksize)] + set n [string length $block] + if {$n >= 0} { + append state(body) $block + } + } + if {$n >= 0} { + incr state(currentsize) $n + } + } err]} { + httpFinish $token $err + } else { + if {[info exists state(-progress)]} { + eval $state(-progress) {$token $state(totalsize) $state(currentsize)} + } + } + } +} + proc httpCopyStart {s token} { + upvar #0 $token state + if {[catch { + fcopy $s $state(-channel) -size $state(-blocksize) -command \ + [list httpCopyDone $token] + } err]} { + httpFinish $token $err + } +} + proc httpCopyDone {token count {error {}}} { + upvar #0 $token state + set s $state(sock) + incr state(currentsize) $count + if {[info exists state(-progress)]} { + eval $state(-progress) {$token $state(totalsize) $state(currentsize)} + } + if {([string length $error] != 0)} { + httpFinish $token $error + } elseif {[eof $s]} { + httpEof $token + } else { + httpCopyStart $s $token + } +} + proc httpEof {token} { + upvar #0 $token state + if {$state(state) == "header"} { + # Premature eof + set state(status) eof + } else { + set state(status) ok + } + set state(state) eof + httpFinish $token +} +proc http_wait {token} { + upvar #0 $token state + if {![info exists state(status)] || [string length $state(status)] == 0} { + vwait $token\(status) + } + if {[info exists state(error)]} { + set errorlist $state(error) + unset state(error) + eval error $errorlist + } + return $state(status) +} + +# Call http_formatQuery with an even number of arguments, where the first is +# a name, the second is a value, the third is another name, and so on. + +proc http_formatQuery {args} { + set result "" + set sep "" + foreach i $args { + append result $sep [httpMapReply $i] + if {$sep != "="} { + set sep = + } else { + set sep & + } + } + return $result +} + +# do x-www-urlencoded character mapping +# The spec says: "non-alphanumeric characters are replaced by '%HH'" +# 1 leave alphanumerics characters alone +# 2 Convert every other character to an array lookup +# 3 Escape constructs that are "special" to the tcl parser +# 4 "subst" the result, doing all the array substitutions + + proc httpMapReply {string} { + global httpFormMap + set alphanumeric a-zA-Z0-9 + if {![info exists httpFormMap]} { + + for {set i 1} {$i <= 256} {incr i} { + set c [format %c $i] + if {![string match \[$alphanumeric\] $c]} { + set httpFormMap($c) %[format %.2x $i] + } + } + # These are handled specially + array set httpFormMap { + " " + \n %0d%0a + } + } + regsub -all \[^$alphanumeric\] $string {$httpFormMap(&)} string + regsub -all \n $string {\\n} string + regsub -all \t $string {\\t} string + regsub -all {[][{})\\]\)} $string {\\&} string + return [subst $string] +} + +# Default proxy filter. + proc httpProxyRequired {host} { + global http + if {[info exists http(-proxyhost)] && [string length $http(-proxyhost)]} { + if {![info exists http(-proxyport)] || ![string length $http(-proxyport)]} { + set http(-proxyport) 8080 + } + return [list $http(-proxyhost) $http(-proxyport)] + } else { + return {} + } +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/http1.0/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/http1.0/pkgIndex.tcl new file mode 100644 index 00000000..ab6170f7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/http1.0/pkgIndex.tcl @@ -0,0 +1,11 @@ +# Tcl package index file, version 1.0 +# This file is generated by the "pkg_mkIndex" command +# and sourced either when an application starts up or +# by a "package unknown" script. It invokes the +# "package ifneeded" command to set up package-related +# information so that packages will be loaded automatically +# in response to "package require" commands. When this +# script is sourced, the variable $dir must contain the +# full path name of this file's directory. + +package ifneeded http 1.0 [list tclPkgSetup $dir http 1.0 {{http.tcl source {httpCopyDone httpCopyStart httpEof httpEvent httpFinish httpMapReply httpProxyRequired http_code http_config http_data http_formatQuery http_get http_reset http_size http_status http_wait}}}] diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/init.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/init.tcl new file mode 100644 index 00000000..0655dc87 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/init.tcl @@ -0,0 +1,827 @@ +# init.tcl -- +# +# Default system startup file for Tcl-based applications. Defines +# "unknown" procedure and auto-load facilities. +# +# Copyright (c) 1991-1993 The Regents of the University of California. +# Copyright (c) 1994-1996 Sun Microsystems, Inc. +# Copyright (c) 1998-1999 Scriptics Corporation. +# Copyright (c) 2004 Kevin B. Kenny. All rights reserved. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# This test intentionally written in pre-7.5 Tcl +if {[info commands package] == ""} { + error "version mismatch: library\nscripts expect Tcl version 7.5b1 or later but the loaded version is\nonly [info patchlevel]" +} +package require -exact Tcl 8.6.13 + +# Compute the auto path to use in this interpreter. +# The values on the path come from several locations: +# +# The environment variable TCLLIBPATH +# +# tcl_library, which is the directory containing this init.tcl script. +# [tclInit] (Tcl_Init()) searches around for the directory containing this +# init.tcl and defines tcl_library to that location before sourcing it. +# +# The parent directory of tcl_library. Adding the parent +# means that packages in peer directories will be found automatically. +# +# Also add the directory ../lib relative to the directory where the +# executable is located. This is meant to find binary packages for the +# same architecture as the current executable. +# +# tcl_pkgPath, which is set by the platform-specific initialization routines +# On UNIX it is compiled in +# On Windows, it is not used +# +# (Ticket 41c9857bdd) In a safe interpreter, this file does not set +# ::auto_path (other than to {} if it is undefined). The caller, typically +# a Safe Base command, is responsible for setting ::auto_path. + +if {![info exists auto_path]} { + if {[info exists env(TCLLIBPATH)] && (![interp issafe])} { + set auto_path $env(TCLLIBPATH) + } else { + set auto_path "" + } +} +namespace eval tcl { + if {![interp issafe]} { + variable Dir + foreach Dir [list $::tcl_library [file dirname $::tcl_library]] { + if {$Dir ni $::auto_path} { + lappend ::auto_path $Dir + } + } + set Dir [file join [file dirname [file dirname \ + [info nameofexecutable]]] lib] + if {$Dir ni $::auto_path} { + lappend ::auto_path $Dir + } + if {[info exists ::tcl_pkgPath]} { catch { + foreach Dir $::tcl_pkgPath { + if {$Dir ni $::auto_path} { + lappend ::auto_path $Dir + } + } + }} + + variable Path [encoding dirs] + set Dir [file join $::tcl_library encoding] + if {$Dir ni $Path} { + lappend Path $Dir + encoding dirs $Path + } + unset Dir Path + } + + # TIP #255 min and max functions + namespace eval mathfunc { + proc min {args} { + if {![llength $args]} { + return -code error \ + "not enough arguments to math function \"min\"" + } + set val Inf + foreach arg $args { + # This will handle forcing the numeric value without + # ruining the internal type of a numeric object + if {[catch {expr {double($arg)}} err]} { + return -code error $err + } + if {$arg < $val} {set val $arg} + } + return $val + } + proc max {args} { + if {![llength $args]} { + return -code error \ + "not enough arguments to math function \"max\"" + } + set val -Inf + foreach arg $args { + # This will handle forcing the numeric value without + # ruining the internal type of a numeric object + if {[catch {expr {double($arg)}} err]} { + return -code error $err + } + if {$arg > $val} {set val $arg} + } + return $val + } + namespace export min max + } +} + +# Windows specific end of initialization + +if {(![interp issafe]) && ($tcl_platform(platform) eq "windows")} { + namespace eval tcl { + proc EnvTraceProc {lo n1 n2 op} { + global env + set x $env($n2) + set env($lo) $x + set env([string toupper $lo]) $x + } + proc InitWinEnv {} { + global env tcl_platform + foreach p [array names env] { + set u [string toupper $p] + if {$u ne $p} { + switch -- $u { + COMSPEC - + PATH { + set temp $env($p) + unset env($p) + set env($u) $temp + trace add variable env($p) write \ + [namespace code [list EnvTraceProc $p]] + trace add variable env($u) write \ + [namespace code [list EnvTraceProc $p]] + } + } + } + } + if {![info exists env(COMSPEC)]} { + set env(COMSPEC) cmd.exe + } + } + InitWinEnv + } +} + +# Setup the unknown package handler + + +if {[interp issafe]} { + package unknown {::tcl::tm::UnknownHandler ::tclPkgUnknown} +} else { + # Set up search for Tcl Modules (TIP #189). + # and setup platform specific unknown package handlers + if {$tcl_platform(os) eq "Darwin" + && $tcl_platform(platform) eq "unix"} { + package unknown {::tcl::tm::UnknownHandler \ + {::tcl::MacOSXPkgUnknown ::tclPkgUnknown}} + } else { + package unknown {::tcl::tm::UnknownHandler ::tclPkgUnknown} + } + + # Set up the 'clock' ensemble + + namespace eval ::tcl::clock [list variable TclLibDir $::tcl_library] + + proc ::tcl::initClock {} { + # Auto-loading stubs for 'clock.tcl' + + foreach cmd {add format scan} { + proc ::tcl::clock::$cmd args { + variable TclLibDir + source -encoding utf-8 [file join $TclLibDir clock.tcl] + return [uplevel 1 [info level 0]] + } + } + + rename ::tcl::initClock {} + } + ::tcl::initClock +} + +# Conditionalize for presence of exec. + +if {[namespace which -command exec] eq ""} { + + # Some machines do not have exec. Also, on all + # platforms, safe interpreters do not have exec. + + set auto_noexec 1 +} + +# Define a log command (which can be overwitten to log errors +# differently, specially when stderr is not available) + +if {[namespace which -command tclLog] eq ""} { + proc tclLog {string} { + catch {puts stderr $string} + } +} + +# unknown -- +# This procedure is called when a Tcl command is invoked that doesn't +# exist in the interpreter. It takes the following steps to make the +# command available: +# +# 1. See if the autoload facility can locate the command in a +# Tcl script file. If so, load it and execute it. +# 2. If the command was invoked interactively at top-level: +# (a) see if the command exists as an executable UNIX program. +# If so, "exec" the command. +# (b) see if the command requests csh-like history substitution +# in one of the common forms !!, !, or ^old^new. If +# so, emulate csh's history substitution. +# (c) see if the command is a unique abbreviation for another +# command. If so, invoke the command. +# +# Arguments: +# args - A list whose elements are the words of the original +# command, including the command name. + +proc unknown args { + variable ::tcl::UnknownPending + global auto_noexec auto_noload env tcl_interactive errorInfo errorCode + + if {[info exists errorInfo]} { + set savedErrorInfo $errorInfo + } + if {[info exists errorCode]} { + set savedErrorCode $errorCode + } + + set name [lindex $args 0] + if {![info exists auto_noload]} { + # + # Make sure we're not trying to load the same proc twice. + # + if {[info exists UnknownPending($name)]} { + return -code error "self-referential recursion\ + in \"unknown\" for command \"$name\"" + } + set UnknownPending($name) pending + set ret [catch { + auto_load $name [uplevel 1 {::namespace current}] + } msg opts] + unset UnknownPending($name) + if {$ret != 0} { + dict append opts -errorinfo "\n (autoloading \"$name\")" + return -options $opts $msg + } + if {![array size UnknownPending]} { + unset UnknownPending + } + if {$msg} { + if {[info exists savedErrorCode]} { + set ::errorCode $savedErrorCode + } else { + unset -nocomplain ::errorCode + } + if {[info exists savedErrorInfo]} { + set errorInfo $savedErrorInfo + } else { + unset -nocomplain errorInfo + } + set code [catch {uplevel 1 $args} msg opts] + if {$code == 1} { + # + # Compute stack trace contribution from the [uplevel]. + # Note the dependence on how Tcl_AddErrorInfo, etc. + # construct the stack trace. + # + set errInfo [dict get $opts -errorinfo] + set errCode [dict get $opts -errorcode] + set cinfo $args + if {[string bytelength $cinfo] > 150} { + set cinfo [string range $cinfo 0 150] + while {[string bytelength $cinfo] > 150} { + set cinfo [string range $cinfo 0 end-1] + } + append cinfo ... + } + set tail "\n (\"uplevel\" body line 1)\n invoked\ + from within\n\"uplevel 1 \$args\"" + set expect "$msg\n while executing\n\"$cinfo\"$tail" + if {$errInfo eq $expect} { + # + # The stack has only the eval from the expanded command + # Do not generate any stack trace here. + # + dict unset opts -errorinfo + dict incr opts -level + return -options $opts $msg + } + # + # Stack trace is nested, trim off just the contribution + # from the extra "eval" of $args due to the "catch" above. + # + set last [string last $tail $errInfo] + if {$last + [string length $tail] != [string length $errInfo]} { + # Very likely cannot happen + return -options $opts $msg + } + set errInfo [string range $errInfo 0 $last-1] + set tail "\"$cinfo\"" + set last [string last $tail $errInfo] + if {$last < 0 || $last + [string length $tail] != [string length $errInfo]} { + return -code error -errorcode $errCode \ + -errorinfo $errInfo $msg + } + set errInfo [string range $errInfo 0 $last-1] + set tail "\n invoked from within\n" + set last [string last $tail $errInfo] + if {$last + [string length $tail] == [string length $errInfo]} { + return -code error -errorcode $errCode \ + -errorinfo [string range $errInfo 0 $last-1] $msg + } + set tail "\n while executing\n" + set last [string last $tail $errInfo] + if {$last + [string length $tail] == [string length $errInfo]} { + return -code error -errorcode $errCode \ + -errorinfo [string range $errInfo 0 $last-1] $msg + } + return -options $opts $msg + } else { + dict incr opts -level + return -options $opts $msg + } + } + } + + if {([info level] == 1) && ([info script] eq "") + && [info exists tcl_interactive] && $tcl_interactive} { + if {![info exists auto_noexec]} { + set new [auto_execok $name] + if {$new ne ""} { + set redir "" + if {[namespace which -command console] eq ""} { + set redir ">&@stdout <@stdin" + } + uplevel 1 [list ::catch \ + [concat exec $redir $new [lrange $args 1 end]] \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + dict incr ::tcl::UnknownOptions -level + return -options $::tcl::UnknownOptions $::tcl::UnknownResult + } + } + if {$name eq "!!"} { + set newcmd [history event] + } elseif {[regexp {^!(.+)$} $name -> event]} { + set newcmd [history event $event] + } elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $name -> old new]} { + set newcmd [history event -1] + catch {regsub -all -- $old $newcmd $new newcmd} + } + if {[info exists newcmd]} { + tclLog $newcmd + history change $newcmd 0 + uplevel 1 [list ::catch $newcmd \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + dict incr ::tcl::UnknownOptions -level + return -options $::tcl::UnknownOptions $::tcl::UnknownResult + } + + set ret [catch {set candidates [info commands $name*]} msg] + if {$name eq "::"} { + set name "" + } + if {$ret != 0} { + dict append opts -errorinfo \ + "\n (expanding command prefix \"$name\" in unknown)" + return -options $opts $msg + } + # Filter out bogus matches when $name contained + # a glob-special char [Bug 946952] + if {$name eq ""} { + # Handle empty $name separately due to strangeness + # in [string first] (See RFE 1243354) + set cmds $candidates + } else { + set cmds [list] + foreach x $candidates { + if {[string first $name $x] == 0} { + lappend cmds $x + } + } + } + if {[llength $cmds] == 1} { + uplevel 1 [list ::catch [lreplace $args 0 0 [lindex $cmds 0]] \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + dict incr ::tcl::UnknownOptions -level + return -options $::tcl::UnknownOptions $::tcl::UnknownResult + } + if {[llength $cmds]} { + return -code error "ambiguous command name \"$name\": [lsort $cmds]" + } + } + return -code error -errorcode [list TCL LOOKUP COMMAND $name] \ + "invalid command name \"$name\"" +} + +# auto_load -- +# Checks a collection of library directories to see if a procedure +# is defined in one of them. If so, it sources the appropriate +# library file to create the procedure. Returns 1 if it successfully +# loaded the procedure, 0 otherwise. +# +# Arguments: +# cmd - Name of the command to find and load. +# namespace (optional) The namespace where the command is being used - must be +# a canonical namespace as returned [namespace current] +# for instance. If not given, namespace current is used. + +proc auto_load {cmd {namespace {}}} { + global auto_index auto_path + + if {$namespace eq ""} { + set namespace [uplevel 1 [list ::namespace current]] + } + set nameList [auto_qualify $cmd $namespace] + # workaround non canonical auto_index entries that might be around + # from older auto_mkindex versions + lappend nameList $cmd + foreach name $nameList { + if {[info exists auto_index($name)]} { + namespace eval :: $auto_index($name) + # There's a couple of ways to look for a command of a given + # name. One is to use + # info commands $name + # Unfortunately, if the name has glob-magic chars in it like * + # or [], it may not match. For our purposes here, a better + # route is to use + # namespace which -command $name + if {[namespace which -command $name] ne ""} { + return 1 + } + } + } + if {![info exists auto_path]} { + return 0 + } + + if {![auto_load_index]} { + return 0 + } + foreach name $nameList { + if {[info exists auto_index($name)]} { + namespace eval :: $auto_index($name) + if {[namespace which -command $name] ne ""} { + return 1 + } + } + } + return 0 +} + +# auto_load_index -- +# Loads the contents of tclIndex files on the auto_path directory +# list. This is usually invoked within auto_load to load the index +# of available commands. Returns 1 if the index is loaded, and 0 if +# the index is already loaded and up to date. +# +# Arguments: +# None. + +proc auto_load_index {} { + variable ::tcl::auto_oldpath + global auto_index auto_path + + if {[info exists auto_oldpath] && ($auto_oldpath eq $auto_path)} { + return 0 + } + set auto_oldpath $auto_path + + # Check if we are a safe interpreter. In that case, we support only + # newer format tclIndex files. + + set issafe [interp issafe] + for {set i [expr {[llength $auto_path] - 1}]} {$i >= 0} {incr i -1} { + set dir [lindex $auto_path $i] + set f "" + if {$issafe} { + catch {source [file join $dir tclIndex]} + } elseif {[catch {set f [open [file join $dir tclIndex]]}]} { + continue + } else { + set error [catch { + fconfigure $f -eofchar "\032 {}" + set id [gets $f] + if {$id eq "# Tcl autoload index file, version 2.0"} { + eval [read $f] + } elseif {$id eq "# Tcl autoload index file: each line identifies a Tcl"} { + while {[gets $f line] >= 0} { + if {([string index $line 0] eq "#") \ + || ([llength $line] != 2)} { + continue + } + set name [lindex $line 0] + set auto_index($name) \ + "source [file join $dir [lindex $line 1]]" + } + } else { + error "[file join $dir tclIndex] isn't a proper Tcl index file" + } + } msg opts] + if {$f ne ""} { + close $f + } + if {$error} { + return -options $opts $msg + } + } + } + return 1 +} + +# auto_qualify -- +# +# Compute a fully qualified names list for use in the auto_index array. +# For historical reasons, commands in the global namespace do not have leading +# :: in the index key. The list has two elements when the command name is +# relative (no leading ::) and the namespace is not the global one. Otherwise +# only one name is returned (and searched in the auto_index). +# +# Arguments - +# cmd The command name. Can be any name accepted for command +# invocations (Like "foo::::bar"). +# namespace The namespace where the command is being used - must be +# a canonical namespace as returned by [namespace current] +# for instance. + +proc auto_qualify {cmd namespace} { + + # count separators and clean them up + # (making sure that foo:::::bar will be treated as foo::bar) + set n [regsub -all {::+} $cmd :: cmd] + + # Ignore namespace if the name starts with :: + # Handle special case of only leading :: + + # Before each return case we give an example of which category it is + # with the following form : + # (inputCmd, inputNameSpace) -> output + + if {[string match ::* $cmd]} { + if {$n > 1} { + # (::foo::bar , *) -> ::foo::bar + return [list $cmd] + } else { + # (::global , *) -> global + return [list [string range $cmd 2 end]] + } + } + + # Potentially returning 2 elements to try : + # (if the current namespace is not the global one) + + if {$n == 0} { + if {$namespace eq "::"} { + # (nocolons , ::) -> nocolons + return [list $cmd] + } else { + # (nocolons , ::sub) -> ::sub::nocolons nocolons + return [list ${namespace}::$cmd $cmd] + } + } elseif {$namespace eq "::"} { + # (foo::bar , ::) -> ::foo::bar + return [list ::$cmd] + } else { + # (foo::bar , ::sub) -> ::sub::foo::bar ::foo::bar + return [list ${namespace}::$cmd ::$cmd] + } +} + +# auto_import -- +# +# Invoked during "namespace import" to make see if the imported commands +# reside in an autoloaded library. If so, the commands are loaded so +# that they will be available for the import links. If not, then this +# procedure does nothing. +# +# Arguments - +# pattern The pattern of commands being imported (like "foo::*") +# a canonical namespace as returned by [namespace current] + +proc auto_import {pattern} { + global auto_index + + # If no namespace is specified, this will be an error case + + if {![string match *::* $pattern]} { + return + } + + set ns [uplevel 1 [list ::namespace current]] + set patternList [auto_qualify $pattern $ns] + + auto_load_index + + foreach pattern $patternList { + foreach name [array names auto_index $pattern] { + if {([namespace which -command $name] eq "") + && ([namespace qualifiers $pattern] eq [namespace qualifiers $name])} { + namespace eval :: $auto_index($name) + } + } + } +} + +# auto_execok -- +# +# Returns string that indicates name of program to execute if +# name corresponds to a shell builtin or an executable in the +# Windows search path, or "" otherwise. Builds an associative +# array auto_execs that caches information about previous checks, +# for speed. +# +# Arguments: +# name - Name of a command. + +if {$tcl_platform(platform) eq "windows"} { +# Windows version. +# +# Note that file executable doesn't work under Windows, so we have to +# look for files with .exe, .com, or .bat extensions. Also, the path +# may be in the Path or PATH environment variables, and path +# components are separated with semicolons, not colons as under Unix. +# +proc auto_execok name { + global auto_execs env tcl_platform + + if {[info exists auto_execs($name)]} { + return $auto_execs($name) + } + set auto_execs($name) "" + + set shellBuiltins [list assoc cls copy date del dir echo erase exit ftype \ + md mkdir mklink move rd ren rename rmdir start time type ver vol] + if {[info exists env(PATHEXT)]} { + # Add an initial ; to have the {} extension check first. + set execExtensions [split ";$env(PATHEXT)" ";"] + } else { + set execExtensions [list {} .com .exe .bat .cmd] + } + + if {[string tolower $name] in $shellBuiltins} { + # When this is command.com for some reason on Win2K, Tcl won't + # exec it unless the case is right, which this corrects. COMSPEC + # may not point to a real file, so do the check. + set cmd $env(COMSPEC) + if {[file exists $cmd]} { + set cmd [file attributes $cmd -shortname] + } + return [set auto_execs($name) [list $cmd /c $name]] + } + + if {[llength [file split $name]] != 1} { + foreach ext $execExtensions { + set file ${name}${ext} + if {[file exists $file] && ![file isdirectory $file]} { + return [set auto_execs($name) [list $file]] + } + } + return "" + } + + set path "[file dirname [info nameof]];.;" + if {[info exists env(SystemRoot)]} { + set windir $env(SystemRoot) + } elseif {[info exists env(WINDIR)]} { + set windir $env(WINDIR) + } + if {[info exists windir]} { + if {$tcl_platform(os) eq "Windows NT"} { + append path "$windir/system32;" + } + append path "$windir/system;$windir;" + } + + foreach var {PATH Path path} { + if {[info exists env($var)]} { + append path ";$env($var)" + } + } + + foreach ext $execExtensions { + unset -nocomplain checked + foreach dir [split $path {;}] { + # Skip already checked directories + if {[info exists checked($dir)] || ($dir eq "")} { + continue + } + set checked($dir) {} + set file [file join $dir ${name}${ext}] + if {[file exists $file] && ![file isdirectory $file]} { + return [set auto_execs($name) [list $file]] + } + } + } + return "" +} + +} else { +# Unix version. +# +proc auto_execok name { + global auto_execs env + + if {[info exists auto_execs($name)]} { + return $auto_execs($name) + } + set auto_execs($name) "" + if {[llength [file split $name]] != 1} { + if {[file executable $name] && ![file isdirectory $name]} { + set auto_execs($name) [list $name] + } + return $auto_execs($name) + } + foreach dir [split $env(PATH) :] { + if {$dir eq ""} { + set dir . + } + set file [file join $dir $name] + if {[file executable $file] && ![file isdirectory $file]} { + set auto_execs($name) [list $file] + return $auto_execs($name) + } + } + return "" +} + +} + +# ::tcl::CopyDirectory -- +# +# This procedure is called by Tcl's core when attempts to call the +# filesystem's copydirectory function fail. The semantics of the call +# are that 'dest' does not yet exist, i.e. dest should become the exact +# image of src. If dest does exist, we throw an error. +# +# Note that making changes to this procedure can change the results +# of running Tcl's tests. +# +# Arguments: +# action - "renaming" or "copying" +# src - source directory +# dest - destination directory +proc tcl::CopyDirectory {action src dest} { + set nsrc [file normalize $src] + set ndest [file normalize $dest] + + if {$action eq "renaming"} { + # Can't rename volumes. We could give a more precise + # error message here, but that would break the test suite. + if {$nsrc in [file volumes]} { + return -code error "error $action \"$src\" to\ + \"$dest\": trying to rename a volume or move a directory\ + into itself" + } + } + if {[file exists $dest]} { + if {$nsrc eq $ndest} { + return -code error "error $action \"$src\" to\ + \"$dest\": trying to rename a volume or move a directory\ + into itself" + } + if {$action eq "copying"} { + # We used to throw an error here, but, looking more closely + # at the core copy code in tclFCmd.c, if the destination + # exists, then we should only call this function if -force + # is true, which means we just want to over-write. So, + # the following code is now commented out. + # + # return -code error "error $action \"$src\" to\ + # \"$dest\": file already exists" + } else { + # Depending on the platform, and on the current + # working directory, the directories '.', '..' + # can be returned in various combinations. Anyway, + # if any other file is returned, we must signal an error. + set existing [glob -nocomplain -directory $dest * .*] + lappend existing {*}[glob -nocomplain -directory $dest \ + -type hidden * .*] + foreach s $existing { + if {[file tail $s] ni {. ..}} { + return -code error "error $action \"$src\" to\ + \"$dest\": file already exists" + } + } + } + } else { + if {[string first $nsrc $ndest] >= 0} { + set srclen [expr {[llength [file split $nsrc]] - 1}] + set ndest [lindex [file split $ndest] $srclen] + if {$ndest eq [file tail $nsrc]} { + return -code error "error $action \"$src\" to\ + \"$dest\": trying to rename a volume or move a directory\ + into itself" + } + } + file mkdir $dest + } + # Have to be careful to capture both visible and hidden files. + # We will also be more generous to the file system and not + # assume the hidden and non-hidden lists are non-overlapping. + # + # On Unix 'hidden' files begin with '.'. On other platforms + # or filesystems hidden files may have other interpretations. + set filelist [concat [glob -nocomplain -directory $src *] \ + [glob -nocomplain -directory $src -types hidden *]] + + foreach s [lsort -unique $filelist] { + if {[file tail $s] ni {. ..}} { + file copy -force -- $s [file join $dest [file tail $s]] + } + } + return +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/af.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/af.msg new file mode 100644 index 00000000..08926157 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/af.msg @@ -0,0 +1,49 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset af DAYS_OF_WEEK_ABBREV [list \ + "So"\ + "Ma"\ + "Di"\ + "Wo"\ + "Do"\ + "Vr"\ + "Sa"] + ::msgcat::mcset af DAYS_OF_WEEK_FULL [list \ + "Sondag"\ + "Maandag"\ + "Dinsdag"\ + "Woensdag"\ + "Donderdag"\ + "Vrydag"\ + "Saterdag"] + ::msgcat::mcset af MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "Mar"\ + "Apr"\ + "Mei"\ + "Jun"\ + "Jul"\ + "Aug"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Des"\ + ""] + ::msgcat::mcset af MONTHS_FULL [list \ + "Januarie"\ + "Februarie"\ + "Maart"\ + "April"\ + "Mei"\ + "Junie"\ + "Julie"\ + "Augustus"\ + "September"\ + "Oktober"\ + "November"\ + "Desember"\ + ""] + ::msgcat::mcset af AM "VM" + ::msgcat::mcset af PM "NM" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/af_za.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/af_za.msg new file mode 100644 index 00000000..fef48ad4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/af_za.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset af_ZA DATE_FORMAT "%d %B %Y" + ::msgcat::mcset af_ZA TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset af_ZA DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar.msg new file mode 100644 index 00000000..257157fd --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ar DAYS_OF_WEEK_ABBREV [list \ + "\u062d"\ + "\u0646"\ + "\u062b"\ + "\u0631"\ + "\u062e"\ + "\u062c"\ + "\u0633"] + ::msgcat::mcset ar DAYS_OF_WEEK_FULL [list \ + "\u0627\u0644\u0623\u062d\u062f"\ + "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ + "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ + "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ + "\u0627\u0644\u062e\u0645\u064a\u0633"\ + "\u0627\u0644\u062c\u0645\u0639\u0629"\ + "\u0627\u0644\u0633\u0628\u062a"] + ::msgcat::mcset ar MONTHS_ABBREV [list \ + "\u064a\u0646\u0627"\ + "\u0641\u0628\u0631"\ + "\u0645\u0627\u0631"\ + "\u0623\u0628\u0631"\ + "\u0645\u0627\u064a"\ + "\u064a\u0648\u0646"\ + "\u064a\u0648\u0644"\ + "\u0623\u063a\u0633"\ + "\u0633\u0628\u062a"\ + "\u0623\u0643\u062a"\ + "\u0646\u0648\u0641"\ + "\u062f\u064a\u0633"\ + ""] + ::msgcat::mcset ar MONTHS_FULL [list \ + "\u064a\u0646\u0627\u064a\u0631"\ + "\u0641\u0628\u0631\u0627\u064a\u0631"\ + "\u0645\u0627\u0631\u0633"\ + "\u0623\u0628\u0631\u064a\u0644"\ + "\u0645\u0627\u064a\u0648"\ + "\u064a\u0648\u0646\u064a\u0648"\ + "\u064a\u0648\u0644\u064a\u0648"\ + "\u0623\u063a\u0633\u0637\u0633"\ + "\u0633\u0628\u062a\u0645\u0628\u0631"\ + "\u0623\u0643\u062a\u0648\u0628\u0631"\ + "\u0646\u0648\u0641\u0645\u0628\u0631"\ + "\u062f\u064a\u0633\u0645\u0628\u0631"\ + ""] + ::msgcat::mcset ar BCE "\u0642.\u0645" + ::msgcat::mcset ar CE "\u0645" + ::msgcat::mcset ar AM "\u0635" + ::msgcat::mcset ar PM "\u0645" + ::msgcat::mcset ar DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset ar TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset ar DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_in.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_in.msg new file mode 100644 index 00000000..185e49c3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_in.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ar_IN DATE_FORMAT "%A %d %B %Y" + ::msgcat::mcset ar_IN TIME_FORMAT_12 "%I:%M:%S %z" + ::msgcat::mcset ar_IN DATE_TIME_FORMAT "%A %d %B %Y %I:%M:%S %z %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_jo.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_jo.msg new file mode 100644 index 00000000..0f5e2697 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_jo.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ar_JO DAYS_OF_WEEK_ABBREV [list \ + "\u0627\u0644\u0623\u062d\u062f"\ + "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ + "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ + "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ + "\u0627\u0644\u062e\u0645\u064a\u0633"\ + "\u0627\u0644\u062c\u0645\u0639\u0629"\ + "\u0627\u0644\u0633\u0628\u062a"] + ::msgcat::mcset ar_JO MONTHS_ABBREV [list \ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0634\u0628\u0627\u0637"\ + "\u0622\u0630\u0627\u0631"\ + "\u0646\u064a\u0633\u0627\u0646"\ + "\u0646\u0648\u0627\u0631"\ + "\u062d\u0632\u064a\u0631\u0627\u0646"\ + "\u062a\u0645\u0648\u0632"\ + "\u0622\u0628"\ + "\u0623\u064a\u0644\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + ""] + ::msgcat::mcset ar_JO MONTHS_FULL [list \ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0634\u0628\u0627\u0637"\ + "\u0622\u0630\u0627\u0631"\ + "\u0646\u064a\u0633\u0627\u0646"\ + "\u0646\u0648\u0627\u0631"\ + "\u062d\u0632\u064a\u0631\u0627\u0646"\ + "\u062a\u0645\u0648\u0632"\ + "\u0622\u0628"\ + "\u0623\u064a\u0644\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_lb.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_lb.msg new file mode 100644 index 00000000..e62acd35 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_lb.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ar_LB DAYS_OF_WEEK_ABBREV [list \ + "\u0627\u0644\u0623\u062d\u062f"\ + "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ + "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ + "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ + "\u0627\u0644\u062e\u0645\u064a\u0633"\ + "\u0627\u0644\u062c\u0645\u0639\u0629"\ + "\u0627\u0644\u0633\u0628\u062a"] + ::msgcat::mcset ar_LB MONTHS_ABBREV [list \ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0634\u0628\u0627\u0637"\ + "\u0622\u0630\u0627\u0631"\ + "\u0646\u064a\u0633\u0627\u0646"\ + "\u0646\u0648\u0627\u0631"\ + "\u062d\u0632\u064a\u0631\u0627\u0646"\ + "\u062a\u0645\u0648\u0632"\ + "\u0622\u0628"\ + "\u0623\u064a\u0644\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + ""] + ::msgcat::mcset ar_LB MONTHS_FULL [list \ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0634\u0628\u0627\u0637"\ + "\u0622\u0630\u0627\u0631"\ + "\u0646\u064a\u0633\u0627\u0646"\ + "\u0646\u0648\u0627\u0631"\ + "\u062d\u0632\u064a\u0631\u0627\u0646"\ + "\u062a\u0645\u0648\u0632"\ + "\u0622\u0628"\ + "\u0623\u064a\u0644\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_sy.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_sy.msg new file mode 100644 index 00000000..d5e1c873 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ar_sy.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ar_SY DAYS_OF_WEEK_ABBREV [list \ + "\u0627\u0644\u0623\u062d\u062f"\ + "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ + "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ + "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ + "\u0627\u0644\u062e\u0645\u064a\u0633"\ + "\u0627\u0644\u062c\u0645\u0639\u0629"\ + "\u0627\u0644\u0633\u0628\u062a"] + ::msgcat::mcset ar_SY MONTHS_ABBREV [list \ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0634\u0628\u0627\u0637"\ + "\u0622\u0630\u0627\u0631"\ + "\u0646\u064a\u0633\u0627\u0646"\ + "\u0646\u0648\u0627\u0631"\ + "\u062d\u0632\u064a\u0631\u0627\u0646"\ + "\u062a\u0645\u0648\u0632"\ + "\u0622\u0628"\ + "\u0623\u064a\u0644\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + ""] + ::msgcat::mcset ar_SY MONTHS_FULL [list \ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0634\u0628\u0627\u0637"\ + "\u0622\u0630\u0627\u0631"\ + "\u0646\u064a\u0633\u0627\u0646"\ + "\u0646\u0648\u0627\u0631\u0627\u0646"\ + "\u062d\u0632\u064a\u0631"\ + "\u062a\u0645\u0648\u0632"\ + "\u0622\u0628"\ + "\u0623\u064a\u0644\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/be.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/be.msg new file mode 100644 index 00000000..379a1d7e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/be.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset be DAYS_OF_WEEK_ABBREV [list \ + "\u043d\u0434"\ + "\u043f\u043d"\ + "\u0430\u0442"\ + "\u0441\u0440"\ + "\u0447\u0446"\ + "\u043f\u0442"\ + "\u0441\u0431"] + ::msgcat::mcset be DAYS_OF_WEEK_FULL [list \ + "\u043d\u044f\u0434\u0437\u0435\u043b\u044f"\ + "\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a"\ + "\u0430\u045e\u0442\u043e\u0440\u0430\u043a"\ + "\u0441\u0435\u0440\u0430\u0434\u0430"\ + "\u0447\u0430\u0446\u0432\u0435\u0440"\ + "\u043f\u044f\u0442\u043d\u0456\u0446\u0430"\ + "\u0441\u0443\u0431\u043e\u0442\u0430"] + ::msgcat::mcset be MONTHS_ABBREV [list \ + "\u0441\u0442\u0434"\ + "\u043b\u044e\u0442"\ + "\u0441\u043a\u0432"\ + "\u043a\u0440\u0441"\ + "\u043c\u0430\u0439"\ + "\u0447\u0440\u0432"\ + "\u043b\u043f\u043d"\ + "\u0436\u043d\u0432"\ + "\u0432\u0440\u0441"\ + "\u043a\u0441\u0442"\ + "\u043b\u0441\u0442"\ + "\u0441\u043d\u0436"\ + ""] + ::msgcat::mcset be MONTHS_FULL [list \ + "\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f"\ + "\u043b\u044e\u0442\u0430\u0433\u0430"\ + "\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430"\ + "\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430"\ + "\u043c\u0430\u044f"\ + "\u0447\u0440\u0432\u0435\u043d\u044f"\ + "\u043b\u0456\u043f\u0435\u043d\u044f"\ + "\u0436\u043d\u0456\u045e\u043d\u044f"\ + "\u0432\u0435\u0440\u0430\u0441\u043d\u044f"\ + "\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430"\ + "\u043b\u0438\u0441\u0442\u0430\u043f\u0430\u0434\u0430"\ + "\u0441\u043d\u0435\u0436\u043d\u044f"\ + ""] + ::msgcat::mcset be BCE "\u0434\u0430 \u043d.\u0435." + ::msgcat::mcset be CE "\u043d.\u0435." + ::msgcat::mcset be DATE_FORMAT "%e.%m.%Y" + ::msgcat::mcset be TIME_FORMAT "%k.%M.%S" + ::msgcat::mcset be DATE_TIME_FORMAT "%e.%m.%Y %k.%M.%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/bg.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/bg.msg new file mode 100644 index 00000000..ff177590 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/bg.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset bg DAYS_OF_WEEK_ABBREV [list \ + "\u041d\u0434"\ + "\u041f\u043d"\ + "\u0412\u0442"\ + "\u0421\u0440"\ + "\u0427\u0442"\ + "\u041f\u0442"\ + "\u0421\u0431"] + ::msgcat::mcset bg DAYS_OF_WEEK_FULL [list \ + "\u041d\u0435\u0434\u0435\u043b\u044f"\ + "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a"\ + "\u0412\u0442\u043e\u0440\u043d\u0438\u043a"\ + "\u0421\u0440\u044f\u0434\u0430"\ + "\u0427\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a"\ + "\u041f\u0435\u0442\u044a\u043a"\ + "\u0421\u044a\u0431\u043e\u0442\u0430"] + ::msgcat::mcset bg MONTHS_ABBREV [list \ + "I"\ + "II"\ + "III"\ + "IV"\ + "V"\ + "VI"\ + "VII"\ + "VIII"\ + "IX"\ + "X"\ + "XI"\ + "XII"\ + ""] + ::msgcat::mcset bg MONTHS_FULL [list \ + "\u042f\u043d\u0443\u0430\u0440\u0438"\ + "\u0424\u0435\u0432\u0440\u0443\u0430\u0440\u0438"\ + "\u041c\u0430\u0440\u0442"\ + "\u0410\u043f\u0440\u0438\u043b"\ + "\u041c\u0430\u0439"\ + "\u042e\u043d\u0438"\ + "\u042e\u043b\u0438"\ + "\u0410\u0432\u0433\u0443\u0441\u0442"\ + "\u0421\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438"\ + "\u041e\u043a\u0442\u043e\u043c\u0432\u0440\u0438"\ + "\u041d\u043e\u0435\u043c\u0432\u0440\u0438"\ + "\u0414\u0435\u043a\u0435\u043c\u0432\u0440\u0438"\ + ""] + ::msgcat::mcset bg BCE "\u043f\u0440.\u043d.\u0435." + ::msgcat::mcset bg CE "\u043d.\u0435." + ::msgcat::mcset bg DATE_FORMAT "%Y-%m-%e" + ::msgcat::mcset bg TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset bg DATE_TIME_FORMAT "%Y-%m-%e %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/bn.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/bn.msg new file mode 100644 index 00000000..664b9d84 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/bn.msg @@ -0,0 +1,49 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset bn DAYS_OF_WEEK_ABBREV [list \ + "\u09b0\u09ac\u09bf"\ + "\u09b8\u09cb\u09ae"\ + "\u09ae\u0999\u0997\u09b2"\ + "\u09ac\u09c1\u09a7"\ + "\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf"\ + "\u09b6\u09c1\u0995\u09cd\u09b0"\ + "\u09b6\u09a8\u09bf"] + ::msgcat::mcset bn DAYS_OF_WEEK_FULL [list \ + "\u09b0\u09ac\u09bf\u09ac\u09be\u09b0"\ + "\u09b8\u09cb\u09ae\u09ac\u09be\u09b0"\ + "\u09ae\u0999\u0997\u09b2\u09ac\u09be\u09b0"\ + "\u09ac\u09c1\u09a7\u09ac\u09be\u09b0"\ + "\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0"\ + "\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0"\ + "\u09b6\u09a8\u09bf\u09ac\u09be\u09b0"] + ::msgcat::mcset bn MONTHS_ABBREV [list \ + "\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0"\ + "\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09c0"\ + "\u09ae\u09be\u09b0\u09cd\u099a"\ + "\u098f\u09aa\u09cd\u09b0\u09bf\u09b2"\ + "\u09ae\u09c7"\ + "\u099c\u09c1\u09a8"\ + "\u099c\u09c1\u09b2\u09be\u0987"\ + "\u0986\u0997\u09b8\u09cd\u099f"\ + "\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0"\ + "\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0"\ + "\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0"\ + "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0"\ + ""] + ::msgcat::mcset bn MONTHS_FULL [list \ + "\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0"\ + "\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09c0"\ + "\u09ae\u09be\u09b0\u09cd\u099a"\ + "\u098f\u09aa\u09cd\u09b0\u09bf\u09b2"\ + "\u09ae\u09c7"\ + "\u099c\u09c1\u09a8"\ + "\u099c\u09c1\u09b2\u09be\u0987"\ + "\u0986\u0997\u09b8\u09cd\u099f"\ + "\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0"\ + "\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0"\ + "\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0"\ + "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0"\ + ""] + ::msgcat::mcset bn AM "\u09aa\u09c2\u09b0\u09cd\u09ac\u09be\u09b9\u09cd\u09a3" + ::msgcat::mcset bn PM "\u0985\u09aa\u09b0\u09be\u09b9\u09cd\u09a3" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/bn_in.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/bn_in.msg new file mode 100644 index 00000000..28c000f2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/bn_in.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset bn_IN DATE_FORMAT "%A %d %b %Y" + ::msgcat::mcset bn_IN TIME_FORMAT_12 "%I:%M:%S %z" + ::msgcat::mcset bn_IN DATE_TIME_FORMAT "%A %d %b %Y %I:%M:%S %z %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ca.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ca.msg new file mode 100644 index 00000000..36c97725 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ca.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ca DAYS_OF_WEEK_ABBREV [list \ + "dg."\ + "dl."\ + "dt."\ + "dc."\ + "dj."\ + "dv."\ + "ds."] + ::msgcat::mcset ca DAYS_OF_WEEK_FULL [list \ + "diumenge"\ + "dilluns"\ + "dimarts"\ + "dimecres"\ + "dijous"\ + "divendres"\ + "dissabte"] + ::msgcat::mcset ca MONTHS_ABBREV [list \ + "gen."\ + "feb."\ + "mar\u00e7"\ + "abr."\ + "maig"\ + "juny"\ + "jul."\ + "ag."\ + "set."\ + "oct."\ + "nov."\ + "des."\ + ""] + ::msgcat::mcset ca MONTHS_FULL [list \ + "gener"\ + "febrer"\ + "mar\u00e7"\ + "abril"\ + "maig"\ + "juny"\ + "juliol"\ + "agost"\ + "setembre"\ + "octubre"\ + "novembre"\ + "desembre"\ + ""] + ::msgcat::mcset ca DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset ca TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset ca DATE_TIME_FORMAT "%d/%m/%Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/cs.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/cs.msg new file mode 100644 index 00000000..8db8bdd8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/cs.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset cs DAYS_OF_WEEK_ABBREV [list \ + "Ne"\ + "Po"\ + "\u00dat"\ + "St"\ + "\u010ct"\ + "P\u00e1"\ + "So"] + ::msgcat::mcset cs DAYS_OF_WEEK_FULL [list \ + "Ned\u011ble"\ + "Pond\u011bl\u00ed"\ + "\u00dater\u00fd"\ + "St\u0159eda"\ + "\u010ctvrtek"\ + "P\u00e1tek"\ + "Sobota"] + ::msgcat::mcset cs MONTHS_ABBREV [list \ + "I"\ + "II"\ + "III"\ + "IV"\ + "V"\ + "VI"\ + "VII"\ + "VIII"\ + "IX"\ + "X"\ + "XI"\ + "XII"\ + ""] + ::msgcat::mcset cs MONTHS_FULL [list \ + "leden"\ + "\u00fanor"\ + "b\u0159ezen"\ + "duben"\ + "kv\u011bten"\ + "\u010derven"\ + "\u010dervenec"\ + "srpen"\ + "z\u00e1\u0159\u00ed"\ + "\u0159\u00edjen"\ + "listopad"\ + "prosinec"\ + ""] + ::msgcat::mcset cs BCE "p\u0159.Kr." + ::msgcat::mcset cs CE "po Kr." + ::msgcat::mcset cs AM "dop." + ::msgcat::mcset cs PM "odp." + ::msgcat::mcset cs DATE_FORMAT "%e.%m.%Y" + ::msgcat::mcset cs TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset cs DATE_TIME_FORMAT "%e.%m.%Y %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/da.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/da.msg new file mode 100644 index 00000000..e4fec7f0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/da.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset da DAYS_OF_WEEK_ABBREV [list \ + "s\u00f8"\ + "ma"\ + "ti"\ + "on"\ + "to"\ + "fr"\ + "l\u00f8"] + ::msgcat::mcset da DAYS_OF_WEEK_FULL [list \ + "s\u00f8ndag"\ + "mandag"\ + "tirsdag"\ + "onsdag"\ + "torsdag"\ + "fredag"\ + "l\u00f8rdag"] + ::msgcat::mcset da MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "maj"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset da MONTHS_FULL [list \ + "januar"\ + "februar"\ + "marts"\ + "april"\ + "maj"\ + "juni"\ + "juli"\ + "august"\ + "september"\ + "oktober"\ + "november"\ + "december"\ + ""] + ::msgcat::mcset da BCE "f.Kr." + ::msgcat::mcset da CE "e.Kr." + ::msgcat::mcset da DATE_FORMAT "%d-%m-%Y" + ::msgcat::mcset da TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset da DATE_TIME_FORMAT "%d-%m-%Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/de.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/de.msg new file mode 100644 index 00000000..9eb31454 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/de.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset de DAYS_OF_WEEK_ABBREV [list \ + "So"\ + "Mo"\ + "Di"\ + "Mi"\ + "Do"\ + "Fr"\ + "Sa"] + ::msgcat::mcset de DAYS_OF_WEEK_FULL [list \ + "Sonntag"\ + "Montag"\ + "Dienstag"\ + "Mittwoch"\ + "Donnerstag"\ + "Freitag"\ + "Samstag"] + ::msgcat::mcset de MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "Mrz"\ + "Apr"\ + "Mai"\ + "Jun"\ + "Jul"\ + "Aug"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Dez"\ + ""] + ::msgcat::mcset de MONTHS_FULL [list \ + "Januar"\ + "Februar"\ + "M\u00e4rz"\ + "April"\ + "Mai"\ + "Juni"\ + "Juli"\ + "August"\ + "September"\ + "Oktober"\ + "November"\ + "Dezember"\ + ""] + ::msgcat::mcset de BCE "v. Chr." + ::msgcat::mcset de CE "n. Chr." + ::msgcat::mcset de AM "vorm." + ::msgcat::mcset de PM "nachm." + ::msgcat::mcset de DATE_FORMAT "%d.%m.%Y" + ::msgcat::mcset de TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset de DATE_TIME_FORMAT "%d.%m.%Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/de_at.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/de_at.msg new file mode 100644 index 00000000..61bc2666 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/de_at.msg @@ -0,0 +1,35 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset de_AT MONTHS_ABBREV [list \ + "J\u00e4n"\ + "Feb"\ + "M\u00e4r"\ + "Apr"\ + "Mai"\ + "Jun"\ + "Jul"\ + "Aug"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Dez"\ + ""] + ::msgcat::mcset de_AT MONTHS_FULL [list \ + "J\u00e4nner"\ + "Februar"\ + "M\u00e4rz"\ + "April"\ + "Mai"\ + "Juni"\ + "Juli"\ + "August"\ + "September"\ + "Oktober"\ + "November"\ + "Dezember"\ + ""] + ::msgcat::mcset de_AT DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset de_AT TIME_FORMAT "%T" + ::msgcat::mcset de_AT TIME_FORMAT_12 "%T" + ::msgcat::mcset de_AT DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/de_be.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/de_be.msg new file mode 100644 index 00000000..3614763a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/de_be.msg @@ -0,0 +1,53 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset de_BE DAYS_OF_WEEK_ABBREV [list \ + "Son"\ + "Mon"\ + "Die"\ + "Mit"\ + "Don"\ + "Fre"\ + "Sam"] + ::msgcat::mcset de_BE DAYS_OF_WEEK_FULL [list \ + "Sonntag"\ + "Montag"\ + "Dienstag"\ + "Mittwoch"\ + "Donnerstag"\ + "Freitag"\ + "Samstag"] + ::msgcat::mcset de_BE MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "M\u00e4r"\ + "Apr"\ + "Mai"\ + "Jun"\ + "Jul"\ + "Aug"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Dez"\ + ""] + ::msgcat::mcset de_BE MONTHS_FULL [list \ + "Januar"\ + "Februar"\ + "M\u00e4rz"\ + "April"\ + "Mai"\ + "Juni"\ + "Juli"\ + "August"\ + "September"\ + "Oktober"\ + "November"\ + "Dezember"\ + ""] + ::msgcat::mcset de_BE AM "vorm" + ::msgcat::mcset de_BE PM "nachm" + ::msgcat::mcset de_BE DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset de_BE TIME_FORMAT "%T" + ::msgcat::mcset de_BE TIME_FORMAT_12 "%T" + ::msgcat::mcset de_BE DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/el.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/el.msg new file mode 100644 index 00000000..ac19f62d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/el.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset el DAYS_OF_WEEK_ABBREV [list \ + "\u039a\u03c5\u03c1"\ + "\u0394\u03b5\u03c5"\ + "\u03a4\u03c1\u03b9"\ + "\u03a4\u03b5\u03c4"\ + "\u03a0\u03b5\u03bc"\ + "\u03a0\u03b1\u03c1"\ + "\u03a3\u03b1\u03b2"] + ::msgcat::mcset el DAYS_OF_WEEK_FULL [list \ + "\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae"\ + "\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1"\ + "\u03a4\u03c1\u03af\u03c4\u03b7"\ + "\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7"\ + "\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7"\ + "\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae"\ + "\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf"] + ::msgcat::mcset el MONTHS_ABBREV [list \ + "\u0399\u03b1\u03bd"\ + "\u03a6\u03b5\u03b2"\ + "\u039c\u03b1\u03c1"\ + "\u0391\u03c0\u03c1"\ + "\u039c\u03b1\u03ca"\ + "\u0399\u03bf\u03c5\u03bd"\ + "\u0399\u03bf\u03c5\u03bb"\ + "\u0391\u03c5\u03b3"\ + "\u03a3\u03b5\u03c0"\ + "\u039f\u03ba\u03c4"\ + "\u039d\u03bf\u03b5"\ + "\u0394\u03b5\u03ba"\ + ""] + ::msgcat::mcset el MONTHS_FULL [list \ + "\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2"\ + "\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2"\ + "\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2"\ + "\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2"\ + "\u039c\u03ac\u03ca\u03bf\u03c2"\ + "\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2"\ + "\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2"\ + "\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2"\ + "\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"\ + "\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2"\ + "\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"\ + "\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"\ + ""] + ::msgcat::mcset el AM "\u03c0\u03bc" + ::msgcat::mcset el PM "\u03bc\u03bc" + ::msgcat::mcset el DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset el TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset el DATE_TIME_FORMAT "%e/%m/%Y %l:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_au.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_au.msg new file mode 100644 index 00000000..7f9870c9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_au.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_AU DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset en_AU TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset en_AU TIME_FORMAT_12 "%I:%M:%S %P %z" + ::msgcat::mcset en_AU DATE_TIME_FORMAT "%e/%m/%Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_be.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_be.msg new file mode 100644 index 00000000..5072986d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_be.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_BE DATE_FORMAT "%d %b %Y" + ::msgcat::mcset en_BE TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset en_BE TIME_FORMAT_12 "%k h %M min %S s %z" + ::msgcat::mcset en_BE DATE_TIME_FORMAT "%d %b %Y %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_bw.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_bw.msg new file mode 100644 index 00000000..8fd20c7e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_bw.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_BW DATE_FORMAT "%d %B %Y" + ::msgcat::mcset en_BW TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset en_BW DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ca.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ca.msg new file mode 100644 index 00000000..278efe71 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ca.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_CA DATE_FORMAT "%d/%m/%y" + ::msgcat::mcset en_CA TIME_FORMAT "%r" + ::msgcat::mcset en_CA TIME_FORMAT_12 "%I:%M:%S %p" + ::msgcat::mcset en_CA DATE_TIME_FORMAT "%a %d %b %Y %r %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_gb.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_gb.msg new file mode 100644 index 00000000..5c61c43c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_gb.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_GB DATE_FORMAT "%d/%m/%y" + ::msgcat::mcset en_GB TIME_FORMAT "%T" + ::msgcat::mcset en_GB TIME_FORMAT_12 "%T" + ::msgcat::mcset en_GB DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_hk.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_hk.msg new file mode 100644 index 00000000..8b33bc06 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_hk.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_HK AM "AM" + ::msgcat::mcset en_HK PM "PM" + ::msgcat::mcset en_HK DATE_FORMAT "%B %e, %Y" + ::msgcat::mcset en_HK TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset en_HK DATE_TIME_FORMAT "%B %e, %Y %l:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ie.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ie.msg new file mode 100644 index 00000000..ba621cf2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ie.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_IE DATE_FORMAT "%d/%m/%y" + ::msgcat::mcset en_IE TIME_FORMAT "%T" + ::msgcat::mcset en_IE TIME_FORMAT_12 "%T" + ::msgcat::mcset en_IE DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_in.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_in.msg new file mode 100644 index 00000000..a1f155d2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_in.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_IN AM "AM" + ::msgcat::mcset en_IN PM "PM" + ::msgcat::mcset en_IN DATE_FORMAT "%d %B %Y" + ::msgcat::mcset en_IN TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset en_IN DATE_TIME_FORMAT "%d %B %Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_nz.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_nz.msg new file mode 100644 index 00000000..b419017a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_nz.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_NZ DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset en_NZ TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset en_NZ TIME_FORMAT_12 "%I:%M:%S %P %z" + ::msgcat::mcset en_NZ DATE_TIME_FORMAT "%e/%m/%Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ph.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ph.msg new file mode 100644 index 00000000..682666d5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_ph.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_PH AM "AM" + ::msgcat::mcset en_PH PM "PM" + ::msgcat::mcset en_PH DATE_FORMAT "%B %e, %Y" + ::msgcat::mcset en_PH TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset en_PH DATE_TIME_FORMAT "%B %e, %Y %l:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_sg.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_sg.msg new file mode 100644 index 00000000..4dc5b1d3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_sg.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_SG DATE_FORMAT "%d %b %Y" + ::msgcat::mcset en_SG TIME_FORMAT_12 "%P %I:%M:%S" + ::msgcat::mcset en_SG DATE_TIME_FORMAT "%d %b %Y %P %I:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_za.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_za.msg new file mode 100644 index 00000000..fe43797f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_za.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_ZA DATE_FORMAT "%Y/%m/%d" + ::msgcat::mcset en_ZA TIME_FORMAT_12 "%I:%M:%S" + ::msgcat::mcset en_ZA DATE_TIME_FORMAT "%Y/%m/%d %I:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_zw.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_zw.msg new file mode 100644 index 00000000..2a5804fa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/en_zw.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_ZW DATE_FORMAT "%d %B %Y" + ::msgcat::mcset en_ZW TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset en_ZW DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/eo.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/eo.msg new file mode 100644 index 00000000..1d2a24fe --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/eo.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset eo DAYS_OF_WEEK_ABBREV [list \ + "di"\ + "lu"\ + "ma"\ + "me"\ + "\u0135a"\ + "ve"\ + "sa"] + ::msgcat::mcset eo DAYS_OF_WEEK_FULL [list \ + "diman\u0109o"\ + "lundo"\ + "mardo"\ + "merkredo"\ + "\u0135a\u016ddo"\ + "vendredo"\ + "sabato"] + ::msgcat::mcset eo MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "maj"\ + "jun"\ + "jul"\ + "a\u016dg"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset eo MONTHS_FULL [list \ + "januaro"\ + "februaro"\ + "marto"\ + "aprilo"\ + "majo"\ + "junio"\ + "julio"\ + "a\u016dgusto"\ + "septembro"\ + "oktobro"\ + "novembro"\ + "decembro"\ + ""] + ::msgcat::mcset eo BCE "aK" + ::msgcat::mcset eo CE "pK" + ::msgcat::mcset eo AM "atm" + ::msgcat::mcset eo PM "ptm" + ::msgcat::mcset eo DATE_FORMAT "%Y-%b-%d" + ::msgcat::mcset eo TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset eo DATE_TIME_FORMAT "%Y-%b-%d %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es.msg new file mode 100644 index 00000000..a24f0a1b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es DAYS_OF_WEEK_ABBREV [list \ + "dom"\ + "lun"\ + "mar"\ + "mi\u00e9"\ + "jue"\ + "vie"\ + "s\u00e1b"] + ::msgcat::mcset es DAYS_OF_WEEK_FULL [list \ + "domingo"\ + "lunes"\ + "martes"\ + "mi\u00e9rcoles"\ + "jueves"\ + "viernes"\ + "s\u00e1bado"] + ::msgcat::mcset es MONTHS_ABBREV [list \ + "ene"\ + "feb"\ + "mar"\ + "abr"\ + "may"\ + "jun"\ + "jul"\ + "ago"\ + "sep"\ + "oct"\ + "nov"\ + "dic"\ + ""] + ::msgcat::mcset es MONTHS_FULL [list \ + "enero"\ + "febrero"\ + "marzo"\ + "abril"\ + "mayo"\ + "junio"\ + "julio"\ + "agosto"\ + "septiembre"\ + "octubre"\ + "noviembre"\ + "diciembre"\ + ""] + ::msgcat::mcset es BCE "a.C." + ::msgcat::mcset es CE "d.C." + ::msgcat::mcset es DATE_FORMAT "%e de %B de %Y" + ::msgcat::mcset es TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset es DATE_TIME_FORMAT "%e de %B de %Y %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ar.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ar.msg new file mode 100644 index 00000000..7d350274 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ar.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_AR DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_AR TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset es_AR DATE_TIME_FORMAT "%d/%m/%Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_bo.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_bo.msg new file mode 100644 index 00000000..498ad0d1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_bo.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_BO DATE_FORMAT "%d-%m-%Y" + ::msgcat::mcset es_BO TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_BO DATE_TIME_FORMAT "%d-%m-%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_cl.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_cl.msg new file mode 100644 index 00000000..31d465c9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_cl.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_CL DATE_FORMAT "%d-%m-%Y" + ::msgcat::mcset es_CL TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_CL DATE_TIME_FORMAT "%d-%m-%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_co.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_co.msg new file mode 100644 index 00000000..77e57f0b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_co.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_CO DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset es_CO TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_CO DATE_TIME_FORMAT "%e/%m/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_cr.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_cr.msg new file mode 100644 index 00000000..7a652fa4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_cr.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_CR DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_CR TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_CR DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_do.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_do.msg new file mode 100644 index 00000000..0e283da8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_do.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_DO DATE_FORMAT "%m/%d/%Y" + ::msgcat::mcset es_DO TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_DO DATE_TIME_FORMAT "%m/%d/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ec.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ec.msg new file mode 100644 index 00000000..9e921e02 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ec.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_EC DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_EC TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_EC DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_gt.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_gt.msg new file mode 100644 index 00000000..ecd6faf9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_gt.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_GT DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset es_GT TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_GT DATE_TIME_FORMAT "%e/%m/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_hn.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_hn.msg new file mode 100644 index 00000000..a758ca2b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_hn.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_HN DATE_FORMAT "%m-%d-%Y" + ::msgcat::mcset es_HN TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_HN DATE_TIME_FORMAT "%m-%d-%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_mx.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_mx.msg new file mode 100644 index 00000000..7cfb545b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_mx.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_MX DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset es_MX TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_MX DATE_TIME_FORMAT "%e/%m/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ni.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ni.msg new file mode 100644 index 00000000..7c394953 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ni.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_NI DATE_FORMAT "%m-%d-%Y" + ::msgcat::mcset es_NI TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_NI DATE_TIME_FORMAT "%m-%d-%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pa.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pa.msg new file mode 100644 index 00000000..cecacdce --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pa.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_PA DATE_FORMAT "%m/%d/%Y" + ::msgcat::mcset es_PA TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_PA DATE_TIME_FORMAT "%m/%d/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pe.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pe.msg new file mode 100644 index 00000000..9f90595f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pe.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_PE DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_PE TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_PE DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pr.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pr.msg new file mode 100644 index 00000000..8511b126 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_pr.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_PR DATE_FORMAT "%m-%d-%Y" + ::msgcat::mcset es_PR TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_PR DATE_TIME_FORMAT "%m-%d-%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_py.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_py.msg new file mode 100644 index 00000000..aa93d36b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_py.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_PY DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_PY TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_PY DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_sv.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_sv.msg new file mode 100644 index 00000000..fc7954d6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_sv.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_SV DATE_FORMAT "%m-%d-%Y" + ::msgcat::mcset es_SV TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_SV DATE_TIME_FORMAT "%m-%d-%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_uy.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_uy.msg new file mode 100644 index 00000000..b33525c0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_uy.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_UY DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_UY TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_UY DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ve.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ve.msg new file mode 100644 index 00000000..7c2a7b0a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/es_ve.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_VE DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_VE TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_VE DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/et.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/et.msg new file mode 100644 index 00000000..8d32e9e5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/et.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset et DAYS_OF_WEEK_ABBREV [list \ + "P"\ + "E"\ + "T"\ + "K"\ + "N"\ + "R"\ + "L"] + ::msgcat::mcset et DAYS_OF_WEEK_FULL [list \ + "p\u00fchap\u00e4ev"\ + "esmasp\u00e4ev"\ + "teisip\u00e4ev"\ + "kolmap\u00e4ev"\ + "neljap\u00e4ev"\ + "reede"\ + "laup\u00e4ev"] + ::msgcat::mcset et MONTHS_ABBREV [list \ + "Jaan"\ + "Veebr"\ + "M\u00e4rts"\ + "Apr"\ + "Mai"\ + "Juuni"\ + "Juuli"\ + "Aug"\ + "Sept"\ + "Okt"\ + "Nov"\ + "Dets"\ + ""] + ::msgcat::mcset et MONTHS_FULL [list \ + "Jaanuar"\ + "Veebruar"\ + "M\u00e4rts"\ + "Aprill"\ + "Mai"\ + "Juuni"\ + "Juuli"\ + "August"\ + "September"\ + "Oktoober"\ + "November"\ + "Detsember"\ + ""] + ::msgcat::mcset et BCE "e.m.a." + ::msgcat::mcset et CE "m.a.j." + ::msgcat::mcset et DATE_FORMAT "%e-%m-%Y" + ::msgcat::mcset et TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset et DATE_TIME_FORMAT "%e-%m-%Y %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/eu.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/eu.msg new file mode 100644 index 00000000..cf708b6b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/eu.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset eu DAYS_OF_WEEK_ABBREV [list \ + "igandea"\ + "astelehena"\ + "asteartea"\ + "asteazkena"\ + "osteguna"\ + "ostirala"\ + "larunbata"] + ::msgcat::mcset eu DAYS_OF_WEEK_FULL [list \ + "igandea"\ + "astelehena"\ + "asteartea"\ + "asteazkena"\ + "osteguna"\ + "ostirala"\ + "larunbata"] + ::msgcat::mcset eu MONTHS_ABBREV [list \ + "urt"\ + "ots"\ + "mar"\ + "api"\ + "mai"\ + "eka"\ + "uzt"\ + "abu"\ + "ira"\ + "urr"\ + "aza"\ + "abe"\ + ""] + ::msgcat::mcset eu MONTHS_FULL [list \ + "urtarrila"\ + "otsaila"\ + "martxoa"\ + "apirila"\ + "maiatza"\ + "ekaina"\ + "uztaila"\ + "abuztua"\ + "iraila"\ + "urria"\ + "azaroa"\ + "abendua"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/eu_es.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/eu_es.msg new file mode 100644 index 00000000..2694418d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/eu_es.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset eu_ES DATE_FORMAT "%a, %Yeko %bren %da" + ::msgcat::mcset eu_ES TIME_FORMAT "%T" + ::msgcat::mcset eu_ES TIME_FORMAT_12 "%T" + ::msgcat::mcset eu_ES DATE_TIME_FORMAT "%y-%m-%d %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa.msg new file mode 100644 index 00000000..89b2f908 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fa DAYS_OF_WEEK_ABBREV [list \ + "\u06cc\u2214"\ + "\u062f\u2214"\ + "\u0633\u2214"\ + "\u0686\u2214"\ + "\u067e\u2214"\ + "\u062c\u2214"\ + "\u0634\u2214"] + ::msgcat::mcset fa DAYS_OF_WEEK_FULL [list \ + "\u06cc\u06cc\u200c\u0634\u0646\u0628\u0647"\ + "\u062f\u0648\u0634\u0646\u0628\u0647"\ + "\u0633\u0647\u200c\u0634\u0646\u0628\u0647"\ + "\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647"\ + "\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647"\ + "\u062c\u0645\u0639\u0647"\ + "\u0634\u0646\u0628\u0647"] + ::msgcat::mcset fa MONTHS_ABBREV [list \ + "\u0698\u0627\u0646"\ + "\u0641\u0648\u0631"\ + "\u0645\u0627\u0631"\ + "\u0622\u0648\u0631"\ + "\u0645\u0640\u0647"\ + "\u0698\u0648\u0646"\ + "\u0698\u0648\u06cc"\ + "\u0627\u0648\u062a"\ + "\u0633\u067e\u062a"\ + "\u0627\u0643\u062a"\ + "\u0646\u0648\u0627"\ + "\u062f\u0633\u0627"\ + ""] + ::msgcat::mcset fa MONTHS_FULL [list \ + "\u0698\u0627\u0646\u0648\u06cc\u0647"\ + "\u0641\u0648\u0631\u0648\u06cc\u0647"\ + "\u0645\u0627\u0631\u0633"\ + "\u0622\u0648\u0631\u06cc\u0644"\ + "\u0645\u0647"\ + "\u0698\u0648\u0626\u0646"\ + "\u0698\u0648\u0626\u06cc\u0647"\ + "\u0627\u0648\u062a"\ + "\u0633\u067e\u062a\u0627\u0645\u0628\u0631"\ + "\u0627\u0643\u062a\u0628\u0631"\ + "\u0646\u0648\u0627\u0645\u0628\u0631"\ + "\u062f\u0633\u0627\u0645\u0628\u0631"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa_in.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa_in.msg new file mode 100644 index 00000000..adc9e91d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa_in.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fa_IN DAYS_OF_WEEK_ABBREV [list \ + "\u06cc\u2214"\ + "\u062f\u2214"\ + "\u0633\u2214"\ + "\u0686\u2214"\ + "\u067e\u2214"\ + "\u062c\u2214"\ + "\u0634\u2214"] + ::msgcat::mcset fa_IN DAYS_OF_WEEK_FULL [list \ + "\u06cc\u06cc\u200c\u0634\u0646\u0628\u0647"\ + "\u062f\u0648\u0634\u0646\u0628\u0647"\ + "\u0633\u0647\u200c\u0634\u0646\u0628\u0647"\ + "\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647"\ + "\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647"\ + "\u062c\u0645\u0639\u0647"\ + "\u0634\u0646\u0628\u0647"] + ::msgcat::mcset fa_IN MONTHS_ABBREV [list \ + "\u0698\u0627\u0646"\ + "\u0641\u0648\u0631"\ + "\u0645\u0627\u0631"\ + "\u0622\u0648\u0631"\ + "\u0645\u0640\u0647"\ + "\u0698\u0648\u0646"\ + "\u0698\u0648\u06cc"\ + "\u0627\u0648\u062a"\ + "\u0633\u067e\u062a"\ + "\u0627\u0643\u062a"\ + "\u0646\u0648\u0627"\ + "\u062f\u0633\u0627"\ + ""] + ::msgcat::mcset fa_IN MONTHS_FULL [list \ + "\u0698\u0627\u0646\u0648\u06cc\u0647"\ + "\u0641\u0648\u0631\u0648\u06cc\u0647"\ + "\u0645\u0627\u0631\u0633"\ + "\u0622\u0648\u0631\u06cc\u0644"\ + "\u0645\u0647"\ + "\u0698\u0648\u0626\u0646"\ + "\u0698\u0648\u0626\u06cc\u0647"\ + "\u0627\u0648\u062a"\ + "\u0633\u067e\u062a\u0627\u0645\u0628\u0631"\ + "\u0627\u0643\u062a\u0628\u0631"\ + "\u0646\u0648\u0627\u0645\u0628\u0631"\ + "\u062f\u0633\u0627\u0645\u0628\u0631"\ + ""] + ::msgcat::mcset fa_IN AM "\u0635\u0628\u062d" + ::msgcat::mcset fa_IN PM "\u0639\u0635\u0631" + ::msgcat::mcset fa_IN DATE_FORMAT "%A %d %B %Y" + ::msgcat::mcset fa_IN TIME_FORMAT_12 "%I:%M:%S %z" + ::msgcat::mcset fa_IN DATE_TIME_FORMAT "%A %d %B %Y %I:%M:%S %z %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa_ir.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa_ir.msg new file mode 100644 index 00000000..597ce9d7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fa_ir.msg @@ -0,0 +1,9 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fa_IR AM "\u0635\u0628\u062d" + ::msgcat::mcset fa_IR PM "\u0639\u0635\u0631" + ::msgcat::mcset fa_IR DATE_FORMAT "%d\u2044%m\u2044%Y" + ::msgcat::mcset fa_IR TIME_FORMAT "%S:%M:%H" + ::msgcat::mcset fa_IR TIME_FORMAT_12 "%S:%M:%l %P" + ::msgcat::mcset fa_IR DATE_TIME_FORMAT "%d\u2044%m\u2044%Y %S:%M:%H %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fi.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fi.msg new file mode 100644 index 00000000..acabba09 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fi.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fi DAYS_OF_WEEK_ABBREV [list \ + "su"\ + "ma"\ + "ti"\ + "ke"\ + "to"\ + "pe"\ + "la"] + ::msgcat::mcset fi DAYS_OF_WEEK_FULL [list \ + "sunnuntai"\ + "maanantai"\ + "tiistai"\ + "keskiviikko"\ + "torstai"\ + "perjantai"\ + "lauantai"] + ::msgcat::mcset fi MONTHS_ABBREV [list \ + "tammi"\ + "helmi"\ + "maalis"\ + "huhti"\ + "touko"\ + "kes\u00e4"\ + "hein\u00e4"\ + "elo"\ + "syys"\ + "loka"\ + "marras"\ + "joulu"\ + ""] + ::msgcat::mcset fi MONTHS_FULL [list \ + "tammikuu"\ + "helmikuu"\ + "maaliskuu"\ + "huhtikuu"\ + "toukokuu"\ + "kes\u00e4kuu"\ + "hein\u00e4kuu"\ + "elokuu"\ + "syyskuu"\ + "lokakuu"\ + "marraskuu"\ + "joulukuu"\ + ""] + ::msgcat::mcset fi DATE_FORMAT "%e.%m.%Y" + ::msgcat::mcset fi TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset fi DATE_TIME_FORMAT "%e.%m.%Y %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fo.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fo.msg new file mode 100644 index 00000000..4696e628 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fo.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fo DAYS_OF_WEEK_ABBREV [list \ + "sun"\ + "m\u00e1n"\ + "t\u00fds"\ + "mik"\ + "h\u00f3s"\ + "fr\u00ed"\ + "ley"] + ::msgcat::mcset fo DAYS_OF_WEEK_FULL [list \ + "sunnudagur"\ + "m\u00e1nadagur"\ + "t\u00fdsdagur"\ + "mikudagur"\ + "h\u00f3sdagur"\ + "fr\u00edggjadagur"\ + "leygardagur"] + ::msgcat::mcset fo MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "mai"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "des"\ + ""] + ::msgcat::mcset fo MONTHS_FULL [list \ + "januar"\ + "februar"\ + "mars"\ + "apr\u00edl"\ + "mai"\ + "juni"\ + "juli"\ + "august"\ + "september"\ + "oktober"\ + "november"\ + "desember"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fo_fo.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fo_fo.msg new file mode 100644 index 00000000..2392b8e6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fo_fo.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fo_FO DATE_FORMAT "%d/%m-%Y" + ::msgcat::mcset fo_FO TIME_FORMAT "%T" + ::msgcat::mcset fo_FO TIME_FORMAT_12 "%T" + ::msgcat::mcset fo_FO DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr.msg new file mode 100644 index 00000000..55b19bf9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fr DAYS_OF_WEEK_ABBREV [list \ + "dim."\ + "lun."\ + "mar."\ + "mer."\ + "jeu."\ + "ven."\ + "sam."] + ::msgcat::mcset fr DAYS_OF_WEEK_FULL [list \ + "dimanche"\ + "lundi"\ + "mardi"\ + "mercredi"\ + "jeudi"\ + "vendredi"\ + "samedi"] + ::msgcat::mcset fr MONTHS_ABBREV [list \ + "janv."\ + "f\u00e9vr."\ + "mars"\ + "avr."\ + "mai"\ + "juin"\ + "juil."\ + "ao\u00fbt"\ + "sept."\ + "oct."\ + "nov."\ + "d\u00e9c."\ + ""] + ::msgcat::mcset fr MONTHS_FULL [list \ + "janvier"\ + "f\u00e9vrier"\ + "mars"\ + "avril"\ + "mai"\ + "juin"\ + "juillet"\ + "ao\u00fbt"\ + "septembre"\ + "octobre"\ + "novembre"\ + "d\u00e9cembre"\ + ""] + ::msgcat::mcset fr BCE "av. J.-C." + ::msgcat::mcset fr CE "ap. J.-C." + ::msgcat::mcset fr DATE_FORMAT "%e %B %Y" + ::msgcat::mcset fr TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset fr DATE_TIME_FORMAT "%e %B %Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_be.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_be.msg new file mode 100644 index 00000000..cdb13bd7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_be.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fr_BE DATE_FORMAT "%d/%m/%y" + ::msgcat::mcset fr_BE TIME_FORMAT "%T" + ::msgcat::mcset fr_BE TIME_FORMAT_12 "%T" + ::msgcat::mcset fr_BE DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_ca.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_ca.msg new file mode 100644 index 00000000..00ccfffc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_ca.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fr_CA DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset fr_CA TIME_FORMAT "%T" + ::msgcat::mcset fr_CA TIME_FORMAT_12 "%T" + ::msgcat::mcset fr_CA DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_ch.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_ch.msg new file mode 100644 index 00000000..7e2bac73 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/fr_ch.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fr_CH DATE_FORMAT "%d. %m. %y" + ::msgcat::mcset fr_CH TIME_FORMAT "%T" + ::msgcat::mcset fr_CH TIME_FORMAT_12 "%T" + ::msgcat::mcset fr_CH DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ga.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ga.msg new file mode 100644 index 00000000..6edf13aa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ga.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ga DAYS_OF_WEEK_ABBREV [list \ + "Domh"\ + "Luan"\ + "M\u00e1irt"\ + "C\u00e9ad"\ + "D\u00e9ar"\ + "Aoine"\ + "Sath"] + ::msgcat::mcset ga DAYS_OF_WEEK_FULL [list \ + "D\u00e9 Domhnaigh"\ + "D\u00e9 Luain"\ + "D\u00e9 M\u00e1irt"\ + "D\u00e9 C\u00e9adaoin"\ + "D\u00e9ardaoin"\ + "D\u00e9 hAoine"\ + "D\u00e9 Sathairn"] + ::msgcat::mcset ga MONTHS_ABBREV [list \ + "Ean"\ + "Feabh"\ + "M\u00e1rta"\ + "Aib"\ + "Beal"\ + "Meith"\ + "I\u00fail"\ + "L\u00fan"\ + "MF\u00f3mh"\ + "DF\u00f3mh"\ + "Samh"\ + "Noll"\ + ""] + ::msgcat::mcset ga MONTHS_FULL [list \ + "Ean\u00e1ir"\ + "Feabhra"\ + "M\u00e1rta"\ + "Aibre\u00e1n"\ + "M\u00ed na Bealtaine"\ + "Meith"\ + "I\u00fail"\ + "L\u00fanasa"\ + "Me\u00e1n F\u00f3mhair"\ + "Deireadh F\u00f3mhair"\ + "M\u00ed na Samhna"\ + "M\u00ed na Nollag"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ga_ie.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ga_ie.msg new file mode 100644 index 00000000..b6acbbc2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ga_ie.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ga_IE DATE_FORMAT "%d.%m.%y" + ::msgcat::mcset ga_IE TIME_FORMAT "%T" + ::msgcat::mcset ga_IE TIME_FORMAT_12 "%T" + ::msgcat::mcset ga_IE DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/gl.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/gl.msg new file mode 100644 index 00000000..4b869e85 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/gl.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset gl DAYS_OF_WEEK_ABBREV [list \ + "Dom"\ + "Lun"\ + "Mar"\ + "M\u00e9r"\ + "Xov"\ + "Ven"\ + "S\u00e1b"] + ::msgcat::mcset gl DAYS_OF_WEEK_FULL [list \ + "Domingo"\ + "Luns"\ + "Martes"\ + "M\u00e9rcores"\ + "Xoves"\ + "Venres"\ + "S\u00e1bado"] + ::msgcat::mcset gl MONTHS_ABBREV [list \ + "Xan"\ + "Feb"\ + "Mar"\ + "Abr"\ + "Mai"\ + "Xu\u00f1"\ + "Xul"\ + "Ago"\ + "Set"\ + "Out"\ + "Nov"\ + "Dec"\ + ""] + ::msgcat::mcset gl MONTHS_FULL [list \ + "Xaneiro"\ + "Febreiro"\ + "Marzo"\ + "Abril"\ + "Maio"\ + "Xu\u00f1o"\ + "Xullo"\ + "Agosto"\ + "Setembro"\ + "Outubro"\ + "Novembro"\ + "Decembro"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/gl_es.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/gl_es.msg new file mode 100644 index 00000000..d4ed2704 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/gl_es.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset gl_ES DATE_FORMAT "%d %B %Y" + ::msgcat::mcset gl_ES TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset gl_ES DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/gv.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/gv.msg new file mode 100644 index 00000000..7d332ad5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/gv.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset gv DAYS_OF_WEEK_ABBREV [list \ + "Jed"\ + "Jel"\ + "Jem"\ + "Jerc"\ + "Jerd"\ + "Jeh"\ + "Jes"] + ::msgcat::mcset gv DAYS_OF_WEEK_FULL [list \ + "Jedoonee"\ + "Jelhein"\ + "Jemayrt"\ + "Jercean"\ + "Jerdein"\ + "Jeheiney"\ + "Jesarn"] + ::msgcat::mcset gv MONTHS_ABBREV [list \ + "J-guer"\ + "T-arree"\ + "Mayrnt"\ + "Avrril"\ + "Boaldyn"\ + "M-souree"\ + "J-souree"\ + "Luanistyn"\ + "M-fouyir"\ + "J-fouyir"\ + "M.Houney"\ + "M.Nollick"\ + ""] + ::msgcat::mcset gv MONTHS_FULL [list \ + "Jerrey-geuree"\ + "Toshiaght-arree"\ + "Mayrnt"\ + "Averil"\ + "Boaldyn"\ + "Mean-souree"\ + "Jerrey-souree"\ + "Luanistyn"\ + "Mean-fouyir"\ + "Jerrey-fouyir"\ + "Mee Houney"\ + "Mee ny Nollick"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/gv_gb.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/gv_gb.msg new file mode 100644 index 00000000..5e96e6f3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/gv_gb.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset gv_GB DATE_FORMAT "%d %B %Y" + ::msgcat::mcset gv_GB TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset gv_GB DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/he.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/he.msg new file mode 100644 index 00000000..4fd921d6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/he.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset he DAYS_OF_WEEK_ABBREV [list \ + "\u05d0"\ + "\u05d1"\ + "\u05d2"\ + "\u05d3"\ + "\u05d4"\ + "\u05d5"\ + "\u05e9"] + ::msgcat::mcset he DAYS_OF_WEEK_FULL [list \ + "\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df"\ + "\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9"\ + "\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9"\ + "\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9"\ + "\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9"\ + "\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9"\ + "\u05e9\u05d1\u05ea"] + ::msgcat::mcset he MONTHS_ABBREV [list \ + "\u05d9\u05e0\u05d5"\ + "\u05e4\u05d1\u05e8"\ + "\u05de\u05e8\u05e5"\ + "\u05d0\u05e4\u05e8"\ + "\u05de\u05d0\u05d9"\ + "\u05d9\u05d5\u05e0"\ + "\u05d9\u05d5\u05dc"\ + "\u05d0\u05d5\u05d2"\ + "\u05e1\u05e4\u05d8"\ + "\u05d0\u05d5\u05e7"\ + "\u05e0\u05d5\u05d1"\ + "\u05d3\u05e6\u05de"\ + ""] + ::msgcat::mcset he MONTHS_FULL [list \ + "\u05d9\u05e0\u05d5\u05d0\u05e8"\ + "\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8"\ + "\u05de\u05e8\u05e5"\ + "\u05d0\u05e4\u05e8\u05d9\u05dc"\ + "\u05de\u05d0\u05d9"\ + "\u05d9\u05d5\u05e0\u05d9"\ + "\u05d9\u05d5\u05dc\u05d9"\ + "\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8"\ + "\u05e1\u05e4\u05d8\u05de\u05d1\u05e8"\ + "\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8"\ + "\u05e0\u05d5\u05d1\u05de\u05d1\u05e8"\ + "\u05d3\u05e6\u05de\u05d1\u05e8"\ + ""] + ::msgcat::mcset he BCE "\u05dc\u05e1\u05d4\u0022\u05e0" + ::msgcat::mcset he CE "\u05dc\u05e4\u05e1\u05d4\u0022\u05e0" + ::msgcat::mcset he DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset he TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset he DATE_TIME_FORMAT "%d/%m/%Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/hi.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/hi.msg new file mode 100644 index 00000000..50c9fb80 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/hi.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset hi DAYS_OF_WEEK_FULL [list \ + "\u0930\u0935\u093f\u0935\u093e\u0930"\ + "\u0938\u094b\u092e\u0935\u093e\u0930"\ + "\u092e\u0902\u0917\u0932\u0935\u093e\u0930"\ + "\u092c\u0941\u0927\u0935\u093e\u0930"\ + "\u0917\u0941\u0930\u0941\u0935\u093e\u0930"\ + "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930"\ + "\u0936\u0928\u093f\u0935\u093e\u0930"] + ::msgcat::mcset hi MONTHS_ABBREV [list \ + "\u091c\u0928\u0935\u0930\u0940"\ + "\u092b\u093c\u0930\u0935\u0930\u0940"\ + "\u092e\u093e\u0930\u094d\u091a"\ + "\u0905\u092a\u094d\u0930\u0947\u0932"\ + "\u092e\u0908"\ + "\u091c\u0942\u0928"\ + "\u091c\u0941\u0932\u093e\u0908"\ + "\u0905\u0917\u0938\u094d\u0924"\ + "\u0938\u093f\u0924\u092e\u094d\u092c\u0930"\ + "\u0905\u0915\u094d\u091f\u0942\u092c\u0930"\ + "\u0928\u0935\u092e\u094d\u092c\u0930"\ + "\u0926\u093f\u0938\u092e\u094d\u092c\u0930"] + ::msgcat::mcset hi MONTHS_FULL [list \ + "\u091c\u0928\u0935\u0930\u0940"\ + "\u092b\u093c\u0930\u0935\u0930\u0940"\ + "\u092e\u093e\u0930\u094d\u091a"\ + "\u0905\u092a\u094d\u0930\u0947\u0932"\ + "\u092e\u0908"\ + "\u091c\u0942\u0928"\ + "\u091c\u0941\u0932\u093e\u0908"\ + "\u0905\u0917\u0938\u094d\u0924"\ + "\u0938\u093f\u0924\u092e\u094d\u092c\u0930"\ + "\u0905\u0915\u094d\u091f\u0942\u092c\u0930"\ + "\u0928\u0935\u092e\u094d\u092c\u0930"\ + "\u0926\u093f\u0938\u092e\u094d\u092c\u0930"] + ::msgcat::mcset hi AM "\u0908\u0938\u093e\u092a\u0942\u0930\u094d\u0935" + ::msgcat::mcset hi PM "." +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/hi_in.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/hi_in.msg new file mode 100644 index 00000000..239793f1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/hi_in.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset hi_IN DATE_FORMAT "%d %M %Y" + ::msgcat::mcset hi_IN TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset hi_IN DATE_TIME_FORMAT "%d %M %Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/hr.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/hr.msg new file mode 100644 index 00000000..cec145b0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/hr.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset hr DAYS_OF_WEEK_ABBREV [list \ + "ned"\ + "pon"\ + "uto"\ + "sri"\ + "\u010det"\ + "pet"\ + "sub"] + ::msgcat::mcset hr DAYS_OF_WEEK_FULL [list \ + "nedjelja"\ + "ponedjeljak"\ + "utorak"\ + "srijeda"\ + "\u010detvrtak"\ + "petak"\ + "subota"] + ::msgcat::mcset hr MONTHS_ABBREV [list \ + "sij"\ + "vel"\ + "o\u017eu"\ + "tra"\ + "svi"\ + "lip"\ + "srp"\ + "kol"\ + "ruj"\ + "lis"\ + "stu"\ + "pro"\ + ""] + ::msgcat::mcset hr MONTHS_FULL [list \ + "sije\u010danj"\ + "velja\u010da"\ + "o\u017eujak"\ + "travanj"\ + "svibanj"\ + "lipanj"\ + "srpanj"\ + "kolovoz"\ + "rujan"\ + "listopad"\ + "studeni"\ + "prosinac"\ + ""] + ::msgcat::mcset hr DATE_FORMAT "%Y.%m.%d" + ::msgcat::mcset hr TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset hr DATE_TIME_FORMAT "%Y.%m.%d %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/hu.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/hu.msg new file mode 100644 index 00000000..e5e68d92 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/hu.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset hu DAYS_OF_WEEK_ABBREV [list \ + "V"\ + "H"\ + "K"\ + "Sze"\ + "Cs"\ + "P"\ + "Szo"] + ::msgcat::mcset hu DAYS_OF_WEEK_FULL [list \ + "vas\u00e1rnap"\ + "h\u00e9tf\u0151"\ + "kedd"\ + "szerda"\ + "cs\u00fct\u00f6rt\u00f6k"\ + "p\u00e9ntek"\ + "szombat"] + ::msgcat::mcset hu MONTHS_ABBREV [list \ + "jan."\ + "febr."\ + "m\u00e1rc."\ + "\u00e1pr."\ + "m\u00e1j."\ + "j\u00fan."\ + "j\u00fal."\ + "aug."\ + "szept."\ + "okt."\ + "nov."\ + "dec."\ + ""] + ::msgcat::mcset hu MONTHS_FULL [list \ + "janu\u00e1r"\ + "febru\u00e1r"\ + "m\u00e1rcius"\ + "\u00e1prilis"\ + "m\u00e1jus"\ + "j\u00fanius"\ + "j\u00falius"\ + "augusztus"\ + "szeptember"\ + "okt\u00f3ber"\ + "november"\ + "december"\ + ""] + ::msgcat::mcset hu BCE "i.e." + ::msgcat::mcset hu CE "i.u." + ::msgcat::mcset hu AM "DE" + ::msgcat::mcset hu PM "DU" + ::msgcat::mcset hu DATE_FORMAT "%Y.%m.%d." + ::msgcat::mcset hu TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset hu DATE_TIME_FORMAT "%Y.%m.%d. %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/id.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/id.msg new file mode 100644 index 00000000..17c6bb59 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/id.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset id DAYS_OF_WEEK_ABBREV [list \ + "Min"\ + "Sen"\ + "Sel"\ + "Rab"\ + "Kam"\ + "Jum"\ + "Sab"] + ::msgcat::mcset id DAYS_OF_WEEK_FULL [list \ + "Minggu"\ + "Senin"\ + "Selasa"\ + "Rabu"\ + "Kamis"\ + "Jumat"\ + "Sabtu"] + ::msgcat::mcset id MONTHS_ABBREV [list \ + "Jan"\ + "Peb"\ + "Mar"\ + "Apr"\ + "Mei"\ + "Jun"\ + "Jul"\ + "Agu"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Des"\ + ""] + ::msgcat::mcset id MONTHS_FULL [list \ + "Januari"\ + "Pebruari"\ + "Maret"\ + "April"\ + "Mei"\ + "Juni"\ + "Juli"\ + "Agustus"\ + "September"\ + "Oktober"\ + "November"\ + "Desember"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/id_id.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/id_id.msg new file mode 100644 index 00000000..bb672c11 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/id_id.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset id_ID DATE_FORMAT "%d %B %Y" + ::msgcat::mcset id_ID TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset id_ID DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/is.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/is.msg new file mode 100644 index 00000000..adc2d2a3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/is.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset is DAYS_OF_WEEK_ABBREV [list \ + "sun."\ + "m\u00e1n."\ + "\u00feri."\ + "mi\u00f0."\ + "fim."\ + "f\u00f6s."\ + "lau."] + ::msgcat::mcset is DAYS_OF_WEEK_FULL [list \ + "sunnudagur"\ + "m\u00e1nudagur"\ + "\u00feri\u00f0judagur"\ + "mi\u00f0vikudagur"\ + "fimmtudagur"\ + "f\u00f6studagur"\ + "laugardagur"] + ::msgcat::mcset is MONTHS_ABBREV [list \ + "jan."\ + "feb."\ + "mar."\ + "apr."\ + "ma\u00ed"\ + "j\u00fan."\ + "j\u00fal."\ + "\u00e1g\u00fa."\ + "sep."\ + "okt."\ + "n\u00f3v."\ + "des."\ + ""] + ::msgcat::mcset is MONTHS_FULL [list \ + "jan\u00faar"\ + "febr\u00faar"\ + "mars"\ + "apr\u00edl"\ + "ma\u00ed"\ + "j\u00fan\u00ed"\ + "j\u00fal\u00ed"\ + "\u00e1g\u00fast"\ + "september"\ + "okt\u00f3ber"\ + "n\u00f3vember"\ + "desember"\ + ""] + ::msgcat::mcset is DATE_FORMAT "%e.%m.%Y" + ::msgcat::mcset is TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset is DATE_TIME_FORMAT "%e.%m.%Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/it.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/it.msg new file mode 100644 index 00000000..b641cdec --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/it.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset it DAYS_OF_WEEK_ABBREV [list \ + "dom"\ + "lun"\ + "mar"\ + "mer"\ + "gio"\ + "ven"\ + "sab"] + ::msgcat::mcset it DAYS_OF_WEEK_FULL [list \ + "domenica"\ + "luned\u00ec"\ + "marted\u00ec"\ + "mercoled\u00ec"\ + "gioved\u00ec"\ + "venerd\u00ec"\ + "sabato"] + ::msgcat::mcset it MONTHS_ABBREV [list \ + "gen"\ + "feb"\ + "mar"\ + "apr"\ + "mag"\ + "giu"\ + "lug"\ + "ago"\ + "set"\ + "ott"\ + "nov"\ + "dic"\ + ""] + ::msgcat::mcset it MONTHS_FULL [list \ + "gennaio"\ + "febbraio"\ + "marzo"\ + "aprile"\ + "maggio"\ + "giugno"\ + "luglio"\ + "agosto"\ + "settembre"\ + "ottobre"\ + "novembre"\ + "dicembre"\ + ""] + ::msgcat::mcset it BCE "aC" + ::msgcat::mcset it CE "dC" + ::msgcat::mcset it AM "m." + ::msgcat::mcset it PM "p." + ::msgcat::mcset it DATE_FORMAT "%d %B %Y" + ::msgcat::mcset it TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset it DATE_TIME_FORMAT "%d %B %Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/it_ch.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/it_ch.msg new file mode 100644 index 00000000..b36ed368 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/it_ch.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset it_CH DATE_FORMAT "%e. %B %Y" + ::msgcat::mcset it_CH TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset it_CH DATE_TIME_FORMAT "%e. %B %Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ja.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ja.msg new file mode 100644 index 00000000..cf70c2f3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ja.msg @@ -0,0 +1,44 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ja DAYS_OF_WEEK_ABBREV [list \ + "\u65e5"\ + "\u6708"\ + "\u706b"\ + "\u6c34"\ + "\u6728"\ + "\u91d1"\ + "\u571f"] + ::msgcat::mcset ja DAYS_OF_WEEK_FULL [list \ + "\u65e5\u66dc\u65e5"\ + "\u6708\u66dc\u65e5"\ + "\u706b\u66dc\u65e5"\ + "\u6c34\u66dc\u65e5"\ + "\u6728\u66dc\u65e5"\ + "\u91d1\u66dc\u65e5"\ + "\u571f\u66dc\u65e5"] + ::msgcat::mcset ja MONTHS_FULL [list \ + "1\u6708"\ + "2\u6708"\ + "3\u6708"\ + "4\u6708"\ + "5\u6708"\ + "6\u6708"\ + "7\u6708"\ + "8\u6708"\ + "9\u6708"\ + "10\u6708"\ + "11\u6708"\ + "12\u6708"] + ::msgcat::mcset ja BCE "\u7d00\u5143\u524d" + ::msgcat::mcset ja CE "\u897f\u66a6" + ::msgcat::mcset ja AM "\u5348\u524d" + ::msgcat::mcset ja PM "\u5348\u5f8c" + ::msgcat::mcset ja DATE_FORMAT "%Y/%m/%d" + ::msgcat::mcset ja TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset ja TIME_FORMAT_12 "%P %I:%M:%S" + ::msgcat::mcset ja DATE_TIME_FORMAT "%Y/%m/%d %k:%M:%S %z" + ::msgcat::mcset ja LOCALE_DATE_FORMAT "%EY\u5e74%m\u6708%d\u65e5" + ::msgcat::mcset ja LOCALE_TIME_FORMAT "%H\u6642%M\u5206%S\u79d2" + ::msgcat::mcset ja LOCALE_DATE_TIME_FORMAT "%EY\u5e74%m\u6708%d\u65e5 (%a) %H\u6642%M\u5206%S\u79d2 %z" + ::msgcat::mcset ja LOCALE_ERAS "{-9223372036854775808 \u897f\u66a6 0} {-3061011600 \u660e\u6cbb 1867} {-1812186000 \u5927\u6b63 1911} {-1357635600 \u662d\u548c 1925} {600220800 \u5e73\u6210 1988} {1556668800 \u4ee4\u548c 2018}" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kl.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kl.msg new file mode 100644 index 00000000..d877bfe6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kl.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset kl DAYS_OF_WEEK_ABBREV [list \ + "sab"\ + "ata"\ + "mar"\ + "pin"\ + "sis"\ + "tal"\ + "arf"] + ::msgcat::mcset kl DAYS_OF_WEEK_FULL [list \ + "sabaat"\ + "ataasinngorneq"\ + "marlunngorneq"\ + "pingasunngorneq"\ + "sisamanngorneq"\ + "tallimanngorneq"\ + "arfininngorneq"] + ::msgcat::mcset kl MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "maj"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset kl MONTHS_FULL [list \ + "januari"\ + "februari"\ + "martsi"\ + "aprili"\ + "maji"\ + "juni"\ + "juli"\ + "augustusi"\ + "septemberi"\ + "oktoberi"\ + "novemberi"\ + "decemberi"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kl_gl.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kl_gl.msg new file mode 100644 index 00000000..403aa10f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kl_gl.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset kl_GL DATE_FORMAT "%d %b %Y" + ::msgcat::mcset kl_GL TIME_FORMAT "%T" + ::msgcat::mcset kl_GL TIME_FORMAT_12 "%T" + ::msgcat::mcset kl_GL DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ko.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ko.msg new file mode 100644 index 00000000..0cd17a19 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ko.msg @@ -0,0 +1,55 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ko DAYS_OF_WEEK_ABBREV [list \ + "\uc77c"\ + "\uc6d4"\ + "\ud654"\ + "\uc218"\ + "\ubaa9"\ + "\uae08"\ + "\ud1a0"] + ::msgcat::mcset ko DAYS_OF_WEEK_FULL [list \ + "\uc77c\uc694\uc77c"\ + "\uc6d4\uc694\uc77c"\ + "\ud654\uc694\uc77c"\ + "\uc218\uc694\uc77c"\ + "\ubaa9\uc694\uc77c"\ + "\uae08\uc694\uc77c"\ + "\ud1a0\uc694\uc77c"] + ::msgcat::mcset ko MONTHS_ABBREV [list \ + "1\uc6d4"\ + "2\uc6d4"\ + "3\uc6d4"\ + "4\uc6d4"\ + "5\uc6d4"\ + "6\uc6d4"\ + "7\uc6d4"\ + "8\uc6d4"\ + "9\uc6d4"\ + "10\uc6d4"\ + "11\uc6d4"\ + "12\uc6d4"\ + ""] + ::msgcat::mcset ko MONTHS_FULL [list \ + "1\uc6d4"\ + "2\uc6d4"\ + "3\uc6d4"\ + "4\uc6d4"\ + "5\uc6d4"\ + "6\uc6d4"\ + "7\uc6d4"\ + "8\uc6d4"\ + "9\uc6d4"\ + "10\uc6d4"\ + "11\uc6d4"\ + "12\uc6d4"\ + ""] + ::msgcat::mcset ko AM "\uc624\uc804" + ::msgcat::mcset ko PM "\uc624\ud6c4" + ::msgcat::mcset ko DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset ko TIME_FORMAT_12 "%P %l:%M:%S" + ::msgcat::mcset ko DATE_TIME_FORMAT "%Y-%m-%d %P %l:%M:%S %z" + ::msgcat::mcset ko LOCALE_DATE_FORMAT "%Y\ub144%B%Od\uc77c" + ::msgcat::mcset ko LOCALE_TIME_FORMAT "%H\uc2dc%M\ubd84%S\ucd08" + ::msgcat::mcset ko LOCALE_DATE_TIME_FORMAT "%A %Y\ub144%B%Od\uc77c%H\uc2dc%M\ubd84%S\ucd08 %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ko_kr.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ko_kr.msg new file mode 100644 index 00000000..ea5bbd72 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ko_kr.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ko_KR BCE "\uae30\uc6d0\uc804" + ::msgcat::mcset ko_KR CE "\uc11c\uae30" + ::msgcat::mcset ko_KR DATE_FORMAT "%Y.%m.%d" + ::msgcat::mcset ko_KR TIME_FORMAT_12 "%P %l:%M:%S" + ::msgcat::mcset ko_KR DATE_TIME_FORMAT "%Y.%m.%d %P %l:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kok.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kok.msg new file mode 100644 index 00000000..0869f207 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kok.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset kok DAYS_OF_WEEK_FULL [list \ + "\u0906\u0926\u093f\u0924\u094d\u092f\u0935\u093e\u0930"\ + "\u0938\u094b\u092e\u0935\u093e\u0930"\ + "\u092e\u0902\u0917\u0933\u093e\u0930"\ + "\u092c\u0941\u0927\u0935\u093e\u0930"\ + "\u0917\u0941\u0930\u0941\u0935\u093e\u0930"\ + "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930"\ + "\u0936\u0928\u093f\u0935\u093e\u0930"] + ::msgcat::mcset kok MONTHS_ABBREV [list \ + "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ + "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940"\ + "\u092e\u093e\u0930\u094d\u091a"\ + "\u090f\u092a\u094d\u0930\u093f\u0932"\ + "\u092e\u0947"\ + "\u091c\u0942\u0928"\ + "\u091c\u0941\u0932\u0948"\ + "\u0913\u0917\u0938\u094d\u091f"\ + "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ + "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ + "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ + "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] + ::msgcat::mcset kok MONTHS_FULL [list \ + "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ + "\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940"\ + "\u092e\u093e\u0930\u094d\u091a"\ + "\u090f\u092a\u094d\u0930\u093f\u0932"\ + "\u092e\u0947"\ + "\u091c\u0942\u0928"\ + "\u091c\u0941\u0932\u0948"\ + "\u0913\u0917\u0938\u094d\u091f"\ + "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ + "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ + "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ + "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] + ::msgcat::mcset kok AM "\u0915\u094d\u0930\u093f\u0938\u094d\u0924\u092a\u0942\u0930\u094d\u0935" + ::msgcat::mcset kok PM "\u0915\u094d\u0930\u093f\u0938\u094d\u0924\u0936\u0916\u093e" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kok_in.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kok_in.msg new file mode 100644 index 00000000..abcb1ff8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kok_in.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset kok_IN DATE_FORMAT "%d %M %Y" + ::msgcat::mcset kok_IN TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset kok_IN DATE_TIME_FORMAT "%d %M %Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kw.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kw.msg new file mode 100644 index 00000000..aaf79b32 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kw.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset kw DAYS_OF_WEEK_ABBREV [list \ + "Sul"\ + "Lun"\ + "Mth"\ + "Mhr"\ + "Yow"\ + "Gwe"\ + "Sad"] + ::msgcat::mcset kw DAYS_OF_WEEK_FULL [list \ + "De Sul"\ + "De Lun"\ + "De Merth"\ + "De Merher"\ + "De Yow"\ + "De Gwener"\ + "De Sadorn"] + ::msgcat::mcset kw MONTHS_ABBREV [list \ + "Gen"\ + "Whe"\ + "Mer"\ + "Ebr"\ + "Me"\ + "Evn"\ + "Gor"\ + "Est"\ + "Gwn"\ + "Hed"\ + "Du"\ + "Kev"\ + ""] + ::msgcat::mcset kw MONTHS_FULL [list \ + "Mys Genver"\ + "Mys Whevrel"\ + "Mys Merth"\ + "Mys Ebrel"\ + "Mys Me"\ + "Mys Evan"\ + "Mys Gortheren"\ + "Mye Est"\ + "Mys Gwyngala"\ + "Mys Hedra"\ + "Mys Du"\ + "Mys Kevardhu"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kw_gb.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kw_gb.msg new file mode 100644 index 00000000..29676804 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/kw_gb.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset kw_GB DATE_FORMAT "%d %B %Y" + ::msgcat::mcset kw_GB TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset kw_GB DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/lt.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/lt.msg new file mode 100644 index 00000000..27b09850 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/lt.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset lt DAYS_OF_WEEK_ABBREV [list \ + "Sk"\ + "Pr"\ + "An"\ + "Tr"\ + "Kt"\ + "Pn"\ + "\u0160t"] + ::msgcat::mcset lt DAYS_OF_WEEK_FULL [list \ + "Sekmadienis"\ + "Pirmadienis"\ + "Antradienis"\ + "Tre\u010diadienis"\ + "Ketvirtadienis"\ + "Penktadienis"\ + "\u0160e\u0161tadienis"] + ::msgcat::mcset lt MONTHS_ABBREV [list \ + "Sau"\ + "Vas"\ + "Kov"\ + "Bal"\ + "Geg"\ + "Bir"\ + "Lie"\ + "Rgp"\ + "Rgs"\ + "Spa"\ + "Lap"\ + "Grd"\ + ""] + ::msgcat::mcset lt MONTHS_FULL [list \ + "Sausio"\ + "Vasario"\ + "Kovo"\ + "Baland\u017eio"\ + "Gegu\u017e\u0117s"\ + "Bir\u017eelio"\ + "Liepos"\ + "Rugpj\u016b\u010dio"\ + "Rugs\u0117jo"\ + "Spalio"\ + "Lapkri\u010dio"\ + "Gruod\u017eio"\ + ""] + ::msgcat::mcset lt BCE "pr.Kr." + ::msgcat::mcset lt CE "po.Kr." + ::msgcat::mcset lt DATE_FORMAT "%Y.%m.%e" + ::msgcat::mcset lt TIME_FORMAT "%H.%M.%S" + ::msgcat::mcset lt DATE_TIME_FORMAT "%Y.%m.%e %H.%M.%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/lv.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/lv.msg new file mode 100644 index 00000000..a037b151 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/lv.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset lv DAYS_OF_WEEK_ABBREV [list \ + "Sv"\ + "P"\ + "O"\ + "T"\ + "C"\ + "Pk"\ + "S"] + ::msgcat::mcset lv DAYS_OF_WEEK_FULL [list \ + "sv\u0113tdiena"\ + "pirmdiena"\ + "otrdiena"\ + "tre\u0161diena"\ + "ceturdien"\ + "piektdiena"\ + "sestdiena"] + ::msgcat::mcset lv MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "Mar"\ + "Apr"\ + "Maijs"\ + "J\u016bn"\ + "J\u016bl"\ + "Aug"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Dec"\ + ""] + ::msgcat::mcset lv MONTHS_FULL [list \ + "janv\u0101ris"\ + "febru\u0101ris"\ + "marts"\ + "apr\u012blis"\ + "maijs"\ + "j\u016bnijs"\ + "j\u016blijs"\ + "augusts"\ + "septembris"\ + "oktobris"\ + "novembris"\ + "decembris"\ + ""] + ::msgcat::mcset lv BCE "pm\u0113" + ::msgcat::mcset lv CE "m\u0113" + ::msgcat::mcset lv DATE_FORMAT "%Y.%e.%m" + ::msgcat::mcset lv TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset lv DATE_TIME_FORMAT "%Y.%e.%m %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/mk.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/mk.msg new file mode 100644 index 00000000..41cf60db --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/mk.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset mk DAYS_OF_WEEK_ABBREV [list \ + "\u043d\u0435\u0434."\ + "\u043f\u043e\u043d."\ + "\u0432\u0442."\ + "\u0441\u0440\u0435."\ + "\u0447\u0435\u0442."\ + "\u043f\u0435\u0442."\ + "\u0441\u0430\u0431."] + ::msgcat::mcset mk DAYS_OF_WEEK_FULL [list \ + "\u043d\u0435\u0434\u0435\u043b\u0430"\ + "\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a"\ + "\u0432\u0442\u043e\u0440\u043d\u0438\u043a"\ + "\u0441\u0440\u0435\u0434\u0430"\ + "\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a"\ + "\u043f\u0435\u0442\u043e\u043a"\ + "\u0441\u0430\u0431\u043e\u0442\u0430"] + ::msgcat::mcset mk MONTHS_ABBREV [list \ + "\u0458\u0430\u043d."\ + "\u0444\u0435\u0432."\ + "\u043c\u0430\u0440."\ + "\u0430\u043f\u0440."\ + "\u043c\u0430\u0458."\ + "\u0458\u0443\u043d."\ + "\u0458\u0443\u043b."\ + "\u0430\u0432\u0433."\ + "\u0441\u0435\u043f\u0442."\ + "\u043e\u043a\u0442."\ + "\u043d\u043e\u0435\u043c."\ + "\u0434\u0435\u043a\u0435\u043c."\ + ""] + ::msgcat::mcset mk MONTHS_FULL [list \ + "\u0458\u0430\u043d\u0443\u0430\u0440\u0438"\ + "\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438"\ + "\u043c\u0430\u0440\u0442"\ + "\u0430\u043f\u0440\u0438\u043b"\ + "\u043c\u0430\u0458"\ + "\u0458\u0443\u043d\u0438"\ + "\u0458\u0443\u043b\u0438"\ + "\u0430\u0432\u0433\u0443\u0441\u0442"\ + "\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438"\ + "\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438"\ + "\u043d\u043e\u0435\u043c\u0432\u0440\u0438"\ + "\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438"\ + ""] + ::msgcat::mcset mk BCE "\u043f\u0440.\u043d.\u0435." + ::msgcat::mcset mk CE "\u0430\u0435." + ::msgcat::mcset mk DATE_FORMAT "%e.%m.%Y" + ::msgcat::mcset mk TIME_FORMAT "%H:%M:%S %z" + ::msgcat::mcset mk DATE_TIME_FORMAT "%e.%m.%Y %H:%M:%S %z %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/mr.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/mr.msg new file mode 100644 index 00000000..cea427a9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/mr.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset mr DAYS_OF_WEEK_FULL [list \ + "\u0930\u0935\u093f\u0935\u093e\u0930"\ + "\u0938\u094b\u092e\u0935\u093e\u0930"\ + "\u092e\u0902\u0917\u0933\u0935\u093e\u0930"\ + "\u092e\u0902\u0917\u0933\u0935\u093e\u0930"\ + "\u0917\u0941\u0930\u0941\u0935\u093e\u0930"\ + "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930"\ + "\u0936\u0928\u093f\u0935\u093e\u0930"] + ::msgcat::mcset mr MONTHS_ABBREV [list \ + "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ + "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940"\ + "\u092e\u093e\u0930\u094d\u091a"\ + "\u090f\u092a\u094d\u0930\u093f\u0932"\ + "\u092e\u0947"\ + "\u091c\u0942\u0928"\ + "\u091c\u0941\u0932\u0948"\ + "\u0913\u0917\u0938\u094d\u091f"\ + "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ + "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ + "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ + "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] + ::msgcat::mcset mr MONTHS_FULL [list \ + "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ + "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940"\ + "\u092e\u093e\u0930\u094d\u091a"\ + "\u090f\u092a\u094d\u0930\u093f\u0932"\ + "\u092e\u0947"\ + "\u091c\u0942\u0928"\ + "\u091c\u0941\u0932\u0948"\ + "\u0913\u0917\u0938\u094d\u091f"\ + "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ + "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ + "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ + "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] + ::msgcat::mcset mr AM "BC" + ::msgcat::mcset mr PM "AD" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/mr_in.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/mr_in.msg new file mode 100644 index 00000000..1889da5c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/mr_in.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset mr_IN DATE_FORMAT "%d %M %Y" + ::msgcat::mcset mr_IN TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset mr_IN DATE_TIME_FORMAT "%d %M %Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ms.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ms.msg new file mode 100644 index 00000000..e954431b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ms.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ms DAYS_OF_WEEK_ABBREV [list \ + "Aha"\ + "Isn"\ + "Sei"\ + "Rab"\ + "Kha"\ + "Jum"\ + "Sab"] + ::msgcat::mcset ms DAYS_OF_WEEK_FULL [list \ + "Ahad"\ + "Isnin"\ + "Selasa"\ + "Rahu"\ + "Khamis"\ + "Jumaat"\ + "Sabtu"] + ::msgcat::mcset ms MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "Mac"\ + "Apr"\ + "Mei"\ + "Jun"\ + "Jul"\ + "Ogos"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Dis"\ + ""] + ::msgcat::mcset ms MONTHS_FULL [list \ + "Januari"\ + "Februari"\ + "Mac"\ + "April"\ + "Mei"\ + "Jun"\ + "Julai"\ + "Ogos"\ + "September"\ + "Oktober"\ + "November"\ + "Disember"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ms_my.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ms_my.msg new file mode 100644 index 00000000..c1f93d42 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ms_my.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ms_MY DATE_FORMAT "%A %d %b %Y" + ::msgcat::mcset ms_MY TIME_FORMAT_12 "%I:%M:%S %z" + ::msgcat::mcset ms_MY DATE_TIME_FORMAT "%A %d %b %Y %I:%M:%S %z %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/mt.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/mt.msg new file mode 100644 index 00000000..ddd54464 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/mt.msg @@ -0,0 +1,27 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset mt DAYS_OF_WEEK_ABBREV [list \ + "\u0126ad"\ + "Tne"\ + "Tli"\ + "Erb"\ + "\u0126am"\ + "\u0120im"] + ::msgcat::mcset mt MONTHS_ABBREV [list \ + "Jan"\ + "Fra"\ + "Mar"\ + "Apr"\ + "Mej"\ + "\u0120un"\ + "Lul"\ + "Awi"\ + "Set"\ + "Ott"\ + "Nov"] + ::msgcat::mcset mt BCE "QK" + ::msgcat::mcset mt CE "" + ::msgcat::mcset mt DATE_FORMAT "%A, %e ta %B, %Y" + ::msgcat::mcset mt TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset mt DATE_TIME_FORMAT "%A, %e ta %B, %Y %l:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/nb.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/nb.msg new file mode 100644 index 00000000..90d49a33 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/nb.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset nb DAYS_OF_WEEK_ABBREV [list \ + "s\u00f8"\ + "ma"\ + "ti"\ + "on"\ + "to"\ + "fr"\ + "l\u00f8"] + ::msgcat::mcset nb DAYS_OF_WEEK_FULL [list \ + "s\u00f8ndag"\ + "mandag"\ + "tirsdag"\ + "onsdag"\ + "torsdag"\ + "fredag"\ + "l\u00f8rdag"] + ::msgcat::mcset nb MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "mai"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "des"\ + ""] + ::msgcat::mcset nb MONTHS_FULL [list \ + "januar"\ + "februar"\ + "mars"\ + "april"\ + "mai"\ + "juni"\ + "juli"\ + "august"\ + "september"\ + "oktober"\ + "november"\ + "desember"\ + ""] + ::msgcat::mcset nb BCE "f.Kr." + ::msgcat::mcset nb CE "e.Kr." + ::msgcat::mcset nb DATE_FORMAT "%e. %B %Y" + ::msgcat::mcset nb TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset nb DATE_TIME_FORMAT "%e. %B %Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/nl.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/nl.msg new file mode 100644 index 00000000..4c5c6755 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/nl.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset nl DAYS_OF_WEEK_ABBREV [list \ + "zo"\ + "ma"\ + "di"\ + "wo"\ + "do"\ + "vr"\ + "za"] + ::msgcat::mcset nl DAYS_OF_WEEK_FULL [list \ + "zondag"\ + "maandag"\ + "dinsdag"\ + "woensdag"\ + "donderdag"\ + "vrijdag"\ + "zaterdag"] + ::msgcat::mcset nl MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mrt"\ + "apr"\ + "mei"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset nl MONTHS_FULL [list \ + "januari"\ + "februari"\ + "maart"\ + "april"\ + "mei"\ + "juni"\ + "juli"\ + "augustus"\ + "september"\ + "oktober"\ + "november"\ + "december"\ + ""] + ::msgcat::mcset nl DATE_FORMAT "%e %B %Y" + ::msgcat::mcset nl TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset nl DATE_TIME_FORMAT "%e %B %Y %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/nl_be.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/nl_be.msg new file mode 100644 index 00000000..4b19670f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/nl_be.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset nl_BE DATE_FORMAT "%d-%m-%y" + ::msgcat::mcset nl_BE TIME_FORMAT "%T" + ::msgcat::mcset nl_BE TIME_FORMAT_12 "%T" + ::msgcat::mcset nl_BE DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/nn.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/nn.msg new file mode 100644 index 00000000..bd61ac94 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/nn.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset nn DAYS_OF_WEEK_ABBREV [list \ + "su"\ + "m\u00e5"\ + "ty"\ + "on"\ + "to"\ + "fr"\ + "lau"] + ::msgcat::mcset nn DAYS_OF_WEEK_FULL [list \ + "sundag"\ + "m\u00e5ndag"\ + "tysdag"\ + "onsdag"\ + "torsdag"\ + "fredag"\ + "laurdag"] + ::msgcat::mcset nn MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "mai"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "des"\ + ""] + ::msgcat::mcset nn MONTHS_FULL [list \ + "januar"\ + "februar"\ + "mars"\ + "april"\ + "mai"\ + "juni"\ + "juli"\ + "august"\ + "september"\ + "oktober"\ + "november"\ + "desember"\ + ""] + ::msgcat::mcset nn BCE "f.Kr." + ::msgcat::mcset nn CE "e.Kr." + ::msgcat::mcset nn DATE_FORMAT "%e. %B %Y" + ::msgcat::mcset nn TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset nn DATE_TIME_FORMAT "%e. %B %Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/pl.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/pl.msg new file mode 100644 index 00000000..d206f4b7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/pl.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset pl DAYS_OF_WEEK_ABBREV [list \ + "N"\ + "Pn"\ + "Wt"\ + "\u015ar"\ + "Cz"\ + "Pt"\ + "So"] + ::msgcat::mcset pl DAYS_OF_WEEK_FULL [list \ + "niedziela"\ + "poniedzia\u0142ek"\ + "wtorek"\ + "\u015broda"\ + "czwartek"\ + "pi\u0105tek"\ + "sobota"] + ::msgcat::mcset pl MONTHS_ABBREV [list \ + "sty"\ + "lut"\ + "mar"\ + "kwi"\ + "maj"\ + "cze"\ + "lip"\ + "sie"\ + "wrz"\ + "pa\u017a"\ + "lis"\ + "gru"\ + ""] + ::msgcat::mcset pl MONTHS_FULL [list \ + "stycze\u0144"\ + "luty"\ + "marzec"\ + "kwiecie\u0144"\ + "maj"\ + "czerwiec"\ + "lipiec"\ + "sierpie\u0144"\ + "wrzesie\u0144"\ + "pa\u017adziernik"\ + "listopad"\ + "grudzie\u0144"\ + ""] + ::msgcat::mcset pl BCE "p.n.e." + ::msgcat::mcset pl CE "n.e." + ::msgcat::mcset pl DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset pl TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset pl DATE_TIME_FORMAT "%Y-%m-%d %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/pt.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/pt.msg new file mode 100644 index 00000000..96fdb35a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/pt.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset pt DAYS_OF_WEEK_ABBREV [list \ + "Dom"\ + "Seg"\ + "Ter"\ + "Qua"\ + "Qui"\ + "Sex"\ + "S\u00e1b"] + ::msgcat::mcset pt DAYS_OF_WEEK_FULL [list \ + "Domingo"\ + "Segunda-feira"\ + "Ter\u00e7a-feira"\ + "Quarta-feira"\ + "Quinta-feira"\ + "Sexta-feira"\ + "S\u00e1bado"] + ::msgcat::mcset pt MONTHS_ABBREV [list \ + "Jan"\ + "Fev"\ + "Mar"\ + "Abr"\ + "Mai"\ + "Jun"\ + "Jul"\ + "Ago"\ + "Set"\ + "Out"\ + "Nov"\ + "Dez"\ + ""] + ::msgcat::mcset pt MONTHS_FULL [list \ + "Janeiro"\ + "Fevereiro"\ + "Mar\u00e7o"\ + "Abril"\ + "Maio"\ + "Junho"\ + "Julho"\ + "Agosto"\ + "Setembro"\ + "Outubro"\ + "Novembro"\ + "Dezembro"\ + ""] + ::msgcat::mcset pt DATE_FORMAT "%d-%m-%Y" + ::msgcat::mcset pt TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset pt DATE_TIME_FORMAT "%d-%m-%Y %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/pt_br.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/pt_br.msg new file mode 100644 index 00000000..86843279 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/pt_br.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset pt_BR DATE_FORMAT "%d-%m-%Y" + ::msgcat::mcset pt_BR TIME_FORMAT "%T" + ::msgcat::mcset pt_BR TIME_FORMAT_12 "%T" + ::msgcat::mcset pt_BR DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ro.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ro.msg new file mode 100644 index 00000000..bdd7c619 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ro.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ro DAYS_OF_WEEK_ABBREV [list \ + "D"\ + "L"\ + "Ma"\ + "Mi"\ + "J"\ + "V"\ + "S"] + ::msgcat::mcset ro DAYS_OF_WEEK_FULL [list \ + "duminic\u0103"\ + "luni"\ + "mar\u0163i"\ + "miercuri"\ + "joi"\ + "vineri"\ + "s\u00eemb\u0103t\u0103"] + ::msgcat::mcset ro MONTHS_ABBREV [list \ + "Ian"\ + "Feb"\ + "Mar"\ + "Apr"\ + "Mai"\ + "Iun"\ + "Iul"\ + "Aug"\ + "Sep"\ + "Oct"\ + "Nov"\ + "Dec"\ + ""] + ::msgcat::mcset ro MONTHS_FULL [list \ + "ianuarie"\ + "februarie"\ + "martie"\ + "aprilie"\ + "mai"\ + "iunie"\ + "iulie"\ + "august"\ + "septembrie"\ + "octombrie"\ + "noiembrie"\ + "decembrie"\ + ""] + ::msgcat::mcset ro BCE "d.C." + ::msgcat::mcset ro CE "\u00ee.d.C." + ::msgcat::mcset ro DATE_FORMAT "%d.%m.%Y" + ::msgcat::mcset ro TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset ro DATE_TIME_FORMAT "%d.%m.%Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ru.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ru.msg new file mode 100644 index 00000000..65b075d6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ru.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ru DAYS_OF_WEEK_ABBREV [list \ + "\u0412\u0441"\ + "\u041f\u043d"\ + "\u0412\u0442"\ + "\u0421\u0440"\ + "\u0427\u0442"\ + "\u041f\u0442"\ + "\u0421\u0431"] + ::msgcat::mcset ru DAYS_OF_WEEK_FULL [list \ + "\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435"\ + "\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a"\ + "\u0432\u0442\u043e\u0440\u043d\u0438\u043a"\ + "\u0441\u0440\u0435\u0434\u0430"\ + "\u0447\u0435\u0442\u0432\u0435\u0440\u0433"\ + "\u043f\u044f\u0442\u043d\u0438\u0446\u0430"\ + "\u0441\u0443\u0431\u0431\u043e\u0442\u0430"] + ::msgcat::mcset ru MONTHS_ABBREV [list \ + "\u044f\u043d\u0432"\ + "\u0444\u0435\u0432"\ + "\u043c\u0430\u0440"\ + "\u0430\u043f\u0440"\ + "\u043c\u0430\u0439"\ + "\u0438\u044e\u043d"\ + "\u0438\u044e\u043b"\ + "\u0430\u0432\u0433"\ + "\u0441\u0435\u043d"\ + "\u043e\u043a\u0442"\ + "\u043d\u043e\u044f"\ + "\u0434\u0435\u043a"\ + ""] + ::msgcat::mcset ru MONTHS_FULL [list \ + "\u042f\u043d\u0432\u0430\u0440\u044c"\ + "\u0424\u0435\u0432\u0440\u0430\u043b\u044c"\ + "\u041c\u0430\u0440\u0442"\ + "\u0410\u043f\u0440\u0435\u043b\u044c"\ + "\u041c\u0430\u0439"\ + "\u0418\u044e\u043d\u044c"\ + "\u0418\u044e\u043b\u044c"\ + "\u0410\u0432\u0433\u0443\u0441\u0442"\ + "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c"\ + "\u041e\u043a\u0442\u044f\u0431\u0440\u044c"\ + "\u041d\u043e\u044f\u0431\u0440\u044c"\ + "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"\ + ""] + ::msgcat::mcset ru BCE "\u0434\u043e \u043d.\u044d." + ::msgcat::mcset ru CE "\u043d.\u044d." + ::msgcat::mcset ru DATE_FORMAT "%d.%m.%Y" + ::msgcat::mcset ru TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset ru DATE_TIME_FORMAT "%d.%m.%Y %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ru_ua.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ru_ua.msg new file mode 100644 index 00000000..6e1f8a86 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ru_ua.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ru_UA DATE_FORMAT "%d.%m.%Y" + ::msgcat::mcset ru_UA TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset ru_UA DATE_TIME_FORMAT "%d.%m.%Y %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sh.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sh.msg new file mode 100644 index 00000000..6ee0fc7f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sh.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sh DAYS_OF_WEEK_ABBREV [list \ + "Ned"\ + "Pon"\ + "Uto"\ + "Sre"\ + "\u010cet"\ + "Pet"\ + "Sub"] + ::msgcat::mcset sh DAYS_OF_WEEK_FULL [list \ + "Nedelja"\ + "Ponedeljak"\ + "Utorak"\ + "Sreda"\ + "\u010cetvrtak"\ + "Petak"\ + "Subota"] + ::msgcat::mcset sh MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "Mar"\ + "Apr"\ + "Maj"\ + "Jun"\ + "Jul"\ + "Avg"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Dec"\ + ""] + ::msgcat::mcset sh MONTHS_FULL [list \ + "Januar"\ + "Februar"\ + "Mart"\ + "April"\ + "Maj"\ + "Juni"\ + "Juli"\ + "Avgust"\ + "Septembar"\ + "Oktobar"\ + "Novembar"\ + "Decembar"\ + ""] + ::msgcat::mcset sh BCE "p. n. e." + ::msgcat::mcset sh CE "n. e." + ::msgcat::mcset sh DATE_FORMAT "%d.%m.%Y." + ::msgcat::mcset sh TIME_FORMAT "%k.%M.%S" + ::msgcat::mcset sh DATE_TIME_FORMAT "%d.%m.%Y. %k.%M.%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sk.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sk.msg new file mode 100644 index 00000000..9b2f0aad --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sk.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sk DAYS_OF_WEEK_ABBREV [list \ + "Ne"\ + "Po"\ + "Ut"\ + "St"\ + "\u0160t"\ + "Pa"\ + "So"] + ::msgcat::mcset sk DAYS_OF_WEEK_FULL [list \ + "Nede\u013ee"\ + "Pondelok"\ + "Utorok"\ + "Streda"\ + "\u0160tvrtok"\ + "Piatok"\ + "Sobota"] + ::msgcat::mcset sk MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "m\u00e1j"\ + "j\u00fan"\ + "j\u00fal"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset sk MONTHS_FULL [list \ + "janu\u00e1r"\ + "febru\u00e1r"\ + "marec"\ + "apr\u00edl"\ + "m\u00e1j"\ + "j\u00fan"\ + "j\u00fal"\ + "august"\ + "september"\ + "okt\u00f3ber"\ + "november"\ + "december"\ + ""] + ::msgcat::mcset sk BCE "pred n.l." + ::msgcat::mcset sk CE "n.l." + ::msgcat::mcset sk DATE_FORMAT "%e.%m.%Y" + ::msgcat::mcset sk TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset sk DATE_TIME_FORMAT "%e.%m.%Y %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sl.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sl.msg new file mode 100644 index 00000000..42bc5097 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sl.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sl DAYS_OF_WEEK_ABBREV [list \ + "Ned"\ + "Pon"\ + "Tor"\ + "Sre"\ + "\u010cet"\ + "Pet"\ + "Sob"] + ::msgcat::mcset sl DAYS_OF_WEEK_FULL [list \ + "Nedelja"\ + "Ponedeljek"\ + "Torek"\ + "Sreda"\ + "\u010cetrtek"\ + "Petek"\ + "Sobota"] + ::msgcat::mcset sl MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "maj"\ + "jun"\ + "jul"\ + "avg"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset sl MONTHS_FULL [list \ + "januar"\ + "februar"\ + "marec"\ + "april"\ + "maj"\ + "junij"\ + "julij"\ + "avgust"\ + "september"\ + "oktober"\ + "november"\ + "december"\ + ""] + ::msgcat::mcset sl BCE "pr.n.\u0161." + ::msgcat::mcset sl CE "po Kr." + ::msgcat::mcset sl DATE_FORMAT "%Y.%m.%e" + ::msgcat::mcset sl TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset sl DATE_TIME_FORMAT "%Y.%m.%e %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sq.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sq.msg new file mode 100644 index 00000000..8fb1fce9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sq.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sq DAYS_OF_WEEK_ABBREV [list \ + "Die"\ + "H\u00ebn"\ + "Mar"\ + "M\u00ebr"\ + "Enj"\ + "Pre"\ + "Sht"] + ::msgcat::mcset sq DAYS_OF_WEEK_FULL [list \ + "e diel"\ + "e h\u00ebn\u00eb"\ + "e mart\u00eb"\ + "e m\u00ebrkur\u00eb"\ + "e enjte"\ + "e premte"\ + "e shtun\u00eb"] + ::msgcat::mcset sq MONTHS_ABBREV [list \ + "Jan"\ + "Shk"\ + "Mar"\ + "Pri"\ + "Maj"\ + "Qer"\ + "Kor"\ + "Gsh"\ + "Sht"\ + "Tet"\ + "N\u00ebn"\ + "Dhj"\ + ""] + ::msgcat::mcset sq MONTHS_FULL [list \ + "janar"\ + "shkurt"\ + "mars"\ + "prill"\ + "maj"\ + "qershor"\ + "korrik"\ + "gusht"\ + "shtator"\ + "tetor"\ + "n\u00ebntor"\ + "dhjetor"\ + ""] + ::msgcat::mcset sq BCE "p.e.r." + ::msgcat::mcset sq CE "n.e.r." + ::msgcat::mcset sq AM "PD" + ::msgcat::mcset sq PM "MD" + ::msgcat::mcset sq DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset sq TIME_FORMAT_12 "%l:%M:%S.%P" + ::msgcat::mcset sq DATE_TIME_FORMAT "%Y-%m-%d %l:%M:%S.%P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sr.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sr.msg new file mode 100644 index 00000000..75766687 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sr.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sr DAYS_OF_WEEK_ABBREV [list \ + "\u041d\u0435\u0434"\ + "\u041f\u043e\u043d"\ + "\u0423\u0442\u043e"\ + "\u0421\u0440\u0435"\ + "\u0427\u0435\u0442"\ + "\u041f\u0435\u0442"\ + "\u0421\u0443\u0431"] + ::msgcat::mcset sr DAYS_OF_WEEK_FULL [list \ + "\u041d\u0435\u0434\u0435\u0459\u0430"\ + "\u041f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a"\ + "\u0423\u0442\u043e\u0440\u0430\u043a"\ + "\u0421\u0440\u0435\u0434\u0430"\ + "\u0427\u0435\u0442\u0432\u0440\u0442\u0430\u043a"\ + "\u041f\u0435\u0442\u0430\u043a"\ + "\u0421\u0443\u0431\u043e\u0442\u0430"] + ::msgcat::mcset sr MONTHS_ABBREV [list \ + "\u0408\u0430\u043d"\ + "\u0424\u0435\u0431"\ + "\u041c\u0430\u0440"\ + "\u0410\u043f\u0440"\ + "\u041c\u0430\u0458"\ + "\u0408\u0443\u043d"\ + "\u0408\u0443\u043b"\ + "\u0410\u0432\u0433"\ + "\u0421\u0435\u043f"\ + "\u041e\u043a\u0442"\ + "\u041d\u043e\u0432"\ + "\u0414\u0435\u0446"\ + ""] + ::msgcat::mcset sr MONTHS_FULL [list \ + "\u0408\u0430\u043d\u0443\u0430\u0440"\ + "\u0424\u0435\u0431\u0440\u0443\u0430\u0440"\ + "\u041c\u0430\u0440\u0442"\ + "\u0410\u043f\u0440\u0438\u043b"\ + "\u041c\u0430\u0458"\ + "\u0408\u0443\u043d\u0438"\ + "\u0408\u0443\u043b\u0438"\ + "\u0410\u0432\u0433\u0443\u0441\u0442"\ + "\u0421\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440"\ + "\u041e\u043a\u0442\u043e\u0431\u0430\u0440"\ + "\u041d\u043e\u0432\u0435\u043c\u0431\u0430\u0440"\ + "\u0414\u0435\u0446\u0435\u043c\u0431\u0430\u0440"\ + ""] + ::msgcat::mcset sr BCE "\u043f. \u043d. \u0435." + ::msgcat::mcset sr CE "\u043d. \u0435" + ::msgcat::mcset sr DATE_FORMAT "%Y.%m.%e" + ::msgcat::mcset sr TIME_FORMAT "%k.%M.%S" + ::msgcat::mcset sr DATE_TIME_FORMAT "%Y.%m.%e %k.%M.%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sv.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sv.msg new file mode 100644 index 00000000..f7a67c6e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sv.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sv DAYS_OF_WEEK_ABBREV [list \ + "s\u00f6"\ + "m\u00e5"\ + "ti"\ + "on"\ + "to"\ + "fr"\ + "l\u00f6"] + ::msgcat::mcset sv DAYS_OF_WEEK_FULL [list \ + "s\u00f6ndag"\ + "m\u00e5ndag"\ + "tisdag"\ + "onsdag"\ + "torsdag"\ + "fredag"\ + "l\u00f6rdag"] + ::msgcat::mcset sv MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "maj"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset sv MONTHS_FULL [list \ + "januari"\ + "februari"\ + "mars"\ + "april"\ + "maj"\ + "juni"\ + "juli"\ + "augusti"\ + "september"\ + "oktober"\ + "november"\ + "december"\ + ""] + ::msgcat::mcset sv BCE "f.Kr." + ::msgcat::mcset sv CE "e.Kr." + ::msgcat::mcset sv DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset sv TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset sv DATE_TIME_FORMAT "%Y-%m-%d %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sw.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sw.msg new file mode 100644 index 00000000..b888b43d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/sw.msg @@ -0,0 +1,49 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sw DAYS_OF_WEEK_ABBREV [list \ + "Jpi"\ + "Jtt"\ + "Jnn"\ + "Jtn"\ + "Alh"\ + "Iju"\ + "Jmo"] + ::msgcat::mcset sw DAYS_OF_WEEK_FULL [list \ + "Jumapili"\ + "Jumatatu"\ + "Jumanne"\ + "Jumatano"\ + "Alhamisi"\ + "Ijumaa"\ + "Jumamosi"] + ::msgcat::mcset sw MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "Mar"\ + "Apr"\ + "Mei"\ + "Jun"\ + "Jul"\ + "Ago"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Des"\ + ""] + ::msgcat::mcset sw MONTHS_FULL [list \ + "Januari"\ + "Februari"\ + "Machi"\ + "Aprili"\ + "Mei"\ + "Juni"\ + "Julai"\ + "Agosti"\ + "Septemba"\ + "Oktoba"\ + "Novemba"\ + "Desemba"\ + ""] + ::msgcat::mcset sw BCE "KK" + ::msgcat::mcset sw CE "BK" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ta.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ta.msg new file mode 100644 index 00000000..4abb90ca --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ta.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ta DAYS_OF_WEEK_FULL [list \ + "\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1"\ + "\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd"\ + "\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd"\ + "\u0baa\u0bc1\u0ba4\u0ba9\u0bcd"\ + "\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd"\ + "\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf"\ + "\u0b9a\u0ba9\u0bbf"] + ::msgcat::mcset ta MONTHS_ABBREV [list \ + "\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf"\ + "\u0baa\u0bc6\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf"\ + "\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd"\ + "\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd"\ + "\u0bae\u0bc7"\ + "\u0b9c\u0bc2\u0ba9\u0bcd"\ + "\u0b9c\u0bc2\u0bb2\u0bc8"\ + "\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd"\ + "\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ + "\u0b85\u0b95\u0bcd\u0b9f\u0bcb\u0baa\u0bb0\u0bcd"\ + "\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ + "\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcdr"] + ::msgcat::mcset ta MONTHS_FULL [list \ + "\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf"\ + "\u0baa\u0bc6\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf"\ + "\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd"\ + "\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd"\ + "\u0bae\u0bc7"\ + "\u0b9c\u0bc2\u0ba9\u0bcd"\ + "\u0b9c\u0bc2\u0bb2\u0bc8"\ + "\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd"\ + "\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ + "\u0b85\u0b95\u0bcd\u0b9f\u0bcb\u0baa\u0bb0\u0bcd"\ + "\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ + "\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcdr"] + ::msgcat::mcset ta AM "\u0b95\u0bbf\u0bae\u0bc1" + ::msgcat::mcset ta PM "\u0b95\u0bbf\u0baa\u0bbf" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ta_in.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ta_in.msg new file mode 100644 index 00000000..24590ac4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/ta_in.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ta_IN DATE_FORMAT "%d %M %Y" + ::msgcat::mcset ta_IN TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset ta_IN DATE_TIME_FORMAT "%d %M %Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/te.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/te.msg new file mode 100644 index 00000000..6111473c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/te.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset te DAYS_OF_WEEK_ABBREV [list \ + "\u0c06\u0c26\u0c3f"\ + "\u0c38\u0c4b\u0c2e"\ + "\u0c2e\u0c02\u0c17\u0c33"\ + "\u0c2c\u0c41\u0c27"\ + "\u0c17\u0c41\u0c30\u0c41"\ + "\u0c36\u0c41\u0c15\u0c4d\u0c30"\ + "\u0c36\u0c28\u0c3f"] + ::msgcat::mcset te DAYS_OF_WEEK_FULL [list \ + "\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02"\ + "\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02"\ + "\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02"\ + "\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02"\ + "\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02"\ + "\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02"\ + "\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02"] + ::msgcat::mcset te MONTHS_ABBREV [list \ + "\u0c1c\u0c28\u0c35\u0c30\u0c3f"\ + "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f"\ + "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f"\ + "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d"\ + "\u0c2e\u0c47"\ + "\u0c1c\u0c42\u0c28\u0c4d"\ + "\u0c1c\u0c42\u0c32\u0c48"\ + "\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41"\ + "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ + "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d"\ + "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d"\ + "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ + ""] + ::msgcat::mcset te MONTHS_FULL [list \ + "\u0c1c\u0c28\u0c35\u0c30\u0c3f"\ + "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f"\ + "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f"\ + "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d"\ + "\u0c2e\u0c47"\ + "\u0c1c\u0c42\u0c28\u0c4d"\ + "\u0c1c\u0c42\u0c32\u0c48"\ + "\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41"\ + "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ + "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d"\ + "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d"\ + "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ + ""] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/te_in.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/te_in.msg new file mode 100644 index 00000000..61638b5a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/te_in.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset te_IN AM "\u0c2a\u0c42\u0c30\u0c4d\u0c35\u0c3e\u0c39\u0c4d\u0c28" + ::msgcat::mcset te_IN PM "\u0c05\u0c2a\u0c30\u0c3e\u0c39\u0c4d\u0c28" + ::msgcat::mcset te_IN DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset te_IN TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset te_IN DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/th.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/th.msg new file mode 100644 index 00000000..7486c35a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/th.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset th DAYS_OF_WEEK_ABBREV [list \ + "\u0e2d\u0e32."\ + "\u0e08."\ + "\u0e2d."\ + "\u0e1e."\ + "\u0e1e\u0e24."\ + "\u0e28."\ + "\u0e2a."] + ::msgcat::mcset th DAYS_OF_WEEK_FULL [list \ + "\u0e27\u0e31\u0e19\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c"\ + "\u0e27\u0e31\u0e19\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c"\ + "\u0e27\u0e31\u0e19\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23"\ + "\u0e27\u0e31\u0e19\u0e1e\u0e38\u0e18"\ + "\u0e27\u0e31\u0e19\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35"\ + "\u0e27\u0e31\u0e19\u0e28\u0e38\u0e01\u0e23\u0e4c"\ + "\u0e27\u0e31\u0e19\u0e40\u0e2a\u0e32\u0e23\u0e4c"] + ::msgcat::mcset th MONTHS_ABBREV [list \ + "\u0e21.\u0e04."\ + "\u0e01.\u0e1e."\ + "\u0e21\u0e35.\u0e04."\ + "\u0e40\u0e21.\u0e22."\ + "\u0e1e.\u0e04."\ + "\u0e21\u0e34.\u0e22."\ + "\u0e01.\u0e04."\ + "\u0e2a.\u0e04."\ + "\u0e01.\u0e22."\ + "\u0e15.\u0e04."\ + "\u0e1e.\u0e22."\ + "\u0e18.\u0e04."\ + ""] + ::msgcat::mcset th MONTHS_FULL [list \ + "\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21"\ + "\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c"\ + "\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21"\ + "\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19"\ + "\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21"\ + "\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19"\ + "\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21"\ + "\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21"\ + "\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19"\ + "\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21"\ + "\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19"\ + "\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21"\ + ""] + ::msgcat::mcset th BCE "\u0e25\u0e17\u0e35\u0e48" + ::msgcat::mcset th CE "\u0e04.\u0e28." + ::msgcat::mcset th AM "\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07" + ::msgcat::mcset th PM "\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07" + ::msgcat::mcset th DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset th TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset th DATE_TIME_FORMAT "%e/%m/%Y %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/tr.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/tr.msg new file mode 100644 index 00000000..7b2ecf97 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/tr.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset tr DAYS_OF_WEEK_ABBREV [list \ + "Paz"\ + "Pzt"\ + "Sal"\ + "\u00c7ar"\ + "Per"\ + "Cum"\ + "Cmt"] + ::msgcat::mcset tr DAYS_OF_WEEK_FULL [list \ + "Pazar"\ + "Pazartesi"\ + "Sal\u0131"\ + "\u00c7ar\u015famba"\ + "Per\u015fembe"\ + "Cuma"\ + "Cumartesi"] + ::msgcat::mcset tr MONTHS_ABBREV [list \ + "Oca"\ + "\u015eub"\ + "Mar"\ + "Nis"\ + "May"\ + "Haz"\ + "Tem"\ + "A\u011fu"\ + "Eyl"\ + "Eki"\ + "Kas"\ + "Ara"\ + ""] + ::msgcat::mcset tr MONTHS_FULL [list \ + "Ocak"\ + "\u015eubat"\ + "Mart"\ + "Nisan"\ + "May\u0131s"\ + "Haziran"\ + "Temmuz"\ + "A\u011fustos"\ + "Eyl\u00fcl"\ + "Ekim"\ + "Kas\u0131m"\ + "Aral\u0131k"\ + ""] + ::msgcat::mcset tr DATE_FORMAT "%d.%m.%Y" + ::msgcat::mcset tr TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset tr DATE_TIME_FORMAT "%d.%m.%Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/uk.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/uk.msg new file mode 100644 index 00000000..7d4c64a0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/uk.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset uk DAYS_OF_WEEK_ABBREV [list \ + "\u043d\u0434"\ + "\u043f\u043d"\ + "\u0432\u0442"\ + "\u0441\u0440"\ + "\u0447\u0442"\ + "\u043f\u0442"\ + "\u0441\u0431"] + ::msgcat::mcset uk DAYS_OF_WEEK_FULL [list \ + "\u043d\u0435\u0434\u0456\u043b\u044f"\ + "\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a"\ + "\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a"\ + "\u0441\u0435\u0440\u0435\u0434\u0430"\ + "\u0447\u0435\u0442\u0432\u0435\u0440"\ + "\u043f'\u044f\u0442\u043d\u0438\u0446\u044f"\ + "\u0441\u0443\u0431\u043e\u0442\u0430"] + ::msgcat::mcset uk MONTHS_ABBREV [list \ + "\u0441\u0456\u0447"\ + "\u043b\u044e\u0442"\ + "\u0431\u0435\u0440"\ + "\u043a\u0432\u0456\u0442"\ + "\u0442\u0440\u0430\u0432"\ + "\u0447\u0435\u0440\u0432"\ + "\u043b\u0438\u043f"\ + "\u0441\u0435\u0440\u043f"\ + "\u0432\u0435\u0440"\ + "\u0436\u043e\u0432\u0442"\ + "\u043b\u0438\u0441\u0442"\ + "\u0433\u0440\u0443\u0434"\ + ""] + ::msgcat::mcset uk MONTHS_FULL [list \ + "\u0441\u0456\u0447\u043d\u044f"\ + "\u043b\u044e\u0442\u043e\u0433\u043e"\ + "\u0431\u0435\u0440\u0435\u0437\u043d\u044f"\ + "\u043a\u0432\u0456\u0442\u043d\u044f"\ + "\u0442\u0440\u0430\u0432\u043d\u044f"\ + "\u0447\u0435\u0440\u0432\u043d\u044f"\ + "\u043b\u0438\u043f\u043d\u044f"\ + "\u0441\u0435\u0440\u043f\u043d\u044f"\ + "\u0432\u0435\u0440\u0435\u0441\u043d\u044f"\ + "\u0436\u043e\u0432\u0442\u043d\u044f"\ + "\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430"\ + "\u0433\u0440\u0443\u0434\u043d\u044f"\ + ""] + ::msgcat::mcset uk BCE "\u0434\u043e \u043d.\u0435." + ::msgcat::mcset uk CE "\u043f\u0456\u0441\u043b\u044f \u043d.\u0435." + ::msgcat::mcset uk DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset uk TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset uk DATE_TIME_FORMAT "%e/%m/%Y %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/vi.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/vi.msg new file mode 100644 index 00000000..c98b2a6a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/vi.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset vi DAYS_OF_WEEK_ABBREV [list \ + "Th 2"\ + "Th 3"\ + "Th 4"\ + "Th 5"\ + "Th 6"\ + "Th 7"\ + "CN"] + ::msgcat::mcset vi DAYS_OF_WEEK_FULL [list \ + "Th\u01b0\u0301 hai"\ + "Th\u01b0\u0301 ba"\ + "Th\u01b0\u0301 t\u01b0"\ + "Th\u01b0\u0301 n\u0103m"\ + "Th\u01b0\u0301 s\u00e1u"\ + "Th\u01b0\u0301 ba\u0309y"\ + "Chu\u0309 nh\u00e2\u0323t"] + ::msgcat::mcset vi MONTHS_ABBREV [list \ + "Thg 1"\ + "Thg 2"\ + "Thg 3"\ + "Thg 4"\ + "Thg 5"\ + "Thg 6"\ + "Thg 7"\ + "Thg 8"\ + "Thg 9"\ + "Thg 10"\ + "Thg 11"\ + "Thg 12"\ + ""] + ::msgcat::mcset vi MONTHS_FULL [list \ + "Th\u00e1ng m\u00f4\u0323t"\ + "Th\u00e1ng hai"\ + "Th\u00e1ng ba"\ + "Th\u00e1ng t\u01b0"\ + "Th\u00e1ng n\u0103m"\ + "Th\u00e1ng s\u00e1u"\ + "Th\u00e1ng ba\u0309y"\ + "Th\u00e1ng t\u00e1m"\ + "Th\u00e1ng ch\u00edn"\ + "Th\u00e1ng m\u01b0\u01a1\u0300i"\ + "Th\u00e1ng m\u01b0\u01a1\u0300i m\u00f4\u0323t"\ + "Th\u00e1ng m\u01b0\u01a1\u0300i hai"\ + ""] + ::msgcat::mcset vi DATE_FORMAT "%d %b %Y" + ::msgcat::mcset vi TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset vi DATE_TIME_FORMAT "%d %b %Y %H:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh.msg new file mode 100644 index 00000000..b799a326 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh.msg @@ -0,0 +1,55 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset zh DAYS_OF_WEEK_ABBREV [list \ + "\u661f\u671f\u65e5"\ + "\u661f\u671f\u4e00"\ + "\u661f\u671f\u4e8c"\ + "\u661f\u671f\u4e09"\ + "\u661f\u671f\u56db"\ + "\u661f\u671f\u4e94"\ + "\u661f\u671f\u516d"] + ::msgcat::mcset zh DAYS_OF_WEEK_FULL [list \ + "\u661f\u671f\u65e5"\ + "\u661f\u671f\u4e00"\ + "\u661f\u671f\u4e8c"\ + "\u661f\u671f\u4e09"\ + "\u661f\u671f\u56db"\ + "\u661f\u671f\u4e94"\ + "\u661f\u671f\u516d"] + ::msgcat::mcset zh MONTHS_ABBREV [list \ + "\u4e00\u6708"\ + "\u4e8c\u6708"\ + "\u4e09\u6708"\ + "\u56db\u6708"\ + "\u4e94\u6708"\ + "\u516d\u6708"\ + "\u4e03\u6708"\ + "\u516b\u6708"\ + "\u4e5d\u6708"\ + "\u5341\u6708"\ + "\u5341\u4e00\u6708"\ + "\u5341\u4e8c\u6708"\ + ""] + ::msgcat::mcset zh MONTHS_FULL [list \ + "\u4e00\u6708"\ + "\u4e8c\u6708"\ + "\u4e09\u6708"\ + "\u56db\u6708"\ + "\u4e94\u6708"\ + "\u516d\u6708"\ + "\u4e03\u6708"\ + "\u516b\u6708"\ + "\u4e5d\u6708"\ + "\u5341\u6708"\ + "\u5341\u4e00\u6708"\ + "\u5341\u4e8c\u6708"\ + ""] + ::msgcat::mcset zh BCE "\u516c\u5143\u524d" + ::msgcat::mcset zh CE "\u516c\u5143" + ::msgcat::mcset zh AM "\u4e0a\u5348" + ::msgcat::mcset zh PM "\u4e0b\u5348" + ::msgcat::mcset zh LOCALE_NUMERALS "\u3007 \u4e00 \u4e8c \u4e09 \u56db \u4e94 \u516d \u4e03 \u516b \u4e5d \u5341 \u5341\u4e00 \u5341\u4e8c \u5341\u4e09 \u5341\u56db \u5341\u4e94 \u5341\u516d \u5341\u4e03 \u5341\u516b \u5341\u4e5d \u4e8c\u5341 \u5eff\u4e00 \u5eff\u4e8c \u5eff\u4e09 \u5eff\u56db \u5eff\u4e94 \u5eff\u516d \u5eff\u4e03 \u5eff\u516b \u5eff\u4e5d \u4e09\u5341 \u5345\u4e00 \u5345\u4e8c \u5345\u4e09 \u5345\u56db \u5345\u4e94 \u5345\u516d \u5345\u4e03 \u5345\u516b \u5345\u4e5d \u56db\u5341 \u56db\u5341\u4e00 \u56db\u5341\u4e8c \u56db\u5341\u4e09 \u56db\u5341\u56db \u56db\u5341\u4e94 \u56db\u5341\u516d \u56db\u5341\u4e03 \u56db\u5341\u516b \u56db\u5341\u4e5d \u4e94\u5341 \u4e94\u5341\u4e00 \u4e94\u5341\u4e8c \u4e94\u5341\u4e09 \u4e94\u5341\u56db \u4e94\u5341\u4e94 \u4e94\u5341\u516d \u4e94\u5341\u4e03 \u4e94\u5341\u516b \u4e94\u5341\u4e5d \u516d\u5341 \u516d\u5341\u4e00 \u516d\u5341\u4e8c \u516d\u5341\u4e09 \u516d\u5341\u56db \u516d\u5341\u4e94 \u516d\u5341\u516d \u516d\u5341\u4e03 \u516d\u5341\u516b \u516d\u5341\u4e5d \u4e03\u5341 \u4e03\u5341\u4e00 \u4e03\u5341\u4e8c \u4e03\u5341\u4e09 \u4e03\u5341\u56db \u4e03\u5341\u4e94 \u4e03\u5341\u516d \u4e03\u5341\u4e03 \u4e03\u5341\u516b \u4e03\u5341\u4e5d \u516b\u5341 \u516b\u5341\u4e00 \u516b\u5341\u4e8c \u516b\u5341\u4e09 \u516b\u5341\u56db \u516b\u5341\u4e94 \u516b\u5341\u516d \u516b\u5341\u4e03 \u516b\u5341\u516b \u516b\u5341\u4e5d \u4e5d\u5341 \u4e5d\u5341\u4e00 \u4e5d\u5341\u4e8c \u4e5d\u5341\u4e09 \u4e5d\u5341\u56db \u4e5d\u5341\u4e94 \u4e5d\u5341\u516d \u4e5d\u5341\u4e03 \u4e5d\u5341\u516b \u4e5d\u5341\u4e5d" + ::msgcat::mcset zh LOCALE_DATE_FORMAT "\u516c\u5143%Y\u5e74%B%Od\u65e5" + ::msgcat::mcset zh LOCALE_TIME_FORMAT "%OH\u65f6%OM\u5206%OS\u79d2" + ::msgcat::mcset zh LOCALE_DATE_TIME_FORMAT "%A %Y\u5e74%B%Od\u65e5%OH\u65f6%OM\u5206%OS\u79d2 %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_cn.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_cn.msg new file mode 100644 index 00000000..d62ce775 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_cn.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset zh_CN DATE_FORMAT "%Y-%m-%e" + ::msgcat::mcset zh_CN TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset zh_CN TIME_FORMAT_12 "%P%I\u65f6%M\u5206%S\u79d2" + ::msgcat::mcset zh_CN DATE_TIME_FORMAT "%Y-%m-%e %k:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_hk.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_hk.msg new file mode 100644 index 00000000..badb1dd3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_hk.msg @@ -0,0 +1,28 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset zh_HK DAYS_OF_WEEK_ABBREV [list \ + "\u65e5"\ + "\u4e00"\ + "\u4e8c"\ + "\u4e09"\ + "\u56db"\ + "\u4e94"\ + "\u516d"] + ::msgcat::mcset zh_HK MONTHS_ABBREV [list \ + "1\u6708"\ + "2\u6708"\ + "3\u6708"\ + "4\u6708"\ + "5\u6708"\ + "6\u6708"\ + "7\u6708"\ + "8\u6708"\ + "9\u6708"\ + "10\u6708"\ + "11\u6708"\ + "12\u6708"\ + ""] + ::msgcat::mcset zh_HK DATE_FORMAT "%Y\u5e74%m\u6708%e\u65e5" + ::msgcat::mcset zh_HK TIME_FORMAT_12 "%P%I:%M:%S" + ::msgcat::mcset zh_HK DATE_TIME_FORMAT "%Y\u5e74%m\u6708%e\u65e5 %P%I:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_sg.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_sg.msg new file mode 100644 index 00000000..a2f3e39d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_sg.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset zh_SG AM "\u4e0a\u5348" + ::msgcat::mcset zh_SG PM "\u4e2d\u5348" + ::msgcat::mcset zh_SG DATE_FORMAT "%d %B %Y" + ::msgcat::mcset zh_SG TIME_FORMAT_12 "%P %I:%M:%S" + ::msgcat::mcset zh_SG DATE_TIME_FORMAT "%d %B %Y %P %I:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_tw.msg b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_tw.msg new file mode 100644 index 00000000..e0796b11 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/msgs/zh_tw.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset zh_TW BCE "\u6c11\u570b\u524d" + ::msgcat::mcset zh_TW CE "\u6c11\u570b" + ::msgcat::mcset zh_TW DATE_FORMAT "%Y/%m/%e" + ::msgcat::mcset zh_TW TIME_FORMAT_12 "%P %I:%M:%S" + ::msgcat::mcset zh_TW DATE_TIME_FORMAT "%Y/%m/%e %P %I:%M:%S %z" +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/opt0.4/optparse.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/opt0.4/optparse.tcl new file mode 100644 index 00000000..454b9239 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/opt0.4/optparse.tcl @@ -0,0 +1,1072 @@ +# optparse.tcl -- +# +# (private) Option parsing package +# Primarily used internally by the safe:: code. +# +# WARNING: This code will go away in a future release +# of Tcl. It is NOT supported and you should not rely +# on it. If your code does rely on this package you +# may directly incorporate this code into your application. + +package require Tcl 8.5- +# When this version number changes, update the pkgIndex.tcl file +# and the install directory in the Makefiles. +package provide opt 0.4.8 + +namespace eval ::tcl { + + # Exported APIs + namespace export OptKeyRegister OptKeyDelete OptKeyError OptKeyParse \ + OptProc OptProcArgGiven OptParse \ + Lempty Lget \ + Lassign Lvarpop Lvarpop1 Lvarset Lvarincr \ + SetMax SetMin + + +################# Example of use / 'user documentation' ################### + + proc OptCreateTestProc {} { + + # Defines ::tcl::OptParseTest as a test proc with parsed arguments + # (can't be defined before the code below is loaded (before "OptProc")) + + # Every OptProc give usage information on "procname -help". + # Try "tcl::OptParseTest -help" and "tcl::OptParseTest -a" and + # then other arguments. + # + # example of 'valid' call: + # ::tcl::OptParseTest save -4 -pr 23 -libsok SybTcl\ + # -nostatics false ch1 + OptProc OptParseTest { + {subcommand -choice {save print} "sub command"} + {arg1 3 "some number"} + {-aflag} + {-intflag 7} + {-weirdflag "help string"} + {-noStatics "Not ok to load static packages"} + {-nestedloading1 true "OK to load into nested children"} + {-nestedloading2 -boolean true "OK to load into nested children"} + {-libsOK -choice {Tk SybTcl} + "List of packages that can be loaded"} + {-precision -int 12 "Number of digits of precision"} + {-intval 7 "An integer"} + {-scale -float 1.0 "Scale factor"} + {-zoom 1.0 "Zoom factor"} + {-arbitrary foobar "Arbitrary string"} + {-random -string 12 "Random string"} + {-listval -list {} "List value"} + {-blahflag -blah abc "Funny type"} + {arg2 -boolean "a boolean"} + {arg3 -choice "ch1 ch2"} + {?optarg? -list {} "optional argument"} + } { + foreach v [info locals] { + puts stderr [format "%14s : %s" $v [set $v]] + } + } + } + +################### No User serviceable part below ! ############### + + # Array storing the parsed descriptions + variable OptDesc + array set OptDesc {} + # Next potentially free key id (numeric) + variable OptDescN 0 + +# Inside algorithm/mechanism description: +# (not for the faint hearted ;-) +# +# The argument description is parsed into a "program tree" +# It is called a "program" because it is the program used by +# the state machine interpreter that use that program to +# actually parse the arguments at run time. +# +# The general structure of a "program" is +# notation (pseudo bnf like) +# name :== definition defines "name" as being "definition" +# { x y z } means list of x, y, and z +# x* means x repeated 0 or more time +# x+ means "x x*" +# x? means optionally x +# x | y means x or y +# "cccc" means the literal string +# +# program :== { programCounter programStep* } +# +# programStep :== program | singleStep +# +# programCounter :== {"P" integer+ } +# +# singleStep :== { instruction parameters* } +# +# instruction :== single element list +# +# (the difference between singleStep and program is that \ +# llength [lindex $program 0] >= 2 +# while +# llength [lindex $singleStep 0] == 1 +# ) +# +# And for this application: +# +# singleStep :== { instruction varname {hasBeenSet currentValue} type +# typeArgs help } +# instruction :== "flags" | "value" +# type :== knowType | anyword +# knowType :== "string" | "int" | "boolean" | "boolflag" | "float" +# | "choice" +# +# for type "choice" typeArgs is a list of possible choices, the first one +# is the default value. for all other types the typeArgs is the default value +# +# a "boolflag" is the type for a flag whose presence or absence, without +# additional arguments means respectively true or false (default flag type). +# +# programCounter is the index in the list of the currently processed +# programStep (thus starting at 1 (0 is {"P" prgCounterValue}). +# If it is a list it points toward each currently selected programStep. +# (like for "flags", as they are optional, form a set and programStep). + +# Performance/Implementation issues +# --------------------------------- +# We use tcl lists instead of arrays because with tcl8.0 +# they should start to be much faster. +# But this code use a lot of helper procs (like Lvarset) +# which are quite slow and would be helpfully optimized +# for instance by being written in C. Also our struture +# is complex and there is maybe some places where the +# string rep might be calculated at great exense. to be checked. + +# +# Parse a given description and saves it here under the given key +# generate a unused keyid if not given +# +proc ::tcl::OptKeyRegister {desc {key ""}} { + variable OptDesc + variable OptDescN + if {[string equal $key ""]} { + # in case a key given to us as a parameter was a number + while {[info exists OptDesc($OptDescN)]} {incr OptDescN} + set key $OptDescN + incr OptDescN + } + # program counter + set program [list [list "P" 1]] + + # are we processing flags (which makes a single program step) + set inflags 0 + + set state {} + + # flag used to detect that we just have a single (flags set) subprogram. + set empty 1 + + foreach item $desc { + if {$state == "args"} { + # more items after 'args'... + return -code error "'args' special argument must be the last one" + } + set res [OptNormalizeOne $item] + set state [lindex $res 0] + if {$inflags} { + if {$state == "flags"} { + # add to 'subprogram' + lappend flagsprg $res + } else { + # put in the flags + # structure for flag programs items is a list of + # {subprgcounter {prg flag 1} {prg flag 2} {...}} + lappend program $flagsprg + # put the other regular stuff + lappend program $res + set inflags 0 + set empty 0 + } + } else { + if {$state == "flags"} { + set inflags 1 + # sub program counter + first sub program + set flagsprg [list [list "P" 1] $res] + } else { + lappend program $res + set empty 0 + } + } + } + if {$inflags} { + if {$empty} { + # We just have the subprogram, optimize and remove + # unneeded level: + set program $flagsprg + } else { + lappend program $flagsprg + } + } + + set OptDesc($key) $program + + return $key +} + +# +# Free the storage for that given key +# +proc ::tcl::OptKeyDelete {key} { + variable OptDesc + unset OptDesc($key) +} + + # Get the parsed description stored under the given key. + proc OptKeyGetDesc {descKey} { + variable OptDesc + if {![info exists OptDesc($descKey)]} { + return -code error "Unknown option description key \"$descKey\"" + } + set OptDesc($descKey) + } + +# Parse entry point for ppl who don't want to register with a key, +# for instance because the description changes dynamically. +# (otherwise one should really use OptKeyRegister once + OptKeyParse +# as it is way faster or simply OptProc which does it all) +# Assign a temporary key, call OptKeyParse and then free the storage +proc ::tcl::OptParse {desc arglist} { + set tempkey [OptKeyRegister $desc] + set ret [catch {uplevel 1 [list ::tcl::OptKeyParse $tempkey $arglist]} res] + OptKeyDelete $tempkey + return -code $ret $res +} + +# Helper function, replacement for proc that both +# register the description under a key which is the name of the proc +# (and thus unique to that code) +# and add a first line to the code to call the OptKeyParse proc +# Stores the list of variables that have been actually given by the user +# (the other will be sets to their default value) +# into local variable named "Args". +proc ::tcl::OptProc {name desc body} { + set namespace [uplevel 1 [list ::namespace current]] + if {[string match "::*" $name] || [string equal $namespace "::"]} { + # absolute name or global namespace, name is the key + set key $name + } else { + # we are relative to some non top level namespace: + set key "${namespace}::${name}" + } + OptKeyRegister $desc $key + uplevel 1 [list ::proc $name args "set Args \[::tcl::OptKeyParse $key \$args\]\n$body"] + return $key +} +# Check that a argument has been given +# assumes that "OptProc" has been used as it will check in "Args" list +proc ::tcl::OptProcArgGiven {argname} { + upvar Args alist + expr {[lsearch $alist $argname] >=0} +} + + ####### + # Programs/Descriptions manipulation + + # Return the instruction word/list of a given step/(sub)program + proc OptInstr {lst} { + lindex $lst 0 + } + # Is a (sub) program or a plain instruction ? + proc OptIsPrg {lst} { + expr {[llength [OptInstr $lst]]>=2} + } + # Is this instruction a program counter or a real instr + proc OptIsCounter {item} { + expr {[lindex $item 0]=="P"} + } + # Current program counter (2nd word of first word) + proc OptGetPrgCounter {lst} { + Lget $lst {0 1} + } + # Current program counter (2nd word of first word) + proc OptSetPrgCounter {lstName newValue} { + upvar $lstName lst + set lst [lreplace $lst 0 0 [concat "P" $newValue]] + } + # returns a list of currently selected items. + proc OptSelection {lst} { + set res {} + foreach idx [lrange [lindex $lst 0] 1 end] { + lappend res [Lget $lst $idx] + } + return $res + } + + # Advance to next description + proc OptNextDesc {descName} { + uplevel 1 [list Lvarincr $descName {0 1}] + } + + # Get the current description, eventually descend + proc OptCurDesc {descriptions} { + lindex $descriptions [OptGetPrgCounter $descriptions] + } + # get the current description, eventually descend + # through sub programs as needed. + proc OptCurDescFinal {descriptions} { + set item [OptCurDesc $descriptions] + # Descend untill we get the actual item and not a sub program + while {[OptIsPrg $item]} { + set item [OptCurDesc $item] + } + return $item + } + # Current final instruction adress + proc OptCurAddr {descriptions {start {}}} { + set adress [OptGetPrgCounter $descriptions] + lappend start $adress + set item [lindex $descriptions $adress] + if {[OptIsPrg $item]} { + return [OptCurAddr $item $start] + } else { + return $start + } + } + # Set the value field of the current instruction + proc OptCurSetValue {descriptionsName value} { + upvar $descriptionsName descriptions + # get the current item full adress + set adress [OptCurAddr $descriptions] + # use the 3th field of the item (see OptValue / OptNewInst) + lappend adress 2 + Lvarset descriptions $adress [list 1 $value] + # ^hasBeenSet flag + } + + # empty state means done/paste the end of the program + proc OptState {item} { + lindex $item 0 + } + + # current state + proc OptCurState {descriptions} { + OptState [OptCurDesc $descriptions] + } + + ####### + # Arguments manipulation + + # Returns the argument that has to be processed now + proc OptCurrentArg {lst} { + lindex $lst 0 + } + # Advance to next argument + proc OptNextArg {argsName} { + uplevel 1 [list Lvarpop1 $argsName] + } + ####### + + + + + + # Loop over all descriptions, calling OptDoOne which will + # eventually eat all the arguments. + proc OptDoAll {descriptionsName argumentsName} { + upvar $descriptionsName descriptions + upvar $argumentsName arguments +# puts "entered DoAll" + # Nb: the places where "state" can be set are tricky to figure + # because DoOne sets the state to flagsValue and return -continue + # when needed... + set state [OptCurState $descriptions] + # We'll exit the loop in "OptDoOne" or when state is empty. + while 1 { + set curitem [OptCurDesc $descriptions] + # Do subprograms if needed, call ourselves on the sub branch + while {[OptIsPrg $curitem]} { + OptDoAll curitem arguments +# puts "done DoAll sub" + # Insert back the results in current tree + Lvarset1nc descriptions [OptGetPrgCounter $descriptions]\ + $curitem + OptNextDesc descriptions + set curitem [OptCurDesc $descriptions] + set state [OptCurState $descriptions] + } +# puts "state = \"$state\" - arguments=($arguments)" + if {[Lempty $state]} { + # Nothing left to do, we are done in this branch: + break + } + # The following statement can make us terminate/continue + # as it use return -code {break, continue, return and error} + # codes + OptDoOne descriptions state arguments + # If we are here, no special return code where issued, + # we'll step to next instruction : +# puts "new state = \"$state\"" + OptNextDesc descriptions + set state [OptCurState $descriptions] + } + } + + # Process one step for the state machine, + # eventually consuming the current argument. + proc OptDoOne {descriptionsName stateName argumentsName} { + upvar $argumentsName arguments + upvar $descriptionsName descriptions + upvar $stateName state + + # the special state/instruction "args" eats all + # the remaining args (if any) + if {($state == "args")} { + if {![Lempty $arguments]} { + # If there is no additional arguments, leave the default value + # in. + OptCurSetValue descriptions $arguments + set arguments {} + } +# puts "breaking out ('args' state: consuming every reminding args)" + return -code break + } + + if {[Lempty $arguments]} { + if {$state == "flags"} { + # no argument and no flags : we're done +# puts "returning to previous (sub)prg (no more args)" + return -code return + } elseif {$state == "optValue"} { + set state next; # not used, for debug only + # go to next state + return + } else { + return -code error [OptMissingValue $descriptions] + } + } else { + set arg [OptCurrentArg $arguments] + } + + switch $state { + flags { + # A non-dash argument terminates the options, as does -- + + # Still a flag ? + if {![OptIsFlag $arg]} { + # don't consume the argument, return to previous prg + return -code return + } + # consume the flag + OptNextArg arguments + if {[string equal "--" $arg]} { + # return from 'flags' state + return -code return + } + + set hits [OptHits descriptions $arg] + if {$hits > 1} { + return -code error [OptAmbigous $descriptions $arg] + } elseif {$hits == 0} { + return -code error [OptFlagUsage $descriptions $arg] + } + set item [OptCurDesc $descriptions] + if {[OptNeedValue $item]} { + # we need a value, next state is + set state flagValue + } else { + OptCurSetValue descriptions 1 + } + # continue + return -code continue + } + flagValue - + value { + set item [OptCurDesc $descriptions] + # Test the values against their required type + if {[catch {OptCheckType $arg\ + [OptType $item] [OptTypeArgs $item]} val]} { + return -code error [OptBadValue $item $arg $val] + } + # consume the value + OptNextArg arguments + # set the value + OptCurSetValue descriptions $val + # go to next state + if {$state == "flagValue"} { + set state flags + return -code continue + } else { + set state next; # not used, for debug only + return ; # will go on next step + } + } + optValue { + set item [OptCurDesc $descriptions] + # Test the values against their required type + if {![catch {OptCheckType $arg\ + [OptType $item] [OptTypeArgs $item]} val]} { + # right type, so : + # consume the value + OptNextArg arguments + # set the value + OptCurSetValue descriptions $val + } + # go to next state + set state next; # not used, for debug only + return ; # will go on next step + } + } + # If we reach this point: an unknown + # state as been entered ! + return -code error "Bug! unknown state in DoOne \"$state\"\ + (prg counter [OptGetPrgCounter $descriptions]:\ + [OptCurDesc $descriptions])" + } + +# Parse the options given the key to previously registered description +# and arguments list +proc ::tcl::OptKeyParse {descKey arglist} { + + set desc [OptKeyGetDesc $descKey] + + # make sure -help always give usage + if {[string equal -nocase "-help" $arglist]} { + return -code error [OptError "Usage information:" $desc 1] + } + + OptDoAll desc arglist + + if {![Lempty $arglist]} { + return -code error [OptTooManyArgs $desc $arglist] + } + + # Analyse the result + # Walk through the tree: + OptTreeVars $desc "#[expr {[info level]-1}]" +} + + # determine string length for nice tabulated output + proc OptTreeVars {desc level {vnamesLst {}}} { + foreach item $desc { + if {[OptIsCounter $item]} continue + if {[OptIsPrg $item]} { + set vnamesLst [OptTreeVars $item $level $vnamesLst] + } else { + set vname [OptVarName $item] + upvar $level $vname var + if {[OptHasBeenSet $item]} { +# puts "adding $vname" + # lets use the input name for the returned list + # it is more usefull, for instance you can check that + # no flags at all was given with expr + # {![string match "*-*" $Args]} + lappend vnamesLst [OptName $item] + set var [OptValue $item] + } else { + set var [OptDefaultValue $item] + } + } + } + return $vnamesLst + } + + +# Check the type of a value +# and emit an error if arg is not of the correct type +# otherwise returns the canonical value of that arg (ie 0/1 for booleans) +proc ::tcl::OptCheckType {arg type {typeArgs ""}} { +# puts "checking '$arg' against '$type' ($typeArgs)" + + # only types "any", "choice", and numbers can have leading "-" + + switch -exact -- $type { + int { + if {![string is integer -strict $arg]} { + error "not an integer" + } + return $arg + } + float { + return [expr {double($arg)}] + } + script - + list { + # if llength fail : malformed list + if {[llength $arg]==0 && [OptIsFlag $arg]} { + error "no values with leading -" + } + return $arg + } + boolean { + if {![string is boolean -strict $arg]} { + error "non canonic boolean" + } + # convert true/false because expr/if is broken with "!,... + return [expr {$arg ? 1 : 0}] + } + choice { + if {$arg ni $typeArgs} { + error "invalid choice" + } + return $arg + } + any { + return $arg + } + string - + default { + if {[OptIsFlag $arg]} { + error "no values with leading -" + } + return $arg + } + } + return neverReached +} + + # internal utilities + + # returns the number of flags matching the given arg + # sets the (local) prg counter to the list of matches + proc OptHits {descName arg} { + upvar $descName desc + set hits 0 + set hitems {} + set i 1 + + set larg [string tolower $arg] + set len [string length $larg] + set last [expr {$len-1}] + + foreach item [lrange $desc 1 end] { + set flag [OptName $item] + # lets try to match case insensitively + # (string length ought to be cheap) + set lflag [string tolower $flag] + if {$len == [string length $lflag]} { + if {[string equal $larg $lflag]} { + # Exact match case + OptSetPrgCounter desc $i + return 1 + } + } elseif {[string equal $larg [string range $lflag 0 $last]]} { + lappend hitems $i + incr hits + } + incr i + } + if {$hits} { + OptSetPrgCounter desc $hitems + } + return $hits + } + + # Extract fields from the list structure: + + proc OptName {item} { + lindex $item 1 + } + proc OptHasBeenSet {item} { + Lget $item {2 0} + } + proc OptValue {item} { + Lget $item {2 1} + } + + proc OptIsFlag {name} { + string match "-*" $name + } + proc OptIsOpt {name} { + string match {\?*} $name + } + proc OptVarName {item} { + set name [OptName $item] + if {[OptIsFlag $name]} { + return [string range $name 1 end] + } elseif {[OptIsOpt $name]} { + return [string trim $name "?"] + } else { + return $name + } + } + proc OptType {item} { + lindex $item 3 + } + proc OptTypeArgs {item} { + lindex $item 4 + } + proc OptHelp {item} { + lindex $item 5 + } + proc OptNeedValue {item} { + expr {![string equal [OptType $item] boolflag]} + } + proc OptDefaultValue {item} { + set val [OptTypeArgs $item] + switch -exact -- [OptType $item] { + choice {return [lindex $val 0]} + boolean - + boolflag { + # convert back false/true to 0/1 because expr !$bool + # is broken.. + if {$val} { + return 1 + } else { + return 0 + } + } + } + return $val + } + + # Description format error helper + proc OptOptUsage {item {what ""}} { + return -code error "invalid description format$what: $item\n\ + should be a list of {varname|-flagname ?-type? ?defaultvalue?\ + ?helpstring?}" + } + + + # Generate a canonical form single instruction + proc OptNewInst {state varname type typeArgs help} { + list $state $varname [list 0 {}] $type $typeArgs $help + # ^ ^ + # | | + # hasBeenSet=+ +=currentValue + } + + # Translate one item to canonical form + proc OptNormalizeOne {item} { + set lg [Lassign $item varname arg1 arg2 arg3] +# puts "called optnormalizeone '$item' v=($varname), lg=$lg" + set isflag [OptIsFlag $varname] + set isopt [OptIsOpt $varname] + if {$isflag} { + set state "flags" + } elseif {$isopt} { + set state "optValue" + } elseif {![string equal $varname "args"]} { + set state "value" + } else { + set state "args" + } + + # apply 'smart' 'fuzzy' logic to try to make + # description writer's life easy, and our's difficult : + # let's guess the missing arguments :-) + + switch $lg { + 1 { + if {$isflag} { + return [OptNewInst $state $varname boolflag false ""] + } else { + return [OptNewInst $state $varname any "" ""] + } + } + 2 { + # varname default + # varname help + set type [OptGuessType $arg1] + if {[string equal $type "string"]} { + if {$isflag} { + set type boolflag + set def false + } else { + set type any + set def "" + } + set help $arg1 + } else { + set help "" + set def $arg1 + } + return [OptNewInst $state $varname $type $def $help] + } + 3 { + # varname type value + # varname value comment + + if {[regexp {^-(.+)$} $arg1 x type]} { + # flags/optValue as they are optional, need a "value", + # on the contrary, for a variable (non optional), + # default value is pointless, 'cept for choices : + if {$isflag || $isopt || ($type == "choice")} { + return [OptNewInst $state $varname $type $arg2 ""] + } else { + return [OptNewInst $state $varname $type "" $arg2] + } + } else { + return [OptNewInst $state $varname\ + [OptGuessType $arg1] $arg1 $arg2] + } + } + 4 { + if {[regexp {^-(.+)$} $arg1 x type]} { + return [OptNewInst $state $varname $type $arg2 $arg3] + } else { + return -code error [OptOptUsage $item] + } + } + default { + return -code error [OptOptUsage $item] + } + } + } + + # Auto magic lazy type determination + proc OptGuessType {arg} { + if { $arg == "true" || $arg == "false" } { + return boolean + } + if {[string is integer -strict $arg]} { + return int + } + if {[string is double -strict $arg]} { + return float + } + return string + } + + # Error messages front ends + + proc OptAmbigous {desc arg} { + OptError "ambigous option \"$arg\", choose from:" [OptSelection $desc] + } + proc OptFlagUsage {desc arg} { + OptError "bad flag \"$arg\", must be one of" $desc + } + proc OptTooManyArgs {desc arguments} { + OptError "too many arguments (unexpected argument(s): $arguments),\ + usage:"\ + $desc 1 + } + proc OptParamType {item} { + if {[OptIsFlag $item]} { + return "flag" + } else { + return "parameter" + } + } + proc OptBadValue {item arg {err {}}} { +# puts "bad val err = \"$err\"" + OptError "bad value \"$arg\" for [OptParamType $item]"\ + [list $item] + } + proc OptMissingValue {descriptions} { +# set item [OptCurDescFinal $descriptions] + set item [OptCurDesc $descriptions] + OptError "no value given for [OptParamType $item] \"[OptName $item]\"\ + (use -help for full usage) :"\ + [list $item] + } + +proc ::tcl::OptKeyError {prefix descKey {header 0}} { + OptError $prefix [OptKeyGetDesc $descKey] $header +} + + # determine string length for nice tabulated output + proc OptLengths {desc nlName tlName dlName} { + upvar $nlName nl + upvar $tlName tl + upvar $dlName dl + foreach item $desc { + if {[OptIsCounter $item]} continue + if {[OptIsPrg $item]} { + OptLengths $item nl tl dl + } else { + SetMax nl [string length [OptName $item]] + SetMax tl [string length [OptType $item]] + set dv [OptTypeArgs $item] + if {[OptState $item] != "header"} { + set dv "($dv)" + } + set l [string length $dv] + # limit the space allocated to potentially big "choices" + if {([OptType $item] != "choice") || ($l<=12)} { + SetMax dl $l + } else { + if {![info exists dl]} { + set dl 0 + } + } + } + } + } + # output the tree + proc OptTree {desc nl tl dl} { + set res "" + foreach item $desc { + if {[OptIsCounter $item]} continue + if {[OptIsPrg $item]} { + append res [OptTree $item $nl $tl $dl] + } else { + set dv [OptTypeArgs $item] + if {[OptState $item] != "header"} { + set dv "($dv)" + } + append res [string trimright [format "\n %-*s %-*s %-*s %s" \ + $nl [OptName $item] $tl [OptType $item] \ + $dl $dv [OptHelp $item]]] + } + } + return $res + } + +# Give nice usage string +proc ::tcl::OptError {prefix desc {header 0}} { + # determine length + if {$header} { + # add faked instruction + set h [list [OptNewInst header Var/FlagName Type Value Help]] + lappend h [OptNewInst header ------------ ---- ----- ----] + lappend h [OptNewInst header {(-help} "" "" {gives this help)}] + set desc [concat $h $desc] + } + OptLengths $desc nl tl dl + # actually output + return "$prefix[OptTree $desc $nl $tl $dl]" +} + + +################ General Utility functions ####################### + +# +# List utility functions +# Naming convention: +# "Lvarxxx" take the list VARiable name as argument +# "Lxxxx" take the list value as argument +# (which is not costly with Tcl8 objects system +# as it's still a reference and not a copy of the values) +# + +# Is that list empty ? +proc ::tcl::Lempty {list} { + expr {[llength $list]==0} +} + +# Gets the value of one leaf of a lists tree +proc ::tcl::Lget {list indexLst} { + if {[llength $indexLst] <= 1} { + return [lindex $list $indexLst] + } + Lget [lindex $list [lindex $indexLst 0]] [lrange $indexLst 1 end] +} +# Sets the value of one leaf of a lists tree +# (we use the version that does not create the elements because +# it would be even slower... needs to be written in C !) +# (nb: there is a non trivial recursive problem with indexes 0, +# which appear because there is no difference between a list +# of 1 element and 1 element alone : [list "a"] == "a" while +# it should be {a} and [listp a] should be 0 while [listp {a b}] would be 1 +# and [listp "a b"] maybe 0. listp does not exist either...) +proc ::tcl::Lvarset {listName indexLst newValue} { + upvar $listName list + if {[llength $indexLst] <= 1} { + Lvarset1nc list $indexLst $newValue + } else { + set idx [lindex $indexLst 0] + set targetList [lindex $list $idx] + # reduce refcount on targetList (not really usefull now, + # could be with optimizing compiler) +# Lvarset1 list $idx {} + # recursively replace in targetList + Lvarset targetList [lrange $indexLst 1 end] $newValue + # put updated sub list back in the tree + Lvarset1nc list $idx $targetList + } +} +# Set one cell to a value, eventually create all the needed elements +# (on level-1 of lists) +variable emptyList {} +proc ::tcl::Lvarset1 {listName index newValue} { + upvar $listName list + if {$index < 0} {return -code error "invalid negative index"} + set lg [llength $list] + if {$index >= $lg} { + variable emptyList + for {set i $lg} {$i<$index} {incr i} { + lappend list $emptyList + } + lappend list $newValue + } else { + set list [lreplace $list $index $index $newValue] + } +} +# same as Lvarset1 but no bound checking / creation +proc ::tcl::Lvarset1nc {listName index newValue} { + upvar $listName list + set list [lreplace $list $index $index $newValue] +} +# Increments the value of one leaf of a lists tree +# (which must exists) +proc ::tcl::Lvarincr {listName indexLst {howMuch 1}} { + upvar $listName list + if {[llength $indexLst] <= 1} { + Lvarincr1 list $indexLst $howMuch + } else { + set idx [lindex $indexLst 0] + set targetList [lindex $list $idx] + # reduce refcount on targetList + Lvarset1nc list $idx {} + # recursively replace in targetList + Lvarincr targetList [lrange $indexLst 1 end] $howMuch + # put updated sub list back in the tree + Lvarset1nc list $idx $targetList + } +} +# Increments the value of one cell of a list +proc ::tcl::Lvarincr1 {listName index {howMuch 1}} { + upvar $listName list + set newValue [expr {[lindex $list $index]+$howMuch}] + set list [lreplace $list $index $index $newValue] + return $newValue +} +# Removes the first element of a list +# and returns the new list value +proc ::tcl::Lvarpop1 {listName} { + upvar $listName list + set list [lrange $list 1 end] +} +# Same but returns the removed element +# (Like the tclX version) +proc ::tcl::Lvarpop {listName} { + upvar $listName list + set el [lindex $list 0] + set list [lrange $list 1 end] + return $el +} +# Assign list elements to variables and return the length of the list +proc ::tcl::Lassign {list args} { + # faster than direct blown foreach (which does not byte compile) + set i 0 + set lg [llength $list] + foreach vname $args { + if {$i>=$lg} break + uplevel 1 [list ::set $vname [lindex $list $i]] + incr i + } + return $lg +} + +# Misc utilities + +# Set the varname to value if value is greater than varname's current value +# or if varname is undefined +proc ::tcl::SetMax {varname value} { + upvar 1 $varname var + if {![info exists var] || $value > $var} { + set var $value + } +} + +# Set the varname to value if value is smaller than varname's current value +# or if varname is undefined +proc ::tcl::SetMin {varname value} { + upvar 1 $varname var + if {![info exists var] || $value < $var} { + set var $value + } +} + + + # everything loaded fine, lets create the test proc: + # OptCreateTestProc + # Don't need the create temp proc anymore: + # rename OptCreateTestProc {} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/opt0.4/pkgIndex.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/opt0.4/pkgIndex.tcl new file mode 100644 index 00000000..23e118cc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/opt0.4/pkgIndex.tcl @@ -0,0 +1,12 @@ +# Tcl package index file, version 1.1 +# This file is generated by the "pkg_mkIndex -direct" command +# and sourced either when an application starts up or +# by a "package unknown" script. It invokes the +# "package ifneeded" command to set up package-related +# information so that packages will be loaded automatically +# in response to "package require" commands. When this +# script is sourced, the variable $dir must contain the +# full path name of this file's directory. + +if {![package vsatisfies [package provide Tcl] 8.5-]} {return} +package ifneeded opt 0.4.8 [list source [file join $dir optparse.tcl]] diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/package.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/package.tcl new file mode 100644 index 00000000..4a733467 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/package.tcl @@ -0,0 +1,751 @@ +# package.tcl -- +# +# utility procs formerly in init.tcl which can be loaded on demand +# for package management. +# +# Copyright (c) 1991-1993 The Regents of the University of California. +# Copyright (c) 1994-1998 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +namespace eval tcl::Pkg {} + +# ::tcl::Pkg::CompareExtension -- +# +# Used internally by pkg_mkIndex to compare the extension of a file to a given +# extension. On Windows, it uses a case-insensitive comparison because the +# file system can be file insensitive. +# +# Arguments: +# fileName name of a file whose extension is compared +# ext (optional) The extension to compare against; you must +# provide the starting dot. +# Defaults to [info sharedlibextension] +# +# Results: +# Returns 1 if the extension matches, 0 otherwise + +proc tcl::Pkg::CompareExtension {fileName {ext {}}} { + global tcl_platform + if {$ext eq ""} {set ext [info sharedlibextension]} + if {$tcl_platform(platform) eq "windows"} { + return [string equal -nocase [file extension $fileName] $ext] + } else { + # Some unices add trailing numbers after the .so, so + # we could have something like '.so.1.2'. + set root $fileName + while {1} { + set currExt [file extension $root] + if {$currExt eq $ext} { + return 1 + } + + # The current extension does not match; if it is not a numeric + # value, quit, as we are only looking to ignore version number + # extensions. Otherwise we might return 1 in this case: + # tcl::Pkg::CompareExtension foo.so.bar .so + # which should not match. + + if {![string is integer -strict [string range $currExt 1 end]]} { + return 0 + } + set root [file rootname $root] + } + } +} + +# pkg_mkIndex -- +# This procedure creates a package index in a given directory. The package +# index consists of a "pkgIndex.tcl" file whose contents are a Tcl script that +# sets up package information with "package require" commands. The commands +# describe all of the packages defined by the files given as arguments. +# +# Arguments: +# -direct (optional) If this flag is present, the generated +# code in pkgMkIndex.tcl will cause the package to be +# loaded when "package require" is executed, rather +# than lazily when the first reference to an exported +# procedure in the package is made. +# -verbose (optional) Verbose output; the name of each file that +# was successfully rocessed is printed out. Additionally, +# if processing of a file failed a message is printed. +# -load pat (optional) Preload any packages whose names match +# the pattern. Used to handle DLLs that depend on +# other packages during their Init procedure. +# dir - Name of the directory in which to create the index. +# args - Any number of additional arguments, each giving +# a glob pattern that matches the names of one or +# more shared libraries or Tcl script files in +# dir. + +proc pkg_mkIndex {args} { + set usage {"pkg_mkIndex ?-direct? ?-lazy? ?-load pattern? ?-verbose? ?--? dir ?pattern ...?"} + + set argCount [llength $args] + if {$argCount < 1} { + return -code error "wrong # args: should be\n$usage" + } + + set more "" + set direct 1 + set doVerbose 0 + set loadPat "" + for {set idx 0} {$idx < $argCount} {incr idx} { + set flag [lindex $args $idx] + switch -glob -- $flag { + -- { + # done with the flags + incr idx + break + } + -verbose { + set doVerbose 1 + } + -lazy { + set direct 0 + append more " -lazy" + } + -direct { + append more " -direct" + } + -load { + incr idx + set loadPat [lindex $args $idx] + append more " -load $loadPat" + } + -* { + return -code error "unknown flag $flag: should be\n$usage" + } + default { + # done with the flags + break + } + } + } + + set dir [lindex $args $idx] + set patternList [lrange $args [expr {$idx + 1}] end] + if {![llength $patternList]} { + set patternList [list "*.tcl" "*[info sharedlibextension]"] + } + + try { + set fileList [glob -directory $dir -tails -types {r f} -- \ + {*}$patternList] + } on error {msg opt} { + return -options $opt $msg + } + foreach file $fileList { + # For each file, figure out what commands and packages it provides. + # To do this, create a child interpreter, load the file into the + # interpreter, and get a list of the new commands and packages that + # are defined. + + if {$file eq "pkgIndex.tcl"} { + continue + } + + set c [interp create] + + # Load into the child any packages currently loaded in the parent + # interpreter that match the -load pattern. + + if {$loadPat ne ""} { + if {$doVerbose} { + tclLog "currently loaded packages: '[info loaded]'" + tclLog "trying to load all packages matching $loadPat" + } + if {![llength [info loaded]]} { + tclLog "warning: no packages are currently loaded, nothing" + tclLog "can possibly match '$loadPat'" + } + } + foreach pkg [info loaded] { + if {![string match -nocase $loadPat [lindex $pkg 1]]} { + continue + } + if {$doVerbose} { + tclLog "package [lindex $pkg 1] matches '$loadPat'" + } + try { + load [lindex $pkg 0] [lindex $pkg 1] $c + } on error err { + if {$doVerbose} { + tclLog "warning: load [lindex $pkg 0]\ + [lindex $pkg 1]\nfailed with: $err" + } + } on ok {} { + if {$doVerbose} { + tclLog "loaded [lindex $pkg 0] [lindex $pkg 1]" + } + } + if {[lindex $pkg 1] eq "Tk"} { + # Withdraw . if Tk was loaded, to avoid showing a window. + $c eval [list wm withdraw .] + } + } + + $c eval { + # Stub out the package command so packages can require other + # packages. + + rename package __package_orig + proc package {what args} { + switch -- $what { + require { + return; # Ignore transitive requires + } + default { + __package_orig $what {*}$args + } + } + } + proc tclPkgUnknown args {} + package unknown tclPkgUnknown + + # Stub out the unknown command so package can call into each other + # during their initialilzation. + + proc unknown {args} {} + + # Stub out the auto_import mechanism + + proc auto_import {args} {} + + # reserve the ::tcl namespace for support procs and temporary + # variables. This might make it awkward to generate a + # pkgIndex.tcl file for the ::tcl namespace. + + namespace eval ::tcl { + variable dir ;# Current directory being processed + variable file ;# Current file being processed + variable direct ;# -direct flag value + variable x ;# Loop variable + variable debug ;# For debugging + variable type ;# "load" or "source", for -direct + variable namespaces ;# Existing namespaces (e.g., ::tcl) + variable packages ;# Existing packages (e.g., Tcl) + variable origCmds ;# Existing commands + variable newCmds ;# Newly created commands + variable newPkgs {} ;# Newly created packages + } + } + + $c eval [list set ::tcl::dir $dir] + $c eval [list set ::tcl::file $file] + $c eval [list set ::tcl::direct $direct] + + # Download needed procedures into the child because we've just deleted + # the unknown procedure. This doesn't handle procedures with default + # arguments. + + foreach p {::tcl::Pkg::CompareExtension} { + $c eval [list namespace eval [namespace qualifiers $p] {}] + $c eval [list proc $p [info args $p] [info body $p]] + } + + try { + $c eval { + set ::tcl::debug "loading or sourcing" + + # we need to track command defined by each package even in the + # -direct case, because they are needed internally by the + # "partial pkgIndex.tcl" step above. + + proc ::tcl::GetAllNamespaces {{root ::}} { + set list $root + foreach ns [namespace children $root] { + lappend list {*}[::tcl::GetAllNamespaces $ns] + } + return $list + } + + # init the list of existing namespaces, packages, commands + + foreach ::tcl::x [::tcl::GetAllNamespaces] { + set ::tcl::namespaces($::tcl::x) 1 + } + foreach ::tcl::x [package names] { + if {[package provide $::tcl::x] ne ""} { + set ::tcl::packages($::tcl::x) 1 + } + } + set ::tcl::origCmds [info commands] + + # Try to load the file if it has the shared library extension, + # otherwise source it. It's important not to try to load + # files that aren't shared libraries, because on some systems + # (like SunOS) the loader will abort the whole application + # when it gets an error. + + if {[::tcl::Pkg::CompareExtension $::tcl::file [info sharedlibextension]]} { + # The "file join ." command below is necessary. Without + # it, if the file name has no \'s and we're on UNIX, the + # load command will invoke the LD_LIBRARY_PATH search + # mechanism, which could cause the wrong file to be used. + + set ::tcl::debug loading + load [file join $::tcl::dir $::tcl::file] + set ::tcl::type load + } else { + set ::tcl::debug sourcing + source [file join $::tcl::dir $::tcl::file] + set ::tcl::type source + } + + # As a performance optimization, if we are creating direct + # load packages, don't bother figuring out the set of commands + # created by the new packages. We only need that list for + # setting up the autoloading used in the non-direct case. + if {!$::tcl::direct} { + # See what new namespaces appeared, and import commands + # from them. Only exported commands go into the index. + + foreach ::tcl::x [::tcl::GetAllNamespaces] { + if {![info exists ::tcl::namespaces($::tcl::x)]} { + namespace import -force ${::tcl::x}::* + } + + # Figure out what commands appeared + + foreach ::tcl::x [info commands] { + set ::tcl::newCmds($::tcl::x) 1 + } + foreach ::tcl::x $::tcl::origCmds { + unset -nocomplain ::tcl::newCmds($::tcl::x) + } + foreach ::tcl::x [array names ::tcl::newCmds] { + # determine which namespace a command comes from + + set ::tcl::abs [namespace origin $::tcl::x] + + # special case so that global names have no + # leading ::, this is required by the unknown + # command + + set ::tcl::abs \ + [lindex [auto_qualify $::tcl::abs ::] 0] + + if {$::tcl::x ne $::tcl::abs} { + # Name changed during qualification + + set ::tcl::newCmds($::tcl::abs) 1 + unset ::tcl::newCmds($::tcl::x) + } + } + } + } + + # Look through the packages that appeared, and if there is a + # version provided, then record it + + foreach ::tcl::x [package names] { + if {[package provide $::tcl::x] ne "" + && ![info exists ::tcl::packages($::tcl::x)]} { + lappend ::tcl::newPkgs \ + [list $::tcl::x [package provide $::tcl::x]] + } + } + } + } on error msg { + set what [$c eval set ::tcl::debug] + if {$doVerbose} { + tclLog "warning: error while $what $file: $msg" + } + } on ok {} { + set what [$c eval set ::tcl::debug] + if {$doVerbose} { + tclLog "successful $what of $file" + } + set type [$c eval set ::tcl::type] + set cmds [lsort [$c eval array names ::tcl::newCmds]] + set pkgs [$c eval set ::tcl::newPkgs] + if {$doVerbose} { + if {!$direct} { + tclLog "commands provided were $cmds" + } + tclLog "packages provided were $pkgs" + } + if {[llength $pkgs] > 1} { + tclLog "warning: \"$file\" provides more than one package ($pkgs)" + } + foreach pkg $pkgs { + # cmds is empty/not used in the direct case + lappend files($pkg) [list $file $type $cmds] + } + + if {$doVerbose} { + tclLog "processed $file" + } + } + interp delete $c + } + + append index "# Tcl package index file, version 1.1\n" + append index "# This file is generated by the \"pkg_mkIndex$more\" command\n" + append index "# and sourced either when an application starts up or\n" + append index "# by a \"package unknown\" script. It invokes the\n" + append index "# \"package ifneeded\" command to set up package-related\n" + append index "# information so that packages will be loaded automatically\n" + append index "# in response to \"package require\" commands. When this\n" + append index "# script is sourced, the variable \$dir must contain the\n" + append index "# full path name of this file's directory.\n" + + foreach pkg [lsort [array names files]] { + set cmd {} + lassign $pkg name version + lappend cmd ::tcl::Pkg::Create -name $name -version $version + foreach spec [lsort -index 0 $files($pkg)] { + foreach {file type procs} $spec { + if {$direct} { + set procs {} + } + lappend cmd "-$type" [list $file $procs] + } + } + append index "\n[eval $cmd]" + } + + set f [open [file join $dir pkgIndex.tcl] w] + puts $f $index + close $f +} + +# tclPkgSetup -- +# This is a utility procedure use by pkgIndex.tcl files. It is invoked as +# part of a "package ifneeded" script. It calls "package provide" to indicate +# that a package is available, then sets entries in the auto_index array so +# that the package's files will be auto-loaded when the commands are used. +# +# Arguments: +# dir - Directory containing all the files for this package. +# pkg - Name of the package (no version number). +# version - Version number for the package, such as 2.1.3. +# files - List of files that constitute the package. Each +# element is a sub-list with three elements. The first +# is the name of a file relative to $dir, the second is +# "load" or "source", indicating whether the file is a +# loadable binary or a script to source, and the third +# is a list of commands defined by this file. + +proc tclPkgSetup {dir pkg version files} { + global auto_index + + package provide $pkg $version + foreach fileInfo $files { + set f [lindex $fileInfo 0] + set type [lindex $fileInfo 1] + foreach cmd [lindex $fileInfo 2] { + if {$type eq "load"} { + set auto_index($cmd) [list load [file join $dir $f] $pkg] + } else { + set auto_index($cmd) [list source [file join $dir $f]] + } + } + } +} + +# tclPkgUnknown -- +# This procedure provides the default for the "package unknown" function. It +# is invoked when a package that's needed can't be found. It scans the +# auto_path directories and their immediate children looking for pkgIndex.tcl +# files and sources any such files that are found to setup the package +# database. As it searches, it will recognize changes to the auto_path and +# scan any new directories. +# +# Arguments: +# name - Name of desired package. Not used. +# version - Version of desired package. Not used. +# exact - Either "-exact" or omitted. Not used. + +proc tclPkgUnknown {name args} { + global auto_path env + + if {![info exists auto_path]} { + return + } + # Cache the auto_path, because it may change while we run through the + # first set of pkgIndex.tcl files + set old_path [set use_path $auto_path] + while {[llength $use_path]} { + set dir [lindex $use_path end] + + # Make sure we only scan each directory one time. + if {[info exists tclSeenPath($dir)]} { + set use_path [lrange $use_path 0 end-1] + continue + } + set tclSeenPath($dir) 1 + + # Get the pkgIndex.tcl files in subdirectories of auto_path directories. + # - Safe Base interpreters have a restricted "glob" command that + # works in this case. + # - The "catch" was essential when there was no safe glob and every + # call in a safe interp failed; it is retained only for corner + # cases in which the eventual call to glob returns an error. + catch { + foreach file [glob -directory $dir -join -nocomplain \ + * pkgIndex.tcl] { + set dir [file dirname $file] + if {![info exists procdDirs($dir)]} { + try { + source $file + } trap {POSIX EACCES} {} { + # $file was not readable; silently ignore + continue + } on error msg { + tclLog "error reading package index file $file: $msg" + } on ok {} { + set procdDirs($dir) 1 + } + } + } + } + set dir [lindex $use_path end] + if {![info exists procdDirs($dir)]} { + set file [file join $dir pkgIndex.tcl] + # safe interps usually don't have "file exists", + if {([interp issafe] || [file exists $file])} { + try { + source $file + } trap {POSIX EACCES} {} { + # $file was not readable; silently ignore + continue + } on error msg { + tclLog "error reading package index file $file: $msg" + } on ok {} { + set procdDirs($dir) 1 + } + } + } + + set use_path [lrange $use_path 0 end-1] + + # Check whether any of the index scripts we [source]d above set a new + # value for $::auto_path. If so, then find any new directories on the + # $::auto_path, and lappend them to the $use_path we are working from. + # This gives index scripts the (arguably unwise) power to expand the + # index script search path while the search is in progress. + set index 0 + if {[llength $old_path] == [llength $auto_path]} { + foreach dir $auto_path old $old_path { + if {$dir ne $old} { + # This entry in $::auto_path has changed. + break + } + incr index + } + } + + # $index now points to the first element of $auto_path that has + # changed, or the beginning if $auto_path has changed length Scan the + # new elements of $auto_path for directories to add to $use_path. + # Don't add directories we've already seen, or ones already on the + # $use_path. + foreach dir [lrange $auto_path $index end] { + if {![info exists tclSeenPath($dir)] && ($dir ni $use_path)} { + lappend use_path $dir + } + } + set old_path $auto_path + } +} + +# tcl::MacOSXPkgUnknown -- +# This procedure extends the "package unknown" function for MacOSX. It scans +# the Resources/Scripts directories of the immediate children of the auto_path +# directories for pkgIndex files. +# +# Arguments: +# original - original [package unknown] procedure +# name - Name of desired package. Not used. +# version - Version of desired package. Not used. +# exact - Either "-exact" or omitted. Not used. + +proc tcl::MacOSXPkgUnknown {original name args} { + # First do the cross-platform default search + uplevel 1 $original [linsert $args 0 $name] + + # Now do MacOSX specific searching + global auto_path + + if {![info exists auto_path]} { + return + } + # Cache the auto_path, because it may change while we run through the + # first set of pkgIndex.tcl files + set old_path [set use_path $auto_path] + while {[llength $use_path]} { + set dir [lindex $use_path end] + + # Make sure we only scan each directory one time. + if {[info exists tclSeenPath($dir)]} { + set use_path [lrange $use_path 0 end-1] + continue + } + set tclSeenPath($dir) 1 + + # get the pkgIndex files out of the subdirectories + # Safe interpreters do not use tcl::MacOSXPkgUnknown - see init.tcl. + foreach file [glob -directory $dir -join -nocomplain \ + * Resources Scripts pkgIndex.tcl] { + set dir [file dirname $file] + if {![info exists procdDirs($dir)]} { + try { + source $file + } trap {POSIX EACCES} {} { + # $file was not readable; silently ignore + continue + } on error msg { + tclLog "error reading package index file $file: $msg" + } on ok {} { + set procdDirs($dir) 1 + } + } + } + set use_path [lrange $use_path 0 end-1] + + # Check whether any of the index scripts we [source]d above set a new + # value for $::auto_path. If so, then find any new directories on the + # $::auto_path, and lappend them to the $use_path we are working from. + # This gives index scripts the (arguably unwise) power to expand the + # index script search path while the search is in progress. + set index 0 + if {[llength $old_path] == [llength $auto_path]} { + foreach dir $auto_path old $old_path { + if {$dir ne $old} { + # This entry in $::auto_path has changed. + break + } + incr index + } + } + + # $index now points to the first element of $auto_path that has + # changed, or the beginning if $auto_path has changed length Scan the + # new elements of $auto_path for directories to add to $use_path. + # Don't add directories we've already seen, or ones already on the + # $use_path. + foreach dir [lrange $auto_path $index end] { + if {![info exists tclSeenPath($dir)] && ($dir ni $use_path)} { + lappend use_path $dir + } + } + set old_path $auto_path + } +} + +# ::tcl::Pkg::Create -- +# +# Given a package specification generate a "package ifneeded" statement +# for the package, suitable for inclusion in a pkgIndex.tcl file. +# +# Arguments: +# args arguments used by the Create function: +# -name packageName +# -version packageVersion +# -load {filename ?{procs}?} +# ... +# -source {filename ?{procs}?} +# ... +# +# Any number of -load and -source parameters may be +# specified, so long as there is at least one -load or +# -source parameter. If the procs component of a module +# specifier is left off, that module will be set up for +# direct loading; otherwise, it will be set up for lazy +# loading. If both -source and -load are specified, the +# -load'ed files will be loaded first, followed by the +# -source'd files. +# +# Results: +# An appropriate "package ifneeded" statement for the package. + +proc ::tcl::Pkg::Create {args} { + append err(usage) "[lindex [info level 0] 0] " + append err(usage) "-name packageName -version packageVersion" + append err(usage) "?-load {filename ?{procs}?}? ... " + append err(usage) "?-source {filename ?{procs}?}? ..." + + set err(wrongNumArgs) "wrong # args: should be \"$err(usage)\"" + set err(valueMissing) "value for \"%s\" missing: should be \"$err(usage)\"" + set err(unknownOpt) "unknown option \"%s\": should be \"$err(usage)\"" + set err(noLoadOrSource) "at least one of -load and -source must be given" + + # process arguments + set len [llength $args] + if {$len < 6} { + error $err(wrongNumArgs) + } + + # Initialize parameters + array set opts {-name {} -version {} -source {} -load {}} + + # process parameters + for {set i 0} {$i < $len} {incr i} { + set flag [lindex $args $i] + incr i + switch -glob -- $flag { + "-name" - + "-version" { + if {$i >= $len} { + error [format $err(valueMissing) $flag] + } + set opts($flag) [lindex $args $i] + } + "-source" - + "-load" { + if {$i >= $len} { + error [format $err(valueMissing) $flag] + } + lappend opts($flag) [lindex $args $i] + } + default { + error [format $err(unknownOpt) [lindex $args $i]] + } + } + } + + # Validate the parameters + if {![llength $opts(-name)]} { + error [format $err(valueMissing) "-name"] + } + if {![llength $opts(-version)]} { + error [format $err(valueMissing) "-version"] + } + + if {!([llength $opts(-source)] || [llength $opts(-load)])} { + error $err(noLoadOrSource) + } + + # OK, now everything is good. Generate the package ifneeded statment. + set cmdline "package ifneeded $opts(-name) $opts(-version) " + + set cmdList {} + set lazyFileList {} + + # Handle -load and -source specs + foreach key {load source} { + foreach filespec $opts(-$key) { + lassign $filespec filename proclist + + if { [llength $proclist] == 0 } { + set cmd "\[list $key \[file join \$dir [list $filename]\]\]" + lappend cmdList $cmd + } else { + lappend lazyFileList [list $filename $key $proclist] + } + } + } + + if {[llength $lazyFileList]} { + lappend cmdList "\[list tclPkgSetup \$dir $opts(-name)\ + $opts(-version) [list $lazyFileList]\]" + } + append cmdline [join $cmdList "\\n"] + return $cmdline +} + +interp alias {} ::pkg::create {} ::tcl::Pkg::Create diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/parray.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/parray.tcl new file mode 100644 index 00000000..a9c2cb15 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/parray.tcl @@ -0,0 +1,28 @@ +# parray: +# Print the contents of a global array on stdout. +# +# Copyright (c) 1991-1993 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +proc parray {a {pattern *}} { + upvar 1 $a array + if {![array exists array]} { + return -code error "\"$a\" isn't an array" + } + set maxl 0 + set names [lsort [array names array $pattern]] + foreach name $names { + if {[string length $name] > $maxl} { + set maxl [string length $name] + } + } + set maxl [expr {$maxl + [string length $a] + 2}] + foreach name $names { + set nameString [format %s(%s) $a $name] + puts stdout [format "%-*s = %s" $maxl $nameString $array($name)] + } +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/safe.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/safe.tcl new file mode 100644 index 00000000..59e4c90b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/safe.tcl @@ -0,0 +1,1289 @@ +# safe.tcl -- +# +# This file provide a safe loading/sourcing mechanism for safe interpreters. +# It implements a virtual path mechanism to hide the real pathnames from the +# child. It runs in a parent interpreter and sets up data structure and +# aliases that will be invoked when used from a child interpreter. +# +# See the safe.n man page for details. +# +# Copyright (c) 1996-1997 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution of +# this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# +# The implementation is based on namespaces. These naming conventions are +# followed: +# Private procs starts with uppercase. +# Public procs are exported and starts with lowercase +# + +# Needed utilities package +package require opt 0.4.8 + +# Create the safe namespace +namespace eval ::safe { + # Exported API: + namespace export interpCreate interpInit interpConfigure interpDelete \ + interpAddToAccessPath interpFindInAccessPath setLogCmd +} + +# Helper function to resolve the dual way of specifying staticsok (either +# by -noStatics or -statics 0) +proc ::safe::InterpStatics {} { + foreach v {Args statics noStatics} { + upvar $v $v + } + set flag [::tcl::OptProcArgGiven -noStatics] + if {$flag && (!$noStatics == !$statics) + && ([::tcl::OptProcArgGiven -statics])} { + return -code error\ + "conflicting values given for -statics and -noStatics" + } + if {$flag} { + return [expr {!$noStatics}] + } else { + return $statics + } +} + +# Helper function to resolve the dual way of specifying nested loading +# (either by -nestedLoadOk or -nested 1) +proc ::safe::InterpNested {} { + foreach v {Args nested nestedLoadOk} { + upvar $v $v + } + set flag [::tcl::OptProcArgGiven -nestedLoadOk] + # note that the test here is the opposite of the "InterpStatics" one + # (it is not -noNested... because of the wanted default value) + if {$flag && (!$nestedLoadOk != !$nested) + && ([::tcl::OptProcArgGiven -nested])} { + return -code error\ + "conflicting values given for -nested and -nestedLoadOk" + } + if {$flag} { + # another difference with "InterpStatics" + return $nestedLoadOk + } else { + return $nested + } +} + +#### +# +# API entry points that needs argument parsing : +# +#### + +# Interface/entry point function and front end for "Create" +proc ::safe::interpCreate {args} { + set Args [::tcl::OptKeyParse ::safe::interpCreate $args] + RejectExcessColons $slave + InterpCreate $slave $accessPath \ + [InterpStatics] [InterpNested] $deleteHook +} + +proc ::safe::interpInit {args} { + set Args [::tcl::OptKeyParse ::safe::interpIC $args] + if {![::interp exists $slave]} { + return -code error "\"$slave\" is not an interpreter" + } + RejectExcessColons $slave + InterpInit $slave $accessPath \ + [InterpStatics] [InterpNested] $deleteHook +} + +# Check that the given child is "one of us" +proc ::safe::CheckInterp {child} { + namespace upvar ::safe [VarName $child] state + if {![info exists state] || ![::interp exists $child]} { + return -code error \ + "\"$child\" is not an interpreter managed by ::safe::" + } +} + +# Interface/entry point function and front end for "Configure". This code +# is awfully pedestrian because it would need more coupling and support +# between the way we store the configuration values in safe::interp's and +# the Opt package. Obviously we would like an OptConfigure to avoid +# duplicating all this code everywhere. +# -> TODO (the app should share or access easily the program/value stored +# by opt) + +# This is even more complicated by the boolean flags with no values that +# we had the bad idea to support for the sake of user simplicity in +# create/init but which makes life hard in configure... +# So this will be hopefully written and some integrated with opt1.0 +# (hopefully for tcl8.1 ?) +proc ::safe::interpConfigure {args} { + switch [llength $args] { + 1 { + # If we have exactly 1 argument the semantic is to return all + # the current configuration. We still call OptKeyParse though + # we know that "child" is our given argument because it also + # checks for the "-help" option. + set Args [::tcl::OptKeyParse ::safe::interpIC $args] + CheckInterp $slave + namespace upvar ::safe [VarName $slave] state + + return [join [list \ + [list -accessPath $state(access_path)] \ + [list -statics $state(staticsok)] \ + [list -nested $state(nestedok)] \ + [list -deleteHook $state(cleanupHook)]]] + } + 2 { + # If we have exactly 2 arguments the semantic is a "configure + # get" + lassign $args slave arg + + # get the flag sub program (we 'know' about Opt's internal + # representation of data) + set desc [lindex [::tcl::OptKeyGetDesc ::safe::interpIC] 2] + set hits [::tcl::OptHits desc $arg] + if {$hits > 1} { + return -code error [::tcl::OptAmbigous $desc $arg] + } elseif {$hits == 0} { + return -code error [::tcl::OptFlagUsage $desc $arg] + } + CheckInterp $slave + namespace upvar ::safe [VarName $slave] state + + set item [::tcl::OptCurDesc $desc] + set name [::tcl::OptName $item] + switch -exact -- $name { + -accessPath { + return [list -accessPath $state(access_path)] + } + -statics { + return [list -statics $state(staticsok)] + } + -nested { + return [list -nested $state(nestedok)] + } + -deleteHook { + return [list -deleteHook $state(cleanupHook)] + } + -noStatics { + # it is most probably a set in fact but we would need + # then to jump to the set part and it is not *sure* + # that it is a set action that the user want, so force + # it to use the unambigous -statics ?value? instead: + return -code error\ + "ambigous query (get or set -noStatics ?)\ + use -statics instead" + } + -nestedLoadOk { + return -code error\ + "ambigous query (get or set -nestedLoadOk ?)\ + use -nested instead" + } + default { + return -code error "unknown flag $name (bug)" + } + } + } + default { + # Otherwise we want to parse the arguments like init and + # create did + set Args [::tcl::OptKeyParse ::safe::interpIC $args] + CheckInterp $slave + namespace upvar ::safe [VarName $slave] state + + # Get the current (and not the default) values of whatever has + # not been given: + if {![::tcl::OptProcArgGiven -accessPath]} { + set doreset 0 + set accessPath $state(access_path) + } else { + set doreset 1 + } + if { + ![::tcl::OptProcArgGiven -statics] + && ![::tcl::OptProcArgGiven -noStatics] + } then { + set statics $state(staticsok) + } else { + set statics [InterpStatics] + } + if { + [::tcl::OptProcArgGiven -nested] || + [::tcl::OptProcArgGiven -nestedLoadOk] + } then { + set nested [InterpNested] + } else { + set nested $state(nestedok) + } + if {![::tcl::OptProcArgGiven -deleteHook]} { + set deleteHook $state(cleanupHook) + } + # we can now reconfigure : + InterpSetConfig $slave $accessPath $statics $nested $deleteHook + # auto_reset the child (to completly synch the new access_path) + if {$doreset} { + if {[catch {::interp eval $slave {auto_reset}} msg]} { + Log $slave "auto_reset failed: $msg" + } else { + Log $slave "successful auto_reset" NOTICE + } + + # Sync the paths used to search for Tcl modules. + ::interp eval $slave {tcl::tm::path remove {*}[tcl::tm::list]} + if {[llength $state(tm_path_slave)] > 0} { + ::interp eval $slave [list \ + ::tcl::tm::add {*}[lreverse $state(tm_path_slave)]] + } + + # Remove stale "package ifneeded" data for non-loaded packages. + # - Not for loaded packages, because "package forget" erases + # data from "package provide" as well as "package ifneeded". + # - This is OK because the script cannot reload any version of + # the package unless it first does "package forget". + foreach pkg [::interp eval $slave {package names}] { + if {[::interp eval $slave [list package provide $pkg]] eq ""} { + ::interp eval $slave [list package forget $pkg] + } + } + } + return + } + } +} + +#### +# +# Functions that actually implements the exported APIs +# +#### + +# +# safe::InterpCreate : doing the real job +# +# This procedure creates a safe interpreter and initializes it with the safe +# base aliases. +# NB: child name must be simple alphanumeric string, no spaces, no (), no +# {},... {because the state array is stored as part of the name} +# +# Returns the child name. +# +# Optional Arguments : +# + child name : if empty, generated name will be used +# + access_path: path list controlling where load/source can occur, +# if empty: the parent auto_path will be used. +# + staticsok : flag, if 0 :no static package can be loaded (load {} Xxx) +# if 1 :static packages are ok. +# + nestedok: flag, if 0 :no loading to sub-sub interps (load xx xx sub) +# if 1 : multiple levels are ok. + +# use the full name and no indent so auto_mkIndex can find us +proc ::safe::InterpCreate { + child + access_path + staticsok + nestedok + deletehook + } { + # Create the child. + # If evaluated in ::safe, the interpreter command for foo is ::foo; + # but for foo::bar is safe::foo::bar. So evaluate in :: instead. + if {$child ne ""} { + namespace eval :: [list ::interp create -safe $child] + } else { + # empty argument: generate child name + set child [::interp create -safe] + } + Log $child "Created" NOTICE + + # Initialize it. (returns child name) + InterpInit $child $access_path $staticsok $nestedok $deletehook +} + +# +# InterpSetConfig (was setAccessPath) : +# Sets up child virtual auto_path and corresponding structure within +# the parent. Also sets the tcl_library in the child to be the first +# directory in the path. +# NB: If you change the path after the child has been initialized you +# probably need to call "auto_reset" in the child in order that it gets +# the right auto_index() array values. + +proc ::safe::InterpSetConfig {child access_path staticsok nestedok deletehook} { + global auto_path + + # determine and store the access path if empty + if {$access_path eq ""} { + set access_path $auto_path + + # Make sure that tcl_library is in auto_path and at the first + # position (needed by setAccessPath) + set where [lsearch -exact $access_path [info library]] + if {$where < 0} { + # not found, add it. + set access_path [linsert $access_path 0 [info library]] + Log $child "tcl_library was not in auto_path,\ + added it to slave's access_path" NOTICE + } elseif {$where != 0} { + # not first, move it first + set access_path [linsert \ + [lreplace $access_path $where $where] \ + 0 [info library]] + Log $child "tcl_libray was not in first in auto_path,\ + moved it to front of slave's access_path" NOTICE + } + + # Add 1st level sub dirs (will searched by auto loading from tcl + # code in the child using glob and thus fail, so we add them here + # so by default it works the same). + set access_path [AddSubDirs $access_path] + } + + Log $child "Setting accessPath=($access_path) staticsok=$staticsok\ + nestedok=$nestedok deletehook=($deletehook)" NOTICE + + namespace upvar ::safe [VarName $child] state + + # clear old autopath if it existed + # build new one + # Extend the access list with the paths used to look for Tcl Modules. + # We save the virtual form separately as well, as syncing it with the + # child has to be deferred until the necessary commands are present for + # setup. + + set norm_access_path {} + set slave_access_path {} + set map_access_path {} + set remap_access_path {} + set slave_tm_path {} + + set i 0 + foreach dir $access_path { + set token [PathToken $i] + lappend slave_access_path $token + lappend map_access_path $token $dir + lappend remap_access_path $dir $token + lappend norm_access_path [file normalize $dir] + incr i + } + + set morepaths [::tcl::tm::list] + set firstpass 1 + while {[llength $morepaths]} { + set addpaths $morepaths + set morepaths {} + + foreach dir $addpaths { + # Prevent the addition of dirs on the tm list to the + # result if they are already known. + if {[dict exists $remap_access_path $dir]} { + if {$firstpass} { + # $dir is in [::tcl::tm::list] and belongs in the slave_tm_path. + # Later passes handle subdirectories, which belong in the + # access path but not in the module path. + lappend slave_tm_path [dict get $remap_access_path $dir] + } + continue + } + + set token [PathToken $i] + lappend access_path $dir + lappend slave_access_path $token + lappend map_access_path $token $dir + lappend remap_access_path $dir $token + lappend norm_access_path [file normalize $dir] + if {$firstpass} { + # $dir is in [::tcl::tm::list] and belongs in the slave_tm_path. + # Later passes handle subdirectories, which belong in the + # access path but not in the module path. + lappend slave_tm_path $token + } + incr i + + # [Bug 2854929] + # Recursively find deeper paths which may contain + # modules. Required to handle modules with names like + # 'platform::shell', which translate into + # 'platform/shell-X.tm', i.e arbitrarily deep + # subdirectories. + lappend morepaths {*}[glob -nocomplain -directory $dir -type d *] + } + set firstpass 0 + } + + set state(access_path) $access_path + set state(access_path,map) $map_access_path + set state(access_path,remap) $remap_access_path + set state(access_path,norm) $norm_access_path + set state(access_path,slave) $slave_access_path + set state(tm_path_slave) $slave_tm_path + set state(staticsok) $staticsok + set state(nestedok) $nestedok + set state(cleanupHook) $deletehook + + SyncAccessPath $child + return +} + +# +# +# FindInAccessPath: +# Search for a real directory and returns its virtual Id (including the +# "$") +proc ::safe::interpFindInAccessPath {child path} { + CheckInterp $child + namespace upvar ::safe [VarName $child] state + + if {![dict exists $state(access_path,remap) $path]} { + return -code error "$path not found in access path" + } + + return [dict get $state(access_path,remap) $path] +} + +# +# addToAccessPath: +# add (if needed) a real directory to access path and return its +# virtual token (including the "$"). +proc ::safe::interpAddToAccessPath {child path} { + # first check if the directory is already in there + # (inlined interpFindInAccessPath). + CheckInterp $child + namespace upvar ::safe [VarName $child] state + + if {[dict exists $state(access_path,remap) $path]} { + return [dict get $state(access_path,remap) $path] + } + + # new one, add it: + set token [PathToken [llength $state(access_path)]] + + lappend state(access_path) $path + lappend state(access_path,slave) $token + lappend state(access_path,map) $token $path + lappend state(access_path,remap) $path $token + lappend state(access_path,norm) [file normalize $path] + + SyncAccessPath $child + return $token +} + +# This procedure applies the initializations to an already existing +# interpreter. It is useful when you want to install the safe base aliases +# into a preexisting safe interpreter. +proc ::safe::InterpInit { + child + access_path + staticsok + nestedok + deletehook + } { + # Configure will generate an access_path when access_path is empty. + InterpSetConfig $child $access_path $staticsok $nestedok $deletehook + + # NB we need to add [namespace current], aliases are always absolute + # paths. + + # These aliases let the child load files to define new commands + # This alias lets the child use the encoding names, convertfrom, + # convertto, and system, but not "encoding system " to set the + # system encoding. + # Handling Tcl Modules, we need a restricted form of Glob. + # This alias interposes on the 'exit' command and cleanly terminates + # the child. + + foreach {command alias} { + source AliasSource + load AliasLoad + encoding AliasEncoding + exit interpDelete + glob AliasGlob + } { + ::interp alias $child $command {} [namespace current]::$alias $child + } + + # This alias lets the child have access to a subset of the 'file' + # command functionality. + + ::interp expose $child file + foreach subcommand {dirname extension rootname tail} { + ::interp alias $child ::tcl::file::$subcommand {} \ + ::safe::AliasFileSubcommand $child $subcommand + } + foreach subcommand { + atime attributes copy delete executable exists isdirectory isfile + link lstat mtime mkdir nativename normalize owned readable readlink + rename size stat tempfile type volumes writable + } { + ::interp alias $child ::tcl::file::$subcommand {} \ + ::safe::BadSubcommand $child file $subcommand + } + + # Subcommands of info + foreach {subcommand alias} { + nameofexecutable AliasExeName + } { + ::interp alias $child ::tcl::info::$subcommand \ + {} [namespace current]::$alias $child + } + + # The allowed child variables already have been set by Tcl_MakeSafe(3) + + # Source init.tcl and tm.tcl into the child, to get auto_load and + # other procedures defined: + + if {[catch {::interp eval $child { + source [file join $tcl_library init.tcl] + }} msg opt]} { + Log $child "can't source init.tcl ($msg)" + return -options $opt "can't source init.tcl into slave $child ($msg)" + } + + if {[catch {::interp eval $child { + source [file join $tcl_library tm.tcl] + }} msg opt]} { + Log $child "can't source tm.tcl ($msg)" + return -options $opt "can't source tm.tcl into slave $child ($msg)" + } + + # Sync the paths used to search for Tcl modules. This can be done only + # now, after tm.tcl was loaded. + namespace upvar ::safe [VarName $child] state + if {[llength $state(tm_path_slave)] > 0} { + ::interp eval $child [list \ + ::tcl::tm::add {*}[lreverse $state(tm_path_slave)]] + } + return $child +} + +# Add (only if needed, avoid duplicates) 1 level of sub directories to an +# existing path list. Also removes non directories from the returned +# list. +proc ::safe::AddSubDirs {pathList} { + set res {} + foreach dir $pathList { + if {[file isdirectory $dir]} { + # check that we don't have it yet as a children of a previous + # dir + if {$dir ni $res} { + lappend res $dir + } + foreach sub [glob -directory $dir -nocomplain *] { + if {[file isdirectory $sub] && ($sub ni $res)} { + # new sub dir, add it ! + lappend res $sub + } + } + } + } + return $res +} + +# This procedure deletes a safe interpreter managed by Safe Tcl and cleans up +# associated state. +# - The command will also delete non-Safe-Base interpreters. +# - This is regrettable, but to avoid breaking existing code this should be +# amended at the next major revision by uncommenting "CheckInterp". + +proc ::safe::interpDelete {child} { + Log $child "About to delete" NOTICE + + # CheckInterp $child + namespace upvar ::safe [VarName $child] state + + # When an interpreter is deleted with [interp delete], any sub-interpreters + # are deleted automatically, but this leaves behind their data in the Safe + # Base. To clean up properly, we call safe::interpDelete recursively on each + # Safe Base sub-interpreter, so each one is deleted cleanly and not by + # the automatic mechanism built into [interp delete]. + foreach sub [interp children $child] { + if {[info exists ::safe::[VarName [list $child $sub]]]} { + ::safe::interpDelete [list $child $sub] + } + } + + # If the child has a cleanup hook registered, call it. Check the + # existance because we might be called to delete an interp which has + # not been registered with us at all + + if {[info exists state(cleanupHook)]} { + set hook $state(cleanupHook) + if {[llength $hook]} { + # remove the hook now, otherwise if the hook calls us somehow, + # we'll loop + unset state(cleanupHook) + try { + {*}$hook $child + } on error err { + Log $child "Delete hook error ($err)" + } + } + } + + # Discard the global array of state associated with the child, and + # delete the interpreter. + + if {[info exists state]} { + unset state + } + + # if we have been called twice, the interp might have been deleted + # already + if {[::interp exists $child]} { + ::interp delete $child + Log $child "Deleted" NOTICE + } + + return +} + +# Set (or get) the logging mecanism + +proc ::safe::setLogCmd {args} { + variable Log + set la [llength $args] + if {$la == 0} { + return $Log + } elseif {$la == 1} { + set Log [lindex $args 0] + } else { + set Log $args + } + + if {$Log eq ""} { + # Disable logging completely. Calls to it will be compiled out + # of all users. + proc ::safe::Log {args} {} + } else { + # Activate logging, define proper command. + + proc ::safe::Log {child msg {type ERROR}} { + variable Log + {*}$Log "$type for slave $child : $msg" + return + } + } +} + +# ------------------- END OF PUBLIC METHODS ------------ + +# +# Sets the child auto_path to the parent recorded value. Also sets +# tcl_library to the first token of the virtual path. +# +proc ::safe::SyncAccessPath {child} { + namespace upvar ::safe [VarName $child] state + + set slave_access_path $state(access_path,slave) + ::interp eval $child [list set auto_path $slave_access_path] + + Log $child "auto_path in $child has been set to $slave_access_path"\ + NOTICE + + # This code assumes that info library is the first element in the + # list of auto_path's. See -> InterpSetConfig for the code which + # ensures this condition. + + ::interp eval $child [list \ + set tcl_library [lindex $slave_access_path 0]] +} + +# Returns the virtual token for directory number N. +proc ::safe::PathToken {n} { + # We need to have a ":" in the token string so [file join] on the + # mac won't turn it into a relative path. + return "\$p(:$n:)" ;# Form tested by case 7.2 +} + +# +# translate virtual path into real path +# +proc ::safe::TranslatePath {child path} { + namespace upvar ::safe [VarName $child] state + + # somehow strip the namespaces 'functionality' out (the danger is that + # we would strip valid macintosh "../" queries... : + if {[string match "*::*" $path] || [string match "*..*" $path]} { + return -code error "invalid characters in path $path" + } + + # Use a cached map instead of computed local vars and subst. + + return [string map $state(access_path,map) $path] +} + +# file name control (limit access to files/resources that should be a +# valid tcl source file) +proc ::safe::CheckFileName {child file} { + # This used to limit what can be sourced to ".tcl" and forbid files + # with more than 1 dot and longer than 14 chars, but I changed that + # for 8.4 as a safe interp has enough internal protection already to + # allow sourcing anything. - hobbs + + if {![file exists $file]} { + # don't tell the file path + return -code error "no such file or directory" + } + + if {![file readable $file]} { + # don't tell the file path + return -code error "not readable" + } +} + +# AliasFileSubcommand handles selected subcommands of [file] in safe +# interpreters that are *almost* safe. In particular, it just acts to +# prevent discovery of what home directories exist. + +proc ::safe::AliasFileSubcommand {child subcommand name} { + if {[string match ~* $name]} { + set name ./$name + } + tailcall ::interp invokehidden $child tcl:file:$subcommand $name +} + +# AliasGlob is the target of the "glob" alias in safe interpreters. + +proc ::safe::AliasGlob {child args} { + Log $child "GLOB ! $args" NOTICE + set cmd {} + set at 0 + array set got { + -directory 0 + -nocomplain 0 + -join 0 + -tails 0 + -- 0 + } + + if {$::tcl_platform(platform) eq "windows"} { + set dirPartRE {^(.*)[\\/]([^\\/]*)$} + } else { + set dirPartRE {^(.*)/([^/]*)$} + } + + set dir {} + set virtualdir {} + + while {$at < [llength $args]} { + switch -glob -- [set opt [lindex $args $at]] { + -nocomplain - -- - -tails { + lappend cmd $opt + set got($opt) 1 + incr at + } + -join { + set got($opt) 1 + incr at + } + -types - -type { + lappend cmd -types [lindex $args [incr at]] + incr at + } + -directory { + if {$got($opt)} { + return -code error \ + {"-directory" cannot be used with "-path"} + } + set got($opt) 1 + set virtualdir [lindex $args [incr at]] + incr at + } + -* { + Log $child "Safe base rejecting glob option '$opt'" + return -code error "Safe base rejecting glob option '$opt'" + } + default { + break + } + } + if {$got(--)} break + } + + # Get the real path from the virtual one and check that the path is in the + # access path of that child. Done after basic argument processing so that + # we know if -nocomplain is set. + if {$got(-directory)} { + try { + set dir [TranslatePath $child $virtualdir] + DirInAccessPath $child $dir + } on error msg { + Log $child $msg + if {$got(-nocomplain)} return + return -code error "permission denied" + } + if {$got(--)} { + set cmd [linsert $cmd end-1 -directory $dir] + } else { + lappend cmd -directory $dir + } + } else { + # The code after this "if ... else" block would conspire to return with + # no results in this case, if it were allowed to proceed. Instead, + # return now and reduce the number of cases to be considered later. + Log $child {option -directory must be supplied} + if {$got(-nocomplain)} return + return -code error "permission denied" + } + + # Apply the -join semantics ourselves. + if {$got(-join)} { + set args [lreplace $args $at end [join [lrange $args $at end] "/"]] + } + + # Process the pattern arguments. If we've done a join there is only one + # pattern argument. + + set firstPattern [llength $cmd] + foreach opt [lrange $args $at end] { + if {![regexp $dirPartRE $opt -> thedir thefile]} { + set thedir . + # The *.tm search comes here. + } + # "Special" treatment for (joined) argument {*/pkgIndex.tcl}. + # Do the expansion of "*" here, and filter out any directories that are + # not in the access path. The outcome is to lappend to cmd a path of + # the form $virtualdir/subdir/pkgIndex.tcl for each subdirectory subdir, + # after removing any subdir that are not in the access path. + if {($thedir eq "*") && ($thefile eq "pkgIndex.tcl")} { + set mapped 0 + foreach d [glob -directory [TranslatePath $child $virtualdir] \ + -types d -tails *] { + catch { + DirInAccessPath $child \ + [TranslatePath $child [file join $virtualdir $d]] + lappend cmd [file join $d $thefile] + set mapped 1 + } + } + if {$mapped} continue + # Don't [continue] if */pkgIndex.tcl has no matches in the access + # path. The pattern will now receive the same treatment as a + # "non-special" pattern (and will fail because it includes a "*" in + # the directory name). + } + # Any directory pattern that is not an exact (i.e. non-glob) match to a + # directory in the access path will be rejected here. + # - Rejections include any directory pattern that has glob matching + # patterns "*", "?", backslashes, braces or square brackets, (UNLESS + # it corresponds to a genuine directory name AND that directory is in + # the access path). + # - The only "special matching characters" that remain in patterns for + # processing by glob are in the filename tail. + # - [file join $anything ~${foo}] is ~${foo}, which is not an exact + # match to any directory in the access path. Hence directory patterns + # that begin with "~" are rejected here. Tests safe-16.[5-8] check + # that "file join" remains as required and does not expand ~${foo}. + # - Bug [3529949] relates to unwanted expansion of ~${foo} and this is + # how the present code avoids the bug. All tests safe-16.* relate. + try { + DirInAccessPath $child [TranslatePath $child \ + [file join $virtualdir $thedir]] + } on error msg { + Log $child $msg + if {$got(-nocomplain)} continue + return -code error "permission denied" + } + lappend cmd $opt + } + + Log $child "GLOB = $cmd" NOTICE + + if {$got(-nocomplain) && [llength $cmd] eq $firstPattern} { + return + } + try { + # >>>>>>>>>> HERE'S THE CALL TO SAFE INTERP GLOB <<<<<<<<<< + # - Pattern arguments added to cmd have NOT been translated from tokens. + # Only the virtualdir is translated (to dir). + # - In the pkgIndex.tcl case, there is no "*" in the pattern arguments, + # which are a list of names each with tail pkgIndex.tcl. The purpose + # of the call to glob is to remove the names for which the file does + # not exist. + set entries [::interp invokehidden $child glob {*}$cmd] + } on error msg { + # This is the only place that a call with -nocomplain and no invalid + # "dash-options" can return an error. + Log $child $msg + return -code error "script error" + } + + Log $child "GLOB < $entries" NOTICE + + # Translate path back to what the child should see. + set res {} + set l [string length $dir] + foreach p $entries { + if {[string equal -length $l $dir $p]} { + set p [string replace $p 0 [expr {$l-1}] $virtualdir] + } + lappend res $p + } + + Log $child "GLOB > $res" NOTICE + return $res +} + +# AliasSource is the target of the "source" alias in safe interpreters. + +proc ::safe::AliasSource {child args} { + set argc [llength $args] + # Extended for handling of Tcl Modules to allow not only "source + # filename", but "source -encoding E filename" as well. + if {[lindex $args 0] eq "-encoding"} { + incr argc -2 + set encoding [lindex $args 1] + set at 2 + if {$encoding eq "identity"} { + Log $child "attempt to use the identity encoding" + return -code error "permission denied" + } + } else { + set at 0 + set encoding {} + } + if {$argc != 1} { + set msg "wrong # args: should be \"source ?-encoding E? fileName\"" + Log $child "$msg ($args)" + return -code error $msg + } + set file [lindex $args $at] + + # get the real path from the virtual one. + if {[catch { + set realfile [TranslatePath $child $file] + } msg]} { + Log $child $msg + return -code error "permission denied" + } + + # check that the path is in the access path of that child + if {[catch { + FileInAccessPath $child $realfile + } msg]} { + Log $child $msg + return -code error "permission denied" + } + + # Check that the filename exists and is readable. If it is not, deliver + # this -errorcode so that caller in tclPkgUnknown does not write a message + # to tclLog. Has no effect on other callers of ::source, which are in + # "package ifneeded" scripts. + if {[catch { + CheckFileName $child $realfile + } msg]} { + Log $child "$realfile:$msg" + return -code error -errorcode {POSIX EACCES} $msg + } + + # Passed all the tests, lets source it. Note that we do this all manually + # because we want to control [info script] in the child so information + # doesn't leak so much. [Bug 2913625] + set old [::interp eval $child {info script}] + set replacementMsg "script error" + set code [catch { + set f [open $realfile] + fconfigure $f -eofchar "\032 {}" + if {$encoding ne ""} { + fconfigure $f -encoding $encoding + } + set contents [read $f] + close $f + ::interp eval $child [list info script $file] + } msg opt] + if {$code == 0} { + set code [catch {::interp eval $child $contents} msg opt] + set replacementMsg $msg + } + catch {interp eval $child [list info script $old]} + # Note that all non-errors are fine result codes from [source], so we must + # take a little care to do it properly. [Bug 2923613] + if {$code == 1} { + Log $child $msg + return -code error $replacementMsg + } + return -code $code -options $opt $msg +} + +# AliasLoad is the target of the "load" alias in safe interpreters. + +proc ::safe::AliasLoad {child file args} { + set argc [llength $args] + if {$argc > 2} { + set msg "load error: too many arguments" + Log $child "$msg ($argc) {$file $args}" + return -code error $msg + } + + # package name (can be empty if file is not). + set package [lindex $args 0] + + namespace upvar ::safe [VarName $child] state + + # Determine where to load. load use a relative interp path and {} + # means self, so we can directly and safely use passed arg. + set target [lindex $args 1] + if {$target ne ""} { + # we will try to load into a sub sub interp; check that we want to + # authorize that. + if {!$state(nestedok)} { + Log $child "loading to a sub interp (nestedok)\ + disabled (trying to load $package to $target)" + return -code error "permission denied (nested load)" + } + } + + # Determine what kind of load is requested + if {$file eq ""} { + # static package loading + if {$package eq ""} { + set msg "load error: empty filename and no package name" + Log $child $msg + return -code error $msg + } + if {!$state(staticsok)} { + Log $child "static packages loading disabled\ + (trying to load $package to $target)" + return -code error "permission denied (static package)" + } + } else { + # file loading + + # get the real path from the virtual one. + try { + set file [TranslatePath $child $file] + } on error msg { + Log $child $msg + return -code error "permission denied" + } + + # check the translated path + try { + FileInAccessPath $child $file + } on error msg { + Log $child $msg + return -code error "permission denied (path)" + } + } + + try { + return [::interp invokehidden $child load $file $package $target] + } on error msg { + # Some packages return no error message. + set msg0 "load of binary library for package $package failed" + if {$msg eq {}} { + set msg $msg0 + } else { + set msg "$msg0: $msg" + } + Log $child $msg + return -code error $msg + } +} + +# FileInAccessPath raises an error if the file is not found in the list of +# directories contained in the (parent side recorded) child's access path. + +# the security here relies on "file dirname" answering the proper +# result... needs checking ? +proc ::safe::FileInAccessPath {child file} { + namespace upvar ::safe [VarName $child] state + set access_path $state(access_path) + + if {[file isdirectory $file]} { + return -code error "\"$file\": is a directory" + } + set parent [file dirname $file] + + # Normalize paths for comparison since lsearch knows nothing of + # potential pathname anomalies. + set norm_parent [file normalize $parent] + + namespace upvar ::safe [VarName $child] state + if {$norm_parent ni $state(access_path,norm)} { + return -code error "\"$file\": not in access_path" + } +} + +proc ::safe::DirInAccessPath {child dir} { + namespace upvar ::safe [VarName $child] state + set access_path $state(access_path) + + if {[file isfile $dir]} { + return -code error "\"$dir\": is a file" + } + + # Normalize paths for comparison since lsearch knows nothing of + # potential pathname anomalies. + set norm_dir [file normalize $dir] + + namespace upvar ::safe [VarName $child] state + if {$norm_dir ni $state(access_path,norm)} { + return -code error "\"$dir\": not in access_path" + } +} + +# This procedure is used to report an attempt to use an unsafe member of an +# ensemble command. + +proc ::safe::BadSubcommand {child command subcommand args} { + set msg "not allowed to invoke subcommand $subcommand of $command" + Log $child $msg + return -code error -errorcode {TCL SAFE SUBCOMMAND} $msg +} + +# AliasEncoding is the target of the "encoding" alias in safe interpreters. + +proc ::safe::AliasEncoding {child option args} { + # Note that [encoding dirs] is not supported in safe children at all + set subcommands {convertfrom convertto names system} + try { + set option [tcl::prefix match -error [list -level 1 -errorcode \ + [list TCL LOOKUP INDEX option $option]] $subcommands $option] + # Special case: [encoding system] ok, but [encoding system foo] not + if {$option eq "system" && [llength $args]} { + return -code error -errorcode {TCL WRONGARGS} \ + "wrong # args: should be \"encoding system\"" + } + } on error {msg options} { + Log $child $msg + return -options $options $msg + } + tailcall ::interp invokehidden $child encoding $option {*}$args +} + +# Various minor hiding of platform features. [Bug 2913625] + +proc ::safe::AliasExeName {child} { + return "" +} + +# ------------------------------------------------------------------------------ +# Using Interpreter Names with Namespace Qualifiers +# ------------------------------------------------------------------------------ +# (1) We wish to preserve compatibility with existing code, in which Safe Base +# interpreter names have no namespace qualifiers. +# (2) safe::interpCreate and the rest of the Safe Base previously could not +# accept namespace qualifiers in an interpreter name. +# (3) The interp command will accept namespace qualifiers in an interpreter +# name, but accepts distinct interpreters that will have the same command +# name (e.g. foo, ::foo, and :::foo) (bug 66c2e8c974). +# (4) To satisfy these constraints, Safe Base interpreter names will be fully +# qualified namespace names with no excess colons and with the leading "::" +# omitted. +# (5) Trailing "::" implies a namespace tail {}, which interp reads as {{}}. +# Reject such names. +# (6) We could: +# (a) EITHER reject usable but non-compliant names (e.g. excess colons) in +# interpCreate, interpInit; +# (b) OR accept such names and then translate to a compliant name in every +# command. +# The problem with (b) is that the user will expect to use the name with the +# interp command and will find that it is not recognised. +# E.g "interpCreate ::foo" creates interpreter "foo", and the user's name +# "::foo" works with all the Safe Base commands, but "interp eval ::foo" +# fails. +# So we choose (a). +# (7) The command +# namespace upvar ::safe S$child state +# becomes +# namespace upvar ::safe [VarName $child] state +# ------------------------------------------------------------------------------ + +proc ::safe::RejectExcessColons {child} { + set stripped [regsub -all -- {:::*} $child ::] + if {[string range $stripped end-1 end] eq {::}} { + return -code error {interpreter name must not end in "::"} + } + if {$stripped ne $child} { + set msg {interpreter name has excess colons in namespace separators} + return -code error $msg + } + if {[string range $stripped 0 1] eq {::}} { + return -code error {interpreter name must not begin "::"} + } + return +} + +proc ::safe::VarName {child} { + # return S$child + return S[string map {:: @N @ @A} $child] +} + +proc ::safe::Setup {} { + #### + # + # Setup the arguments parsing + # + #### + + # Share the descriptions + set temp [::tcl::OptKeyRegister { + {-accessPath -list {} "access path for the slave"} + {-noStatics "prevent loading of statically linked pkgs"} + {-statics true "loading of statically linked pkgs"} + {-nestedLoadOk "allow nested loading"} + {-nested false "nested loading"} + {-deleteHook -script {} "delete hook"} + }] + + # create case (slave is optional) + ::tcl::OptKeyRegister { + {?slave? -name {} "name of the slave (optional)"} + } ::safe::interpCreate + + # adding the flags sub programs to the command program (relying on Opt's + # internal implementation details) + lappend ::tcl::OptDesc(::safe::interpCreate) $::tcl::OptDesc($temp) + + # init and configure (slave is needed) + ::tcl::OptKeyRegister { + {slave -name {} "name of the slave"} + } ::safe::interpIC + + # adding the flags sub programs to the command program (relying on Opt's + # internal implementation details) + lappend ::tcl::OptDesc(::safe::interpIC) $::tcl::OptDesc($temp) + + # temp not needed anymore + ::tcl::OptKeyDelete $temp + + #### + # + # Default: No logging. + # + #### + + setLogCmd {} + + # Log eventually. + # To enable error logging, set Log to {puts stderr} for instance, + # via setLogCmd. + return +} + +namespace eval ::safe { + # internal variables + + # Log command, set via 'setLogCmd'. Logging is disabled when empty. + variable Log {} + + # The package maintains a state array per child interp under its + # control. The name of this array is S. This array is + # brought into scope where needed, using 'namespace upvar'. The S + # prefix is used to avoid that a child interp called "Log" smashes + # the "Log" variable. + # + # The array's elements are: + # + # access_path : List of paths accessible to the child. + # access_path,norm : Ditto, in normalized form. + # access_path,slave : Ditto, as the path tokens as seen by the child. + # access_path,map : dict ( token -> path ) + # access_path,remap : dict ( path -> token ) + # tm_path_slave : List of TM root directories, as tokens seen by the child. + # staticsok : Value of option -statics + # nestedok : Value of option -nested + # cleanupHook : Value of option -deleteHook +} + +::safe::Setup diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tclIndex b/src/tclkit86bi.vfs/lib/tcl8.6/tclIndex new file mode 100644 index 00000000..0409d9b4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tclIndex @@ -0,0 +1,78 @@ +# Tcl autoload index file, version 2.0 +# -*- tcl -*- +# This file is generated by the "auto_mkindex" command +# and sourced to set up indexing information for one or +# more commands. Typically each line is a command that +# sets an element in the auto_index array, where the +# element name is the name of a command and the value is +# a script that loads the command. + +set auto_index(auto_reset) [list source [file join $dir auto.tcl]] +set auto_index(tcl_findLibrary) [list source [file join $dir auto.tcl]] +set auto_index(auto_mkindex) [list source [file join $dir auto.tcl]] +set auto_index(auto_mkindex_old) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::init) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::cleanup) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::mkindex) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::hook) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::slavehook) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::command) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::commandInit) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::fullname) [list source [file join $dir auto.tcl]] +set auto_index(history) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistAdd) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistKeep) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistClear) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistInfo) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistRedo) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistIndex) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistEvent) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistChange) [list source [file join $dir history.tcl]] +set auto_index(pkg_mkIndex) [list source [file join $dir package.tcl]] +set auto_index(tclPkgSetup) [list source [file join $dir package.tcl]] +set auto_index(tclPkgUnknown) [list source [file join $dir package.tcl]] +set auto_index(::tcl::MacOSXPkgUnknown) [list source [file join $dir package.tcl]] +set auto_index(::pkg::create) [list source [file join $dir package.tcl]] +set auto_index(parray) [list source [file join $dir parray.tcl]] +set auto_index(::safe::InterpStatics) [list source [file join $dir safe.tcl]] +set auto_index(::safe::InterpNested) [list source [file join $dir safe.tcl]] +set auto_index(::safe::interpCreate) [list source [file join $dir safe.tcl]] +set auto_index(::safe::interpInit) [list source [file join $dir safe.tcl]] +set auto_index(::safe::CheckInterp) [list source [file join $dir safe.tcl]] +set auto_index(::safe::interpConfigure) [list source [file join $dir safe.tcl]] +set auto_index(::safe::InterpCreate) [list source [file join $dir safe.tcl]] +set auto_index(::safe::InterpSetConfig) [list source [file join $dir safe.tcl]] +set auto_index(::safe::interpFindInAccessPath) [list source [file join $dir safe.tcl]] +set auto_index(::safe::interpAddToAccessPath) [list source [file join $dir safe.tcl]] +set auto_index(::safe::InterpInit) [list source [file join $dir safe.tcl]] +set auto_index(::safe::AddSubDirs) [list source [file join $dir safe.tcl]] +set auto_index(::safe::interpDelete) [list source [file join $dir safe.tcl]] +set auto_index(::safe::setLogCmd) [list source [file join $dir safe.tcl]] +set auto_index(::safe::SyncAccessPath) [list source [file join $dir safe.tcl]] +set auto_index(::safe::PathToken) [list source [file join $dir safe.tcl]] +set auto_index(::safe::TranslatePath) [list source [file join $dir safe.tcl]] +set auto_index(::safe::Log) [list source [file join $dir safe.tcl]] +set auto_index(::safe::CheckFileName) [list source [file join $dir safe.tcl]] +set auto_index(::safe::AliasGlob) [list source [file join $dir safe.tcl]] +set auto_index(::safe::AliasSource) [list source [file join $dir safe.tcl]] +set auto_index(::safe::AliasLoad) [list source [file join $dir safe.tcl]] +set auto_index(::safe::FileInAccessPath) [list source [file join $dir safe.tcl]] +set auto_index(::safe::DirInAccessPath) [list source [file join $dir safe.tcl]] +set auto_index(::safe::Subset) [list source [file join $dir safe.tcl]] +set auto_index(::safe::AliasSubset) [list source [file join $dir safe.tcl]] +set auto_index(::safe::AliasEncoding) [list source [file join $dir safe.tcl]] +set auto_index(tcl_wordBreakAfter) [list source [file join $dir word.tcl]] +set auto_index(tcl_wordBreakBefore) [list source [file join $dir word.tcl]] +set auto_index(tcl_endOfWord) [list source [file join $dir word.tcl]] +set auto_index(tcl_startOfNextWord) [list source [file join $dir word.tcl]] +set auto_index(tcl_startOfPreviousWord) [list source [file join $dir word.tcl]] +set auto_index(::tcl::tm::add) [list source [file join $dir tm.tcl]] +set auto_index(::tcl::tm::remove) [list source [file join $dir tm.tcl]] +set auto_index(::tcl::tm::list) [list source [file join $dir tm.tcl]] +set auto_index(::tcl::tm::Defaults) [list source [file join $dir tm.tcl]] +set auto_index(::tcl::tm::UnknownHandler) [list source [file join $dir tm.tcl]] +set auto_index(::tcl::tm::roots) [list source [file join $dir tm.tcl]] +set auto_index(::tcl::tm::path) [list source [file join $dir tm.tcl]] +if {[namespace exists ::tcl::unsupported]} { + set auto_index(timerate) {namespace import ::tcl::unsupported::timerate} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tm.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/tm.tcl new file mode 100644 index 00000000..c60084cc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tm.tcl @@ -0,0 +1,380 @@ +# -*- tcl -*- +# +# Searching for Tcl Modules. Defines a procedure, declares it as the primary +# command for finding packages, however also uses the former 'package unknown' +# command as a fallback. +# +# Locates all possible packages in a directory via a less restricted glob. The +# targeted directory is derived from the name of the requested package, i.e. +# the TM scan will look only at directories which can contain the requested +# package. It will register all packages it found in the directory so that +# future requests have a higher chance of being fulfilled by the ifneeded +# database without having to come to us again. +# +# We do not remember where we have been and simply rescan targeted directories +# when invoked again. The reasoning is this: +# +# - The only way we get back to the same directory is if someone is trying to +# [package require] something that wasn't there on the first scan. +# +# Either +# 1) It is there now: If we rescan, you get it; if not you don't. +# +# This covers the possibility that the application asked for a package +# late, and the package was actually added to the installation after the +# application was started. It shoukld still be able to find it. +# +# 2) It still is not there: Either way, you don't get it, but the rescan +# takes time. This is however an error case and we dont't care that much +# about it +# +# 3) It was there the first time; but for some reason a "package forget" has +# been run, and "package" doesn't know about it anymore. +# +# This can be an indication that the application wishes to reload some +# functionality. And should work as well. +# +# Note that this also strikes a balance between doing a glob targeting a +# single package, and thus most likely requiring multiple globs of the same +# directory when the application is asking for many packages, and trying to +# glob for _everything_ in all subdirectories when looking for a package, +# which comes with a heavy startup cost. +# +# We scan for regular packages only if no satisfying module was found. + +namespace eval ::tcl::tm { + # Default paths. None yet. + + variable paths {} + + # The regex pattern a file name has to match to make it a Tcl Module. + + set pkgpattern {^([_[:alpha:]][:_[:alnum:]]*)-([[:digit:]].*)[.]tm$} + + # Export the public API + + namespace export path + namespace ensemble create -command path -subcommands {add remove list} +} + +# ::tcl::tm::path implementations -- +# +# Public API to the module path. See specification. +# +# Arguments +# cmd - The subcommand to execute +# args - The paths to add/remove. Must not appear querying the +# path with 'list'. +# +# Results +# No result for subcommands 'add' and 'remove'. A list of paths for +# 'list'. +# +# Sideeffects +# The subcommands 'add' and 'remove' manipulate the list of paths to +# search for Tcl Modules. The subcommand 'list' has no sideeffects. + +proc ::tcl::tm::add {args} { + # PART OF THE ::tcl::tm::path ENSEMBLE + # + # The path is added at the head to the list of module paths. + # + # The command enforces the restriction that no path may be an ancestor + # directory of any other path on the list. If the new path violates this + # restriction an error wil be raised. + # + # If the path is already present as is no error will be raised and no + # action will be taken. + + variable paths + + # We use a copy of the path as source during validation, and extend it as + # well. Because we not only have to detect if the new paths are bogus with + # respect to the existing paths, but also between themselves. Otherwise we + # can still add bogus paths, by specifying them in a single call. This + # makes the use of the new paths simpler as well, a trivial assignment of + # the collected paths to the official state var. + + set newpaths $paths + foreach p $args { + if {$p in $newpaths} { + # Ignore a path already on the list. + continue + } + + # Search for paths which are subdirectories of the new one. If there + # are any then the new path violates the restriction about ancestors. + + set pos [lsearch -glob $newpaths ${p}/*] + # Cannot use "in", we need the position for the message. + if {$pos >= 0} { + return -code error \ + "$p is ancestor of existing module path [lindex $newpaths $pos]." + } + + # Now look for existing paths which are ancestors of the new one. This + # reverse question forces us to loop over the existing paths, as each + # element is the pattern, not the new path :( + + foreach ep $newpaths { + if {[string match ${ep}/* $p]} { + return -code error \ + "$p is subdirectory of existing module path $ep." + } + } + + set newpaths [linsert $newpaths 0 $p] + } + + # The validation of the input is complete and successful, and everything + # in newpaths is either an old path, or added. We can now extend the + # official list of paths, a simple assignment is sufficient. + + set paths $newpaths + return +} + +proc ::tcl::tm::remove {args} { + # PART OF THE ::tcl::tm::path ENSEMBLE + # + # Removes the path from the list of module paths. The command is silently + # ignored if the path is not on the list. + + variable paths + + foreach p $args { + set pos [lsearch -exact $paths $p] + if {$pos >= 0} { + set paths [lreplace $paths $pos $pos] + } + } +} + +proc ::tcl::tm::list {} { + # PART OF THE ::tcl::tm::path ENSEMBLE + + variable paths + return $paths +} + +# ::tcl::tm::UnknownHandler -- +# +# Unknown handler for Tcl Modules, i.e. packages in module form. +# +# Arguments +# original - Original [package unknown] procedure. +# name - Name of desired package. +# version - Version of desired package. Can be the +# empty string. +# exact - Either -exact or ommitted. +# +# Name, version, and exact are used to determine satisfaction. The +# original is called iff no satisfaction was achieved. The name is also +# used to compute the directory to target in the search. +# +# Results +# None. +# +# Sideeffects +# May populate the package ifneeded database with additional provide +# scripts. + +proc ::tcl::tm::UnknownHandler {original name args} { + # Import the list of paths to search for packages in module form. + # Import the pattern used to check package names in detail. + + variable paths + variable pkgpattern + + # Without paths to search we can do nothing. (Except falling back to the + # regular search). + + if {[llength $paths]} { + set pkgpath [string map {:: /} $name] + set pkgroot [file dirname $pkgpath] + if {$pkgroot eq "."} { + set pkgroot "" + } + + # We don't remember a copy of the paths while looping. Tcl Modules are + # unable to change the list while we are searching for them. This also + # simplifies the loop, as we cannot get additional directories while + # iterating over the list. A simple foreach is sufficient. + + set satisfied 0 + foreach path $paths { + if {![interp issafe] && ![file exists $path]} { + continue + } + set currentsearchpath [file join $path $pkgroot] + if {![interp issafe] && ![file exists $currentsearchpath]} { + continue + } + set strip [llength [file split $path]] + + # Get the module files out of the subdirectories. + # - Safe Base interpreters have a restricted "glob" command that + # works in this case. + # - The "catch" was essential when there was no safe glob and every + # call in a safe interp failed; it is retained only for corner + # cases in which the eventual call to glob returns an error. + + catch { + # We always look for _all_ possible modules in the current + # path, to get the max result out of the glob. + + foreach file [glob -nocomplain -directory $currentsearchpath *.tm] { + set pkgfilename [join [lrange [file split $file] $strip end] ::] + + if {![regexp -- $pkgpattern $pkgfilename --> pkgname pkgversion]} { + # Ignore everything not matching our pattern for + # package names. + continue + } + try { + package vcompare $pkgversion 0 + } on error {} { + # Ignore everything where the version part is not + # acceptable to "package vcompare". + continue + } + + if {([package ifneeded $pkgname $pkgversion] ne {}) + && (![interp issafe]) + } { + # There's already a provide script registered for + # this version of this package. Since all units of + # code claiming to be the same version of the same + # package ought to be identical, just stick with + # the one we already have. + # This does not apply to Safe Base interpreters because + # the token-to-directory mapping may have changed. + continue + } + + # We have found a candidate, generate a "provide script" + # for it, and remember it. Note that we are using ::list + # to do this; locally [list] means something else without + # the namespace specifier. + + # NOTE. When making changes to the format of the provide + # command generated below CHECK that the 'LOCATE' + # procedure in core file 'platform/shell.tcl' still + # understands it, or, if not, update its implementation + # appropriately. + # + # Right now LOCATE's implementation assumes that the path + # of the package file is the last element in the list. + + package ifneeded $pkgname $pkgversion \ + "[::list package provide $pkgname $pkgversion];[::list source -encoding utf-8 $file]" + + # We abort in this unknown handler only if we got a + # satisfying candidate for the requested package. + # Otherwise we still have to fallback to the regular + # package search to complete the processing. + + if {($pkgname eq $name) + && [package vsatisfies $pkgversion {*}$args]} { + set satisfied 1 + + # We do not abort the loop, and keep adding provide + # scripts for every candidate in the directory, just + # remember to not fall back to the regular search + # anymore. + } + } + } + } + + if {$satisfied} { + return + } + } + + # Fallback to previous command, if existing. See comment above about + # ::list... + + if {[llength $original]} { + uplevel 1 $original [::linsert $args 0 $name] + } +} + +# ::tcl::tm::Defaults -- +# +# Determines the default search paths. +# +# Arguments +# None +# +# Results +# None. +# +# Sideeffects +# May add paths to the list of defaults. + +proc ::tcl::tm::Defaults {} { + global env tcl_platform + + regexp {^(\d+)\.(\d+)} [package provide Tcl] - major minor + set exe [file normalize [info nameofexecutable]] + + # Note that we're using [::list], not [list] because [list] means + # something other than [::list] in this namespace. + roots [::list \ + [file dirname [info library]] \ + [file join [file dirname [file dirname $exe]] lib] \ + ] + + if {$tcl_platform(platform) eq "windows"} { + set sep ";" + } else { + set sep ":" + } + for {set n $minor} {$n >= 0} {incr n -1} { + foreach ev [::list \ + TCL${major}.${n}_TM_PATH \ + TCL${major}_${n}_TM_PATH \ + ] { + if {![info exists env($ev)]} continue + foreach p [split $env($ev) $sep] { + path add $p + } + } + } + return +} + +# ::tcl::tm::roots -- +# +# Public API to the module path. See specification. +# +# Arguments +# paths - List of 'root' paths to derive search paths from. +# +# Results +# No result. +# +# Sideeffects +# Calls 'path add' to paths to the list of module search paths. + +proc ::tcl::tm::roots {paths} { + regexp {^(\d+)\.(\d+)} [package provide Tcl] - major minor + foreach pa $paths { + set p [file join $pa tcl$major] + for {set n $minor} {$n >= 0} {incr n -1} { + set px [file join $p ${major}.${n}] + if {![interp issafe]} {set px [file normalize $px]} + path add $px + } + set px [file join $p site-tcl] + if {![interp issafe]} {set px [file normalize $px]} + path add $px + } + return +} + +# Initialization. Set up the default paths, then insert the new handler into +# the chain. + +if {![interp issafe]} {::tcl::tm::Defaults} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Abidjan b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Abidjan new file mode 100644 index 00000000..4b4f5b22 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Abidjan @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Abidjan) { + {-9223372036854775808 -968 0 LMT} + {-1830383032 0 0 GMT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Algiers b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Algiers new file mode 100644 index 00000000..b26d31ce --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Algiers @@ -0,0 +1,39 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Algiers) { + {-9223372036854775808 732 0 LMT} + {-2486592732 561 0 PMT} + {-1855958961 0 0 WET} + {-1689814800 3600 1 WEST} + {-1680397200 0 0 WET} + {-1665363600 3600 1 WEST} + {-1648342800 0 0 WET} + {-1635123600 3600 1 WEST} + {-1616893200 0 0 WET} + {-1604278800 3600 1 WEST} + {-1585443600 0 0 WET} + {-1574038800 3600 1 WEST} + {-1552266000 0 0 WET} + {-1539997200 3600 1 WEST} + {-1531443600 0 0 WET} + {-956365200 3600 1 WEST} + {-950486400 0 0 WET} + {-942012000 3600 0 CET} + {-812502000 7200 1 CEST} + {-796262400 3600 0 CET} + {-781052400 7200 1 CEST} + {-766630800 3600 0 CET} + {-733280400 0 0 WET} + {-439430400 3600 0 CET} + {-212029200 0 0 WET} + {41468400 3600 1 WEST} + {54774000 0 0 WET} + {231724800 3600 1 WEST} + {246240000 3600 0 CET} + {259545600 7200 1 CEST} + {275274000 3600 0 CET} + {309740400 0 0 WET} + {325468800 3600 1 WEST} + {341802000 0 0 WET} + {357523200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Bamako b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Bamako new file mode 100644 index 00000000..08183783 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Bamako @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Bamako) $TZData(:Africa/Abidjan) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Bangui b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Bangui new file mode 100644 index 00000000..0326a6ce --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Bangui @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Bangui) $TZData(:Africa/Lagos) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Banjul b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Banjul new file mode 100644 index 00000000..ded0e577 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Banjul @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Banjul) $TZData(:Africa/Abidjan) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Bissau b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Bissau new file mode 100644 index 00000000..e0568fbe --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Bissau @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Bissau) { + {-9223372036854775808 -3740 0 LMT} + {-1830380400 -3600 0 -01} + {157770000 0 0 GMT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Blantyre b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Blantyre new file mode 100644 index 00000000..9a404c51 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Blantyre @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Maputo)]} { + LoadTimeZoneFile Africa/Maputo +} +set TZData(:Africa/Blantyre) $TZData(:Africa/Maputo) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Brazzaville b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Brazzaville new file mode 100644 index 00000000..111eff46 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Brazzaville @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Brazzaville) $TZData(:Africa/Lagos) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Cairo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Cairo new file mode 100644 index 00000000..aaeec54e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Cairo @@ -0,0 +1,132 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Cairo) { + {-9223372036854775808 7509 0 LMT} + {-2185409109 7200 0 EET} + {-929844000 10800 1 EEST} + {-923108400 7200 0 EET} + {-906170400 10800 1 EEST} + {-892868400 7200 0 EET} + {-875844000 10800 1 EEST} + {-857790000 7200 0 EET} + {-844308000 10800 1 EEST} + {-825822000 7200 0 EET} + {-812685600 10800 1 EEST} + {-794199600 7200 0 EET} + {-779853600 10800 1 EEST} + {-762663600 7200 0 EET} + {-399088800 10800 1 EEST} + {-386650800 7200 0 EET} + {-368330400 10800 1 EEST} + {-355114800 7200 0 EET} + {-336790800 10800 1 EEST} + {-323654400 7200 0 EET} + {-305168400 10800 1 EEST} + {-292032000 7200 0 EET} + {-273632400 10800 1 EEST} + {-260496000 7200 0 EET} + {-242096400 10800 1 EEST} + {-228960000 7200 0 EET} + {-210560400 10800 1 EEST} + {-197424000 7200 0 EET} + {-178938000 10800 1 EEST} + {-165801600 7200 0 EET} + {-147402000 10800 1 EEST} + {-134265600 7200 0 EET} + {-115866000 10800 1 EEST} + {-102643200 7200 0 EET} + {-84330000 10800 1 EEST} + {-71107200 7200 0 EET} + {-52707600 10800 1 EEST} + {-39484800 7200 0 EET} + {-21171600 10800 1 EEST} + {-7948800 7200 0 EET} + {10364400 10800 1 EEST} + {23587200 7200 0 EET} + {41900400 10800 1 EEST} + {55123200 7200 0 EET} + {73522800 10800 1 EEST} + {86745600 7200 0 EET} + {105058800 10800 1 EEST} + {118281600 7200 0 EET} + {136594800 10800 1 EEST} + {149817600 7200 0 EET} + {168130800 10800 1 EEST} + {181353600 7200 0 EET} + {199753200 10800 1 EEST} + {212976000 7200 0 EET} + {231289200 10800 1 EEST} + {244512000 7200 0 EET} + {262825200 10800 1 EEST} + {276048000 7200 0 EET} + {294361200 10800 1 EEST} + {307584000 7200 0 EET} + {325983600 10800 1 EEST} + {339206400 7200 0 EET} + {357519600 10800 1 EEST} + {370742400 7200 0 EET} + {396399600 10800 1 EEST} + {402278400 7200 0 EET} + {426812400 10800 1 EEST} + {433814400 7200 0 EET} + {452214000 10800 1 EEST} + {465436800 7200 0 EET} + {483750000 10800 1 EEST} + {496972800 7200 0 EET} + {515286000 10800 1 EEST} + {528508800 7200 0 EET} + {546822000 10800 1 EEST} + {560044800 7200 0 EET} + {578444400 10800 1 EEST} + {591667200 7200 0 EET} + {610412400 10800 1 EEST} + {623203200 7200 0 EET} + {641516400 10800 1 EEST} + {654739200 7200 0 EET} + {673052400 10800 1 EEST} + {686275200 7200 0 EET} + {704674800 10800 1 EEST} + {717897600 7200 0 EET} + {736210800 10800 1 EEST} + {749433600 7200 0 EET} + {767746800 10800 1 EEST} + {780969600 7200 0 EET} + {799020000 10800 1 EEST} + {812322000 7200 0 EET} + {830469600 10800 1 EEST} + {843771600 7200 0 EET} + {861919200 10800 1 EEST} + {875221200 7200 0 EET} + {893368800 10800 1 EEST} + {906670800 7200 0 EET} + {925423200 10800 1 EEST} + {938725200 7200 0 EET} + {956872800 10800 1 EEST} + {970174800 7200 0 EET} + {988322400 10800 1 EEST} + {1001624400 7200 0 EET} + {1019772000 10800 1 EEST} + {1033074000 7200 0 EET} + {1051221600 10800 1 EEST} + {1064523600 7200 0 EET} + {1083276000 10800 1 EEST} + {1096578000 7200 0 EET} + {1114725600 10800 1 EEST} + {1128027600 7200 0 EET} + {1146175200 10800 1 EEST} + {1158872400 7200 0 EET} + {1177624800 10800 1 EEST} + {1189112400 7200 0 EET} + {1209074400 10800 1 EEST} + {1219957200 7200 0 EET} + {1240524000 10800 1 EEST} + {1250802000 7200 0 EET} + {1272578400 10800 1 EEST} + {1281474000 7200 0 EET} + {1284069600 10800 1 EEST} + {1285880400 7200 0 EET} + {1400191200 10800 1 EEST} + {1403816400 7200 0 EET} + {1406844000 10800 1 EEST} + {1411678800 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Conakry b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Conakry new file mode 100644 index 00000000..43737204 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Conakry @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Conakry) $TZData(:Africa/Abidjan) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Dakar b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Dakar new file mode 100644 index 00000000..78e800c4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Dakar @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Dakar) $TZData(:Africa/Abidjan) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Dar_es_Salaam b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Dar_es_Salaam new file mode 100644 index 00000000..00e8d4e3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Dar_es_Salaam @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Africa/Dar_es_Salaam) $TZData(:Africa/Nairobi) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Djibouti b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Djibouti new file mode 100644 index 00000000..859ea328 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Djibouti @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Africa/Djibouti) $TZData(:Africa/Nairobi) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/El_Aaiun b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/El_Aaiun new file mode 100644 index 00000000..fd3e88f6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/El_Aaiun @@ -0,0 +1,191 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/El_Aaiun) { + {-9223372036854775808 -3168 0 LMT} + {-1136070432 -3600 0 -01} + {198291600 0 0 +00} + {199756800 3600 1 +00} + {207702000 0 0 +00} + {231292800 3600 1 +00} + {244249200 0 0 +00} + {265507200 3600 1 +00} + {271033200 0 0 +00} + {1212278400 3600 1 +00} + {1220223600 0 0 +00} + {1243814400 3600 1 +00} + {1250809200 0 0 +00} + {1272758400 3600 1 +00} + {1281222000 0 0 +00} + {1301788800 3600 1 +00} + {1312066800 0 0 +00} + {1335664800 3600 1 +00} + {1342749600 0 0 +00} + {1345428000 3600 1 +00} + {1348970400 0 0 +00} + {1367114400 3600 1 +00} + {1373162400 0 0 +00} + {1376100000 3600 1 +00} + {1382839200 0 0 +00} + {1396144800 3600 1 +00} + {1403920800 0 0 +00} + {1406944800 3600 1 +00} + {1414288800 0 0 +00} + {1427594400 3600 1 +00} + {1434247200 0 0 +00} + {1437271200 3600 1 +00} + {1445738400 0 0 +00} + {1459044000 3600 1 +00} + {1465092000 0 0 +00} + {1468116000 3600 1 +00} + {1477792800 0 0 +00} + {1490493600 3600 1 +00} + {1495332000 0 0 +00} + {1498960800 3600 1 +00} + {1509242400 0 0 +00} + {1521943200 3600 1 +00} + {1526176800 0 0 +00} + {1529200800 3600 1 +00} + {1540695600 3600 0 +01} + {1557021600 0 1 +01} + {1560045600 3600 0 +01} + {1587261600 0 1 +01} + {1590890400 3600 0 +01} + {1618106400 0 1 +01} + {1621130400 3600 0 +01} + {1648346400 0 1 +01} + {1651975200 3600 0 +01} + {1679191200 0 1 +01} + {1682820000 3600 0 +01} + {1710036000 0 1 +01} + {1713060000 3600 0 +01} + {1740276000 0 1 +01} + {1743904800 3600 0 +01} + {1771120800 0 1 +01} + {1774144800 3600 0 +01} + {1801965600 0 1 +01} + {1804989600 3600 0 +01} + {1832205600 0 1 +01} + {1835834400 3600 0 +01} + {1863050400 0 1 +01} + {1866074400 3600 0 +01} + {1893290400 0 1 +01} + {1896919200 3600 0 +01} + {1924135200 0 1 +01} + {1927764000 3600 0 +01} + {1954980000 0 1 +01} + {1958004000 3600 0 +01} + {1985220000 0 1 +01} + {1988848800 3600 0 +01} + {2016064800 0 1 +01} + {2019088800 3600 0 +01} + {2046304800 0 1 +01} + {2049933600 3600 0 +01} + {2077149600 0 1 +01} + {2080778400 3600 0 +01} + {2107994400 0 1 +01} + {2111018400 3600 0 +01} + {2138234400 0 1 +01} + {2141863200 3600 0 +01} + {2169079200 0 1 +01} + {2172708000 3600 0 +01} + {2199924000 0 1 +01} + {2202948000 3600 0 +01} + {2230164000 0 1 +01} + {2233792800 3600 0 +01} + {2261008800 0 1 +01} + {2264032800 3600 0 +01} + {2291248800 0 1 +01} + {2294877600 3600 0 +01} + {2322093600 0 1 +01} + {2325722400 3600 0 +01} + {2352938400 0 1 +01} + {2355962400 3600 0 +01} + {2383178400 0 1 +01} + {2386807200 3600 0 +01} + {2414023200 0 1 +01} + {2417652000 3600 0 +01} + {2444868000 0 1 +01} + {2447892000 3600 0 +01} + {2475108000 0 1 +01} + {2478736800 3600 0 +01} + {2505952800 0 1 +01} + {2508976800 3600 0 +01} + {2536192800 0 1 +01} + {2539821600 3600 0 +01} + {2567037600 0 1 +01} + {2570666400 3600 0 +01} + {2597882400 0 1 +01} + {2600906400 3600 0 +01} + {2628122400 0 1 +01} + {2631751200 3600 0 +01} + {2658967200 0 1 +01} + {2662596000 3600 0 +01} + {2689812000 0 1 +01} + {2692836000 3600 0 +01} + {2720052000 0 1 +01} + {2723680800 3600 0 +01} + {2750896800 0 1 +01} + {2753920800 3600 0 +01} + {2781136800 0 1 +01} + {2784765600 3600 0 +01} + {2811981600 0 1 +01} + {2815610400 3600 0 +01} + {2842826400 0 1 +01} + {2845850400 3600 0 +01} + {2873066400 0 1 +01} + {2876695200 3600 0 +01} + {2903911200 0 1 +01} + {2907540000 3600 0 +01} + {2934756000 0 1 +01} + {2937780000 3600 0 +01} + {2964996000 0 1 +01} + {2968624800 3600 0 +01} + {2995840800 0 1 +01} + {2998864800 3600 0 +01} + {3026080800 0 1 +01} + {3029709600 3600 0 +01} + {3056925600 0 1 +01} + {3060554400 3600 0 +01} + {3087770400 0 1 +01} + {3090794400 3600 0 +01} + {3118010400 0 1 +01} + {3121639200 3600 0 +01} + {3148855200 0 1 +01} + {3152484000 3600 0 +01} + {3179700000 0 1 +01} + {3182724000 3600 0 +01} + {3209940000 0 1 +01} + {3213568800 3600 0 +01} + {3240784800 0 1 +01} + {3243808800 3600 0 +01} + {3271024800 0 1 +01} + {3274653600 3600 0 +01} + {3301869600 0 1 +01} + {3305498400 3600 0 +01} + {3332714400 0 1 +01} + {3335738400 3600 0 +01} + {3362954400 0 1 +01} + {3366583200 3600 0 +01} + {3393799200 0 1 +01} + {3397428000 3600 0 +01} + {3424644000 0 1 +01} + {3427668000 3600 0 +01} + {3454884000 0 1 +01} + {3458512800 3600 0 +01} + {3485728800 0 1 +01} + {3488752800 3600 0 +01} + {3515968800 0 1 +01} + {3519597600 3600 0 +01} + {3546813600 0 1 +01} + {3550442400 3600 0 +01} + {3577658400 0 1 +01} + {3580682400 3600 0 +01} + {3607898400 0 1 +01} + {3611527200 3600 0 +01} + {3638743200 0 1 +01} + {3642372000 3600 0 +01} + {3669588000 0 1 +01} + {3672612000 3600 0 +01} + {3699828000 0 1 +01} + {3703456800 3600 0 +01} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Freetown b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Freetown new file mode 100644 index 00000000..4a8e2e12 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Freetown @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Freetown) $TZData(:Africa/Abidjan) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Gaborone b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Gaborone new file mode 100644 index 00000000..56c0772e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Gaborone @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Maputo)]} { + LoadTimeZoneFile Africa/Maputo +} +set TZData(:Africa/Gaborone) $TZData(:Africa/Maputo) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Harare b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Harare new file mode 100644 index 00000000..644be265 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Harare @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Maputo)]} { + LoadTimeZoneFile Africa/Maputo +} +set TZData(:Africa/Harare) $TZData(:Africa/Maputo) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Johannesburg b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Johannesburg new file mode 100644 index 00000000..b9a8348b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Johannesburg @@ -0,0 +1,11 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Johannesburg) { + {-9223372036854775808 6720 0 LMT} + {-2458173120 5400 0 SAST} + {-2109288600 7200 0 SAST} + {-860976000 10800 1 SAST} + {-845254800 7200 0 SAST} + {-829526400 10800 1 SAST} + {-813805200 7200 0 SAST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Khartoum b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Khartoum new file mode 100644 index 00000000..dc441f68 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Khartoum @@ -0,0 +1,40 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Khartoum) { + {-9223372036854775808 7808 0 LMT} + {-1230775808 7200 0 CAT} + {10360800 10800 1 CAST} + {24786000 7200 0 CAT} + {41810400 10800 1 CAST} + {56322000 7200 0 CAT} + {73432800 10800 1 CAST} + {87944400 7200 0 CAT} + {104882400 10800 1 CAST} + {119480400 7200 0 CAT} + {136332000 10800 1 CAST} + {151016400 7200 0 CAT} + {167781600 10800 1 CAST} + {182552400 7200 0 CAT} + {199231200 10800 1 CAST} + {214174800 7200 0 CAT} + {230680800 10800 1 CAST} + {245710800 7200 0 CAT} + {262735200 10800 1 CAST} + {277246800 7200 0 CAT} + {294184800 10800 1 CAST} + {308782800 7200 0 CAT} + {325634400 10800 1 CAST} + {340405200 7200 0 CAT} + {357084000 10800 1 CAST} + {371941200 7200 0 CAT} + {388533600 10800 1 CAST} + {403477200 7200 0 CAT} + {419983200 10800 1 CAST} + {435013200 7200 0 CAT} + {452037600 10800 1 CAST} + {466635600 7200 0 CAT} + {483487200 10800 1 CAST} + {498171600 7200 0 CAT} + {947930400 10800 0 EAT} + {1509483600 7200 0 CAT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Kigali b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Kigali new file mode 100644 index 00000000..192e0e8f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Kigali @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Maputo)]} { + LoadTimeZoneFile Africa/Maputo +} +set TZData(:Africa/Kigali) $TZData(:Africa/Maputo) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Lagos b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Lagos new file mode 100644 index 00000000..87506614 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Lagos @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Lagos) { + {-9223372036854775808 815 0 LMT} + {-2035584815 0 0 GMT} + {-1940889600 815 0 LMT} + {-1767226415 1800 0 +0030} + {-1588465800 3600 0 WAT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Libreville b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Libreville new file mode 100644 index 00000000..ba1f686d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Libreville @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Libreville) $TZData(:Africa/Lagos) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Lome b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Lome new file mode 100644 index 00000000..9adecc7c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Lome @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Lome) $TZData(:Africa/Abidjan) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Lubumbashi b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Lubumbashi new file mode 100644 index 00000000..7da101a6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Lubumbashi @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Maputo)]} { + LoadTimeZoneFile Africa/Maputo +} +set TZData(:Africa/Lubumbashi) $TZData(:Africa/Maputo) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Malabo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Malabo new file mode 100644 index 00000000..7dcee399 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Malabo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Malabo) $TZData(:Africa/Lagos) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Maputo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Maputo new file mode 100644 index 00000000..6ee208c1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Maputo @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Maputo) { + {-9223372036854775808 7820 0 LMT} + {-2109291020 7200 0 CAT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Maseru b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Maseru new file mode 100644 index 00000000..665f15d5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Maseru @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Johannesburg)]} { + LoadTimeZoneFile Africa/Johannesburg +} +set TZData(:Africa/Maseru) $TZData(:Africa/Johannesburg) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Mbabane b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Mbabane new file mode 100644 index 00000000..0edb5906 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Mbabane @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Johannesburg)]} { + LoadTimeZoneFile Africa/Johannesburg +} +set TZData(:Africa/Mbabane) $TZData(:Africa/Johannesburg) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Mogadishu b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Mogadishu new file mode 100644 index 00000000..42206551 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Mogadishu @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Africa/Mogadishu) $TZData(:Africa/Nairobi) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Nairobi b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Nairobi new file mode 100644 index 00000000..b4c3b970 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Nairobi @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Nairobi) { + {-9223372036854775808 8836 0 LMT} + {-1946168836 9000 0 +0230} + {-1309746600 10800 0 EAT} + {-1261969200 9000 0 +0230} + {-1041388200 9900 0 +0245} + {-865305900 10800 0 EAT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Niamey b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Niamey new file mode 100644 index 00000000..278571d9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Niamey @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Niamey) $TZData(:Africa/Lagos) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Nouakchott b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Nouakchott new file mode 100644 index 00000000..d33b6bc0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Nouakchott @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Nouakchott) $TZData(:Africa/Abidjan) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Ouagadougou b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Ouagadougou new file mode 100644 index 00000000..8178c82d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Ouagadougou @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Ouagadougou) $TZData(:Africa/Abidjan) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Porto-Novo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Porto-Novo new file mode 100644 index 00000000..3fa2b51a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Porto-Novo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Porto-Novo) $TZData(:Africa/Lagos) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Sao_Tome b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Sao_Tome new file mode 100644 index 00000000..f2e3f0f1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Sao_Tome @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Sao_Tome) { + {-9223372036854775808 1616 0 LMT} + {-2713912016 -2205 0 LMT} + {-1830384000 0 0 GMT} + {1514768400 3600 0 WAT} + {1546304400 0 0 GMT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Timbuktu b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Timbuktu new file mode 100644 index 00000000..9852d7ab --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Timbuktu @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Timbuktu) $TZData(:Africa/Abidjan) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Tripoli b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Tripoli new file mode 100644 index 00000000..0e72df4f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Tripoli @@ -0,0 +1,34 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Tripoli) { + {-9223372036854775808 3164 0 LMT} + {-1577926364 3600 0 CET} + {-574902000 7200 1 CEST} + {-512175600 7200 1 CEST} + {-449888400 7200 1 CEST} + {-347158800 7200 0 EET} + {378684000 3600 0 CET} + {386463600 7200 1 CEST} + {402271200 3600 0 CET} + {417999600 7200 1 CEST} + {433807200 3600 0 CET} + {449622000 7200 1 CEST} + {465429600 3600 0 CET} + {481590000 7200 1 CEST} + {496965600 3600 0 CET} + {512953200 7200 1 CEST} + {528674400 3600 0 CET} + {544230000 7200 1 CEST} + {560037600 3600 0 CET} + {575852400 7200 1 CEST} + {591660000 3600 0 CET} + {607388400 7200 1 CEST} + {623196000 3600 0 CET} + {641775600 7200 0 EET} + {844034400 3600 0 CET} + {860108400 7200 1 CEST} + {875919600 7200 0 EET} + {1352505600 3600 0 CET} + {1364515200 7200 1 CEST} + {1382662800 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Tunis b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Tunis new file mode 100644 index 00000000..0c1db4d0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Tunis @@ -0,0 +1,39 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Tunis) { + {-9223372036854775808 2444 0 LMT} + {-2797202444 561 0 PMT} + {-1855958961 3600 0 CET} + {-969242400 7200 1 CEST} + {-950493600 3600 0 CET} + {-941940000 7200 1 CEST} + {-891136800 3600 0 CET} + {-877827600 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-842918400 3600 0 CET} + {-842223600 7200 1 CEST} + {-828230400 3600 0 CET} + {-812502000 7200 1 CEST} + {-796269600 3600 0 CET} + {-781052400 7200 1 CEST} + {-766634400 3600 0 CET} + {231202800 7200 1 CEST} + {243903600 3600 0 CET} + {262825200 7200 1 CEST} + {276044400 3600 0 CET} + {581122800 7200 1 CEST} + {591145200 3600 0 CET} + {606870000 7200 1 CEST} + {622594800 3600 0 CET} + {641516400 7200 1 CEST} + {654649200 3600 0 CET} + {1114902000 7200 1 CEST} + {1128038400 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Windhoek b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Windhoek new file mode 100644 index 00000000..d03c8b81 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Africa/Windhoek @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Windhoek) { + {-9223372036854775808 4104 0 LMT} + {-2458170504 5400 0 +0130} + {-2109288600 7200 0 SAST} + {-860976000 10800 1 SAST} + {-845254800 7200 0 SAST} + {637970400 7200 0 CAT} + {764200800 3600 1 WAT} + {778640400 7200 0 CAT} + {796780800 3600 1 WAT} + {810090000 7200 0 CAT} + {828835200 3600 1 WAT} + {841539600 7200 0 CAT} + {860284800 3600 1 WAT} + {873594000 7200 0 CAT} + {891734400 3600 1 WAT} + {905043600 7200 0 CAT} + {923184000 3600 1 WAT} + {936493200 7200 0 CAT} + {954633600 3600 1 WAT} + {967942800 7200 0 CAT} + {986083200 3600 1 WAT} + {999392400 7200 0 CAT} + {1018137600 3600 1 WAT} + {1030842000 7200 0 CAT} + {1049587200 3600 1 WAT} + {1062896400 7200 0 CAT} + {1081036800 3600 1 WAT} + {1094346000 7200 0 CAT} + {1112486400 3600 1 WAT} + {1125795600 7200 0 CAT} + {1143936000 3600 1 WAT} + {1157245200 7200 0 CAT} + {1175385600 3600 1 WAT} + {1188694800 7200 0 CAT} + {1207440000 3600 1 WAT} + {1220749200 7200 0 CAT} + {1238889600 3600 1 WAT} + {1252198800 7200 0 CAT} + {1270339200 3600 1 WAT} + {1283648400 7200 0 CAT} + {1301788800 3600 1 WAT} + {1315098000 7200 0 CAT} + {1333238400 3600 1 WAT} + {1346547600 7200 0 CAT} + {1365292800 3600 1 WAT} + {1377997200 7200 0 CAT} + {1396742400 3600 1 WAT} + {1410051600 7200 0 CAT} + {1428192000 3600 1 WAT} + {1441501200 7200 0 CAT} + {1459641600 3600 1 WAT} + {1472950800 7200 0 CAT} + {1491091200 3600 1 WAT} + {1504400400 7200 0 CAT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Adak b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Adak new file mode 100644 index 00000000..04c46282 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Adak @@ -0,0 +1,276 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Adak) { + {-9223372036854775808 44002 0 LMT} + {-3225223727 -42398 0 LMT} + {-2188944802 -39600 0 NST} + {-883573200 -39600 0 NST} + {-880196400 -36000 1 NWT} + {-769395600 -36000 1 NPT} + {-765374400 -39600 0 NST} + {-757342800 -39600 0 NST} + {-86878800 -39600 0 BST} + {-31496400 -39600 0 BST} + {-21466800 -36000 1 BDT} + {-5745600 -39600 0 BST} + {9982800 -36000 1 BDT} + {25704000 -39600 0 BST} + {41432400 -36000 1 BDT} + {57758400 -39600 0 BST} + {73486800 -36000 1 BDT} + {89208000 -39600 0 BST} + {104936400 -36000 1 BDT} + {120657600 -39600 0 BST} + {126709200 -36000 1 BDT} + {152107200 -39600 0 BST} + {162392400 -36000 1 BDT} + {183556800 -39600 0 BST} + {199285200 -36000 1 BDT} + {215611200 -39600 0 BST} + {230734800 -36000 1 BDT} + {247060800 -39600 0 BST} + {262789200 -36000 1 BDT} + {278510400 -39600 0 BST} + {294238800 -36000 1 BDT} + {309960000 -39600 0 BST} + {325688400 -36000 1 BDT} + {341409600 -39600 0 BST} + {357138000 -36000 1 BDT} + {372859200 -39600 0 BST} + {388587600 -36000 1 BDT} + {404913600 -39600 0 BST} + {420037200 -36000 1 BDT} + {439034400 -36000 0 HST} + {452088000 -32400 1 HDT} + {467809200 -36000 0 HST} + {483537600 -32400 1 HDT} + {499258800 -36000 0 HST} + {514987200 -32400 1 HDT} + {530708400 -36000 0 HST} + {544622400 -32400 1 HDT} + {562158000 -36000 0 HST} + {576072000 -32400 1 HDT} + {594212400 -36000 0 HST} + {607521600 -32400 1 HDT} + {625662000 -36000 0 HST} + {638971200 -32400 1 HDT} + {657111600 -36000 0 HST} + {671025600 -32400 1 HDT} + {688561200 -36000 0 HST} + {702475200 -32400 1 HDT} + {720010800 -36000 0 HST} + {733924800 -32400 1 HDT} + {752065200 -36000 0 HST} + {765374400 -32400 1 HDT} + {783514800 -36000 0 HST} + {796824000 -32400 1 HDT} + {814964400 -36000 0 HST} + {828878400 -32400 1 HDT} + {846414000 -36000 0 HST} + {860328000 -32400 1 HDT} + {877863600 -36000 0 HST} + {891777600 -32400 1 HDT} + {909313200 -36000 0 HST} + {923227200 -32400 1 HDT} + {941367600 -36000 0 HST} + {954676800 -32400 1 HDT} + {972817200 -36000 0 HST} + {986126400 -32400 1 HDT} + {1004266800 -36000 0 HST} + {1018180800 -32400 1 HDT} + {1035716400 -36000 0 HST} + {1049630400 -32400 1 HDT} + {1067166000 -36000 0 HST} + {1081080000 -32400 1 HDT} + {1099220400 -36000 0 HST} + {1112529600 -32400 1 HDT} + {1130670000 -36000 0 HST} + {1143979200 -32400 1 HDT} + {1162119600 -36000 0 HST} + {1173614400 -32400 1 HDT} + {1194174000 -36000 0 HST} + {1205064000 -32400 1 HDT} + {1225623600 -36000 0 HST} + {1236513600 -32400 1 HDT} + {1257073200 -36000 0 HST} + {1268568000 -32400 1 HDT} + {1289127600 -36000 0 HST} + {1300017600 -32400 1 HDT} + {1320577200 -36000 0 HST} + {1331467200 -32400 1 HDT} + {1352026800 -36000 0 HST} + {1362916800 -32400 1 HDT} + {1383476400 -36000 0 HST} + {1394366400 -32400 1 HDT} + {1414926000 -36000 0 HST} + {1425816000 -32400 1 HDT} + {1446375600 -36000 0 HST} + {1457870400 -32400 1 HDT} + {1478430000 -36000 0 HST} + {1489320000 -32400 1 HDT} + {1509879600 -36000 0 HST} + {1520769600 -32400 1 HDT} + {1541329200 -36000 0 HST} + {1552219200 -32400 1 HDT} + {1572778800 -36000 0 HST} + {1583668800 -32400 1 HDT} + {1604228400 -36000 0 HST} + {1615723200 -32400 1 HDT} + {1636282800 -36000 0 HST} + {1647172800 -32400 1 HDT} + {1667732400 -36000 0 HST} + {1678622400 -32400 1 HDT} + {1699182000 -36000 0 HST} + {1710072000 -32400 1 HDT} + {1730631600 -36000 0 HST} + {1741521600 -32400 1 HDT} + {1762081200 -36000 0 HST} + {1772971200 -32400 1 HDT} + {1793530800 -36000 0 HST} + {1805025600 -32400 1 HDT} + {1825585200 -36000 0 HST} + {1836475200 -32400 1 HDT} + {1857034800 -36000 0 HST} + {1867924800 -32400 1 HDT} + {1888484400 -36000 0 HST} + {1899374400 -32400 1 HDT} + {1919934000 -36000 0 HST} + {1930824000 -32400 1 HDT} + {1951383600 -36000 0 HST} + {1962878400 -32400 1 HDT} + {1983438000 -36000 0 HST} + {1994328000 -32400 1 HDT} + {2014887600 -36000 0 HST} + {2025777600 -32400 1 HDT} + {2046337200 -36000 0 HST} + {2057227200 -32400 1 HDT} + {2077786800 -36000 0 HST} + {2088676800 -32400 1 HDT} + {2109236400 -36000 0 HST} + {2120126400 -32400 1 HDT} + {2140686000 -36000 0 HST} + {2152180800 -32400 1 HDT} + {2172740400 -36000 0 HST} + {2183630400 -32400 1 HDT} + {2204190000 -36000 0 HST} + {2215080000 -32400 1 HDT} + {2235639600 -36000 0 HST} + {2246529600 -32400 1 HDT} + {2267089200 -36000 0 HST} + {2277979200 -32400 1 HDT} + {2298538800 -36000 0 HST} + {2309428800 -32400 1 HDT} + {2329988400 -36000 0 HST} + {2341483200 -32400 1 HDT} + {2362042800 -36000 0 HST} + {2372932800 -32400 1 HDT} + {2393492400 -36000 0 HST} + {2404382400 -32400 1 HDT} + {2424942000 -36000 0 HST} + {2435832000 -32400 1 HDT} + {2456391600 -36000 0 HST} + {2467281600 -32400 1 HDT} + {2487841200 -36000 0 HST} + {2499336000 -32400 1 HDT} + {2519895600 -36000 0 HST} + {2530785600 -32400 1 HDT} + {2551345200 -36000 0 HST} + {2562235200 -32400 1 HDT} + {2582794800 -36000 0 HST} + {2593684800 -32400 1 HDT} + {2614244400 -36000 0 HST} + {2625134400 -32400 1 HDT} + {2645694000 -36000 0 HST} + {2656584000 -32400 1 HDT} + {2677143600 -36000 0 HST} + {2688638400 -32400 1 HDT} + {2709198000 -36000 0 HST} + {2720088000 -32400 1 HDT} + {2740647600 -36000 0 HST} + {2751537600 -32400 1 HDT} + {2772097200 -36000 0 HST} + {2782987200 -32400 1 HDT} + {2803546800 -36000 0 HST} + {2814436800 -32400 1 HDT} + {2834996400 -36000 0 HST} + {2846491200 -32400 1 HDT} + {2867050800 -36000 0 HST} + {2877940800 -32400 1 HDT} + {2898500400 -36000 0 HST} + {2909390400 -32400 1 HDT} + {2929950000 -36000 0 HST} + {2940840000 -32400 1 HDT} + {2961399600 -36000 0 HST} + {2972289600 -32400 1 HDT} + {2992849200 -36000 0 HST} + {3003739200 -32400 1 HDT} + {3024298800 -36000 0 HST} + {3035793600 -32400 1 HDT} + {3056353200 -36000 0 HST} + {3067243200 -32400 1 HDT} + {3087802800 -36000 0 HST} + {3098692800 -32400 1 HDT} + {3119252400 -36000 0 HST} + {3130142400 -32400 1 HDT} + {3150702000 -36000 0 HST} + {3161592000 -32400 1 HDT} + {3182151600 -36000 0 HST} + {3193041600 -32400 1 HDT} + {3213601200 -36000 0 HST} + {3225096000 -32400 1 HDT} + {3245655600 -36000 0 HST} + {3256545600 -32400 1 HDT} + {3277105200 -36000 0 HST} + {3287995200 -32400 1 HDT} + {3308554800 -36000 0 HST} + {3319444800 -32400 1 HDT} + {3340004400 -36000 0 HST} + {3350894400 -32400 1 HDT} + {3371454000 -36000 0 HST} + {3382948800 -32400 1 HDT} + {3403508400 -36000 0 HST} + {3414398400 -32400 1 HDT} + {3434958000 -36000 0 HST} + {3445848000 -32400 1 HDT} + {3466407600 -36000 0 HST} + {3477297600 -32400 1 HDT} + {3497857200 -36000 0 HST} + {3508747200 -32400 1 HDT} + {3529306800 -36000 0 HST} + {3540196800 -32400 1 HDT} + {3560756400 -36000 0 HST} + {3572251200 -32400 1 HDT} + {3592810800 -36000 0 HST} + {3603700800 -32400 1 HDT} + {3624260400 -36000 0 HST} + {3635150400 -32400 1 HDT} + {3655710000 -36000 0 HST} + {3666600000 -32400 1 HDT} + {3687159600 -36000 0 HST} + {3698049600 -32400 1 HDT} + {3718609200 -36000 0 HST} + {3730104000 -32400 1 HDT} + {3750663600 -36000 0 HST} + {3761553600 -32400 1 HDT} + {3782113200 -36000 0 HST} + {3793003200 -32400 1 HDT} + {3813562800 -36000 0 HST} + {3824452800 -32400 1 HDT} + {3845012400 -36000 0 HST} + {3855902400 -32400 1 HDT} + {3876462000 -36000 0 HST} + {3887352000 -32400 1 HDT} + {3907911600 -36000 0 HST} + {3919406400 -32400 1 HDT} + {3939966000 -36000 0 HST} + {3950856000 -32400 1 HDT} + {3971415600 -36000 0 HST} + {3982305600 -32400 1 HDT} + {4002865200 -36000 0 HST} + {4013755200 -32400 1 HDT} + {4034314800 -36000 0 HST} + {4045204800 -32400 1 HDT} + {4065764400 -36000 0 HST} + {4076654400 -32400 1 HDT} + {4097214000 -36000 0 HST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Anchorage b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Anchorage new file mode 100644 index 00000000..c0ff8de5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Anchorage @@ -0,0 +1,275 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Anchorage) { + {-9223372036854775808 50424 0 LMT} + {-3225223727 -35976 0 LMT} + {-2188951224 -36000 0 AST} + {-883576800 -36000 0 AST} + {-880200000 -32400 1 AWT} + {-769395600 -32400 1 APT} + {-765378000 -36000 0 AST} + {-86882400 -36000 0 AHST} + {-31500000 -36000 0 AHST} + {-21470400 -32400 1 AHDT} + {-5749200 -36000 0 AHST} + {9979200 -32400 1 AHDT} + {25700400 -36000 0 AHST} + {41428800 -32400 1 AHDT} + {57754800 -36000 0 AHST} + {73483200 -32400 1 AHDT} + {89204400 -36000 0 AHST} + {104932800 -32400 1 AHDT} + {120654000 -36000 0 AHST} + {126705600 -32400 1 AHDT} + {152103600 -36000 0 AHST} + {162388800 -32400 1 AHDT} + {183553200 -36000 0 AHST} + {199281600 -32400 1 AHDT} + {215607600 -36000 0 AHST} + {230731200 -32400 1 AHDT} + {247057200 -36000 0 AHST} + {262785600 -32400 1 AHDT} + {278506800 -36000 0 AHST} + {294235200 -32400 1 AHDT} + {309956400 -36000 0 AHST} + {325684800 -32400 1 AHDT} + {341406000 -36000 0 AHST} + {357134400 -32400 1 AHDT} + {372855600 -36000 0 AHST} + {388584000 -32400 1 AHDT} + {404910000 -36000 0 AHST} + {420033600 -32400 1 AHDT} + {439030800 -32400 0 AKST} + {452084400 -28800 1 AKDT} + {467805600 -32400 0 AKST} + {483534000 -28800 1 AKDT} + {499255200 -32400 0 AKST} + {514983600 -28800 1 AKDT} + {530704800 -32400 0 AKST} + {544618800 -28800 1 AKDT} + {562154400 -32400 0 AKST} + {576068400 -28800 1 AKDT} + {594208800 -32400 0 AKST} + {607518000 -28800 1 AKDT} + {625658400 -32400 0 AKST} + {638967600 -28800 1 AKDT} + {657108000 -32400 0 AKST} + {671022000 -28800 1 AKDT} + {688557600 -32400 0 AKST} + {702471600 -28800 1 AKDT} + {720007200 -32400 0 AKST} + {733921200 -28800 1 AKDT} + {752061600 -32400 0 AKST} + {765370800 -28800 1 AKDT} + {783511200 -32400 0 AKST} + {796820400 -28800 1 AKDT} + {814960800 -32400 0 AKST} + {828874800 -28800 1 AKDT} + {846410400 -32400 0 AKST} + {860324400 -28800 1 AKDT} + {877860000 -32400 0 AKST} + {891774000 -28800 1 AKDT} + {909309600 -32400 0 AKST} + {923223600 -28800 1 AKDT} + {941364000 -32400 0 AKST} + {954673200 -28800 1 AKDT} + {972813600 -32400 0 AKST} + {986122800 -28800 1 AKDT} + {1004263200 -32400 0 AKST} + {1018177200 -28800 1 AKDT} + {1035712800 -32400 0 AKST} + {1049626800 -28800 1 AKDT} + {1067162400 -32400 0 AKST} + {1081076400 -28800 1 AKDT} + {1099216800 -32400 0 AKST} + {1112526000 -28800 1 AKDT} + {1130666400 -32400 0 AKST} + {1143975600 -28800 1 AKDT} + {1162116000 -32400 0 AKST} + {1173610800 -28800 1 AKDT} + {1194170400 -32400 0 AKST} + {1205060400 -28800 1 AKDT} + {1225620000 -32400 0 AKST} + {1236510000 -28800 1 AKDT} + {1257069600 -32400 0 AKST} + {1268564400 -28800 1 AKDT} + {1289124000 -32400 0 AKST} + {1300014000 -28800 1 AKDT} + {1320573600 -32400 0 AKST} + {1331463600 -28800 1 AKDT} + {1352023200 -32400 0 AKST} + {1362913200 -28800 1 AKDT} + {1383472800 -32400 0 AKST} + {1394362800 -28800 1 AKDT} + {1414922400 -32400 0 AKST} + {1425812400 -28800 1 AKDT} + {1446372000 -32400 0 AKST} + {1457866800 -28800 1 AKDT} + {1478426400 -32400 0 AKST} + {1489316400 -28800 1 AKDT} + {1509876000 -32400 0 AKST} + {1520766000 -28800 1 AKDT} + {1541325600 -32400 0 AKST} + {1552215600 -28800 1 AKDT} + {1572775200 -32400 0 AKST} + {1583665200 -28800 1 AKDT} + {1604224800 -32400 0 AKST} + {1615719600 -28800 1 AKDT} + {1636279200 -32400 0 AKST} + {1647169200 -28800 1 AKDT} + {1667728800 -32400 0 AKST} + {1678618800 -28800 1 AKDT} + {1699178400 -32400 0 AKST} + {1710068400 -28800 1 AKDT} + {1730628000 -32400 0 AKST} + {1741518000 -28800 1 AKDT} + {1762077600 -32400 0 AKST} + {1772967600 -28800 1 AKDT} + {1793527200 -32400 0 AKST} + {1805022000 -28800 1 AKDT} + {1825581600 -32400 0 AKST} + {1836471600 -28800 1 AKDT} + {1857031200 -32400 0 AKST} + {1867921200 -28800 1 AKDT} + {1888480800 -32400 0 AKST} + {1899370800 -28800 1 AKDT} + {1919930400 -32400 0 AKST} + {1930820400 -28800 1 AKDT} + {1951380000 -32400 0 AKST} + {1962874800 -28800 1 AKDT} + {1983434400 -32400 0 AKST} + {1994324400 -28800 1 AKDT} + {2014884000 -32400 0 AKST} + {2025774000 -28800 1 AKDT} + {2046333600 -32400 0 AKST} + {2057223600 -28800 1 AKDT} + {2077783200 -32400 0 AKST} + {2088673200 -28800 1 AKDT} + {2109232800 -32400 0 AKST} + {2120122800 -28800 1 AKDT} + {2140682400 -32400 0 AKST} + {2152177200 -28800 1 AKDT} + {2172736800 -32400 0 AKST} + {2183626800 -28800 1 AKDT} + {2204186400 -32400 0 AKST} + {2215076400 -28800 1 AKDT} + {2235636000 -32400 0 AKST} + {2246526000 -28800 1 AKDT} + {2267085600 -32400 0 AKST} + {2277975600 -28800 1 AKDT} + {2298535200 -32400 0 AKST} + {2309425200 -28800 1 AKDT} + {2329984800 -32400 0 AKST} + {2341479600 -28800 1 AKDT} + {2362039200 -32400 0 AKST} + {2372929200 -28800 1 AKDT} + {2393488800 -32400 0 AKST} + {2404378800 -28800 1 AKDT} + {2424938400 -32400 0 AKST} + {2435828400 -28800 1 AKDT} + {2456388000 -32400 0 AKST} + {2467278000 -28800 1 AKDT} + {2487837600 -32400 0 AKST} + {2499332400 -28800 1 AKDT} + {2519892000 -32400 0 AKST} + {2530782000 -28800 1 AKDT} + {2551341600 -32400 0 AKST} + {2562231600 -28800 1 AKDT} + {2582791200 -32400 0 AKST} + {2593681200 -28800 1 AKDT} + {2614240800 -32400 0 AKST} + {2625130800 -28800 1 AKDT} + {2645690400 -32400 0 AKST} + {2656580400 -28800 1 AKDT} + {2677140000 -32400 0 AKST} + {2688634800 -28800 1 AKDT} + {2709194400 -32400 0 AKST} + {2720084400 -28800 1 AKDT} + {2740644000 -32400 0 AKST} + {2751534000 -28800 1 AKDT} + {2772093600 -32400 0 AKST} + {2782983600 -28800 1 AKDT} + {2803543200 -32400 0 AKST} + {2814433200 -28800 1 AKDT} + {2834992800 -32400 0 AKST} + {2846487600 -28800 1 AKDT} + {2867047200 -32400 0 AKST} + {2877937200 -28800 1 AKDT} + {2898496800 -32400 0 AKST} + {2909386800 -28800 1 AKDT} + {2929946400 -32400 0 AKST} + {2940836400 -28800 1 AKDT} + {2961396000 -32400 0 AKST} + {2972286000 -28800 1 AKDT} + {2992845600 -32400 0 AKST} + {3003735600 -28800 1 AKDT} + {3024295200 -32400 0 AKST} + {3035790000 -28800 1 AKDT} + {3056349600 -32400 0 AKST} + {3067239600 -28800 1 AKDT} + {3087799200 -32400 0 AKST} + {3098689200 -28800 1 AKDT} + {3119248800 -32400 0 AKST} + {3130138800 -28800 1 AKDT} + {3150698400 -32400 0 AKST} + {3161588400 -28800 1 AKDT} + {3182148000 -32400 0 AKST} + {3193038000 -28800 1 AKDT} + {3213597600 -32400 0 AKST} + {3225092400 -28800 1 AKDT} + {3245652000 -32400 0 AKST} + {3256542000 -28800 1 AKDT} + {3277101600 -32400 0 AKST} + {3287991600 -28800 1 AKDT} + {3308551200 -32400 0 AKST} + {3319441200 -28800 1 AKDT} + {3340000800 -32400 0 AKST} + {3350890800 -28800 1 AKDT} + {3371450400 -32400 0 AKST} + {3382945200 -28800 1 AKDT} + {3403504800 -32400 0 AKST} + {3414394800 -28800 1 AKDT} + {3434954400 -32400 0 AKST} + {3445844400 -28800 1 AKDT} + {3466404000 -32400 0 AKST} + {3477294000 -28800 1 AKDT} + {3497853600 -32400 0 AKST} + {3508743600 -28800 1 AKDT} + {3529303200 -32400 0 AKST} + {3540193200 -28800 1 AKDT} + {3560752800 -32400 0 AKST} + {3572247600 -28800 1 AKDT} + {3592807200 -32400 0 AKST} + {3603697200 -28800 1 AKDT} + {3624256800 -32400 0 AKST} + {3635146800 -28800 1 AKDT} + {3655706400 -32400 0 AKST} + {3666596400 -28800 1 AKDT} + {3687156000 -32400 0 AKST} + {3698046000 -28800 1 AKDT} + {3718605600 -32400 0 AKST} + {3730100400 -28800 1 AKDT} + {3750660000 -32400 0 AKST} + {3761550000 -28800 1 AKDT} + {3782109600 -32400 0 AKST} + {3792999600 -28800 1 AKDT} + {3813559200 -32400 0 AKST} + {3824449200 -28800 1 AKDT} + {3845008800 -32400 0 AKST} + {3855898800 -28800 1 AKDT} + {3876458400 -32400 0 AKST} + {3887348400 -28800 1 AKDT} + {3907908000 -32400 0 AKST} + {3919402800 -28800 1 AKDT} + {3939962400 -32400 0 AKST} + {3950852400 -28800 1 AKDT} + {3971412000 -32400 0 AKST} + {3982302000 -28800 1 AKDT} + {4002861600 -32400 0 AKST} + {4013751600 -28800 1 AKDT} + {4034311200 -32400 0 AKST} + {4045201200 -28800 1 AKDT} + {4065760800 -32400 0 AKST} + {4076650800 -28800 1 AKDT} + {4097210400 -32400 0 AKST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Buenos_Aires b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Buenos_Aires new file mode 100644 index 00000000..40f1912d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Buenos_Aires @@ -0,0 +1,67 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Buenos_Aires) { + {-9223372036854775808 -14028 0 LMT} + {-2372097972 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667965600 -10800 0 -03} + {687927600 -7200 1 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224385200 -7200 1 -03} + {1237082400 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Jujuy b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Jujuy new file mode 100644 index 00000000..72080f5c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Jujuy @@ -0,0 +1,67 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Jujuy) { + {-9223372036854775808 -15672 0 LMT} + {-2372096328 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -14400 0 -04} + {657086400 -10800 1 -03} + {669178800 -14400 0 -04} + {686721600 -7200 1 -02} + {694231200 -7200 0 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Rio_Gallegos b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Rio_Gallegos new file mode 100644 index 00000000..2a197a46 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Rio_Gallegos @@ -0,0 +1,68 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Rio_Gallegos) { + {-9223372036854775808 -16612 0 LMT} + {-2372095388 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667965600 -10800 0 -03} + {687927600 -7200 1 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1086058800 -14400 0 -04} + {1087704000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/San_Juan b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/San_Juan new file mode 100644 index 00000000..d67f6883 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/San_Juan @@ -0,0 +1,69 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/San_Juan) { + {-9223372036854775808 -16444 0 LMT} + {-2372095556 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667792800 -14400 0 -04} + {673588800 -10800 0 -03} + {687927600 -7200 1 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1085972400 -14400 0 -04} + {1090728000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/San_Luis b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/San_Luis new file mode 100644 index 00000000..4d27c329 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/San_Luis @@ -0,0 +1,68 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/San_Luis) { + {-9223372036854775808 -15924 0 LMT} + {-2372096076 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {631159200 -7200 1 -02} + {637380000 -14400 0 -04} + {655963200 -10800 1 -03} + {667796400 -14400 0 -04} + {675748800 -10800 0 -03} + {938919600 -10800 1 -03} + {952052400 -10800 0 -03} + {1085972400 -14400 0 -04} + {1090728000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1200880800 -10800 0 -04} + {1205031600 -14400 0 -04} + {1223784000 -10800 1 -04} + {1236481200 -14400 0 -04} + {1255233600 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Tucuman b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Tucuman new file mode 100644 index 00000000..6809800e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Argentina/Tucuman @@ -0,0 +1,69 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Tucuman) { + {-9223372036854775808 -15652 0 LMT} + {-2372096348 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667965600 -14400 0 -04} + {687931200 -7200 0 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1086058800 -14400 0 -04} + {1087099200 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224385200 -7200 1 -03} + {1237082400 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Asuncion b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Asuncion new file mode 100644 index 00000000..8e6c1b0d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Asuncion @@ -0,0 +1,259 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Asuncion) { + {-9223372036854775808 -13840 0 LMT} + {-2524507760 -13840 0 AMT} + {-1206389360 -14400 0 -04} + {86760000 -10800 0 -03} + {134017200 -14400 0 -04} + {162878400 -14400 0 -04} + {181368000 -10800 1 -04} + {194497200 -14400 0 -04} + {212990400 -10800 1 -04} + {226033200 -14400 0 -04} + {244526400 -10800 1 -04} + {257569200 -14400 0 -04} + {276062400 -10800 1 -04} + {291783600 -14400 0 -04} + {307598400 -10800 1 -04} + {323406000 -14400 0 -04} + {339220800 -10800 1 -04} + {354942000 -14400 0 -04} + {370756800 -10800 1 -04} + {386478000 -14400 0 -04} + {402292800 -10800 1 -04} + {418014000 -14400 0 -04} + {433828800 -10800 1 -04} + {449636400 -14400 0 -04} + {465451200 -10800 1 -04} + {481172400 -14400 0 -04} + {496987200 -10800 1 -04} + {512708400 -14400 0 -04} + {528523200 -10800 1 -04} + {544244400 -14400 0 -04} + {560059200 -10800 1 -04} + {575866800 -14400 0 -04} + {591681600 -10800 1 -04} + {607402800 -14400 0 -04} + {625032000 -10800 1 -04} + {638938800 -14400 0 -04} + {654753600 -10800 1 -04} + {670474800 -14400 0 -04} + {686721600 -10800 1 -04} + {699418800 -14400 0 -04} + {718257600 -10800 1 -04} + {733546800 -14400 0 -04} + {749448000 -10800 1 -04} + {762318000 -14400 0 -04} + {780984000 -10800 1 -04} + {793767600 -14400 0 -04} + {812520000 -10800 1 -04} + {825649200 -14400 0 -04} + {844574400 -10800 1 -04} + {856666800 -14400 0 -04} + {876024000 -10800 1 -04} + {888721200 -14400 0 -04} + {907473600 -10800 1 -04} + {920775600 -14400 0 -04} + {938923200 -10800 1 -04} + {952225200 -14400 0 -04} + {970372800 -10800 1 -04} + {983674800 -14400 0 -04} + {1002427200 -10800 1 -04} + {1018148400 -14400 0 -04} + {1030852800 -10800 1 -04} + {1049598000 -14400 0 -04} + {1062907200 -10800 1 -04} + {1081047600 -14400 0 -04} + {1097985600 -10800 1 -04} + {1110682800 -14400 0 -04} + {1129435200 -10800 1 -04} + {1142132400 -14400 0 -04} + {1160884800 -10800 1 -04} + {1173582000 -14400 0 -04} + {1192939200 -10800 1 -04} + {1205031600 -14400 0 -04} + {1224388800 -10800 1 -04} + {1236481200 -14400 0 -04} + {1255838400 -10800 1 -04} + {1270954800 -14400 0 -04} + {1286078400 -10800 1 -04} + {1302404400 -14400 0 -04} + {1317528000 -10800 1 -04} + {1333854000 -14400 0 -04} + {1349582400 -10800 1 -04} + {1364094000 -14400 0 -04} + {1381032000 -10800 1 -04} + {1395543600 -14400 0 -04} + {1412481600 -10800 1 -04} + {1426993200 -14400 0 -04} + {1443931200 -10800 1 -04} + {1459047600 -14400 0 -04} + {1475380800 -10800 1 -04} + {1490497200 -14400 0 -04} + {1506830400 -10800 1 -04} + {1521946800 -14400 0 -04} + {1538884800 -10800 1 -04} + {1553396400 -14400 0 -04} + {1570334400 -10800 1 -04} + {1584846000 -14400 0 -04} + {1601784000 -10800 1 -04} + {1616900400 -14400 0 -04} + {1633233600 -10800 1 -04} + {1648350000 -14400 0 -04} + {1664683200 -10800 1 -04} + {1679799600 -14400 0 -04} + {1696132800 -10800 1 -04} + {1711249200 -14400 0 -04} + {1728187200 -10800 1 -04} + {1742698800 -14400 0 -04} + {1759636800 -10800 1 -04} + {1774148400 -14400 0 -04} + {1791086400 -10800 1 -04} + {1806202800 -14400 0 -04} + {1822536000 -10800 1 -04} + {1837652400 -14400 0 -04} + {1853985600 -10800 1 -04} + {1869102000 -14400 0 -04} + {1886040000 -10800 1 -04} + {1900551600 -14400 0 -04} + {1917489600 -10800 1 -04} + {1932001200 -14400 0 -04} + {1948939200 -10800 1 -04} + {1964055600 -14400 0 -04} + {1980388800 -10800 1 -04} + {1995505200 -14400 0 -04} + {2011838400 -10800 1 -04} + {2026954800 -14400 0 -04} + {2043288000 -10800 1 -04} + {2058404400 -14400 0 -04} + {2075342400 -10800 1 -04} + {2089854000 -14400 0 -04} + {2106792000 -10800 1 -04} + {2121303600 -14400 0 -04} + {2138241600 -10800 1 -04} + {2153358000 -14400 0 -04} + {2169691200 -10800 1 -04} + {2184807600 -14400 0 -04} + {2201140800 -10800 1 -04} + {2216257200 -14400 0 -04} + {2233195200 -10800 1 -04} + {2247706800 -14400 0 -04} + {2264644800 -10800 1 -04} + {2279156400 -14400 0 -04} + {2296094400 -10800 1 -04} + {2310606000 -14400 0 -04} + {2327544000 -10800 1 -04} + {2342660400 -14400 0 -04} + {2358993600 -10800 1 -04} + {2374110000 -14400 0 -04} + {2390443200 -10800 1 -04} + {2405559600 -14400 0 -04} + {2422497600 -10800 1 -04} + {2437009200 -14400 0 -04} + {2453947200 -10800 1 -04} + {2468458800 -14400 0 -04} + {2485396800 -10800 1 -04} + {2500513200 -14400 0 -04} + {2516846400 -10800 1 -04} + {2531962800 -14400 0 -04} + {2548296000 -10800 1 -04} + {2563412400 -14400 0 -04} + {2579745600 -10800 1 -04} + {2594862000 -14400 0 -04} + {2611800000 -10800 1 -04} + {2626311600 -14400 0 -04} + {2643249600 -10800 1 -04} + {2657761200 -14400 0 -04} + {2674699200 -10800 1 -04} + {2689815600 -14400 0 -04} + {2706148800 -10800 1 -04} + {2721265200 -14400 0 -04} + {2737598400 -10800 1 -04} + {2752714800 -14400 0 -04} + {2769652800 -10800 1 -04} + {2784164400 -14400 0 -04} + {2801102400 -10800 1 -04} + {2815614000 -14400 0 -04} + {2832552000 -10800 1 -04} + {2847668400 -14400 0 -04} + {2864001600 -10800 1 -04} + {2879118000 -14400 0 -04} + {2895451200 -10800 1 -04} + {2910567600 -14400 0 -04} + {2926900800 -10800 1 -04} + {2942017200 -14400 0 -04} + {2958955200 -10800 1 -04} + {2973466800 -14400 0 -04} + {2990404800 -10800 1 -04} + {3004916400 -14400 0 -04} + {3021854400 -10800 1 -04} + {3036970800 -14400 0 -04} + {3053304000 -10800 1 -04} + {3068420400 -14400 0 -04} + {3084753600 -10800 1 -04} + {3099870000 -14400 0 -04} + {3116808000 -10800 1 -04} + {3131319600 -14400 0 -04} + {3148257600 -10800 1 -04} + {3162769200 -14400 0 -04} + {3179707200 -10800 1 -04} + {3194218800 -14400 0 -04} + {3211156800 -10800 1 -04} + {3226273200 -14400 0 -04} + {3242606400 -10800 1 -04} + {3257722800 -14400 0 -04} + {3274056000 -10800 1 -04} + {3289172400 -14400 0 -04} + {3306110400 -10800 1 -04} + {3320622000 -14400 0 -04} + {3337560000 -10800 1 -04} + {3352071600 -14400 0 -04} + {3369009600 -10800 1 -04} + {3384126000 -14400 0 -04} + {3400459200 -10800 1 -04} + {3415575600 -14400 0 -04} + {3431908800 -10800 1 -04} + {3447025200 -14400 0 -04} + {3463358400 -10800 1 -04} + {3478474800 -14400 0 -04} + {3495412800 -10800 1 -04} + {3509924400 -14400 0 -04} + {3526862400 -10800 1 -04} + {3541374000 -14400 0 -04} + {3558312000 -10800 1 -04} + {3573428400 -14400 0 -04} + {3589761600 -10800 1 -04} + {3604878000 -14400 0 -04} + {3621211200 -10800 1 -04} + {3636327600 -14400 0 -04} + {3653265600 -10800 1 -04} + {3667777200 -14400 0 -04} + {3684715200 -10800 1 -04} + {3699226800 -14400 0 -04} + {3716164800 -10800 1 -04} + {3731281200 -14400 0 -04} + {3747614400 -10800 1 -04} + {3762730800 -14400 0 -04} + {3779064000 -10800 1 -04} + {3794180400 -14400 0 -04} + {3810513600 -10800 1 -04} + {3825630000 -14400 0 -04} + {3842568000 -10800 1 -04} + {3857079600 -14400 0 -04} + {3874017600 -10800 1 -04} + {3888529200 -14400 0 -04} + {3905467200 -10800 1 -04} + {3920583600 -14400 0 -04} + {3936916800 -10800 1 -04} + {3952033200 -14400 0 -04} + {3968366400 -10800 1 -04} + {3983482800 -14400 0 -04} + {4000420800 -10800 1 -04} + {4014932400 -14400 0 -04} + {4031870400 -10800 1 -04} + {4046382000 -14400 0 -04} + {4063320000 -10800 1 -04} + {4077831600 -14400 0 -04} + {4094769600 -10800 1 -04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Atikokan b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Atikokan new file mode 100644 index 00000000..0f7e4dd8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Atikokan @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Panama)]} { + LoadTimeZoneFile America/Panama +} +set TZData(:America/Atikokan) $TZData(:America/Panama) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Bahia_Banderas b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Bahia_Banderas new file mode 100644 index 00000000..cdcc4b3c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Bahia_Banderas @@ -0,0 +1,68 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Bahia_Banderas) { + {-9223372036854775808 -25260 0 LMT} + {-1514739600 -25200 0 MST} + {-1343066400 -21600 0 CST} + {-1234807200 -25200 0 MST} + {-1220292000 -21600 1 MDT} + {-1207159200 -25200 0 MST} + {-1191344400 -21600 0 CST} + {-873828000 -25200 0 MST} + {-661539600 -28800 0 PST} + {28800 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {989139600 -21600 1 MDT} + {1001836800 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1175418000 -21600 1 MDT} + {1193558400 -25200 0 MST} + {1207472400 -21600 1 MDT} + {1225008000 -25200 0 MST} + {1238922000 -21600 1 MDT} + {1256457600 -25200 0 MST} + {1270371600 -18000 0 CDT} + {1288508400 -21600 0 CST} + {1301817600 -18000 1 CDT} + {1319958000 -21600 0 CST} + {1333267200 -18000 1 CDT} + {1351407600 -21600 0 CST} + {1365321600 -18000 1 CDT} + {1382857200 -21600 0 CST} + {1396771200 -18000 1 CDT} + {1414306800 -21600 0 CST} + {1428220800 -18000 1 CDT} + {1445756400 -21600 0 CST} + {1459670400 -18000 1 CDT} + {1477810800 -21600 0 CST} + {1491120000 -18000 1 CDT} + {1509260400 -21600 0 CST} + {1522569600 -18000 1 CDT} + {1540710000 -21600 0 CST} + {1554624000 -18000 1 CDT} + {1572159600 -21600 0 CST} + {1586073600 -18000 1 CDT} + {1603609200 -21600 0 CST} + {1617523200 -18000 1 CDT} + {1635663600 -21600 0 CST} + {1648972800 -18000 1 CDT} + {1667113200 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Barbados b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Barbados new file mode 100644 index 00000000..f0746830 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Barbados @@ -0,0 +1,22 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Barbados) { + {-9223372036854775808 -14309 0 LMT} + {-1841256091 -14400 0 AST} + {-874263600 -10800 1 ADT} + {-862682400 -14400 0 AST} + {-841604400 -10800 1 ADT} + {-830714400 -14400 0 AST} + {-820526400 -14400 0 -0330} + {-811882800 -12600 1 AST} + {-798660000 -14400 0 -0330} + {-788904000 -14400 0 AST} + {234943200 -10800 1 ADT} + {244616400 -14400 0 AST} + {261554400 -10800 1 ADT} + {276066000 -14400 0 AST} + {293004000 -10800 1 ADT} + {307515600 -14400 0 AST} + {325058400 -10800 1 ADT} + {338706000 -14400 0 AST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Belem b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Belem new file mode 100644 index 00000000..42a3ec5a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Belem @@ -0,0 +1,35 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Belem) { + {-9223372036854775808 -11636 0 LMT} + {-1767213964 -10800 0 -03} + {-1206957600 -7200 1 -03} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -03} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -03} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -03} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -03} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -03} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -03} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -03} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -03} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -03} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -03} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -03} + {511236000 -10800 0 -03} + {530593200 -7200 1 -03} + {540266400 -10800 0 -03} + {562129200 -7200 1 -03} + {571197600 -10800 0 -03} + {590032800 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Belize b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Belize new file mode 100644 index 00000000..3b3f9e4f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Belize @@ -0,0 +1,103 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Belize) { + {-9223372036854775808 -21168 0 LMT} + {-1822500432 -21600 0 CST} + {-1616954400 -19800 1 -0530} + {-1606069800 -21600 0 CST} + {-1585504800 -19800 1 -0530} + {-1574015400 -21600 0 CST} + {-1554055200 -19800 1 -0530} + {-1542565800 -21600 0 CST} + {-1522605600 -19800 1 -0530} + {-1511116200 -21600 0 CST} + {-1490551200 -19800 1 -0530} + {-1479666600 -21600 0 CST} + {-1459101600 -19800 1 -0530} + {-1448217000 -21600 0 CST} + {-1427652000 -19800 1 -0530} + {-1416162600 -21600 0 CST} + {-1396202400 -19800 1 -0530} + {-1384713000 -21600 0 CST} + {-1364752800 -19800 1 -0530} + {-1353263400 -21600 0 CST} + {-1333303200 -19800 1 -0530} + {-1321813800 -21600 0 CST} + {-1301248800 -19800 1 -0530} + {-1290364200 -21600 0 CST} + {-1269799200 -19800 1 -0530} + {-1258914600 -21600 0 CST} + {-1238349600 -19800 1 -0530} + {-1226860200 -21600 0 CST} + {-1206900000 -19800 1 -0530} + {-1195410600 -21600 0 CST} + {-1175450400 -19800 1 -0530} + {-1163961000 -21600 0 CST} + {-1143396000 -19800 1 -0530} + {-1132511400 -21600 0 CST} + {-1111946400 -19800 1 -0530} + {-1101061800 -21600 0 CST} + {-1080496800 -19800 1 -0530} + {-1069612200 -21600 0 CST} + {-1049047200 -19800 1 -0530} + {-1037557800 -21600 0 CST} + {-1017597600 -19800 1 -0530} + {-1006108200 -21600 0 CST} + {-986148000 -19800 1 -0530} + {-974658600 -21600 0 CST} + {-954093600 -19800 1 -0530} + {-943209000 -21600 0 CST} + {-922644000 -19800 1 -0530} + {-911759400 -21600 0 CST} + {-891194400 -19800 1 -0530} + {-879705000 -21600 0 CST} + {-868212000 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-758746800 -21600 0 CST} + {-701892000 -19800 1 -0530} + {-690402600 -21600 0 CST} + {-670442400 -19800 1 -0530} + {-658953000 -21600 0 CST} + {-638992800 -19800 1 -0530} + {-627503400 -21600 0 CST} + {-606938400 -19800 1 -0530} + {-596053800 -21600 0 CST} + {-575488800 -19800 1 -0530} + {-564604200 -21600 0 CST} + {-544039200 -19800 1 -0530} + {-532549800 -21600 0 CST} + {-512589600 -19800 1 -0530} + {-501100200 -21600 0 CST} + {-481140000 -19800 1 -0530} + {-469650600 -21600 0 CST} + {-449690400 -19800 1 -0530} + {-438201000 -21600 0 CST} + {-417636000 -19800 1 -0530} + {-406751400 -21600 0 CST} + {-386186400 -19800 1 -0530} + {-375301800 -21600 0 CST} + {-354736800 -19800 1 -0530} + {-343247400 -21600 0 CST} + {-323287200 -19800 1 -0530} + {-311797800 -21600 0 CST} + {-291837600 -19800 1 -0530} + {-280348200 -21600 0 CST} + {-259783200 -19800 1 -0530} + {-248898600 -21600 0 CST} + {-228333600 -19800 1 -0530} + {-217449000 -21600 0 CST} + {-196884000 -19800 1 -0530} + {-185999400 -21600 0 CST} + {-165434400 -19800 1 -0530} + {-153945000 -21600 0 CST} + {-133984800 -19800 1 -0530} + {-122495400 -21600 0 CST} + {-102535200 -19800 1 -0530} + {-91045800 -21600 0 CST} + {-70480800 -19800 1 -0530} + {-59596200 -21600 0 CST} + {123919200 -18000 1 CDT} + {129618000 -21600 0 CST} + {409039200 -18000 1 CDT} + {413874000 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Blanc-Sablon b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Blanc-Sablon new file mode 100644 index 00000000..55db5911 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Blanc-Sablon @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/Blanc-Sablon) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Boise b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Boise new file mode 100644 index 00000000..62b22a01 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Boise @@ -0,0 +1,281 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Boise) { + {-9223372036854775808 -27889 0 LMT} + {-2717640000 -28800 0 PST} + {-1633269600 -25200 1 PDT} + {-1615129200 -28800 0 PST} + {-1601820000 -25200 1 PDT} + {-1583679600 -28800 0 PST} + {-1471788000 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-52930800 -21600 1 MDT} + {-37209600 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {9968400 -21600 1 MDT} + {25689600 -25200 0 MST} + {41418000 -21600 1 MDT} + {57744000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {126255600 -25200 0 MST} + {129114000 -21600 0 MDT} + {152092800 -25200 0 MST} + {162378000 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Buenos_Aires b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Buenos_Aires new file mode 100644 index 00000000..13891954 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Buenos_Aires @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Argentina/Buenos_Aires)]} { + LoadTimeZoneFile America/Argentina/Buenos_Aires +} +set TZData(:America/Buenos_Aires) $TZData(:America/Argentina/Buenos_Aires) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cambridge_Bay b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cambridge_Bay new file mode 100644 index 00000000..3115ee1b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cambridge_Bay @@ -0,0 +1,252 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Cambridge_Bay) { + {-9223372036854775808 0 0 -00} + {-1577923200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-147891600 -18000 1 MDDT} + {-131562000 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941360400 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -18000 0 EST} + {973400400 -21600 0 CST} + {986115600 -21600 0 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Campo_Grande b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Campo_Grande new file mode 100644 index 00000000..904c27de --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Campo_Grande @@ -0,0 +1,96 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Campo_Grande) { + {-9223372036854775808 -13108 0 LMT} + {-1767212492 -14400 0 -04} + {-1206954000 -10800 1 -04} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -04} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -04} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -04} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -04} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -04} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -04} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -04} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -04} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -04} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -04} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -04} + {511239600 -14400 0 -04} + {530596800 -10800 1 -04} + {540270000 -14400 0 -04} + {562132800 -10800 1 -04} + {571201200 -14400 0 -04} + {592977600 -10800 1 -04} + {602046000 -14400 0 -04} + {624427200 -10800 1 -04} + {634705200 -14400 0 -04} + {656481600 -10800 1 -04} + {666759600 -14400 0 -04} + {687931200 -10800 1 -04} + {697604400 -14400 0 -04} + {719985600 -10800 1 -04} + {728449200 -14400 0 -04} + {750830400 -10800 1 -04} + {761713200 -14400 0 -04} + {782280000 -10800 1 -04} + {793162800 -14400 0 -04} + {813729600 -10800 1 -04} + {824007600 -14400 0 -04} + {844574400 -10800 1 -04} + {856062000 -14400 0 -04} + {876110400 -10800 1 -04} + {888721200 -14400 0 -04} + {908078400 -10800 1 -04} + {919566000 -14400 0 -04} + {938923200 -10800 1 -04} + {951620400 -14400 0 -04} + {970977600 -10800 1 -04} + {982465200 -14400 0 -04} + {1003032000 -10800 1 -04} + {1013914800 -14400 0 -04} + {1036296000 -10800 1 -04} + {1045364400 -14400 0 -04} + {1066536000 -10800 1 -04} + {1076814000 -14400 0 -04} + {1099368000 -10800 1 -04} + {1108868400 -14400 0 -04} + {1129435200 -10800 1 -04} + {1140318000 -14400 0 -04} + {1162699200 -10800 1 -04} + {1172372400 -14400 0 -04} + {1192334400 -10800 1 -04} + {1203217200 -14400 0 -04} + {1224388800 -10800 1 -04} + {1234666800 -14400 0 -04} + {1255838400 -10800 1 -04} + {1266721200 -14400 0 -04} + {1287288000 -10800 1 -04} + {1298170800 -14400 0 -04} + {1318737600 -10800 1 -04} + {1330225200 -14400 0 -04} + {1350792000 -10800 1 -04} + {1361070000 -14400 0 -04} + {1382241600 -10800 1 -04} + {1392519600 -14400 0 -04} + {1413691200 -10800 1 -04} + {1424574000 -14400 0 -04} + {1445140800 -10800 1 -04} + {1456023600 -14400 0 -04} + {1476590400 -10800 1 -04} + {1487473200 -14400 0 -04} + {1508040000 -10800 1 -04} + {1518922800 -14400 0 -04} + {1541304000 -10800 1 -04} + {1550372400 -14400 0 -04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cancun b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cancun new file mode 100644 index 00000000..fe5a0609 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cancun @@ -0,0 +1,47 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Cancun) { + {-9223372036854775808 -20824 0 LMT} + {-1514743200 -21600 0 CST} + {377935200 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {902041200 -18000 0 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {989136000 -18000 1 CDT} + {1001833200 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1175414400 -18000 1 CDT} + {1193554800 -21600 0 CST} + {1207468800 -18000 1 CDT} + {1225004400 -21600 0 CST} + {1238918400 -18000 1 CDT} + {1256454000 -21600 0 CST} + {1270368000 -18000 1 CDT} + {1288508400 -21600 0 CST} + {1301817600 -18000 1 CDT} + {1319958000 -21600 0 CST} + {1333267200 -18000 1 CDT} + {1351407600 -21600 0 CST} + {1365321600 -18000 1 CDT} + {1382857200 -21600 0 CST} + {1396771200 -18000 1 CDT} + {1414306800 -21600 0 CST} + {1422777600 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Caracas b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Caracas new file mode 100644 index 00000000..f0dbffeb --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Caracas @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Caracas) { + {-9223372036854775808 -16064 0 LMT} + {-2524505536 -16060 0 CMT} + {-1826739140 -16200 0 -0430} + {-157750200 -14400 0 -04} + {1197183600 -16200 0 -0430} + {1462086000 -14400 0 -04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cayenne b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cayenne new file mode 100644 index 00000000..6b1a3e90 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cayenne @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Cayenne) { + {-9223372036854775808 -12560 0 LMT} + {-1846269040 -14400 0 -04} + {-71092800 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cayman b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cayman new file mode 100644 index 00000000..92ce5e23 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Cayman @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Panama)]} { + LoadTimeZoneFile America/Panama +} +set TZData(:America/Cayman) $TZData(:America/Panama) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Chicago b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Chicago new file mode 100644 index 00000000..545aedb4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Chicago @@ -0,0 +1,369 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Chicago) { + {-9223372036854775808 -21036 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-1577901600 -21600 0 CST} + {-1563724800 -18000 1 CDT} + {-1551632400 -21600 0 CST} + {-1538928000 -18000 1 CDT} + {-1520182800 -21600 0 CST} + {-1504454400 -18000 1 CDT} + {-1491757200 -21600 0 CST} + {-1473004800 -18000 1 CDT} + {-1459702800 -21600 0 CST} + {-1441555200 -18000 1 CDT} + {-1428253200 -21600 0 CST} + {-1410105600 -18000 1 CDT} + {-1396803600 -21600 0 CST} + {-1378656000 -18000 1 CDT} + {-1365354000 -21600 0 CST} + {-1347206400 -18000 1 CDT} + {-1333904400 -21600 0 CST} + {-1315152000 -18000 1 CDT} + {-1301850000 -21600 0 CST} + {-1283702400 -18000 1 CDT} + {-1270400400 -21600 0 CST} + {-1252252800 -18000 1 CDT} + {-1238950800 -21600 0 CST} + {-1220803200 -18000 1 CDT} + {-1207501200 -21600 0 CST} + {-1189353600 -18000 1 CDT} + {-1176051600 -21600 0 CST} + {-1157299200 -18000 1 CDT} + {-1144602000 -21600 0 CST} + {-1125849600 -18000 1 CDT} + {-1112547600 -21600 0 CST} + {-1094400000 -18000 1 CDT} + {-1081098000 -21600 0 CST} + {-1067788800 -18000 0 EST} + {-1045414800 -21600 0 CST} + {-1031500800 -18000 1 CDT} + {-1018198800 -21600 0 CST} + {-1000051200 -18000 1 CDT} + {-986749200 -21600 0 CST} + {-967996800 -18000 1 CDT} + {-955299600 -21600 0 CST} + {-936547200 -18000 1 CDT} + {-923245200 -21600 0 CST} + {-905097600 -18000 1 CDT} + {-891795600 -21600 0 CST} + {-883591200 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747244800 -18000 1 CDT} + {-733942800 -21600 0 CST} + {-715795200 -18000 1 CDT} + {-702493200 -21600 0 CST} + {-684345600 -18000 1 CDT} + {-671043600 -21600 0 CST} + {-652896000 -18000 1 CDT} + {-639594000 -21600 0 CST} + {-620841600 -18000 1 CDT} + {-608144400 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-557942400 -18000 1 CDT} + {-544640400 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 1 CDT} + {-447267600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-415818000 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-384368400 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-352918800 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-321469200 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-289414800 -21600 0 CST} + {-273686400 -18000 1 CDT} + {-257965200 -21600 0 CST} + {-242236800 -18000 1 CDT} + {-226515600 -21600 0 CST} + {-210787200 -18000 1 CDT} + {-195066000 -21600 0 CST} + {-179337600 -18000 1 CDT} + {-163616400 -21600 0 CST} + {-147888000 -18000 1 CDT} + {-131562000 -21600 0 CST} + {-116438400 -18000 1 CDT} + {-100112400 -21600 0 CST} + {-94672800 -21600 0 CST} + {-84384000 -18000 1 CDT} + {-68662800 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37213200 -21600 0 CST} + {-21484800 -18000 1 CDT} + {-5763600 -21600 0 CST} + {9964800 -18000 1 CDT} + {25686000 -21600 0 CST} + {41414400 -18000 1 CDT} + {57740400 -21600 0 CST} + {73468800 -18000 1 CDT} + {89190000 -21600 0 CST} + {104918400 -18000 1 CDT} + {120639600 -21600 0 CST} + {126691200 -18000 1 CDT} + {152089200 -21600 0 CST} + {162374400 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247042800 -21600 0 CST} + {262771200 -18000 1 CDT} + {278492400 -21600 0 CST} + {294220800 -18000 1 CDT} + {309942000 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {986112000 -18000 1 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Coral_Harbour b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Coral_Harbour new file mode 100644 index 00000000..c2406a75 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Coral_Harbour @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Panama)]} { + LoadTimeZoneFile America/Panama +} +set TZData(:America/Coral_Harbour) $TZData(:America/Panama) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Creston b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Creston new file mode 100644 index 00000000..14db6784 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Creston @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Phoenix)]} { + LoadTimeZoneFile America/Phoenix +} +set TZData(:America/Creston) $TZData(:America/Phoenix) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Curacao b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Curacao new file mode 100644 index 00000000..ae31d2f4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Curacao @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/Curacao) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Danmarkshavn b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Danmarkshavn new file mode 100644 index 00000000..4d9d7bb7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Danmarkshavn @@ -0,0 +1,39 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Danmarkshavn) { + {-9223372036854775808 -4480 0 LMT} + {-1686091520 -10800 0 -03} + {323845200 -7200 0 -02} + {338950800 -10800 0 -03} + {354675600 -7200 1 -02} + {370400400 -10800 0 -03} + {386125200 -7200 1 -02} + {401850000 -10800 0 -03} + {417574800 -7200 1 -02} + {433299600 -10800 0 -03} + {449024400 -7200 1 -02} + {465354000 -10800 0 -03} + {481078800 -7200 1 -02} + {496803600 -10800 0 -03} + {512528400 -7200 1 -02} + {528253200 -10800 0 -03} + {543978000 -7200 1 -02} + {559702800 -10800 0 -03} + {575427600 -7200 1 -02} + {591152400 -10800 0 -03} + {606877200 -7200 1 -02} + {622602000 -10800 0 -03} + {638326800 -7200 1 -02} + {654656400 -10800 0 -03} + {670381200 -7200 1 -02} + {686106000 -10800 0 -03} + {701830800 -7200 1 -02} + {717555600 -10800 0 -03} + {733280400 -7200 1 -02} + {749005200 -10800 0 -03} + {764730000 -7200 1 -02} + {780454800 -10800 0 -03} + {796179600 -7200 1 -02} + {811904400 -10800 0 -03} + {820465200 0 0 GMT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Dawson b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Dawson new file mode 100644 index 00000000..c8e3f26c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Dawson @@ -0,0 +1,98 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Dawson) { + {-9223372036854775808 -33460 0 LMT} + {-2188996940 -32400 0 YST} + {-1632056400 -28800 1 YDT} + {-1615125600 -32400 0 YST} + {-1596978000 -28800 1 YDT} + {-1583164800 -32400 0 YST} + {-880203600 -28800 1 YWT} + {-769395600 -28800 1 YPT} + {-765381600 -32400 0 YST} + {-147884400 -25200 1 YDDT} + {-131554800 -32400 0 YST} + {315561600 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1173607200 -25200 1 PDT} + {1194166800 -28800 0 PST} + {1205056800 -25200 1 PDT} + {1225616400 -28800 0 PST} + {1236506400 -25200 1 PDT} + {1257066000 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 1 PDT} + {1446368400 -28800 0 PST} + {1457863200 -25200 1 PDT} + {1478422800 -28800 0 PST} + {1489312800 -25200 1 PDT} + {1509872400 -28800 0 PST} + {1520762400 -25200 1 PDT} + {1541322000 -28800 0 PST} + {1552212000 -25200 1 PDT} + {1572771600 -28800 0 PST} + {1583661600 -25200 1 PDT} + {1604217600 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Dawson_Creek b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Dawson_Creek new file mode 100644 index 00000000..a0b5c443 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Dawson_Creek @@ -0,0 +1,64 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Dawson_Creek) { + {-9223372036854775808 -28856 0 LMT} + {-2713881544 -28800 0 PST} + {-1632060000 -25200 1 PDT} + {-1615129200 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-725817600 -28800 0 PST} + {-715788000 -25200 1 PDT} + {-702486000 -28800 0 PST} + {-684338400 -25200 1 PDT} + {-671036400 -28800 0 PST} + {-652888800 -25200 1 PDT} + {-639586800 -28800 0 PST} + {-620834400 -25200 1 PDT} + {-608137200 -28800 0 PST} + {-589384800 -25200 1 PDT} + {-576082800 -28800 0 PST} + {-557935200 -25200 1 PDT} + {-544633200 -28800 0 PST} + {-526485600 -25200 1 PDT} + {-513183600 -28800 0 PST} + {-495036000 -25200 1 PDT} + {-481734000 -28800 0 PST} + {-463586400 -25200 1 PDT} + {-450284400 -28800 0 PST} + {-431532000 -25200 1 PDT} + {-418230000 -28800 0 PST} + {-400082400 -25200 1 PDT} + {-386780400 -28800 0 PST} + {-368632800 -25200 1 PDT} + {-355330800 -28800 0 PST} + {-337183200 -25200 1 PDT} + {-323881200 -28800 0 PST} + {-305733600 -25200 1 PDT} + {-292431600 -28800 0 PST} + {-273679200 -25200 1 PDT} + {-260982000 -28800 0 PST} + {-242229600 -25200 1 PDT} + {-226508400 -28800 0 PST} + {-210780000 -25200 1 PDT} + {-195058800 -28800 0 PST} + {-179330400 -25200 1 PDT} + {-163609200 -28800 0 PST} + {-147880800 -25200 1 PDT} + {-131554800 -28800 0 PST} + {-116431200 -25200 1 PDT} + {-100105200 -28800 0 PST} + {-84376800 -25200 1 PDT} + {-68655600 -28800 0 PST} + {-52927200 -25200 1 PDT} + {-37206000 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {84016800 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Denver b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Denver new file mode 100644 index 00000000..06bc80d6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Denver @@ -0,0 +1,291 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Denver) { + {-9223372036854775808 -25196 0 LMT} + {-2717643600 -25200 0 MST} + {-1633273200 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1601823600 -21600 1 MDT} + {-1583683200 -25200 0 MST} + {-1577898000 -25200 0 MST} + {-1570374000 -21600 1 MDT} + {-1551628800 -25200 0 MST} + {-1538924400 -21600 1 MDT} + {-1534089600 -25200 0 MST} + {-883587600 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-757357200 -25200 0 MST} + {-147884400 -21600 1 MDT} + {-131558400 -25200 0 MST} + {-116434800 -21600 1 MDT} + {-100108800 -25200 0 MST} + {-94669200 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-52930800 -21600 1 MDT} + {-37209600 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {9968400 -21600 1 MDT} + {25689600 -25200 0 MST} + {41418000 -21600 1 MDT} + {57744000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {126694800 -21600 1 MDT} + {152092800 -25200 0 MST} + {162378000 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Detroit b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Detroit new file mode 100644 index 00000000..2139aa82 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Detroit @@ -0,0 +1,275 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Detroit) { + {-9223372036854775808 -19931 0 LMT} + {-2051202469 -21600 0 CST} + {-1724083200 -18000 0 EST} + {-883594800 -18000 0 EST} + {-880218000 -14400 1 EWT} + {-769395600 -14400 1 EPT} + {-765396000 -18000 0 EST} + {-757364400 -18000 0 EST} + {-684349200 -14400 1 EDT} + {-671047200 -18000 0 EST} + {-80506740 -14400 0 EDT} + {-68666400 -18000 0 EST} + {-52938000 -14400 1 EDT} + {-37216800 -18000 0 EST} + {-31518000 -18000 0 EST} + {94712400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {126687600 -14400 1 EDT} + {152085600 -18000 0 EST} + {157784400 -18000 0 EST} + {167814000 -14400 0 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Edmonton b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Edmonton new file mode 100644 index 00000000..234b3af8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Edmonton @@ -0,0 +1,280 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Edmonton) { + {-9223372036854775808 -27232 0 LMT} + {-1998663968 -25200 0 MST} + {-1632063600 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1600614000 -21600 1 MDT} + {-1596816000 -25200 0 MST} + {-1567954800 -21600 1 MDT} + {-1551628800 -25200 0 MST} + {-1536505200 -21600 1 MDT} + {-1523203200 -25200 0 MST} + {-1504450800 -21600 1 MDT} + {-1491753600 -25200 0 MST} + {-1473001200 -21600 1 MDT} + {-1459699200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-715791600 -21600 1 MDT} + {-702489600 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {136371600 -21600 1 MDT} + {152092800 -25200 0 MST} + {167821200 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {536482800 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Eirunepe b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Eirunepe new file mode 100644 index 00000000..a81b09e4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Eirunepe @@ -0,0 +1,41 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Eirunepe) { + {-9223372036854775808 -16768 0 LMT} + {-1767208832 -18000 0 -05} + {-1206950400 -14400 1 -05} + {-1191355200 -18000 0 -05} + {-1175367600 -14400 1 -05} + {-1159819200 -18000 0 -05} + {-633812400 -14400 1 -05} + {-622062000 -18000 0 -05} + {-602276400 -14400 1 -05} + {-591825600 -18000 0 -05} + {-570740400 -14400 1 -05} + {-560203200 -18000 0 -05} + {-539118000 -14400 1 -05} + {-531345600 -18000 0 -05} + {-191358000 -14400 1 -05} + {-184190400 -18000 0 -05} + {-155156400 -14400 1 -05} + {-150062400 -18000 0 -05} + {-128890800 -14400 1 -05} + {-121118400 -18000 0 -05} + {-99946800 -14400 1 -05} + {-89582400 -18000 0 -05} + {-68410800 -14400 1 -05} + {-57960000 -18000 0 -05} + {499755600 -14400 1 -05} + {511243200 -18000 0 -05} + {530600400 -14400 1 -05} + {540273600 -18000 0 -05} + {562136400 -14400 1 -05} + {571204800 -18000 0 -05} + {590040000 -18000 0 -05} + {749192400 -18000 0 -05} + {750834000 -14400 1 -05} + {761716800 -18000 0 -05} + {780206400 -18000 0 -05} + {1214283600 -14400 0 -04} + {1384056000 -18000 0 -05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/El_Salvador b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/El_Salvador new file mode 100644 index 00000000..75d8129a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/El_Salvador @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/El_Salvador) { + {-9223372036854775808 -21408 0 LMT} + {-1546279392 -21600 0 CST} + {547020000 -18000 1 CDT} + {559717200 -21600 0 CST} + {578469600 -18000 1 CDT} + {591166800 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Fort_Nelson b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Fort_Nelson new file mode 100644 index 00000000..d8193688 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Fort_Nelson @@ -0,0 +1,151 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Fort_Nelson) { + {-9223372036854775808 -29447 0 LMT} + {-2713880953 -28800 0 PST} + {-1632060000 -25200 1 PDT} + {-1615129200 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-757353600 -28800 0 PST} + {-725817600 -28800 0 PST} + {-715788000 -25200 1 PDT} + {-702486000 -28800 0 PST} + {-684338400 -25200 1 PDT} + {-671036400 -28800 0 PST} + {-652888800 -25200 1 PDT} + {-639586800 -28800 0 PST} + {-620834400 -25200 1 PDT} + {-608137200 -28800 0 PST} + {-589384800 -25200 1 PDT} + {-576082800 -28800 0 PST} + {-557935200 -25200 1 PDT} + {-544633200 -28800 0 PST} + {-526485600 -25200 1 PDT} + {-513183600 -28800 0 PST} + {-495036000 -25200 1 PDT} + {-481734000 -28800 0 PST} + {-463586400 -25200 1 PDT} + {-450284400 -28800 0 PST} + {-431532000 -25200 1 PDT} + {-418230000 -28800 0 PST} + {-400082400 -25200 1 PDT} + {-386780400 -28800 0 PST} + {-368632800 -25200 1 PDT} + {-355330800 -28800 0 PST} + {-337183200 -25200 1 PDT} + {-323881200 -28800 0 PST} + {-305733600 -25200 1 PDT} + {-292431600 -28800 0 PST} + {-273679200 -25200 1 PDT} + {-260982000 -28800 0 PST} + {-242229600 -25200 1 PDT} + {-226508400 -28800 0 PST} + {-210780000 -25200 1 PDT} + {-195058800 -28800 0 PST} + {-179330400 -25200 1 PDT} + {-163609200 -28800 0 PST} + {-147880800 -25200 1 PDT} + {-131554800 -28800 0 PST} + {-116431200 -25200 1 PDT} + {-100105200 -28800 0 PST} + {-84376800 -25200 1 PDT} + {-68655600 -28800 0 PST} + {-52927200 -25200 1 PDT} + {-37206000 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {89197200 -28800 0 PST} + {104925600 -25200 1 PDT} + {120646800 -28800 0 PST} + {136375200 -25200 1 PDT} + {152096400 -28800 0 PST} + {167824800 -25200 1 PDT} + {183546000 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {536486400 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1173607200 -25200 1 PDT} + {1194166800 -28800 0 PST} + {1205056800 -25200 1 PDT} + {1225616400 -28800 0 PST} + {1236506400 -25200 1 PDT} + {1257066000 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Fort_Wayne b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Fort_Wayne new file mode 100644 index 00000000..9514d57f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Fort_Wayne @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Indiana/Indianapolis)]} { + LoadTimeZoneFile America/Indiana/Indianapolis +} +set TZData(:America/Fort_Wayne) $TZData(:America/Indiana/Indianapolis) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Glace_Bay b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Glace_Bay new file mode 100644 index 00000000..8ee9eecc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Glace_Bay @@ -0,0 +1,273 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Glace_Bay) { + {-9223372036854775808 -14388 0 LMT} + {-2131646412 -14400 0 AST} + {-1632074400 -10800 1 ADT} + {-1615143600 -14400 0 AST} + {-880221600 -10800 1 AWT} + {-769395600 -10800 1 APT} + {-765399600 -14400 0 AST} + {-536443200 -14400 0 AST} + {-526500000 -10800 1 ADT} + {-513198000 -14400 0 AST} + {-504907200 -14400 0 AST} + {63086400 -14400 0 AST} + {73461600 -10800 1 ADT} + {89182800 -14400 0 AST} + {104911200 -10800 1 ADT} + {120632400 -14400 0 AST} + {126244800 -14400 0 AST} + {136360800 -10800 1 ADT} + {152082000 -14400 0 AST} + {167810400 -10800 1 ADT} + {183531600 -14400 0 AST} + {199260000 -10800 1 ADT} + {215586000 -14400 0 AST} + {230709600 -10800 1 ADT} + {247035600 -14400 0 AST} + {262764000 -10800 1 ADT} + {278485200 -14400 0 AST} + {294213600 -10800 1 ADT} + {309934800 -14400 0 AST} + {325663200 -10800 1 ADT} + {341384400 -14400 0 AST} + {357112800 -10800 1 ADT} + {372834000 -14400 0 AST} + {388562400 -10800 1 ADT} + {404888400 -14400 0 AST} + {420012000 -10800 1 ADT} + {436338000 -14400 0 AST} + {452066400 -10800 1 ADT} + {467787600 -14400 0 AST} + {483516000 -10800 1 ADT} + {499237200 -14400 0 AST} + {514965600 -10800 1 ADT} + {530686800 -14400 0 AST} + {544600800 -10800 1 ADT} + {562136400 -14400 0 AST} + {576050400 -10800 1 ADT} + {594190800 -14400 0 AST} + {607500000 -10800 1 ADT} + {625640400 -14400 0 AST} + {638949600 -10800 1 ADT} + {657090000 -14400 0 AST} + {671004000 -10800 1 ADT} + {688539600 -14400 0 AST} + {702453600 -10800 1 ADT} + {719989200 -14400 0 AST} + {733903200 -10800 1 ADT} + {752043600 -14400 0 AST} + {765352800 -10800 1 ADT} + {783493200 -14400 0 AST} + {796802400 -10800 1 ADT} + {814942800 -14400 0 AST} + {828856800 -10800 1 ADT} + {846392400 -14400 0 AST} + {860306400 -10800 1 ADT} + {877842000 -14400 0 AST} + {891756000 -10800 1 ADT} + {909291600 -14400 0 AST} + {923205600 -10800 1 ADT} + {941346000 -14400 0 AST} + {954655200 -10800 1 ADT} + {972795600 -14400 0 AST} + {986104800 -10800 1 ADT} + {1004245200 -14400 0 AST} + {1018159200 -10800 1 ADT} + {1035694800 -14400 0 AST} + {1049608800 -10800 1 ADT} + {1067144400 -14400 0 AST} + {1081058400 -10800 1 ADT} + {1099198800 -14400 0 AST} + {1112508000 -10800 1 ADT} + {1130648400 -14400 0 AST} + {1143957600 -10800 1 ADT} + {1162098000 -14400 0 AST} + {1173592800 -10800 1 ADT} + {1194152400 -14400 0 AST} + {1205042400 -10800 1 ADT} + {1225602000 -14400 0 AST} + {1236492000 -10800 1 ADT} + {1257051600 -14400 0 AST} + {1268546400 -10800 1 ADT} + {1289106000 -14400 0 AST} + {1299996000 -10800 1 ADT} + {1320555600 -14400 0 AST} + {1331445600 -10800 1 ADT} + {1352005200 -14400 0 AST} + {1362895200 -10800 1 ADT} + {1383454800 -14400 0 AST} + {1394344800 -10800 1 ADT} + {1414904400 -14400 0 AST} + {1425794400 -10800 1 ADT} + {1446354000 -14400 0 AST} + {1457848800 -10800 1 ADT} + {1478408400 -14400 0 AST} + {1489298400 -10800 1 ADT} + {1509858000 -14400 0 AST} + {1520748000 -10800 1 ADT} + {1541307600 -14400 0 AST} + {1552197600 -10800 1 ADT} + {1572757200 -14400 0 AST} + {1583647200 -10800 1 ADT} + {1604206800 -14400 0 AST} + {1615701600 -10800 1 ADT} + {1636261200 -14400 0 AST} + {1647151200 -10800 1 ADT} + {1667710800 -14400 0 AST} + {1678600800 -10800 1 ADT} + {1699160400 -14400 0 AST} + {1710050400 -10800 1 ADT} + {1730610000 -14400 0 AST} + {1741500000 -10800 1 ADT} + {1762059600 -14400 0 AST} + {1772949600 -10800 1 ADT} + {1793509200 -14400 0 AST} + {1805004000 -10800 1 ADT} + {1825563600 -14400 0 AST} + {1836453600 -10800 1 ADT} + {1857013200 -14400 0 AST} + {1867903200 -10800 1 ADT} + {1888462800 -14400 0 AST} + {1899352800 -10800 1 ADT} + {1919912400 -14400 0 AST} + {1930802400 -10800 1 ADT} + {1951362000 -14400 0 AST} + {1962856800 -10800 1 ADT} + {1983416400 -14400 0 AST} + {1994306400 -10800 1 ADT} + {2014866000 -14400 0 AST} + {2025756000 -10800 1 ADT} + {2046315600 -14400 0 AST} + {2057205600 -10800 1 ADT} + {2077765200 -14400 0 AST} + {2088655200 -10800 1 ADT} + {2109214800 -14400 0 AST} + {2120104800 -10800 1 ADT} + {2140664400 -14400 0 AST} + {2152159200 -10800 1 ADT} + {2172718800 -14400 0 AST} + {2183608800 -10800 1 ADT} + {2204168400 -14400 0 AST} + {2215058400 -10800 1 ADT} + {2235618000 -14400 0 AST} + {2246508000 -10800 1 ADT} + {2267067600 -14400 0 AST} + {2277957600 -10800 1 ADT} + {2298517200 -14400 0 AST} + {2309407200 -10800 1 ADT} + {2329966800 -14400 0 AST} + {2341461600 -10800 1 ADT} + {2362021200 -14400 0 AST} + {2372911200 -10800 1 ADT} + {2393470800 -14400 0 AST} + {2404360800 -10800 1 ADT} + {2424920400 -14400 0 AST} + {2435810400 -10800 1 ADT} + {2456370000 -14400 0 AST} + {2467260000 -10800 1 ADT} + {2487819600 -14400 0 AST} + {2499314400 -10800 1 ADT} + {2519874000 -14400 0 AST} + {2530764000 -10800 1 ADT} + {2551323600 -14400 0 AST} + {2562213600 -10800 1 ADT} + {2582773200 -14400 0 AST} + {2593663200 -10800 1 ADT} + {2614222800 -14400 0 AST} + {2625112800 -10800 1 ADT} + {2645672400 -14400 0 AST} + {2656562400 -10800 1 ADT} + {2677122000 -14400 0 AST} + {2688616800 -10800 1 ADT} + {2709176400 -14400 0 AST} + {2720066400 -10800 1 ADT} + {2740626000 -14400 0 AST} + {2751516000 -10800 1 ADT} + {2772075600 -14400 0 AST} + {2782965600 -10800 1 ADT} + {2803525200 -14400 0 AST} + {2814415200 -10800 1 ADT} + {2834974800 -14400 0 AST} + {2846469600 -10800 1 ADT} + {2867029200 -14400 0 AST} + {2877919200 -10800 1 ADT} + {2898478800 -14400 0 AST} + {2909368800 -10800 1 ADT} + {2929928400 -14400 0 AST} + {2940818400 -10800 1 ADT} + {2961378000 -14400 0 AST} + {2972268000 -10800 1 ADT} + {2992827600 -14400 0 AST} + {3003717600 -10800 1 ADT} + {3024277200 -14400 0 AST} + {3035772000 -10800 1 ADT} + {3056331600 -14400 0 AST} + {3067221600 -10800 1 ADT} + {3087781200 -14400 0 AST} + {3098671200 -10800 1 ADT} + {3119230800 -14400 0 AST} + {3130120800 -10800 1 ADT} + {3150680400 -14400 0 AST} + {3161570400 -10800 1 ADT} + {3182130000 -14400 0 AST} + {3193020000 -10800 1 ADT} + {3213579600 -14400 0 AST} + {3225074400 -10800 1 ADT} + {3245634000 -14400 0 AST} + {3256524000 -10800 1 ADT} + {3277083600 -14400 0 AST} + {3287973600 -10800 1 ADT} + {3308533200 -14400 0 AST} + {3319423200 -10800 1 ADT} + {3339982800 -14400 0 AST} + {3350872800 -10800 1 ADT} + {3371432400 -14400 0 AST} + {3382927200 -10800 1 ADT} + {3403486800 -14400 0 AST} + {3414376800 -10800 1 ADT} + {3434936400 -14400 0 AST} + {3445826400 -10800 1 ADT} + {3466386000 -14400 0 AST} + {3477276000 -10800 1 ADT} + {3497835600 -14400 0 AST} + {3508725600 -10800 1 ADT} + {3529285200 -14400 0 AST} + {3540175200 -10800 1 ADT} + {3560734800 -14400 0 AST} + {3572229600 -10800 1 ADT} + {3592789200 -14400 0 AST} + {3603679200 -10800 1 ADT} + {3624238800 -14400 0 AST} + {3635128800 -10800 1 ADT} + {3655688400 -14400 0 AST} + {3666578400 -10800 1 ADT} + {3687138000 -14400 0 AST} + {3698028000 -10800 1 ADT} + {3718587600 -14400 0 AST} + {3730082400 -10800 1 ADT} + {3750642000 -14400 0 AST} + {3761532000 -10800 1 ADT} + {3782091600 -14400 0 AST} + {3792981600 -10800 1 ADT} + {3813541200 -14400 0 AST} + {3824431200 -10800 1 ADT} + {3844990800 -14400 0 AST} + {3855880800 -10800 1 ADT} + {3876440400 -14400 0 AST} + {3887330400 -10800 1 ADT} + {3907890000 -14400 0 AST} + {3919384800 -10800 1 ADT} + {3939944400 -14400 0 AST} + {3950834400 -10800 1 ADT} + {3971394000 -14400 0 AST} + {3982284000 -10800 1 ADT} + {4002843600 -14400 0 AST} + {4013733600 -10800 1 ADT} + {4034293200 -14400 0 AST} + {4045183200 -10800 1 ADT} + {4065742800 -14400 0 AST} + {4076632800 -10800 1 ADT} + {4097192400 -14400 0 AST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Godthab b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Godthab new file mode 100644 index 00000000..8bb7b738 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Godthab @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Nuuk)]} { + LoadTimeZoneFile America/Nuuk +} +set TZData(:America/Godthab) $TZData(:America/Nuuk) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Goose_Bay b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Goose_Bay new file mode 100644 index 00000000..7b7b3d84 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Goose_Bay @@ -0,0 +1,338 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Goose_Bay) { + {-9223372036854775808 -14500 0 LMT} + {-2713895900 -12652 0 NST} + {-1640982548 -12652 0 NST} + {-1632076148 -9052 1 NDT} + {-1615145348 -12652 0 NST} + {-1609446548 -12652 0 NST} + {-1096921748 -12600 0 NST} + {-1072989000 -12600 0 NST} + {-1061670600 -9000 1 NDT} + {-1048973400 -12600 0 NST} + {-1030221000 -9000 1 NDT} + {-1017523800 -12600 0 NST} + {-998771400 -9000 1 NDT} + {-986074200 -12600 0 NST} + {-966717000 -9000 1 NDT} + {-954624600 -12600 0 NST} + {-935267400 -9000 1 NDT} + {-922570200 -12600 0 NST} + {-903817800 -9000 1 NDT} + {-891120600 -12600 0 NST} + {-872368200 -9000 0 NWT} + {-769395600 -9000 1 NPT} + {-765401400 -12600 0 NST} + {-757369800 -12600 0 NST} + {-746044200 -9000 1 NDT} + {-733347000 -12600 0 NST} + {-714594600 -9000 1 NDT} + {-701897400 -12600 0 NST} + {-683145000 -9000 1 NDT} + {-670447800 -12600 0 NST} + {-651695400 -9000 1 NDT} + {-638998200 -12600 0 NST} + {-619641000 -9000 1 NDT} + {-606943800 -12600 0 NST} + {-589401000 -9000 1 NDT} + {-576099000 -12600 0 NST} + {-557951400 -9000 1 NDT} + {-544649400 -12600 0 NST} + {-526501800 -9000 1 NDT} + {-513199800 -12600 0 NST} + {-495052200 -9000 1 NDT} + {-481750200 -12600 0 NST} + {-463602600 -9000 1 NDT} + {-450300600 -12600 0 NST} + {-431548200 -9000 1 NDT} + {-418246200 -12600 0 NST} + {-400098600 -9000 1 NDT} + {-386796600 -12600 0 NST} + {-368649000 -9000 1 NDT} + {-355347000 -12600 0 NST} + {-337199400 -9000 1 NDT} + {-323897400 -12600 0 NST} + {-305749800 -9000 1 NDT} + {-289423800 -12600 0 NST} + {-273695400 -9000 1 NDT} + {-257974200 -12600 0 NST} + {-242245800 -9000 1 NDT} + {-226524600 -12600 0 NST} + {-210796200 -9000 1 NDT} + {-195075000 -12600 0 NST} + {-179346600 -9000 1 NDT} + {-163625400 -12600 0 NST} + {-147897000 -9000 1 NDT} + {-131571000 -12600 0 NST} + {-119903400 -14400 0 AST} + {-116445600 -10800 1 ADT} + {-100119600 -14400 0 AST} + {-84391200 -10800 1 ADT} + {-68670000 -14400 0 AST} + {-52941600 -10800 1 ADT} + {-37220400 -14400 0 AST} + {-21492000 -10800 1 ADT} + {-5770800 -14400 0 AST} + {9957600 -10800 1 ADT} + {25678800 -14400 0 AST} + {41407200 -10800 1 ADT} + {57733200 -14400 0 AST} + {73461600 -10800 1 ADT} + {89182800 -14400 0 AST} + {104911200 -10800 1 ADT} + {120632400 -14400 0 AST} + {136360800 -10800 1 ADT} + {152082000 -14400 0 AST} + {167810400 -10800 1 ADT} + {183531600 -14400 0 AST} + {199260000 -10800 1 ADT} + {215586000 -14400 0 AST} + {230709600 -10800 1 ADT} + {247035600 -14400 0 AST} + {262764000 -10800 1 ADT} + {278485200 -14400 0 AST} + {294213600 -10800 1 ADT} + {309934800 -14400 0 AST} + {325663200 -10800 1 ADT} + {341384400 -14400 0 AST} + {357112800 -10800 1 ADT} + {372834000 -14400 0 AST} + {388562400 -10800 1 ADT} + {404888400 -14400 0 AST} + {420012000 -10800 1 ADT} + {436338000 -14400 0 AST} + {452066400 -10800 1 ADT} + {467787600 -14400 0 AST} + {483516000 -10800 1 ADT} + {499237200 -14400 0 AST} + {514965600 -10800 1 ADT} + {530686800 -14400 0 AST} + {544593660 -10800 1 ADT} + {562129260 -14400 0 AST} + {576043260 -7200 1 ADDT} + {594180060 -14400 0 AST} + {607492860 -10800 1 ADT} + {625633260 -14400 0 AST} + {638942460 -10800 1 ADT} + {657082860 -14400 0 AST} + {670996860 -10800 1 ADT} + {688532460 -14400 0 AST} + {702446460 -10800 1 ADT} + {719982060 -14400 0 AST} + {733896060 -10800 1 ADT} + {752036460 -14400 0 AST} + {765345660 -10800 1 ADT} + {783486060 -14400 0 AST} + {796795260 -10800 1 ADT} + {814935660 -14400 0 AST} + {828849660 -10800 1 ADT} + {846385260 -14400 0 AST} + {860299260 -10800 1 ADT} + {877834860 -14400 0 AST} + {891748860 -10800 1 ADT} + {909284460 -14400 0 AST} + {923198460 -10800 1 ADT} + {941338860 -14400 0 AST} + {954648060 -10800 1 ADT} + {972788460 -14400 0 AST} + {986097660 -10800 1 ADT} + {1004238060 -14400 0 AST} + {1018152060 -10800 1 ADT} + {1035687660 -14400 0 AST} + {1049601660 -10800 1 ADT} + {1067137260 -14400 0 AST} + {1081051260 -10800 1 ADT} + {1099191660 -14400 0 AST} + {1112500860 -10800 1 ADT} + {1130641260 -14400 0 AST} + {1143950460 -10800 1 ADT} + {1162090860 -14400 0 AST} + {1173585660 -10800 1 ADT} + {1194145260 -14400 0 AST} + {1205035260 -10800 1 ADT} + {1225594860 -14400 0 AST} + {1236484860 -10800 1 ADT} + {1257044460 -14400 0 AST} + {1268539260 -10800 1 ADT} + {1289098860 -14400 0 AST} + {1299988860 -10800 1 ADT} + {1320116400 -10800 0 ADT} + {1320555600 -14400 0 AST} + {1331445600 -10800 1 ADT} + {1352005200 -14400 0 AST} + {1362895200 -10800 1 ADT} + {1383454800 -14400 0 AST} + {1394344800 -10800 1 ADT} + {1414904400 -14400 0 AST} + {1425794400 -10800 1 ADT} + {1446354000 -14400 0 AST} + {1457848800 -10800 1 ADT} + {1478408400 -14400 0 AST} + {1489298400 -10800 1 ADT} + {1509858000 -14400 0 AST} + {1520748000 -10800 1 ADT} + {1541307600 -14400 0 AST} + {1552197600 -10800 1 ADT} + {1572757200 -14400 0 AST} + {1583647200 -10800 1 ADT} + {1604206800 -14400 0 AST} + {1615701600 -10800 1 ADT} + {1636261200 -14400 0 AST} + {1647151200 -10800 1 ADT} + {1667710800 -14400 0 AST} + {1678600800 -10800 1 ADT} + {1699160400 -14400 0 AST} + {1710050400 -10800 1 ADT} + {1730610000 -14400 0 AST} + {1741500000 -10800 1 ADT} + {1762059600 -14400 0 AST} + {1772949600 -10800 1 ADT} + {1793509200 -14400 0 AST} + {1805004000 -10800 1 ADT} + {1825563600 -14400 0 AST} + {1836453600 -10800 1 ADT} + {1857013200 -14400 0 AST} + {1867903200 -10800 1 ADT} + {1888462800 -14400 0 AST} + {1899352800 -10800 1 ADT} + {1919912400 -14400 0 AST} + {1930802400 -10800 1 ADT} + {1951362000 -14400 0 AST} + {1962856800 -10800 1 ADT} + {1983416400 -14400 0 AST} + {1994306400 -10800 1 ADT} + {2014866000 -14400 0 AST} + {2025756000 -10800 1 ADT} + {2046315600 -14400 0 AST} + {2057205600 -10800 1 ADT} + {2077765200 -14400 0 AST} + {2088655200 -10800 1 ADT} + {2109214800 -14400 0 AST} + {2120104800 -10800 1 ADT} + {2140664400 -14400 0 AST} + {2152159200 -10800 1 ADT} + {2172718800 -14400 0 AST} + {2183608800 -10800 1 ADT} + {2204168400 -14400 0 AST} + {2215058400 -10800 1 ADT} + {2235618000 -14400 0 AST} + {2246508000 -10800 1 ADT} + {2267067600 -14400 0 AST} + {2277957600 -10800 1 ADT} + {2298517200 -14400 0 AST} + {2309407200 -10800 1 ADT} + {2329966800 -14400 0 AST} + {2341461600 -10800 1 ADT} + {2362021200 -14400 0 AST} + {2372911200 -10800 1 ADT} + {2393470800 -14400 0 AST} + {2404360800 -10800 1 ADT} + {2424920400 -14400 0 AST} + {2435810400 -10800 1 ADT} + {2456370000 -14400 0 AST} + {2467260000 -10800 1 ADT} + {2487819600 -14400 0 AST} + {2499314400 -10800 1 ADT} + {2519874000 -14400 0 AST} + {2530764000 -10800 1 ADT} + {2551323600 -14400 0 AST} + {2562213600 -10800 1 ADT} + {2582773200 -14400 0 AST} + {2593663200 -10800 1 ADT} + {2614222800 -14400 0 AST} + {2625112800 -10800 1 ADT} + {2645672400 -14400 0 AST} + {2656562400 -10800 1 ADT} + {2677122000 -14400 0 AST} + {2688616800 -10800 1 ADT} + {2709176400 -14400 0 AST} + {2720066400 -10800 1 ADT} + {2740626000 -14400 0 AST} + {2751516000 -10800 1 ADT} + {2772075600 -14400 0 AST} + {2782965600 -10800 1 ADT} + {2803525200 -14400 0 AST} + {2814415200 -10800 1 ADT} + {2834974800 -14400 0 AST} + {2846469600 -10800 1 ADT} + {2867029200 -14400 0 AST} + {2877919200 -10800 1 ADT} + {2898478800 -14400 0 AST} + {2909368800 -10800 1 ADT} + {2929928400 -14400 0 AST} + {2940818400 -10800 1 ADT} + {2961378000 -14400 0 AST} + {2972268000 -10800 1 ADT} + {2992827600 -14400 0 AST} + {3003717600 -10800 1 ADT} + {3024277200 -14400 0 AST} + {3035772000 -10800 1 ADT} + {3056331600 -14400 0 AST} + {3067221600 -10800 1 ADT} + {3087781200 -14400 0 AST} + {3098671200 -10800 1 ADT} + {3119230800 -14400 0 AST} + {3130120800 -10800 1 ADT} + {3150680400 -14400 0 AST} + {3161570400 -10800 1 ADT} + {3182130000 -14400 0 AST} + {3193020000 -10800 1 ADT} + {3213579600 -14400 0 AST} + {3225074400 -10800 1 ADT} + {3245634000 -14400 0 AST} + {3256524000 -10800 1 ADT} + {3277083600 -14400 0 AST} + {3287973600 -10800 1 ADT} + {3308533200 -14400 0 AST} + {3319423200 -10800 1 ADT} + {3339982800 -14400 0 AST} + {3350872800 -10800 1 ADT} + {3371432400 -14400 0 AST} + {3382927200 -10800 1 ADT} + {3403486800 -14400 0 AST} + {3414376800 -10800 1 ADT} + {3434936400 -14400 0 AST} + {3445826400 -10800 1 ADT} + {3466386000 -14400 0 AST} + {3477276000 -10800 1 ADT} + {3497835600 -14400 0 AST} + {3508725600 -10800 1 ADT} + {3529285200 -14400 0 AST} + {3540175200 -10800 1 ADT} + {3560734800 -14400 0 AST} + {3572229600 -10800 1 ADT} + {3592789200 -14400 0 AST} + {3603679200 -10800 1 ADT} + {3624238800 -14400 0 AST} + {3635128800 -10800 1 ADT} + {3655688400 -14400 0 AST} + {3666578400 -10800 1 ADT} + {3687138000 -14400 0 AST} + {3698028000 -10800 1 ADT} + {3718587600 -14400 0 AST} + {3730082400 -10800 1 ADT} + {3750642000 -14400 0 AST} + {3761532000 -10800 1 ADT} + {3782091600 -14400 0 AST} + {3792981600 -10800 1 ADT} + {3813541200 -14400 0 AST} + {3824431200 -10800 1 ADT} + {3844990800 -14400 0 AST} + {3855880800 -10800 1 ADT} + {3876440400 -14400 0 AST} + {3887330400 -10800 1 ADT} + {3907890000 -14400 0 AST} + {3919384800 -10800 1 ADT} + {3939944400 -14400 0 AST} + {3950834400 -10800 1 ADT} + {3971394000 -14400 0 AST} + {3982284000 -10800 1 ADT} + {4002843600 -14400 0 AST} + {4013733600 -10800 1 ADT} + {4034293200 -14400 0 AST} + {4045183200 -10800 1 ADT} + {4065742800 -14400 0 AST} + {4076632800 -10800 1 ADT} + {4097192400 -14400 0 AST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Grand_Turk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Grand_Turk new file mode 100644 index 00000000..414b0f9f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Grand_Turk @@ -0,0 +1,245 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Grand_Turk) { + {-9223372036854775808 -17072 0 LMT} + {-2524504528 -18430 0 KMT} + {-1827687170 -18000 0 EST} + {284014800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 0 AST} + {1520751600 -14400 0 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Guadeloupe b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Guadeloupe new file mode 100644 index 00000000..ac85e5a3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Guadeloupe @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/Guadeloupe) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Guayaquil b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Guayaquil new file mode 100644 index 00000000..6ba7b930 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Guayaquil @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Guayaquil) { + {-9223372036854775808 -19160 0 LMT} + {-2524502440 -18840 0 QMT} + {-1230749160 -18000 0 -05} + {722926800 -14400 1 -05} + {728884800 -18000 0 -05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Halifax b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Halifax new file mode 100644 index 00000000..08e37543 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Halifax @@ -0,0 +1,361 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Halifax) { + {-9223372036854775808 -15264 0 LMT} + {-2131645536 -14400 0 AST} + {-1696276800 -10800 1 ADT} + {-1680469200 -14400 0 AST} + {-1640980800 -14400 0 AST} + {-1632074400 -10800 1 ADT} + {-1615143600 -14400 0 AST} + {-1609444800 -14400 0 AST} + {-1566763200 -10800 1 ADT} + {-1557090000 -14400 0 AST} + {-1535486400 -10800 1 ADT} + {-1524949200 -14400 0 AST} + {-1504468800 -10800 1 ADT} + {-1493413200 -14400 0 AST} + {-1472414400 -10800 1 ADT} + {-1461963600 -14400 0 AST} + {-1440964800 -10800 1 ADT} + {-1429390800 -14400 0 AST} + {-1409515200 -10800 1 ADT} + {-1396731600 -14400 0 AST} + {-1376856000 -10800 1 ADT} + {-1366491600 -14400 0 AST} + {-1346616000 -10800 1 ADT} + {-1333832400 -14400 0 AST} + {-1313956800 -10800 1 ADT} + {-1303678800 -14400 0 AST} + {-1282507200 -10800 1 ADT} + {-1272661200 -14400 0 AST} + {-1251057600 -10800 1 ADT} + {-1240088400 -14400 0 AST} + {-1219608000 -10800 1 ADT} + {-1207429200 -14400 0 AST} + {-1188763200 -10800 1 ADT} + {-1175979600 -14400 0 AST} + {-1157313600 -10800 1 ADT} + {-1143925200 -14400 0 AST} + {-1124049600 -10800 1 ADT} + {-1113771600 -14400 0 AST} + {-1091390400 -10800 1 ADT} + {-1081026000 -14400 0 AST} + {-1059854400 -10800 1 ADT} + {-1050786000 -14400 0 AST} + {-1030910400 -10800 1 ADT} + {-1018126800 -14400 0 AST} + {-999460800 -10800 1 ADT} + {-986677200 -14400 0 AST} + {-965592000 -10800 1 ADT} + {-955227600 -14400 0 AST} + {-935956800 -10800 1 ADT} + {-923173200 -14400 0 AST} + {-904507200 -10800 1 ADT} + {-891723600 -14400 0 AST} + {-880221600 -10800 0 AWT} + {-769395600 -10800 1 APT} + {-765399600 -14400 0 AST} + {-757368000 -14400 0 AST} + {-747252000 -10800 1 ADT} + {-733950000 -14400 0 AST} + {-715802400 -10800 1 ADT} + {-702500400 -14400 0 AST} + {-684352800 -10800 1 ADT} + {-671050800 -14400 0 AST} + {-652903200 -10800 1 ADT} + {-639601200 -14400 0 AST} + {-589399200 -10800 1 ADT} + {-576097200 -14400 0 AST} + {-557949600 -10800 1 ADT} + {-544647600 -14400 0 AST} + {-526500000 -10800 1 ADT} + {-513198000 -14400 0 AST} + {-495050400 -10800 1 ADT} + {-481748400 -14400 0 AST} + {-431546400 -10800 1 ADT} + {-418244400 -14400 0 AST} + {-400096800 -10800 1 ADT} + {-386794800 -14400 0 AST} + {-368647200 -10800 1 ADT} + {-355345200 -14400 0 AST} + {-337197600 -10800 1 ADT} + {-323895600 -14400 0 AST} + {-242244000 -10800 1 ADT} + {-226522800 -14400 0 AST} + {-210794400 -10800 1 ADT} + {-195073200 -14400 0 AST} + {-179344800 -10800 1 ADT} + {-163623600 -14400 0 AST} + {-147895200 -10800 1 ADT} + {-131569200 -14400 0 AST} + {-116445600 -10800 1 ADT} + {-100119600 -14400 0 AST} + {-84391200 -10800 1 ADT} + {-68670000 -14400 0 AST} + {-52941600 -10800 1 ADT} + {-37220400 -14400 0 AST} + {-21492000 -10800 1 ADT} + {-5770800 -14400 0 AST} + {9957600 -10800 1 ADT} + {25678800 -14400 0 AST} + {41407200 -10800 1 ADT} + {57733200 -14400 0 AST} + {73461600 -10800 1 ADT} + {89182800 -14400 0 AST} + {104911200 -10800 1 ADT} + {120632400 -14400 0 AST} + {126244800 -14400 0 AST} + {136360800 -10800 1 ADT} + {152082000 -14400 0 AST} + {167810400 -10800 1 ADT} + {183531600 -14400 0 AST} + {199260000 -10800 1 ADT} + {215586000 -14400 0 AST} + {230709600 -10800 1 ADT} + {247035600 -14400 0 AST} + {262764000 -10800 1 ADT} + {278485200 -14400 0 AST} + {294213600 -10800 1 ADT} + {309934800 -14400 0 AST} + {325663200 -10800 1 ADT} + {341384400 -14400 0 AST} + {357112800 -10800 1 ADT} + {372834000 -14400 0 AST} + {388562400 -10800 1 ADT} + {404888400 -14400 0 AST} + {420012000 -10800 1 ADT} + {436338000 -14400 0 AST} + {452066400 -10800 1 ADT} + {467787600 -14400 0 AST} + {483516000 -10800 1 ADT} + {499237200 -14400 0 AST} + {514965600 -10800 1 ADT} + {530686800 -14400 0 AST} + {544600800 -10800 1 ADT} + {562136400 -14400 0 AST} + {576050400 -10800 1 ADT} + {594190800 -14400 0 AST} + {607500000 -10800 1 ADT} + {625640400 -14400 0 AST} + {638949600 -10800 1 ADT} + {657090000 -14400 0 AST} + {671004000 -10800 1 ADT} + {688539600 -14400 0 AST} + {702453600 -10800 1 ADT} + {719989200 -14400 0 AST} + {733903200 -10800 1 ADT} + {752043600 -14400 0 AST} + {765352800 -10800 1 ADT} + {783493200 -14400 0 AST} + {796802400 -10800 1 ADT} + {814942800 -14400 0 AST} + {828856800 -10800 1 ADT} + {846392400 -14400 0 AST} + {860306400 -10800 1 ADT} + {877842000 -14400 0 AST} + {891756000 -10800 1 ADT} + {909291600 -14400 0 AST} + {923205600 -10800 1 ADT} + {941346000 -14400 0 AST} + {954655200 -10800 1 ADT} + {972795600 -14400 0 AST} + {986104800 -10800 1 ADT} + {1004245200 -14400 0 AST} + {1018159200 -10800 1 ADT} + {1035694800 -14400 0 AST} + {1049608800 -10800 1 ADT} + {1067144400 -14400 0 AST} + {1081058400 -10800 1 ADT} + {1099198800 -14400 0 AST} + {1112508000 -10800 1 ADT} + {1130648400 -14400 0 AST} + {1143957600 -10800 1 ADT} + {1162098000 -14400 0 AST} + {1173592800 -10800 1 ADT} + {1194152400 -14400 0 AST} + {1205042400 -10800 1 ADT} + {1225602000 -14400 0 AST} + {1236492000 -10800 1 ADT} + {1257051600 -14400 0 AST} + {1268546400 -10800 1 ADT} + {1289106000 -14400 0 AST} + {1299996000 -10800 1 ADT} + {1320555600 -14400 0 AST} + {1331445600 -10800 1 ADT} + {1352005200 -14400 0 AST} + {1362895200 -10800 1 ADT} + {1383454800 -14400 0 AST} + {1394344800 -10800 1 ADT} + {1414904400 -14400 0 AST} + {1425794400 -10800 1 ADT} + {1446354000 -14400 0 AST} + {1457848800 -10800 1 ADT} + {1478408400 -14400 0 AST} + {1489298400 -10800 1 ADT} + {1509858000 -14400 0 AST} + {1520748000 -10800 1 ADT} + {1541307600 -14400 0 AST} + {1552197600 -10800 1 ADT} + {1572757200 -14400 0 AST} + {1583647200 -10800 1 ADT} + {1604206800 -14400 0 AST} + {1615701600 -10800 1 ADT} + {1636261200 -14400 0 AST} + {1647151200 -10800 1 ADT} + {1667710800 -14400 0 AST} + {1678600800 -10800 1 ADT} + {1699160400 -14400 0 AST} + {1710050400 -10800 1 ADT} + {1730610000 -14400 0 AST} + {1741500000 -10800 1 ADT} + {1762059600 -14400 0 AST} + {1772949600 -10800 1 ADT} + {1793509200 -14400 0 AST} + {1805004000 -10800 1 ADT} + {1825563600 -14400 0 AST} + {1836453600 -10800 1 ADT} + {1857013200 -14400 0 AST} + {1867903200 -10800 1 ADT} + {1888462800 -14400 0 AST} + {1899352800 -10800 1 ADT} + {1919912400 -14400 0 AST} + {1930802400 -10800 1 ADT} + {1951362000 -14400 0 AST} + {1962856800 -10800 1 ADT} + {1983416400 -14400 0 AST} + {1994306400 -10800 1 ADT} + {2014866000 -14400 0 AST} + {2025756000 -10800 1 ADT} + {2046315600 -14400 0 AST} + {2057205600 -10800 1 ADT} + {2077765200 -14400 0 AST} + {2088655200 -10800 1 ADT} + {2109214800 -14400 0 AST} + {2120104800 -10800 1 ADT} + {2140664400 -14400 0 AST} + {2152159200 -10800 1 ADT} + {2172718800 -14400 0 AST} + {2183608800 -10800 1 ADT} + {2204168400 -14400 0 AST} + {2215058400 -10800 1 ADT} + {2235618000 -14400 0 AST} + {2246508000 -10800 1 ADT} + {2267067600 -14400 0 AST} + {2277957600 -10800 1 ADT} + {2298517200 -14400 0 AST} + {2309407200 -10800 1 ADT} + {2329966800 -14400 0 AST} + {2341461600 -10800 1 ADT} + {2362021200 -14400 0 AST} + {2372911200 -10800 1 ADT} + {2393470800 -14400 0 AST} + {2404360800 -10800 1 ADT} + {2424920400 -14400 0 AST} + {2435810400 -10800 1 ADT} + {2456370000 -14400 0 AST} + {2467260000 -10800 1 ADT} + {2487819600 -14400 0 AST} + {2499314400 -10800 1 ADT} + {2519874000 -14400 0 AST} + {2530764000 -10800 1 ADT} + {2551323600 -14400 0 AST} + {2562213600 -10800 1 ADT} + {2582773200 -14400 0 AST} + {2593663200 -10800 1 ADT} + {2614222800 -14400 0 AST} + {2625112800 -10800 1 ADT} + {2645672400 -14400 0 AST} + {2656562400 -10800 1 ADT} + {2677122000 -14400 0 AST} + {2688616800 -10800 1 ADT} + {2709176400 -14400 0 AST} + {2720066400 -10800 1 ADT} + {2740626000 -14400 0 AST} + {2751516000 -10800 1 ADT} + {2772075600 -14400 0 AST} + {2782965600 -10800 1 ADT} + {2803525200 -14400 0 AST} + {2814415200 -10800 1 ADT} + {2834974800 -14400 0 AST} + {2846469600 -10800 1 ADT} + {2867029200 -14400 0 AST} + {2877919200 -10800 1 ADT} + {2898478800 -14400 0 AST} + {2909368800 -10800 1 ADT} + {2929928400 -14400 0 AST} + {2940818400 -10800 1 ADT} + {2961378000 -14400 0 AST} + {2972268000 -10800 1 ADT} + {2992827600 -14400 0 AST} + {3003717600 -10800 1 ADT} + {3024277200 -14400 0 AST} + {3035772000 -10800 1 ADT} + {3056331600 -14400 0 AST} + {3067221600 -10800 1 ADT} + {3087781200 -14400 0 AST} + {3098671200 -10800 1 ADT} + {3119230800 -14400 0 AST} + {3130120800 -10800 1 ADT} + {3150680400 -14400 0 AST} + {3161570400 -10800 1 ADT} + {3182130000 -14400 0 AST} + {3193020000 -10800 1 ADT} + {3213579600 -14400 0 AST} + {3225074400 -10800 1 ADT} + {3245634000 -14400 0 AST} + {3256524000 -10800 1 ADT} + {3277083600 -14400 0 AST} + {3287973600 -10800 1 ADT} + {3308533200 -14400 0 AST} + {3319423200 -10800 1 ADT} + {3339982800 -14400 0 AST} + {3350872800 -10800 1 ADT} + {3371432400 -14400 0 AST} + {3382927200 -10800 1 ADT} + {3403486800 -14400 0 AST} + {3414376800 -10800 1 ADT} + {3434936400 -14400 0 AST} + {3445826400 -10800 1 ADT} + {3466386000 -14400 0 AST} + {3477276000 -10800 1 ADT} + {3497835600 -14400 0 AST} + {3508725600 -10800 1 ADT} + {3529285200 -14400 0 AST} + {3540175200 -10800 1 ADT} + {3560734800 -14400 0 AST} + {3572229600 -10800 1 ADT} + {3592789200 -14400 0 AST} + {3603679200 -10800 1 ADT} + {3624238800 -14400 0 AST} + {3635128800 -10800 1 ADT} + {3655688400 -14400 0 AST} + {3666578400 -10800 1 ADT} + {3687138000 -14400 0 AST} + {3698028000 -10800 1 ADT} + {3718587600 -14400 0 AST} + {3730082400 -10800 1 ADT} + {3750642000 -14400 0 AST} + {3761532000 -10800 1 ADT} + {3782091600 -14400 0 AST} + {3792981600 -10800 1 ADT} + {3813541200 -14400 0 AST} + {3824431200 -10800 1 ADT} + {3844990800 -14400 0 AST} + {3855880800 -10800 1 ADT} + {3876440400 -14400 0 AST} + {3887330400 -10800 1 ADT} + {3907890000 -14400 0 AST} + {3919384800 -10800 1 ADT} + {3939944400 -14400 0 AST} + {3950834400 -10800 1 ADT} + {3971394000 -14400 0 AST} + {3982284000 -10800 1 ADT} + {4002843600 -14400 0 AST} + {4013733600 -10800 1 ADT} + {4034293200 -14400 0 AST} + {4045183200 -10800 1 ADT} + {4065742800 -14400 0 AST} + {4076632800 -10800 1 ADT} + {4097192400 -14400 0 AST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Hermosillo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Hermosillo new file mode 100644 index 00000000..6576ad13 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Hermosillo @@ -0,0 +1,21 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Hermosillo) { + {-9223372036854775808 -26632 0 LMT} + {-1514739600 -25200 0 MST} + {-1343066400 -21600 0 CST} + {-1234807200 -25200 0 MST} + {-1220292000 -21600 1 MDT} + {-1207159200 -25200 0 MST} + {-1191344400 -21600 0 CST} + {-873828000 -25200 0 MST} + {-661539600 -28800 0 PST} + {28800 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {915174000 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Indianapolis b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Indianapolis new file mode 100644 index 00000000..63c410ca --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Indianapolis @@ -0,0 +1,234 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Indianapolis) { + {-9223372036854775808 -20678 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-1577901600 -21600 0 CST} + {-900259200 -18000 1 CDT} + {-891795600 -21600 0 CST} + {-883591200 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747244800 -18000 1 CDT} + {-733942800 -21600 0 CST} + {-715795200 -18000 1 CDT} + {-702493200 -21600 0 CST} + {-684345600 -18000 1 CDT} + {-671043600 -21600 0 CST} + {-652896000 -18000 1 CDT} + {-639594000 -21600 0 CST} + {-620841600 -18000 1 CDT} + {-608144400 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-557942400 -18000 1 CDT} + {-544640400 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 0 EST} + {-386787600 -21600 0 CST} + {-368640000 -18000 0 EST} + {-31518000 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {31554000 -18000 0 EST} + {1136091600 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Knox b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Knox new file mode 100644 index 00000000..eee3ff4e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Knox @@ -0,0 +1,285 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Knox) { + {-9223372036854775808 -20790 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-725824800 -21600 0 CST} + {-715795200 -18000 1 CDT} + {-702493200 -21600 0 CST} + {-684345600 -18000 1 CDT} + {-671043600 -21600 0 CST} + {-652896000 -18000 1 CDT} + {-639594000 -21600 0 CST} + {-620841600 -18000 1 CDT} + {-608144400 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-557942400 -18000 1 CDT} + {-544640400 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 1 CDT} + {-447267600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-415818000 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-321469200 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-289414800 -21600 0 CST} + {-273686400 -18000 1 CDT} + {-257965200 -21600 0 CST} + {-242236800 -18000 0 EST} + {-195066000 -21600 0 CST} + {-84384000 -18000 1 CDT} + {-68662800 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37213200 -21600 0 CST} + {-21484800 -18000 1 CDT} + {-5763600 -21600 0 CST} + {9964800 -18000 1 CDT} + {25686000 -21600 0 CST} + {41414400 -18000 1 CDT} + {57740400 -21600 0 CST} + {73468800 -18000 1 CDT} + {89190000 -21600 0 CST} + {104918400 -18000 1 CDT} + {120639600 -21600 0 CST} + {126691200 -18000 1 CDT} + {152089200 -21600 0 CST} + {162374400 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247042800 -21600 0 CST} + {262771200 -18000 1 CDT} + {278492400 -21600 0 CST} + {294220800 -18000 1 CDT} + {309942000 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688550400 -18000 0 EST} + {1143961200 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Marengo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Marengo new file mode 100644 index 00000000..3f1d578b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Marengo @@ -0,0 +1,236 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Marengo) { + {-9223372036854775808 -20723 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-599594400 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 1 CDT} + {-450291600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-418237200 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-323888400 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-292438800 -21600 0 CST} + {-273686400 -18000 0 EST} + {-31518000 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {126687600 -18000 1 CDT} + {152089200 -18000 0 EST} + {162370800 -14400 1 EDT} + {183535200 -18000 0 EST} + {189320400 -18000 0 EST} + {1136091600 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Petersburg b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Petersburg new file mode 100644 index 00000000..6992bfc4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Petersburg @@ -0,0 +1,247 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Petersburg) { + {-9223372036854775808 -20947 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-473364000 -21600 0 CST} + {-462996000 -18000 1 CDT} + {-450291600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-418237200 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-323888400 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-292438800 -21600 0 CST} + {-273686400 -18000 1 CDT} + {-257965200 -21600 0 CST} + {-242236800 -18000 1 CDT} + {-226515600 -21600 0 CST} + {-210787200 -18000 1 CDT} + {-195066000 -21600 0 CST} + {-179337600 -18000 1 CDT} + {-163616400 -21600 0 CST} + {-147888000 -18000 0 EST} + {-100112400 -21600 0 CST} + {-84384000 -18000 1 CDT} + {-68662800 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37213200 -21600 0 CST} + {-21484800 -18000 1 CDT} + {-5763600 -21600 0 CST} + {9964800 -18000 1 CDT} + {25686000 -21600 0 CST} + {41414400 -18000 1 CDT} + {57740400 -21600 0 CST} + {73468800 -18000 1 CDT} + {89190000 -21600 0 CST} + {104918400 -18000 1 CDT} + {120639600 -21600 0 CST} + {126691200 -18000 1 CDT} + {152089200 -21600 0 CST} + {162374400 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247046400 -18000 0 EST} + {1143961200 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194163200 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Tell_City b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Tell_City new file mode 100644 index 00000000..f8014bf3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Tell_City @@ -0,0 +1,230 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Tell_City) { + {-9223372036854775808 -20823 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-462996000 -18000 1 CDT} + {-450291600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-418237200 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-323888400 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-292438800 -21600 0 CST} + {-273686400 -18000 1 CDT} + {-257965200 -21600 0 CST} + {-242236800 -18000 1 CDT} + {-226515600 -21600 0 CST} + {-210787200 -18000 1 CDT} + {-195066000 -21600 0 CST} + {-179337600 -18000 0 EST} + {-68662800 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37213200 -21600 0 CST} + {-21484800 -14400 0 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {31554000 -18000 0 EST} + {1143961200 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Vevay b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Vevay new file mode 100644 index 00000000..8d4157fb --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Vevay @@ -0,0 +1,213 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Vevay) { + {-9223372036854775808 -20416 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-495043200 -18000 0 EST} + {-31518000 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {94712400 -18000 0 EST} + {1136091600 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Vincennes b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Vincennes new file mode 100644 index 00000000..1af7fc92 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Vincennes @@ -0,0 +1,234 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Vincennes) { + {-9223372036854775808 -21007 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747244800 -18000 1 CDT} + {-733942800 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-462996000 -18000 1 CDT} + {-450291600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-418237200 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-323888400 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-289414800 -21600 0 CST} + {-273686400 -18000 1 CDT} + {-260989200 -21600 0 CST} + {-242236800 -18000 1 CDT} + {-226515600 -21600 0 CST} + {-210787200 -18000 1 CDT} + {-195066000 -21600 0 CST} + {-179337600 -18000 0 EST} + {-31518000 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {31554000 -18000 0 EST} + {1143961200 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194163200 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Winamac b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Winamac new file mode 100644 index 00000000..fb6cd37a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indiana/Winamac @@ -0,0 +1,240 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Winamac) { + {-9223372036854775808 -20785 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747244800 -18000 1 CDT} + {-733942800 -21600 0 CST} + {-715795200 -18000 1 CDT} + {-702493200 -21600 0 CST} + {-684345600 -18000 1 CDT} + {-671043600 -21600 0 CST} + {-652896000 -18000 1 CDT} + {-639594000 -21600 0 CST} + {-620841600 -18000 1 CDT} + {-608144400 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-557942400 -18000 1 CDT} + {-544640400 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 1 CDT} + {-447267600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-415818000 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-323888400 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-292438800 -21600 0 CST} + {-273686400 -18000 0 EST} + {-31518000 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {31554000 -18000 0 EST} + {1143961200 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -14400 0 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indianapolis b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indianapolis new file mode 100644 index 00000000..73985454 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Indianapolis @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Indiana/Indianapolis)]} { + LoadTimeZoneFile America/Indiana/Indianapolis +} +set TZData(:America/Indianapolis) $TZData(:America/Indiana/Indianapolis) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Inuvik b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Inuvik new file mode 100644 index 00000000..08f0fd61 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Inuvik @@ -0,0 +1,249 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Inuvik) { + {-9223372036854775808 0 0 -00} + {-536457600 -28800 0 PST} + {-147888000 -21600 1 PDDT} + {-131558400 -28800 0 PST} + {315558000 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Iqaluit b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Iqaluit new file mode 100644 index 00000000..ff82866a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Iqaluit @@ -0,0 +1,250 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Iqaluit) { + {-9223372036854775808 0 0 -00} + {-865296000 -14400 0 EWT} + {-769395600 -14400 1 EPT} + {-765396000 -18000 0 EST} + {-147898800 -10800 1 EDDT} + {-131569200 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Jujuy b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Jujuy new file mode 100644 index 00000000..b4c5da3d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Jujuy @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Argentina/Jujuy)]} { + LoadTimeZoneFile America/Argentina/Jujuy +} +set TZData(:America/Jujuy) $TZData(:America/Argentina/Jujuy) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Juneau b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Juneau new file mode 100644 index 00000000..070a27a8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Juneau @@ -0,0 +1,276 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Juneau) { + {-9223372036854775808 54139 0 LMT} + {-3225223727 -32261 0 LMT} + {-2188954939 -28800 0 PST} + {-883584000 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-757353600 -28800 0 PST} + {-31507200 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {89197200 -28800 0 PST} + {104925600 -25200 1 PDT} + {120646800 -28800 0 PST} + {126698400 -25200 1 PDT} + {152096400 -28800 0 PST} + {162381600 -25200 1 PDT} + {183546000 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -32400 0 YST} + {325681200 -28800 1 YDT} + {341406000 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {439030800 -32400 0 AKST} + {452084400 -28800 1 AKDT} + {467805600 -32400 0 AKST} + {483534000 -28800 1 AKDT} + {499255200 -32400 0 AKST} + {514983600 -28800 1 AKDT} + {530704800 -32400 0 AKST} + {544618800 -28800 1 AKDT} + {562154400 -32400 0 AKST} + {576068400 -28800 1 AKDT} + {594208800 -32400 0 AKST} + {607518000 -28800 1 AKDT} + {625658400 -32400 0 AKST} + {638967600 -28800 1 AKDT} + {657108000 -32400 0 AKST} + {671022000 -28800 1 AKDT} + {688557600 -32400 0 AKST} + {702471600 -28800 1 AKDT} + {720007200 -32400 0 AKST} + {733921200 -28800 1 AKDT} + {752061600 -32400 0 AKST} + {765370800 -28800 1 AKDT} + {783511200 -32400 0 AKST} + {796820400 -28800 1 AKDT} + {814960800 -32400 0 AKST} + {828874800 -28800 1 AKDT} + {846410400 -32400 0 AKST} + {860324400 -28800 1 AKDT} + {877860000 -32400 0 AKST} + {891774000 -28800 1 AKDT} + {909309600 -32400 0 AKST} + {923223600 -28800 1 AKDT} + {941364000 -32400 0 AKST} + {954673200 -28800 1 AKDT} + {972813600 -32400 0 AKST} + {986122800 -28800 1 AKDT} + {1004263200 -32400 0 AKST} + {1018177200 -28800 1 AKDT} + {1035712800 -32400 0 AKST} + {1049626800 -28800 1 AKDT} + {1067162400 -32400 0 AKST} + {1081076400 -28800 1 AKDT} + {1099216800 -32400 0 AKST} + {1112526000 -28800 1 AKDT} + {1130666400 -32400 0 AKST} + {1143975600 -28800 1 AKDT} + {1162116000 -32400 0 AKST} + {1173610800 -28800 1 AKDT} + {1194170400 -32400 0 AKST} + {1205060400 -28800 1 AKDT} + {1225620000 -32400 0 AKST} + {1236510000 -28800 1 AKDT} + {1257069600 -32400 0 AKST} + {1268564400 -28800 1 AKDT} + {1289124000 -32400 0 AKST} + {1300014000 -28800 1 AKDT} + {1320573600 -32400 0 AKST} + {1331463600 -28800 1 AKDT} + {1352023200 -32400 0 AKST} + {1362913200 -28800 1 AKDT} + {1383472800 -32400 0 AKST} + {1394362800 -28800 1 AKDT} + {1414922400 -32400 0 AKST} + {1425812400 -28800 1 AKDT} + {1446372000 -32400 0 AKST} + {1457866800 -28800 1 AKDT} + {1478426400 -32400 0 AKST} + {1489316400 -28800 1 AKDT} + {1509876000 -32400 0 AKST} + {1520766000 -28800 1 AKDT} + {1541325600 -32400 0 AKST} + {1552215600 -28800 1 AKDT} + {1572775200 -32400 0 AKST} + {1583665200 -28800 1 AKDT} + {1604224800 -32400 0 AKST} + {1615719600 -28800 1 AKDT} + {1636279200 -32400 0 AKST} + {1647169200 -28800 1 AKDT} + {1667728800 -32400 0 AKST} + {1678618800 -28800 1 AKDT} + {1699178400 -32400 0 AKST} + {1710068400 -28800 1 AKDT} + {1730628000 -32400 0 AKST} + {1741518000 -28800 1 AKDT} + {1762077600 -32400 0 AKST} + {1772967600 -28800 1 AKDT} + {1793527200 -32400 0 AKST} + {1805022000 -28800 1 AKDT} + {1825581600 -32400 0 AKST} + {1836471600 -28800 1 AKDT} + {1857031200 -32400 0 AKST} + {1867921200 -28800 1 AKDT} + {1888480800 -32400 0 AKST} + {1899370800 -28800 1 AKDT} + {1919930400 -32400 0 AKST} + {1930820400 -28800 1 AKDT} + {1951380000 -32400 0 AKST} + {1962874800 -28800 1 AKDT} + {1983434400 -32400 0 AKST} + {1994324400 -28800 1 AKDT} + {2014884000 -32400 0 AKST} + {2025774000 -28800 1 AKDT} + {2046333600 -32400 0 AKST} + {2057223600 -28800 1 AKDT} + {2077783200 -32400 0 AKST} + {2088673200 -28800 1 AKDT} + {2109232800 -32400 0 AKST} + {2120122800 -28800 1 AKDT} + {2140682400 -32400 0 AKST} + {2152177200 -28800 1 AKDT} + {2172736800 -32400 0 AKST} + {2183626800 -28800 1 AKDT} + {2204186400 -32400 0 AKST} + {2215076400 -28800 1 AKDT} + {2235636000 -32400 0 AKST} + {2246526000 -28800 1 AKDT} + {2267085600 -32400 0 AKST} + {2277975600 -28800 1 AKDT} + {2298535200 -32400 0 AKST} + {2309425200 -28800 1 AKDT} + {2329984800 -32400 0 AKST} + {2341479600 -28800 1 AKDT} + {2362039200 -32400 0 AKST} + {2372929200 -28800 1 AKDT} + {2393488800 -32400 0 AKST} + {2404378800 -28800 1 AKDT} + {2424938400 -32400 0 AKST} + {2435828400 -28800 1 AKDT} + {2456388000 -32400 0 AKST} + {2467278000 -28800 1 AKDT} + {2487837600 -32400 0 AKST} + {2499332400 -28800 1 AKDT} + {2519892000 -32400 0 AKST} + {2530782000 -28800 1 AKDT} + {2551341600 -32400 0 AKST} + {2562231600 -28800 1 AKDT} + {2582791200 -32400 0 AKST} + {2593681200 -28800 1 AKDT} + {2614240800 -32400 0 AKST} + {2625130800 -28800 1 AKDT} + {2645690400 -32400 0 AKST} + {2656580400 -28800 1 AKDT} + {2677140000 -32400 0 AKST} + {2688634800 -28800 1 AKDT} + {2709194400 -32400 0 AKST} + {2720084400 -28800 1 AKDT} + {2740644000 -32400 0 AKST} + {2751534000 -28800 1 AKDT} + {2772093600 -32400 0 AKST} + {2782983600 -28800 1 AKDT} + {2803543200 -32400 0 AKST} + {2814433200 -28800 1 AKDT} + {2834992800 -32400 0 AKST} + {2846487600 -28800 1 AKDT} + {2867047200 -32400 0 AKST} + {2877937200 -28800 1 AKDT} + {2898496800 -32400 0 AKST} + {2909386800 -28800 1 AKDT} + {2929946400 -32400 0 AKST} + {2940836400 -28800 1 AKDT} + {2961396000 -32400 0 AKST} + {2972286000 -28800 1 AKDT} + {2992845600 -32400 0 AKST} + {3003735600 -28800 1 AKDT} + {3024295200 -32400 0 AKST} + {3035790000 -28800 1 AKDT} + {3056349600 -32400 0 AKST} + {3067239600 -28800 1 AKDT} + {3087799200 -32400 0 AKST} + {3098689200 -28800 1 AKDT} + {3119248800 -32400 0 AKST} + {3130138800 -28800 1 AKDT} + {3150698400 -32400 0 AKST} + {3161588400 -28800 1 AKDT} + {3182148000 -32400 0 AKST} + {3193038000 -28800 1 AKDT} + {3213597600 -32400 0 AKST} + {3225092400 -28800 1 AKDT} + {3245652000 -32400 0 AKST} + {3256542000 -28800 1 AKDT} + {3277101600 -32400 0 AKST} + {3287991600 -28800 1 AKDT} + {3308551200 -32400 0 AKST} + {3319441200 -28800 1 AKDT} + {3340000800 -32400 0 AKST} + {3350890800 -28800 1 AKDT} + {3371450400 -32400 0 AKST} + {3382945200 -28800 1 AKDT} + {3403504800 -32400 0 AKST} + {3414394800 -28800 1 AKDT} + {3434954400 -32400 0 AKST} + {3445844400 -28800 1 AKDT} + {3466404000 -32400 0 AKST} + {3477294000 -28800 1 AKDT} + {3497853600 -32400 0 AKST} + {3508743600 -28800 1 AKDT} + {3529303200 -32400 0 AKST} + {3540193200 -28800 1 AKDT} + {3560752800 -32400 0 AKST} + {3572247600 -28800 1 AKDT} + {3592807200 -32400 0 AKST} + {3603697200 -28800 1 AKDT} + {3624256800 -32400 0 AKST} + {3635146800 -28800 1 AKDT} + {3655706400 -32400 0 AKST} + {3666596400 -28800 1 AKDT} + {3687156000 -32400 0 AKST} + {3698046000 -28800 1 AKDT} + {3718605600 -32400 0 AKST} + {3730100400 -28800 1 AKDT} + {3750660000 -32400 0 AKST} + {3761550000 -28800 1 AKDT} + {3782109600 -32400 0 AKST} + {3792999600 -28800 1 AKDT} + {3813559200 -32400 0 AKST} + {3824449200 -28800 1 AKDT} + {3845008800 -32400 0 AKST} + {3855898800 -28800 1 AKDT} + {3876458400 -32400 0 AKST} + {3887348400 -28800 1 AKDT} + {3907908000 -32400 0 AKST} + {3919402800 -28800 1 AKDT} + {3939962400 -32400 0 AKST} + {3950852400 -28800 1 AKDT} + {3971412000 -32400 0 AKST} + {3982302000 -28800 1 AKDT} + {4002861600 -32400 0 AKST} + {4013751600 -28800 1 AKDT} + {4034311200 -32400 0 AKST} + {4045201200 -28800 1 AKDT} + {4065760800 -32400 0 AKST} + {4076650800 -28800 1 AKDT} + {4097210400 -32400 0 AKST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Kentucky/Louisville b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Kentucky/Louisville new file mode 100644 index 00000000..7efbec97 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Kentucky/Louisville @@ -0,0 +1,311 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Kentucky/Louisville) { + {-9223372036854775808 -20582 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-1546279200 -21600 0 CST} + {-1535904000 -18000 1 CDT} + {-1525280400 -21600 0 CST} + {-905097600 -18000 1 CDT} + {-891795600 -21600 0 CST} + {-883591200 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747251940 -18000 1 CDT} + {-744224400 -21600 0 CST} + {-620841600 -18000 1 CDT} + {-608144400 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-557942400 -18000 1 CDT} + {-544640400 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 1 CDT} + {-450291600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-415818000 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-384368400 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-352918800 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-321469200 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-289414800 -21600 0 CST} + {-273686400 -18000 1 CDT} + {-266428800 -18000 0 EST} + {-63140400 -18000 0 EST} + {-52938000 -14400 1 EDT} + {-37216800 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {126687600 -18000 1 CDT} + {152089200 -18000 0 EST} + {162370800 -14400 1 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Kentucky/Monticello b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Kentucky/Monticello new file mode 100644 index 00000000..e523ecbb --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Kentucky/Monticello @@ -0,0 +1,279 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Kentucky/Monticello) { + {-9223372036854775808 -20364 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-63136800 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37213200 -21600 0 CST} + {-21484800 -18000 1 CDT} + {-5763600 -21600 0 CST} + {9964800 -18000 1 CDT} + {25686000 -21600 0 CST} + {41414400 -18000 1 CDT} + {57740400 -21600 0 CST} + {73468800 -18000 1 CDT} + {89190000 -21600 0 CST} + {104918400 -18000 1 CDT} + {120639600 -21600 0 CST} + {126691200 -18000 1 CDT} + {152089200 -21600 0 CST} + {162374400 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247042800 -21600 0 CST} + {262771200 -18000 1 CDT} + {278492400 -21600 0 CST} + {294220800 -18000 1 CDT} + {309942000 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Knox_IN b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Knox_IN new file mode 100644 index 00000000..00d21c08 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Knox_IN @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Indiana/Knox)]} { + LoadTimeZoneFile America/Indiana/Knox +} +set TZData(:America/Knox_IN) $TZData(:America/Indiana/Knox) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Kralendijk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Kralendijk new file mode 100644 index 00000000..548dbd54 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Kralendijk @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/Kralendijk) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/La_Paz b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/La_Paz new file mode 100644 index 00000000..ea2f7118 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/La_Paz @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/La_Paz) { + {-9223372036854775808 -16356 0 LMT} + {-2524505244 -16356 0 CMT} + {-1205954844 -12756 1 BST} + {-1192307244 -14400 0 -04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Los_Angeles b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Los_Angeles new file mode 100644 index 00000000..8e265262 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Los_Angeles @@ -0,0 +1,317 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Los_Angeles) { + {-9223372036854775808 -28378 0 LMT} + {-2717640000 -28800 0 PST} + {-1633269600 -25200 1 PDT} + {-1615129200 -28800 0 PST} + {-1601820000 -25200 1 PDT} + {-1583679600 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-757353600 -28800 0 PST} + {-687967140 -25200 1 PDT} + {-662655600 -28800 0 PST} + {-620838000 -25200 1 PDT} + {-608137200 -28800 0 PST} + {-589388400 -25200 1 PDT} + {-576082800 -28800 0 PST} + {-557938800 -25200 1 PDT} + {-544633200 -28800 0 PST} + {-526489200 -25200 1 PDT} + {-513183600 -28800 0 PST} + {-495039600 -25200 1 PDT} + {-481734000 -28800 0 PST} + {-463590000 -25200 1 PDT} + {-450284400 -28800 0 PST} + {-431535600 -25200 1 PDT} + {-418230000 -28800 0 PST} + {-400086000 -25200 1 PDT} + {-386780400 -28800 0 PST} + {-368636400 -25200 1 PDT} + {-355330800 -28800 0 PST} + {-337186800 -25200 1 PDT} + {-323881200 -28800 0 PST} + {-305737200 -25200 1 PDT} + {-292431600 -28800 0 PST} + {-273682800 -25200 1 PDT} + {-260982000 -28800 0 PST} + {-242233200 -25200 1 PDT} + {-226508400 -28800 0 PST} + {-210783600 -25200 1 PDT} + {-195058800 -28800 0 PST} + {-179334000 -25200 1 PDT} + {-163609200 -28800 0 PST} + {-147884400 -25200 1 PDT} + {-131554800 -28800 0 PST} + {-116434800 -25200 1 PDT} + {-100105200 -28800 0 PST} + {-94665600 -28800 0 PST} + {-84376800 -25200 1 PDT} + {-68655600 -28800 0 PST} + {-52927200 -25200 1 PDT} + {-37206000 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {89197200 -28800 0 PST} + {104925600 -25200 1 PDT} + {120646800 -28800 0 PST} + {126698400 -25200 1 PDT} + {152096400 -28800 0 PST} + {162381600 -25200 1 PDT} + {183546000 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1173607200 -25200 1 PDT} + {1194166800 -28800 0 PST} + {1205056800 -25200 1 PDT} + {1225616400 -28800 0 PST} + {1236506400 -25200 1 PDT} + {1257066000 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 1 PDT} + {1446368400 -28800 0 PST} + {1457863200 -25200 1 PDT} + {1478422800 -28800 0 PST} + {1489312800 -25200 1 PDT} + {1509872400 -28800 0 PST} + {1520762400 -25200 1 PDT} + {1541322000 -28800 0 PST} + {1552212000 -25200 1 PDT} + {1572771600 -28800 0 PST} + {1583661600 -25200 1 PDT} + {1604221200 -28800 0 PST} + {1615716000 -25200 1 PDT} + {1636275600 -28800 0 PST} + {1647165600 -25200 1 PDT} + {1667725200 -28800 0 PST} + {1678615200 -25200 1 PDT} + {1699174800 -28800 0 PST} + {1710064800 -25200 1 PDT} + {1730624400 -28800 0 PST} + {1741514400 -25200 1 PDT} + {1762074000 -28800 0 PST} + {1772964000 -25200 1 PDT} + {1793523600 -28800 0 PST} + {1805018400 -25200 1 PDT} + {1825578000 -28800 0 PST} + {1836468000 -25200 1 PDT} + {1857027600 -28800 0 PST} + {1867917600 -25200 1 PDT} + {1888477200 -28800 0 PST} + {1899367200 -25200 1 PDT} + {1919926800 -28800 0 PST} + {1930816800 -25200 1 PDT} + {1951376400 -28800 0 PST} + {1962871200 -25200 1 PDT} + {1983430800 -28800 0 PST} + {1994320800 -25200 1 PDT} + {2014880400 -28800 0 PST} + {2025770400 -25200 1 PDT} + {2046330000 -28800 0 PST} + {2057220000 -25200 1 PDT} + {2077779600 -28800 0 PST} + {2088669600 -25200 1 PDT} + {2109229200 -28800 0 PST} + {2120119200 -25200 1 PDT} + {2140678800 -28800 0 PST} + {2152173600 -25200 1 PDT} + {2172733200 -28800 0 PST} + {2183623200 -25200 1 PDT} + {2204182800 -28800 0 PST} + {2215072800 -25200 1 PDT} + {2235632400 -28800 0 PST} + {2246522400 -25200 1 PDT} + {2267082000 -28800 0 PST} + {2277972000 -25200 1 PDT} + {2298531600 -28800 0 PST} + {2309421600 -25200 1 PDT} + {2329981200 -28800 0 PST} + {2341476000 -25200 1 PDT} + {2362035600 -28800 0 PST} + {2372925600 -25200 1 PDT} + {2393485200 -28800 0 PST} + {2404375200 -25200 1 PDT} + {2424934800 -28800 0 PST} + {2435824800 -25200 1 PDT} + {2456384400 -28800 0 PST} + {2467274400 -25200 1 PDT} + {2487834000 -28800 0 PST} + {2499328800 -25200 1 PDT} + {2519888400 -28800 0 PST} + {2530778400 -25200 1 PDT} + {2551338000 -28800 0 PST} + {2562228000 -25200 1 PDT} + {2582787600 -28800 0 PST} + {2593677600 -25200 1 PDT} + {2614237200 -28800 0 PST} + {2625127200 -25200 1 PDT} + {2645686800 -28800 0 PST} + {2656576800 -25200 1 PDT} + {2677136400 -28800 0 PST} + {2688631200 -25200 1 PDT} + {2709190800 -28800 0 PST} + {2720080800 -25200 1 PDT} + {2740640400 -28800 0 PST} + {2751530400 -25200 1 PDT} + {2772090000 -28800 0 PST} + {2782980000 -25200 1 PDT} + {2803539600 -28800 0 PST} + {2814429600 -25200 1 PDT} + {2834989200 -28800 0 PST} + {2846484000 -25200 1 PDT} + {2867043600 -28800 0 PST} + {2877933600 -25200 1 PDT} + {2898493200 -28800 0 PST} + {2909383200 -25200 1 PDT} + {2929942800 -28800 0 PST} + {2940832800 -25200 1 PDT} + {2961392400 -28800 0 PST} + {2972282400 -25200 1 PDT} + {2992842000 -28800 0 PST} + {3003732000 -25200 1 PDT} + {3024291600 -28800 0 PST} + {3035786400 -25200 1 PDT} + {3056346000 -28800 0 PST} + {3067236000 -25200 1 PDT} + {3087795600 -28800 0 PST} + {3098685600 -25200 1 PDT} + {3119245200 -28800 0 PST} + {3130135200 -25200 1 PDT} + {3150694800 -28800 0 PST} + {3161584800 -25200 1 PDT} + {3182144400 -28800 0 PST} + {3193034400 -25200 1 PDT} + {3213594000 -28800 0 PST} + {3225088800 -25200 1 PDT} + {3245648400 -28800 0 PST} + {3256538400 -25200 1 PDT} + {3277098000 -28800 0 PST} + {3287988000 -25200 1 PDT} + {3308547600 -28800 0 PST} + {3319437600 -25200 1 PDT} + {3339997200 -28800 0 PST} + {3350887200 -25200 1 PDT} + {3371446800 -28800 0 PST} + {3382941600 -25200 1 PDT} + {3403501200 -28800 0 PST} + {3414391200 -25200 1 PDT} + {3434950800 -28800 0 PST} + {3445840800 -25200 1 PDT} + {3466400400 -28800 0 PST} + {3477290400 -25200 1 PDT} + {3497850000 -28800 0 PST} + {3508740000 -25200 1 PDT} + {3529299600 -28800 0 PST} + {3540189600 -25200 1 PDT} + {3560749200 -28800 0 PST} + {3572244000 -25200 1 PDT} + {3592803600 -28800 0 PST} + {3603693600 -25200 1 PDT} + {3624253200 -28800 0 PST} + {3635143200 -25200 1 PDT} + {3655702800 -28800 0 PST} + {3666592800 -25200 1 PDT} + {3687152400 -28800 0 PST} + {3698042400 -25200 1 PDT} + {3718602000 -28800 0 PST} + {3730096800 -25200 1 PDT} + {3750656400 -28800 0 PST} + {3761546400 -25200 1 PDT} + {3782106000 -28800 0 PST} + {3792996000 -25200 1 PDT} + {3813555600 -28800 0 PST} + {3824445600 -25200 1 PDT} + {3845005200 -28800 0 PST} + {3855895200 -25200 1 PDT} + {3876454800 -28800 0 PST} + {3887344800 -25200 1 PDT} + {3907904400 -28800 0 PST} + {3919399200 -25200 1 PDT} + {3939958800 -28800 0 PST} + {3950848800 -25200 1 PDT} + {3971408400 -28800 0 PST} + {3982298400 -25200 1 PDT} + {4002858000 -28800 0 PST} + {4013748000 -25200 1 PDT} + {4034307600 -28800 0 PST} + {4045197600 -25200 1 PDT} + {4065757200 -28800 0 PST} + {4076647200 -25200 1 PDT} + {4097206800 -28800 0 PST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Louisville b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Louisville new file mode 100644 index 00000000..c5a3e1c8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Louisville @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Kentucky/Louisville)]} { + LoadTimeZoneFile America/Kentucky/Louisville +} +set TZData(:America/Louisville) $TZData(:America/Kentucky/Louisville) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Lower_Princes b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Lower_Princes new file mode 100644 index 00000000..655da0e8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Lower_Princes @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/Lower_Princes) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Maceio b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Maceio new file mode 100644 index 00000000..eab534e6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Maceio @@ -0,0 +1,52 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Maceio) { + {-9223372036854775808 -8572 0 LMT} + {-1767217028 -10800 0 -03} + {-1206957600 -7200 1 -03} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -03} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -03} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -03} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -03} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -03} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -03} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -03} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -03} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -03} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -03} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -03} + {511236000 -10800 0 -03} + {530593200 -7200 1 -03} + {540266400 -10800 0 -03} + {562129200 -7200 1 -03} + {571197600 -10800 0 -03} + {592974000 -7200 1 -03} + {602042400 -10800 0 -03} + {624423600 -7200 1 -03} + {634701600 -10800 0 -03} + {653536800 -10800 0 -03} + {813553200 -10800 0 -03} + {813726000 -7200 1 -03} + {824004000 -10800 0 -03} + {841802400 -10800 0 -03} + {938660400 -10800 0 -03} + {938919600 -7200 1 -03} + {951616800 -10800 0 -03} + {970974000 -7200 1 -03} + {972180000 -10800 0 -03} + {1000350000 -10800 0 -03} + {1003028400 -7200 1 -03} + {1013911200 -10800 0 -03} + {1033437600 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Manaus b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Manaus new file mode 100644 index 00000000..a855062c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Manaus @@ -0,0 +1,39 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Manaus) { + {-9223372036854775808 -14404 0 LMT} + {-1767211196 -14400 0 -04} + {-1206954000 -10800 1 -04} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -04} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -04} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -04} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -04} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -04} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -04} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -04} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -04} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -04} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -04} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -04} + {511239600 -14400 0 -04} + {530596800 -10800 1 -04} + {540270000 -14400 0 -04} + {562132800 -10800 1 -04} + {571201200 -14400 0 -04} + {590036400 -14400 0 -04} + {749188800 -14400 0 -04} + {750830400 -10800 1 -04} + {761713200 -14400 0 -04} + {780202800 -14400 0 -04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Marigot b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Marigot new file mode 100644 index 00000000..9c775224 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Marigot @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/Marigot) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Martinique b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Martinique new file mode 100644 index 00000000..1f1b491b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Martinique @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Martinique) { + {-9223372036854775808 -14660 0 LMT} + {-2524506940 -14660 0 FFMT} + {-1851537340 -14400 0 AST} + {323841600 -10800 1 ADT} + {338958000 -14400 0 AST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Matamoros b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Matamoros new file mode 100644 index 00000000..6ae2fb91 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Matamoros @@ -0,0 +1,219 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Matamoros) { + {-9223372036854775808 -23400 0 LMT} + {-1514743200 -21600 0 CST} + {568015200 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {599637600 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {989136000 -18000 1 CDT} + {1001833200 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1175414400 -18000 1 CDT} + {1193554800 -21600 0 CST} + {1207468800 -18000 1 CDT} + {1225004400 -21600 0 CST} + {1238918400 -18000 1 CDT} + {1256454000 -21600 0 CST} + {1262325600 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Mazatlan b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Mazatlan new file mode 100644 index 00000000..d9da09fd --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Mazatlan @@ -0,0 +1,68 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Mazatlan) { + {-9223372036854775808 -25540 0 LMT} + {-1514739600 -25200 0 MST} + {-1343066400 -21600 0 CST} + {-1234807200 -25200 0 MST} + {-1220292000 -21600 1 MDT} + {-1207159200 -25200 0 MST} + {-1191344400 -21600 0 CST} + {-873828000 -25200 0 MST} + {-661539600 -28800 0 PST} + {28800 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {989139600 -21600 1 MDT} + {1001836800 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1175418000 -21600 1 MDT} + {1193558400 -25200 0 MST} + {1207472400 -21600 1 MDT} + {1225008000 -25200 0 MST} + {1238922000 -21600 1 MDT} + {1256457600 -25200 0 MST} + {1270371600 -21600 1 MDT} + {1288512000 -25200 0 MST} + {1301821200 -21600 1 MDT} + {1319961600 -25200 0 MST} + {1333270800 -21600 1 MDT} + {1351411200 -25200 0 MST} + {1365325200 -21600 1 MDT} + {1382860800 -25200 0 MST} + {1396774800 -21600 1 MDT} + {1414310400 -25200 0 MST} + {1428224400 -21600 1 MDT} + {1445760000 -25200 0 MST} + {1459674000 -21600 1 MDT} + {1477814400 -25200 0 MST} + {1491123600 -21600 1 MDT} + {1509264000 -25200 0 MST} + {1522573200 -21600 1 MDT} + {1540713600 -25200 0 MST} + {1554627600 -21600 1 MDT} + {1572163200 -25200 0 MST} + {1586077200 -21600 1 MDT} + {1603612800 -25200 0 MST} + {1617526800 -21600 1 MDT} + {1635667200 -25200 0 MST} + {1648976400 -21600 1 MDT} + {1667116800 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Menominee b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Menominee new file mode 100644 index 00000000..382aeda2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Menominee @@ -0,0 +1,274 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Menominee) { + {-9223372036854775808 -21027 0 LMT} + {-2659759773 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747244800 -18000 1 CDT} + {-733942800 -21600 0 CST} + {-116438400 -18000 1 CDT} + {-100112400 -21600 0 CST} + {-21484800 -18000 0 EST} + {104914800 -21600 0 CST} + {104918400 -18000 1 CDT} + {120639600 -21600 0 CST} + {126691200 -18000 1 CDT} + {152089200 -21600 0 CST} + {162374400 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247042800 -21600 0 CST} + {262771200 -18000 1 CDT} + {278492400 -21600 0 CST} + {294220800 -18000 1 CDT} + {309942000 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {986112000 -18000 1 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Mexico_City b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Mexico_City new file mode 100644 index 00000000..2a0a5a82 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Mexico_City @@ -0,0 +1,74 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Mexico_City) { + {-9223372036854775808 -23796 0 LMT} + {-1514739600 -25200 0 MST} + {-1343066400 -21600 0 CST} + {-1234807200 -25200 0 MST} + {-1220292000 -21600 1 MDT} + {-1207159200 -25200 0 MST} + {-1191344400 -21600 0 CST} + {-975261600 -18000 1 CDT} + {-963169200 -21600 0 CST} + {-917114400 -18000 1 CDT} + {-907354800 -21600 0 CST} + {-821901600 -18000 1 CWT} + {-810068400 -21600 0 CST} + {-627501600 -18000 1 CDT} + {-612990000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {989136000 -18000 1 CDT} + {1001836800 -21600 0 CST} + {1014184800 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1175414400 -18000 1 CDT} + {1193554800 -21600 0 CST} + {1207468800 -18000 1 CDT} + {1225004400 -21600 0 CST} + {1238918400 -18000 1 CDT} + {1256454000 -21600 0 CST} + {1270368000 -18000 1 CDT} + {1288508400 -21600 0 CST} + {1301817600 -18000 1 CDT} + {1319958000 -21600 0 CST} + {1333267200 -18000 1 CDT} + {1351407600 -21600 0 CST} + {1365321600 -18000 1 CDT} + {1382857200 -21600 0 CST} + {1396771200 -18000 1 CDT} + {1414306800 -21600 0 CST} + {1428220800 -18000 1 CDT} + {1445756400 -21600 0 CST} + {1459670400 -18000 1 CDT} + {1477810800 -21600 0 CST} + {1491120000 -18000 1 CDT} + {1509260400 -21600 0 CST} + {1522569600 -18000 1 CDT} + {1540710000 -21600 0 CST} + {1554624000 -18000 1 CDT} + {1572159600 -21600 0 CST} + {1586073600 -18000 1 CDT} + {1603609200 -21600 0 CST} + {1617523200 -18000 1 CDT} + {1635663600 -21600 0 CST} + {1648972800 -18000 1 CDT} + {1667113200 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Miquelon b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Miquelon new file mode 100644 index 00000000..c299be61 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Miquelon @@ -0,0 +1,234 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Miquelon) { + {-9223372036854775808 -13480 0 LMT} + {-1850328920 -14400 0 AST} + {326001600 -10800 0 -03} + {536468400 -10800 0 -02} + {544597200 -7200 1 -02} + {562132800 -10800 0 -02} + {576046800 -7200 1 -02} + {594187200 -10800 0 -02} + {607496400 -7200 1 -02} + {625636800 -10800 0 -02} + {638946000 -7200 1 -02} + {657086400 -10800 0 -02} + {671000400 -7200 1 -02} + {688536000 -10800 0 -02} + {702450000 -7200 1 -02} + {719985600 -10800 0 -02} + {733899600 -7200 1 -02} + {752040000 -10800 0 -02} + {765349200 -7200 1 -02} + {783489600 -10800 0 -02} + {796798800 -7200 1 -02} + {814939200 -10800 0 -02} + {828853200 -7200 1 -02} + {846388800 -10800 0 -02} + {860302800 -7200 1 -02} + {877838400 -10800 0 -02} + {891752400 -7200 1 -02} + {909288000 -10800 0 -02} + {923202000 -7200 1 -02} + {941342400 -10800 0 -02} + {954651600 -7200 1 -02} + {972792000 -10800 0 -02} + {986101200 -7200 1 -02} + {1004241600 -10800 0 -02} + {1018155600 -7200 1 -02} + {1035691200 -10800 0 -02} + {1049605200 -7200 1 -02} + {1067140800 -10800 0 -02} + {1081054800 -7200 1 -02} + {1099195200 -10800 0 -02} + {1112504400 -7200 1 -02} + {1130644800 -10800 0 -02} + {1143954000 -7200 1 -02} + {1162094400 -10800 0 -02} + {1173589200 -7200 1 -02} + {1194148800 -10800 0 -02} + {1205038800 -7200 1 -02} + {1225598400 -10800 0 -02} + {1236488400 -7200 1 -02} + {1257048000 -10800 0 -02} + {1268542800 -7200 1 -02} + {1289102400 -10800 0 -02} + {1299992400 -7200 1 -02} + {1320552000 -10800 0 -02} + {1331442000 -7200 1 -02} + {1352001600 -10800 0 -02} + {1362891600 -7200 1 -02} + {1383451200 -10800 0 -02} + {1394341200 -7200 1 -02} + {1414900800 -10800 0 -02} + {1425790800 -7200 1 -02} + {1446350400 -10800 0 -02} + {1457845200 -7200 1 -02} + {1478404800 -10800 0 -02} + {1489294800 -7200 1 -02} + {1509854400 -10800 0 -02} + {1520744400 -7200 1 -02} + {1541304000 -10800 0 -02} + {1552194000 -7200 1 -02} + {1572753600 -10800 0 -02} + {1583643600 -7200 1 -02} + {1604203200 -10800 0 -02} + {1615698000 -7200 1 -02} + {1636257600 -10800 0 -02} + {1647147600 -7200 1 -02} + {1667707200 -10800 0 -02} + {1678597200 -7200 1 -02} + {1699156800 -10800 0 -02} + {1710046800 -7200 1 -02} + {1730606400 -10800 0 -02} + {1741496400 -7200 1 -02} + {1762056000 -10800 0 -02} + {1772946000 -7200 1 -02} + {1793505600 -10800 0 -02} + {1805000400 -7200 1 -02} + {1825560000 -10800 0 -02} + {1836450000 -7200 1 -02} + {1857009600 -10800 0 -02} + {1867899600 -7200 1 -02} + {1888459200 -10800 0 -02} + {1899349200 -7200 1 -02} + {1919908800 -10800 0 -02} + {1930798800 -7200 1 -02} + {1951358400 -10800 0 -02} + {1962853200 -7200 1 -02} + {1983412800 -10800 0 -02} + {1994302800 -7200 1 -02} + {2014862400 -10800 0 -02} + {2025752400 -7200 1 -02} + {2046312000 -10800 0 -02} + {2057202000 -7200 1 -02} + {2077761600 -10800 0 -02} + {2088651600 -7200 1 -02} + {2109211200 -10800 0 -02} + {2120101200 -7200 1 -02} + {2140660800 -10800 0 -02} + {2152155600 -7200 1 -02} + {2172715200 -10800 0 -02} + {2183605200 -7200 1 -02} + {2204164800 -10800 0 -02} + {2215054800 -7200 1 -02} + {2235614400 -10800 0 -02} + {2246504400 -7200 1 -02} + {2267064000 -10800 0 -02} + {2277954000 -7200 1 -02} + {2298513600 -10800 0 -02} + {2309403600 -7200 1 -02} + {2329963200 -10800 0 -02} + {2341458000 -7200 1 -02} + {2362017600 -10800 0 -02} + {2372907600 -7200 1 -02} + {2393467200 -10800 0 -02} + {2404357200 -7200 1 -02} + {2424916800 -10800 0 -02} + {2435806800 -7200 1 -02} + {2456366400 -10800 0 -02} + {2467256400 -7200 1 -02} + {2487816000 -10800 0 -02} + {2499310800 -7200 1 -02} + {2519870400 -10800 0 -02} + {2530760400 -7200 1 -02} + {2551320000 -10800 0 -02} + {2562210000 -7200 1 -02} + {2582769600 -10800 0 -02} + {2593659600 -7200 1 -02} + {2614219200 -10800 0 -02} + {2625109200 -7200 1 -02} + {2645668800 -10800 0 -02} + {2656558800 -7200 1 -02} + {2677118400 -10800 0 -02} + {2688613200 -7200 1 -02} + {2709172800 -10800 0 -02} + {2720062800 -7200 1 -02} + {2740622400 -10800 0 -02} + {2751512400 -7200 1 -02} + {2772072000 -10800 0 -02} + {2782962000 -7200 1 -02} + {2803521600 -10800 0 -02} + {2814411600 -7200 1 -02} + {2834971200 -10800 0 -02} + {2846466000 -7200 1 -02} + {2867025600 -10800 0 -02} + {2877915600 -7200 1 -02} + {2898475200 -10800 0 -02} + {2909365200 -7200 1 -02} + {2929924800 -10800 0 -02} + {2940814800 -7200 1 -02} + {2961374400 -10800 0 -02} + {2972264400 -7200 1 -02} + {2992824000 -10800 0 -02} + {3003714000 -7200 1 -02} + {3024273600 -10800 0 -02} + {3035768400 -7200 1 -02} + {3056328000 -10800 0 -02} + {3067218000 -7200 1 -02} + {3087777600 -10800 0 -02} + {3098667600 -7200 1 -02} + {3119227200 -10800 0 -02} + {3130117200 -7200 1 -02} + {3150676800 -10800 0 -02} + {3161566800 -7200 1 -02} + {3182126400 -10800 0 -02} + {3193016400 -7200 1 -02} + {3213576000 -10800 0 -02} + {3225070800 -7200 1 -02} + {3245630400 -10800 0 -02} + {3256520400 -7200 1 -02} + {3277080000 -10800 0 -02} + {3287970000 -7200 1 -02} + {3308529600 -10800 0 -02} + {3319419600 -7200 1 -02} + {3339979200 -10800 0 -02} + {3350869200 -7200 1 -02} + {3371428800 -10800 0 -02} + {3382923600 -7200 1 -02} + {3403483200 -10800 0 -02} + {3414373200 -7200 1 -02} + {3434932800 -10800 0 -02} + {3445822800 -7200 1 -02} + {3466382400 -10800 0 -02} + {3477272400 -7200 1 -02} + {3497832000 -10800 0 -02} + {3508722000 -7200 1 -02} + {3529281600 -10800 0 -02} + {3540171600 -7200 1 -02} + {3560731200 -10800 0 -02} + {3572226000 -7200 1 -02} + {3592785600 -10800 0 -02} + {3603675600 -7200 1 -02} + {3624235200 -10800 0 -02} + {3635125200 -7200 1 -02} + {3655684800 -10800 0 -02} + {3666574800 -7200 1 -02} + {3687134400 -10800 0 -02} + {3698024400 -7200 1 -02} + {3718584000 -10800 0 -02} + {3730078800 -7200 1 -02} + {3750638400 -10800 0 -02} + {3761528400 -7200 1 -02} + {3782088000 -10800 0 -02} + {3792978000 -7200 1 -02} + {3813537600 -10800 0 -02} + {3824427600 -7200 1 -02} + {3844987200 -10800 0 -02} + {3855877200 -7200 1 -02} + {3876436800 -10800 0 -02} + {3887326800 -7200 1 -02} + {3907886400 -10800 0 -02} + {3919381200 -7200 1 -02} + {3939940800 -10800 0 -02} + {3950830800 -7200 1 -02} + {3971390400 -10800 0 -02} + {3982280400 -7200 1 -02} + {4002840000 -10800 0 -02} + {4013730000 -7200 1 -02} + {4034289600 -10800 0 -02} + {4045179600 -7200 1 -02} + {4065739200 -10800 0 -02} + {4076629200 -7200 1 -02} + {4097188800 -10800 0 -02} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Moncton b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Moncton new file mode 100644 index 00000000..d286c880 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Moncton @@ -0,0 +1,342 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Moncton) { + {-9223372036854775808 -15548 0 LMT} + {-2715882052 -18000 0 EST} + {-2131642800 -14400 0 AST} + {-1632074400 -10800 1 ADT} + {-1615143600 -14400 0 AST} + {-1167595200 -14400 0 AST} + {-1153681200 -10800 1 ADT} + {-1145822400 -14400 0 AST} + {-1122231600 -10800 1 ADT} + {-1114372800 -14400 0 AST} + {-1090782000 -10800 1 ADT} + {-1082923200 -14400 0 AST} + {-1059332400 -10800 1 ADT} + {-1051473600 -14400 0 AST} + {-1027882800 -10800 1 ADT} + {-1020024000 -14400 0 AST} + {-996433200 -10800 1 ADT} + {-988574400 -14400 0 AST} + {-965674800 -10800 1 ADT} + {-955396800 -14400 0 AST} + {-934743600 -10800 1 ADT} + {-923947200 -14400 0 AST} + {-904503600 -10800 1 ADT} + {-891892800 -14400 0 AST} + {-883598400 -14400 0 AST} + {-880221600 -10800 1 AWT} + {-769395600 -10800 1 APT} + {-765399600 -14400 0 AST} + {-757368000 -14400 0 AST} + {-747252000 -10800 1 ADT} + {-733950000 -14400 0 AST} + {-715802400 -10800 1 ADT} + {-702500400 -14400 0 AST} + {-684352800 -10800 1 ADT} + {-671050800 -14400 0 AST} + {-652903200 -10800 1 ADT} + {-639601200 -14400 0 AST} + {-620848800 -10800 1 ADT} + {-608151600 -14400 0 AST} + {-589399200 -10800 1 ADT} + {-576097200 -14400 0 AST} + {-557949600 -10800 1 ADT} + {-544647600 -14400 0 AST} + {-526500000 -10800 1 ADT} + {-513198000 -14400 0 AST} + {-495050400 -10800 1 ADT} + {-481748400 -14400 0 AST} + {-463600800 -10800 1 ADT} + {-450298800 -14400 0 AST} + {-431546400 -10800 1 ADT} + {-418244400 -14400 0 AST} + {-400096800 -10800 1 ADT} + {-384375600 -14400 0 AST} + {-368647200 -10800 1 ADT} + {-352926000 -14400 0 AST} + {-337197600 -10800 1 ADT} + {-321476400 -14400 0 AST} + {-305748000 -10800 1 ADT} + {-289422000 -14400 0 AST} + {-273693600 -10800 1 ADT} + {-257972400 -14400 0 AST} + {-242244000 -10800 1 ADT} + {-226522800 -14400 0 AST} + {-210794400 -10800 1 ADT} + {-195073200 -14400 0 AST} + {-179344800 -10800 1 ADT} + {-163623600 -14400 0 AST} + {-147895200 -10800 1 ADT} + {-131569200 -14400 0 AST} + {-116445600 -10800 1 ADT} + {-100119600 -14400 0 AST} + {-84391200 -10800 1 ADT} + {-68670000 -14400 0 AST} + {-52941600 -10800 1 ADT} + {-37220400 -14400 0 AST} + {-21492000 -10800 1 ADT} + {-5770800 -14400 0 AST} + {9957600 -10800 1 ADT} + {25678800 -14400 0 AST} + {41407200 -10800 1 ADT} + {57733200 -14400 0 AST} + {73461600 -10800 1 ADT} + {89182800 -14400 0 AST} + {94708800 -14400 0 AST} + {136360800 -10800 1 ADT} + {152082000 -14400 0 AST} + {167810400 -10800 1 ADT} + {183531600 -14400 0 AST} + {199260000 -10800 1 ADT} + {215586000 -14400 0 AST} + {230709600 -10800 1 ADT} + {247035600 -14400 0 AST} + {262764000 -10800 1 ADT} + {278485200 -14400 0 AST} + {294213600 -10800 1 ADT} + {309934800 -14400 0 AST} + {325663200 -10800 1 ADT} + {341384400 -14400 0 AST} + {357112800 -10800 1 ADT} + {372834000 -14400 0 AST} + {388562400 -10800 1 ADT} + {404888400 -14400 0 AST} + {420012000 -10800 1 ADT} + {436338000 -14400 0 AST} + {452066400 -10800 1 ADT} + {467787600 -14400 0 AST} + {483516000 -10800 1 ADT} + {499237200 -14400 0 AST} + {514965600 -10800 1 ADT} + {530686800 -14400 0 AST} + {544600800 -10800 1 ADT} + {562136400 -14400 0 AST} + {576050400 -10800 1 ADT} + {594190800 -14400 0 AST} + {607500000 -10800 1 ADT} + {625640400 -14400 0 AST} + {638949600 -10800 1 ADT} + {657090000 -14400 0 AST} + {671004000 -10800 1 ADT} + {688539600 -14400 0 AST} + {702453600 -10800 1 ADT} + {719989200 -14400 0 AST} + {725860800 -14400 0 AST} + {733896060 -10800 1 ADT} + {752036460 -14400 0 AST} + {765345660 -10800 1 ADT} + {783486060 -14400 0 AST} + {796795260 -10800 1 ADT} + {814935660 -14400 0 AST} + {828849660 -10800 1 ADT} + {846385260 -14400 0 AST} + {860299260 -10800 1 ADT} + {877834860 -14400 0 AST} + {891748860 -10800 1 ADT} + {909284460 -14400 0 AST} + {923198460 -10800 1 ADT} + {941338860 -14400 0 AST} + {954648060 -10800 1 ADT} + {972788460 -14400 0 AST} + {986097660 -10800 1 ADT} + {1004238060 -14400 0 AST} + {1018152060 -10800 1 ADT} + {1035687660 -14400 0 AST} + {1049601660 -10800 1 ADT} + {1067137260 -14400 0 AST} + {1081051260 -10800 1 ADT} + {1099191660 -14400 0 AST} + {1112500860 -10800 1 ADT} + {1130641260 -14400 0 AST} + {1143950460 -10800 1 ADT} + {1162090860 -14400 0 AST} + {1167624000 -14400 0 AST} + {1173592800 -10800 1 ADT} + {1194152400 -14400 0 AST} + {1205042400 -10800 1 ADT} + {1225602000 -14400 0 AST} + {1236492000 -10800 1 ADT} + {1257051600 -14400 0 AST} + {1268546400 -10800 1 ADT} + {1289106000 -14400 0 AST} + {1299996000 -10800 1 ADT} + {1320555600 -14400 0 AST} + {1331445600 -10800 1 ADT} + {1352005200 -14400 0 AST} + {1362895200 -10800 1 ADT} + {1383454800 -14400 0 AST} + {1394344800 -10800 1 ADT} + {1414904400 -14400 0 AST} + {1425794400 -10800 1 ADT} + {1446354000 -14400 0 AST} + {1457848800 -10800 1 ADT} + {1478408400 -14400 0 AST} + {1489298400 -10800 1 ADT} + {1509858000 -14400 0 AST} + {1520748000 -10800 1 ADT} + {1541307600 -14400 0 AST} + {1552197600 -10800 1 ADT} + {1572757200 -14400 0 AST} + {1583647200 -10800 1 ADT} + {1604206800 -14400 0 AST} + {1615701600 -10800 1 ADT} + {1636261200 -14400 0 AST} + {1647151200 -10800 1 ADT} + {1667710800 -14400 0 AST} + {1678600800 -10800 1 ADT} + {1699160400 -14400 0 AST} + {1710050400 -10800 1 ADT} + {1730610000 -14400 0 AST} + {1741500000 -10800 1 ADT} + {1762059600 -14400 0 AST} + {1772949600 -10800 1 ADT} + {1793509200 -14400 0 AST} + {1805004000 -10800 1 ADT} + {1825563600 -14400 0 AST} + {1836453600 -10800 1 ADT} + {1857013200 -14400 0 AST} + {1867903200 -10800 1 ADT} + {1888462800 -14400 0 AST} + {1899352800 -10800 1 ADT} + {1919912400 -14400 0 AST} + {1930802400 -10800 1 ADT} + {1951362000 -14400 0 AST} + {1962856800 -10800 1 ADT} + {1983416400 -14400 0 AST} + {1994306400 -10800 1 ADT} + {2014866000 -14400 0 AST} + {2025756000 -10800 1 ADT} + {2046315600 -14400 0 AST} + {2057205600 -10800 1 ADT} + {2077765200 -14400 0 AST} + {2088655200 -10800 1 ADT} + {2109214800 -14400 0 AST} + {2120104800 -10800 1 ADT} + {2140664400 -14400 0 AST} + {2152159200 -10800 1 ADT} + {2172718800 -14400 0 AST} + {2183608800 -10800 1 ADT} + {2204168400 -14400 0 AST} + {2215058400 -10800 1 ADT} + {2235618000 -14400 0 AST} + {2246508000 -10800 1 ADT} + {2267067600 -14400 0 AST} + {2277957600 -10800 1 ADT} + {2298517200 -14400 0 AST} + {2309407200 -10800 1 ADT} + {2329966800 -14400 0 AST} + {2341461600 -10800 1 ADT} + {2362021200 -14400 0 AST} + {2372911200 -10800 1 ADT} + {2393470800 -14400 0 AST} + {2404360800 -10800 1 ADT} + {2424920400 -14400 0 AST} + {2435810400 -10800 1 ADT} + {2456370000 -14400 0 AST} + {2467260000 -10800 1 ADT} + {2487819600 -14400 0 AST} + {2499314400 -10800 1 ADT} + {2519874000 -14400 0 AST} + {2530764000 -10800 1 ADT} + {2551323600 -14400 0 AST} + {2562213600 -10800 1 ADT} + {2582773200 -14400 0 AST} + {2593663200 -10800 1 ADT} + {2614222800 -14400 0 AST} + {2625112800 -10800 1 ADT} + {2645672400 -14400 0 AST} + {2656562400 -10800 1 ADT} + {2677122000 -14400 0 AST} + {2688616800 -10800 1 ADT} + {2709176400 -14400 0 AST} + {2720066400 -10800 1 ADT} + {2740626000 -14400 0 AST} + {2751516000 -10800 1 ADT} + {2772075600 -14400 0 AST} + {2782965600 -10800 1 ADT} + {2803525200 -14400 0 AST} + {2814415200 -10800 1 ADT} + {2834974800 -14400 0 AST} + {2846469600 -10800 1 ADT} + {2867029200 -14400 0 AST} + {2877919200 -10800 1 ADT} + {2898478800 -14400 0 AST} + {2909368800 -10800 1 ADT} + {2929928400 -14400 0 AST} + {2940818400 -10800 1 ADT} + {2961378000 -14400 0 AST} + {2972268000 -10800 1 ADT} + {2992827600 -14400 0 AST} + {3003717600 -10800 1 ADT} + {3024277200 -14400 0 AST} + {3035772000 -10800 1 ADT} + {3056331600 -14400 0 AST} + {3067221600 -10800 1 ADT} + {3087781200 -14400 0 AST} + {3098671200 -10800 1 ADT} + {3119230800 -14400 0 AST} + {3130120800 -10800 1 ADT} + {3150680400 -14400 0 AST} + {3161570400 -10800 1 ADT} + {3182130000 -14400 0 AST} + {3193020000 -10800 1 ADT} + {3213579600 -14400 0 AST} + {3225074400 -10800 1 ADT} + {3245634000 -14400 0 AST} + {3256524000 -10800 1 ADT} + {3277083600 -14400 0 AST} + {3287973600 -10800 1 ADT} + {3308533200 -14400 0 AST} + {3319423200 -10800 1 ADT} + {3339982800 -14400 0 AST} + {3350872800 -10800 1 ADT} + {3371432400 -14400 0 AST} + {3382927200 -10800 1 ADT} + {3403486800 -14400 0 AST} + {3414376800 -10800 1 ADT} + {3434936400 -14400 0 AST} + {3445826400 -10800 1 ADT} + {3466386000 -14400 0 AST} + {3477276000 -10800 1 ADT} + {3497835600 -14400 0 AST} + {3508725600 -10800 1 ADT} + {3529285200 -14400 0 AST} + {3540175200 -10800 1 ADT} + {3560734800 -14400 0 AST} + {3572229600 -10800 1 ADT} + {3592789200 -14400 0 AST} + {3603679200 -10800 1 ADT} + {3624238800 -14400 0 AST} + {3635128800 -10800 1 ADT} + {3655688400 -14400 0 AST} + {3666578400 -10800 1 ADT} + {3687138000 -14400 0 AST} + {3698028000 -10800 1 ADT} + {3718587600 -14400 0 AST} + {3730082400 -10800 1 ADT} + {3750642000 -14400 0 AST} + {3761532000 -10800 1 ADT} + {3782091600 -14400 0 AST} + {3792981600 -10800 1 ADT} + {3813541200 -14400 0 AST} + {3824431200 -10800 1 ADT} + {3844990800 -14400 0 AST} + {3855880800 -10800 1 ADT} + {3876440400 -14400 0 AST} + {3887330400 -10800 1 ADT} + {3907890000 -14400 0 AST} + {3919384800 -10800 1 ADT} + {3939944400 -14400 0 AST} + {3950834400 -10800 1 ADT} + {3971394000 -14400 0 AST} + {3982284000 -10800 1 ADT} + {4002843600 -14400 0 AST} + {4013733600 -10800 1 ADT} + {4034293200 -14400 0 AST} + {4045183200 -10800 1 ADT} + {4065742800 -14400 0 AST} + {4076632800 -10800 1 ADT} + {4097192400 -14400 0 AST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Monterrey b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Monterrey new file mode 100644 index 00000000..7471c6ab --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Monterrey @@ -0,0 +1,64 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Monterrey) { + {-9223372036854775808 -24076 0 LMT} + {-1514743200 -21600 0 CST} + {568015200 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {599637600 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {989136000 -18000 1 CDT} + {1001833200 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1175414400 -18000 1 CDT} + {1193554800 -21600 0 CST} + {1207468800 -18000 1 CDT} + {1225004400 -21600 0 CST} + {1238918400 -18000 1 CDT} + {1256454000 -21600 0 CST} + {1270368000 -18000 1 CDT} + {1288508400 -21600 0 CST} + {1301817600 -18000 1 CDT} + {1319958000 -21600 0 CST} + {1333267200 -18000 1 CDT} + {1351407600 -21600 0 CST} + {1365321600 -18000 1 CDT} + {1382857200 -21600 0 CST} + {1396771200 -18000 1 CDT} + {1414306800 -21600 0 CST} + {1428220800 -18000 1 CDT} + {1445756400 -21600 0 CST} + {1459670400 -18000 1 CDT} + {1477810800 -21600 0 CST} + {1491120000 -18000 1 CDT} + {1509260400 -21600 0 CST} + {1522569600 -18000 1 CDT} + {1540710000 -21600 0 CST} + {1554624000 -18000 1 CDT} + {1572159600 -21600 0 CST} + {1586073600 -18000 1 CDT} + {1603609200 -21600 0 CST} + {1617523200 -18000 1 CDT} + {1635663600 -21600 0 CST} + {1648972800 -18000 1 CDT} + {1667113200 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Montevideo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Montevideo new file mode 100644 index 00000000..27fb76e7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Montevideo @@ -0,0 +1,96 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Montevideo) { + {-9223372036854775808 -13491 0 LMT} + {-1942690509 -13491 0 MMT} + {-1567455309 -14400 0 -04} + {-1459627200 -10800 0 -0330} + {-1443819600 -12600 0 -0330} + {-1428006600 -10800 1 -0330} + {-1412283600 -12600 0 -0330} + {-1396470600 -10800 1 -0330} + {-1380747600 -12600 0 -0330} + {-1141590600 -10800 1 -0330} + {-1128286800 -12600 0 -0330} + {-1110141000 -10800 1 -0330} + {-1096837200 -12600 0 -0330} + {-1078691400 -10800 1 -0330} + {-1065387600 -12600 0 -0330} + {-1047241800 -10800 1 -0330} + {-1033938000 -12600 0 -0330} + {-1015187400 -10800 1 -0330} + {-1002488400 -12600 0 -0330} + {-983737800 -10800 1 -0330} + {-971038800 -12600 0 -0330} + {-954707400 -10800 1 -0330} + {-938984400 -12600 0 -0330} + {-920838600 -10800 1 -0330} + {-907534800 -12600 0 -0330} + {-896819400 -10800 1 -0330} + {-853621200 -9000 0 -03} + {-845847000 -10800 0 -03} + {-334789200 -9000 1 -03} + {-319671000 -10800 0 -03} + {-315608400 -10800 0 -03} + {-314226000 -7200 1 -03} + {-309996000 -10800 0 -03} + {-149720400 -7200 1 -03} + {-134604000 -10800 0 -03} + {-63147600 -10800 0 -03} + {-50446800 -9000 1 -03} + {-34205400 -10800 0 -03} + {10800 -10800 0 -03} + {9860400 -7200 1 -03} + {14176800 -10800 0 -03} + {72846000 -7200 1 -03} + {80100000 -10800 0 -03} + {126241200 -10800 0 -03} + {127278000 -5400 1 -03} + {132112800 -9000 0 -03} + {147234600 -10800 0 -03} + {156909600 -10800 0 -03} + {156913200 -7200 1 -03} + {165376800 -10800 0 -03} + {219812400 -7200 1 -03} + {226461600 -10800 0 -03} + {250052400 -7200 1 -03} + {257911200 -10800 0 -03} + {282711600 -7200 1 -03} + {289360800 -10800 0 -03} + {294202800 -7200 1 -03} + {322020000 -10800 0 -03} + {566449200 -7200 1 -03} + {573012000 -10800 0 -03} + {597812400 -7200 1 -03} + {605066400 -10800 0 -03} + {625633200 -7200 1 -03} + {635911200 -10800 0 -03} + {656478000 -7200 1 -03} + {667965600 -10800 0 -03} + {688532400 -7200 1 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {730864800 -10800 0 -03} + {1095562800 -7200 1 -03} + {1111896000 -10800 0 -03} + {1128834000 -7200 1 -03} + {1142136000 -10800 0 -03} + {1159678800 -7200 1 -03} + {1173585600 -10800 0 -03} + {1191733200 -7200 1 -03} + {1205035200 -10800 0 -03} + {1223182800 -7200 1 -03} + {1236484800 -10800 0 -03} + {1254632400 -7200 1 -03} + {1268539200 -10800 0 -03} + {1286082000 -7200 1 -03} + {1299988800 -10800 0 -03} + {1317531600 -7200 1 -03} + {1331438400 -10800 0 -03} + {1349586000 -7200 1 -03} + {1362888000 -10800 0 -03} + {1381035600 -7200 1 -03} + {1394337600 -10800 0 -03} + {1412485200 -7200 1 -03} + {1425787200 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Montreal b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Montreal new file mode 100644 index 00000000..0ead8eec --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Montreal @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Toronto)]} { + LoadTimeZoneFile America/Toronto +} +set TZData(:America/Montreal) $TZData(:America/Toronto) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Montserrat b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Montserrat new file mode 100644 index 00000000..9b76b440 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Montserrat @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/Montserrat) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nassau b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nassau new file mode 100644 index 00000000..ba49bd1f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nassau @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Toronto)]} { + LoadTimeZoneFile America/Toronto +} +set TZData(:America/Nassau) $TZData(:America/Toronto) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/New_York b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/New_York new file mode 100644 index 00000000..72f2c961 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/New_York @@ -0,0 +1,369 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/New_York) { + {-9223372036854775808 -17762 0 LMT} + {-2717650800 -18000 0 EST} + {-1633280400 -14400 1 EDT} + {-1615140000 -18000 0 EST} + {-1601830800 -14400 1 EDT} + {-1583690400 -18000 0 EST} + {-1577905200 -18000 0 EST} + {-1570381200 -14400 1 EDT} + {-1551636000 -18000 0 EST} + {-1536512400 -14400 1 EDT} + {-1523210400 -18000 0 EST} + {-1504458000 -14400 1 EDT} + {-1491760800 -18000 0 EST} + {-1473008400 -14400 1 EDT} + {-1459706400 -18000 0 EST} + {-1441558800 -14400 1 EDT} + {-1428256800 -18000 0 EST} + {-1410109200 -14400 1 EDT} + {-1396807200 -18000 0 EST} + {-1378659600 -14400 1 EDT} + {-1365357600 -18000 0 EST} + {-1347210000 -14400 1 EDT} + {-1333908000 -18000 0 EST} + {-1315155600 -14400 1 EDT} + {-1301853600 -18000 0 EST} + {-1283706000 -14400 1 EDT} + {-1270404000 -18000 0 EST} + {-1252256400 -14400 1 EDT} + {-1238954400 -18000 0 EST} + {-1220806800 -14400 1 EDT} + {-1207504800 -18000 0 EST} + {-1189357200 -14400 1 EDT} + {-1176055200 -18000 0 EST} + {-1157302800 -14400 1 EDT} + {-1144605600 -18000 0 EST} + {-1125853200 -14400 1 EDT} + {-1112551200 -18000 0 EST} + {-1094403600 -14400 1 EDT} + {-1081101600 -18000 0 EST} + {-1062954000 -14400 1 EDT} + {-1049652000 -18000 0 EST} + {-1031504400 -14400 1 EDT} + {-1018202400 -18000 0 EST} + {-1000054800 -14400 1 EDT} + {-986752800 -18000 0 EST} + {-968000400 -14400 1 EDT} + {-955303200 -18000 0 EST} + {-936550800 -14400 1 EDT} + {-923248800 -18000 0 EST} + {-905101200 -14400 1 EDT} + {-891799200 -18000 0 EST} + {-883594800 -18000 0 EST} + {-880218000 -14400 1 EWT} + {-769395600 -14400 1 EPT} + {-765396000 -18000 0 EST} + {-757364400 -18000 0 EST} + {-747248400 -14400 1 EDT} + {-733946400 -18000 0 EST} + {-715798800 -14400 1 EDT} + {-702496800 -18000 0 EST} + {-684349200 -14400 1 EDT} + {-671047200 -18000 0 EST} + {-652899600 -14400 1 EDT} + {-639597600 -18000 0 EST} + {-620845200 -14400 1 EDT} + {-608148000 -18000 0 EST} + {-589395600 -14400 1 EDT} + {-576093600 -18000 0 EST} + {-557946000 -14400 1 EDT} + {-544644000 -18000 0 EST} + {-526496400 -14400 1 EDT} + {-513194400 -18000 0 EST} + {-495046800 -14400 1 EDT} + {-481744800 -18000 0 EST} + {-463597200 -14400 1 EDT} + {-447271200 -18000 0 EST} + {-431542800 -14400 1 EDT} + {-415821600 -18000 0 EST} + {-400093200 -14400 1 EDT} + {-384372000 -18000 0 EST} + {-368643600 -14400 1 EDT} + {-352922400 -18000 0 EST} + {-337194000 -14400 1 EDT} + {-321472800 -18000 0 EST} + {-305744400 -14400 1 EDT} + {-289418400 -18000 0 EST} + {-273690000 -14400 1 EDT} + {-257968800 -18000 0 EST} + {-242240400 -14400 1 EDT} + {-226519200 -18000 0 EST} + {-210790800 -14400 1 EDT} + {-195069600 -18000 0 EST} + {-179341200 -14400 1 EDT} + {-163620000 -18000 0 EST} + {-147891600 -14400 1 EDT} + {-131565600 -18000 0 EST} + {-116442000 -14400 1 EDT} + {-100116000 -18000 0 EST} + {-94676400 -18000 0 EST} + {-84387600 -14400 1 EDT} + {-68666400 -18000 0 EST} + {-52938000 -14400 1 EDT} + {-37216800 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {126687600 -14400 1 EDT} + {152085600 -18000 0 EST} + {162370800 -14400 1 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nipigon b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nipigon new file mode 100644 index 00000000..785a3a39 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nipigon @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Toronto)]} { + LoadTimeZoneFile America/Toronto +} +set TZData(:America/Nipigon) $TZData(:America/Toronto) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nome b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nome new file mode 100644 index 00000000..d7a91861 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nome @@ -0,0 +1,276 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Nome) { + {-9223372036854775808 46702 0 LMT} + {-3225223727 -39698 0 LMT} + {-2188947502 -39600 0 NST} + {-883573200 -39600 0 NST} + {-880196400 -36000 1 NWT} + {-769395600 -36000 1 NPT} + {-765374400 -39600 0 NST} + {-757342800 -39600 0 NST} + {-86878800 -39600 0 BST} + {-31496400 -39600 0 BST} + {-21466800 -36000 1 BDT} + {-5745600 -39600 0 BST} + {9982800 -36000 1 BDT} + {25704000 -39600 0 BST} + {41432400 -36000 1 BDT} + {57758400 -39600 0 BST} + {73486800 -36000 1 BDT} + {89208000 -39600 0 BST} + {104936400 -36000 1 BDT} + {120657600 -39600 0 BST} + {126709200 -36000 1 BDT} + {152107200 -39600 0 BST} + {162392400 -36000 1 BDT} + {183556800 -39600 0 BST} + {199285200 -36000 1 BDT} + {215611200 -39600 0 BST} + {230734800 -36000 1 BDT} + {247060800 -39600 0 BST} + {262789200 -36000 1 BDT} + {278510400 -39600 0 BST} + {294238800 -36000 1 BDT} + {309960000 -39600 0 BST} + {325688400 -36000 1 BDT} + {341409600 -39600 0 BST} + {357138000 -36000 1 BDT} + {372859200 -39600 0 BST} + {388587600 -36000 1 BDT} + {404913600 -39600 0 BST} + {420037200 -36000 1 BDT} + {439030800 -32400 0 AKST} + {452084400 -28800 1 AKDT} + {467805600 -32400 0 AKST} + {483534000 -28800 1 AKDT} + {499255200 -32400 0 AKST} + {514983600 -28800 1 AKDT} + {530704800 -32400 0 AKST} + {544618800 -28800 1 AKDT} + {562154400 -32400 0 AKST} + {576068400 -28800 1 AKDT} + {594208800 -32400 0 AKST} + {607518000 -28800 1 AKDT} + {625658400 -32400 0 AKST} + {638967600 -28800 1 AKDT} + {657108000 -32400 0 AKST} + {671022000 -28800 1 AKDT} + {688557600 -32400 0 AKST} + {702471600 -28800 1 AKDT} + {720007200 -32400 0 AKST} + {733921200 -28800 1 AKDT} + {752061600 -32400 0 AKST} + {765370800 -28800 1 AKDT} + {783511200 -32400 0 AKST} + {796820400 -28800 1 AKDT} + {814960800 -32400 0 AKST} + {828874800 -28800 1 AKDT} + {846410400 -32400 0 AKST} + {860324400 -28800 1 AKDT} + {877860000 -32400 0 AKST} + {891774000 -28800 1 AKDT} + {909309600 -32400 0 AKST} + {923223600 -28800 1 AKDT} + {941364000 -32400 0 AKST} + {954673200 -28800 1 AKDT} + {972813600 -32400 0 AKST} + {986122800 -28800 1 AKDT} + {1004263200 -32400 0 AKST} + {1018177200 -28800 1 AKDT} + {1035712800 -32400 0 AKST} + {1049626800 -28800 1 AKDT} + {1067162400 -32400 0 AKST} + {1081076400 -28800 1 AKDT} + {1099216800 -32400 0 AKST} + {1112526000 -28800 1 AKDT} + {1130666400 -32400 0 AKST} + {1143975600 -28800 1 AKDT} + {1162116000 -32400 0 AKST} + {1173610800 -28800 1 AKDT} + {1194170400 -32400 0 AKST} + {1205060400 -28800 1 AKDT} + {1225620000 -32400 0 AKST} + {1236510000 -28800 1 AKDT} + {1257069600 -32400 0 AKST} + {1268564400 -28800 1 AKDT} + {1289124000 -32400 0 AKST} + {1300014000 -28800 1 AKDT} + {1320573600 -32400 0 AKST} + {1331463600 -28800 1 AKDT} + {1352023200 -32400 0 AKST} + {1362913200 -28800 1 AKDT} + {1383472800 -32400 0 AKST} + {1394362800 -28800 1 AKDT} + {1414922400 -32400 0 AKST} + {1425812400 -28800 1 AKDT} + {1446372000 -32400 0 AKST} + {1457866800 -28800 1 AKDT} + {1478426400 -32400 0 AKST} + {1489316400 -28800 1 AKDT} + {1509876000 -32400 0 AKST} + {1520766000 -28800 1 AKDT} + {1541325600 -32400 0 AKST} + {1552215600 -28800 1 AKDT} + {1572775200 -32400 0 AKST} + {1583665200 -28800 1 AKDT} + {1604224800 -32400 0 AKST} + {1615719600 -28800 1 AKDT} + {1636279200 -32400 0 AKST} + {1647169200 -28800 1 AKDT} + {1667728800 -32400 0 AKST} + {1678618800 -28800 1 AKDT} + {1699178400 -32400 0 AKST} + {1710068400 -28800 1 AKDT} + {1730628000 -32400 0 AKST} + {1741518000 -28800 1 AKDT} + {1762077600 -32400 0 AKST} + {1772967600 -28800 1 AKDT} + {1793527200 -32400 0 AKST} + {1805022000 -28800 1 AKDT} + {1825581600 -32400 0 AKST} + {1836471600 -28800 1 AKDT} + {1857031200 -32400 0 AKST} + {1867921200 -28800 1 AKDT} + {1888480800 -32400 0 AKST} + {1899370800 -28800 1 AKDT} + {1919930400 -32400 0 AKST} + {1930820400 -28800 1 AKDT} + {1951380000 -32400 0 AKST} + {1962874800 -28800 1 AKDT} + {1983434400 -32400 0 AKST} + {1994324400 -28800 1 AKDT} + {2014884000 -32400 0 AKST} + {2025774000 -28800 1 AKDT} + {2046333600 -32400 0 AKST} + {2057223600 -28800 1 AKDT} + {2077783200 -32400 0 AKST} + {2088673200 -28800 1 AKDT} + {2109232800 -32400 0 AKST} + {2120122800 -28800 1 AKDT} + {2140682400 -32400 0 AKST} + {2152177200 -28800 1 AKDT} + {2172736800 -32400 0 AKST} + {2183626800 -28800 1 AKDT} + {2204186400 -32400 0 AKST} + {2215076400 -28800 1 AKDT} + {2235636000 -32400 0 AKST} + {2246526000 -28800 1 AKDT} + {2267085600 -32400 0 AKST} + {2277975600 -28800 1 AKDT} + {2298535200 -32400 0 AKST} + {2309425200 -28800 1 AKDT} + {2329984800 -32400 0 AKST} + {2341479600 -28800 1 AKDT} + {2362039200 -32400 0 AKST} + {2372929200 -28800 1 AKDT} + {2393488800 -32400 0 AKST} + {2404378800 -28800 1 AKDT} + {2424938400 -32400 0 AKST} + {2435828400 -28800 1 AKDT} + {2456388000 -32400 0 AKST} + {2467278000 -28800 1 AKDT} + {2487837600 -32400 0 AKST} + {2499332400 -28800 1 AKDT} + {2519892000 -32400 0 AKST} + {2530782000 -28800 1 AKDT} + {2551341600 -32400 0 AKST} + {2562231600 -28800 1 AKDT} + {2582791200 -32400 0 AKST} + {2593681200 -28800 1 AKDT} + {2614240800 -32400 0 AKST} + {2625130800 -28800 1 AKDT} + {2645690400 -32400 0 AKST} + {2656580400 -28800 1 AKDT} + {2677140000 -32400 0 AKST} + {2688634800 -28800 1 AKDT} + {2709194400 -32400 0 AKST} + {2720084400 -28800 1 AKDT} + {2740644000 -32400 0 AKST} + {2751534000 -28800 1 AKDT} + {2772093600 -32400 0 AKST} + {2782983600 -28800 1 AKDT} + {2803543200 -32400 0 AKST} + {2814433200 -28800 1 AKDT} + {2834992800 -32400 0 AKST} + {2846487600 -28800 1 AKDT} + {2867047200 -32400 0 AKST} + {2877937200 -28800 1 AKDT} + {2898496800 -32400 0 AKST} + {2909386800 -28800 1 AKDT} + {2929946400 -32400 0 AKST} + {2940836400 -28800 1 AKDT} + {2961396000 -32400 0 AKST} + {2972286000 -28800 1 AKDT} + {2992845600 -32400 0 AKST} + {3003735600 -28800 1 AKDT} + {3024295200 -32400 0 AKST} + {3035790000 -28800 1 AKDT} + {3056349600 -32400 0 AKST} + {3067239600 -28800 1 AKDT} + {3087799200 -32400 0 AKST} + {3098689200 -28800 1 AKDT} + {3119248800 -32400 0 AKST} + {3130138800 -28800 1 AKDT} + {3150698400 -32400 0 AKST} + {3161588400 -28800 1 AKDT} + {3182148000 -32400 0 AKST} + {3193038000 -28800 1 AKDT} + {3213597600 -32400 0 AKST} + {3225092400 -28800 1 AKDT} + {3245652000 -32400 0 AKST} + {3256542000 -28800 1 AKDT} + {3277101600 -32400 0 AKST} + {3287991600 -28800 1 AKDT} + {3308551200 -32400 0 AKST} + {3319441200 -28800 1 AKDT} + {3340000800 -32400 0 AKST} + {3350890800 -28800 1 AKDT} + {3371450400 -32400 0 AKST} + {3382945200 -28800 1 AKDT} + {3403504800 -32400 0 AKST} + {3414394800 -28800 1 AKDT} + {3434954400 -32400 0 AKST} + {3445844400 -28800 1 AKDT} + {3466404000 -32400 0 AKST} + {3477294000 -28800 1 AKDT} + {3497853600 -32400 0 AKST} + {3508743600 -28800 1 AKDT} + {3529303200 -32400 0 AKST} + {3540193200 -28800 1 AKDT} + {3560752800 -32400 0 AKST} + {3572247600 -28800 1 AKDT} + {3592807200 -32400 0 AKST} + {3603697200 -28800 1 AKDT} + {3624256800 -32400 0 AKST} + {3635146800 -28800 1 AKDT} + {3655706400 -32400 0 AKST} + {3666596400 -28800 1 AKDT} + {3687156000 -32400 0 AKST} + {3698046000 -28800 1 AKDT} + {3718605600 -32400 0 AKST} + {3730100400 -28800 1 AKDT} + {3750660000 -32400 0 AKST} + {3761550000 -28800 1 AKDT} + {3782109600 -32400 0 AKST} + {3792999600 -28800 1 AKDT} + {3813559200 -32400 0 AKST} + {3824449200 -28800 1 AKDT} + {3845008800 -32400 0 AKST} + {3855898800 -28800 1 AKDT} + {3876458400 -32400 0 AKST} + {3887348400 -28800 1 AKDT} + {3907908000 -32400 0 AKST} + {3919402800 -28800 1 AKDT} + {3939962400 -32400 0 AKST} + {3950852400 -28800 1 AKDT} + {3971412000 -32400 0 AKST} + {3982302000 -28800 1 AKDT} + {4002861600 -32400 0 AKST} + {4013751600 -28800 1 AKDT} + {4034311200 -32400 0 AKST} + {4045201200 -28800 1 AKDT} + {4065760800 -32400 0 AKST} + {4076650800 -28800 1 AKDT} + {4097210400 -32400 0 AKST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/North_Dakota/Beulah b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/North_Dakota/Beulah new file mode 100644 index 00000000..95407c61 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/North_Dakota/Beulah @@ -0,0 +1,279 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/North_Dakota/Beulah) { + {-9223372036854775808 -24427 0 LMT} + {-2717643600 -25200 0 MST} + {-1633273200 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1601823600 -21600 1 MDT} + {-1583683200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-52930800 -21600 1 MDT} + {-37209600 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {9968400 -21600 1 MDT} + {25689600 -25200 0 MST} + {41418000 -21600 1 MDT} + {57744000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {126694800 -21600 1 MDT} + {152092800 -25200 0 MST} + {162378000 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289120400 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/North_Dakota/Center b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/North_Dakota/Center new file mode 100644 index 00000000..30782f7a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/North_Dakota/Center @@ -0,0 +1,279 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/North_Dakota/Center) { + {-9223372036854775808 -24312 0 LMT} + {-2717643600 -25200 0 MST} + {-1633273200 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1601823600 -21600 1 MDT} + {-1583683200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-52930800 -21600 1 MDT} + {-37209600 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {9968400 -21600 1 MDT} + {25689600 -25200 0 MST} + {41418000 -21600 1 MDT} + {57744000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {126694800 -21600 1 MDT} + {152092800 -25200 0 MST} + {162378000 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720003600 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {986112000 -18000 1 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/North_Dakota/New_Salem b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/North_Dakota/New_Salem new file mode 100644 index 00000000..5a9d2298 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/North_Dakota/New_Salem @@ -0,0 +1,279 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/North_Dakota/New_Salem) { + {-9223372036854775808 -24339 0 LMT} + {-2717643600 -25200 0 MST} + {-1633273200 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1601823600 -21600 1 MDT} + {-1583683200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-52930800 -21600 1 MDT} + {-37209600 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {9968400 -21600 1 MDT} + {25689600 -25200 0 MST} + {41418000 -21600 1 MDT} + {57744000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {126694800 -21600 1 MDT} + {152092800 -25200 0 MST} + {162378000 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067158800 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nuuk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nuuk new file mode 100644 index 00000000..8d85a815 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Nuuk @@ -0,0 +1,246 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Nuuk) { + {-9223372036854775808 -12416 0 LMT} + {-1686083584 -10800 0 -03} + {323845200 -7200 0 -02} + {338950800 -10800 0 -03} + {354675600 -7200 1 -02} + {370400400 -10800 0 -03} + {386125200 -7200 1 -02} + {401850000 -10800 0 -03} + {417574800 -7200 1 -02} + {433299600 -10800 0 -03} + {449024400 -7200 1 -02} + {465354000 -10800 0 -03} + {481078800 -7200 1 -02} + {496803600 -10800 0 -03} + {512528400 -7200 1 -02} + {528253200 -10800 0 -03} + {543978000 -7200 1 -02} + {559702800 -10800 0 -03} + {575427600 -7200 1 -02} + {591152400 -10800 0 -03} + {606877200 -7200 1 -02} + {622602000 -10800 0 -03} + {638326800 -7200 1 -02} + {654656400 -10800 0 -03} + {670381200 -7200 1 -02} + {686106000 -10800 0 -03} + {701830800 -7200 1 -02} + {717555600 -10800 0 -03} + {733280400 -7200 1 -02} + {749005200 -10800 0 -03} + {764730000 -7200 1 -02} + {780454800 -10800 0 -03} + {796179600 -7200 1 -02} + {811904400 -10800 0 -03} + {828234000 -7200 1 -02} + {846378000 -10800 0 -03} + {859683600 -7200 1 -02} + {877827600 -10800 0 -03} + {891133200 -7200 1 -02} + {909277200 -10800 0 -03} + {922582800 -7200 1 -02} + {941331600 -10800 0 -03} + {954032400 -7200 1 -02} + {972781200 -10800 0 -03} + {985482000 -7200 1 -02} + {1004230800 -10800 0 -03} + {1017536400 -7200 1 -02} + {1035680400 -10800 0 -03} + {1048986000 -7200 1 -02} + {1067130000 -10800 0 -03} + {1080435600 -7200 1 -02} + {1099184400 -10800 0 -03} + {1111885200 -7200 1 -02} + {1130634000 -10800 0 -03} + {1143334800 -7200 1 -02} + {1162083600 -10800 0 -03} + {1174784400 -7200 1 -02} + {1193533200 -10800 0 -03} + {1206838800 -7200 1 -02} + {1224982800 -10800 0 -03} + {1238288400 -7200 1 -02} + {1256432400 -10800 0 -03} + {1269738000 -7200 1 -02} + {1288486800 -10800 0 -03} + {1301187600 -7200 1 -02} + {1319936400 -10800 0 -03} + {1332637200 -7200 1 -02} + {1351386000 -10800 0 -03} + {1364691600 -7200 1 -02} + {1382835600 -10800 0 -03} + {1396141200 -7200 1 -02} + {1414285200 -10800 0 -03} + {1427590800 -7200 1 -02} + {1445734800 -10800 0 -03} + {1459040400 -7200 1 -02} + {1477789200 -10800 0 -03} + {1490490000 -7200 1 -02} + {1509238800 -10800 0 -03} + {1521939600 -7200 1 -02} + {1540688400 -10800 0 -03} + {1553994000 -7200 1 -02} + {1572138000 -10800 0 -03} + {1585443600 -7200 1 -02} + {1603587600 -10800 0 -03} + {1616893200 -7200 1 -02} + {1635642000 -10800 0 -03} + {1648342800 -7200 1 -02} + {1667091600 -10800 0 -03} + {1679792400 -7200 1 -02} + {1698541200 -10800 0 -03} + {1711846800 -7200 1 -02} + {1729990800 -10800 0 -03} + {1743296400 -7200 1 -02} + {1761440400 -10800 0 -03} + {1774746000 -7200 1 -02} + {1792890000 -10800 0 -03} + {1806195600 -7200 1 -02} + {1824944400 -10800 0 -03} + {1837645200 -7200 1 -02} + {1856394000 -10800 0 -03} + {1869094800 -7200 1 -02} + {1887843600 -10800 0 -03} + {1901149200 -7200 1 -02} + {1919293200 -10800 0 -03} + {1932598800 -7200 1 -02} + {1950742800 -10800 0 -03} + {1964048400 -7200 1 -02} + {1982797200 -10800 0 -03} + {1995498000 -7200 1 -02} + {2014246800 -10800 0 -03} + {2026947600 -7200 1 -02} + {2045696400 -10800 0 -03} + {2058397200 -7200 1 -02} + {2077146000 -10800 0 -03} + {2090451600 -7200 1 -02} + {2108595600 -10800 0 -03} + {2121901200 -7200 1 -02} + {2140045200 -10800 0 -03} + {2153350800 -7200 1 -02} + {2172099600 -10800 0 -03} + {2184800400 -7200 1 -02} + {2203549200 -10800 0 -03} + {2216250000 -7200 1 -02} + {2234998800 -10800 0 -03} + {2248304400 -7200 1 -02} + {2266448400 -10800 0 -03} + {2279754000 -7200 1 -02} + {2297898000 -10800 0 -03} + {2311203600 -7200 1 -02} + {2329347600 -10800 0 -03} + {2342653200 -7200 1 -02} + {2361402000 -10800 0 -03} + {2374102800 -7200 1 -02} + {2392851600 -10800 0 -03} + {2405552400 -7200 1 -02} + {2424301200 -10800 0 -03} + {2437606800 -7200 1 -02} + {2455750800 -10800 0 -03} + {2469056400 -7200 1 -02} + {2487200400 -10800 0 -03} + {2500506000 -7200 1 -02} + {2519254800 -10800 0 -03} + {2531955600 -7200 1 -02} + {2550704400 -10800 0 -03} + {2563405200 -7200 1 -02} + {2582154000 -10800 0 -03} + {2595459600 -7200 1 -02} + {2613603600 -10800 0 -03} + {2626909200 -7200 1 -02} + {2645053200 -10800 0 -03} + {2658358800 -7200 1 -02} + {2676502800 -10800 0 -03} + {2689808400 -7200 1 -02} + {2708557200 -10800 0 -03} + {2721258000 -7200 1 -02} + {2740006800 -10800 0 -03} + {2752707600 -7200 1 -02} + {2771456400 -10800 0 -03} + {2784762000 -7200 1 -02} + {2802906000 -10800 0 -03} + {2816211600 -7200 1 -02} + {2834355600 -10800 0 -03} + {2847661200 -7200 1 -02} + {2866410000 -10800 0 -03} + {2879110800 -7200 1 -02} + {2897859600 -10800 0 -03} + {2910560400 -7200 1 -02} + {2929309200 -10800 0 -03} + {2942010000 -7200 1 -02} + {2960758800 -10800 0 -03} + {2974064400 -7200 1 -02} + {2992208400 -10800 0 -03} + {3005514000 -7200 1 -02} + {3023658000 -10800 0 -03} + {3036963600 -7200 1 -02} + {3055712400 -10800 0 -03} + {3068413200 -7200 1 -02} + {3087162000 -10800 0 -03} + {3099862800 -7200 1 -02} + {3118611600 -10800 0 -03} + {3131917200 -7200 1 -02} + {3150061200 -10800 0 -03} + {3163366800 -7200 1 -02} + {3181510800 -10800 0 -03} + {3194816400 -7200 1 -02} + {3212960400 -10800 0 -03} + {3226266000 -7200 1 -02} + {3245014800 -10800 0 -03} + {3257715600 -7200 1 -02} + {3276464400 -10800 0 -03} + {3289165200 -7200 1 -02} + {3307914000 -10800 0 -03} + {3321219600 -7200 1 -02} + {3339363600 -10800 0 -03} + {3352669200 -7200 1 -02} + {3370813200 -10800 0 -03} + {3384118800 -7200 1 -02} + {3402867600 -10800 0 -03} + {3415568400 -7200 1 -02} + {3434317200 -10800 0 -03} + {3447018000 -7200 1 -02} + {3465766800 -10800 0 -03} + {3479072400 -7200 1 -02} + {3497216400 -10800 0 -03} + {3510522000 -7200 1 -02} + {3528666000 -10800 0 -03} + {3541971600 -7200 1 -02} + {3560115600 -10800 0 -03} + {3573421200 -7200 1 -02} + {3592170000 -10800 0 -03} + {3604870800 -7200 1 -02} + {3623619600 -10800 0 -03} + {3636320400 -7200 1 -02} + {3655069200 -10800 0 -03} + {3668374800 -7200 1 -02} + {3686518800 -10800 0 -03} + {3699824400 -7200 1 -02} + {3717968400 -10800 0 -03} + {3731274000 -7200 1 -02} + {3750022800 -10800 0 -03} + {3762723600 -7200 1 -02} + {3781472400 -10800 0 -03} + {3794173200 -7200 1 -02} + {3812922000 -10800 0 -03} + {3825622800 -7200 1 -02} + {3844371600 -10800 0 -03} + {3857677200 -7200 1 -02} + {3875821200 -10800 0 -03} + {3889126800 -7200 1 -02} + {3907270800 -10800 0 -03} + {3920576400 -7200 1 -02} + {3939325200 -10800 0 -03} + {3952026000 -7200 1 -02} + {3970774800 -10800 0 -03} + {3983475600 -7200 1 -02} + {4002224400 -10800 0 -03} + {4015530000 -7200 1 -02} + {4033674000 -10800 0 -03} + {4046979600 -7200 1 -02} + {4065123600 -10800 0 -03} + {4078429200 -7200 1 -02} + {4096573200 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Pangnirtung b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Pangnirtung new file mode 100644 index 00000000..14d85162 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Pangnirtung @@ -0,0 +1,252 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Pangnirtung) { + {-9223372036854775808 0 0 -00} + {-1546300800 -14400 0 AST} + {-880221600 -10800 1 AWT} + {-769395600 -10800 1 APT} + {-765399600 -14400 0 AST} + {-147902400 -7200 1 ADDT} + {-131572800 -14400 0 AST} + {325663200 -10800 1 ADT} + {341384400 -14400 0 AST} + {357112800 -10800 1 ADT} + {372834000 -14400 0 AST} + {388562400 -10800 1 ADT} + {404888400 -14400 0 AST} + {420012000 -10800 1 ADT} + {436338000 -14400 0 AST} + {452066400 -10800 1 ADT} + {467787600 -14400 0 AST} + {483516000 -10800 1 ADT} + {499237200 -14400 0 AST} + {514965600 -10800 1 ADT} + {530686800 -14400 0 AST} + {544600800 -10800 1 ADT} + {562136400 -14400 0 AST} + {576050400 -10800 1 ADT} + {594190800 -14400 0 AST} + {607500000 -10800 1 ADT} + {625640400 -14400 0 AST} + {638949600 -10800 1 ADT} + {657090000 -14400 0 AST} + {671004000 -10800 1 ADT} + {688539600 -14400 0 AST} + {702453600 -10800 1 ADT} + {719989200 -14400 0 AST} + {733903200 -10800 1 ADT} + {752043600 -14400 0 AST} + {765352800 -10800 1 ADT} + {783493200 -14400 0 AST} + {796802400 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Paramaribo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Paramaribo new file mode 100644 index 00000000..7a80f1d0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Paramaribo @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Paramaribo) { + {-9223372036854775808 -13240 0 LMT} + {-1861906760 -13252 0 PMT} + {-1104524348 -13236 0 PMT} + {-765317964 -12600 0 -0330} + {465449400 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Phoenix b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Phoenix new file mode 100644 index 00000000..3d37bb4e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Phoenix @@ -0,0 +1,17 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Phoenix) { + {-9223372036854775808 -26898 0 LMT} + {-2717643600 -25200 0 MST} + {-1633273200 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1601823600 -21600 1 MDT} + {-1583683200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-820519140 -25200 0 MST} + {-796841940 -25200 0 MST} + {-94669200 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-56221200 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Port-au-Prince b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Port-au-Prince new file mode 100644 index 00000000..23e7de44 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Port-au-Prince @@ -0,0 +1,215 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Port-au-Prince) { + {-9223372036854775808 -17360 0 LMT} + {-2524504240 -17340 0 PPMT} + {-1670483460 -18000 0 EST} + {421218000 -14400 1 EDT} + {436334400 -18000 0 EST} + {452062800 -14400 1 EDT} + {467784000 -18000 0 EST} + {483512400 -14400 1 EDT} + {499233600 -18000 0 EST} + {514962000 -14400 1 EDT} + {530683200 -18000 0 EST} + {546411600 -14400 1 EDT} + {562132800 -18000 0 EST} + {576050400 -14400 1 EDT} + {594194400 -18000 0 EST} + {607500000 -14400 1 EDT} + {625644000 -18000 0 EST} + {638949600 -14400 1 EDT} + {657093600 -18000 0 EST} + {671004000 -14400 1 EDT} + {688543200 -18000 0 EST} + {702453600 -14400 1 EDT} + {719992800 -18000 0 EST} + {733903200 -14400 1 EDT} + {752047200 -18000 0 EST} + {765352800 -14400 1 EDT} + {783496800 -18000 0 EST} + {796802400 -14400 1 EDT} + {814946400 -18000 0 EST} + {828856800 -14400 1 EDT} + {846396000 -18000 0 EST} + {860306400 -14400 1 EDT} + {877845600 -18000 0 EST} + {1112504400 -14400 1 EDT} + {1130644800 -18000 0 EST} + {1143954000 -14400 1 EDT} + {1162094400 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Port_of_Spain b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Port_of_Spain new file mode 100644 index 00000000..5b412963 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Port_of_Spain @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/Port_of_Spain) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Porto_Acre b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Porto_Acre new file mode 100644 index 00000000..0626001b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Porto_Acre @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Rio_Branco)]} { + LoadTimeZoneFile America/Rio_Branco +} +set TZData(:America/Porto_Acre) $TZData(:America/Rio_Branco) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Porto_Velho b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Porto_Velho new file mode 100644 index 00000000..8d7c8fd0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Porto_Velho @@ -0,0 +1,35 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Porto_Velho) { + {-9223372036854775808 -15336 0 LMT} + {-1767210264 -14400 0 -04} + {-1206954000 -10800 1 -04} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -04} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -04} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -04} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -04} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -04} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -04} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -04} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -04} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -04} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -04} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -04} + {511239600 -14400 0 -04} + {530596800 -10800 1 -04} + {540270000 -14400 0 -04} + {562132800 -10800 1 -04} + {571201200 -14400 0 -04} + {590036400 -14400 0 -04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Puerto_Rico b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Puerto_Rico new file mode 100644 index 00000000..0d5c9b4b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Puerto_Rico @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Puerto_Rico) { + {-9223372036854775808 -15865 0 LMT} + {-2233035335 -14400 0 AST} + {-873057600 -10800 0 AWT} + {-769395600 -10800 1 APT} + {-765399600 -14400 0 AST} + {-757368000 -14400 0 AST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Punta_Arenas b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Punta_Arenas new file mode 100644 index 00000000..8b06e6a7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Punta_Arenas @@ -0,0 +1,123 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Punta_Arenas) { + {-9223372036854775808 -17020 0 LMT} + {-2524504580 -16965 0 SMT} + {-1892661435 -18000 0 -05} + {-1688410800 -16965 0 SMT} + {-1619205435 -14400 0 -04} + {-1593806400 -16965 0 SMT} + {-1335986235 -18000 0 -05} + {-1335985200 -14400 1 -05} + {-1317585600 -18000 0 -05} + {-1304362800 -14400 1 -05} + {-1286049600 -18000 0 -05} + {-1272826800 -14400 1 -05} + {-1254513600 -18000 0 -05} + {-1241290800 -14400 1 -05} + {-1222977600 -18000 0 -05} + {-1209754800 -14400 1 -05} + {-1191355200 -18000 0 -05} + {-1178132400 -14400 0 -04} + {-870552000 -18000 0 -05} + {-865278000 -14400 0 -04} + {-736632000 -14400 1 -04} + {-718056000 -18000 0 -05} + {-713649600 -14400 0 -04} + {-36619200 -10800 1 -04} + {-23922000 -14400 0 -04} + {-3355200 -10800 1 -04} + {7527600 -14400 0 -04} + {24465600 -10800 1 -04} + {37767600 -14400 0 -04} + {55915200 -10800 1 -04} + {69217200 -14400 0 -04} + {87969600 -10800 1 -04} + {100666800 -14400 0 -04} + {118209600 -10800 1 -04} + {132116400 -14400 0 -04} + {150868800 -10800 1 -04} + {163566000 -14400 0 -04} + {182318400 -10800 1 -04} + {195620400 -14400 0 -04} + {213768000 -10800 1 -04} + {227070000 -14400 0 -04} + {245217600 -10800 1 -04} + {258519600 -14400 0 -04} + {277272000 -10800 1 -04} + {289969200 -14400 0 -04} + {308721600 -10800 1 -04} + {321418800 -14400 0 -04} + {340171200 -10800 1 -04} + {353473200 -14400 0 -04} + {371620800 -10800 1 -04} + {384922800 -14400 0 -04} + {403070400 -10800 1 -04} + {416372400 -14400 0 -04} + {434520000 -10800 1 -04} + {447822000 -14400 0 -04} + {466574400 -10800 1 -04} + {479271600 -14400 0 -04} + {498024000 -10800 1 -04} + {510721200 -14400 0 -04} + {529473600 -10800 1 -04} + {545194800 -14400 0 -04} + {560923200 -10800 1 -04} + {574225200 -14400 0 -04} + {592372800 -10800 1 -04} + {605674800 -14400 0 -04} + {624427200 -10800 1 -04} + {637124400 -14400 0 -04} + {653457600 -10800 1 -04} + {668574000 -14400 0 -04} + {687326400 -10800 1 -04} + {700628400 -14400 0 -04} + {718776000 -10800 1 -04} + {732078000 -14400 0 -04} + {750225600 -10800 1 -04} + {763527600 -14400 0 -04} + {781675200 -10800 1 -04} + {794977200 -14400 0 -04} + {813729600 -10800 1 -04} + {826426800 -14400 0 -04} + {845179200 -10800 1 -04} + {859690800 -14400 0 -04} + {876628800 -10800 1 -04} + {889930800 -14400 0 -04} + {906868800 -10800 1 -04} + {923194800 -14400 0 -04} + {939528000 -10800 1 -04} + {952830000 -14400 0 -04} + {971582400 -10800 1 -04} + {984279600 -14400 0 -04} + {1003032000 -10800 1 -04} + {1015729200 -14400 0 -04} + {1034481600 -10800 1 -04} + {1047178800 -14400 0 -04} + {1065931200 -10800 1 -04} + {1079233200 -14400 0 -04} + {1097380800 -10800 1 -04} + {1110682800 -14400 0 -04} + {1128830400 -10800 1 -04} + {1142132400 -14400 0 -04} + {1160884800 -10800 1 -04} + {1173582000 -14400 0 -04} + {1192334400 -10800 1 -04} + {1206846000 -14400 0 -04} + {1223784000 -10800 1 -04} + {1237086000 -14400 0 -04} + {1255233600 -10800 1 -04} + {1270350000 -14400 0 -04} + {1286683200 -10800 1 -04} + {1304823600 -14400 0 -04} + {1313899200 -10800 1 -04} + {1335668400 -14400 0 -04} + {1346558400 -10800 1 -04} + {1367118000 -14400 0 -04} + {1378612800 -10800 1 -04} + {1398567600 -14400 0 -04} + {1410062400 -10800 1 -04} + {1463281200 -14400 0 -04} + {1471147200 -10800 1 -04} + {1480820400 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rainy_River b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rainy_River new file mode 100644 index 00000000..17fccb4a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rainy_River @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Winnipeg)]} { + LoadTimeZoneFile America/Winnipeg +} +set TZData(:America/Rainy_River) $TZData(:America/Winnipeg) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rankin_Inlet b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rankin_Inlet new file mode 100644 index 00000000..9ce9f8da --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rankin_Inlet @@ -0,0 +1,248 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Rankin_Inlet) { + {-9223372036854775808 0 0 -00} + {-410227200 -21600 0 CST} + {-147895200 -14400 1 CDDT} + {-131565600 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -18000 0 EST} + {986112000 -18000 0 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Recife b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Recife new file mode 100644 index 00000000..db0a445a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Recife @@ -0,0 +1,48 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Recife) { + {-9223372036854775808 -8376 0 LMT} + {-1767217224 -10800 0 -03} + {-1206957600 -7200 1 -03} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -03} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -03} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -03} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -03} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -03} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -03} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -03} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -03} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -03} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -03} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -03} + {511236000 -10800 0 -03} + {530593200 -7200 1 -03} + {540266400 -10800 0 -03} + {562129200 -7200 1 -03} + {571197600 -10800 0 -03} + {592974000 -7200 1 -03} + {602042400 -10800 0 -03} + {624423600 -7200 1 -03} + {634701600 -10800 0 -03} + {653536800 -10800 0 -03} + {938660400 -10800 0 -03} + {938919600 -7200 1 -03} + {951616800 -10800 0 -03} + {970974000 -7200 1 -03} + {971575200 -10800 0 -03} + {1000350000 -10800 0 -03} + {1003028400 -7200 1 -03} + {1013911200 -10800 0 -03} + {1033437600 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Resolute b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Resolute new file mode 100644 index 00000000..a9881b4d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Resolute @@ -0,0 +1,248 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Resolute) { + {-9223372036854775808 0 0 -00} + {-704937600 -21600 0 CST} + {-147895200 -14400 1 CDDT} + {-131565600 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -18000 0 EST} + {986112000 -18000 0 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162108800 -18000 0 EST} + {1173600000 -18000 0 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rio_Branco b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rio_Branco new file mode 100644 index 00000000..088800bd --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rio_Branco @@ -0,0 +1,37 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Rio_Branco) { + {-9223372036854775808 -16272 0 LMT} + {-1767209328 -18000 0 -05} + {-1206950400 -14400 1 -05} + {-1191355200 -18000 0 -05} + {-1175367600 -14400 1 -05} + {-1159819200 -18000 0 -05} + {-633812400 -14400 1 -05} + {-622062000 -18000 0 -05} + {-602276400 -14400 1 -05} + {-591825600 -18000 0 -05} + {-570740400 -14400 1 -05} + {-560203200 -18000 0 -05} + {-539118000 -14400 1 -05} + {-531345600 -18000 0 -05} + {-191358000 -14400 1 -05} + {-184190400 -18000 0 -05} + {-155156400 -14400 1 -05} + {-150062400 -18000 0 -05} + {-128890800 -14400 1 -05} + {-121118400 -18000 0 -05} + {-99946800 -14400 1 -05} + {-89582400 -18000 0 -05} + {-68410800 -14400 1 -05} + {-57960000 -18000 0 -05} + {499755600 -14400 1 -05} + {511243200 -18000 0 -05} + {530600400 -14400 1 -05} + {540273600 -18000 0 -05} + {562136400 -14400 1 -05} + {571204800 -18000 0 -05} + {590040000 -18000 0 -05} + {1214283600 -14400 0 -04} + {1384056000 -18000 0 -05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rosario b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rosario new file mode 100644 index 00000000..6687f880 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Rosario @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Argentina/Cordoba)]} { + LoadTimeZoneFile America/Argentina/Cordoba +} +set TZData(:America/Rosario) $TZData(:America/Argentina/Cordoba) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santa_Isabel b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santa_Isabel new file mode 100644 index 00000000..a3a3b4fa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santa_Isabel @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Tijuana)]} { + LoadTimeZoneFile America/Tijuana +} +set TZData(:America/Santa_Isabel) $TZData(:America/Tijuana) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santarem b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santarem new file mode 100644 index 00000000..5fa35518 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santarem @@ -0,0 +1,36 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Santarem) { + {-9223372036854775808 -13128 0 LMT} + {-1767212472 -14400 0 -04} + {-1206954000 -10800 1 -04} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -04} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -04} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -04} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -04} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -04} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -04} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -04} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -04} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -04} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -04} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -04} + {511239600 -14400 0 -04} + {530596800 -10800 1 -04} + {540270000 -14400 0 -04} + {562132800 -10800 1 -04} + {571201200 -14400 0 -04} + {590036400 -14400 0 -04} + {1214280000 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santiago b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santiago new file mode 100644 index 00000000..13b8b992 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santiago @@ -0,0 +1,289 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Santiago) { + {-9223372036854775808 -16965 0 LMT} + {-2524504635 -16965 0 SMT} + {-1892661435 -18000 0 -05} + {-1688410800 -16965 0 SMT} + {-1619205435 -14400 0 -04} + {-1593806400 -16965 0 SMT} + {-1335986235 -18000 0 -05} + {-1335985200 -14400 1 -05} + {-1317585600 -18000 0 -05} + {-1304362800 -14400 1 -05} + {-1286049600 -18000 0 -05} + {-1272826800 -14400 1 -05} + {-1254513600 -18000 0 -05} + {-1241290800 -14400 1 -05} + {-1222977600 -18000 0 -05} + {-1209754800 -14400 1 -05} + {-1191355200 -18000 0 -05} + {-1178132400 -14400 0 -04} + {-870552000 -18000 0 -05} + {-865278000 -14400 0 -04} + {-740520000 -10800 1 -03} + {-736635600 -14400 1 -04} + {-718056000 -18000 0 -05} + {-713649600 -14400 0 -04} + {-36619200 -10800 1 -04} + {-23922000 -14400 0 -04} + {-3355200 -10800 1 -04} + {7527600 -14400 0 -04} + {24465600 -10800 1 -04} + {37767600 -14400 0 -04} + {55915200 -10800 1 -04} + {69217200 -14400 0 -04} + {87969600 -10800 1 -04} + {100666800 -14400 0 -04} + {118209600 -10800 1 -04} + {132116400 -14400 0 -04} + {150868800 -10800 1 -04} + {163566000 -14400 0 -04} + {182318400 -10800 1 -04} + {195620400 -14400 0 -04} + {213768000 -10800 1 -04} + {227070000 -14400 0 -04} + {245217600 -10800 1 -04} + {258519600 -14400 0 -04} + {277272000 -10800 1 -04} + {289969200 -14400 0 -04} + {308721600 -10800 1 -04} + {321418800 -14400 0 -04} + {340171200 -10800 1 -04} + {353473200 -14400 0 -04} + {371620800 -10800 1 -04} + {384922800 -14400 0 -04} + {403070400 -10800 1 -04} + {416372400 -14400 0 -04} + {434520000 -10800 1 -04} + {447822000 -14400 0 -04} + {466574400 -10800 1 -04} + {479271600 -14400 0 -04} + {498024000 -10800 1 -04} + {510721200 -14400 0 -04} + {529473600 -10800 1 -04} + {545194800 -14400 0 -04} + {560923200 -10800 1 -04} + {574225200 -14400 0 -04} + {592372800 -10800 1 -04} + {605674800 -14400 0 -04} + {624427200 -10800 1 -04} + {637124400 -14400 0 -04} + {653457600 -10800 1 -04} + {668574000 -14400 0 -04} + {687326400 -10800 1 -04} + {700628400 -14400 0 -04} + {718776000 -10800 1 -04} + {732078000 -14400 0 -04} + {750225600 -10800 1 -04} + {763527600 -14400 0 -04} + {781675200 -10800 1 -04} + {794977200 -14400 0 -04} + {813729600 -10800 1 -04} + {826426800 -14400 0 -04} + {845179200 -10800 1 -04} + {859690800 -14400 0 -04} + {876628800 -10800 1 -04} + {889930800 -14400 0 -04} + {906868800 -10800 1 -04} + {923194800 -14400 0 -04} + {939528000 -10800 1 -04} + {952830000 -14400 0 -04} + {971582400 -10800 1 -04} + {984279600 -14400 0 -04} + {1003032000 -10800 1 -04} + {1015729200 -14400 0 -04} + {1034481600 -10800 1 -04} + {1047178800 -14400 0 -04} + {1065931200 -10800 1 -04} + {1079233200 -14400 0 -04} + {1097380800 -10800 1 -04} + {1110682800 -14400 0 -04} + {1128830400 -10800 1 -04} + {1142132400 -14400 0 -04} + {1160884800 -10800 1 -04} + {1173582000 -14400 0 -04} + {1192334400 -10800 1 -04} + {1206846000 -14400 0 -04} + {1223784000 -10800 1 -04} + {1237086000 -14400 0 -04} + {1255233600 -10800 1 -04} + {1270350000 -14400 0 -04} + {1286683200 -10800 1 -04} + {1304823600 -14400 0 -04} + {1313899200 -10800 1 -04} + {1335668400 -14400 0 -04} + {1346558400 -10800 1 -04} + {1367118000 -14400 0 -04} + {1378612800 -10800 1 -04} + {1398567600 -14400 0 -04} + {1410062400 -10800 1 -04} + {1463281200 -14400 0 -04} + {1471147200 -10800 1 -04} + {1494730800 -14400 0 -04} + {1502596800 -10800 1 -04} + {1526180400 -14400 0 -04} + {1534046400 -10800 1 -04} + {1554606000 -14400 0 -04} + {1567915200 -10800 1 -04} + {1586055600 -14400 0 -04} + {1599364800 -10800 1 -04} + {1617505200 -14400 0 -04} + {1630814400 -10800 1 -04} + {1648954800 -14400 0 -04} + {1662868800 -10800 1 -04} + {1680404400 -14400 0 -04} + {1693713600 -10800 1 -04} + {1712458800 -14400 0 -04} + {1725768000 -10800 1 -04} + {1743908400 -14400 0 -04} + {1757217600 -10800 1 -04} + {1775358000 -14400 0 -04} + {1788667200 -10800 1 -04} + {1806807600 -14400 0 -04} + {1820116800 -10800 1 -04} + {1838257200 -14400 0 -04} + {1851566400 -10800 1 -04} + {1870311600 -14400 0 -04} + {1883016000 -10800 1 -04} + {1901761200 -14400 0 -04} + {1915070400 -10800 1 -04} + {1933210800 -14400 0 -04} + {1946520000 -10800 1 -04} + {1964660400 -14400 0 -04} + {1977969600 -10800 1 -04} + {1996110000 -14400 0 -04} + {2009419200 -10800 1 -04} + {2027559600 -14400 0 -04} + {2040868800 -10800 1 -04} + {2059614000 -14400 0 -04} + {2072318400 -10800 1 -04} + {2091063600 -14400 0 -04} + {2104372800 -10800 1 -04} + {2122513200 -14400 0 -04} + {2135822400 -10800 1 -04} + {2153962800 -14400 0 -04} + {2167272000 -10800 1 -04} + {2185412400 -14400 0 -04} + {2198721600 -10800 1 -04} + {2217466800 -14400 0 -04} + {2230171200 -10800 1 -04} + {2248916400 -14400 0 -04} + {2262225600 -10800 1 -04} + {2280366000 -14400 0 -04} + {2293675200 -10800 1 -04} + {2311815600 -14400 0 -04} + {2325124800 -10800 1 -04} + {2343265200 -14400 0 -04} + {2356574400 -10800 1 -04} + {2374714800 -14400 0 -04} + {2388024000 -10800 1 -04} + {2406769200 -14400 0 -04} + {2419473600 -10800 1 -04} + {2438218800 -14400 0 -04} + {2451528000 -10800 1 -04} + {2469668400 -14400 0 -04} + {2482977600 -10800 1 -04} + {2501118000 -14400 0 -04} + {2514427200 -10800 1 -04} + {2532567600 -14400 0 -04} + {2545876800 -10800 1 -04} + {2564017200 -14400 0 -04} + {2577326400 -10800 1 -04} + {2596071600 -14400 0 -04} + {2609380800 -10800 1 -04} + {2627521200 -14400 0 -04} + {2640830400 -10800 1 -04} + {2658970800 -14400 0 -04} + {2672280000 -10800 1 -04} + {2690420400 -14400 0 -04} + {2703729600 -10800 1 -04} + {2721870000 -14400 0 -04} + {2735179200 -10800 1 -04} + {2753924400 -14400 0 -04} + {2766628800 -10800 1 -04} + {2785374000 -14400 0 -04} + {2798683200 -10800 1 -04} + {2816823600 -14400 0 -04} + {2830132800 -10800 1 -04} + {2848273200 -14400 0 -04} + {2861582400 -10800 1 -04} + {2879722800 -14400 0 -04} + {2893032000 -10800 1 -04} + {2911172400 -14400 0 -04} + {2924481600 -10800 1 -04} + {2943226800 -14400 0 -04} + {2955931200 -10800 1 -04} + {2974676400 -14400 0 -04} + {2987985600 -10800 1 -04} + {3006126000 -14400 0 -04} + {3019435200 -10800 1 -04} + {3037575600 -14400 0 -04} + {3050884800 -10800 1 -04} + {3069025200 -14400 0 -04} + {3082334400 -10800 1 -04} + {3101079600 -14400 0 -04} + {3113784000 -10800 1 -04} + {3132529200 -14400 0 -04} + {3145838400 -10800 1 -04} + {3163978800 -14400 0 -04} + {3177288000 -10800 1 -04} + {3195428400 -14400 0 -04} + {3208737600 -10800 1 -04} + {3226878000 -14400 0 -04} + {3240187200 -10800 1 -04} + {3258327600 -14400 0 -04} + {3271636800 -10800 1 -04} + {3290382000 -14400 0 -04} + {3303086400 -10800 1 -04} + {3321831600 -14400 0 -04} + {3335140800 -10800 1 -04} + {3353281200 -14400 0 -04} + {3366590400 -10800 1 -04} + {3384730800 -14400 0 -04} + {3398040000 -10800 1 -04} + {3416180400 -14400 0 -04} + {3429489600 -10800 1 -04} + {3447630000 -14400 0 -04} + {3460939200 -10800 1 -04} + {3479684400 -14400 0 -04} + {3492993600 -10800 1 -04} + {3511134000 -14400 0 -04} + {3524443200 -10800 1 -04} + {3542583600 -14400 0 -04} + {3555892800 -10800 1 -04} + {3574033200 -14400 0 -04} + {3587342400 -10800 1 -04} + {3605482800 -14400 0 -04} + {3618792000 -10800 1 -04} + {3637537200 -14400 0 -04} + {3650241600 -10800 1 -04} + {3668986800 -14400 0 -04} + {3682296000 -10800 1 -04} + {3700436400 -14400 0 -04} + {3713745600 -10800 1 -04} + {3731886000 -14400 0 -04} + {3745195200 -10800 1 -04} + {3763335600 -14400 0 -04} + {3776644800 -10800 1 -04} + {3794785200 -14400 0 -04} + {3808094400 -10800 1 -04} + {3826839600 -14400 0 -04} + {3839544000 -10800 1 -04} + {3858289200 -14400 0 -04} + {3871598400 -10800 1 -04} + {3889738800 -14400 0 -04} + {3903048000 -10800 1 -04} + {3921188400 -14400 0 -04} + {3934497600 -10800 1 -04} + {3952638000 -14400 0 -04} + {3965947200 -10800 1 -04} + {3984692400 -14400 0 -04} + {3997396800 -10800 1 -04} + {4016142000 -14400 0 -04} + {4029451200 -10800 1 -04} + {4047591600 -14400 0 -04} + {4060900800 -10800 1 -04} + {4079041200 -14400 0 -04} + {4092350400 -10800 1 -04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santo_Domingo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santo_Domingo new file mode 100644 index 00000000..28d3a9ce --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Santo_Domingo @@ -0,0 +1,21 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Santo_Domingo) { + {-9223372036854775808 -16776 0 LMT} + {-2524504824 -16800 0 SDMT} + {-1159773600 -18000 0 EST} + {-100119600 -14400 1 EDT} + {-89668800 -18000 0 EST} + {-5770800 -16200 1 -0430} + {4422600 -18000 0 EST} + {25678800 -16200 1 -0430} + {33193800 -18000 0 EST} + {57733200 -16200 1 -0430} + {64816200 -18000 0 EST} + {89182800 -16200 1 -0430} + {96438600 -18000 0 EST} + {120632400 -16200 1 -0430} + {127974600 -18000 0 EST} + {152082000 -14400 0 AST} + {975823200 -14400 0 AST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Sao_Paulo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Sao_Paulo new file mode 100644 index 00000000..77d5d8c9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Sao_Paulo @@ -0,0 +1,97 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Sao_Paulo) { + {-9223372036854775808 -11188 0 LMT} + {-1767214412 -10800 0 -03} + {-1206957600 -7200 1 -03} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -03} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -03} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -03} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -03} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -03} + {-531352800 -10800 0 -03} + {-195429600 -7200 1 -02} + {-189381600 -7200 0 -03} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -03} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -03} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -03} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -03} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -03} + {511236000 -10800 0 -03} + {530593200 -7200 1 -03} + {540266400 -10800 0 -03} + {562129200 -7200 1 -03} + {571197600 -10800 0 -03} + {592974000 -7200 1 -03} + {602042400 -10800 0 -03} + {624423600 -7200 1 -03} + {634701600 -10800 0 -03} + {656478000 -7200 1 -03} + {666756000 -10800 0 -03} + {687927600 -7200 1 -03} + {697600800 -10800 0 -03} + {719982000 -7200 1 -03} + {728445600 -10800 0 -03} + {750826800 -7200 1 -03} + {761709600 -10800 0 -03} + {782276400 -7200 1 -03} + {793159200 -10800 0 -03} + {813726000 -7200 1 -03} + {824004000 -10800 0 -03} + {844570800 -7200 1 -03} + {856058400 -10800 0 -03} + {876106800 -7200 1 -03} + {888717600 -10800 0 -03} + {908074800 -7200 1 -03} + {919562400 -10800 0 -03} + {938919600 -7200 1 -03} + {951616800 -10800 0 -03} + {970974000 -7200 1 -03} + {982461600 -10800 0 -03} + {1003028400 -7200 1 -03} + {1013911200 -10800 0 -03} + {1036292400 -7200 1 -03} + {1045360800 -10800 0 -03} + {1066532400 -7200 1 -03} + {1076810400 -10800 0 -03} + {1099364400 -7200 1 -03} + {1108864800 -10800 0 -03} + {1129431600 -7200 1 -03} + {1140314400 -10800 0 -03} + {1162695600 -7200 1 -03} + {1172368800 -10800 0 -03} + {1192330800 -7200 1 -03} + {1203213600 -10800 0 -03} + {1224385200 -7200 1 -03} + {1234663200 -10800 0 -03} + {1255834800 -7200 1 -03} + {1266717600 -10800 0 -03} + {1287284400 -7200 1 -03} + {1298167200 -10800 0 -03} + {1318734000 -7200 1 -03} + {1330221600 -10800 0 -03} + {1350788400 -7200 1 -03} + {1361066400 -10800 0 -03} + {1382238000 -7200 1 -03} + {1392516000 -10800 0 -03} + {1413687600 -7200 1 -03} + {1424570400 -10800 0 -03} + {1445137200 -7200 1 -03} + {1456020000 -10800 0 -03} + {1476586800 -7200 1 -03} + {1487469600 -10800 0 -03} + {1508036400 -7200 1 -03} + {1518919200 -10800 0 -03} + {1541300400 -7200 1 -03} + {1550368800 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Scoresbysund b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Scoresbysund new file mode 100644 index 00000000..74306355 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Scoresbysund @@ -0,0 +1,246 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Scoresbysund) { + {-9223372036854775808 -5272 0 LMT} + {-1686090728 -7200 0 -02} + {323841600 -3600 0 -01} + {338961600 -7200 0 -02} + {354679200 0 0 +00} + {370400400 -3600 0 -01} + {386125200 0 1 +00} + {401850000 -3600 0 -01} + {417574800 0 1 +00} + {433299600 -3600 0 -01} + {449024400 0 1 +00} + {465354000 -3600 0 -01} + {481078800 0 1 +00} + {496803600 -3600 0 -01} + {512528400 0 1 +00} + {528253200 -3600 0 -01} + {543978000 0 1 +00} + {559702800 -3600 0 -01} + {575427600 0 1 +00} + {591152400 -3600 0 -01} + {606877200 0 1 +00} + {622602000 -3600 0 -01} + {638326800 0 1 +00} + {654656400 -3600 0 -01} + {670381200 0 1 +00} + {686106000 -3600 0 -01} + {701830800 0 1 +00} + {717555600 -3600 0 -01} + {733280400 0 1 +00} + {749005200 -3600 0 -01} + {764730000 0 1 +00} + {780454800 -3600 0 -01} + {796179600 0 1 +00} + {811904400 -3600 0 -01} + {828234000 0 1 +00} + {846378000 -3600 0 -01} + {859683600 0 1 +00} + {877827600 -3600 0 -01} + {891133200 0 1 +00} + {909277200 -3600 0 -01} + {922582800 0 1 +00} + {941331600 -3600 0 -01} + {954032400 0 1 +00} + {972781200 -3600 0 -01} + {985482000 0 1 +00} + {1004230800 -3600 0 -01} + {1017536400 0 1 +00} + {1035680400 -3600 0 -01} + {1048986000 0 1 +00} + {1067130000 -3600 0 -01} + {1080435600 0 1 +00} + {1099184400 -3600 0 -01} + {1111885200 0 1 +00} + {1130634000 -3600 0 -01} + {1143334800 0 1 +00} + {1162083600 -3600 0 -01} + {1174784400 0 1 +00} + {1193533200 -3600 0 -01} + {1206838800 0 1 +00} + {1224982800 -3600 0 -01} + {1238288400 0 1 +00} + {1256432400 -3600 0 -01} + {1269738000 0 1 +00} + {1288486800 -3600 0 -01} + {1301187600 0 1 +00} + {1319936400 -3600 0 -01} + {1332637200 0 1 +00} + {1351386000 -3600 0 -01} + {1364691600 0 1 +00} + {1382835600 -3600 0 -01} + {1396141200 0 1 +00} + {1414285200 -3600 0 -01} + {1427590800 0 1 +00} + {1445734800 -3600 0 -01} + {1459040400 0 1 +00} + {1477789200 -3600 0 -01} + {1490490000 0 1 +00} + {1509238800 -3600 0 -01} + {1521939600 0 1 +00} + {1540688400 -3600 0 -01} + {1553994000 0 1 +00} + {1572138000 -3600 0 -01} + {1585443600 0 1 +00} + {1603587600 -3600 0 -01} + {1616893200 0 1 +00} + {1635642000 -3600 0 -01} + {1648342800 0 1 +00} + {1667091600 -3600 0 -01} + {1679792400 0 1 +00} + {1698541200 -3600 0 -01} + {1711846800 0 1 +00} + {1729990800 -3600 0 -01} + {1743296400 0 1 +00} + {1761440400 -3600 0 -01} + {1774746000 0 1 +00} + {1792890000 -3600 0 -01} + {1806195600 0 1 +00} + {1824944400 -3600 0 -01} + {1837645200 0 1 +00} + {1856394000 -3600 0 -01} + {1869094800 0 1 +00} + {1887843600 -3600 0 -01} + {1901149200 0 1 +00} + {1919293200 -3600 0 -01} + {1932598800 0 1 +00} + {1950742800 -3600 0 -01} + {1964048400 0 1 +00} + {1982797200 -3600 0 -01} + {1995498000 0 1 +00} + {2014246800 -3600 0 -01} + {2026947600 0 1 +00} + {2045696400 -3600 0 -01} + {2058397200 0 1 +00} + {2077146000 -3600 0 -01} + {2090451600 0 1 +00} + {2108595600 -3600 0 -01} + {2121901200 0 1 +00} + {2140045200 -3600 0 -01} + {2153350800 0 1 +00} + {2172099600 -3600 0 -01} + {2184800400 0 1 +00} + {2203549200 -3600 0 -01} + {2216250000 0 1 +00} + {2234998800 -3600 0 -01} + {2248304400 0 1 +00} + {2266448400 -3600 0 -01} + {2279754000 0 1 +00} + {2297898000 -3600 0 -01} + {2311203600 0 1 +00} + {2329347600 -3600 0 -01} + {2342653200 0 1 +00} + {2361402000 -3600 0 -01} + {2374102800 0 1 +00} + {2392851600 -3600 0 -01} + {2405552400 0 1 +00} + {2424301200 -3600 0 -01} + {2437606800 0 1 +00} + {2455750800 -3600 0 -01} + {2469056400 0 1 +00} + {2487200400 -3600 0 -01} + {2500506000 0 1 +00} + {2519254800 -3600 0 -01} + {2531955600 0 1 +00} + {2550704400 -3600 0 -01} + {2563405200 0 1 +00} + {2582154000 -3600 0 -01} + {2595459600 0 1 +00} + {2613603600 -3600 0 -01} + {2626909200 0 1 +00} + {2645053200 -3600 0 -01} + {2658358800 0 1 +00} + {2676502800 -3600 0 -01} + {2689808400 0 1 +00} + {2708557200 -3600 0 -01} + {2721258000 0 1 +00} + {2740006800 -3600 0 -01} + {2752707600 0 1 +00} + {2771456400 -3600 0 -01} + {2784762000 0 1 +00} + {2802906000 -3600 0 -01} + {2816211600 0 1 +00} + {2834355600 -3600 0 -01} + {2847661200 0 1 +00} + {2866410000 -3600 0 -01} + {2879110800 0 1 +00} + {2897859600 -3600 0 -01} + {2910560400 0 1 +00} + {2929309200 -3600 0 -01} + {2942010000 0 1 +00} + {2960758800 -3600 0 -01} + {2974064400 0 1 +00} + {2992208400 -3600 0 -01} + {3005514000 0 1 +00} + {3023658000 -3600 0 -01} + {3036963600 0 1 +00} + {3055712400 -3600 0 -01} + {3068413200 0 1 +00} + {3087162000 -3600 0 -01} + {3099862800 0 1 +00} + {3118611600 -3600 0 -01} + {3131917200 0 1 +00} + {3150061200 -3600 0 -01} + {3163366800 0 1 +00} + {3181510800 -3600 0 -01} + {3194816400 0 1 +00} + {3212960400 -3600 0 -01} + {3226266000 0 1 +00} + {3245014800 -3600 0 -01} + {3257715600 0 1 +00} + {3276464400 -3600 0 -01} + {3289165200 0 1 +00} + {3307914000 -3600 0 -01} + {3321219600 0 1 +00} + {3339363600 -3600 0 -01} + {3352669200 0 1 +00} + {3370813200 -3600 0 -01} + {3384118800 0 1 +00} + {3402867600 -3600 0 -01} + {3415568400 0 1 +00} + {3434317200 -3600 0 -01} + {3447018000 0 1 +00} + {3465766800 -3600 0 -01} + {3479072400 0 1 +00} + {3497216400 -3600 0 -01} + {3510522000 0 1 +00} + {3528666000 -3600 0 -01} + {3541971600 0 1 +00} + {3560115600 -3600 0 -01} + {3573421200 0 1 +00} + {3592170000 -3600 0 -01} + {3604870800 0 1 +00} + {3623619600 -3600 0 -01} + {3636320400 0 1 +00} + {3655069200 -3600 0 -01} + {3668374800 0 1 +00} + {3686518800 -3600 0 -01} + {3699824400 0 1 +00} + {3717968400 -3600 0 -01} + {3731274000 0 1 +00} + {3750022800 -3600 0 -01} + {3762723600 0 1 +00} + {3781472400 -3600 0 -01} + {3794173200 0 1 +00} + {3812922000 -3600 0 -01} + {3825622800 0 1 +00} + {3844371600 -3600 0 -01} + {3857677200 0 1 +00} + {3875821200 -3600 0 -01} + {3889126800 0 1 +00} + {3907270800 -3600 0 -01} + {3920576400 0 1 +00} + {3939325200 -3600 0 -01} + {3952026000 0 1 +00} + {3970774800 -3600 0 -01} + {3983475600 0 1 +00} + {4002224400 -3600 0 -01} + {4015530000 0 1 +00} + {4033674000 -3600 0 -01} + {4046979600 0 1 +00} + {4065123600 -3600 0 -01} + {4078429200 0 1 +00} + {4096573200 -3600 0 -01} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Shiprock b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Shiprock new file mode 100644 index 00000000..995d25d3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Shiprock @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Denver)]} { + LoadTimeZoneFile America/Denver +} +set TZData(:America/Shiprock) $TZData(:America/Denver) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Barthelemy b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Barthelemy new file mode 100644 index 00000000..1640d82d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Barthelemy @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/St_Barthelemy) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Johns b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Johns new file mode 100644 index 00000000..1492961d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Johns @@ -0,0 +1,372 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/St_Johns) { + {-9223372036854775808 -12652 0 LMT} + {-2713897748 -12652 0 NST} + {-1664130548 -9052 1 NDT} + {-1650137348 -12652 0 NST} + {-1640982548 -12652 0 NST} + {-1632076148 -9052 1 NDT} + {-1615145348 -12652 0 NST} + {-1609446548 -12652 0 NST} + {-1598650148 -9052 1 NDT} + {-1590100148 -12652 0 NST} + {-1567286948 -9052 1 NDT} + {-1551565748 -12652 0 NST} + {-1535837348 -9052 1 NDT} + {-1520116148 -12652 0 NST} + {-1503782948 -9052 1 NDT} + {-1488666548 -12652 0 NST} + {-1472333348 -9052 1 NDT} + {-1457216948 -12652 0 NST} + {-1440883748 -9052 1 NDT} + {-1425767348 -12652 0 NST} + {-1409434148 -9052 1 NDT} + {-1394317748 -12652 0 NST} + {-1377984548 -9052 1 NDT} + {-1362263348 -12652 0 NST} + {-1346534948 -9052 1 NDT} + {-1330813748 -12652 0 NST} + {-1314480548 -9052 1 NDT} + {-1299364148 -12652 0 NST} + {-1283030948 -9052 1 NDT} + {-1267914548 -12652 0 NST} + {-1251581348 -9052 1 NDT} + {-1236464948 -12652 0 NST} + {-1220131748 -9052 1 NDT} + {-1205015348 -12652 0 NST} + {-1188682148 -9052 1 NDT} + {-1172960948 -12652 0 NST} + {-1156627748 -9052 1 NDT} + {-1141511348 -12652 0 NST} + {-1125178148 -9052 1 NDT} + {-1110061748 -12652 0 NST} + {-1096921748 -12600 0 NST} + {-1093728600 -9000 1 NDT} + {-1078612200 -12600 0 NST} + {-1061670600 -9000 1 NDT} + {-1048973400 -12600 0 NST} + {-1030221000 -9000 1 NDT} + {-1017523800 -12600 0 NST} + {-998771400 -9000 1 NDT} + {-986074200 -12600 0 NST} + {-966717000 -9000 1 NDT} + {-954624600 -12600 0 NST} + {-935267400 -9000 1 NDT} + {-922570200 -12600 0 NST} + {-903817800 -9000 1 NDT} + {-891120600 -12600 0 NST} + {-872368200 -9000 0 NWT} + {-769395600 -9000 1 NPT} + {-765401400 -12600 0 NST} + {-757369800 -12600 0 NST} + {-746044200 -9000 1 NDT} + {-733347000 -12600 0 NST} + {-714594600 -9000 1 NDT} + {-701897400 -12600 0 NST} + {-683145000 -9000 1 NDT} + {-670447800 -12600 0 NST} + {-651695400 -9000 1 NDT} + {-638998200 -12600 0 NST} + {-619641000 -9000 1 NDT} + {-606943800 -12600 0 NST} + {-589401000 -9000 1 NDT} + {-576099000 -12600 0 NST} + {-557951400 -9000 1 NDT} + {-544649400 -12600 0 NST} + {-526501800 -9000 1 NDT} + {-513199800 -12600 0 NST} + {-495052200 -9000 1 NDT} + {-481750200 -12600 0 NST} + {-463602600 -9000 1 NDT} + {-450300600 -12600 0 NST} + {-431548200 -9000 1 NDT} + {-418246200 -12600 0 NST} + {-400098600 -9000 1 NDT} + {-386796600 -12600 0 NST} + {-368649000 -9000 1 NDT} + {-355347000 -12600 0 NST} + {-337199400 -9000 1 NDT} + {-323897400 -12600 0 NST} + {-305749800 -9000 1 NDT} + {-289423800 -12600 0 NST} + {-273695400 -9000 1 NDT} + {-257974200 -12600 0 NST} + {-242245800 -9000 1 NDT} + {-226524600 -12600 0 NST} + {-210796200 -9000 1 NDT} + {-195075000 -12600 0 NST} + {-179346600 -9000 1 NDT} + {-163625400 -12600 0 NST} + {-147897000 -9000 1 NDT} + {-131571000 -12600 0 NST} + {-116447400 -9000 1 NDT} + {-100121400 -12600 0 NST} + {-84393000 -9000 1 NDT} + {-68671800 -12600 0 NST} + {-52943400 -9000 1 NDT} + {-37222200 -12600 0 NST} + {-21493800 -9000 1 NDT} + {-5772600 -12600 0 NST} + {9955800 -9000 1 NDT} + {25677000 -12600 0 NST} + {41405400 -9000 1 NDT} + {57731400 -12600 0 NST} + {73459800 -9000 1 NDT} + {89181000 -12600 0 NST} + {104909400 -9000 1 NDT} + {120630600 -12600 0 NST} + {136359000 -9000 1 NDT} + {152080200 -12600 0 NST} + {167808600 -9000 1 NDT} + {183529800 -12600 0 NST} + {199258200 -9000 1 NDT} + {215584200 -12600 0 NST} + {230707800 -9000 1 NDT} + {247033800 -12600 0 NST} + {262762200 -9000 1 NDT} + {278483400 -12600 0 NST} + {294211800 -9000 1 NDT} + {309933000 -12600 0 NST} + {325661400 -9000 1 NDT} + {341382600 -12600 0 NST} + {357111000 -9000 1 NDT} + {372832200 -12600 0 NST} + {388560600 -9000 1 NDT} + {404886600 -12600 0 NST} + {420010200 -9000 1 NDT} + {436336200 -12600 0 NST} + {452064600 -9000 1 NDT} + {467785800 -12600 0 NST} + {483514200 -9000 1 NDT} + {499235400 -12600 0 NST} + {514963800 -9000 1 NDT} + {530685000 -12600 0 NST} + {544591860 -9000 1 NDT} + {562127460 -12600 0 NST} + {576041460 -5400 1 NDDT} + {594178260 -12600 0 NST} + {607491060 -9000 1 NDT} + {625631460 -12600 0 NST} + {638940660 -9000 1 NDT} + {657081060 -12600 0 NST} + {670995060 -9000 1 NDT} + {688530660 -12600 0 NST} + {702444660 -9000 1 NDT} + {719980260 -12600 0 NST} + {733894260 -9000 1 NDT} + {752034660 -12600 0 NST} + {765343860 -9000 1 NDT} + {783484260 -12600 0 NST} + {796793460 -9000 1 NDT} + {814933860 -12600 0 NST} + {828847860 -9000 1 NDT} + {846383460 -12600 0 NST} + {860297460 -9000 1 NDT} + {877833060 -12600 0 NST} + {891747060 -9000 1 NDT} + {909282660 -12600 0 NST} + {923196660 -9000 1 NDT} + {941337060 -12600 0 NST} + {954646260 -9000 1 NDT} + {972786660 -12600 0 NST} + {986095860 -9000 1 NDT} + {1004236260 -12600 0 NST} + {1018150260 -9000 1 NDT} + {1035685860 -12600 0 NST} + {1049599860 -9000 1 NDT} + {1067135460 -12600 0 NST} + {1081049460 -9000 1 NDT} + {1099189860 -12600 0 NST} + {1112499060 -9000 1 NDT} + {1130639460 -12600 0 NST} + {1143948660 -9000 1 NDT} + {1162089060 -12600 0 NST} + {1173583860 -9000 1 NDT} + {1194143460 -12600 0 NST} + {1205033460 -9000 1 NDT} + {1225593060 -12600 0 NST} + {1236483060 -9000 1 NDT} + {1257042660 -12600 0 NST} + {1268537460 -9000 1 NDT} + {1289097060 -12600 0 NST} + {1299987060 -9000 1 NDT} + {1320114600 -9000 0 NDT} + {1320553800 -12600 0 NST} + {1331443800 -9000 1 NDT} + {1352003400 -12600 0 NST} + {1362893400 -9000 1 NDT} + {1383453000 -12600 0 NST} + {1394343000 -9000 1 NDT} + {1414902600 -12600 0 NST} + {1425792600 -9000 1 NDT} + {1446352200 -12600 0 NST} + {1457847000 -9000 1 NDT} + {1478406600 -12600 0 NST} + {1489296600 -9000 1 NDT} + {1509856200 -12600 0 NST} + {1520746200 -9000 1 NDT} + {1541305800 -12600 0 NST} + {1552195800 -9000 1 NDT} + {1572755400 -12600 0 NST} + {1583645400 -9000 1 NDT} + {1604205000 -12600 0 NST} + {1615699800 -9000 1 NDT} + {1636259400 -12600 0 NST} + {1647149400 -9000 1 NDT} + {1667709000 -12600 0 NST} + {1678599000 -9000 1 NDT} + {1699158600 -12600 0 NST} + {1710048600 -9000 1 NDT} + {1730608200 -12600 0 NST} + {1741498200 -9000 1 NDT} + {1762057800 -12600 0 NST} + {1772947800 -9000 1 NDT} + {1793507400 -12600 0 NST} + {1805002200 -9000 1 NDT} + {1825561800 -12600 0 NST} + {1836451800 -9000 1 NDT} + {1857011400 -12600 0 NST} + {1867901400 -9000 1 NDT} + {1888461000 -12600 0 NST} + {1899351000 -9000 1 NDT} + {1919910600 -12600 0 NST} + {1930800600 -9000 1 NDT} + {1951360200 -12600 0 NST} + {1962855000 -9000 1 NDT} + {1983414600 -12600 0 NST} + {1994304600 -9000 1 NDT} + {2014864200 -12600 0 NST} + {2025754200 -9000 1 NDT} + {2046313800 -12600 0 NST} + {2057203800 -9000 1 NDT} + {2077763400 -12600 0 NST} + {2088653400 -9000 1 NDT} + {2109213000 -12600 0 NST} + {2120103000 -9000 1 NDT} + {2140662600 -12600 0 NST} + {2152157400 -9000 1 NDT} + {2172717000 -12600 0 NST} + {2183607000 -9000 1 NDT} + {2204166600 -12600 0 NST} + {2215056600 -9000 1 NDT} + {2235616200 -12600 0 NST} + {2246506200 -9000 1 NDT} + {2267065800 -12600 0 NST} + {2277955800 -9000 1 NDT} + {2298515400 -12600 0 NST} + {2309405400 -9000 1 NDT} + {2329965000 -12600 0 NST} + {2341459800 -9000 1 NDT} + {2362019400 -12600 0 NST} + {2372909400 -9000 1 NDT} + {2393469000 -12600 0 NST} + {2404359000 -9000 1 NDT} + {2424918600 -12600 0 NST} + {2435808600 -9000 1 NDT} + {2456368200 -12600 0 NST} + {2467258200 -9000 1 NDT} + {2487817800 -12600 0 NST} + {2499312600 -9000 1 NDT} + {2519872200 -12600 0 NST} + {2530762200 -9000 1 NDT} + {2551321800 -12600 0 NST} + {2562211800 -9000 1 NDT} + {2582771400 -12600 0 NST} + {2593661400 -9000 1 NDT} + {2614221000 -12600 0 NST} + {2625111000 -9000 1 NDT} + {2645670600 -12600 0 NST} + {2656560600 -9000 1 NDT} + {2677120200 -12600 0 NST} + {2688615000 -9000 1 NDT} + {2709174600 -12600 0 NST} + {2720064600 -9000 1 NDT} + {2740624200 -12600 0 NST} + {2751514200 -9000 1 NDT} + {2772073800 -12600 0 NST} + {2782963800 -9000 1 NDT} + {2803523400 -12600 0 NST} + {2814413400 -9000 1 NDT} + {2834973000 -12600 0 NST} + {2846467800 -9000 1 NDT} + {2867027400 -12600 0 NST} + {2877917400 -9000 1 NDT} + {2898477000 -12600 0 NST} + {2909367000 -9000 1 NDT} + {2929926600 -12600 0 NST} + {2940816600 -9000 1 NDT} + {2961376200 -12600 0 NST} + {2972266200 -9000 1 NDT} + {2992825800 -12600 0 NST} + {3003715800 -9000 1 NDT} + {3024275400 -12600 0 NST} + {3035770200 -9000 1 NDT} + {3056329800 -12600 0 NST} + {3067219800 -9000 1 NDT} + {3087779400 -12600 0 NST} + {3098669400 -9000 1 NDT} + {3119229000 -12600 0 NST} + {3130119000 -9000 1 NDT} + {3150678600 -12600 0 NST} + {3161568600 -9000 1 NDT} + {3182128200 -12600 0 NST} + {3193018200 -9000 1 NDT} + {3213577800 -12600 0 NST} + {3225072600 -9000 1 NDT} + {3245632200 -12600 0 NST} + {3256522200 -9000 1 NDT} + {3277081800 -12600 0 NST} + {3287971800 -9000 1 NDT} + {3308531400 -12600 0 NST} + {3319421400 -9000 1 NDT} + {3339981000 -12600 0 NST} + {3350871000 -9000 1 NDT} + {3371430600 -12600 0 NST} + {3382925400 -9000 1 NDT} + {3403485000 -12600 0 NST} + {3414375000 -9000 1 NDT} + {3434934600 -12600 0 NST} + {3445824600 -9000 1 NDT} + {3466384200 -12600 0 NST} + {3477274200 -9000 1 NDT} + {3497833800 -12600 0 NST} + {3508723800 -9000 1 NDT} + {3529283400 -12600 0 NST} + {3540173400 -9000 1 NDT} + {3560733000 -12600 0 NST} + {3572227800 -9000 1 NDT} + {3592787400 -12600 0 NST} + {3603677400 -9000 1 NDT} + {3624237000 -12600 0 NST} + {3635127000 -9000 1 NDT} + {3655686600 -12600 0 NST} + {3666576600 -9000 1 NDT} + {3687136200 -12600 0 NST} + {3698026200 -9000 1 NDT} + {3718585800 -12600 0 NST} + {3730080600 -9000 1 NDT} + {3750640200 -12600 0 NST} + {3761530200 -9000 1 NDT} + {3782089800 -12600 0 NST} + {3792979800 -9000 1 NDT} + {3813539400 -12600 0 NST} + {3824429400 -9000 1 NDT} + {3844989000 -12600 0 NST} + {3855879000 -9000 1 NDT} + {3876438600 -12600 0 NST} + {3887328600 -9000 1 NDT} + {3907888200 -12600 0 NST} + {3919383000 -9000 1 NDT} + {3939942600 -12600 0 NST} + {3950832600 -9000 1 NDT} + {3971392200 -12600 0 NST} + {3982282200 -9000 1 NDT} + {4002841800 -12600 0 NST} + {4013731800 -9000 1 NDT} + {4034291400 -12600 0 NST} + {4045181400 -9000 1 NDT} + {4065741000 -12600 0 NST} + {4076631000 -9000 1 NDT} + {4097190600 -12600 0 NST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Kitts b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Kitts new file mode 100644 index 00000000..be7f15a1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Kitts @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/St_Kitts) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Thomas b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Thomas new file mode 100644 index 00000000..f7053976 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Thomas @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/St_Thomas) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Vincent b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Vincent new file mode 100644 index 00000000..289e4836 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/St_Vincent @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/St_Vincent) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Swift_Current b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Swift_Current new file mode 100644 index 00000000..ad077623 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Swift_Current @@ -0,0 +1,29 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Swift_Current) { + {-9223372036854775808 -25880 0 LMT} + {-2030201320 -25200 0 MST} + {-1632063600 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-747241200 -21600 0 MDT} + {-732729600 -25200 0 MST} + {-715791600 -21600 1 MDT} + {-702489600 -25200 0 MST} + {-684342000 -21600 1 MDT} + {-671040000 -25200 0 MST} + {-652892400 -21600 1 MDT} + {-639590400 -25200 0 MST} + {-631126800 -25200 0 MST} + {-400086000 -21600 1 MDT} + {-384364800 -25200 0 MST} + {-337186800 -21600 1 MDT} + {-321465600 -25200 0 MST} + {-305737200 -21600 1 MDT} + {-292435200 -25200 0 MST} + {-273682800 -21600 1 MDT} + {-260985600 -25200 0 MST} + {73472400 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Thule b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Thule new file mode 100644 index 00000000..0aaf9a10 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Thule @@ -0,0 +1,224 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Thule) { + {-9223372036854775808 -16508 0 LMT} + {-1686079492 -14400 0 AST} + {670399200 -10800 1 ADT} + {686120400 -14400 0 AST} + {701848800 -10800 1 ADT} + {717570000 -14400 0 AST} + {733903200 -10800 1 ADT} + {752043600 -14400 0 AST} + {765352800 -10800 1 ADT} + {783493200 -14400 0 AST} + {796802400 -10800 1 ADT} + {814942800 -14400 0 AST} + {828856800 -10800 1 ADT} + {846392400 -14400 0 AST} + {860306400 -10800 1 ADT} + {877842000 -14400 0 AST} + {891756000 -10800 1 ADT} + {909291600 -14400 0 AST} + {923205600 -10800 1 ADT} + {941346000 -14400 0 AST} + {954655200 -10800 1 ADT} + {972795600 -14400 0 AST} + {986104800 -10800 1 ADT} + {1004245200 -14400 0 AST} + {1018159200 -10800 1 ADT} + {1035694800 -14400 0 AST} + {1049608800 -10800 1 ADT} + {1067144400 -14400 0 AST} + {1081058400 -10800 1 ADT} + {1099198800 -14400 0 AST} + {1112508000 -10800 1 ADT} + {1130648400 -14400 0 AST} + {1143957600 -10800 1 ADT} + {1162098000 -14400 0 AST} + {1173592800 -10800 1 ADT} + {1194152400 -14400 0 AST} + {1205042400 -10800 1 ADT} + {1225602000 -14400 0 AST} + {1236492000 -10800 1 ADT} + {1257051600 -14400 0 AST} + {1268546400 -10800 1 ADT} + {1289106000 -14400 0 AST} + {1299996000 -10800 1 ADT} + {1320555600 -14400 0 AST} + {1331445600 -10800 1 ADT} + {1352005200 -14400 0 AST} + {1362895200 -10800 1 ADT} + {1383454800 -14400 0 AST} + {1394344800 -10800 1 ADT} + {1414904400 -14400 0 AST} + {1425794400 -10800 1 ADT} + {1446354000 -14400 0 AST} + {1457848800 -10800 1 ADT} + {1478408400 -14400 0 AST} + {1489298400 -10800 1 ADT} + {1509858000 -14400 0 AST} + {1520748000 -10800 1 ADT} + {1541307600 -14400 0 AST} + {1552197600 -10800 1 ADT} + {1572757200 -14400 0 AST} + {1583647200 -10800 1 ADT} + {1604206800 -14400 0 AST} + {1615701600 -10800 1 ADT} + {1636261200 -14400 0 AST} + {1647151200 -10800 1 ADT} + {1667710800 -14400 0 AST} + {1678600800 -10800 1 ADT} + {1699160400 -14400 0 AST} + {1710050400 -10800 1 ADT} + {1730610000 -14400 0 AST} + {1741500000 -10800 1 ADT} + {1762059600 -14400 0 AST} + {1772949600 -10800 1 ADT} + {1793509200 -14400 0 AST} + {1805004000 -10800 1 ADT} + {1825563600 -14400 0 AST} + {1836453600 -10800 1 ADT} + {1857013200 -14400 0 AST} + {1867903200 -10800 1 ADT} + {1888462800 -14400 0 AST} + {1899352800 -10800 1 ADT} + {1919912400 -14400 0 AST} + {1930802400 -10800 1 ADT} + {1951362000 -14400 0 AST} + {1962856800 -10800 1 ADT} + {1983416400 -14400 0 AST} + {1994306400 -10800 1 ADT} + {2014866000 -14400 0 AST} + {2025756000 -10800 1 ADT} + {2046315600 -14400 0 AST} + {2057205600 -10800 1 ADT} + {2077765200 -14400 0 AST} + {2088655200 -10800 1 ADT} + {2109214800 -14400 0 AST} + {2120104800 -10800 1 ADT} + {2140664400 -14400 0 AST} + {2152159200 -10800 1 ADT} + {2172718800 -14400 0 AST} + {2183608800 -10800 1 ADT} + {2204168400 -14400 0 AST} + {2215058400 -10800 1 ADT} + {2235618000 -14400 0 AST} + {2246508000 -10800 1 ADT} + {2267067600 -14400 0 AST} + {2277957600 -10800 1 ADT} + {2298517200 -14400 0 AST} + {2309407200 -10800 1 ADT} + {2329966800 -14400 0 AST} + {2341461600 -10800 1 ADT} + {2362021200 -14400 0 AST} + {2372911200 -10800 1 ADT} + {2393470800 -14400 0 AST} + {2404360800 -10800 1 ADT} + {2424920400 -14400 0 AST} + {2435810400 -10800 1 ADT} + {2456370000 -14400 0 AST} + {2467260000 -10800 1 ADT} + {2487819600 -14400 0 AST} + {2499314400 -10800 1 ADT} + {2519874000 -14400 0 AST} + {2530764000 -10800 1 ADT} + {2551323600 -14400 0 AST} + {2562213600 -10800 1 ADT} + {2582773200 -14400 0 AST} + {2593663200 -10800 1 ADT} + {2614222800 -14400 0 AST} + {2625112800 -10800 1 ADT} + {2645672400 -14400 0 AST} + {2656562400 -10800 1 ADT} + {2677122000 -14400 0 AST} + {2688616800 -10800 1 ADT} + {2709176400 -14400 0 AST} + {2720066400 -10800 1 ADT} + {2740626000 -14400 0 AST} + {2751516000 -10800 1 ADT} + {2772075600 -14400 0 AST} + {2782965600 -10800 1 ADT} + {2803525200 -14400 0 AST} + {2814415200 -10800 1 ADT} + {2834974800 -14400 0 AST} + {2846469600 -10800 1 ADT} + {2867029200 -14400 0 AST} + {2877919200 -10800 1 ADT} + {2898478800 -14400 0 AST} + {2909368800 -10800 1 ADT} + {2929928400 -14400 0 AST} + {2940818400 -10800 1 ADT} + {2961378000 -14400 0 AST} + {2972268000 -10800 1 ADT} + {2992827600 -14400 0 AST} + {3003717600 -10800 1 ADT} + {3024277200 -14400 0 AST} + {3035772000 -10800 1 ADT} + {3056331600 -14400 0 AST} + {3067221600 -10800 1 ADT} + {3087781200 -14400 0 AST} + {3098671200 -10800 1 ADT} + {3119230800 -14400 0 AST} + {3130120800 -10800 1 ADT} + {3150680400 -14400 0 AST} + {3161570400 -10800 1 ADT} + {3182130000 -14400 0 AST} + {3193020000 -10800 1 ADT} + {3213579600 -14400 0 AST} + {3225074400 -10800 1 ADT} + {3245634000 -14400 0 AST} + {3256524000 -10800 1 ADT} + {3277083600 -14400 0 AST} + {3287973600 -10800 1 ADT} + {3308533200 -14400 0 AST} + {3319423200 -10800 1 ADT} + {3339982800 -14400 0 AST} + {3350872800 -10800 1 ADT} + {3371432400 -14400 0 AST} + {3382927200 -10800 1 ADT} + {3403486800 -14400 0 AST} + {3414376800 -10800 1 ADT} + {3434936400 -14400 0 AST} + {3445826400 -10800 1 ADT} + {3466386000 -14400 0 AST} + {3477276000 -10800 1 ADT} + {3497835600 -14400 0 AST} + {3508725600 -10800 1 ADT} + {3529285200 -14400 0 AST} + {3540175200 -10800 1 ADT} + {3560734800 -14400 0 AST} + {3572229600 -10800 1 ADT} + {3592789200 -14400 0 AST} + {3603679200 -10800 1 ADT} + {3624238800 -14400 0 AST} + {3635128800 -10800 1 ADT} + {3655688400 -14400 0 AST} + {3666578400 -10800 1 ADT} + {3687138000 -14400 0 AST} + {3698028000 -10800 1 ADT} + {3718587600 -14400 0 AST} + {3730082400 -10800 1 ADT} + {3750642000 -14400 0 AST} + {3761532000 -10800 1 ADT} + {3782091600 -14400 0 AST} + {3792981600 -10800 1 ADT} + {3813541200 -14400 0 AST} + {3824431200 -10800 1 ADT} + {3844990800 -14400 0 AST} + {3855880800 -10800 1 ADT} + {3876440400 -14400 0 AST} + {3887330400 -10800 1 ADT} + {3907890000 -14400 0 AST} + {3919384800 -10800 1 ADT} + {3939944400 -14400 0 AST} + {3950834400 -10800 1 ADT} + {3971394000 -14400 0 AST} + {3982284000 -10800 1 ADT} + {4002843600 -14400 0 AST} + {4013733600 -10800 1 ADT} + {4034293200 -14400 0 AST} + {4045183200 -10800 1 ADT} + {4065742800 -14400 0 AST} + {4076632800 -10800 1 ADT} + {4097192400 -14400 0 AST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Thunder_Bay b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Thunder_Bay new file mode 100644 index 00000000..4761beb6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Thunder_Bay @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Toronto)]} { + LoadTimeZoneFile America/Toronto +} +set TZData(:America/Thunder_Bay) $TZData(:America/Toronto) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Toronto b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Toronto new file mode 100644 index 00000000..09bf7866 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Toronto @@ -0,0 +1,365 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Toronto) { + {-9223372036854775808 -19052 0 LMT} + {-2366736148 -18000 0 EST} + {-1632070800 -14400 1 EDT} + {-1615140000 -18000 0 EST} + {-1609441200 -18000 0 EST} + {-1601753400 -14400 1 EDT} + {-1583697600 -18000 0 EST} + {-1567357200 -14400 1 EDT} + {-1554667200 -18000 0 EST} + {-1534698000 -14400 1 EDT} + {-1524074400 -18000 0 EST} + {-1503248400 -14400 1 EDT} + {-1492365600 -18000 0 EST} + {-1471798800 -14400 1 EDT} + {-1460916000 -18000 0 EST} + {-1440954000 -14400 1 EDT} + {-1428861600 -18000 0 EST} + {-1409504400 -14400 1 EDT} + {-1397412000 -18000 0 EST} + {-1378054800 -14400 1 EDT} + {-1365962400 -18000 0 EST} + {-1346605200 -14400 1 EDT} + {-1333908000 -18000 0 EST} + {-1315155600 -14400 1 EDT} + {-1301853600 -18000 0 EST} + {-1283706000 -14400 1 EDT} + {-1270404000 -18000 0 EST} + {-1252256400 -14400 1 EDT} + {-1238954400 -18000 0 EST} + {-1220806800 -14400 1 EDT} + {-1207504800 -18000 0 EST} + {-1188752400 -14400 1 EDT} + {-1176055200 -18000 0 EST} + {-1157302800 -14400 1 EDT} + {-1144000800 -18000 0 EST} + {-1125853200 -14400 1 EDT} + {-1112551200 -18000 0 EST} + {-1094403600 -14400 1 EDT} + {-1081101600 -18000 0 EST} + {-1062954000 -14400 1 EDT} + {-1049652000 -18000 0 EST} + {-1031504400 -14400 1 EDT} + {-1018202400 -18000 0 EST} + {-1000054800 -14400 1 EDT} + {-986752800 -18000 0 EST} + {-968000400 -14400 1 EDT} + {-955303200 -18000 0 EST} + {-936550800 -14400 1 EDT} + {-880218000 -14400 0 EWT} + {-769395600 -14400 1 EPT} + {-765396000 -18000 0 EST} + {-757364400 -18000 0 EST} + {-747248400 -14400 1 EDT} + {-733946400 -18000 0 EST} + {-715806000 -14400 1 EDT} + {-702504000 -18000 0 EST} + {-684356400 -14400 1 EDT} + {-671054400 -18000 0 EST} + {-652906800 -14400 1 EDT} + {-634161600 -18000 0 EST} + {-620845200 -14400 1 EDT} + {-602704800 -18000 0 EST} + {-589395600 -14400 1 EDT} + {-576093600 -18000 0 EST} + {-557946000 -14400 1 EDT} + {-544644000 -18000 0 EST} + {-526496400 -14400 1 EDT} + {-513194400 -18000 0 EST} + {-495046800 -14400 1 EDT} + {-481744800 -18000 0 EST} + {-463597200 -14400 1 EDT} + {-450295200 -18000 0 EST} + {-431542800 -14400 1 EDT} + {-418240800 -18000 0 EST} + {-400093200 -14400 1 EDT} + {-384372000 -18000 0 EST} + {-368643600 -14400 1 EDT} + {-352922400 -18000 0 EST} + {-337194000 -14400 1 EDT} + {-321472800 -18000 0 EST} + {-305744400 -14400 1 EDT} + {-289418400 -18000 0 EST} + {-273690000 -14400 1 EDT} + {-257968800 -18000 0 EST} + {-242240400 -14400 1 EDT} + {-226519200 -18000 0 EST} + {-210790800 -14400 1 EDT} + {-195069600 -18000 0 EST} + {-179341200 -14400 1 EDT} + {-163620000 -18000 0 EST} + {-147891600 -14400 1 EDT} + {-131565600 -18000 0 EST} + {-116442000 -14400 1 EDT} + {-100116000 -18000 0 EST} + {-84387600 -14400 1 EDT} + {-68666400 -18000 0 EST} + {-52938000 -14400 1 EDT} + {-37216800 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {126248400 -18000 0 EST} + {136364400 -14400 1 EDT} + {152085600 -18000 0 EST} + {167814000 -14400 1 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Vancouver b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Vancouver new file mode 100644 index 00000000..795e9e0c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Vancouver @@ -0,0 +1,320 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Vancouver) { + {-9223372036854775808 -29548 0 LMT} + {-2713880852 -28800 0 PST} + {-1632060000 -25200 1 PDT} + {-1615129200 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-747237600 -25200 1 PDT} + {-733935600 -28800 0 PST} + {-715788000 -25200 1 PDT} + {-702486000 -28800 0 PST} + {-684338400 -25200 1 PDT} + {-671036400 -28800 0 PST} + {-652888800 -25200 1 PDT} + {-639586800 -28800 0 PST} + {-620834400 -25200 1 PDT} + {-608137200 -28800 0 PST} + {-589384800 -25200 1 PDT} + {-576082800 -28800 0 PST} + {-557935200 -25200 1 PDT} + {-544633200 -28800 0 PST} + {-526485600 -25200 1 PDT} + {-513183600 -28800 0 PST} + {-495036000 -25200 1 PDT} + {-481734000 -28800 0 PST} + {-463586400 -25200 1 PDT} + {-450284400 -28800 0 PST} + {-431532000 -25200 1 PDT} + {-418230000 -28800 0 PST} + {-400082400 -25200 1 PDT} + {-386780400 -28800 0 PST} + {-368632800 -25200 1 PDT} + {-355330800 -28800 0 PST} + {-337183200 -25200 1 PDT} + {-323881200 -28800 0 PST} + {-305733600 -25200 1 PDT} + {-292431600 -28800 0 PST} + {-273679200 -25200 1 PDT} + {-260982000 -28800 0 PST} + {-242229600 -25200 1 PDT} + {-226508400 -28800 0 PST} + {-210780000 -25200 1 PDT} + {-195058800 -28800 0 PST} + {-179330400 -25200 1 PDT} + {-163609200 -28800 0 PST} + {-147880800 -25200 1 PDT} + {-131554800 -28800 0 PST} + {-116431200 -25200 1 PDT} + {-100105200 -28800 0 PST} + {-84376800 -25200 1 PDT} + {-68655600 -28800 0 PST} + {-52927200 -25200 1 PDT} + {-37206000 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {89197200 -28800 0 PST} + {104925600 -25200 1 PDT} + {120646800 -28800 0 PST} + {136375200 -25200 1 PDT} + {152096400 -28800 0 PST} + {167824800 -25200 1 PDT} + {183546000 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {536486400 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1173607200 -25200 1 PDT} + {1194166800 -28800 0 PST} + {1205056800 -25200 1 PDT} + {1225616400 -28800 0 PST} + {1236506400 -25200 1 PDT} + {1257066000 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 1 PDT} + {1446368400 -28800 0 PST} + {1457863200 -25200 1 PDT} + {1478422800 -28800 0 PST} + {1489312800 -25200 1 PDT} + {1509872400 -28800 0 PST} + {1520762400 -25200 1 PDT} + {1541322000 -28800 0 PST} + {1552212000 -25200 1 PDT} + {1572771600 -28800 0 PST} + {1583661600 -25200 1 PDT} + {1604221200 -28800 0 PST} + {1615716000 -25200 1 PDT} + {1636275600 -28800 0 PST} + {1647165600 -25200 1 PDT} + {1667725200 -28800 0 PST} + {1678615200 -25200 1 PDT} + {1699174800 -28800 0 PST} + {1710064800 -25200 1 PDT} + {1730624400 -28800 0 PST} + {1741514400 -25200 1 PDT} + {1762074000 -28800 0 PST} + {1772964000 -25200 1 PDT} + {1793523600 -28800 0 PST} + {1805018400 -25200 1 PDT} + {1825578000 -28800 0 PST} + {1836468000 -25200 1 PDT} + {1857027600 -28800 0 PST} + {1867917600 -25200 1 PDT} + {1888477200 -28800 0 PST} + {1899367200 -25200 1 PDT} + {1919926800 -28800 0 PST} + {1930816800 -25200 1 PDT} + {1951376400 -28800 0 PST} + {1962871200 -25200 1 PDT} + {1983430800 -28800 0 PST} + {1994320800 -25200 1 PDT} + {2014880400 -28800 0 PST} + {2025770400 -25200 1 PDT} + {2046330000 -28800 0 PST} + {2057220000 -25200 1 PDT} + {2077779600 -28800 0 PST} + {2088669600 -25200 1 PDT} + {2109229200 -28800 0 PST} + {2120119200 -25200 1 PDT} + {2140678800 -28800 0 PST} + {2152173600 -25200 1 PDT} + {2172733200 -28800 0 PST} + {2183623200 -25200 1 PDT} + {2204182800 -28800 0 PST} + {2215072800 -25200 1 PDT} + {2235632400 -28800 0 PST} + {2246522400 -25200 1 PDT} + {2267082000 -28800 0 PST} + {2277972000 -25200 1 PDT} + {2298531600 -28800 0 PST} + {2309421600 -25200 1 PDT} + {2329981200 -28800 0 PST} + {2341476000 -25200 1 PDT} + {2362035600 -28800 0 PST} + {2372925600 -25200 1 PDT} + {2393485200 -28800 0 PST} + {2404375200 -25200 1 PDT} + {2424934800 -28800 0 PST} + {2435824800 -25200 1 PDT} + {2456384400 -28800 0 PST} + {2467274400 -25200 1 PDT} + {2487834000 -28800 0 PST} + {2499328800 -25200 1 PDT} + {2519888400 -28800 0 PST} + {2530778400 -25200 1 PDT} + {2551338000 -28800 0 PST} + {2562228000 -25200 1 PDT} + {2582787600 -28800 0 PST} + {2593677600 -25200 1 PDT} + {2614237200 -28800 0 PST} + {2625127200 -25200 1 PDT} + {2645686800 -28800 0 PST} + {2656576800 -25200 1 PDT} + {2677136400 -28800 0 PST} + {2688631200 -25200 1 PDT} + {2709190800 -28800 0 PST} + {2720080800 -25200 1 PDT} + {2740640400 -28800 0 PST} + {2751530400 -25200 1 PDT} + {2772090000 -28800 0 PST} + {2782980000 -25200 1 PDT} + {2803539600 -28800 0 PST} + {2814429600 -25200 1 PDT} + {2834989200 -28800 0 PST} + {2846484000 -25200 1 PDT} + {2867043600 -28800 0 PST} + {2877933600 -25200 1 PDT} + {2898493200 -28800 0 PST} + {2909383200 -25200 1 PDT} + {2929942800 -28800 0 PST} + {2940832800 -25200 1 PDT} + {2961392400 -28800 0 PST} + {2972282400 -25200 1 PDT} + {2992842000 -28800 0 PST} + {3003732000 -25200 1 PDT} + {3024291600 -28800 0 PST} + {3035786400 -25200 1 PDT} + {3056346000 -28800 0 PST} + {3067236000 -25200 1 PDT} + {3087795600 -28800 0 PST} + {3098685600 -25200 1 PDT} + {3119245200 -28800 0 PST} + {3130135200 -25200 1 PDT} + {3150694800 -28800 0 PST} + {3161584800 -25200 1 PDT} + {3182144400 -28800 0 PST} + {3193034400 -25200 1 PDT} + {3213594000 -28800 0 PST} + {3225088800 -25200 1 PDT} + {3245648400 -28800 0 PST} + {3256538400 -25200 1 PDT} + {3277098000 -28800 0 PST} + {3287988000 -25200 1 PDT} + {3308547600 -28800 0 PST} + {3319437600 -25200 1 PDT} + {3339997200 -28800 0 PST} + {3350887200 -25200 1 PDT} + {3371446800 -28800 0 PST} + {3382941600 -25200 1 PDT} + {3403501200 -28800 0 PST} + {3414391200 -25200 1 PDT} + {3434950800 -28800 0 PST} + {3445840800 -25200 1 PDT} + {3466400400 -28800 0 PST} + {3477290400 -25200 1 PDT} + {3497850000 -28800 0 PST} + {3508740000 -25200 1 PDT} + {3529299600 -28800 0 PST} + {3540189600 -25200 1 PDT} + {3560749200 -28800 0 PST} + {3572244000 -25200 1 PDT} + {3592803600 -28800 0 PST} + {3603693600 -25200 1 PDT} + {3624253200 -28800 0 PST} + {3635143200 -25200 1 PDT} + {3655702800 -28800 0 PST} + {3666592800 -25200 1 PDT} + {3687152400 -28800 0 PST} + {3698042400 -25200 1 PDT} + {3718602000 -28800 0 PST} + {3730096800 -25200 1 PDT} + {3750656400 -28800 0 PST} + {3761546400 -25200 1 PDT} + {3782106000 -28800 0 PST} + {3792996000 -25200 1 PDT} + {3813555600 -28800 0 PST} + {3824445600 -25200 1 PDT} + {3845005200 -28800 0 PST} + {3855895200 -25200 1 PDT} + {3876454800 -28800 0 PST} + {3887344800 -25200 1 PDT} + {3907904400 -28800 0 PST} + {3919399200 -25200 1 PDT} + {3939958800 -28800 0 PST} + {3950848800 -25200 1 PDT} + {3971408400 -28800 0 PST} + {3982298400 -25200 1 PDT} + {4002858000 -28800 0 PST} + {4013748000 -25200 1 PDT} + {4034307600 -28800 0 PST} + {4045197600 -25200 1 PDT} + {4065757200 -28800 0 PST} + {4076647200 -25200 1 PDT} + {4097206800 -28800 0 PST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Virgin b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Virgin new file mode 100644 index 00000000..a34eb12f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Virgin @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:America/Virgin) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Whitehorse b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Whitehorse new file mode 100644 index 00000000..498a203a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Whitehorse @@ -0,0 +1,98 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Whitehorse) { + {-9223372036854775808 -32412 0 LMT} + {-2188997988 -32400 0 YST} + {-1632056400 -28800 1 YDT} + {-1615125600 -32400 0 YST} + {-1596978000 -28800 1 YDT} + {-1583164800 -32400 0 YST} + {-880203600 -28800 1 YWT} + {-769395600 -28800 1 YPT} + {-765381600 -32400 0 YST} + {-147884400 -25200 1 YDDT} + {-131554800 -32400 0 YST} + {315561600 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1173607200 -25200 1 PDT} + {1194166800 -28800 0 PST} + {1205056800 -25200 1 PDT} + {1225616400 -28800 0 PST} + {1236506400 -25200 1 PDT} + {1257066000 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 1 PDT} + {1446368400 -28800 0 PST} + {1457863200 -25200 1 PDT} + {1478422800 -28800 0 PST} + {1489312800 -25200 1 PDT} + {1509872400 -28800 0 PST} + {1520762400 -25200 1 PDT} + {1541322000 -28800 0 PST} + {1552212000 -25200 1 PDT} + {1572771600 -28800 0 PST} + {1583661600 -25200 1 PDT} + {1604217600 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Winnipeg b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Winnipeg new file mode 100644 index 00000000..e6efe47f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Winnipeg @@ -0,0 +1,316 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Winnipeg) { + {-9223372036854775808 -23316 0 LMT} + {-2602258284 -21600 0 CST} + {-1694368800 -18000 1 CDT} + {-1681671600 -21600 0 CST} + {-1632067200 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1029686400 -18000 1 CDT} + {-1018198800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-746035200 -18000 1 CDT} + {-732733200 -21600 0 CST} + {-715795200 -18000 1 CDT} + {-702493200 -21600 0 CST} + {-684345600 -18000 1 CDT} + {-671043600 -21600 0 CST} + {-652896000 -18000 1 CDT} + {-639594000 -21600 0 CST} + {-620755200 -18000 1 CDT} + {-607626000 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-557942400 -18000 1 CDT} + {-544640400 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 1 CDT} + {-450291600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-418237200 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-321469200 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-292438800 -21600 0 CST} + {-210787200 -18000 1 CDT} + {-198090000 -21600 0 CST} + {-116438400 -18000 1 CDT} + {-100108800 -21600 0 CST} + {-84384000 -18000 1 CDT} + {-68659200 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37209600 -21600 0 CST} + {-21484800 -18000 1 CDT} + {-5760000 -21600 0 CST} + {9964800 -18000 1 CDT} + {25689600 -21600 0 CST} + {41414400 -18000 1 CDT} + {57744000 -21600 0 CST} + {73468800 -18000 1 CDT} + {89193600 -21600 0 CST} + {104918400 -18000 1 CDT} + {120643200 -21600 0 CST} + {136368000 -18000 1 CDT} + {152092800 -21600 0 CST} + {167817600 -18000 1 CDT} + {183542400 -21600 0 CST} + {199267200 -18000 1 CDT} + {215596800 -21600 0 CST} + {230716800 -18000 1 CDT} + {247046400 -21600 0 CST} + {262771200 -18000 1 CDT} + {278496000 -21600 0 CST} + {294220800 -18000 1 CDT} + {309945600 -21600 0 CST} + {325670400 -18000 1 CDT} + {341395200 -21600 0 CST} + {357120000 -18000 1 CDT} + {372844800 -21600 0 CST} + {388569600 -18000 1 CDT} + {404899200 -21600 0 CST} + {420019200 -18000 1 CDT} + {436348800 -21600 0 CST} + {452073600 -18000 1 CDT} + {467798400 -21600 0 CST} + {483523200 -18000 1 CDT} + {499248000 -21600 0 CST} + {514972800 -18000 1 CDT} + {530697600 -21600 0 CST} + {544608000 -18000 1 CDT} + {562147200 -21600 0 CST} + {576057600 -18000 1 CDT} + {594201600 -21600 0 CST} + {607507200 -18000 1 CDT} + {625651200 -21600 0 CST} + {638956800 -18000 1 CDT} + {657100800 -21600 0 CST} + {671011200 -18000 1 CDT} + {688550400 -21600 0 CST} + {702460800 -18000 1 CDT} + {720000000 -21600 0 CST} + {733910400 -18000 1 CDT} + {752054400 -21600 0 CST} + {765360000 -18000 1 CDT} + {783504000 -21600 0 CST} + {796809600 -18000 1 CDT} + {814953600 -21600 0 CST} + {828864000 -18000 1 CDT} + {846403200 -21600 0 CST} + {860313600 -18000 1 CDT} + {877852800 -21600 0 CST} + {891763200 -18000 1 CDT} + {909302400 -21600 0 CST} + {923212800 -18000 1 CDT} + {941356800 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -21600 0 CST} + {986112000 -18000 1 CDT} + {1004256000 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035705600 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067155200 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099209600 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130659200 -21600 0 CST} + {1136095200 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Yakutat b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Yakutat new file mode 100644 index 00000000..b1d66ff5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Yakutat @@ -0,0 +1,276 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Yakutat) { + {-9223372036854775808 52865 0 LMT} + {-3225223727 -33535 0 LMT} + {-2188953665 -32400 0 YST} + {-883580400 -32400 0 YST} + {-880203600 -28800 1 YWT} + {-769395600 -28800 1 YPT} + {-765381600 -32400 0 YST} + {-757350000 -32400 0 YST} + {-31503600 -32400 0 YST} + {-21474000 -28800 1 YDT} + {-5752800 -32400 0 YST} + {9975600 -28800 1 YDT} + {25696800 -32400 0 YST} + {41425200 -28800 1 YDT} + {57751200 -32400 0 YST} + {73479600 -28800 1 YDT} + {89200800 -32400 0 YST} + {104929200 -28800 1 YDT} + {120650400 -32400 0 YST} + {126702000 -28800 1 YDT} + {152100000 -32400 0 YST} + {162385200 -28800 1 YDT} + {183549600 -32400 0 YST} + {199278000 -28800 1 YDT} + {215604000 -32400 0 YST} + {230727600 -28800 1 YDT} + {247053600 -32400 0 YST} + {262782000 -28800 1 YDT} + {278503200 -32400 0 YST} + {294231600 -28800 1 YDT} + {309952800 -32400 0 YST} + {325681200 -28800 1 YDT} + {341402400 -32400 0 YST} + {357130800 -28800 1 YDT} + {372852000 -32400 0 YST} + {388580400 -28800 1 YDT} + {404906400 -32400 0 YST} + {420030000 -28800 1 YDT} + {436356000 -32400 0 YST} + {439030800 -32400 0 AKST} + {452084400 -28800 1 AKDT} + {467805600 -32400 0 AKST} + {483534000 -28800 1 AKDT} + {499255200 -32400 0 AKST} + {514983600 -28800 1 AKDT} + {530704800 -32400 0 AKST} + {544618800 -28800 1 AKDT} + {562154400 -32400 0 AKST} + {576068400 -28800 1 AKDT} + {594208800 -32400 0 AKST} + {607518000 -28800 1 AKDT} + {625658400 -32400 0 AKST} + {638967600 -28800 1 AKDT} + {657108000 -32400 0 AKST} + {671022000 -28800 1 AKDT} + {688557600 -32400 0 AKST} + {702471600 -28800 1 AKDT} + {720007200 -32400 0 AKST} + {733921200 -28800 1 AKDT} + {752061600 -32400 0 AKST} + {765370800 -28800 1 AKDT} + {783511200 -32400 0 AKST} + {796820400 -28800 1 AKDT} + {814960800 -32400 0 AKST} + {828874800 -28800 1 AKDT} + {846410400 -32400 0 AKST} + {860324400 -28800 1 AKDT} + {877860000 -32400 0 AKST} + {891774000 -28800 1 AKDT} + {909309600 -32400 0 AKST} + {923223600 -28800 1 AKDT} + {941364000 -32400 0 AKST} + {954673200 -28800 1 AKDT} + {972813600 -32400 0 AKST} + {986122800 -28800 1 AKDT} + {1004263200 -32400 0 AKST} + {1018177200 -28800 1 AKDT} + {1035712800 -32400 0 AKST} + {1049626800 -28800 1 AKDT} + {1067162400 -32400 0 AKST} + {1081076400 -28800 1 AKDT} + {1099216800 -32400 0 AKST} + {1112526000 -28800 1 AKDT} + {1130666400 -32400 0 AKST} + {1143975600 -28800 1 AKDT} + {1162116000 -32400 0 AKST} + {1173610800 -28800 1 AKDT} + {1194170400 -32400 0 AKST} + {1205060400 -28800 1 AKDT} + {1225620000 -32400 0 AKST} + {1236510000 -28800 1 AKDT} + {1257069600 -32400 0 AKST} + {1268564400 -28800 1 AKDT} + {1289124000 -32400 0 AKST} + {1300014000 -28800 1 AKDT} + {1320573600 -32400 0 AKST} + {1331463600 -28800 1 AKDT} + {1352023200 -32400 0 AKST} + {1362913200 -28800 1 AKDT} + {1383472800 -32400 0 AKST} + {1394362800 -28800 1 AKDT} + {1414922400 -32400 0 AKST} + {1425812400 -28800 1 AKDT} + {1446372000 -32400 0 AKST} + {1457866800 -28800 1 AKDT} + {1478426400 -32400 0 AKST} + {1489316400 -28800 1 AKDT} + {1509876000 -32400 0 AKST} + {1520766000 -28800 1 AKDT} + {1541325600 -32400 0 AKST} + {1552215600 -28800 1 AKDT} + {1572775200 -32400 0 AKST} + {1583665200 -28800 1 AKDT} + {1604224800 -32400 0 AKST} + {1615719600 -28800 1 AKDT} + {1636279200 -32400 0 AKST} + {1647169200 -28800 1 AKDT} + {1667728800 -32400 0 AKST} + {1678618800 -28800 1 AKDT} + {1699178400 -32400 0 AKST} + {1710068400 -28800 1 AKDT} + {1730628000 -32400 0 AKST} + {1741518000 -28800 1 AKDT} + {1762077600 -32400 0 AKST} + {1772967600 -28800 1 AKDT} + {1793527200 -32400 0 AKST} + {1805022000 -28800 1 AKDT} + {1825581600 -32400 0 AKST} + {1836471600 -28800 1 AKDT} + {1857031200 -32400 0 AKST} + {1867921200 -28800 1 AKDT} + {1888480800 -32400 0 AKST} + {1899370800 -28800 1 AKDT} + {1919930400 -32400 0 AKST} + {1930820400 -28800 1 AKDT} + {1951380000 -32400 0 AKST} + {1962874800 -28800 1 AKDT} + {1983434400 -32400 0 AKST} + {1994324400 -28800 1 AKDT} + {2014884000 -32400 0 AKST} + {2025774000 -28800 1 AKDT} + {2046333600 -32400 0 AKST} + {2057223600 -28800 1 AKDT} + {2077783200 -32400 0 AKST} + {2088673200 -28800 1 AKDT} + {2109232800 -32400 0 AKST} + {2120122800 -28800 1 AKDT} + {2140682400 -32400 0 AKST} + {2152177200 -28800 1 AKDT} + {2172736800 -32400 0 AKST} + {2183626800 -28800 1 AKDT} + {2204186400 -32400 0 AKST} + {2215076400 -28800 1 AKDT} + {2235636000 -32400 0 AKST} + {2246526000 -28800 1 AKDT} + {2267085600 -32400 0 AKST} + {2277975600 -28800 1 AKDT} + {2298535200 -32400 0 AKST} + {2309425200 -28800 1 AKDT} + {2329984800 -32400 0 AKST} + {2341479600 -28800 1 AKDT} + {2362039200 -32400 0 AKST} + {2372929200 -28800 1 AKDT} + {2393488800 -32400 0 AKST} + {2404378800 -28800 1 AKDT} + {2424938400 -32400 0 AKST} + {2435828400 -28800 1 AKDT} + {2456388000 -32400 0 AKST} + {2467278000 -28800 1 AKDT} + {2487837600 -32400 0 AKST} + {2499332400 -28800 1 AKDT} + {2519892000 -32400 0 AKST} + {2530782000 -28800 1 AKDT} + {2551341600 -32400 0 AKST} + {2562231600 -28800 1 AKDT} + {2582791200 -32400 0 AKST} + {2593681200 -28800 1 AKDT} + {2614240800 -32400 0 AKST} + {2625130800 -28800 1 AKDT} + {2645690400 -32400 0 AKST} + {2656580400 -28800 1 AKDT} + {2677140000 -32400 0 AKST} + {2688634800 -28800 1 AKDT} + {2709194400 -32400 0 AKST} + {2720084400 -28800 1 AKDT} + {2740644000 -32400 0 AKST} + {2751534000 -28800 1 AKDT} + {2772093600 -32400 0 AKST} + {2782983600 -28800 1 AKDT} + {2803543200 -32400 0 AKST} + {2814433200 -28800 1 AKDT} + {2834992800 -32400 0 AKST} + {2846487600 -28800 1 AKDT} + {2867047200 -32400 0 AKST} + {2877937200 -28800 1 AKDT} + {2898496800 -32400 0 AKST} + {2909386800 -28800 1 AKDT} + {2929946400 -32400 0 AKST} + {2940836400 -28800 1 AKDT} + {2961396000 -32400 0 AKST} + {2972286000 -28800 1 AKDT} + {2992845600 -32400 0 AKST} + {3003735600 -28800 1 AKDT} + {3024295200 -32400 0 AKST} + {3035790000 -28800 1 AKDT} + {3056349600 -32400 0 AKST} + {3067239600 -28800 1 AKDT} + {3087799200 -32400 0 AKST} + {3098689200 -28800 1 AKDT} + {3119248800 -32400 0 AKST} + {3130138800 -28800 1 AKDT} + {3150698400 -32400 0 AKST} + {3161588400 -28800 1 AKDT} + {3182148000 -32400 0 AKST} + {3193038000 -28800 1 AKDT} + {3213597600 -32400 0 AKST} + {3225092400 -28800 1 AKDT} + {3245652000 -32400 0 AKST} + {3256542000 -28800 1 AKDT} + {3277101600 -32400 0 AKST} + {3287991600 -28800 1 AKDT} + {3308551200 -32400 0 AKST} + {3319441200 -28800 1 AKDT} + {3340000800 -32400 0 AKST} + {3350890800 -28800 1 AKDT} + {3371450400 -32400 0 AKST} + {3382945200 -28800 1 AKDT} + {3403504800 -32400 0 AKST} + {3414394800 -28800 1 AKDT} + {3434954400 -32400 0 AKST} + {3445844400 -28800 1 AKDT} + {3466404000 -32400 0 AKST} + {3477294000 -28800 1 AKDT} + {3497853600 -32400 0 AKST} + {3508743600 -28800 1 AKDT} + {3529303200 -32400 0 AKST} + {3540193200 -28800 1 AKDT} + {3560752800 -32400 0 AKST} + {3572247600 -28800 1 AKDT} + {3592807200 -32400 0 AKST} + {3603697200 -28800 1 AKDT} + {3624256800 -32400 0 AKST} + {3635146800 -28800 1 AKDT} + {3655706400 -32400 0 AKST} + {3666596400 -28800 1 AKDT} + {3687156000 -32400 0 AKST} + {3698046000 -28800 1 AKDT} + {3718605600 -32400 0 AKST} + {3730100400 -28800 1 AKDT} + {3750660000 -32400 0 AKST} + {3761550000 -28800 1 AKDT} + {3782109600 -32400 0 AKST} + {3792999600 -28800 1 AKDT} + {3813559200 -32400 0 AKST} + {3824449200 -28800 1 AKDT} + {3845008800 -32400 0 AKST} + {3855898800 -28800 1 AKDT} + {3876458400 -32400 0 AKST} + {3887348400 -28800 1 AKDT} + {3907908000 -32400 0 AKST} + {3919402800 -28800 1 AKDT} + {3939962400 -32400 0 AKST} + {3950852400 -28800 1 AKDT} + {3971412000 -32400 0 AKST} + {3982302000 -28800 1 AKDT} + {4002861600 -32400 0 AKST} + {4013751600 -28800 1 AKDT} + {4034311200 -32400 0 AKST} + {4045201200 -28800 1 AKDT} + {4065760800 -32400 0 AKST} + {4076650800 -28800 1 AKDT} + {4097210400 -32400 0 AKST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Yellowknife b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Yellowknife new file mode 100644 index 00000000..c6c4ed55 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/America/Yellowknife @@ -0,0 +1,252 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Yellowknife) { + {-9223372036854775808 0 0 -00} + {-1104537600 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-147891600 -18000 1 MDDT} + {-131562000 -25200 0 MST} + {315558000 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Casey b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Casey new file mode 100644 index 00000000..56935e32 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Casey @@ -0,0 +1,17 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Casey) { + {-9223372036854775808 0 0 -00} + {-31536000 28800 0 +08} + {1255802400 39600 0 +11} + {1267714800 28800 0 +08} + {1319738400 39600 0 +11} + {1329843600 28800 0 +08} + {1477065600 39600 0 +11} + {1520701200 28800 0 +08} + {1538856000 39600 0 +11} + {1552752000 28800 0 +08} + {1570129200 39600 0 +11} + {1583596800 28800 0 +08} + {1601740860 39600 0 +11} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Davis b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Davis new file mode 100644 index 00000000..9bb178bf --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Davis @@ -0,0 +1,12 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Davis) { + {-9223372036854775808 0 0 -00} + {-409190400 25200 0 +07} + {-163062000 0 0 -00} + {-28857600 25200 0 +07} + {1255806000 18000 0 +05} + {1268251200 25200 0 +07} + {1319742000 18000 0 +05} + {1329854400 25200 0 +07} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/DumontDUrville b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/DumontDUrville new file mode 100644 index 00000000..43c1263d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/DumontDUrville @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Port_Moresby)]} { + LoadTimeZoneFile Pacific/Port_Moresby +} +set TZData(:Antarctica/DumontDUrville) $TZData(:Pacific/Port_Moresby) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Macquarie b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Macquarie new file mode 100644 index 00000000..82b2b9ff --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Macquarie @@ -0,0 +1,276 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Macquarie) { + {-9223372036854775808 0 0 -00} + {-2214259200 36000 0 AEST} + {-1680508800 39600 1 AEDT} + {-1669892400 39600 0 AEDT} + {-1665388800 36000 0 AEST} + {-1601719200 0 0 -00} + {-94730400 36000 0 AEST} + {-71136000 39600 1 AEDT} + {-55411200 36000 0 AEST} + {-37267200 39600 1 AEDT} + {-25776000 36000 0 AEST} + {-5817600 39600 1 AEDT} + {5673600 36000 0 AEST} + {25632000 39600 1 AEDT} + {37728000 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {89136000 39600 1 AEDT} + {100022400 36000 0 AEST} + {120585600 39600 1 AEDT} + {131472000 36000 0 AEST} + {152035200 39600 1 AEDT} + {162921600 36000 0 AEST} + {183484800 39600 1 AEDT} + {194976000 36000 0 AEST} + {215539200 39600 1 AEDT} + {226425600 36000 0 AEST} + {246988800 39600 1 AEDT} + {257875200 36000 0 AEST} + {278438400 39600 1 AEDT} + {289324800 36000 0 AEST} + {309888000 39600 1 AEDT} + {320774400 36000 0 AEST} + {341337600 39600 1 AEDT} + {352224000 36000 0 AEST} + {372787200 39600 1 AEDT} + {386092800 36000 0 AEST} + {404841600 39600 1 AEDT} + {417542400 36000 0 AEST} + {436291200 39600 1 AEDT} + {447177600 36000 0 AEST} + {467740800 39600 1 AEDT} + {478627200 36000 0 AEST} + {499190400 39600 1 AEDT} + {510076800 36000 0 AEST} + {530035200 39600 1 AEDT} + {542736000 36000 0 AEST} + {562089600 39600 1 AEDT} + {574790400 36000 0 AEST} + {594144000 39600 1 AEDT} + {606240000 36000 0 AEST} + {625593600 39600 1 AEDT} + {637689600 36000 0 AEST} + {657043200 39600 1 AEDT} + {670348800 36000 0 AEST} + {686678400 39600 1 AEDT} + {701798400 36000 0 AEST} + {718128000 39600 1 AEDT} + {733248000 36000 0 AEST} + {749577600 39600 1 AEDT} + {764697600 36000 0 AEST} + {781027200 39600 1 AEDT} + {796147200 36000 0 AEST} + {812476800 39600 1 AEDT} + {828201600 36000 0 AEST} + {844531200 39600 1 AEDT} + {859651200 36000 0 AEST} + {875980800 39600 1 AEDT} + {891100800 36000 0 AEST} + {907430400 39600 1 AEDT} + {922550400 36000 0 AEST} + {938880000 39600 1 AEDT} + {954000000 36000 0 AEST} + {967305600 39600 1 AEDT} + {985449600 36000 0 AEST} + {1002384000 39600 1 AEDT} + {1017504000 36000 0 AEST} + {1033833600 39600 1 AEDT} + {1048953600 36000 0 AEST} + {1065283200 39600 1 AEDT} + {1080403200 36000 0 AEST} + {1096732800 39600 1 AEDT} + {1111852800 36000 0 AEST} + {1128182400 39600 1 AEDT} + {1143907200 36000 0 AEST} + {1159632000 39600 1 AEDT} + {1174752000 36000 0 AEST} + {1191686400 39600 1 AEDT} + {1207411200 36000 0 AEST} + {1223136000 39600 1 AEDT} + {1238860800 36000 0 AEST} + {1254585600 39600 1 AEDT} + {1262264400 39600 1 AEDT} + {1293800400 39600 0 AEST} + {1301760000 36000 0 AEST} + {1317484800 39600 1 AEDT} + {1333209600 36000 0 AEST} + {1349539200 39600 1 AEDT} + {1365264000 36000 0 AEST} + {1380988800 39600 1 AEDT} + {1396713600 36000 0 AEST} + {1412438400 39600 1 AEDT} + {1428163200 36000 0 AEST} + {1443888000 39600 1 AEDT} + {1459612800 36000 0 AEST} + {1475337600 39600 1 AEDT} + {1491062400 36000 0 AEST} + {1506787200 39600 1 AEDT} + {1522512000 36000 0 AEST} + {1538841600 39600 1 AEDT} + {1554566400 36000 0 AEST} + {1570291200 39600 1 AEDT} + {1586016000 36000 0 AEST} + {1601740800 39600 1 AEDT} + {1617465600 36000 0 AEST} + {1633190400 39600 1 AEDT} + {1648915200 36000 0 AEST} + {1664640000 39600 1 AEDT} + {1680364800 36000 0 AEST} + {1696089600 39600 1 AEDT} + {1712419200 36000 0 AEST} + {1728144000 39600 1 AEDT} + {1743868800 36000 0 AEST} + {1759593600 39600 1 AEDT} + {1775318400 36000 0 AEST} + {1791043200 39600 1 AEDT} + {1806768000 36000 0 AEST} + {1822492800 39600 1 AEDT} + {1838217600 36000 0 AEST} + {1853942400 39600 1 AEDT} + {1869667200 36000 0 AEST} + {1885996800 39600 1 AEDT} + {1901721600 36000 0 AEST} + {1917446400 39600 1 AEDT} + {1933171200 36000 0 AEST} + {1948896000 39600 1 AEDT} + {1964620800 36000 0 AEST} + {1980345600 39600 1 AEDT} + {1996070400 36000 0 AEST} + {2011795200 39600 1 AEDT} + {2027520000 36000 0 AEST} + {2043244800 39600 1 AEDT} + {2058969600 36000 0 AEST} + {2075299200 39600 1 AEDT} + {2091024000 36000 0 AEST} + {2106748800 39600 1 AEDT} + {2122473600 36000 0 AEST} + {2138198400 39600 1 AEDT} + {2153923200 36000 0 AEST} + {2169648000 39600 1 AEDT} + {2185372800 36000 0 AEST} + {2201097600 39600 1 AEDT} + {2216822400 36000 0 AEST} + {2233152000 39600 1 AEDT} + {2248876800 36000 0 AEST} + {2264601600 39600 1 AEDT} + {2280326400 36000 0 AEST} + {2296051200 39600 1 AEDT} + {2311776000 36000 0 AEST} + {2327500800 39600 1 AEDT} + {2343225600 36000 0 AEST} + {2358950400 39600 1 AEDT} + {2374675200 36000 0 AEST} + {2390400000 39600 1 AEDT} + {2406124800 36000 0 AEST} + {2422454400 39600 1 AEDT} + {2438179200 36000 0 AEST} + {2453904000 39600 1 AEDT} + {2469628800 36000 0 AEST} + {2485353600 39600 1 AEDT} + {2501078400 36000 0 AEST} + {2516803200 39600 1 AEDT} + {2532528000 36000 0 AEST} + {2548252800 39600 1 AEDT} + {2563977600 36000 0 AEST} + {2579702400 39600 1 AEDT} + {2596032000 36000 0 AEST} + {2611756800 39600 1 AEDT} + {2627481600 36000 0 AEST} + {2643206400 39600 1 AEDT} + {2658931200 36000 0 AEST} + {2674656000 39600 1 AEDT} + {2690380800 36000 0 AEST} + {2706105600 39600 1 AEDT} + {2721830400 36000 0 AEST} + {2737555200 39600 1 AEDT} + {2753280000 36000 0 AEST} + {2769609600 39600 1 AEDT} + {2785334400 36000 0 AEST} + {2801059200 39600 1 AEDT} + {2816784000 36000 0 AEST} + {2832508800 39600 1 AEDT} + {2848233600 36000 0 AEST} + {2863958400 39600 1 AEDT} + {2879683200 36000 0 AEST} + {2895408000 39600 1 AEDT} + {2911132800 36000 0 AEST} + {2926857600 39600 1 AEDT} + {2942582400 36000 0 AEST} + {2958912000 39600 1 AEDT} + {2974636800 36000 0 AEST} + {2990361600 39600 1 AEDT} + {3006086400 36000 0 AEST} + {3021811200 39600 1 AEDT} + {3037536000 36000 0 AEST} + {3053260800 39600 1 AEDT} + {3068985600 36000 0 AEST} + {3084710400 39600 1 AEDT} + {3100435200 36000 0 AEST} + {3116764800 39600 1 AEDT} + {3132489600 36000 0 AEST} + {3148214400 39600 1 AEDT} + {3163939200 36000 0 AEST} + {3179664000 39600 1 AEDT} + {3195388800 36000 0 AEST} + {3211113600 39600 1 AEDT} + {3226838400 36000 0 AEST} + {3242563200 39600 1 AEDT} + {3258288000 36000 0 AEST} + {3274012800 39600 1 AEDT} + {3289737600 36000 0 AEST} + {3306067200 39600 1 AEDT} + {3321792000 36000 0 AEST} + {3337516800 39600 1 AEDT} + {3353241600 36000 0 AEST} + {3368966400 39600 1 AEDT} + {3384691200 36000 0 AEST} + {3400416000 39600 1 AEDT} + {3416140800 36000 0 AEST} + {3431865600 39600 1 AEDT} + {3447590400 36000 0 AEST} + {3463315200 39600 1 AEDT} + {3479644800 36000 0 AEST} + {3495369600 39600 1 AEDT} + {3511094400 36000 0 AEST} + {3526819200 39600 1 AEDT} + {3542544000 36000 0 AEST} + {3558268800 39600 1 AEDT} + {3573993600 36000 0 AEST} + {3589718400 39600 1 AEDT} + {3605443200 36000 0 AEST} + {3621168000 39600 1 AEDT} + {3636892800 36000 0 AEST} + {3653222400 39600 1 AEDT} + {3668947200 36000 0 AEST} + {3684672000 39600 1 AEDT} + {3700396800 36000 0 AEST} + {3716121600 39600 1 AEDT} + {3731846400 36000 0 AEST} + {3747571200 39600 1 AEDT} + {3763296000 36000 0 AEST} + {3779020800 39600 1 AEDT} + {3794745600 36000 0 AEST} + {3810470400 39600 1 AEDT} + {3826195200 36000 0 AEST} + {3842524800 39600 1 AEDT} + {3858249600 36000 0 AEST} + {3873974400 39600 1 AEDT} + {3889699200 36000 0 AEST} + {3905424000 39600 1 AEDT} + {3921148800 36000 0 AEST} + {3936873600 39600 1 AEDT} + {3952598400 36000 0 AEST} + {3968323200 39600 1 AEDT} + {3984048000 36000 0 AEST} + {4000377600 39600 1 AEDT} + {4016102400 36000 0 AEST} + {4031827200 39600 1 AEDT} + {4047552000 36000 0 AEST} + {4063276800 39600 1 AEDT} + {4079001600 36000 0 AEST} + {4094726400 39600 1 AEDT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Mawson b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Mawson new file mode 100644 index 00000000..4828b1a2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Mawson @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Mawson) { + {-9223372036854775808 0 0 -00} + {-501206400 21600 0 +06} + {1255809600 18000 0 +05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/McMurdo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/McMurdo new file mode 100644 index 00000000..3b29ba1d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/McMurdo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Auckland)]} { + LoadTimeZoneFile Pacific/Auckland +} +set TZData(:Antarctica/McMurdo) $TZData(:Pacific/Auckland) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Palmer b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Palmer new file mode 100644 index 00000000..f450e3b0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Palmer @@ -0,0 +1,87 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Palmer) { + {-9223372036854775808 0 0 -00} + {-157766400 -14400 0 -04} + {-152654400 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {389070000 -14400 0 -04} + {403070400 -10800 1 -04} + {416372400 -14400 0 -04} + {434520000 -10800 1 -04} + {447822000 -14400 0 -04} + {466574400 -10800 1 -04} + {479271600 -14400 0 -04} + {498024000 -10800 1 -04} + {510721200 -14400 0 -04} + {529473600 -10800 1 -04} + {545194800 -14400 0 -04} + {560923200 -10800 1 -04} + {574225200 -14400 0 -04} + {592372800 -10800 1 -04} + {605674800 -14400 0 -04} + {624427200 -10800 1 -04} + {637124400 -14400 0 -04} + {653457600 -10800 1 -04} + {668574000 -14400 0 -04} + {687326400 -10800 1 -04} + {700628400 -14400 0 -04} + {718776000 -10800 1 -04} + {732078000 -14400 0 -04} + {750225600 -10800 1 -04} + {763527600 -14400 0 -04} + {781675200 -10800 1 -04} + {794977200 -14400 0 -04} + {813729600 -10800 1 -04} + {826426800 -14400 0 -04} + {845179200 -10800 1 -04} + {859690800 -14400 0 -04} + {876628800 -10800 1 -04} + {889930800 -14400 0 -04} + {906868800 -10800 1 -04} + {923194800 -14400 0 -04} + {939528000 -10800 1 -04} + {952830000 -14400 0 -04} + {971582400 -10800 1 -04} + {984279600 -14400 0 -04} + {1003032000 -10800 1 -04} + {1015729200 -14400 0 -04} + {1034481600 -10800 1 -04} + {1047178800 -14400 0 -04} + {1065931200 -10800 1 -04} + {1079233200 -14400 0 -04} + {1097380800 -10800 1 -04} + {1110682800 -14400 0 -04} + {1128830400 -10800 1 -04} + {1142132400 -14400 0 -04} + {1160884800 -10800 1 -04} + {1173582000 -14400 0 -04} + {1192334400 -10800 1 -04} + {1206846000 -14400 0 -04} + {1223784000 -10800 1 -04} + {1237086000 -14400 0 -04} + {1255233600 -10800 1 -04} + {1270350000 -14400 0 -04} + {1286683200 -10800 1 -04} + {1304823600 -14400 0 -04} + {1313899200 -10800 1 -04} + {1335668400 -14400 0 -04} + {1346558400 -10800 1 -04} + {1367118000 -14400 0 -04} + {1378612800 -10800 1 -04} + {1398567600 -14400 0 -04} + {1410062400 -10800 1 -04} + {1463281200 -14400 0 -04} + {1471147200 -10800 1 -04} + {1480820400 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/South_Pole b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/South_Pole new file mode 100644 index 00000000..544bde47 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/South_Pole @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Auckland)]} { + LoadTimeZoneFile Pacific/Auckland +} +set TZData(:Antarctica/South_Pole) $TZData(:Pacific/Auckland) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Troll b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Troll new file mode 100644 index 00000000..fe44578a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Troll @@ -0,0 +1,196 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Troll) { + {-9223372036854775808 0 0 -00} + {1108166400 0 0 +00} + {1111885200 7200 1 +02} + {1130634000 0 0 +00} + {1143334800 7200 1 +02} + {1162083600 0 0 +00} + {1174784400 7200 1 +02} + {1193533200 0 0 +00} + {1206838800 7200 1 +02} + {1224982800 0 0 +00} + {1238288400 7200 1 +02} + {1256432400 0 0 +00} + {1269738000 7200 1 +02} + {1288486800 0 0 +00} + {1301187600 7200 1 +02} + {1319936400 0 0 +00} + {1332637200 7200 1 +02} + {1351386000 0 0 +00} + {1364691600 7200 1 +02} + {1382835600 0 0 +00} + {1396141200 7200 1 +02} + {1414285200 0 0 +00} + {1427590800 7200 1 +02} + {1445734800 0 0 +00} + {1459040400 7200 1 +02} + {1477789200 0 0 +00} + {1490490000 7200 1 +02} + {1509238800 0 0 +00} + {1521939600 7200 1 +02} + {1540688400 0 0 +00} + {1553994000 7200 1 +02} + {1572138000 0 0 +00} + {1585443600 7200 1 +02} + {1603587600 0 0 +00} + {1616893200 7200 1 +02} + {1635642000 0 0 +00} + {1648342800 7200 1 +02} + {1667091600 0 0 +00} + {1679792400 7200 1 +02} + {1698541200 0 0 +00} + {1711846800 7200 1 +02} + {1729990800 0 0 +00} + {1743296400 7200 1 +02} + {1761440400 0 0 +00} + {1774746000 7200 1 +02} + {1792890000 0 0 +00} + {1806195600 7200 1 +02} + {1824944400 0 0 +00} + {1837645200 7200 1 +02} + {1856394000 0 0 +00} + {1869094800 7200 1 +02} + {1887843600 0 0 +00} + {1901149200 7200 1 +02} + {1919293200 0 0 +00} + {1932598800 7200 1 +02} + {1950742800 0 0 +00} + {1964048400 7200 1 +02} + {1982797200 0 0 +00} + {1995498000 7200 1 +02} + {2014246800 0 0 +00} + {2026947600 7200 1 +02} + {2045696400 0 0 +00} + {2058397200 7200 1 +02} + {2077146000 0 0 +00} + {2090451600 7200 1 +02} + {2108595600 0 0 +00} + {2121901200 7200 1 +02} + {2140045200 0 0 +00} + {2153350800 7200 1 +02} + {2172099600 0 0 +00} + {2184800400 7200 1 +02} + {2203549200 0 0 +00} + {2216250000 7200 1 +02} + {2234998800 0 0 +00} + {2248304400 7200 1 +02} + {2266448400 0 0 +00} + {2279754000 7200 1 +02} + {2297898000 0 0 +00} + {2311203600 7200 1 +02} + {2329347600 0 0 +00} + {2342653200 7200 1 +02} + {2361402000 0 0 +00} + {2374102800 7200 1 +02} + {2392851600 0 0 +00} + {2405552400 7200 1 +02} + {2424301200 0 0 +00} + {2437606800 7200 1 +02} + {2455750800 0 0 +00} + {2469056400 7200 1 +02} + {2487200400 0 0 +00} + {2500506000 7200 1 +02} + {2519254800 0 0 +00} + {2531955600 7200 1 +02} + {2550704400 0 0 +00} + {2563405200 7200 1 +02} + {2582154000 0 0 +00} + {2595459600 7200 1 +02} + {2613603600 0 0 +00} + {2626909200 7200 1 +02} + {2645053200 0 0 +00} + {2658358800 7200 1 +02} + {2676502800 0 0 +00} + {2689808400 7200 1 +02} + {2708557200 0 0 +00} + {2721258000 7200 1 +02} + {2740006800 0 0 +00} + {2752707600 7200 1 +02} + {2771456400 0 0 +00} + {2784762000 7200 1 +02} + {2802906000 0 0 +00} + {2816211600 7200 1 +02} + {2834355600 0 0 +00} + {2847661200 7200 1 +02} + {2866410000 0 0 +00} + {2879110800 7200 1 +02} + {2897859600 0 0 +00} + {2910560400 7200 1 +02} + {2929309200 0 0 +00} + {2942010000 7200 1 +02} + {2960758800 0 0 +00} + {2974064400 7200 1 +02} + {2992208400 0 0 +00} + {3005514000 7200 1 +02} + {3023658000 0 0 +00} + {3036963600 7200 1 +02} + {3055712400 0 0 +00} + {3068413200 7200 1 +02} + {3087162000 0 0 +00} + {3099862800 7200 1 +02} + {3118611600 0 0 +00} + {3131917200 7200 1 +02} + {3150061200 0 0 +00} + {3163366800 7200 1 +02} + {3181510800 0 0 +00} + {3194816400 7200 1 +02} + {3212960400 0 0 +00} + {3226266000 7200 1 +02} + {3245014800 0 0 +00} + {3257715600 7200 1 +02} + {3276464400 0 0 +00} + {3289165200 7200 1 +02} + {3307914000 0 0 +00} + {3321219600 7200 1 +02} + {3339363600 0 0 +00} + {3352669200 7200 1 +02} + {3370813200 0 0 +00} + {3384118800 7200 1 +02} + {3402867600 0 0 +00} + {3415568400 7200 1 +02} + {3434317200 0 0 +00} + {3447018000 7200 1 +02} + {3465766800 0 0 +00} + {3479072400 7200 1 +02} + {3497216400 0 0 +00} + {3510522000 7200 1 +02} + {3528666000 0 0 +00} + {3541971600 7200 1 +02} + {3560115600 0 0 +00} + {3573421200 7200 1 +02} + {3592170000 0 0 +00} + {3604870800 7200 1 +02} + {3623619600 0 0 +00} + {3636320400 7200 1 +02} + {3655069200 0 0 +00} + {3668374800 7200 1 +02} + {3686518800 0 0 +00} + {3699824400 7200 1 +02} + {3717968400 0 0 +00} + {3731274000 7200 1 +02} + {3750022800 0 0 +00} + {3762723600 7200 1 +02} + {3781472400 0 0 +00} + {3794173200 7200 1 +02} + {3812922000 0 0 +00} + {3825622800 7200 1 +02} + {3844371600 0 0 +00} + {3857677200 7200 1 +02} + {3875821200 0 0 +00} + {3889126800 7200 1 +02} + {3907270800 0 0 +00} + {3920576400 7200 1 +02} + {3939325200 0 0 +00} + {3952026000 7200 1 +02} + {3970774800 0 0 +00} + {3983475600 7200 1 +02} + {4002224400 0 0 +00} + {4015530000 7200 1 +02} + {4033674000 0 0 +00} + {4046979600 7200 1 +02} + {4065123600 0 0 +00} + {4078429200 7200 1 +02} + {4096573200 0 0 +00} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Vostok b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Vostok new file mode 100644 index 00000000..1a19a5df --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Antarctica/Vostok @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Urumqi)]} { + LoadTimeZoneFile Asia/Urumqi +} +set TZData(:Antarctica/Vostok) $TZData(:Asia/Urumqi) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Arctic/Longyearbyen b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Arctic/Longyearbyen new file mode 100644 index 00000000..4b52387a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Arctic/Longyearbyen @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Berlin)]} { + LoadTimeZoneFile Europe/Berlin +} +set TZData(:Arctic/Longyearbyen) $TZData(:Europe/Berlin) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Aden b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Aden new file mode 100644 index 00000000..5c5515e1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Aden @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Riyadh)]} { + LoadTimeZoneFile Asia/Riyadh +} +set TZData(:Asia/Aden) $TZData(:Asia/Riyadh) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Almaty b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Almaty new file mode 100644 index 00000000..f42935df --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Almaty @@ -0,0 +1,57 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Almaty) { + {-9223372036854775808 18468 0 LMT} + {-1441170468 18000 0 +05} + {-1247547600 21600 0 +06} + {354909600 25200 1 +06} + {370717200 21600 0 +06} + {386445600 25200 1 +06} + {402253200 21600 0 +06} + {417981600 25200 1 +06} + {433789200 21600 0 +06} + {449604000 25200 1 +06} + {465336000 21600 0 +06} + {481060800 25200 1 +06} + {496785600 21600 0 +06} + {512510400 25200 1 +06} + {528235200 21600 0 +06} + {543960000 25200 1 +06} + {559684800 21600 0 +06} + {575409600 25200 1 +06} + {591134400 21600 0 +06} + {606859200 25200 1 +06} + {622584000 21600 0 +06} + {638308800 25200 1 +06} + {654638400 21600 0 +06} + {670363200 18000 0 +05} + {670366800 21600 1 +05} + {686091600 18000 0 +05} + {695768400 21600 0 +06} + {701812800 25200 1 +06} + {717537600 21600 0 +06} + {733262400 25200 1 +06} + {748987200 21600 0 +06} + {764712000 25200 1 +06} + {780436800 21600 0 +06} + {796161600 25200 1 +06} + {811886400 21600 0 +06} + {828216000 25200 1 +06} + {846360000 21600 0 +06} + {859665600 25200 1 +06} + {877809600 21600 0 +06} + {891115200 25200 1 +06} + {909259200 21600 0 +06} + {922564800 25200 1 +06} + {941313600 21600 0 +06} + {954014400 25200 1 +06} + {972763200 21600 0 +06} + {985464000 25200 1 +06} + {1004212800 21600 0 +06} + {1017518400 25200 1 +06} + {1035662400 21600 0 +06} + {1048968000 25200 1 +06} + {1067112000 21600 0 +06} + {1080417600 25200 1 +06} + {1099166400 21600 0 +06} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Amman b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Amman new file mode 100644 index 00000000..05cba696 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Amman @@ -0,0 +1,92 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Amman) { + {-9223372036854775808 8624 0 LMT} + {-1230776624 7200 0 EET} + {108165600 10800 1 EEST} + {118270800 7200 0 EET} + {136591200 10800 1 EEST} + {149806800 7200 0 EET} + {168127200 10800 1 EEST} + {181342800 7200 0 EET} + {199749600 10800 1 EEST} + {215643600 7200 0 EET} + {231285600 10800 1 EEST} + {244501200 7200 0 EET} + {262735200 10800 1 EEST} + {275950800 7200 0 EET} + {481154400 10800 1 EEST} + {496962000 7200 0 EET} + {512949600 10800 1 EEST} + {528670800 7200 0 EET} + {544399200 10800 1 EEST} + {560120400 7200 0 EET} + {575848800 10800 1 EEST} + {592174800 7200 0 EET} + {610581600 10800 1 EEST} + {623624400 7200 0 EET} + {641167200 10800 1 EEST} + {655074000 7200 0 EET} + {671839200 10800 1 EEST} + {685918800 7200 0 EET} + {702856800 10800 1 EEST} + {717973200 7200 0 EET} + {733701600 10800 1 EEST} + {749422800 7200 0 EET} + {765151200 10800 1 EEST} + {779662800 7200 0 EET} + {797205600 10800 1 EEST} + {811116000 7200 0 EET} + {828655200 10800 1 EEST} + {843170400 7200 0 EET} + {860104800 10800 1 EEST} + {874620000 7200 0 EET} + {891554400 10800 1 EEST} + {906069600 7200 0 EET} + {930780000 10800 1 EEST} + {938124000 7200 0 EET} + {954367200 10800 1 EEST} + {970178400 7200 0 EET} + {985816800 10800 1 EEST} + {1001628000 7200 0 EET} + {1017352800 10800 1 EEST} + {1033077600 7200 0 EET} + {1048802400 10800 1 EEST} + {1066946400 7200 0 EET} + {1080252000 10800 1 EEST} + {1097791200 7200 0 EET} + {1112306400 10800 1 EEST} + {1128031200 7200 0 EET} + {1143756000 10800 1 EEST} + {1161900000 7200 0 EET} + {1175205600 10800 1 EEST} + {1193349600 7200 0 EET} + {1206655200 10800 1 EEST} + {1225404000 7200 0 EET} + {1238104800 10800 1 EEST} + {1256853600 7200 0 EET} + {1269554400 10800 1 EEST} + {1288303200 7200 0 EET} + {1301608800 10800 1 EEST} + {1319752800 7200 0 EET} + {1333058400 10800 1 EEST} + {1387486800 7200 0 EET} + {1395957600 10800 1 EEST} + {1414706400 7200 0 EET} + {1427407200 10800 1 EEST} + {1446156000 7200 0 EET} + {1459461600 10800 1 EEST} + {1477605600 7200 0 EET} + {1490911200 10800 1 EEST} + {1509055200 7200 0 EET} + {1522360800 10800 1 EEST} + {1540504800 7200 0 EET} + {1553810400 10800 1 EEST} + {1571954400 7200 0 EET} + {1585260000 10800 1 EEST} + {1604008800 7200 0 EET} + {1616709600 10800 1 EEST} + {1635458400 7200 0 EET} + {1645740000 10800 1 EEST} + {1666908000 10800 0 +03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Anadyr b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Anadyr new file mode 100644 index 00000000..d1314c63 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Anadyr @@ -0,0 +1,72 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Anadyr) { + {-9223372036854775808 42596 0 LMT} + {-1441194596 43200 0 +12} + {-1247572800 46800 0 +14} + {354884400 50400 1 +14} + {370692000 46800 0 +13} + {386420400 43200 0 +13} + {386424000 46800 1 +13} + {402231600 43200 0 +12} + {417960000 46800 1 +13} + {433767600 43200 0 +12} + {449582400 46800 1 +13} + {465314400 43200 0 +12} + {481039200 46800 1 +13} + {496764000 43200 0 +12} + {512488800 46800 1 +13} + {528213600 43200 0 +12} + {543938400 46800 1 +13} + {559663200 43200 0 +12} + {575388000 46800 1 +13} + {591112800 43200 0 +12} + {606837600 46800 1 +13} + {622562400 43200 0 +12} + {638287200 46800 1 +13} + {654616800 43200 0 +12} + {670341600 39600 0 +12} + {670345200 43200 1 +12} + {686070000 39600 0 +11} + {695746800 43200 0 +13} + {701791200 46800 1 +13} + {717516000 43200 0 +12} + {733240800 46800 1 +13} + {748965600 43200 0 +12} + {764690400 46800 1 +13} + {780415200 43200 0 +12} + {796140000 46800 1 +13} + {811864800 43200 0 +12} + {828194400 46800 1 +13} + {846338400 43200 0 +12} + {859644000 46800 1 +13} + {877788000 43200 0 +12} + {891093600 46800 1 +13} + {909237600 43200 0 +12} + {922543200 46800 1 +13} + {941292000 43200 0 +12} + {953992800 46800 1 +13} + {972741600 43200 0 +12} + {985442400 46800 1 +13} + {1004191200 43200 0 +12} + {1017496800 46800 1 +13} + {1035640800 43200 0 +12} + {1048946400 46800 1 +13} + {1067090400 43200 0 +12} + {1080396000 46800 1 +13} + {1099144800 43200 0 +12} + {1111845600 46800 1 +13} + {1130594400 43200 0 +12} + {1143295200 46800 1 +13} + {1162044000 43200 0 +12} + {1174744800 46800 1 +13} + {1193493600 43200 0 +12} + {1206799200 46800 1 +13} + {1224943200 43200 0 +12} + {1238248800 46800 1 +13} + {1256392800 43200 0 +12} + {1269698400 39600 0 +12} + {1269702000 43200 1 +12} + {1288450800 39600 0 +11} + {1301151600 43200 0 +12} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Aqtau b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Aqtau new file mode 100644 index 00000000..41da2cab --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Aqtau @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Aqtau) { + {-9223372036854775808 12064 0 LMT} + {-1441164064 14400 0 +04} + {-1247544000 18000 0 +05} + {370724400 21600 0 +06} + {386445600 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 21600 1 +05} + {622587600 18000 0 +05} + {638312400 21600 1 +05} + {654642000 18000 0 +05} + {670366800 14400 0 +04} + {670370400 18000 1 +04} + {686095200 14400 0 +04} + {695772000 18000 0 +05} + {701816400 21600 1 +05} + {717541200 18000 0 +05} + {733266000 21600 1 +05} + {748990800 18000 0 +05} + {764715600 21600 1 +05} + {780440400 18000 0 +04} + {780444000 14400 0 +04} + {796168800 18000 1 +04} + {811893600 14400 0 +04} + {828223200 18000 1 +04} + {846367200 14400 0 +04} + {859672800 18000 1 +04} + {877816800 14400 0 +04} + {891122400 18000 1 +04} + {909266400 14400 0 +04} + {922572000 18000 1 +04} + {941320800 14400 0 +04} + {954021600 18000 1 +04} + {972770400 14400 0 +04} + {985471200 18000 1 +04} + {1004220000 14400 0 +04} + {1017525600 18000 1 +04} + {1035669600 14400 0 +04} + {1048975200 18000 1 +04} + {1067119200 14400 0 +04} + {1080424800 18000 1 +04} + {1099173600 18000 0 +05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Aqtobe b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Aqtobe new file mode 100644 index 00000000..2316e680 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Aqtobe @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Aqtobe) { + {-9223372036854775808 13720 0 LMT} + {-1441165720 14400 0 +04} + {-1247544000 18000 0 +05} + {354913200 21600 1 +06} + {370720800 21600 0 +06} + {386445600 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 21600 1 +05} + {622587600 18000 0 +05} + {638312400 21600 1 +05} + {654642000 18000 0 +05} + {670366800 14400 0 +04} + {670370400 18000 1 +04} + {686095200 14400 0 +04} + {695772000 18000 0 +05} + {701816400 21600 1 +05} + {717541200 18000 0 +05} + {733266000 21600 1 +05} + {748990800 18000 0 +05} + {764715600 21600 1 +05} + {780440400 18000 0 +05} + {796165200 21600 1 +05} + {811890000 18000 0 +05} + {828219600 21600 1 +05} + {846363600 18000 0 +05} + {859669200 21600 1 +05} + {877813200 18000 0 +05} + {891118800 21600 1 +05} + {909262800 18000 0 +05} + {922568400 21600 1 +05} + {941317200 18000 0 +05} + {954018000 21600 1 +05} + {972766800 18000 0 +05} + {985467600 21600 1 +05} + {1004216400 18000 0 +05} + {1017522000 21600 1 +05} + {1035666000 18000 0 +05} + {1048971600 21600 1 +05} + {1067115600 18000 0 +05} + {1080421200 21600 1 +05} + {1099170000 18000 0 +05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ashgabat b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ashgabat new file mode 100644 index 00000000..feb77257 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ashgabat @@ -0,0 +1,31 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Ashgabat) { + {-9223372036854775808 14012 0 LMT} + {-1441166012 14400 0 +04} + {-1247544000 18000 0 +05} + {354913200 21600 1 +05} + {370720800 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 21600 1 +05} + {622587600 18000 0 +05} + {638312400 21600 1 +05} + {654642000 18000 0 +05} + {670366800 14400 0 +04} + {670370400 18000 1 +04} + {686095200 14400 0 +04} + {695772000 18000 0 +05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ashkhabad b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ashkhabad new file mode 100644 index 00000000..3000c94c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ashkhabad @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Ashgabat)]} { + LoadTimeZoneFile Asia/Ashgabat +} +set TZData(:Asia/Ashkhabad) $TZData(:Asia/Ashgabat) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Atyrau b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Atyrau new file mode 100644 index 00000000..b6d82534 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Atyrau @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Atyrau) { + {-9223372036854775808 12464 0 LMT} + {-1441164464 10800 0 +03} + {-1247540400 18000 0 +05} + {370724400 21600 0 +06} + {386445600 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 21600 1 +05} + {622587600 18000 0 +05} + {638312400 21600 1 +05} + {654642000 18000 0 +05} + {670366800 14400 0 +04} + {670370400 18000 1 +04} + {686095200 14400 0 +04} + {695772000 18000 0 +05} + {701816400 21600 1 +05} + {717541200 18000 0 +05} + {733266000 21600 1 +05} + {748990800 18000 0 +05} + {764715600 21600 1 +05} + {780440400 18000 0 +05} + {796165200 21600 1 +05} + {811890000 18000 0 +05} + {828219600 21600 1 +05} + {846363600 18000 0 +05} + {859669200 21600 1 +05} + {877813200 18000 0 +05} + {891118800 21600 1 +05} + {909262800 18000 0 +05} + {922568400 14400 0 +04} + {922572000 18000 1 +04} + {941320800 14400 0 +04} + {954021600 18000 1 +04} + {972770400 14400 0 +04} + {985471200 18000 1 +04} + {1004220000 14400 0 +04} + {1017525600 18000 1 +04} + {1035669600 14400 0 +04} + {1048975200 18000 1 +04} + {1067119200 14400 0 +04} + {1080424800 18000 1 +04} + {1099173600 18000 0 +05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Baghdad b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Baghdad new file mode 100644 index 00000000..c76a6a1b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Baghdad @@ -0,0 +1,59 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Baghdad) { + {-9223372036854775808 10660 0 LMT} + {-2524532260 10656 0 BMT} + {-1641005856 10800 0 +03} + {389048400 14400 0 +03} + {402264000 10800 0 +03} + {417906000 14400 1 +03} + {433800000 10800 0 +03} + {449614800 14400 1 +03} + {465422400 10800 0 +03} + {481150800 14400 1 +03} + {496792800 10800 0 +03} + {512517600 14400 1 +03} + {528242400 10800 0 +03} + {543967200 14400 1 +03} + {559692000 10800 0 +03} + {575416800 14400 1 +03} + {591141600 10800 0 +03} + {606866400 14400 1 +03} + {622591200 10800 0 +03} + {638316000 14400 1 +03} + {654645600 10800 0 +03} + {670464000 14400 1 +03} + {686275200 10800 0 +03} + {702086400 14400 1 +03} + {717897600 10800 0 +03} + {733622400 14400 1 +03} + {749433600 10800 0 +03} + {765158400 14400 1 +03} + {780969600 10800 0 +03} + {796694400 14400 1 +03} + {812505600 10800 0 +03} + {828316800 14400 1 +03} + {844128000 10800 0 +03} + {859852800 14400 1 +03} + {875664000 10800 0 +03} + {891388800 14400 1 +03} + {907200000 10800 0 +03} + {922924800 14400 1 +03} + {938736000 10800 0 +03} + {954547200 14400 1 +03} + {970358400 10800 0 +03} + {986083200 14400 1 +03} + {1001894400 10800 0 +03} + {1017619200 14400 1 +03} + {1033430400 10800 0 +03} + {1049155200 14400 1 +03} + {1064966400 10800 0 +03} + {1080777600 14400 1 +03} + {1096588800 10800 0 +03} + {1112313600 14400 1 +03} + {1128124800 10800 0 +03} + {1143849600 14400 1 +03} + {1159660800 10800 0 +03} + {1175385600 14400 1 +03} + {1191196800 10800 0 +03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Bahrain b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Bahrain new file mode 100644 index 00000000..aab5b7d9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Bahrain @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Qatar)]} { + LoadTimeZoneFile Asia/Qatar +} +set TZData(:Asia/Bahrain) $TZData(:Asia/Qatar) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Baku b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Baku new file mode 100644 index 00000000..03dee197 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Baku @@ -0,0 +1,74 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Baku) { + {-9223372036854775808 11964 0 LMT} + {-1441163964 10800 0 +03} + {-405140400 14400 0 +04} + {354916800 18000 1 +04} + {370724400 14400 0 +04} + {386452800 18000 1 +04} + {402260400 14400 0 +04} + {417988800 18000 1 +04} + {433796400 14400 0 +04} + {449611200 18000 1 +04} + {465343200 14400 0 +04} + {481068000 18000 1 +04} + {496792800 14400 0 +04} + {512517600 18000 1 +04} + {528242400 14400 0 +04} + {543967200 18000 1 +04} + {559692000 14400 0 +04} + {575416800 18000 1 +04} + {591141600 14400 0 +04} + {606866400 18000 1 +04} + {622591200 14400 0 +04} + {638316000 18000 1 +04} + {654645600 14400 0 +04} + {670370400 10800 0 +03} + {670374000 14400 1 +03} + {686098800 10800 0 +03} + {701823600 14400 1 +03} + {717548400 14400 0 +04} + {820440000 14400 0 +04} + {828234000 18000 1 +05} + {846378000 14400 0 +04} + {852062400 14400 0 +04} + {859680000 18000 1 +04} + {877824000 14400 0 +04} + {891129600 18000 1 +04} + {909273600 14400 0 +04} + {922579200 18000 1 +04} + {941328000 14400 0 +04} + {954028800 18000 1 +04} + {972777600 14400 0 +04} + {985478400 18000 1 +04} + {1004227200 14400 0 +04} + {1017532800 18000 1 +04} + {1035676800 14400 0 +04} + {1048982400 18000 1 +04} + {1067126400 14400 0 +04} + {1080432000 18000 1 +04} + {1099180800 14400 0 +04} + {1111881600 18000 1 +04} + {1130630400 14400 0 +04} + {1143331200 18000 1 +04} + {1162080000 14400 0 +04} + {1174780800 18000 1 +04} + {1193529600 14400 0 +04} + {1206835200 18000 1 +04} + {1224979200 14400 0 +04} + {1238284800 18000 1 +04} + {1256428800 14400 0 +04} + {1269734400 18000 1 +04} + {1288483200 14400 0 +04} + {1301184000 18000 1 +04} + {1319932800 14400 0 +04} + {1332633600 18000 1 +04} + {1351382400 14400 0 +04} + {1364688000 18000 1 +04} + {1382832000 14400 0 +04} + {1396137600 18000 1 +04} + {1414281600 14400 0 +04} + {1427587200 18000 1 +04} + {1445731200 14400 0 +04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Bangkok b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Bangkok new file mode 100644 index 00000000..aeb5473d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Bangkok @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Bangkok) { + {-9223372036854775808 24124 0 LMT} + {-2840164924 24124 0 BMT} + {-1570084924 25200 0 +07} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Barnaul b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Barnaul new file mode 100644 index 00000000..bf6abbf0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Barnaul @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Barnaul) { + {-9223372036854775808 20100 0 LMT} + {-1579844100 21600 0 +06} + {-1247551200 25200 0 +08} + {354906000 28800 1 +08} + {370713600 25200 0 +07} + {386442000 28800 1 +08} + {402249600 25200 0 +07} + {417978000 28800 1 +08} + {433785600 25200 0 +07} + {449600400 28800 1 +08} + {465332400 25200 0 +07} + {481057200 28800 1 +08} + {496782000 25200 0 +07} + {512506800 28800 1 +08} + {528231600 25200 0 +07} + {543956400 28800 1 +08} + {559681200 25200 0 +07} + {575406000 28800 1 +08} + {591130800 25200 0 +07} + {606855600 28800 1 +08} + {622580400 25200 0 +07} + {638305200 28800 1 +08} + {654634800 25200 0 +07} + {670359600 21600 0 +07} + {670363200 25200 1 +07} + {686088000 21600 0 +06} + {695764800 25200 0 +08} + {701809200 28800 1 +08} + {717534000 25200 0 +07} + {733258800 28800 1 +08} + {748983600 25200 0 +07} + {764708400 28800 1 +08} + {780433200 25200 0 +07} + {796158000 28800 1 +08} + {801594000 25200 0 +07} + {811886400 21600 0 +06} + {828216000 25200 1 +07} + {846360000 21600 0 +06} + {859665600 25200 1 +07} + {877809600 21600 0 +06} + {891115200 25200 1 +07} + {909259200 21600 0 +06} + {922564800 25200 1 +07} + {941313600 21600 0 +06} + {954014400 25200 1 +07} + {972763200 21600 0 +06} + {985464000 25200 1 +07} + {1004212800 21600 0 +06} + {1017518400 25200 1 +07} + {1035662400 21600 0 +06} + {1048968000 25200 1 +07} + {1067112000 21600 0 +06} + {1080417600 25200 1 +07} + {1099166400 21600 0 +06} + {1111867200 25200 1 +07} + {1130616000 21600 0 +06} + {1143316800 25200 1 +07} + {1162065600 21600 0 +06} + {1174766400 25200 1 +07} + {1193515200 21600 0 +06} + {1206820800 25200 1 +07} + {1224964800 21600 0 +06} + {1238270400 25200 1 +07} + {1256414400 21600 0 +06} + {1269720000 25200 1 +07} + {1288468800 21600 0 +06} + {1301169600 25200 0 +07} + {1414263600 21600 0 +06} + {1459022400 25200 0 +07} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Beirut b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Beirut new file mode 100644 index 00000000..ac0a64e7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Beirut @@ -0,0 +1,270 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Beirut) { + {-9223372036854775808 8520 0 LMT} + {-2840149320 7200 0 EET} + {-1570413600 10800 1 EEST} + {-1552186800 7200 0 EET} + {-1538359200 10800 1 EEST} + {-1522551600 7200 0 EET} + {-1507514400 10800 1 EEST} + {-1490583600 7200 0 EET} + {-1473645600 10800 1 EEST} + {-1460948400 7200 0 EET} + {-399866400 10800 1 EEST} + {-386650800 7200 0 EET} + {-368330400 10800 1 EEST} + {-355114800 7200 0 EET} + {-336794400 10800 1 EEST} + {-323578800 7200 0 EET} + {-305172000 10800 1 EEST} + {-291956400 7200 0 EET} + {-273636000 10800 1 EEST} + {-260420400 7200 0 EET} + {78012000 10800 1 EEST} + {86734800 7200 0 EET} + {105055200 10800 1 EEST} + {118270800 7200 0 EET} + {136591200 10800 1 EEST} + {149806800 7200 0 EET} + {168127200 10800 1 EEST} + {181342800 7200 0 EET} + {199749600 10800 1 EEST} + {212965200 7200 0 EET} + {231285600 10800 1 EEST} + {244501200 7200 0 EET} + {262735200 10800 1 EEST} + {275950800 7200 0 EET} + {452210400 10800 1 EEST} + {466722000 7200 0 EET} + {483746400 10800 1 EEST} + {498258000 7200 0 EET} + {515282400 10800 1 EEST} + {529794000 7200 0 EET} + {546818400 10800 1 EEST} + {561330000 7200 0 EET} + {581119200 10800 1 EEST} + {592952400 7200 0 EET} + {610754400 10800 1 EEST} + {624488400 7200 0 EET} + {641512800 10800 1 EEST} + {656024400 7200 0 EET} + {673048800 10800 1 EEST} + {687560400 7200 0 EET} + {704671200 10800 1 EEST} + {718146000 7200 0 EET} + {733269600 10800 1 EEST} + {748990800 7200 0 EET} + {764719200 10800 1 EEST} + {780440400 7200 0 EET} + {796168800 10800 1 EEST} + {811890000 7200 0 EET} + {828223200 10800 1 EEST} + {843944400 7200 0 EET} + {859672800 10800 1 EEST} + {875394000 7200 0 EET} + {891122400 10800 1 EEST} + {906843600 7200 0 EET} + {922572000 10800 1 EEST} + {941317200 7200 0 EET} + {954021600 10800 1 EEST} + {972766800 7200 0 EET} + {985471200 10800 1 EEST} + {1004216400 7200 0 EET} + {1017525600 10800 1 EEST} + {1035666000 7200 0 EET} + {1048975200 10800 1 EEST} + {1067115600 7200 0 EET} + {1080424800 10800 1 EEST} + {1099170000 7200 0 EET} + {1111874400 10800 1 EEST} + {1130619600 7200 0 EET} + {1143324000 10800 1 EEST} + {1162069200 7200 0 EET} + {1174773600 10800 1 EEST} + {1193518800 7200 0 EET} + {1206828000 10800 1 EEST} + {1224968400 7200 0 EET} + {1238277600 10800 1 EEST} + {1256418000 7200 0 EET} + {1269727200 10800 1 EEST} + {1288472400 7200 0 EET} + {1301176800 10800 1 EEST} + {1319922000 7200 0 EET} + {1332626400 10800 1 EEST} + {1351371600 7200 0 EET} + {1364680800 10800 1 EEST} + {1382821200 7200 0 EET} + {1396130400 10800 1 EEST} + {1414270800 7200 0 EET} + {1427580000 10800 1 EEST} + {1445720400 7200 0 EET} + {1459029600 10800 1 EEST} + {1477774800 7200 0 EET} + {1490479200 10800 1 EEST} + {1509224400 7200 0 EET} + {1521928800 10800 1 EEST} + {1540674000 7200 0 EET} + {1553983200 10800 1 EEST} + {1572123600 7200 0 EET} + {1585432800 10800 1 EEST} + {1603573200 7200 0 EET} + {1616882400 10800 1 EEST} + {1635627600 7200 0 EET} + {1648332000 10800 1 EEST} + {1667077200 7200 0 EET} + {1679781600 10800 1 EEST} + {1698526800 7200 0 EET} + {1711836000 10800 1 EEST} + {1729976400 7200 0 EET} + {1743285600 10800 1 EEST} + {1761426000 7200 0 EET} + {1774735200 10800 1 EEST} + {1792875600 7200 0 EET} + {1806184800 10800 1 EEST} + {1824930000 7200 0 EET} + {1837634400 10800 1 EEST} + {1856379600 7200 0 EET} + {1869084000 10800 1 EEST} + {1887829200 7200 0 EET} + {1901138400 10800 1 EEST} + {1919278800 7200 0 EET} + {1932588000 10800 1 EEST} + {1950728400 7200 0 EET} + {1964037600 10800 1 EEST} + {1982782800 7200 0 EET} + {1995487200 10800 1 EEST} + {2014232400 7200 0 EET} + {2026936800 10800 1 EEST} + {2045682000 7200 0 EET} + {2058386400 10800 1 EEST} + {2077131600 7200 0 EET} + {2090440800 10800 1 EEST} + {2108581200 7200 0 EET} + {2121890400 10800 1 EEST} + {2140030800 7200 0 EET} + {2153340000 10800 1 EEST} + {2172085200 7200 0 EET} + {2184789600 10800 1 EEST} + {2203534800 7200 0 EET} + {2216239200 10800 1 EEST} + {2234984400 7200 0 EET} + {2248293600 10800 1 EEST} + {2266434000 7200 0 EET} + {2279743200 10800 1 EEST} + {2297883600 7200 0 EET} + {2311192800 10800 1 EEST} + {2329333200 7200 0 EET} + {2342642400 10800 1 EEST} + {2361387600 7200 0 EET} + {2374092000 10800 1 EEST} + {2392837200 7200 0 EET} + {2405541600 10800 1 EEST} + {2424286800 7200 0 EET} + {2437596000 10800 1 EEST} + {2455736400 7200 0 EET} + {2469045600 10800 1 EEST} + {2487186000 7200 0 EET} + {2500495200 10800 1 EEST} + {2519240400 7200 0 EET} + {2531944800 10800 1 EEST} + {2550690000 7200 0 EET} + {2563394400 10800 1 EEST} + {2582139600 7200 0 EET} + {2595448800 10800 1 EEST} + {2613589200 7200 0 EET} + {2626898400 10800 1 EEST} + {2645038800 7200 0 EET} + {2658348000 10800 1 EEST} + {2676488400 7200 0 EET} + {2689797600 10800 1 EEST} + {2708542800 7200 0 EET} + {2721247200 10800 1 EEST} + {2739992400 7200 0 EET} + {2752696800 10800 1 EEST} + {2771442000 7200 0 EET} + {2784751200 10800 1 EEST} + {2802891600 7200 0 EET} + {2816200800 10800 1 EEST} + {2834341200 7200 0 EET} + {2847650400 10800 1 EEST} + {2866395600 7200 0 EET} + {2879100000 10800 1 EEST} + {2897845200 7200 0 EET} + {2910549600 10800 1 EEST} + {2929294800 7200 0 EET} + {2941999200 10800 1 EEST} + {2960744400 7200 0 EET} + {2974053600 10800 1 EEST} + {2992194000 7200 0 EET} + {3005503200 10800 1 EEST} + {3023643600 7200 0 EET} + {3036952800 10800 1 EEST} + {3055698000 7200 0 EET} + {3068402400 10800 1 EEST} + {3087147600 7200 0 EET} + {3099852000 10800 1 EEST} + {3118597200 7200 0 EET} + {3131906400 10800 1 EEST} + {3150046800 7200 0 EET} + {3163356000 10800 1 EEST} + {3181496400 7200 0 EET} + {3194805600 10800 1 EEST} + {3212946000 7200 0 EET} + {3226255200 10800 1 EEST} + {3245000400 7200 0 EET} + {3257704800 10800 1 EEST} + {3276450000 7200 0 EET} + {3289154400 10800 1 EEST} + {3307899600 7200 0 EET} + {3321208800 10800 1 EEST} + {3339349200 7200 0 EET} + {3352658400 10800 1 EEST} + {3370798800 7200 0 EET} + {3384108000 10800 1 EEST} + {3402853200 7200 0 EET} + {3415557600 10800 1 EEST} + {3434302800 7200 0 EET} + {3447007200 10800 1 EEST} + {3465752400 7200 0 EET} + {3479061600 10800 1 EEST} + {3497202000 7200 0 EET} + {3510511200 10800 1 EEST} + {3528651600 7200 0 EET} + {3541960800 10800 1 EEST} + {3560101200 7200 0 EET} + {3573410400 10800 1 EEST} + {3592155600 7200 0 EET} + {3604860000 10800 1 EEST} + {3623605200 7200 0 EET} + {3636309600 10800 1 EEST} + {3655054800 7200 0 EET} + {3668364000 10800 1 EEST} + {3686504400 7200 0 EET} + {3699813600 10800 1 EEST} + {3717954000 7200 0 EET} + {3731263200 10800 1 EEST} + {3750008400 7200 0 EET} + {3762712800 10800 1 EEST} + {3781458000 7200 0 EET} + {3794162400 10800 1 EEST} + {3812907600 7200 0 EET} + {3825612000 10800 1 EEST} + {3844357200 7200 0 EET} + {3857666400 10800 1 EEST} + {3875806800 7200 0 EET} + {3889116000 10800 1 EEST} + {3907256400 7200 0 EET} + {3920565600 10800 1 EEST} + {3939310800 7200 0 EET} + {3952015200 10800 1 EEST} + {3970760400 7200 0 EET} + {3983464800 10800 1 EEST} + {4002210000 7200 0 EET} + {4015519200 10800 1 EEST} + {4033659600 7200 0 EET} + {4046968800 10800 1 EEST} + {4065109200 7200 0 EET} + {4078418400 10800 1 EEST} + {4096558800 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Bishkek b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Bishkek new file mode 100644 index 00000000..bc4cbddd --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Bishkek @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Bishkek) { + {-9223372036854775808 17904 0 LMT} + {-1441169904 18000 0 +05} + {-1247547600 21600 0 +06} + {354909600 25200 1 +06} + {370717200 21600 0 +06} + {386445600 25200 1 +06} + {402253200 21600 0 +06} + {417981600 25200 1 +06} + {433789200 21600 0 +06} + {449604000 25200 1 +06} + {465336000 21600 0 +06} + {481060800 25200 1 +06} + {496785600 21600 0 +06} + {512510400 25200 1 +06} + {528235200 21600 0 +06} + {543960000 25200 1 +06} + {559684800 21600 0 +06} + {575409600 25200 1 +06} + {591134400 21600 0 +06} + {606859200 25200 1 +06} + {622584000 21600 0 +06} + {638308800 25200 1 +06} + {654638400 21600 0 +06} + {670363200 18000 0 +05} + {670366800 21600 1 +05} + {683586000 18000 0 +05} + {703018800 21600 1 +05} + {717530400 18000 0 +05} + {734468400 21600 1 +05} + {748980000 18000 0 +05} + {765918000 21600 1 +05} + {780429600 18000 0 +05} + {797367600 21600 1 +05} + {811879200 18000 0 +05} + {828817200 21600 1 +05} + {843933600 18000 0 +05} + {859671000 21600 1 +05} + {877811400 18000 0 +05} + {891120600 21600 1 +05} + {909261000 18000 0 +05} + {922570200 21600 1 +05} + {941315400 18000 0 +05} + {954019800 21600 1 +05} + {972765000 18000 0 +05} + {985469400 21600 1 +05} + {1004214600 18000 0 +05} + {1017523800 21600 1 +05} + {1035664200 18000 0 +05} + {1048973400 21600 1 +05} + {1067113800 18000 0 +05} + {1080423000 21600 1 +05} + {1099168200 18000 0 +05} + {1111872600 21600 1 +05} + {1123783200 21600 0 +06} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Brunei b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Brunei new file mode 100644 index 00000000..ec1a78d9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Brunei @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Kuching)]} { + LoadTimeZoneFile Asia/Kuching +} +set TZData(:Asia/Brunei) $TZData(:Asia/Kuching) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Choibalsan b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Choibalsan new file mode 100644 index 00000000..b072c767 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Choibalsan @@ -0,0 +1,56 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Choibalsan) { + {-9223372036854775808 27480 0 LMT} + {-2032933080 25200 0 +07} + {252435600 28800 0 +08} + {417974400 36000 0 +09} + {433778400 32400 0 +09} + {449593200 36000 1 +09} + {465314400 32400 0 +09} + {481042800 36000 1 +09} + {496764000 32400 0 +09} + {512492400 36000 1 +09} + {528213600 32400 0 +09} + {543942000 36000 1 +09} + {559663200 32400 0 +09} + {575391600 36000 1 +09} + {591112800 32400 0 +09} + {606841200 36000 1 +09} + {622562400 32400 0 +09} + {638290800 36000 1 +09} + {654616800 32400 0 +09} + {670345200 36000 1 +09} + {686066400 32400 0 +09} + {701794800 36000 1 +09} + {717516000 32400 0 +09} + {733244400 36000 1 +09} + {748965600 32400 0 +09} + {764694000 36000 1 +09} + {780415200 32400 0 +09} + {796143600 36000 1 +09} + {811864800 32400 0 +09} + {828198000 36000 1 +09} + {843919200 32400 0 +09} + {859647600 36000 1 +09} + {875368800 32400 0 +09} + {891097200 36000 1 +09} + {906818400 32400 0 +09} + {988390800 36000 1 +09} + {1001692800 32400 0 +09} + {1017421200 36000 1 +09} + {1033142400 32400 0 +09} + {1048870800 36000 1 +09} + {1064592000 32400 0 +09} + {1080320400 36000 1 +09} + {1096041600 32400 0 +09} + {1111770000 36000 1 +09} + {1127491200 32400 0 +09} + {1143219600 36000 1 +09} + {1159545600 32400 0 +09} + {1206889200 28800 0 +08} + {1427479200 32400 1 +08} + {1443193200 28800 0 +08} + {1458928800 32400 1 +08} + {1474642800 28800 0 +08} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Chongqing b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Chongqing new file mode 100644 index 00000000..ba515fec --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Chongqing @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Shanghai)]} { + LoadTimeZoneFile Asia/Shanghai +} +set TZData(:Asia/Chongqing) $TZData(:Asia/Shanghai) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Chungking b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Chungking new file mode 100644 index 00000000..fa857dda --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Chungking @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Shanghai)]} { + LoadTimeZoneFile Asia/Shanghai +} +set TZData(:Asia/Chungking) $TZData(:Asia/Shanghai) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Colombo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Colombo new file mode 100644 index 00000000..7a14a9b5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Colombo @@ -0,0 +1,13 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Colombo) { + {-9223372036854775808 19164 0 LMT} + {-2840159964 19172 0 MMT} + {-2019705572 19800 0 +0530} + {-883287000 21600 1 +06} + {-862639200 23400 1 +0630} + {-764051400 19800 0 +0530} + {832962600 23400 0 +0630} + {846266400 21600 0 +06} + {1145039400 19800 0 +0530} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Damascus b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Damascus new file mode 100644 index 00000000..92ac4f5e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Damascus @@ -0,0 +1,126 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Damascus) { + {-9223372036854775808 8712 0 LMT} + {-1577931912 7200 0 EET} + {-1568592000 10800 1 EEST} + {-1554080400 7200 0 EET} + {-1537142400 10800 1 EEST} + {-1522630800 7200 0 EET} + {-1505692800 10800 1 EEST} + {-1491181200 7200 0 EET} + {-1474243200 10800 1 EEST} + {-1459126800 7200 0 EET} + {-242265600 10800 1 EEST} + {-228877200 7200 0 EET} + {-210556800 10800 1 EEST} + {-197427600 7200 0 EET} + {-178934400 10800 1 EEST} + {-165718800 7200 0 EET} + {-147398400 10800 1 EEST} + {-134269200 7200 0 EET} + {-116467200 10800 1 EEST} + {-102646800 7200 0 EET} + {-84326400 10800 1 EEST} + {-71110800 7200 0 EET} + {-52704000 10800 1 EEST} + {-39488400 7200 0 EET} + {-21168000 10800 1 EEST} + {-7952400 7200 0 EET} + {10368000 10800 1 EEST} + {23583600 7200 0 EET} + {41904000 10800 1 EEST} + {55119600 7200 0 EET} + {73526400 10800 1 EEST} + {86742000 7200 0 EET} + {105062400 10800 1 EEST} + {118278000 7200 0 EET} + {136598400 10800 1 EEST} + {149814000 7200 0 EET} + {168134400 10800 1 EEST} + {181350000 7200 0 EET} + {199756800 10800 1 EEST} + {212972400 7200 0 EET} + {231292800 10800 1 EEST} + {241916400 7200 0 EET} + {262828800 10800 1 EEST} + {273452400 7200 0 EET} + {418694400 10800 1 EEST} + {433810800 7200 0 EET} + {450316800 10800 1 EEST} + {465433200 7200 0 EET} + {508896000 10800 1 EEST} + {529196400 7200 0 EET} + {541555200 10800 1 EEST} + {562633200 7200 0 EET} + {574387200 10800 1 EEST} + {594255600 7200 0 EET} + {607305600 10800 1 EEST} + {623199600 7200 0 EET} + {638928000 10800 1 EEST} + {654649200 7200 0 EET} + {670456800 10800 1 EEST} + {686264400 7200 0 EET} + {702684000 10800 1 EEST} + {717886800 7200 0 EET} + {733096800 10800 1 EEST} + {748904400 7200 0 EET} + {765151200 10800 1 EEST} + {780958800 7200 0 EET} + {796687200 10800 1 EEST} + {812494800 7200 0 EET} + {828309600 10800 1 EEST} + {844117200 7200 0 EET} + {859759200 10800 1 EEST} + {875653200 7200 0 EET} + {891208800 10800 1 EEST} + {907189200 7200 0 EET} + {922917600 10800 1 EEST} + {938725200 7200 0 EET} + {954540000 10800 1 EEST} + {970347600 7200 0 EET} + {986076000 10800 1 EEST} + {1001883600 7200 0 EET} + {1017612000 10800 1 EEST} + {1033419600 7200 0 EET} + {1049148000 10800 1 EEST} + {1064955600 7200 0 EET} + {1080770400 10800 1 EEST} + {1096578000 7200 0 EET} + {1112306400 10800 1 EEST} + {1128114000 7200 0 EET} + {1143842400 10800 1 EEST} + {1158872400 7200 0 EET} + {1175205600 10800 1 EEST} + {1193950800 7200 0 EET} + {1207260000 10800 1 EEST} + {1225486800 7200 0 EET} + {1238104800 10800 1 EEST} + {1256850000 7200 0 EET} + {1270159200 10800 1 EEST} + {1288299600 7200 0 EET} + {1301608800 10800 1 EEST} + {1319749200 7200 0 EET} + {1333058400 10800 1 EEST} + {1351198800 7200 0 EET} + {1364508000 10800 1 EEST} + {1382648400 7200 0 EET} + {1395957600 10800 1 EEST} + {1414702800 7200 0 EET} + {1427407200 10800 1 EEST} + {1446152400 7200 0 EET} + {1458856800 10800 1 EEST} + {1477602000 7200 0 EET} + {1490911200 10800 1 EEST} + {1509051600 7200 0 EET} + {1522360800 10800 1 EEST} + {1540501200 7200 0 EET} + {1553810400 10800 1 EEST} + {1571950800 7200 0 EET} + {1585260000 10800 1 EEST} + {1604005200 7200 0 EET} + {1616709600 10800 1 EEST} + {1635454800 7200 0 EET} + {1648159200 10800 1 EEST} + {1666908000 10800 0 +03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Dili b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Dili new file mode 100644 index 00000000..89cf22f0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Dili @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Dili) { + {-9223372036854775808 30140 0 LMT} + {-1830414140 28800 0 +08} + {-879152400 32400 0 +09} + {199897200 28800 0 +08} + {969120000 32400 0 +09} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Dubai b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Dubai new file mode 100644 index 00000000..6c18e798 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Dubai @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Dubai) { + {-9223372036854775808 13272 0 LMT} + {-1577936472 14400 0 +04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Dushanbe b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Dushanbe new file mode 100644 index 00000000..fe82ce7c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Dushanbe @@ -0,0 +1,29 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Dushanbe) { + {-9223372036854775808 16512 0 LMT} + {-1441168512 18000 0 +05} + {-1247547600 21600 0 +06} + {354909600 25200 1 +06} + {370717200 21600 0 +06} + {386445600 25200 1 +06} + {402253200 21600 0 +06} + {417981600 25200 1 +06} + {433789200 21600 0 +06} + {449604000 25200 1 +06} + {465336000 21600 0 +06} + {481060800 25200 1 +06} + {496785600 21600 0 +06} + {512510400 25200 1 +06} + {528235200 21600 0 +06} + {543960000 25200 1 +06} + {559684800 21600 0 +06} + {575409600 25200 1 +06} + {591134400 21600 0 +06} + {606859200 25200 1 +06} + {622584000 21600 0 +06} + {638308800 25200 1 +06} + {654638400 21600 0 +06} + {670363200 21600 1 +06} + {684363600 18000 0 +05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Harbin b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Harbin new file mode 100644 index 00000000..dfcb5498 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Harbin @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Shanghai)]} { + LoadTimeZoneFile Asia/Shanghai +} +set TZData(:Asia/Harbin) $TZData(:Asia/Shanghai) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Hebron b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Hebron new file mode 100644 index 00000000..b92db8da --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Hebron @@ -0,0 +1,283 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Hebron) { + {-9223372036854775808 8423 0 LMT} + {-2185410023 7200 0 EEST} + {-933638400 10800 1 EEST} + {-923097600 7200 0 EEST} + {-919036800 10800 1 EEST} + {-857347200 7200 0 EEST} + {-844300800 10800 1 EEST} + {-825811200 7200 0 EEST} + {-812678400 10800 1 EEST} + {-794188800 7200 0 EEST} + {-779846400 10800 1 EEST} + {-762652800 7200 0 EEST} + {-748310400 10800 1 EEST} + {-731116800 7200 0 EEST} + {-682653600 7200 0 EET} + {-399088800 10800 1 EEST} + {-386650800 7200 0 EET} + {-368330400 10800 1 EEST} + {-355114800 7200 0 EET} + {-336790800 10800 1 EEST} + {-323654400 7200 0 EET} + {-305168400 10800 1 EEST} + {-292032000 7200 0 EET} + {-273632400 10800 1 EEST} + {-260496000 7200 0 EET} + {-242096400 10800 1 EEST} + {-228960000 7200 0 EET} + {-210560400 10800 1 EEST} + {-197424000 7200 0 EET} + {-178938000 10800 1 EEST} + {-165801600 7200 0 EET} + {-147402000 10800 1 EEST} + {-134265600 7200 0 EET} + {-115866000 10800 1 EEST} + {-102643200 7200 0 EET} + {-84330000 10800 1 EEST} + {-81313200 10800 0 IST} + {142376400 10800 1 IDT} + {150843600 7200 0 IST} + {167176800 10800 1 IDT} + {178664400 7200 0 IST} + {334101600 10800 1 IDT} + {337730400 7200 0 IST} + {452642400 10800 1 IDT} + {462319200 7200 0 IST} + {482277600 10800 1 IDT} + {494370000 7200 0 IST} + {516751200 10800 1 IDT} + {526424400 7200 0 IST} + {545436000 10800 1 IDT} + {558478800 7200 0 IST} + {576626400 10800 1 IDT} + {589323600 7200 0 IST} + {609890400 10800 1 IDT} + {620773200 7200 0 IST} + {638316000 10800 1 IDT} + {651618000 7200 0 IST} + {669765600 10800 1 IDT} + {683672400 7200 0 IST} + {701820000 10800 1 IDT} + {715726800 7200 0 IST} + {733701600 10800 1 IDT} + {747176400 7200 0 IST} + {765151200 10800 1 IDT} + {778021200 7200 0 IST} + {796600800 10800 1 IDT} + {810075600 7200 0 IST} + {820447200 7200 0 EET} + {828655200 10800 1 EEST} + {843170400 7200 0 EET} + {860104800 10800 1 EEST} + {874620000 7200 0 EET} + {891554400 10800 1 EEST} + {906069600 7200 0 EET} + {915141600 7200 0 EET} + {924213600 10800 1 EEST} + {939934800 7200 0 EET} + {956268000 10800 1 EEST} + {971989200 7200 0 EET} + {987717600 10800 1 EEST} + {1003438800 7200 0 EET} + {1019167200 10800 1 EEST} + {1034888400 7200 0 EET} + {1050616800 10800 1 EEST} + {1066338000 7200 0 EET} + {1082066400 10800 1 EEST} + {1096581600 7200 0 EET} + {1113516000 10800 1 EEST} + {1128380400 7200 0 EET} + {1143842400 10800 1 EEST} + {1158872400 7200 0 EET} + {1175378400 10800 1 EEST} + {1189638000 7200 0 EET} + {1206655200 10800 1 EEST} + {1220216400 7200 0 EET} + {1238104800 10800 1 EEST} + {1252015200 7200 0 EET} + {1269554400 10800 1 EEST} + {1281474000 7200 0 EET} + {1301608860 10800 1 EEST} + {1312146000 7200 0 EET} + {1314655200 10800 1 EEST} + {1317330000 7200 0 EET} + {1333058400 10800 1 EEST} + {1348178400 7200 0 EET} + {1364508000 10800 1 EEST} + {1380229200 7200 0 EET} + {1395957600 10800 1 EEST} + {1414098000 7200 0 EET} + {1427493600 10800 1 EEST} + {1445551200 7200 0 EET} + {1458946800 10800 1 EEST} + {1477692000 7200 0 EET} + {1490396400 10800 1 EEST} + {1509141600 7200 0 EET} + {1521846000 10800 1 EEST} + {1540591200 7200 0 EET} + {1553810400 10800 1 EEST} + {1572037200 7200 0 EET} + {1585346400 10800 1 EEST} + {1603490400 7200 0 EET} + {1616796000 10800 1 EEST} + {1635458400 7200 0 EET} + {1648332000 10800 1 EEST} + {1666998000 7200 0 EET} + {1679702400 10800 1 EEST} + {1698447600 7200 0 EET} + {1711756800 10800 1 EEST} + {1729897200 7200 0 EET} + {1743206400 10800 1 EEST} + {1761346800 7200 0 EET} + {1774656000 10800 1 EEST} + {1792796400 7200 0 EET} + {1806105600 10800 1 EEST} + {1824850800 7200 0 EET} + {1837555200 10800 1 EEST} + {1856300400 7200 0 EET} + {1869004800 10800 1 EEST} + {1887750000 7200 0 EET} + {1901059200 10800 1 EEST} + {1919199600 7200 0 EET} + {1932508800 10800 1 EEST} + {1950649200 7200 0 EET} + {1963958400 10800 1 EEST} + {1982703600 7200 0 EET} + {1995408000 10800 1 EEST} + {2014153200 7200 0 EET} + {2026857600 10800 1 EEST} + {2045602800 7200 0 EET} + {2058307200 10800 1 EEST} + {2077052400 7200 0 EET} + {2090361600 10800 1 EEST} + {2108502000 7200 0 EET} + {2121811200 10800 1 EEST} + {2139951600 7200 0 EET} + {2153260800 10800 1 EEST} + {2172006000 7200 0 EET} + {2184710400 10800 1 EEST} + {2203455600 7200 0 EET} + {2216160000 10800 1 EEST} + {2234905200 7200 0 EET} + {2248214400 10800 1 EEST} + {2266354800 7200 0 EET} + {2279664000 10800 1 EEST} + {2297804400 7200 0 EET} + {2311113600 10800 1 EEST} + {2329254000 7200 0 EET} + {2342563200 10800 1 EEST} + {2361308400 7200 0 EET} + {2374012800 10800 1 EEST} + {2392758000 7200 0 EET} + {2405462400 10800 1 EEST} + {2424207600 7200 0 EET} + {2437516800 10800 1 EEST} + {2455657200 7200 0 EET} + {2468966400 10800 1 EEST} + {2487106800 7200 0 EET} + {2500416000 10800 1 EEST} + {2519161200 7200 0 EET} + {2531865600 10800 1 EEST} + {2550610800 7200 0 EET} + {2563315200 10800 1 EEST} + {2582060400 7200 0 EET} + {2595369600 10800 1 EEST} + {2613510000 7200 0 EET} + {2626819200 10800 1 EEST} + {2644959600 7200 0 EET} + {2658268800 10800 1 EEST} + {2676409200 7200 0 EET} + {2689718400 10800 1 EEST} + {2708463600 7200 0 EET} + {2721168000 10800 1 EEST} + {2739913200 7200 0 EET} + {2752617600 10800 1 EEST} + {2771362800 7200 0 EET} + {2784672000 10800 1 EEST} + {2802812400 7200 0 EET} + {2816121600 10800 1 EEST} + {2834262000 7200 0 EET} + {2847571200 10800 1 EEST} + {2866316400 7200 0 EET} + {2879020800 10800 1 EEST} + {2897766000 7200 0 EET} + {2910470400 10800 1 EEST} + {2929215600 7200 0 EET} + {2941920000 10800 1 EEST} + {2960665200 7200 0 EET} + {2973974400 10800 1 EEST} + {2992114800 7200 0 EET} + {3005424000 10800 1 EEST} + {3023564400 7200 0 EET} + {3036873600 10800 1 EEST} + {3055618800 7200 0 EET} + {3068323200 10800 1 EEST} + {3087068400 7200 0 EET} + {3099772800 10800 1 EEST} + {3118518000 7200 0 EET} + {3131827200 10800 1 EEST} + {3149967600 7200 0 EET} + {3163276800 10800 1 EEST} + {3181417200 7200 0 EET} + {3194726400 10800 1 EEST} + {3212866800 7200 0 EET} + {3226176000 10800 1 EEST} + {3244921200 7200 0 EET} + {3257625600 10800 1 EEST} + {3276370800 7200 0 EET} + {3289075200 10800 1 EEST} + {3307820400 7200 0 EET} + {3321129600 10800 1 EEST} + {3339270000 7200 0 EET} + {3352579200 10800 1 EEST} + {3370719600 7200 0 EET} + {3384028800 10800 1 EEST} + {3402774000 7200 0 EET} + {3415478400 10800 1 EEST} + {3434223600 7200 0 EET} + {3446928000 10800 1 EEST} + {3465673200 7200 0 EET} + {3478982400 10800 1 EEST} + {3497122800 7200 0 EET} + {3510432000 10800 1 EEST} + {3528572400 7200 0 EET} + {3541881600 10800 1 EEST} + {3560022000 7200 0 EET} + {3573331200 10800 1 EEST} + {3592076400 7200 0 EET} + {3604780800 10800 1 EEST} + {3623526000 7200 0 EET} + {3636230400 10800 1 EEST} + {3654975600 7200 0 EET} + {3668284800 10800 1 EEST} + {3686425200 7200 0 EET} + {3699734400 10800 1 EEST} + {3717874800 7200 0 EET} + {3731184000 10800 1 EEST} + {3749929200 7200 0 EET} + {3762633600 10800 1 EEST} + {3781378800 7200 0 EET} + {3794083200 10800 1 EEST} + {3812828400 7200 0 EET} + {3825532800 10800 1 EEST} + {3844278000 7200 0 EET} + {3857587200 10800 1 EEST} + {3875727600 7200 0 EET} + {3889036800 10800 1 EEST} + {3907177200 7200 0 EET} + {3920486400 10800 1 EEST} + {3939231600 7200 0 EET} + {3951936000 10800 1 EEST} + {3970681200 7200 0 EET} + {3983385600 10800 1 EEST} + {4002130800 7200 0 EET} + {4015440000 10800 1 EEST} + {4033580400 7200 0 EET} + {4046889600 10800 1 EEST} + {4065030000 7200 0 EET} + {4078339200 10800 1 EEST} + {4096479600 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ho_Chi_Minh b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ho_Chi_Minh new file mode 100644 index 00000000..46895167 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ho_Chi_Minh @@ -0,0 +1,14 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Ho_Chi_Minh) { + {-9223372036854775808 25590 0 LMT} + {-2004073590 25590 0 PLMT} + {-1851577590 25200 0 +07} + {-852105600 28800 0 +08} + {-782643600 32400 0 +09} + {-767869200 25200 0 +07} + {-718095600 28800 0 +08} + {-457776000 25200 0 +07} + {-315648000 28800 0 +08} + {171820800 25200 0 +07} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Hong_Kong b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Hong_Kong new file mode 100644 index 00000000..8f5ed2c1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Hong_Kong @@ -0,0 +1,75 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Hong_Kong) { + {-9223372036854775808 27402 0 LMT} + {-2056690800 28800 0 HKT} + {-900910800 32400 1 HKST} + {-891579600 30600 1 HKWT} + {-884248200 32400 0 JST} + {-761209200 28800 0 HKT} + {-747907200 32400 1 HKST} + {-728541000 28800 0 HKT} + {-717049800 32400 1 HKST} + {-697091400 28800 0 HKT} + {-683785800 32400 1 HKST} + {-668061000 28800 0 HKT} + {-654755400 32400 1 HKST} + {-636611400 28800 0 HKT} + {-623305800 32400 1 HKST} + {-605161800 28800 0 HKT} + {-591856200 32400 1 HKST} + {-573712200 28800 0 HKT} + {-559801800 32400 1 HKST} + {-541657800 28800 0 HKT} + {-528352200 32400 1 HKST} + {-510211800 28800 0 HKT} + {-498112200 32400 1 HKST} + {-478762200 28800 0 HKT} + {-466662600 32400 1 HKST} + {-446707800 28800 0 HKT} + {-435213000 32400 1 HKST} + {-415258200 28800 0 HKT} + {-403158600 32400 1 HKST} + {-383808600 28800 0 HKT} + {-371709000 32400 1 HKST} + {-352359000 28800 0 HKT} + {-340259400 32400 1 HKST} + {-320909400 28800 0 HKT} + {-308809800 32400 1 HKST} + {-288855000 28800 0 HKT} + {-277360200 32400 1 HKST} + {-257405400 28800 0 HKT} + {-245910600 32400 1 HKST} + {-225955800 28800 0 HKT} + {-213856200 32400 1 HKST} + {-194506200 28800 0 HKT} + {-182406600 32400 1 HKST} + {-163056600 28800 0 HKT} + {-148537800 32400 1 HKST} + {-132816600 28800 0 HKT} + {-117088200 32400 1 HKST} + {-101367000 28800 0 HKT} + {-85638600 32400 1 HKST} + {-69312600 28800 0 HKT} + {-53584200 32400 1 HKST} + {-37863000 28800 0 HKT} + {-22134600 32400 1 HKST} + {-6413400 28800 0 HKT} + {9315000 32400 1 HKST} + {25036200 28800 0 HKT} + {40764600 32400 1 HKST} + {56485800 28800 0 HKT} + {72214200 32400 1 HKST} + {88540200 28800 0 HKT} + {104268600 32400 1 HKST} + {119989800 28800 0 HKT} + {126041400 32400 1 HKST} + {135714600 32400 1 HKST} + {151439400 28800 0 HKT} + {167167800 32400 1 HKST} + {182889000 28800 0 HKT} + {198617400 32400 1 HKST} + {214338600 28800 0 HKT} + {295385400 32400 1 HKST} + {309292200 28800 0 HKT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Hovd b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Hovd new file mode 100644 index 00000000..9b14d5bc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Hovd @@ -0,0 +1,55 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Hovd) { + {-9223372036854775808 21996 0 LMT} + {-2032927596 21600 0 +06} + {252439200 25200 0 +07} + {417978000 28800 1 +07} + {433785600 25200 0 +07} + {449600400 28800 1 +07} + {465321600 25200 0 +07} + {481050000 28800 1 +07} + {496771200 25200 0 +07} + {512499600 28800 1 +07} + {528220800 25200 0 +07} + {543949200 28800 1 +07} + {559670400 25200 0 +07} + {575398800 28800 1 +07} + {591120000 25200 0 +07} + {606848400 28800 1 +07} + {622569600 25200 0 +07} + {638298000 28800 1 +07} + {654624000 25200 0 +07} + {670352400 28800 1 +07} + {686073600 25200 0 +07} + {701802000 28800 1 +07} + {717523200 25200 0 +07} + {733251600 28800 1 +07} + {748972800 25200 0 +07} + {764701200 28800 1 +07} + {780422400 25200 0 +07} + {796150800 28800 1 +07} + {811872000 25200 0 +07} + {828205200 28800 1 +07} + {843926400 25200 0 +07} + {859654800 28800 1 +07} + {875376000 25200 0 +07} + {891104400 28800 1 +07} + {906825600 25200 0 +07} + {988398000 28800 1 +07} + {1001700000 25200 0 +07} + {1017428400 28800 1 +07} + {1033149600 25200 0 +07} + {1048878000 28800 1 +07} + {1064599200 25200 0 +07} + {1080327600 28800 1 +07} + {1096048800 25200 0 +07} + {1111777200 28800 1 +07} + {1127498400 25200 0 +07} + {1143226800 28800 1 +07} + {1159552800 25200 0 +07} + {1427482800 28800 1 +07} + {1443196800 25200 0 +07} + {1458932400 28800 1 +07} + {1474646400 25200 0 +07} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Irkutsk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Irkutsk new file mode 100644 index 00000000..96669692 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Irkutsk @@ -0,0 +1,72 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Irkutsk) { + {-9223372036854775808 25025 0 LMT} + {-2840165825 25025 0 IMT} + {-1575874625 25200 0 +07} + {-1247554800 28800 0 +09} + {354902400 32400 1 +09} + {370710000 28800 0 +08} + {386438400 32400 1 +09} + {402246000 28800 0 +08} + {417974400 32400 1 +09} + {433782000 28800 0 +08} + {449596800 32400 1 +09} + {465328800 28800 0 +08} + {481053600 32400 1 +09} + {496778400 28800 0 +08} + {512503200 32400 1 +09} + {528228000 28800 0 +08} + {543952800 32400 1 +09} + {559677600 28800 0 +08} + {575402400 32400 1 +09} + {591127200 28800 0 +08} + {606852000 32400 1 +09} + {622576800 28800 0 +08} + {638301600 32400 1 +09} + {654631200 28800 0 +08} + {670356000 25200 0 +08} + {670359600 28800 1 +08} + {686084400 25200 0 +07} + {695761200 28800 0 +09} + {701805600 32400 1 +09} + {717530400 28800 0 +08} + {733255200 32400 1 +09} + {748980000 28800 0 +08} + {764704800 32400 1 +09} + {780429600 28800 0 +08} + {796154400 32400 1 +09} + {811879200 28800 0 +08} + {828208800 32400 1 +09} + {846352800 28800 0 +08} + {859658400 32400 1 +09} + {877802400 28800 0 +08} + {891108000 32400 1 +09} + {909252000 28800 0 +08} + {922557600 32400 1 +09} + {941306400 28800 0 +08} + {954007200 32400 1 +09} + {972756000 28800 0 +08} + {985456800 32400 1 +09} + {1004205600 28800 0 +08} + {1017511200 32400 1 +09} + {1035655200 28800 0 +08} + {1048960800 32400 1 +09} + {1067104800 28800 0 +08} + {1080410400 32400 1 +09} + {1099159200 28800 0 +08} + {1111860000 32400 1 +09} + {1130608800 28800 0 +08} + {1143309600 32400 1 +09} + {1162058400 28800 0 +08} + {1174759200 32400 1 +09} + {1193508000 28800 0 +08} + {1206813600 32400 1 +09} + {1224957600 28800 0 +08} + {1238263200 32400 1 +09} + {1256407200 28800 0 +08} + {1269712800 32400 1 +09} + {1288461600 28800 0 +08} + {1301162400 32400 0 +09} + {1414256400 28800 0 +08} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Istanbul b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Istanbul new file mode 100644 index 00000000..85b3fc22 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Istanbul @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Istanbul)]} { + LoadTimeZoneFile Europe/Istanbul +} +set TZData(:Asia/Istanbul) $TZData(:Europe/Istanbul) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Jerusalem b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Jerusalem new file mode 100644 index 00000000..596deb32 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Jerusalem @@ -0,0 +1,278 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Jerusalem) { + {-9223372036854775808 8454 0 LMT} + {-2840149254 8440 0 JMT} + {-1641003640 7200 0 IST} + {-933638400 10800 1 IDT} + {-923097600 7200 0 IST} + {-919036800 10800 1 IDT} + {-857347200 7200 0 IST} + {-844300800 10800 1 IDT} + {-825811200 7200 0 IST} + {-812678400 10800 1 IDT} + {-794188800 7200 0 IST} + {-779846400 10800 1 IDT} + {-762652800 7200 0 IST} + {-748310400 10800 1 IDT} + {-731116800 7200 0 IST} + {-681955200 14400 1 IDDT} + {-673228800 10800 1 IDT} + {-667958400 7200 0 IST} + {-652320000 10800 1 IDT} + {-636422400 7200 0 IST} + {-622080000 10800 1 IDT} + {-608947200 7200 0 IST} + {-591840000 10800 1 IDT} + {-572486400 7200 0 IST} + {-558576000 10800 1 IDT} + {-542851200 7200 0 IST} + {-527731200 10800 1 IDT} + {-514425600 7200 0 IST} + {-490838400 10800 1 IDT} + {-482976000 7200 0 IST} + {-459388800 10800 1 IDT} + {-451526400 7200 0 IST} + {-428544000 10800 1 IDT} + {-418262400 7200 0 IST} + {-400118400 10800 1 IDT} + {-387417600 7200 0 IST} + {142380000 10800 1 IDT} + {150843600 7200 0 IST} + {167176800 10800 1 IDT} + {178664400 7200 0 IST} + {334101600 10800 1 IDT} + {337730400 7200 0 IST} + {452642400 10800 1 IDT} + {462319200 7200 0 IST} + {482277600 10800 1 IDT} + {494370000 7200 0 IST} + {516751200 10800 1 IDT} + {526424400 7200 0 IST} + {545436000 10800 1 IDT} + {558478800 7200 0 IST} + {576626400 10800 1 IDT} + {589323600 7200 0 IST} + {609890400 10800 1 IDT} + {620773200 7200 0 IST} + {638316000 10800 1 IDT} + {651618000 7200 0 IST} + {669765600 10800 1 IDT} + {683672400 7200 0 IST} + {701820000 10800 1 IDT} + {715726800 7200 0 IST} + {733701600 10800 1 IDT} + {747176400 7200 0 IST} + {765151200 10800 1 IDT} + {778021200 7200 0 IST} + {796600800 10800 1 IDT} + {810075600 7200 0 IST} + {826840800 10800 1 IDT} + {842821200 7200 0 IST} + {858895200 10800 1 IDT} + {874184400 7200 0 IST} + {890344800 10800 1 IDT} + {905029200 7200 0 IST} + {923011200 10800 1 IDT} + {936313200 7200 0 IST} + {955670400 10800 1 IDT} + {970783200 7200 0 IST} + {986770800 10800 1 IDT} + {1001282400 7200 0 IST} + {1017356400 10800 1 IDT} + {1033941600 7200 0 IST} + {1048806000 10800 1 IDT} + {1065132000 7200 0 IST} + {1081292400 10800 1 IDT} + {1095804000 7200 0 IST} + {1112313600 10800 1 IDT} + {1128812400 7200 0 IST} + {1143763200 10800 1 IDT} + {1159657200 7200 0 IST} + {1175212800 10800 1 IDT} + {1189897200 7200 0 IST} + {1206662400 10800 1 IDT} + {1223161200 7200 0 IST} + {1238112000 10800 1 IDT} + {1254006000 7200 0 IST} + {1269561600 10800 1 IDT} + {1284246000 7200 0 IST} + {1301616000 10800 1 IDT} + {1317510000 7200 0 IST} + {1333065600 10800 1 IDT} + {1348354800 7200 0 IST} + {1364515200 10800 1 IDT} + {1382828400 7200 0 IST} + {1395964800 10800 1 IDT} + {1414278000 7200 0 IST} + {1427414400 10800 1 IDT} + {1445727600 7200 0 IST} + {1458864000 10800 1 IDT} + {1477782000 7200 0 IST} + {1490313600 10800 1 IDT} + {1509231600 7200 0 IST} + {1521763200 10800 1 IDT} + {1540681200 7200 0 IST} + {1553817600 10800 1 IDT} + {1572130800 7200 0 IST} + {1585267200 10800 1 IDT} + {1603580400 7200 0 IST} + {1616716800 10800 1 IDT} + {1635634800 7200 0 IST} + {1648166400 10800 1 IDT} + {1667084400 7200 0 IST} + {1679616000 10800 1 IDT} + {1698534000 7200 0 IST} + {1711670400 10800 1 IDT} + {1729983600 7200 0 IST} + {1743120000 10800 1 IDT} + {1761433200 7200 0 IST} + {1774569600 10800 1 IDT} + {1792882800 7200 0 IST} + {1806019200 10800 1 IDT} + {1824937200 7200 0 IST} + {1837468800 10800 1 IDT} + {1856386800 7200 0 IST} + {1868918400 10800 1 IDT} + {1887836400 7200 0 IST} + {1900972800 10800 1 IDT} + {1919286000 7200 0 IST} + {1932422400 10800 1 IDT} + {1950735600 7200 0 IST} + {1963872000 10800 1 IDT} + {1982790000 7200 0 IST} + {1995321600 10800 1 IDT} + {2014239600 7200 0 IST} + {2026771200 10800 1 IDT} + {2045689200 7200 0 IST} + {2058220800 10800 1 IDT} + {2077138800 7200 0 IST} + {2090275200 10800 1 IDT} + {2108588400 7200 0 IST} + {2121724800 10800 1 IDT} + {2140038000 7200 0 IST} + {2153174400 10800 1 IDT} + {2172092400 7200 0 IST} + {2184624000 10800 1 IDT} + {2203542000 7200 0 IST} + {2216073600 10800 1 IDT} + {2234991600 7200 0 IST} + {2248128000 10800 1 IDT} + {2266441200 7200 0 IST} + {2279577600 10800 1 IDT} + {2297890800 7200 0 IST} + {2311027200 10800 1 IDT} + {2329340400 7200 0 IST} + {2342476800 10800 1 IDT} + {2361394800 7200 0 IST} + {2373926400 10800 1 IDT} + {2392844400 7200 0 IST} + {2405376000 10800 1 IDT} + {2424294000 7200 0 IST} + {2437430400 10800 1 IDT} + {2455743600 7200 0 IST} + {2468880000 10800 1 IDT} + {2487193200 7200 0 IST} + {2500329600 10800 1 IDT} + {2519247600 7200 0 IST} + {2531779200 10800 1 IDT} + {2550697200 7200 0 IST} + {2563228800 10800 1 IDT} + {2582146800 7200 0 IST} + {2595283200 10800 1 IDT} + {2613596400 7200 0 IST} + {2626732800 10800 1 IDT} + {2645046000 7200 0 IST} + {2658182400 10800 1 IDT} + {2676495600 7200 0 IST} + {2689632000 10800 1 IDT} + {2708550000 7200 0 IST} + {2721081600 10800 1 IDT} + {2739999600 7200 0 IST} + {2752531200 10800 1 IDT} + {2771449200 7200 0 IST} + {2784585600 10800 1 IDT} + {2802898800 7200 0 IST} + {2816035200 10800 1 IDT} + {2834348400 7200 0 IST} + {2847484800 10800 1 IDT} + {2866402800 7200 0 IST} + {2878934400 10800 1 IDT} + {2897852400 7200 0 IST} + {2910384000 10800 1 IDT} + {2929302000 7200 0 IST} + {2941833600 10800 1 IDT} + {2960751600 7200 0 IST} + {2973888000 10800 1 IDT} + {2992201200 7200 0 IST} + {3005337600 10800 1 IDT} + {3023650800 7200 0 IST} + {3036787200 10800 1 IDT} + {3055705200 7200 0 IST} + {3068236800 10800 1 IDT} + {3087154800 7200 0 IST} + {3099686400 10800 1 IDT} + {3118604400 7200 0 IST} + {3131740800 10800 1 IDT} + {3150054000 7200 0 IST} + {3163190400 10800 1 IDT} + {3181503600 7200 0 IST} + {3194640000 10800 1 IDT} + {3212953200 7200 0 IST} + {3226089600 10800 1 IDT} + {3245007600 7200 0 IST} + {3257539200 10800 1 IDT} + {3276457200 7200 0 IST} + {3288988800 10800 1 IDT} + {3307906800 7200 0 IST} + {3321043200 10800 1 IDT} + {3339356400 7200 0 IST} + {3352492800 10800 1 IDT} + {3370806000 7200 0 IST} + {3383942400 10800 1 IDT} + {3402860400 7200 0 IST} + {3415392000 10800 1 IDT} + {3434310000 7200 0 IST} + {3446841600 10800 1 IDT} + {3465759600 7200 0 IST} + {3478896000 10800 1 IDT} + {3497209200 7200 0 IST} + {3510345600 10800 1 IDT} + {3528658800 7200 0 IST} + {3541795200 10800 1 IDT} + {3560108400 7200 0 IST} + {3573244800 10800 1 IDT} + {3592162800 7200 0 IST} + {3604694400 10800 1 IDT} + {3623612400 7200 0 IST} + {3636144000 10800 1 IDT} + {3655062000 7200 0 IST} + {3668198400 10800 1 IDT} + {3686511600 7200 0 IST} + {3699648000 10800 1 IDT} + {3717961200 7200 0 IST} + {3731097600 10800 1 IDT} + {3750015600 7200 0 IST} + {3762547200 10800 1 IDT} + {3781465200 7200 0 IST} + {3793996800 10800 1 IDT} + {3812914800 7200 0 IST} + {3825446400 10800 1 IDT} + {3844364400 7200 0 IST} + {3857500800 10800 1 IDT} + {3875814000 7200 0 IST} + {3888950400 10800 1 IDT} + {3907263600 7200 0 IST} + {3920400000 10800 1 IDT} + {3939318000 7200 0 IST} + {3951849600 10800 1 IDT} + {3970767600 7200 0 IST} + {3983299200 10800 1 IDT} + {4002217200 7200 0 IST} + {4015353600 10800 1 IDT} + {4033666800 7200 0 IST} + {4046803200 10800 1 IDT} + {4065116400 7200 0 IST} + {4078252800 10800 1 IDT} + {4096566000 7200 0 IST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kabul b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kabul new file mode 100644 index 00000000..3613de4b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kabul @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Kabul) { + {-9223372036854775808 16608 0 LMT} + {-2524538208 14400 0 +04} + {-788932800 16200 0 +0430} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Karachi b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Karachi new file mode 100644 index 00000000..1d81926c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Karachi @@ -0,0 +1,16 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Karachi) { + {-9223372036854775808 16092 0 LMT} + {-1988166492 19800 0 +0530} + {-862637400 23400 1 +0630} + {-764145000 19800 0 +0530} + {-576135000 18000 0 +05} + {38775600 18000 0 PKT} + {1018119600 21600 1 PKST} + {1033840800 18000 0 PKT} + {1212260400 21600 1 PKST} + {1225476000 18000 0 PKT} + {1239735600 21600 1 PKST} + {1257012000 18000 0 PKT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kashgar b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kashgar new file mode 100644 index 00000000..f67cbf13 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kashgar @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Urumqi)]} { + LoadTimeZoneFile Asia/Urumqi +} +set TZData(:Asia/Kashgar) $TZData(:Asia/Urumqi) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kathmandu b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kathmandu new file mode 100644 index 00000000..f88a5a25 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kathmandu @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Kathmandu) { + {-9223372036854775808 20476 0 LMT} + {-1577943676 19800 0 +0530} + {504901800 20700 0 +0545} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Katmandu b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Katmandu new file mode 100644 index 00000000..2d6d0605 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Katmandu @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Kathmandu)]} { + LoadTimeZoneFile Asia/Kathmandu +} +set TZData(:Asia/Katmandu) $TZData(:Asia/Kathmandu) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Krasnoyarsk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Krasnoyarsk new file mode 100644 index 00000000..0721425e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Krasnoyarsk @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Krasnoyarsk) { + {-9223372036854775808 22286 0 LMT} + {-1577513486 21600 0 +06} + {-1247551200 25200 0 +08} + {354906000 28800 1 +08} + {370713600 25200 0 +07} + {386442000 28800 1 +08} + {402249600 25200 0 +07} + {417978000 28800 1 +08} + {433785600 25200 0 +07} + {449600400 28800 1 +08} + {465332400 25200 0 +07} + {481057200 28800 1 +08} + {496782000 25200 0 +07} + {512506800 28800 1 +08} + {528231600 25200 0 +07} + {543956400 28800 1 +08} + {559681200 25200 0 +07} + {575406000 28800 1 +08} + {591130800 25200 0 +07} + {606855600 28800 1 +08} + {622580400 25200 0 +07} + {638305200 28800 1 +08} + {654634800 25200 0 +07} + {670359600 21600 0 +07} + {670363200 25200 1 +07} + {686088000 21600 0 +06} + {695764800 25200 0 +08} + {701809200 28800 1 +08} + {717534000 25200 0 +07} + {733258800 28800 1 +08} + {748983600 25200 0 +07} + {764708400 28800 1 +08} + {780433200 25200 0 +07} + {796158000 28800 1 +08} + {811882800 25200 0 +07} + {828212400 28800 1 +08} + {846356400 25200 0 +07} + {859662000 28800 1 +08} + {877806000 25200 0 +07} + {891111600 28800 1 +08} + {909255600 25200 0 +07} + {922561200 28800 1 +08} + {941310000 25200 0 +07} + {954010800 28800 1 +08} + {972759600 25200 0 +07} + {985460400 28800 1 +08} + {1004209200 25200 0 +07} + {1017514800 28800 1 +08} + {1035658800 25200 0 +07} + {1048964400 28800 1 +08} + {1067108400 25200 0 +07} + {1080414000 28800 1 +08} + {1099162800 25200 0 +07} + {1111863600 28800 1 +08} + {1130612400 25200 0 +07} + {1143313200 28800 1 +08} + {1162062000 25200 0 +07} + {1174762800 28800 1 +08} + {1193511600 25200 0 +07} + {1206817200 28800 1 +08} + {1224961200 25200 0 +07} + {1238266800 28800 1 +08} + {1256410800 25200 0 +07} + {1269716400 28800 1 +08} + {1288465200 25200 0 +07} + {1301166000 28800 0 +08} + {1414260000 25200 0 +07} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kuala_Lumpur b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kuala_Lumpur new file mode 100644 index 00000000..177539ab --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kuala_Lumpur @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Singapore)]} { + LoadTimeZoneFile Asia/Singapore +} +set TZData(:Asia/Kuala_Lumpur) $TZData(:Asia/Singapore) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kuching b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kuching new file mode 100644 index 00000000..e5dc1b7e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kuching @@ -0,0 +1,23 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Kuching) { + {-9223372036854775808 26480 0 LMT} + {-1383463280 27000 0 +0730} + {-1167636600 28800 0 +08} + {-1082448000 30000 1 +08} + {-1074586800 28800 0 +08} + {-1050825600 30000 1 +08} + {-1042964400 28800 0 +08} + {-1019289600 30000 1 +08} + {-1011428400 28800 0 +08} + {-987753600 30000 1 +08} + {-979892400 28800 0 +08} + {-956217600 30000 1 +08} + {-948356400 28800 0 +08} + {-924595200 30000 1 +08} + {-916734000 28800 0 +08} + {-893059200 30000 1 +08} + {-885198000 28800 0 +08} + {-879667200 32400 0 +09} + {-767005200 28800 0 +08} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kuwait b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kuwait new file mode 100644 index 00000000..e618c56c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Kuwait @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Riyadh)]} { + LoadTimeZoneFile Asia/Riyadh +} +set TZData(:Asia/Kuwait) $TZData(:Asia/Riyadh) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Macao b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Macao new file mode 100644 index 00000000..6e972ffa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Macao @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Macau)]} { + LoadTimeZoneFile Asia/Macau +} +set TZData(:Asia/Macao) $TZData(:Asia/Macau) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Macau b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Macau new file mode 100644 index 00000000..cbafd0ed --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Macau @@ -0,0 +1,76 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Macau) { + {-9223372036854775808 27250 0 LMT} + {-2056692850 28800 0 CST} + {-884509200 32400 0 +09} + {-873280800 36000 1 +09} + {-855918000 32400 0 +09} + {-841744800 36000 1 +09} + {-828529200 32400 0 +10} + {-765363600 28800 0 CT} + {-747046800 32400 1 CDT} + {-733827600 28800 0 CST} + {-716461200 32400 1 CDT} + {-697021200 28800 0 CST} + {-683715600 32400 1 CDT} + {-667990800 28800 0 CST} + {-654771600 32400 1 CDT} + {-636627600 28800 0 CST} + {-623322000 32400 1 CDT} + {-605178000 28800 0 CST} + {-591872400 32400 1 CDT} + {-573642000 28800 0 CST} + {-559818000 32400 1 CDT} + {-541674000 28800 0 CST} + {-528368400 32400 1 CDT} + {-510224400 28800 0 CST} + {-498128400 32400 1 CDT} + {-478774800 28800 0 CST} + {-466678800 32400 1 CDT} + {-446720400 28800 0 CST} + {-435229200 32400 1 CDT} + {-415258200 28800 0 CST} + {-403158600 32400 1 CDT} + {-383808600 28800 0 CST} + {-371709000 32400 1 CDT} + {-352359000 28800 0 CST} + {-340259400 32400 1 CDT} + {-320909400 28800 0 CST} + {-308809800 32400 1 CDT} + {-288855000 28800 0 CST} + {-277360200 32400 1 CDT} + {-257405400 28800 0 CST} + {-245910600 32400 1 CDT} + {-225955800 28800 0 CST} + {-213856200 32400 1 CDT} + {-194506200 28800 0 CST} + {-182406600 32400 1 CDT} + {-163056600 28800 0 CST} + {-148537800 32400 1 CDT} + {-132820200 28800 0 CST} + {-117088200 32400 1 CDT} + {-101370600 28800 0 CST} + {-85638600 32400 1 CDT} + {-69312600 28800 0 CST} + {-53584200 32400 1 CDT} + {-37863000 28800 0 CST} + {-22134600 32400 1 CDT} + {-6413400 28800 0 CST} + {9315000 32400 1 CDT} + {25036200 28800 0 CST} + {40764600 32400 1 CDT} + {56485800 28800 0 CST} + {72214200 32400 1 CDT} + {88540200 28800 0 CST} + {104268600 32400 1 CDT} + {119989800 28800 0 CST} + {126041400 32400 1 CDT} + {151439400 28800 0 CST} + {167167800 32400 1 CDT} + {182889000 28800 0 CST} + {198617400 32400 1 CDT} + {214338600 28800 0 CST} + {295385400 32400 1 CDT} + {309292200 28800 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Magadan b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Magadan new file mode 100644 index 00000000..06268995 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Magadan @@ -0,0 +1,72 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Magadan) { + {-9223372036854775808 36192 0 LMT} + {-1441188192 36000 0 +10} + {-1247565600 39600 0 +12} + {354891600 43200 1 +12} + {370699200 39600 0 +11} + {386427600 43200 1 +12} + {402235200 39600 0 +11} + {417963600 43200 1 +12} + {433771200 39600 0 +11} + {449586000 43200 1 +12} + {465318000 39600 0 +11} + {481042800 43200 1 +12} + {496767600 39600 0 +11} + {512492400 43200 1 +12} + {528217200 39600 0 +11} + {543942000 43200 1 +12} + {559666800 39600 0 +11} + {575391600 43200 1 +12} + {591116400 39600 0 +11} + {606841200 43200 1 +12} + {622566000 39600 0 +11} + {638290800 43200 1 +12} + {654620400 39600 0 +11} + {670345200 36000 0 +11} + {670348800 39600 1 +11} + {686073600 36000 0 +10} + {695750400 39600 0 +12} + {701794800 43200 1 +12} + {717519600 39600 0 +11} + {733244400 43200 1 +12} + {748969200 39600 0 +11} + {764694000 43200 1 +12} + {780418800 39600 0 +11} + {796143600 43200 1 +12} + {811868400 39600 0 +11} + {828198000 43200 1 +12} + {846342000 39600 0 +11} + {859647600 43200 1 +12} + {877791600 39600 0 +11} + {891097200 43200 1 +12} + {909241200 39600 0 +11} + {922546800 43200 1 +12} + {941295600 39600 0 +11} + {953996400 43200 1 +12} + {972745200 39600 0 +11} + {985446000 43200 1 +12} + {1004194800 39600 0 +11} + {1017500400 43200 1 +12} + {1035644400 39600 0 +11} + {1048950000 43200 1 +12} + {1067094000 39600 0 +11} + {1080399600 43200 1 +12} + {1099148400 39600 0 +11} + {1111849200 43200 1 +12} + {1130598000 39600 0 +11} + {1143298800 43200 1 +12} + {1162047600 39600 0 +11} + {1174748400 43200 1 +12} + {1193497200 39600 0 +11} + {1206802800 43200 1 +12} + {1224946800 39600 0 +11} + {1238252400 43200 1 +12} + {1256396400 39600 0 +11} + {1269702000 43200 1 +12} + {1288450800 39600 0 +11} + {1301151600 43200 0 +12} + {1414245600 36000 0 +10} + {1461427200 39600 0 +11} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Makassar b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Makassar new file mode 100644 index 00000000..1be5c595 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Makassar @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Makassar) { + {-9223372036854775808 28656 0 LMT} + {-1577951856 28656 0 MMT} + {-1172908656 28800 0 +08} + {-880272000 32400 0 +09} + {-766054800 28800 0 WITA} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Muscat b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Muscat new file mode 100644 index 00000000..fdd34c19 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Muscat @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Dubai)]} { + LoadTimeZoneFile Asia/Dubai +} +set TZData(:Asia/Muscat) $TZData(:Asia/Dubai) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Novokuznetsk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Novokuznetsk new file mode 100644 index 00000000..a43a9844 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Novokuznetsk @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Novokuznetsk) { + {-9223372036854775808 20928 0 LMT} + {-1441259328 21600 0 +06} + {-1247551200 25200 0 +08} + {354906000 28800 1 +08} + {370713600 25200 0 +07} + {386442000 28800 1 +08} + {402249600 25200 0 +07} + {417978000 28800 1 +08} + {433785600 25200 0 +07} + {449600400 28800 1 +08} + {465332400 25200 0 +07} + {481057200 28800 1 +08} + {496782000 25200 0 +07} + {512506800 28800 1 +08} + {528231600 25200 0 +07} + {543956400 28800 1 +08} + {559681200 25200 0 +07} + {575406000 28800 1 +08} + {591130800 25200 0 +07} + {606855600 28800 1 +08} + {622580400 25200 0 +07} + {638305200 28800 1 +08} + {654634800 25200 0 +07} + {670359600 21600 0 +07} + {670363200 25200 1 +07} + {686088000 21600 0 +06} + {695764800 25200 0 +08} + {701809200 28800 1 +08} + {717534000 25200 0 +07} + {733258800 28800 1 +08} + {748983600 25200 0 +07} + {764708400 28800 1 +08} + {780433200 25200 0 +07} + {796158000 28800 1 +08} + {811882800 25200 0 +07} + {828212400 28800 1 +08} + {846356400 25200 0 +07} + {859662000 28800 1 +08} + {877806000 25200 0 +07} + {891111600 28800 1 +08} + {909255600 25200 0 +07} + {922561200 28800 1 +08} + {941310000 25200 0 +07} + {954010800 28800 1 +08} + {972759600 25200 0 +07} + {985460400 28800 1 +08} + {1004209200 25200 0 +07} + {1017514800 28800 1 +08} + {1035658800 25200 0 +07} + {1048964400 28800 1 +08} + {1067108400 25200 0 +07} + {1080414000 28800 1 +08} + {1099162800 25200 0 +07} + {1111863600 28800 1 +08} + {1130612400 25200 0 +07} + {1143313200 28800 1 +08} + {1162062000 25200 0 +07} + {1174762800 28800 1 +08} + {1193511600 25200 0 +07} + {1206817200 28800 1 +08} + {1224961200 25200 0 +07} + {1238266800 28800 1 +08} + {1256410800 25200 0 +07} + {1269716400 21600 0 +07} + {1269720000 25200 1 +07} + {1288468800 21600 0 +06} + {1301169600 25200 0 +07} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Novosibirsk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Novosibirsk new file mode 100644 index 00000000..21f5c00b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Novosibirsk @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Novosibirsk) { + {-9223372036854775808 19900 0 LMT} + {-1579476700 21600 0 +06} + {-1247551200 25200 0 +08} + {354906000 28800 1 +08} + {370713600 25200 0 +07} + {386442000 28800 1 +08} + {402249600 25200 0 +07} + {417978000 28800 1 +08} + {433785600 25200 0 +07} + {449600400 28800 1 +08} + {465332400 25200 0 +07} + {481057200 28800 1 +08} + {496782000 25200 0 +07} + {512506800 28800 1 +08} + {528231600 25200 0 +07} + {543956400 28800 1 +08} + {559681200 25200 0 +07} + {575406000 28800 1 +08} + {591130800 25200 0 +07} + {606855600 28800 1 +08} + {622580400 25200 0 +07} + {638305200 28800 1 +08} + {654634800 25200 0 +07} + {670359600 21600 0 +07} + {670363200 25200 1 +07} + {686088000 21600 0 +06} + {695764800 25200 0 +08} + {701809200 28800 1 +08} + {717534000 25200 0 +07} + {733258800 28800 1 +08} + {738090000 25200 0 +07} + {748987200 21600 0 +06} + {764712000 25200 1 +07} + {780436800 21600 0 +06} + {796161600 25200 1 +07} + {811886400 21600 0 +06} + {828216000 25200 1 +07} + {846360000 21600 0 +06} + {859665600 25200 1 +07} + {877809600 21600 0 +06} + {891115200 25200 1 +07} + {909259200 21600 0 +06} + {922564800 25200 1 +07} + {941313600 21600 0 +06} + {954014400 25200 1 +07} + {972763200 21600 0 +06} + {985464000 25200 1 +07} + {1004212800 21600 0 +06} + {1017518400 25200 1 +07} + {1035662400 21600 0 +06} + {1048968000 25200 1 +07} + {1067112000 21600 0 +06} + {1080417600 25200 1 +07} + {1099166400 21600 0 +06} + {1111867200 25200 1 +07} + {1130616000 21600 0 +06} + {1143316800 25200 1 +07} + {1162065600 21600 0 +06} + {1174766400 25200 1 +07} + {1193515200 21600 0 +06} + {1206820800 25200 1 +07} + {1224964800 21600 0 +06} + {1238270400 25200 1 +07} + {1256414400 21600 0 +06} + {1269720000 25200 1 +07} + {1288468800 21600 0 +06} + {1301169600 25200 0 +07} + {1414263600 21600 0 +06} + {1469304000 25200 0 +07} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Omsk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Omsk new file mode 100644 index 00000000..74163d51 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Omsk @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Omsk) { + {-9223372036854775808 17610 0 LMT} + {-1582088010 18000 0 +05} + {-1247547600 21600 0 +07} + {354909600 25200 1 +07} + {370717200 21600 0 +06} + {386445600 25200 1 +07} + {402253200 21600 0 +06} + {417981600 25200 1 +07} + {433789200 21600 0 +06} + {449604000 25200 1 +07} + {465336000 21600 0 +06} + {481060800 25200 1 +07} + {496785600 21600 0 +06} + {512510400 25200 1 +07} + {528235200 21600 0 +06} + {543960000 25200 1 +07} + {559684800 21600 0 +06} + {575409600 25200 1 +07} + {591134400 21600 0 +06} + {606859200 25200 1 +07} + {622584000 21600 0 +06} + {638308800 25200 1 +07} + {654638400 21600 0 +06} + {670363200 18000 0 +06} + {670366800 21600 1 +06} + {686091600 18000 0 +05} + {695768400 21600 0 +07} + {701812800 25200 1 +07} + {717537600 21600 0 +06} + {733262400 25200 1 +07} + {748987200 21600 0 +06} + {764712000 25200 1 +07} + {780436800 21600 0 +06} + {796161600 25200 1 +07} + {811886400 21600 0 +06} + {828216000 25200 1 +07} + {846360000 21600 0 +06} + {859665600 25200 1 +07} + {877809600 21600 0 +06} + {891115200 25200 1 +07} + {909259200 21600 0 +06} + {922564800 25200 1 +07} + {941313600 21600 0 +06} + {954014400 25200 1 +07} + {972763200 21600 0 +06} + {985464000 25200 1 +07} + {1004212800 21600 0 +06} + {1017518400 25200 1 +07} + {1035662400 21600 0 +06} + {1048968000 25200 1 +07} + {1067112000 21600 0 +06} + {1080417600 25200 1 +07} + {1099166400 21600 0 +06} + {1111867200 25200 1 +07} + {1130616000 21600 0 +06} + {1143316800 25200 1 +07} + {1162065600 21600 0 +06} + {1174766400 25200 1 +07} + {1193515200 21600 0 +06} + {1206820800 25200 1 +07} + {1224964800 21600 0 +06} + {1238270400 25200 1 +07} + {1256414400 21600 0 +06} + {1269720000 25200 1 +07} + {1288468800 21600 0 +06} + {1301169600 25200 0 +07} + {1414263600 21600 0 +06} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Oral b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Oral new file mode 100644 index 00000000..e781b603 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Oral @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Oral) { + {-9223372036854775808 12324 0 LMT} + {-1441164324 10800 0 +03} + {-1247540400 18000 0 +05} + {354913200 21600 1 +06} + {370720800 21600 0 +06} + {386445600 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 14400 0 +04} + {606866400 18000 1 +04} + {622591200 14400 0 +04} + {638316000 18000 1 +04} + {654645600 14400 0 +04} + {670370400 18000 1 +04} + {686095200 14400 0 +04} + {701816400 14400 0 +04} + {701820000 18000 1 +04} + {717544800 14400 0 +04} + {733269600 18000 1 +04} + {748994400 14400 0 +04} + {764719200 18000 1 +04} + {780444000 14400 0 +04} + {796168800 18000 1 +04} + {811893600 14400 0 +04} + {828223200 18000 1 +04} + {846367200 14400 0 +04} + {859672800 18000 1 +04} + {877816800 14400 0 +04} + {891122400 18000 1 +04} + {909266400 14400 0 +04} + {922572000 18000 1 +04} + {941320800 14400 0 +04} + {954021600 18000 1 +04} + {972770400 14400 0 +04} + {985471200 18000 1 +04} + {1004220000 14400 0 +04} + {1017525600 18000 1 +04} + {1035669600 14400 0 +04} + {1048975200 18000 1 +04} + {1067119200 14400 0 +04} + {1080424800 18000 1 +04} + {1099173600 18000 0 +05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Phnom_Penh b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Phnom_Penh new file mode 100644 index 00000000..114c7863 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Phnom_Penh @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Bangkok)]} { + LoadTimeZoneFile Asia/Bangkok +} +set TZData(:Asia/Phnom_Penh) $TZData(:Asia/Bangkok) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Pontianak b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Pontianak new file mode 100644 index 00000000..ed59e9d3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Pontianak @@ -0,0 +1,13 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Pontianak) { + {-9223372036854775808 26240 0 LMT} + {-1946186240 26240 0 PMT} + {-1172906240 27000 0 +0730} + {-881220600 32400 0 +09} + {-766054800 27000 0 +0730} + {-683883000 28800 0 +08} + {-620812800 27000 0 +0730} + {-189415800 28800 0 WITA} + {567964800 25200 0 WIB} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Pyongyang b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Pyongyang new file mode 100644 index 00000000..53517368 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Pyongyang @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Pyongyang) { + {-9223372036854775808 30180 0 LMT} + {-1948782180 30600 0 KST} + {-1830414600 32400 0 JST} + {-768646800 32400 0 KST} + {1439564400 30600 0 KST} + {1525446000 32400 0 KST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Qatar b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Qatar new file mode 100644 index 00000000..10b4f6db --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Qatar @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Qatar) { + {-9223372036854775808 12368 0 LMT} + {-1577935568 14400 0 +04} + {76190400 10800 0 +03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Qostanay b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Qostanay new file mode 100644 index 00000000..46e3c8b7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Qostanay @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Qostanay) { + {-9223372036854775808 15268 0 LMT} + {-1441167268 14400 0 +04} + {-1247544000 18000 0 +05} + {354913200 21600 1 +06} + {370720800 21600 0 +06} + {386445600 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 21600 1 +05} + {622587600 18000 0 +05} + {638312400 21600 1 +05} + {654642000 18000 0 +05} + {670366800 14400 0 +04} + {670370400 18000 1 +04} + {686095200 14400 0 +04} + {695772000 18000 0 +05} + {701816400 21600 1 +05} + {717541200 18000 0 +05} + {733266000 21600 1 +05} + {748990800 18000 0 +05} + {764715600 21600 1 +05} + {780440400 18000 0 +05} + {796165200 21600 1 +05} + {811890000 18000 0 +05} + {828219600 21600 1 +05} + {846363600 18000 0 +05} + {859669200 21600 1 +05} + {877813200 18000 0 +05} + {891118800 21600 1 +05} + {909262800 18000 0 +05} + {922568400 21600 1 +05} + {941317200 18000 0 +05} + {954018000 21600 1 +05} + {972766800 18000 0 +05} + {985467600 21600 1 +05} + {1004216400 18000 0 +05} + {1017522000 21600 1 +05} + {1035666000 18000 0 +05} + {1048971600 21600 1 +05} + {1067115600 18000 0 +05} + {1080421200 21600 1 +05} + {1099170000 21600 0 +06} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Rangoon b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Rangoon new file mode 100644 index 00000000..8ea27480 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Rangoon @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Yangon)]} { + LoadTimeZoneFile Asia/Yangon +} +set TZData(:Asia/Rangoon) $TZData(:Asia/Yangon) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Riyadh b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Riyadh new file mode 100644 index 00000000..af5efa8e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Riyadh @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Riyadh) { + {-9223372036854775808 11212 0 LMT} + {-719636812 10800 0 +03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Saigon b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Saigon new file mode 100644 index 00000000..1e42eed2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Saigon @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Ho_Chi_Minh)]} { + LoadTimeZoneFile Asia/Ho_Chi_Minh +} +set TZData(:Asia/Saigon) $TZData(:Asia/Ho_Chi_Minh) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Sakhalin b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Sakhalin new file mode 100644 index 00000000..4ba7c8cf --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Sakhalin @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Sakhalin) { + {-9223372036854775808 34248 0 LMT} + {-2031039048 32400 0 +09} + {-768560400 39600 0 +12} + {354891600 43200 1 +12} + {370699200 39600 0 +11} + {386427600 43200 1 +12} + {402235200 39600 0 +11} + {417963600 43200 1 +12} + {433771200 39600 0 +11} + {449586000 43200 1 +12} + {465318000 39600 0 +11} + {481042800 43200 1 +12} + {496767600 39600 0 +11} + {512492400 43200 1 +12} + {528217200 39600 0 +11} + {543942000 43200 1 +12} + {559666800 39600 0 +11} + {575391600 43200 1 +12} + {591116400 39600 0 +11} + {606841200 43200 1 +12} + {622566000 39600 0 +11} + {638290800 43200 1 +12} + {654620400 39600 0 +11} + {670345200 36000 0 +11} + {670348800 39600 1 +11} + {686073600 36000 0 +10} + {695750400 39600 0 +12} + {701794800 43200 1 +12} + {717519600 39600 0 +11} + {733244400 43200 1 +12} + {748969200 39600 0 +11} + {764694000 43200 1 +12} + {780418800 39600 0 +11} + {796143600 43200 1 +12} + {811868400 39600 0 +11} + {828198000 43200 1 +12} + {846342000 39600 0 +11} + {859647600 36000 0 +11} + {859651200 39600 1 +11} + {877795200 36000 0 +10} + {891100800 39600 1 +11} + {909244800 36000 0 +10} + {922550400 39600 1 +11} + {941299200 36000 0 +10} + {954000000 39600 1 +11} + {972748800 36000 0 +10} + {985449600 39600 1 +11} + {1004198400 36000 0 +10} + {1017504000 39600 1 +11} + {1035648000 36000 0 +10} + {1048953600 39600 1 +11} + {1067097600 36000 0 +10} + {1080403200 39600 1 +11} + {1099152000 36000 0 +10} + {1111852800 39600 1 +11} + {1130601600 36000 0 +10} + {1143302400 39600 1 +11} + {1162051200 36000 0 +10} + {1174752000 39600 1 +11} + {1193500800 36000 0 +10} + {1206806400 39600 1 +11} + {1224950400 36000 0 +10} + {1238256000 39600 1 +11} + {1256400000 36000 0 +10} + {1269705600 39600 1 +11} + {1288454400 36000 0 +10} + {1301155200 39600 0 +11} + {1414249200 36000 0 +10} + {1459008000 39600 0 +11} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Samarkand b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Samarkand new file mode 100644 index 00000000..805bab79 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Samarkand @@ -0,0 +1,31 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Samarkand) { + {-9223372036854775808 16073 0 LMT} + {-1441168073 14400 0 +04} + {-1247544000 18000 0 +05} + {354913200 21600 1 +06} + {370720800 21600 0 +06} + {386445600 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 21600 1 +05} + {622587600 18000 0 +05} + {638312400 21600 1 +05} + {654642000 18000 0 +05} + {670366800 21600 1 +05} + {686091600 18000 0 +05} + {694206000 18000 0 +05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Seoul b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Seoul new file mode 100644 index 00000000..2df8adca --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Seoul @@ -0,0 +1,34 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Seoul) { + {-9223372036854775808 30472 0 LMT} + {-1948782472 30600 0 KST} + {-1830414600 32400 0 JST} + {-767350800 32400 0 KST} + {-681210000 36000 1 KDT} + {-672228000 32400 0 KST} + {-654771600 36000 1 KDT} + {-640864800 32400 0 KST} + {-623408400 36000 1 KDT} + {-609415200 32400 0 KST} + {-588848400 36000 1 KDT} + {-577965600 32400 0 KST} + {-498128400 30600 0 KST} + {-462702600 34200 1 KDT} + {-451733400 30600 0 KST} + {-429784200 34200 1 KDT} + {-418296600 30600 0 KST} + {-399544200 34200 1 KDT} + {-387451800 30600 0 KST} + {-368094600 34200 1 KDT} + {-356002200 30600 0 KST} + {-336645000 34200 1 KDT} + {-324552600 30600 0 KST} + {-305195400 34200 1 KDT} + {-293103000 30600 0 KST} + {-264933000 32400 0 KST} + {547578000 36000 1 KDT} + {560883600 32400 0 KST} + {579027600 36000 1 KDT} + {592333200 32400 0 KST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Shanghai b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Shanghai new file mode 100644 index 00000000..0fcf802e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Shanghai @@ -0,0 +1,34 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Shanghai) { + {-9223372036854775808 29143 0 LMT} + {-2177481943 28800 0 CST} + {-1600675200 32400 1 CDT} + {-1585904400 28800 0 CST} + {-933667200 32400 1 CDT} + {-922093200 28800 0 CST} + {-908870400 32400 1 CDT} + {-888829200 28800 0 CST} + {-881049600 32400 1 CDT} + {-767869200 28800 0 CST} + {-745833600 32400 1 CDT} + {-733827600 28800 0 CST} + {-716889600 32400 1 CDT} + {-699613200 28800 0 CST} + {-683884800 32400 1 CDT} + {-670669200 28800 0 CST} + {-652348800 32400 1 CDT} + {-650016000 28800 0 CST} + {515527200 32400 1 CDT} + {527014800 28800 0 CST} + {545162400 32400 1 CDT} + {558464400 28800 0 CST} + {577216800 32400 1 CDT} + {589914000 28800 0 CST} + {608666400 32400 1 CDT} + {621968400 28800 0 CST} + {640116000 32400 1 CDT} + {653418000 28800 0 CST} + {671565600 32400 1 CDT} + {684867600 28800 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Singapore b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Singapore new file mode 100644 index 00000000..f10eb1fc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Singapore @@ -0,0 +1,13 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Singapore) { + {-9223372036854775808 24925 0 LMT} + {-2177477725 24925 0 SMT} + {-2038200925 25200 0 +07} + {-1167634800 26400 1 +0720} + {-1073028000 26400 0 +0720} + {-894180000 27000 0 +0730} + {-879665400 32400 0 +09} + {-767005200 27000 0 +0730} + {378664200 28800 0 +08} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Srednekolymsk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Srednekolymsk new file mode 100644 index 00000000..1099a4ba --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Srednekolymsk @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Srednekolymsk) { + {-9223372036854775808 36892 0 LMT} + {-1441188892 36000 0 +10} + {-1247565600 39600 0 +12} + {354891600 43200 1 +12} + {370699200 39600 0 +11} + {386427600 43200 1 +12} + {402235200 39600 0 +11} + {417963600 43200 1 +12} + {433771200 39600 0 +11} + {449586000 43200 1 +12} + {465318000 39600 0 +11} + {481042800 43200 1 +12} + {496767600 39600 0 +11} + {512492400 43200 1 +12} + {528217200 39600 0 +11} + {543942000 43200 1 +12} + {559666800 39600 0 +11} + {575391600 43200 1 +12} + {591116400 39600 0 +11} + {606841200 43200 1 +12} + {622566000 39600 0 +11} + {638290800 43200 1 +12} + {654620400 39600 0 +11} + {670345200 36000 0 +11} + {670348800 39600 1 +11} + {686073600 36000 0 +10} + {695750400 39600 0 +12} + {701794800 43200 1 +12} + {717519600 39600 0 +11} + {733244400 43200 1 +12} + {748969200 39600 0 +11} + {764694000 43200 1 +12} + {780418800 39600 0 +11} + {796143600 43200 1 +12} + {811868400 39600 0 +11} + {828198000 43200 1 +12} + {846342000 39600 0 +11} + {859647600 43200 1 +12} + {877791600 39600 0 +11} + {891097200 43200 1 +12} + {909241200 39600 0 +11} + {922546800 43200 1 +12} + {941295600 39600 0 +11} + {953996400 43200 1 +12} + {972745200 39600 0 +11} + {985446000 43200 1 +12} + {1004194800 39600 0 +11} + {1017500400 43200 1 +12} + {1035644400 39600 0 +11} + {1048950000 43200 1 +12} + {1067094000 39600 0 +11} + {1080399600 43200 1 +12} + {1099148400 39600 0 +11} + {1111849200 43200 1 +12} + {1130598000 39600 0 +11} + {1143298800 43200 1 +12} + {1162047600 39600 0 +11} + {1174748400 43200 1 +12} + {1193497200 39600 0 +11} + {1206802800 43200 1 +12} + {1224946800 39600 0 +11} + {1238252400 43200 1 +12} + {1256396400 39600 0 +11} + {1269702000 43200 1 +12} + {1288450800 39600 0 +11} + {1301151600 43200 0 +12} + {1414245600 39600 0 +11} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Taipei b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Taipei new file mode 100644 index 00000000..cb8fb89d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Taipei @@ -0,0 +1,46 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Taipei) { + {-9223372036854775808 29160 0 LMT} + {-2335248360 28800 0 CST} + {-1017820800 32400 0 JST} + {-766224000 28800 0 CST} + {-745833600 32400 1 CDT} + {-733827600 28800 0 CST} + {-716889600 32400 1 CDT} + {-699613200 28800 0 CST} + {-683884800 32400 1 CDT} + {-670669200 28800 0 CST} + {-652348800 32400 1 CDT} + {-639133200 28800 0 CST} + {-620812800 32400 1 CDT} + {-607597200 28800 0 CST} + {-589276800 32400 1 CDT} + {-576061200 28800 0 CST} + {-562924800 32400 1 CDT} + {-541760400 28800 0 CST} + {-528710400 32400 1 CDT} + {-510224400 28800 0 CST} + {-497174400 32400 1 CDT} + {-478688400 28800 0 CST} + {-465638400 32400 1 CDT} + {-449830800 28800 0 CST} + {-434016000 32400 1 CDT} + {-418208400 28800 0 CST} + {-402480000 32400 1 CDT} + {-386672400 28800 0 CST} + {-370944000 32400 1 CDT} + {-355136400 28800 0 CST} + {-339408000 32400 1 CDT} + {-323600400 28800 0 CST} + {-302515200 32400 1 CDT} + {-291978000 28800 0 CST} + {-270979200 32400 1 CDT} + {-260442000 28800 0 CST} + {133977600 32400 1 CDT} + {149785200 28800 0 CST} + {165513600 32400 1 CDT} + {181321200 28800 0 CST} + {299606400 32400 1 CDT} + {307551600 28800 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tashkent b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tashkent new file mode 100644 index 00000000..bd16c91b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tashkent @@ -0,0 +1,31 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Tashkent) { + {-9223372036854775808 16631 0 LMT} + {-1441168631 18000 0 +05} + {-1247547600 21600 0 +06} + {354909600 25200 1 +06} + {370717200 21600 0 +06} + {386445600 25200 1 +06} + {402253200 21600 0 +06} + {417981600 25200 1 +06} + {433789200 21600 0 +06} + {449604000 25200 1 +06} + {465336000 21600 0 +06} + {481060800 25200 1 +06} + {496785600 21600 0 +06} + {512510400 25200 1 +06} + {528235200 21600 0 +06} + {543960000 25200 1 +06} + {559684800 21600 0 +06} + {575409600 25200 1 +06} + {591134400 21600 0 +06} + {606859200 25200 1 +06} + {622584000 21600 0 +06} + {638308800 25200 1 +06} + {654638400 21600 0 +06} + {670363200 18000 0 +05} + {670366800 21600 1 +05} + {686091600 18000 0 +05} + {694206000 18000 0 +05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tbilisi b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tbilisi new file mode 100644 index 00000000..71e76950 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tbilisi @@ -0,0 +1,60 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Tbilisi) { + {-9223372036854775808 10751 0 LMT} + {-2840151551 10751 0 TBMT} + {-1441162751 10800 0 +03} + {-405140400 14400 0 +04} + {354916800 18000 1 +04} + {370724400 14400 0 +04} + {386452800 18000 1 +04} + {402260400 14400 0 +04} + {417988800 18000 1 +04} + {433796400 14400 0 +04} + {449611200 18000 1 +04} + {465343200 14400 0 +04} + {481068000 18000 1 +04} + {496792800 14400 0 +04} + {512517600 18000 1 +04} + {528242400 14400 0 +04} + {543967200 18000 1 +04} + {559692000 14400 0 +04} + {575416800 18000 1 +04} + {591141600 14400 0 +04} + {606866400 18000 1 +04} + {622591200 14400 0 +04} + {638316000 18000 1 +04} + {654645600 14400 0 +04} + {670370400 10800 0 +03} + {670374000 14400 1 +03} + {686098800 10800 0 +03} + {694213200 10800 0 +03} + {701816400 14400 1 +03} + {717537600 10800 0 +03} + {733266000 14400 1 +03} + {748987200 10800 0 +03} + {764715600 14400 1 +03} + {780440400 14400 0 +04} + {796161600 18000 1 +04} + {811882800 14400 0 +04} + {828216000 18000 1 +04} + {846360000 18000 1 +05} + {859662000 18000 0 +04} + {877806000 14400 0 +04} + {891115200 18000 1 +04} + {909255600 14400 0 +04} + {922564800 18000 1 +04} + {941310000 14400 0 +04} + {954014400 18000 1 +04} + {972759600 14400 0 +04} + {985464000 18000 1 +04} + {1004209200 14400 0 +04} + {1017518400 18000 1 +04} + {1035658800 14400 0 +04} + {1048968000 18000 1 +04} + {1067108400 14400 0 +04} + {1080417600 18000 1 +04} + {1088280000 14400 0 +03} + {1099177200 10800 0 +03} + {1111878000 14400 0 +04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tehran b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tehran new file mode 100644 index 00000000..c453c482 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tehran @@ -0,0 +1,76 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Tehran) { + {-9223372036854775808 12344 0 LMT} + {-1704165944 12344 0 TMT} + {-1090466744 12600 0 +0330} + {227820600 16200 1 +0330} + {246227400 14400 0 +04} + {259617600 18000 1 +04} + {271108800 14400 0 +04} + {283982400 12600 0 +0330} + {296598600 16200 1 +0330} + {306531000 12600 0 +0330} + {322432200 16200 1 +0330} + {338499000 12600 0 +0330} + {673216200 16200 1 +0330} + {685481400 12600 0 +0330} + {701209800 16200 1 +0330} + {717103800 12600 0 +0330} + {732745800 16200 1 +0330} + {748639800 12600 0 +0330} + {764281800 16200 1 +0330} + {780175800 12600 0 +0330} + {795817800 16200 1 +0330} + {811711800 12600 0 +0330} + {827353800 16200 1 +0330} + {843247800 12600 0 +0330} + {858976200 16200 1 +0330} + {874870200 12600 0 +0330} + {890512200 16200 1 +0330} + {906406200 12600 0 +0330} + {922048200 16200 1 +0330} + {937942200 12600 0 +0330} + {953584200 16200 1 +0330} + {969478200 12600 0 +0330} + {985206600 16200 1 +0330} + {1001100600 12600 0 +0330} + {1016742600 16200 1 +0330} + {1032636600 12600 0 +0330} + {1048278600 16200 1 +0330} + {1064172600 12600 0 +0330} + {1079814600 16200 1 +0330} + {1095708600 12600 0 +0330} + {1111437000 16200 1 +0330} + {1127331000 12600 0 +0330} + {1206045000 16200 1 +0330} + {1221939000 12600 0 +0330} + {1237667400 16200 1 +0330} + {1253561400 12600 0 +0330} + {1269203400 16200 1 +0330} + {1285097400 12600 0 +0330} + {1300739400 16200 1 +0330} + {1316633400 12600 0 +0330} + {1332275400 16200 1 +0330} + {1348169400 12600 0 +0330} + {1363897800 16200 1 +0330} + {1379791800 12600 0 +0330} + {1395433800 16200 1 +0330} + {1411327800 12600 0 +0330} + {1426969800 16200 1 +0330} + {1442863800 12600 0 +0330} + {1458505800 16200 1 +0330} + {1474399800 12600 0 +0330} + {1490128200 16200 1 +0330} + {1506022200 12600 0 +0330} + {1521664200 16200 1 +0330} + {1537558200 12600 0 +0330} + {1553200200 16200 1 +0330} + {1569094200 12600 0 +0330} + {1584736200 16200 1 +0330} + {1600630200 12600 0 +0330} + {1616358600 16200 1 +0330} + {1632252600 12600 0 +0330} + {1647894600 16200 1 +0330} + {1663788600 12600 0 +0330} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tel_Aviv b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tel_Aviv new file mode 100644 index 00000000..3e7278d0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tel_Aviv @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Jerusalem)]} { + LoadTimeZoneFile Asia/Jerusalem +} +set TZData(:Asia/Tel_Aviv) $TZData(:Asia/Jerusalem) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Thimbu b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Thimbu new file mode 100644 index 00000000..94b0846c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Thimbu @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Thimphu)]} { + LoadTimeZoneFile Asia/Thimphu +} +set TZData(:Asia/Thimbu) $TZData(:Asia/Thimphu) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Thimphu b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Thimphu new file mode 100644 index 00000000..55c3d7f6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Thimphu @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Thimphu) { + {-9223372036854775808 21516 0 LMT} + {-706341516 19800 0 +0530} + {560025000 21600 0 +06} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tokyo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tokyo new file mode 100644 index 00000000..cc7a857d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tokyo @@ -0,0 +1,14 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Tokyo) { + {-9223372036854775808 33539 0 LMT} + {-2587712400 32400 0 JST} + {-683802000 36000 1 JDT} + {-672310800 32400 0 JST} + {-654771600 36000 1 JDT} + {-640861200 32400 0 JST} + {-620298000 36000 1 JDT} + {-609411600 32400 0 JST} + {-588848400 36000 1 JDT} + {-577962000 32400 0 JST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tomsk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tomsk new file mode 100644 index 00000000..0694d01f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Tomsk @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Tomsk) { + {-9223372036854775808 20391 0 LMT} + {-1578807591 21600 0 +06} + {-1247551200 25200 0 +08} + {354906000 28800 1 +08} + {370713600 25200 0 +07} + {386442000 28800 1 +08} + {402249600 25200 0 +07} + {417978000 28800 1 +08} + {433785600 25200 0 +07} + {449600400 28800 1 +08} + {465332400 25200 0 +07} + {481057200 28800 1 +08} + {496782000 25200 0 +07} + {512506800 28800 1 +08} + {528231600 25200 0 +07} + {543956400 28800 1 +08} + {559681200 25200 0 +07} + {575406000 28800 1 +08} + {591130800 25200 0 +07} + {606855600 28800 1 +08} + {622580400 25200 0 +07} + {638305200 28800 1 +08} + {654634800 25200 0 +07} + {670359600 21600 0 +07} + {670363200 25200 1 +07} + {686088000 21600 0 +06} + {695764800 25200 0 +08} + {701809200 28800 1 +08} + {717534000 25200 0 +07} + {733258800 28800 1 +08} + {748983600 25200 0 +07} + {764708400 28800 1 +08} + {780433200 25200 0 +07} + {796158000 28800 1 +08} + {811882800 25200 0 +07} + {828212400 28800 1 +08} + {846356400 25200 0 +07} + {859662000 28800 1 +08} + {877806000 25200 0 +07} + {891111600 28800 1 +08} + {909255600 25200 0 +07} + {922561200 28800 1 +08} + {941310000 25200 0 +07} + {954010800 28800 1 +08} + {972759600 25200 0 +07} + {985460400 28800 1 +08} + {1004209200 25200 0 +07} + {1017514800 28800 1 +08} + {1020196800 25200 0 +07} + {1035662400 21600 0 +06} + {1048968000 25200 1 +07} + {1067112000 21600 0 +06} + {1080417600 25200 1 +07} + {1099166400 21600 0 +06} + {1111867200 25200 1 +07} + {1130616000 21600 0 +06} + {1143316800 25200 1 +07} + {1162065600 21600 0 +06} + {1174766400 25200 1 +07} + {1193515200 21600 0 +06} + {1206820800 25200 1 +07} + {1224964800 21600 0 +06} + {1238270400 25200 1 +07} + {1256414400 21600 0 +06} + {1269720000 25200 1 +07} + {1288468800 21600 0 +06} + {1301169600 25200 0 +07} + {1414263600 21600 0 +06} + {1464465600 25200 0 +07} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ujung_Pandang b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ujung_Pandang new file mode 100644 index 00000000..abe142e7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ujung_Pandang @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Makassar)]} { + LoadTimeZoneFile Asia/Makassar +} +set TZData(:Asia/Ujung_Pandang) $TZData(:Asia/Makassar) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ulaanbaatar b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ulaanbaatar new file mode 100644 index 00000000..3a33ef91 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ulaanbaatar @@ -0,0 +1,55 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Ulaanbaatar) { + {-9223372036854775808 25652 0 LMT} + {-2032931252 25200 0 +07} + {252435600 28800 0 +08} + {417974400 32400 1 +08} + {433782000 28800 0 +08} + {449596800 32400 1 +08} + {465318000 28800 0 +08} + {481046400 32400 1 +08} + {496767600 28800 0 +08} + {512496000 32400 1 +08} + {528217200 28800 0 +08} + {543945600 32400 1 +08} + {559666800 28800 0 +08} + {575395200 32400 1 +08} + {591116400 28800 0 +08} + {606844800 32400 1 +08} + {622566000 28800 0 +08} + {638294400 32400 1 +08} + {654620400 28800 0 +08} + {670348800 32400 1 +08} + {686070000 28800 0 +08} + {701798400 32400 1 +08} + {717519600 28800 0 +08} + {733248000 32400 1 +08} + {748969200 28800 0 +08} + {764697600 32400 1 +08} + {780418800 28800 0 +08} + {796147200 32400 1 +08} + {811868400 28800 0 +08} + {828201600 32400 1 +08} + {843922800 28800 0 +08} + {859651200 32400 1 +08} + {875372400 28800 0 +08} + {891100800 32400 1 +08} + {906822000 28800 0 +08} + {988394400 32400 1 +08} + {1001696400 28800 0 +08} + {1017424800 32400 1 +08} + {1033146000 28800 0 +08} + {1048874400 32400 1 +08} + {1064595600 28800 0 +08} + {1080324000 32400 1 +08} + {1096045200 28800 0 +08} + {1111773600 32400 1 +08} + {1127494800 28800 0 +08} + {1143223200 32400 1 +08} + {1159549200 28800 0 +08} + {1427479200 32400 1 +08} + {1443193200 28800 0 +08} + {1458928800 32400 1 +08} + {1474642800 28800 0 +08} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ulan_Bator b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ulan_Bator new file mode 100644 index 00000000..3215ee79 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Ulan_Bator @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Ulaanbaatar)]} { + LoadTimeZoneFile Asia/Ulaanbaatar +} +set TZData(:Asia/Ulan_Bator) $TZData(:Asia/Ulaanbaatar) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Urumqi b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Urumqi new file mode 100644 index 00000000..194e0900 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Urumqi @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Urumqi) { + {-9223372036854775808 21020 0 LMT} + {-1325483420 21600 0 +06} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Vientiane b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Vientiane new file mode 100644 index 00000000..27b20ce5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Vientiane @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Bangkok)]} { + LoadTimeZoneFile Asia/Bangkok +} +set TZData(:Asia/Vientiane) $TZData(:Asia/Bangkok) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Vladivostok b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Vladivostok new file mode 100644 index 00000000..e8f651cd --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Vladivostok @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Vladivostok) { + {-9223372036854775808 31651 0 LMT} + {-1487321251 32400 0 +09} + {-1247562000 36000 0 +11} + {354895200 39600 1 +11} + {370702800 36000 0 +10} + {386431200 39600 1 +11} + {402238800 36000 0 +10} + {417967200 39600 1 +11} + {433774800 36000 0 +10} + {449589600 39600 1 +11} + {465321600 36000 0 +10} + {481046400 39600 1 +11} + {496771200 36000 0 +10} + {512496000 39600 1 +11} + {528220800 36000 0 +10} + {543945600 39600 1 +11} + {559670400 36000 0 +10} + {575395200 39600 1 +11} + {591120000 36000 0 +10} + {606844800 39600 1 +11} + {622569600 36000 0 +10} + {638294400 39600 1 +11} + {654624000 36000 0 +10} + {670348800 32400 0 +10} + {670352400 36000 1 +10} + {686077200 32400 0 +09} + {695754000 36000 0 +11} + {701798400 39600 1 +11} + {717523200 36000 0 +10} + {733248000 39600 1 +11} + {748972800 36000 0 +10} + {764697600 39600 1 +11} + {780422400 36000 0 +10} + {796147200 39600 1 +11} + {811872000 36000 0 +10} + {828201600 39600 1 +11} + {846345600 36000 0 +10} + {859651200 39600 1 +11} + {877795200 36000 0 +10} + {891100800 39600 1 +11} + {909244800 36000 0 +10} + {922550400 39600 1 +11} + {941299200 36000 0 +10} + {954000000 39600 1 +11} + {972748800 36000 0 +10} + {985449600 39600 1 +11} + {1004198400 36000 0 +10} + {1017504000 39600 1 +11} + {1035648000 36000 0 +10} + {1048953600 39600 1 +11} + {1067097600 36000 0 +10} + {1080403200 39600 1 +11} + {1099152000 36000 0 +10} + {1111852800 39600 1 +11} + {1130601600 36000 0 +10} + {1143302400 39600 1 +11} + {1162051200 36000 0 +10} + {1174752000 39600 1 +11} + {1193500800 36000 0 +10} + {1206806400 39600 1 +11} + {1224950400 36000 0 +10} + {1238256000 39600 1 +11} + {1256400000 36000 0 +10} + {1269705600 39600 1 +11} + {1288454400 36000 0 +10} + {1301155200 39600 0 +11} + {1414249200 36000 0 +10} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yakutsk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yakutsk new file mode 100644 index 00000000..8ee153ac --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yakutsk @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Yakutsk) { + {-9223372036854775808 31138 0 LMT} + {-1579423138 28800 0 +08} + {-1247558400 32400 0 +10} + {354898800 36000 1 +10} + {370706400 32400 0 +09} + {386434800 36000 1 +10} + {402242400 32400 0 +09} + {417970800 36000 1 +10} + {433778400 32400 0 +09} + {449593200 36000 1 +10} + {465325200 32400 0 +09} + {481050000 36000 1 +10} + {496774800 32400 0 +09} + {512499600 36000 1 +10} + {528224400 32400 0 +09} + {543949200 36000 1 +10} + {559674000 32400 0 +09} + {575398800 36000 1 +10} + {591123600 32400 0 +09} + {606848400 36000 1 +10} + {622573200 32400 0 +09} + {638298000 36000 1 +10} + {654627600 32400 0 +09} + {670352400 28800 0 +09} + {670356000 32400 1 +09} + {686080800 28800 0 +08} + {695757600 32400 0 +10} + {701802000 36000 1 +10} + {717526800 32400 0 +09} + {733251600 36000 1 +10} + {748976400 32400 0 +09} + {764701200 36000 1 +10} + {780426000 32400 0 +09} + {796150800 36000 1 +10} + {811875600 32400 0 +09} + {828205200 36000 1 +10} + {846349200 32400 0 +09} + {859654800 36000 1 +10} + {877798800 32400 0 +09} + {891104400 36000 1 +10} + {909248400 32400 0 +09} + {922554000 36000 1 +10} + {941302800 32400 0 +09} + {954003600 36000 1 +10} + {972752400 32400 0 +09} + {985453200 36000 1 +10} + {1004202000 32400 0 +09} + {1017507600 36000 1 +10} + {1035651600 32400 0 +09} + {1048957200 36000 1 +10} + {1067101200 32400 0 +09} + {1080406800 36000 1 +10} + {1099155600 32400 0 +09} + {1111856400 36000 1 +10} + {1130605200 32400 0 +09} + {1143306000 36000 1 +10} + {1162054800 32400 0 +09} + {1174755600 36000 1 +10} + {1193504400 32400 0 +09} + {1206810000 36000 1 +10} + {1224954000 32400 0 +09} + {1238259600 36000 1 +10} + {1256403600 32400 0 +09} + {1269709200 36000 1 +10} + {1288458000 32400 0 +09} + {1301158800 36000 0 +10} + {1414252800 32400 0 +09} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yangon b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yangon new file mode 100644 index 00000000..82870c60 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yangon @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Yangon) { + {-9223372036854775808 23087 0 LMT} + {-2840163887 23087 0 RMT} + {-1577946287 23400 0 +0630} + {-873268200 32400 0 +09} + {-778410000 23400 0 +0630} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yekaterinburg b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yekaterinburg new file mode 100644 index 00000000..d2133b1d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yekaterinburg @@ -0,0 +1,72 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Yekaterinburg) { + {-9223372036854775808 14553 0 LMT} + {-1688270553 13505 0 PMT} + {-1592610305 14400 0 +04} + {-1247544000 18000 0 +06} + {354913200 21600 1 +06} + {370720800 18000 0 +05} + {386449200 21600 1 +06} + {402256800 18000 0 +05} + {417985200 21600 1 +06} + {433792800 18000 0 +05} + {449607600 21600 1 +06} + {465339600 18000 0 +05} + {481064400 21600 1 +06} + {496789200 18000 0 +05} + {512514000 21600 1 +06} + {528238800 18000 0 +05} + {543963600 21600 1 +06} + {559688400 18000 0 +05} + {575413200 21600 1 +06} + {591138000 18000 0 +05} + {606862800 21600 1 +06} + {622587600 18000 0 +05} + {638312400 21600 1 +06} + {654642000 18000 0 +05} + {670366800 14400 0 +05} + {670370400 18000 1 +05} + {686095200 14400 0 +04} + {695772000 18000 0 +06} + {701816400 21600 1 +06} + {717541200 18000 0 +05} + {733266000 21600 1 +06} + {748990800 18000 0 +05} + {764715600 21600 1 +06} + {780440400 18000 0 +05} + {796165200 21600 1 +06} + {811890000 18000 0 +05} + {828219600 21600 1 +06} + {846363600 18000 0 +05} + {859669200 21600 1 +06} + {877813200 18000 0 +05} + {891118800 21600 1 +06} + {909262800 18000 0 +05} + {922568400 21600 1 +06} + {941317200 18000 0 +05} + {954018000 21600 1 +06} + {972766800 18000 0 +05} + {985467600 21600 1 +06} + {1004216400 18000 0 +05} + {1017522000 21600 1 +06} + {1035666000 18000 0 +05} + {1048971600 21600 1 +06} + {1067115600 18000 0 +05} + {1080421200 21600 1 +06} + {1099170000 18000 0 +05} + {1111870800 21600 1 +06} + {1130619600 18000 0 +05} + {1143320400 21600 1 +06} + {1162069200 18000 0 +05} + {1174770000 21600 1 +06} + {1193518800 18000 0 +05} + {1206824400 21600 1 +06} + {1224968400 18000 0 +05} + {1238274000 21600 1 +06} + {1256418000 18000 0 +05} + {1269723600 21600 1 +06} + {1288472400 18000 0 +05} + {1301173200 21600 0 +06} + {1414267200 18000 0 +05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yerevan b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yerevan new file mode 100644 index 00000000..463bed0f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Asia/Yerevan @@ -0,0 +1,70 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Yerevan) { + {-9223372036854775808 10680 0 LMT} + {-1441162680 10800 0 +03} + {-405140400 14400 0 +04} + {354916800 18000 1 +04} + {370724400 14400 0 +04} + {386452800 18000 1 +04} + {402260400 14400 0 +04} + {417988800 18000 1 +04} + {433796400 14400 0 +04} + {449611200 18000 1 +04} + {465343200 14400 0 +04} + {481068000 18000 1 +04} + {496792800 14400 0 +04} + {512517600 18000 1 +04} + {528242400 14400 0 +04} + {543967200 18000 1 +04} + {559692000 14400 0 +04} + {575416800 18000 1 +04} + {591141600 14400 0 +04} + {606866400 18000 1 +04} + {622591200 14400 0 +04} + {638316000 18000 1 +04} + {654645600 14400 0 +04} + {670370400 10800 0 +03} + {670374000 14400 1 +03} + {686098800 10800 0 +03} + {701823600 14400 1 +03} + {717548400 10800 0 +03} + {733273200 14400 1 +03} + {748998000 10800 0 +03} + {764722800 14400 1 +03} + {780447600 10800 0 +03} + {796172400 14400 1 +03} + {811897200 14400 0 +04} + {852062400 14400 0 +04} + {859672800 18000 1 +04} + {877816800 14400 0 +04} + {891122400 18000 1 +04} + {909266400 14400 0 +04} + {922572000 18000 1 +04} + {941320800 14400 0 +04} + {954021600 18000 1 +04} + {972770400 14400 0 +04} + {985471200 18000 1 +04} + {1004220000 14400 0 +04} + {1017525600 18000 1 +04} + {1035669600 14400 0 +04} + {1048975200 18000 1 +04} + {1067119200 14400 0 +04} + {1080424800 18000 1 +04} + {1099173600 14400 0 +04} + {1111874400 18000 1 +04} + {1130623200 14400 0 +04} + {1143324000 18000 1 +04} + {1162072800 14400 0 +04} + {1174773600 18000 1 +04} + {1193522400 14400 0 +04} + {1206828000 18000 1 +04} + {1224972000 14400 0 +04} + {1238277600 18000 1 +04} + {1256421600 14400 0 +04} + {1269727200 18000 1 +04} + {1288476000 14400 0 +04} + {1293825600 14400 0 +04} + {1301176800 18000 1 +04} + {1319925600 14400 0 +04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Azores b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Azores new file mode 100644 index 00000000..0b7f6153 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Azores @@ -0,0 +1,347 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Azores) { + {-9223372036854775808 -6160 0 LMT} + {-2713904240 -6872 0 HMT} + {-1830376800 -7200 0 -02} + {-1689548400 -3600 1 -01} + {-1677794400 -7200 0 -02} + {-1667430000 -3600 1 -01} + {-1647730800 -7200 0 -02} + {-1635807600 -3600 1 -01} + {-1616194800 -7200 0 -02} + {-1604358000 -3600 1 -01} + {-1584658800 -7200 0 -02} + {-1572735600 -3600 1 -01} + {-1553036400 -7200 0 -02} + {-1541199600 -3600 1 -01} + {-1521500400 -7200 0 -02} + {-1442444400 -3600 1 -01} + {-1426806000 -7200 0 -02} + {-1379286000 -3600 1 -01} + {-1364770800 -7200 0 -02} + {-1348441200 -3600 1 -01} + {-1333321200 -7200 0 -02} + {-1316386800 -3600 1 -01} + {-1301266800 -7200 0 -02} + {-1284332400 -3600 1 -01} + {-1269817200 -7200 0 -02} + {-1221433200 -3600 1 -01} + {-1206918000 -7200 0 -02} + {-1191193200 -3600 1 -01} + {-1175468400 -7200 0 -02} + {-1127689200 -3600 1 -01} + {-1111964400 -7200 0 -02} + {-1096844400 -3600 1 -01} + {-1080514800 -7200 0 -02} + {-1063580400 -3600 1 -01} + {-1049065200 -7200 0 -02} + {-1033340400 -3600 1 -01} + {-1017615600 -7200 0 -02} + {-1002495600 -3600 1 -01} + {-986166000 -7200 0 -02} + {-969231600 -3600 1 -01} + {-950482800 -7200 0 -02} + {-942015600 -3600 1 -01} + {-922662000 -7200 0 -02} + {-906937200 -3600 1 -01} + {-891126000 -7200 0 -02} + {-877302000 -3600 1 -01} + {-864000000 -3600 0 -01} + {-857948400 -7200 0 -02} + {-845852400 -3600 1 -01} + {-831340800 -3600 0 -01} + {-825894000 -7200 0 -02} + {-814402800 -3600 1 -01} + {-799891200 -3600 0 -01} + {-794444400 -7200 0 -02} + {-782953200 -3600 1 -01} + {-768441600 -3600 0 -01} + {-762994800 -7200 0 -02} + {-749084400 -3600 1 -01} + {-733359600 -7200 0 -02} + {-717624000 -3600 1 -01} + {-701899200 -7200 0 -02} + {-686174400 -3600 1 -01} + {-670449600 -7200 0 -02} + {-654724800 -3600 1 -01} + {-639000000 -7200 0 -02} + {-623275200 -3600 1 -01} + {-607550400 -7200 0 -02} + {-591825600 -3600 1 -01} + {-575496000 -7200 0 -02} + {-559771200 -3600 1 -01} + {-544046400 -7200 0 -02} + {-528321600 -3600 1 -01} + {-512596800 -7200 0 -02} + {-496872000 -3600 1 -01} + {-481147200 -7200 0 -02} + {-465422400 -3600 1 -01} + {-449697600 -7200 0 -02} + {-433972800 -3600 1 -01} + {-417643200 -7200 0 -02} + {-401918400 -3600 1 -01} + {-386193600 -7200 0 -02} + {-370468800 -3600 1 -01} + {-354744000 -7200 0 -02} + {-339019200 -3600 1 -01} + {-323294400 -7200 0 -02} + {-307569600 -3600 1 -01} + {-291844800 -7200 0 -02} + {-276120000 -3600 1 -01} + {-260395200 -7200 0 -02} + {-244670400 -3600 1 -01} + {-228340800 -7200 0 -02} + {-212616000 -3600 1 -01} + {-196891200 -7200 0 -02} + {-181166400 -3600 1 -01} + {-165441600 -7200 0 -02} + {-149716800 -3600 1 -01} + {-133992000 -7200 0 -02} + {-118267200 -3600 0 -01} + {228272400 0 1 +00} + {243997200 -3600 0 -01} + {260326800 0 1 +00} + {276051600 -3600 0 -01} + {291776400 0 1 +00} + {307504800 -3600 0 -01} + {323226000 0 1 +00} + {338954400 -3600 0 -01} + {354679200 0 1 +00} + {370404000 -3600 0 -01} + {386128800 0 1 +00} + {401853600 -3600 0 -01} + {417582000 0 1 +00} + {433303200 -3600 0 -01} + {449028000 0 1 +00} + {465357600 -3600 0 -01} + {481082400 0 1 +00} + {496807200 -3600 0 -01} + {512532000 0 1 +00} + {528256800 -3600 0 -01} + {543981600 0 1 +00} + {559706400 -3600 0 -01} + {575431200 0 1 +00} + {591156000 -3600 0 -01} + {606880800 0 1 +00} + {622605600 -3600 0 -01} + {638330400 0 1 +00} + {654660000 -3600 0 -01} + {670384800 0 1 +00} + {686109600 -3600 0 -01} + {701834400 0 1 +00} + {733280400 0 0 +00} + {749005200 -3600 0 -01} + {764730000 0 1 +00} + {780454800 -3600 0 -01} + {796179600 0 1 +00} + {811904400 -3600 0 -01} + {828234000 0 1 +00} + {846378000 -3600 0 -01} + {859683600 0 1 +00} + {877827600 -3600 0 -01} + {891133200 0 1 +00} + {909277200 -3600 0 -01} + {922582800 0 1 +00} + {941331600 -3600 0 -01} + {954032400 0 1 +00} + {972781200 -3600 0 -01} + {985482000 0 1 +00} + {1004230800 -3600 0 -01} + {1017536400 0 1 +00} + {1035680400 -3600 0 -01} + {1048986000 0 1 +00} + {1067130000 -3600 0 -01} + {1080435600 0 1 +00} + {1099184400 -3600 0 -01} + {1111885200 0 1 +00} + {1130634000 -3600 0 -01} + {1143334800 0 1 +00} + {1162083600 -3600 0 -01} + {1174784400 0 1 +00} + {1193533200 -3600 0 -01} + {1206838800 0 1 +00} + {1224982800 -3600 0 -01} + {1238288400 0 1 +00} + {1256432400 -3600 0 -01} + {1269738000 0 1 +00} + {1288486800 -3600 0 -01} + {1301187600 0 1 +00} + {1319936400 -3600 0 -01} + {1332637200 0 1 +00} + {1351386000 -3600 0 -01} + {1364691600 0 1 +00} + {1382835600 -3600 0 -01} + {1396141200 0 1 +00} + {1414285200 -3600 0 -01} + {1427590800 0 1 +00} + {1445734800 -3600 0 -01} + {1459040400 0 1 +00} + {1477789200 -3600 0 -01} + {1490490000 0 1 +00} + {1509238800 -3600 0 -01} + {1521939600 0 1 +00} + {1540688400 -3600 0 -01} + {1553994000 0 1 +00} + {1572138000 -3600 0 -01} + {1585443600 0 1 +00} + {1603587600 -3600 0 -01} + {1616893200 0 1 +00} + {1635642000 -3600 0 -01} + {1648342800 0 1 +00} + {1667091600 -3600 0 -01} + {1679792400 0 1 +00} + {1698541200 -3600 0 -01} + {1711846800 0 1 +00} + {1729990800 -3600 0 -01} + {1743296400 0 1 +00} + {1761440400 -3600 0 -01} + {1774746000 0 1 +00} + {1792890000 -3600 0 -01} + {1806195600 0 1 +00} + {1824944400 -3600 0 -01} + {1837645200 0 1 +00} + {1856394000 -3600 0 -01} + {1869094800 0 1 +00} + {1887843600 -3600 0 -01} + {1901149200 0 1 +00} + {1919293200 -3600 0 -01} + {1932598800 0 1 +00} + {1950742800 -3600 0 -01} + {1964048400 0 1 +00} + {1982797200 -3600 0 -01} + {1995498000 0 1 +00} + {2014246800 -3600 0 -01} + {2026947600 0 1 +00} + {2045696400 -3600 0 -01} + {2058397200 0 1 +00} + {2077146000 -3600 0 -01} + {2090451600 0 1 +00} + {2108595600 -3600 0 -01} + {2121901200 0 1 +00} + {2140045200 -3600 0 -01} + {2153350800 0 1 +00} + {2172099600 -3600 0 -01} + {2184800400 0 1 +00} + {2203549200 -3600 0 -01} + {2216250000 0 1 +00} + {2234998800 -3600 0 -01} + {2248304400 0 1 +00} + {2266448400 -3600 0 -01} + {2279754000 0 1 +00} + {2297898000 -3600 0 -01} + {2311203600 0 1 +00} + {2329347600 -3600 0 -01} + {2342653200 0 1 +00} + {2361402000 -3600 0 -01} + {2374102800 0 1 +00} + {2392851600 -3600 0 -01} + {2405552400 0 1 +00} + {2424301200 -3600 0 -01} + {2437606800 0 1 +00} + {2455750800 -3600 0 -01} + {2469056400 0 1 +00} + {2487200400 -3600 0 -01} + {2500506000 0 1 +00} + {2519254800 -3600 0 -01} + {2531955600 0 1 +00} + {2550704400 -3600 0 -01} + {2563405200 0 1 +00} + {2582154000 -3600 0 -01} + {2595459600 0 1 +00} + {2613603600 -3600 0 -01} + {2626909200 0 1 +00} + {2645053200 -3600 0 -01} + {2658358800 0 1 +00} + {2676502800 -3600 0 -01} + {2689808400 0 1 +00} + {2708557200 -3600 0 -01} + {2721258000 0 1 +00} + {2740006800 -3600 0 -01} + {2752707600 0 1 +00} + {2771456400 -3600 0 -01} + {2784762000 0 1 +00} + {2802906000 -3600 0 -01} + {2816211600 0 1 +00} + {2834355600 -3600 0 -01} + {2847661200 0 1 +00} + {2866410000 -3600 0 -01} + {2879110800 0 1 +00} + {2897859600 -3600 0 -01} + {2910560400 0 1 +00} + {2929309200 -3600 0 -01} + {2942010000 0 1 +00} + {2960758800 -3600 0 -01} + {2974064400 0 1 +00} + {2992208400 -3600 0 -01} + {3005514000 0 1 +00} + {3023658000 -3600 0 -01} + {3036963600 0 1 +00} + {3055712400 -3600 0 -01} + {3068413200 0 1 +00} + {3087162000 -3600 0 -01} + {3099862800 0 1 +00} + {3118611600 -3600 0 -01} + {3131917200 0 1 +00} + {3150061200 -3600 0 -01} + {3163366800 0 1 +00} + {3181510800 -3600 0 -01} + {3194816400 0 1 +00} + {3212960400 -3600 0 -01} + {3226266000 0 1 +00} + {3245014800 -3600 0 -01} + {3257715600 0 1 +00} + {3276464400 -3600 0 -01} + {3289165200 0 1 +00} + {3307914000 -3600 0 -01} + {3321219600 0 1 +00} + {3339363600 -3600 0 -01} + {3352669200 0 1 +00} + {3370813200 -3600 0 -01} + {3384118800 0 1 +00} + {3402867600 -3600 0 -01} + {3415568400 0 1 +00} + {3434317200 -3600 0 -01} + {3447018000 0 1 +00} + {3465766800 -3600 0 -01} + {3479072400 0 1 +00} + {3497216400 -3600 0 -01} + {3510522000 0 1 +00} + {3528666000 -3600 0 -01} + {3541971600 0 1 +00} + {3560115600 -3600 0 -01} + {3573421200 0 1 +00} + {3592170000 -3600 0 -01} + {3604870800 0 1 +00} + {3623619600 -3600 0 -01} + {3636320400 0 1 +00} + {3655069200 -3600 0 -01} + {3668374800 0 1 +00} + {3686518800 -3600 0 -01} + {3699824400 0 1 +00} + {3717968400 -3600 0 -01} + {3731274000 0 1 +00} + {3750022800 -3600 0 -01} + {3762723600 0 1 +00} + {3781472400 -3600 0 -01} + {3794173200 0 1 +00} + {3812922000 -3600 0 -01} + {3825622800 0 1 +00} + {3844371600 -3600 0 -01} + {3857677200 0 1 +00} + {3875821200 -3600 0 -01} + {3889126800 0 1 +00} + {3907270800 -3600 0 -01} + {3920576400 0 1 +00} + {3939325200 -3600 0 -01} + {3952026000 0 1 +00} + {3970774800 -3600 0 -01} + {3983475600 0 1 +00} + {4002224400 -3600 0 -01} + {4015530000 0 1 +00} + {4033674000 -3600 0 -01} + {4046979600 0 1 +00} + {4065123600 -3600 0 -01} + {4078429200 0 1 +00} + {4096573200 -3600 0 -01} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Canary b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Canary new file mode 100644 index 00000000..b5c29974 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Canary @@ -0,0 +1,247 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Canary) { + {-9223372036854775808 -3696 0 LMT} + {-1509663504 -3600 0 -01} + {-733874400 0 0 WET} + {323827200 3600 1 WEST} + {338950800 0 0 WET} + {354675600 3600 1 WEST} + {370400400 0 0 WET} + {386125200 3600 1 WEST} + {401850000 0 0 WET} + {417574800 3600 1 WEST} + {433299600 0 0 WET} + {449024400 3600 1 WEST} + {465354000 0 0 WET} + {481078800 3600 1 WEST} + {496803600 0 0 WET} + {512528400 3600 1 WEST} + {528253200 0 0 WET} + {543978000 3600 1 WEST} + {559702800 0 0 WET} + {575427600 3600 1 WEST} + {591152400 0 0 WET} + {606877200 3600 1 WEST} + {622602000 0 0 WET} + {638326800 3600 1 WEST} + {654656400 0 0 WET} + {670381200 3600 1 WEST} + {686106000 0 0 WET} + {701830800 3600 1 WEST} + {717555600 0 0 WET} + {733280400 3600 1 WEST} + {749005200 0 0 WET} + {764730000 3600 1 WEST} + {780454800 0 0 WET} + {796179600 3600 1 WEST} + {811904400 0 0 WET} + {828234000 3600 1 WEST} + {846378000 0 0 WET} + {859683600 3600 1 WEST} + {877827600 0 0 WET} + {891133200 3600 1 WEST} + {909277200 0 0 WET} + {922582800 3600 1 WEST} + {941331600 0 0 WET} + {954032400 3600 1 WEST} + {972781200 0 0 WET} + {985482000 3600 1 WEST} + {1004230800 0 0 WET} + {1017536400 3600 1 WEST} + {1035680400 0 0 WET} + {1048986000 3600 1 WEST} + {1067130000 0 0 WET} + {1080435600 3600 1 WEST} + {1099184400 0 0 WET} + {1111885200 3600 1 WEST} + {1130634000 0 0 WET} + {1143334800 3600 1 WEST} + {1162083600 0 0 WET} + {1174784400 3600 1 WEST} + {1193533200 0 0 WET} + {1206838800 3600 1 WEST} + {1224982800 0 0 WET} + {1238288400 3600 1 WEST} + {1256432400 0 0 WET} + {1269738000 3600 1 WEST} + {1288486800 0 0 WET} + {1301187600 3600 1 WEST} + {1319936400 0 0 WET} + {1332637200 3600 1 WEST} + {1351386000 0 0 WET} + {1364691600 3600 1 WEST} + {1382835600 0 0 WET} + {1396141200 3600 1 WEST} + {1414285200 0 0 WET} + {1427590800 3600 1 WEST} + {1445734800 0 0 WET} + {1459040400 3600 1 WEST} + {1477789200 0 0 WET} + {1490490000 3600 1 WEST} + {1509238800 0 0 WET} + {1521939600 3600 1 WEST} + {1540688400 0 0 WET} + {1553994000 3600 1 WEST} + {1572138000 0 0 WET} + {1585443600 3600 1 WEST} + {1603587600 0 0 WET} + {1616893200 3600 1 WEST} + {1635642000 0 0 WET} + {1648342800 3600 1 WEST} + {1667091600 0 0 WET} + {1679792400 3600 1 WEST} + {1698541200 0 0 WET} + {1711846800 3600 1 WEST} + {1729990800 0 0 WET} + {1743296400 3600 1 WEST} + {1761440400 0 0 WET} + {1774746000 3600 1 WEST} + {1792890000 0 0 WET} + {1806195600 3600 1 WEST} + {1824944400 0 0 WET} + {1837645200 3600 1 WEST} + {1856394000 0 0 WET} + {1869094800 3600 1 WEST} + {1887843600 0 0 WET} + {1901149200 3600 1 WEST} + {1919293200 0 0 WET} + {1932598800 3600 1 WEST} + {1950742800 0 0 WET} + {1964048400 3600 1 WEST} + {1982797200 0 0 WET} + {1995498000 3600 1 WEST} + {2014246800 0 0 WET} + {2026947600 3600 1 WEST} + {2045696400 0 0 WET} + {2058397200 3600 1 WEST} + {2077146000 0 0 WET} + {2090451600 3600 1 WEST} + {2108595600 0 0 WET} + {2121901200 3600 1 WEST} + {2140045200 0 0 WET} + {2153350800 3600 1 WEST} + {2172099600 0 0 WET} + {2184800400 3600 1 WEST} + {2203549200 0 0 WET} + {2216250000 3600 1 WEST} + {2234998800 0 0 WET} + {2248304400 3600 1 WEST} + {2266448400 0 0 WET} + {2279754000 3600 1 WEST} + {2297898000 0 0 WET} + {2311203600 3600 1 WEST} + {2329347600 0 0 WET} + {2342653200 3600 1 WEST} + {2361402000 0 0 WET} + {2374102800 3600 1 WEST} + {2392851600 0 0 WET} + {2405552400 3600 1 WEST} + {2424301200 0 0 WET} + {2437606800 3600 1 WEST} + {2455750800 0 0 WET} + {2469056400 3600 1 WEST} + {2487200400 0 0 WET} + {2500506000 3600 1 WEST} + {2519254800 0 0 WET} + {2531955600 3600 1 WEST} + {2550704400 0 0 WET} + {2563405200 3600 1 WEST} + {2582154000 0 0 WET} + {2595459600 3600 1 WEST} + {2613603600 0 0 WET} + {2626909200 3600 1 WEST} + {2645053200 0 0 WET} + {2658358800 3600 1 WEST} + {2676502800 0 0 WET} + {2689808400 3600 1 WEST} + {2708557200 0 0 WET} + {2721258000 3600 1 WEST} + {2740006800 0 0 WET} + {2752707600 3600 1 WEST} + {2771456400 0 0 WET} + {2784762000 3600 1 WEST} + {2802906000 0 0 WET} + {2816211600 3600 1 WEST} + {2834355600 0 0 WET} + {2847661200 3600 1 WEST} + {2866410000 0 0 WET} + {2879110800 3600 1 WEST} + {2897859600 0 0 WET} + {2910560400 3600 1 WEST} + {2929309200 0 0 WET} + {2942010000 3600 1 WEST} + {2960758800 0 0 WET} + {2974064400 3600 1 WEST} + {2992208400 0 0 WET} + {3005514000 3600 1 WEST} + {3023658000 0 0 WET} + {3036963600 3600 1 WEST} + {3055712400 0 0 WET} + {3068413200 3600 1 WEST} + {3087162000 0 0 WET} + {3099862800 3600 1 WEST} + {3118611600 0 0 WET} + {3131917200 3600 1 WEST} + {3150061200 0 0 WET} + {3163366800 3600 1 WEST} + {3181510800 0 0 WET} + {3194816400 3600 1 WEST} + {3212960400 0 0 WET} + {3226266000 3600 1 WEST} + {3245014800 0 0 WET} + {3257715600 3600 1 WEST} + {3276464400 0 0 WET} + {3289165200 3600 1 WEST} + {3307914000 0 0 WET} + {3321219600 3600 1 WEST} + {3339363600 0 0 WET} + {3352669200 3600 1 WEST} + {3370813200 0 0 WET} + {3384118800 3600 1 WEST} + {3402867600 0 0 WET} + {3415568400 3600 1 WEST} + {3434317200 0 0 WET} + {3447018000 3600 1 WEST} + {3465766800 0 0 WET} + {3479072400 3600 1 WEST} + {3497216400 0 0 WET} + {3510522000 3600 1 WEST} + {3528666000 0 0 WET} + {3541971600 3600 1 WEST} + {3560115600 0 0 WET} + {3573421200 3600 1 WEST} + {3592170000 0 0 WET} + {3604870800 3600 1 WEST} + {3623619600 0 0 WET} + {3636320400 3600 1 WEST} + {3655069200 0 0 WET} + {3668374800 3600 1 WEST} + {3686518800 0 0 WET} + {3699824400 3600 1 WEST} + {3717968400 0 0 WET} + {3731274000 3600 1 WEST} + {3750022800 0 0 WET} + {3762723600 3600 1 WEST} + {3781472400 0 0 WET} + {3794173200 3600 1 WEST} + {3812922000 0 0 WET} + {3825622800 3600 1 WEST} + {3844371600 0 0 WET} + {3857677200 3600 1 WEST} + {3875821200 0 0 WET} + {3889126800 3600 1 WEST} + {3907270800 0 0 WET} + {3920576400 3600 1 WEST} + {3939325200 0 0 WET} + {3952026000 3600 1 WEST} + {3970774800 0 0 WET} + {3983475600 3600 1 WEST} + {4002224400 0 0 WET} + {4015530000 3600 1 WEST} + {4033674000 0 0 WET} + {4046979600 3600 1 WEST} + {4065123600 0 0 WET} + {4078429200 3600 1 WEST} + {4096573200 0 0 WET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Cape_Verde b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Cape_Verde new file mode 100644 index 00000000..595db0bf --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Cape_Verde @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Cape_Verde) { + {-9223372036854775808 -5644 0 LMT} + {-1830376800 -7200 0 -02} + {-862610400 -3600 1 -01} + {-764118000 -7200 0 -02} + {186120000 -3600 0 -01} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Faeroe b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Faeroe new file mode 100644 index 00000000..4cafc340 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Faeroe @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Atlantic/Faroe)]} { + LoadTimeZoneFile Atlantic/Faroe +} +set TZData(:Atlantic/Faeroe) $TZData(:Atlantic/Faroe) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Faroe b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Faroe new file mode 100644 index 00000000..d2c314a3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Faroe @@ -0,0 +1,245 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Faroe) { + {-9223372036854775808 -1624 0 LMT} + {-1955748776 0 0 WET} + {347155200 0 0 WET} + {354675600 3600 1 WEST} + {370400400 0 0 WET} + {386125200 3600 1 WEST} + {401850000 0 0 WET} + {417574800 3600 1 WEST} + {433299600 0 0 WET} + {449024400 3600 1 WEST} + {465354000 0 0 WET} + {481078800 3600 1 WEST} + {496803600 0 0 WET} + {512528400 3600 1 WEST} + {528253200 0 0 WET} + {543978000 3600 1 WEST} + {559702800 0 0 WET} + {575427600 3600 1 WEST} + {591152400 0 0 WET} + {606877200 3600 1 WEST} + {622602000 0 0 WET} + {638326800 3600 1 WEST} + {654656400 0 0 WET} + {670381200 3600 1 WEST} + {686106000 0 0 WET} + {701830800 3600 1 WEST} + {717555600 0 0 WET} + {733280400 3600 1 WEST} + {749005200 0 0 WET} + {764730000 3600 1 WEST} + {780454800 0 0 WET} + {796179600 3600 1 WEST} + {811904400 0 0 WET} + {828234000 3600 1 WEST} + {846378000 0 0 WET} + {859683600 3600 1 WEST} + {877827600 0 0 WET} + {891133200 3600 1 WEST} + {909277200 0 0 WET} + {922582800 3600 1 WEST} + {941331600 0 0 WET} + {954032400 3600 1 WEST} + {972781200 0 0 WET} + {985482000 3600 1 WEST} + {1004230800 0 0 WET} + {1017536400 3600 1 WEST} + {1035680400 0 0 WET} + {1048986000 3600 1 WEST} + {1067130000 0 0 WET} + {1080435600 3600 1 WEST} + {1099184400 0 0 WET} + {1111885200 3600 1 WEST} + {1130634000 0 0 WET} + {1143334800 3600 1 WEST} + {1162083600 0 0 WET} + {1174784400 3600 1 WEST} + {1193533200 0 0 WET} + {1206838800 3600 1 WEST} + {1224982800 0 0 WET} + {1238288400 3600 1 WEST} + {1256432400 0 0 WET} + {1269738000 3600 1 WEST} + {1288486800 0 0 WET} + {1301187600 3600 1 WEST} + {1319936400 0 0 WET} + {1332637200 3600 1 WEST} + {1351386000 0 0 WET} + {1364691600 3600 1 WEST} + {1382835600 0 0 WET} + {1396141200 3600 1 WEST} + {1414285200 0 0 WET} + {1427590800 3600 1 WEST} + {1445734800 0 0 WET} + {1459040400 3600 1 WEST} + {1477789200 0 0 WET} + {1490490000 3600 1 WEST} + {1509238800 0 0 WET} + {1521939600 3600 1 WEST} + {1540688400 0 0 WET} + {1553994000 3600 1 WEST} + {1572138000 0 0 WET} + {1585443600 3600 1 WEST} + {1603587600 0 0 WET} + {1616893200 3600 1 WEST} + {1635642000 0 0 WET} + {1648342800 3600 1 WEST} + {1667091600 0 0 WET} + {1679792400 3600 1 WEST} + {1698541200 0 0 WET} + {1711846800 3600 1 WEST} + {1729990800 0 0 WET} + {1743296400 3600 1 WEST} + {1761440400 0 0 WET} + {1774746000 3600 1 WEST} + {1792890000 0 0 WET} + {1806195600 3600 1 WEST} + {1824944400 0 0 WET} + {1837645200 3600 1 WEST} + {1856394000 0 0 WET} + {1869094800 3600 1 WEST} + {1887843600 0 0 WET} + {1901149200 3600 1 WEST} + {1919293200 0 0 WET} + {1932598800 3600 1 WEST} + {1950742800 0 0 WET} + {1964048400 3600 1 WEST} + {1982797200 0 0 WET} + {1995498000 3600 1 WEST} + {2014246800 0 0 WET} + {2026947600 3600 1 WEST} + {2045696400 0 0 WET} + {2058397200 3600 1 WEST} + {2077146000 0 0 WET} + {2090451600 3600 1 WEST} + {2108595600 0 0 WET} + {2121901200 3600 1 WEST} + {2140045200 0 0 WET} + {2153350800 3600 1 WEST} + {2172099600 0 0 WET} + {2184800400 3600 1 WEST} + {2203549200 0 0 WET} + {2216250000 3600 1 WEST} + {2234998800 0 0 WET} + {2248304400 3600 1 WEST} + {2266448400 0 0 WET} + {2279754000 3600 1 WEST} + {2297898000 0 0 WET} + {2311203600 3600 1 WEST} + {2329347600 0 0 WET} + {2342653200 3600 1 WEST} + {2361402000 0 0 WET} + {2374102800 3600 1 WEST} + {2392851600 0 0 WET} + {2405552400 3600 1 WEST} + {2424301200 0 0 WET} + {2437606800 3600 1 WEST} + {2455750800 0 0 WET} + {2469056400 3600 1 WEST} + {2487200400 0 0 WET} + {2500506000 3600 1 WEST} + {2519254800 0 0 WET} + {2531955600 3600 1 WEST} + {2550704400 0 0 WET} + {2563405200 3600 1 WEST} + {2582154000 0 0 WET} + {2595459600 3600 1 WEST} + {2613603600 0 0 WET} + {2626909200 3600 1 WEST} + {2645053200 0 0 WET} + {2658358800 3600 1 WEST} + {2676502800 0 0 WET} + {2689808400 3600 1 WEST} + {2708557200 0 0 WET} + {2721258000 3600 1 WEST} + {2740006800 0 0 WET} + {2752707600 3600 1 WEST} + {2771456400 0 0 WET} + {2784762000 3600 1 WEST} + {2802906000 0 0 WET} + {2816211600 3600 1 WEST} + {2834355600 0 0 WET} + {2847661200 3600 1 WEST} + {2866410000 0 0 WET} + {2879110800 3600 1 WEST} + {2897859600 0 0 WET} + {2910560400 3600 1 WEST} + {2929309200 0 0 WET} + {2942010000 3600 1 WEST} + {2960758800 0 0 WET} + {2974064400 3600 1 WEST} + {2992208400 0 0 WET} + {3005514000 3600 1 WEST} + {3023658000 0 0 WET} + {3036963600 3600 1 WEST} + {3055712400 0 0 WET} + {3068413200 3600 1 WEST} + {3087162000 0 0 WET} + {3099862800 3600 1 WEST} + {3118611600 0 0 WET} + {3131917200 3600 1 WEST} + {3150061200 0 0 WET} + {3163366800 3600 1 WEST} + {3181510800 0 0 WET} + {3194816400 3600 1 WEST} + {3212960400 0 0 WET} + {3226266000 3600 1 WEST} + {3245014800 0 0 WET} + {3257715600 3600 1 WEST} + {3276464400 0 0 WET} + {3289165200 3600 1 WEST} + {3307914000 0 0 WET} + {3321219600 3600 1 WEST} + {3339363600 0 0 WET} + {3352669200 3600 1 WEST} + {3370813200 0 0 WET} + {3384118800 3600 1 WEST} + {3402867600 0 0 WET} + {3415568400 3600 1 WEST} + {3434317200 0 0 WET} + {3447018000 3600 1 WEST} + {3465766800 0 0 WET} + {3479072400 3600 1 WEST} + {3497216400 0 0 WET} + {3510522000 3600 1 WEST} + {3528666000 0 0 WET} + {3541971600 3600 1 WEST} + {3560115600 0 0 WET} + {3573421200 3600 1 WEST} + {3592170000 0 0 WET} + {3604870800 3600 1 WEST} + {3623619600 0 0 WET} + {3636320400 3600 1 WEST} + {3655069200 0 0 WET} + {3668374800 3600 1 WEST} + {3686518800 0 0 WET} + {3699824400 3600 1 WEST} + {3717968400 0 0 WET} + {3731274000 3600 1 WEST} + {3750022800 0 0 WET} + {3762723600 3600 1 WEST} + {3781472400 0 0 WET} + {3794173200 3600 1 WEST} + {3812922000 0 0 WET} + {3825622800 3600 1 WEST} + {3844371600 0 0 WET} + {3857677200 3600 1 WEST} + {3875821200 0 0 WET} + {3889126800 3600 1 WEST} + {3907270800 0 0 WET} + {3920576400 3600 1 WEST} + {3939325200 0 0 WET} + {3952026000 3600 1 WEST} + {3970774800 0 0 WET} + {3983475600 3600 1 WEST} + {4002224400 0 0 WET} + {4015530000 3600 1 WEST} + {4033674000 0 0 WET} + {4046979600 3600 1 WEST} + {4065123600 0 0 WET} + {4078429200 3600 1 WEST} + {4096573200 0 0 WET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Jan_Mayen b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Jan_Mayen new file mode 100644 index 00000000..468d8198 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Jan_Mayen @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Berlin)]} { + LoadTimeZoneFile Europe/Berlin +} +set TZData(:Atlantic/Jan_Mayen) $TZData(:Europe/Berlin) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Reykjavik b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Reykjavik new file mode 100644 index 00000000..3c4a1334 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Reykjavik @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Atlantic/Reykjavik) $TZData(:Africa/Abidjan) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Stanley b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Stanley new file mode 100644 index 00000000..48473caa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Atlantic/Stanley @@ -0,0 +1,75 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Stanley) { + {-9223372036854775808 -13884 0 LMT} + {-2524507716 -13884 0 SMT} + {-1824235716 -14400 0 -04} + {-1018209600 -10800 1 -04} + {-1003093200 -14400 0 -04} + {-986760000 -10800 1 -04} + {-971643600 -14400 0 -04} + {-954705600 -10800 1 -04} + {-939589200 -14400 0 -04} + {-923256000 -10800 1 -04} + {-908139600 -14400 0 -04} + {-891806400 -10800 1 -04} + {-876690000 -14400 0 -04} + {-860356800 -10800 1 -04} + {420606000 -7200 0 -03} + {433303200 -7200 1 -03} + {452052000 -10800 0 -03} + {464151600 -7200 1 -03} + {483501600 -10800 0 -03} + {495597600 -14400 0 -04} + {495604800 -10800 1 -04} + {514350000 -14400 0 -04} + {527054400 -10800 1 -04} + {545799600 -14400 0 -04} + {558504000 -10800 1 -04} + {577249200 -14400 0 -04} + {589953600 -10800 1 -04} + {608698800 -14400 0 -04} + {621403200 -10800 1 -04} + {640753200 -14400 0 -04} + {652852800 -10800 1 -04} + {672202800 -14400 0 -04} + {684907200 -10800 1 -04} + {703652400 -14400 0 -04} + {716356800 -10800 1 -04} + {735102000 -14400 0 -04} + {747806400 -10800 1 -04} + {766551600 -14400 0 -04} + {779256000 -10800 1 -04} + {798001200 -14400 0 -04} + {810705600 -10800 1 -04} + {830055600 -14400 0 -04} + {842760000 -10800 1 -04} + {861505200 -14400 0 -04} + {874209600 -10800 1 -04} + {892954800 -14400 0 -04} + {905659200 -10800 1 -04} + {924404400 -14400 0 -04} + {937108800 -10800 1 -04} + {955854000 -14400 0 -04} + {968558400 -10800 1 -04} + {987310800 -14400 0 -04} + {999410400 -10800 1 -04} + {1019365200 -14400 0 -04} + {1030860000 -10800 1 -04} + {1050814800 -14400 0 -04} + {1062914400 -10800 1 -04} + {1082264400 -14400 0 -04} + {1094364000 -10800 1 -04} + {1113714000 -14400 0 -04} + {1125813600 -10800 1 -04} + {1145163600 -14400 0 -04} + {1157263200 -10800 1 -04} + {1176613200 -14400 0 -04} + {1188712800 -10800 1 -04} + {1208667600 -14400 0 -04} + {1220767200 -10800 1 -04} + {1240117200 -14400 0 -04} + {1252216800 -10800 1 -04} + {1271566800 -14400 0 -04} + {1283662800 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/ACT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/ACT new file mode 100644 index 00000000..f7da2815 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/ACT @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Sydney)]} { + LoadTimeZoneFile Australia/Sydney +} +set TZData(:Australia/ACT) $TZData(:Australia/Sydney) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Adelaide b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Adelaide new file mode 100644 index 00000000..5f7c1a44 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Adelaide @@ -0,0 +1,273 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Adelaide) { + {-9223372036854775808 33260 0 LMT} + {-2364110060 32400 0 ACST} + {-2230189200 34200 0 ACST} + {-1672558200 37800 1 ACDT} + {-1665387000 34200 0 ACST} + {-883639800 37800 1 ACDT} + {-876123000 34200 0 ACST} + {-860398200 37800 1 ACDT} + {-844673400 34200 0 ACST} + {-828343800 37800 1 ACDT} + {-813223800 34200 0 ACST} + {31501800 34200 0 ACST} + {57688200 37800 1 ACDT} + {67969800 34200 0 ACST} + {89137800 37800 1 ACDT} + {100024200 34200 0 ACST} + {120587400 37800 1 ACDT} + {131473800 34200 0 ACST} + {152037000 37800 1 ACDT} + {162923400 34200 0 ACST} + {183486600 37800 1 ACDT} + {194977800 34200 0 ACST} + {215541000 37800 1 ACDT} + {226427400 34200 0 ACST} + {246990600 37800 1 ACDT} + {257877000 34200 0 ACST} + {278440200 37800 1 ACDT} + {289326600 34200 0 ACST} + {309889800 37800 1 ACDT} + {320776200 34200 0 ACST} + {341339400 37800 1 ACDT} + {352225800 34200 0 ACST} + {372789000 37800 1 ACDT} + {384280200 34200 0 ACST} + {404843400 37800 1 ACDT} + {415729800 34200 0 ACST} + {436293000 37800 1 ACDT} + {447179400 34200 0 ACST} + {467742600 37800 1 ACDT} + {478629000 34200 0 ACST} + {499192200 37800 1 ACDT} + {511288200 34200 0 ACST} + {530037000 37800 1 ACDT} + {542737800 34200 0 ACST} + {562091400 37800 1 ACDT} + {574792200 34200 0 ACST} + {594145800 37800 1 ACDT} + {606241800 34200 0 ACST} + {625595400 37800 1 ACDT} + {637691400 34200 0 ACST} + {657045000 37800 1 ACDT} + {667931400 34200 0 ACST} + {688494600 37800 1 ACDT} + {701195400 34200 0 ACST} + {719944200 37800 1 ACDT} + {731435400 34200 0 ACST} + {751998600 37800 1 ACDT} + {764094600 34200 0 ACST} + {783448200 37800 1 ACDT} + {796149000 34200 0 ACST} + {814897800 37800 1 ACDT} + {828203400 34200 0 ACST} + {846347400 37800 1 ACDT} + {859653000 34200 0 ACST} + {877797000 37800 1 ACDT} + {891102600 34200 0 ACST} + {909246600 37800 1 ACDT} + {922552200 34200 0 ACST} + {941301000 37800 1 ACDT} + {954001800 34200 0 ACST} + {972750600 37800 1 ACDT} + {985451400 34200 0 ACST} + {1004200200 37800 1 ACDT} + {1017505800 34200 0 ACST} + {1035649800 37800 1 ACDT} + {1048955400 34200 0 ACST} + {1067099400 37800 1 ACDT} + {1080405000 34200 0 ACST} + {1099153800 37800 1 ACDT} + {1111854600 34200 0 ACST} + {1130603400 37800 1 ACDT} + {1143909000 34200 0 ACST} + {1162053000 37800 1 ACDT} + {1174753800 34200 0 ACST} + {1193502600 37800 1 ACDT} + {1207413000 34200 0 ACST} + {1223137800 37800 1 ACDT} + {1238862600 34200 0 ACST} + {1254587400 37800 1 ACDT} + {1270312200 34200 0 ACST} + {1286037000 37800 1 ACDT} + {1301761800 34200 0 ACST} + {1317486600 37800 1 ACDT} + {1333211400 34200 0 ACST} + {1349541000 37800 1 ACDT} + {1365265800 34200 0 ACST} + {1380990600 37800 1 ACDT} + {1396715400 34200 0 ACST} + {1412440200 37800 1 ACDT} + {1428165000 34200 0 ACST} + {1443889800 37800 1 ACDT} + {1459614600 34200 0 ACST} + {1475339400 37800 1 ACDT} + {1491064200 34200 0 ACST} + {1506789000 37800 1 ACDT} + {1522513800 34200 0 ACST} + {1538843400 37800 1 ACDT} + {1554568200 34200 0 ACST} + {1570293000 37800 1 ACDT} + {1586017800 34200 0 ACST} + {1601742600 37800 1 ACDT} + {1617467400 34200 0 ACST} + {1633192200 37800 1 ACDT} + {1648917000 34200 0 ACST} + {1664641800 37800 1 ACDT} + {1680366600 34200 0 ACST} + {1696091400 37800 1 ACDT} + {1712421000 34200 0 ACST} + {1728145800 37800 1 ACDT} + {1743870600 34200 0 ACST} + {1759595400 37800 1 ACDT} + {1775320200 34200 0 ACST} + {1791045000 37800 1 ACDT} + {1806769800 34200 0 ACST} + {1822494600 37800 1 ACDT} + {1838219400 34200 0 ACST} + {1853944200 37800 1 ACDT} + {1869669000 34200 0 ACST} + {1885998600 37800 1 ACDT} + {1901723400 34200 0 ACST} + {1917448200 37800 1 ACDT} + {1933173000 34200 0 ACST} + {1948897800 37800 1 ACDT} + {1964622600 34200 0 ACST} + {1980347400 37800 1 ACDT} + {1996072200 34200 0 ACST} + {2011797000 37800 1 ACDT} + {2027521800 34200 0 ACST} + {2043246600 37800 1 ACDT} + {2058971400 34200 0 ACST} + {2075301000 37800 1 ACDT} + {2091025800 34200 0 ACST} + {2106750600 37800 1 ACDT} + {2122475400 34200 0 ACST} + {2138200200 37800 1 ACDT} + {2153925000 34200 0 ACST} + {2169649800 37800 1 ACDT} + {2185374600 34200 0 ACST} + {2201099400 37800 1 ACDT} + {2216824200 34200 0 ACST} + {2233153800 37800 1 ACDT} + {2248878600 34200 0 ACST} + {2264603400 37800 1 ACDT} + {2280328200 34200 0 ACST} + {2296053000 37800 1 ACDT} + {2311777800 34200 0 ACST} + {2327502600 37800 1 ACDT} + {2343227400 34200 0 ACST} + {2358952200 37800 1 ACDT} + {2374677000 34200 0 ACST} + {2390401800 37800 1 ACDT} + {2406126600 34200 0 ACST} + {2422456200 37800 1 ACDT} + {2438181000 34200 0 ACST} + {2453905800 37800 1 ACDT} + {2469630600 34200 0 ACST} + {2485355400 37800 1 ACDT} + {2501080200 34200 0 ACST} + {2516805000 37800 1 ACDT} + {2532529800 34200 0 ACST} + {2548254600 37800 1 ACDT} + {2563979400 34200 0 ACST} + {2579704200 37800 1 ACDT} + {2596033800 34200 0 ACST} + {2611758600 37800 1 ACDT} + {2627483400 34200 0 ACST} + {2643208200 37800 1 ACDT} + {2658933000 34200 0 ACST} + {2674657800 37800 1 ACDT} + {2690382600 34200 0 ACST} + {2706107400 37800 1 ACDT} + {2721832200 34200 0 ACST} + {2737557000 37800 1 ACDT} + {2753281800 34200 0 ACST} + {2769611400 37800 1 ACDT} + {2785336200 34200 0 ACST} + {2801061000 37800 1 ACDT} + {2816785800 34200 0 ACST} + {2832510600 37800 1 ACDT} + {2848235400 34200 0 ACST} + {2863960200 37800 1 ACDT} + {2879685000 34200 0 ACST} + {2895409800 37800 1 ACDT} + {2911134600 34200 0 ACST} + {2926859400 37800 1 ACDT} + {2942584200 34200 0 ACST} + {2958913800 37800 1 ACDT} + {2974638600 34200 0 ACST} + {2990363400 37800 1 ACDT} + {3006088200 34200 0 ACST} + {3021813000 37800 1 ACDT} + {3037537800 34200 0 ACST} + {3053262600 37800 1 ACDT} + {3068987400 34200 0 ACST} + {3084712200 37800 1 ACDT} + {3100437000 34200 0 ACST} + {3116766600 37800 1 ACDT} + {3132491400 34200 0 ACST} + {3148216200 37800 1 ACDT} + {3163941000 34200 0 ACST} + {3179665800 37800 1 ACDT} + {3195390600 34200 0 ACST} + {3211115400 37800 1 ACDT} + {3226840200 34200 0 ACST} + {3242565000 37800 1 ACDT} + {3258289800 34200 0 ACST} + {3274014600 37800 1 ACDT} + {3289739400 34200 0 ACST} + {3306069000 37800 1 ACDT} + {3321793800 34200 0 ACST} + {3337518600 37800 1 ACDT} + {3353243400 34200 0 ACST} + {3368968200 37800 1 ACDT} + {3384693000 34200 0 ACST} + {3400417800 37800 1 ACDT} + {3416142600 34200 0 ACST} + {3431867400 37800 1 ACDT} + {3447592200 34200 0 ACST} + {3463317000 37800 1 ACDT} + {3479646600 34200 0 ACST} + {3495371400 37800 1 ACDT} + {3511096200 34200 0 ACST} + {3526821000 37800 1 ACDT} + {3542545800 34200 0 ACST} + {3558270600 37800 1 ACDT} + {3573995400 34200 0 ACST} + {3589720200 37800 1 ACDT} + {3605445000 34200 0 ACST} + {3621169800 37800 1 ACDT} + {3636894600 34200 0 ACST} + {3653224200 37800 1 ACDT} + {3668949000 34200 0 ACST} + {3684673800 37800 1 ACDT} + {3700398600 34200 0 ACST} + {3716123400 37800 1 ACDT} + {3731848200 34200 0 ACST} + {3747573000 37800 1 ACDT} + {3763297800 34200 0 ACST} + {3779022600 37800 1 ACDT} + {3794747400 34200 0 ACST} + {3810472200 37800 1 ACDT} + {3826197000 34200 0 ACST} + {3842526600 37800 1 ACDT} + {3858251400 34200 0 ACST} + {3873976200 37800 1 ACDT} + {3889701000 34200 0 ACST} + {3905425800 37800 1 ACDT} + {3921150600 34200 0 ACST} + {3936875400 37800 1 ACDT} + {3952600200 34200 0 ACST} + {3968325000 37800 1 ACDT} + {3984049800 34200 0 ACST} + {4000379400 37800 1 ACDT} + {4016104200 34200 0 ACST} + {4031829000 37800 1 ACDT} + {4047553800 34200 0 ACST} + {4063278600 37800 1 ACDT} + {4079003400 34200 0 ACST} + {4094728200 37800 1 ACDT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Brisbane b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Brisbane new file mode 100644 index 00000000..325313a0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Brisbane @@ -0,0 +1,23 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Brisbane) { + {-9223372036854775808 36728 0 LMT} + {-2366791928 36000 0 AEST} + {-1672560000 39600 1 AEDT} + {-1665388800 36000 0 AEST} + {-883641600 39600 1 AEDT} + {-876124800 36000 0 AEST} + {-860400000 39600 1 AEDT} + {-844675200 36000 0 AEST} + {-828345600 39600 1 AEDT} + {-813225600 36000 0 AEST} + {31500000 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {625593600 39600 1 AEDT} + {636480000 36000 0 AEST} + {657043200 39600 1 AEDT} + {667929600 36000 0 AEST} + {688492800 39600 1 AEDT} + {699379200 36000 0 AEST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Broken_Hill b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Broken_Hill new file mode 100644 index 00000000..2534b707 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Broken_Hill @@ -0,0 +1,275 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Broken_Hill) { + {-9223372036854775808 33948 0 LMT} + {-2364110748 36000 0 AEST} + {-2314951200 32400 0 ACST} + {-2230189200 34200 0 ACST} + {-1672558200 37800 1 ACDT} + {-1665387000 34200 0 ACST} + {-883639800 37800 1 ACDT} + {-876123000 34200 0 ACST} + {-860398200 37800 1 ACDT} + {-844673400 34200 0 ACST} + {-828343800 37800 1 ACDT} + {-813223800 34200 0 ACST} + {31501800 34200 0 ACST} + {57688200 37800 1 ACDT} + {67969800 34200 0 ACST} + {89137800 37800 1 ACDT} + {100024200 34200 0 ACST} + {120587400 37800 1 ACDT} + {131473800 34200 0 ACST} + {152037000 37800 1 ACDT} + {162923400 34200 0 ACST} + {183486600 37800 1 ACDT} + {194977800 34200 0 ACST} + {215541000 37800 1 ACDT} + {226427400 34200 0 ACST} + {246990600 37800 1 ACDT} + {257877000 34200 0 ACST} + {278440200 37800 1 ACDT} + {289326600 34200 0 ACST} + {309889800 37800 1 ACDT} + {320776200 34200 0 ACST} + {341339400 37800 1 ACDT} + {352225800 34200 0 ACST} + {372789000 37800 1 ACDT} + {386699400 34200 0 ACST} + {404843400 37800 1 ACDT} + {415729800 34200 0 ACST} + {436293000 37800 1 ACDT} + {447179400 34200 0 ACST} + {467742600 37800 1 ACDT} + {478629000 34200 0 ACST} + {499192200 37800 1 ACDT} + {511288200 34200 0 ACST} + {530037000 37800 1 ACDT} + {542737800 34200 0 ACST} + {562091400 37800 1 ACDT} + {574792200 34200 0 ACST} + {594145800 37800 1 ACDT} + {606241800 34200 0 ACST} + {625595400 37800 1 ACDT} + {636481800 34200 0 ACST} + {657045000 37800 1 ACDT} + {667931400 34200 0 ACST} + {688494600 37800 1 ACDT} + {699381000 34200 0 ACST} + {719944200 37800 1 ACDT} + {731435400 34200 0 ACST} + {751998600 37800 1 ACDT} + {762885000 34200 0 ACST} + {783448200 37800 1 ACDT} + {794334600 34200 0 ACST} + {814897800 37800 1 ACDT} + {828203400 34200 0 ACST} + {846347400 37800 1 ACDT} + {859653000 34200 0 ACST} + {877797000 37800 1 ACDT} + {891102600 34200 0 ACST} + {909246600 37800 1 ACDT} + {922552200 34200 0 ACST} + {941301000 37800 1 ACDT} + {946647000 37800 0 ACST} + {954001800 34200 0 ACST} + {972750600 37800 1 ACDT} + {985451400 34200 0 ACST} + {1004200200 37800 1 ACDT} + {1017505800 34200 0 ACST} + {1035649800 37800 1 ACDT} + {1048955400 34200 0 ACST} + {1067099400 37800 1 ACDT} + {1080405000 34200 0 ACST} + {1099153800 37800 1 ACDT} + {1111854600 34200 0 ACST} + {1130603400 37800 1 ACDT} + {1143909000 34200 0 ACST} + {1162053000 37800 1 ACDT} + {1174753800 34200 0 ACST} + {1193502600 37800 1 ACDT} + {1207413000 34200 0 ACST} + {1223137800 37800 1 ACDT} + {1238862600 34200 0 ACST} + {1254587400 37800 1 ACDT} + {1270312200 34200 0 ACST} + {1286037000 37800 1 ACDT} + {1301761800 34200 0 ACST} + {1317486600 37800 1 ACDT} + {1333211400 34200 0 ACST} + {1349541000 37800 1 ACDT} + {1365265800 34200 0 ACST} + {1380990600 37800 1 ACDT} + {1396715400 34200 0 ACST} + {1412440200 37800 1 ACDT} + {1428165000 34200 0 ACST} + {1443889800 37800 1 ACDT} + {1459614600 34200 0 ACST} + {1475339400 37800 1 ACDT} + {1491064200 34200 0 ACST} + {1506789000 37800 1 ACDT} + {1522513800 34200 0 ACST} + {1538843400 37800 1 ACDT} + {1554568200 34200 0 ACST} + {1570293000 37800 1 ACDT} + {1586017800 34200 0 ACST} + {1601742600 37800 1 ACDT} + {1617467400 34200 0 ACST} + {1633192200 37800 1 ACDT} + {1648917000 34200 0 ACST} + {1664641800 37800 1 ACDT} + {1680366600 34200 0 ACST} + {1696091400 37800 1 ACDT} + {1712421000 34200 0 ACST} + {1728145800 37800 1 ACDT} + {1743870600 34200 0 ACST} + {1759595400 37800 1 ACDT} + {1775320200 34200 0 ACST} + {1791045000 37800 1 ACDT} + {1806769800 34200 0 ACST} + {1822494600 37800 1 ACDT} + {1838219400 34200 0 ACST} + {1853944200 37800 1 ACDT} + {1869669000 34200 0 ACST} + {1885998600 37800 1 ACDT} + {1901723400 34200 0 ACST} + {1917448200 37800 1 ACDT} + {1933173000 34200 0 ACST} + {1948897800 37800 1 ACDT} + {1964622600 34200 0 ACST} + {1980347400 37800 1 ACDT} + {1996072200 34200 0 ACST} + {2011797000 37800 1 ACDT} + {2027521800 34200 0 ACST} + {2043246600 37800 1 ACDT} + {2058971400 34200 0 ACST} + {2075301000 37800 1 ACDT} + {2091025800 34200 0 ACST} + {2106750600 37800 1 ACDT} + {2122475400 34200 0 ACST} + {2138200200 37800 1 ACDT} + {2153925000 34200 0 ACST} + {2169649800 37800 1 ACDT} + {2185374600 34200 0 ACST} + {2201099400 37800 1 ACDT} + {2216824200 34200 0 ACST} + {2233153800 37800 1 ACDT} + {2248878600 34200 0 ACST} + {2264603400 37800 1 ACDT} + {2280328200 34200 0 ACST} + {2296053000 37800 1 ACDT} + {2311777800 34200 0 ACST} + {2327502600 37800 1 ACDT} + {2343227400 34200 0 ACST} + {2358952200 37800 1 ACDT} + {2374677000 34200 0 ACST} + {2390401800 37800 1 ACDT} + {2406126600 34200 0 ACST} + {2422456200 37800 1 ACDT} + {2438181000 34200 0 ACST} + {2453905800 37800 1 ACDT} + {2469630600 34200 0 ACST} + {2485355400 37800 1 ACDT} + {2501080200 34200 0 ACST} + {2516805000 37800 1 ACDT} + {2532529800 34200 0 ACST} + {2548254600 37800 1 ACDT} + {2563979400 34200 0 ACST} + {2579704200 37800 1 ACDT} + {2596033800 34200 0 ACST} + {2611758600 37800 1 ACDT} + {2627483400 34200 0 ACST} + {2643208200 37800 1 ACDT} + {2658933000 34200 0 ACST} + {2674657800 37800 1 ACDT} + {2690382600 34200 0 ACST} + {2706107400 37800 1 ACDT} + {2721832200 34200 0 ACST} + {2737557000 37800 1 ACDT} + {2753281800 34200 0 ACST} + {2769611400 37800 1 ACDT} + {2785336200 34200 0 ACST} + {2801061000 37800 1 ACDT} + {2816785800 34200 0 ACST} + {2832510600 37800 1 ACDT} + {2848235400 34200 0 ACST} + {2863960200 37800 1 ACDT} + {2879685000 34200 0 ACST} + {2895409800 37800 1 ACDT} + {2911134600 34200 0 ACST} + {2926859400 37800 1 ACDT} + {2942584200 34200 0 ACST} + {2958913800 37800 1 ACDT} + {2974638600 34200 0 ACST} + {2990363400 37800 1 ACDT} + {3006088200 34200 0 ACST} + {3021813000 37800 1 ACDT} + {3037537800 34200 0 ACST} + {3053262600 37800 1 ACDT} + {3068987400 34200 0 ACST} + {3084712200 37800 1 ACDT} + {3100437000 34200 0 ACST} + {3116766600 37800 1 ACDT} + {3132491400 34200 0 ACST} + {3148216200 37800 1 ACDT} + {3163941000 34200 0 ACST} + {3179665800 37800 1 ACDT} + {3195390600 34200 0 ACST} + {3211115400 37800 1 ACDT} + {3226840200 34200 0 ACST} + {3242565000 37800 1 ACDT} + {3258289800 34200 0 ACST} + {3274014600 37800 1 ACDT} + {3289739400 34200 0 ACST} + {3306069000 37800 1 ACDT} + {3321793800 34200 0 ACST} + {3337518600 37800 1 ACDT} + {3353243400 34200 0 ACST} + {3368968200 37800 1 ACDT} + {3384693000 34200 0 ACST} + {3400417800 37800 1 ACDT} + {3416142600 34200 0 ACST} + {3431867400 37800 1 ACDT} + {3447592200 34200 0 ACST} + {3463317000 37800 1 ACDT} + {3479646600 34200 0 ACST} + {3495371400 37800 1 ACDT} + {3511096200 34200 0 ACST} + {3526821000 37800 1 ACDT} + {3542545800 34200 0 ACST} + {3558270600 37800 1 ACDT} + {3573995400 34200 0 ACST} + {3589720200 37800 1 ACDT} + {3605445000 34200 0 ACST} + {3621169800 37800 1 ACDT} + {3636894600 34200 0 ACST} + {3653224200 37800 1 ACDT} + {3668949000 34200 0 ACST} + {3684673800 37800 1 ACDT} + {3700398600 34200 0 ACST} + {3716123400 37800 1 ACDT} + {3731848200 34200 0 ACST} + {3747573000 37800 1 ACDT} + {3763297800 34200 0 ACST} + {3779022600 37800 1 ACDT} + {3794747400 34200 0 ACST} + {3810472200 37800 1 ACDT} + {3826197000 34200 0 ACST} + {3842526600 37800 1 ACDT} + {3858251400 34200 0 ACST} + {3873976200 37800 1 ACDT} + {3889701000 34200 0 ACST} + {3905425800 37800 1 ACDT} + {3921150600 34200 0 ACST} + {3936875400 37800 1 ACDT} + {3952600200 34200 0 ACST} + {3968325000 37800 1 ACDT} + {3984049800 34200 0 ACST} + {4000379400 37800 1 ACDT} + {4016104200 34200 0 ACST} + {4031829000 37800 1 ACDT} + {4047553800 34200 0 ACST} + {4063278600 37800 1 ACDT} + {4079003400 34200 0 ACST} + {4094728200 37800 1 ACDT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Currie b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Currie new file mode 100644 index 00000000..3315aa34 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Currie @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Hobart)]} { + LoadTimeZoneFile Australia/Hobart +} +set TZData(:Australia/Currie) $TZData(:Australia/Hobart) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Darwin b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Darwin new file mode 100644 index 00000000..13f13ee2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Darwin @@ -0,0 +1,15 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Darwin) { + {-9223372036854775808 31400 0 LMT} + {-2364108200 32400 0 ACST} + {-2230189200 34200 0 ACST} + {-1672558200 37800 1 ACDT} + {-1665387000 34200 0 ACST} + {-883639800 37800 1 ACDT} + {-876123000 34200 0 ACST} + {-860398200 37800 1 ACDT} + {-844673400 34200 0 ACST} + {-828343800 37800 1 ACDT} + {-813223800 34200 0 ACST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Hobart b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Hobart new file mode 100644 index 00000000..5ff675e3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Hobart @@ -0,0 +1,285 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Hobart) { + {-9223372036854775808 35356 0 LMT} + {-2345795356 36000 0 AEST} + {-1680508800 39600 1 AEDT} + {-1665388800 36000 0 AEST} + {-1646640000 39600 1 AEDT} + {-1635753600 36000 0 AEST} + {-1615190400 39600 1 AEDT} + {-1604304000 36000 0 AEST} + {-1583920800 36000 0 AEST} + {-883641600 39600 1 AEDT} + {-876124800 36000 0 AEST} + {-860400000 39600 1 AEDT} + {-844675200 36000 0 AEST} + {-828345600 39600 1 AEDT} + {-813225600 36000 0 AEST} + {-94730400 36000 0 AEST} + {-71136000 39600 1 AEDT} + {-55411200 36000 0 AEST} + {-37267200 39600 1 AEDT} + {-25776000 36000 0 AEST} + {-5817600 39600 1 AEDT} + {5673600 36000 0 AEST} + {25632000 39600 1 AEDT} + {37728000 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {89136000 39600 1 AEDT} + {100022400 36000 0 AEST} + {120585600 39600 1 AEDT} + {131472000 36000 0 AEST} + {152035200 39600 1 AEDT} + {162921600 36000 0 AEST} + {183484800 39600 1 AEDT} + {194976000 36000 0 AEST} + {215539200 39600 1 AEDT} + {226425600 36000 0 AEST} + {246988800 39600 1 AEDT} + {257875200 36000 0 AEST} + {278438400 39600 1 AEDT} + {289324800 36000 0 AEST} + {309888000 39600 1 AEDT} + {320774400 36000 0 AEST} + {341337600 39600 1 AEDT} + {352224000 36000 0 AEST} + {372787200 39600 1 AEDT} + {386092800 36000 0 AEST} + {404841600 39600 1 AEDT} + {417542400 36000 0 AEST} + {436291200 39600 1 AEDT} + {447177600 36000 0 AEST} + {467740800 39600 1 AEDT} + {478627200 36000 0 AEST} + {499190400 39600 1 AEDT} + {510076800 36000 0 AEST} + {530035200 39600 1 AEDT} + {542736000 36000 0 AEST} + {562089600 39600 1 AEDT} + {574790400 36000 0 AEST} + {594144000 39600 1 AEDT} + {606240000 36000 0 AEST} + {625593600 39600 1 AEDT} + {637689600 36000 0 AEST} + {657043200 39600 1 AEDT} + {670348800 36000 0 AEST} + {686678400 39600 1 AEDT} + {701798400 36000 0 AEST} + {718128000 39600 1 AEDT} + {733248000 36000 0 AEST} + {749577600 39600 1 AEDT} + {764697600 36000 0 AEST} + {781027200 39600 1 AEDT} + {796147200 36000 0 AEST} + {812476800 39600 1 AEDT} + {828201600 36000 0 AEST} + {844531200 39600 1 AEDT} + {859651200 36000 0 AEST} + {875980800 39600 1 AEDT} + {891100800 36000 0 AEST} + {907430400 39600 1 AEDT} + {922550400 36000 0 AEST} + {938880000 39600 1 AEDT} + {954000000 36000 0 AEST} + {967305600 39600 1 AEDT} + {985449600 36000 0 AEST} + {1002384000 39600 1 AEDT} + {1017504000 36000 0 AEST} + {1033833600 39600 1 AEDT} + {1048953600 36000 0 AEST} + {1065283200 39600 1 AEDT} + {1080403200 36000 0 AEST} + {1096732800 39600 1 AEDT} + {1111852800 36000 0 AEST} + {1128182400 39600 1 AEDT} + {1143907200 36000 0 AEST} + {1159632000 39600 1 AEDT} + {1174752000 36000 0 AEST} + {1191686400 39600 1 AEDT} + {1207411200 36000 0 AEST} + {1223136000 39600 1 AEDT} + {1238860800 36000 0 AEST} + {1254585600 39600 1 AEDT} + {1270310400 36000 0 AEST} + {1286035200 39600 1 AEDT} + {1301760000 36000 0 AEST} + {1317484800 39600 1 AEDT} + {1333209600 36000 0 AEST} + {1349539200 39600 1 AEDT} + {1365264000 36000 0 AEST} + {1380988800 39600 1 AEDT} + {1396713600 36000 0 AEST} + {1412438400 39600 1 AEDT} + {1428163200 36000 0 AEST} + {1443888000 39600 1 AEDT} + {1459612800 36000 0 AEST} + {1475337600 39600 1 AEDT} + {1491062400 36000 0 AEST} + {1506787200 39600 1 AEDT} + {1522512000 36000 0 AEST} + {1538841600 39600 1 AEDT} + {1554566400 36000 0 AEST} + {1570291200 39600 1 AEDT} + {1586016000 36000 0 AEST} + {1601740800 39600 1 AEDT} + {1617465600 36000 0 AEST} + {1633190400 39600 1 AEDT} + {1648915200 36000 0 AEST} + {1664640000 39600 1 AEDT} + {1680364800 36000 0 AEST} + {1696089600 39600 1 AEDT} + {1712419200 36000 0 AEST} + {1728144000 39600 1 AEDT} + {1743868800 36000 0 AEST} + {1759593600 39600 1 AEDT} + {1775318400 36000 0 AEST} + {1791043200 39600 1 AEDT} + {1806768000 36000 0 AEST} + {1822492800 39600 1 AEDT} + {1838217600 36000 0 AEST} + {1853942400 39600 1 AEDT} + {1869667200 36000 0 AEST} + {1885996800 39600 1 AEDT} + {1901721600 36000 0 AEST} + {1917446400 39600 1 AEDT} + {1933171200 36000 0 AEST} + {1948896000 39600 1 AEDT} + {1964620800 36000 0 AEST} + {1980345600 39600 1 AEDT} + {1996070400 36000 0 AEST} + {2011795200 39600 1 AEDT} + {2027520000 36000 0 AEST} + {2043244800 39600 1 AEDT} + {2058969600 36000 0 AEST} + {2075299200 39600 1 AEDT} + {2091024000 36000 0 AEST} + {2106748800 39600 1 AEDT} + {2122473600 36000 0 AEST} + {2138198400 39600 1 AEDT} + {2153923200 36000 0 AEST} + {2169648000 39600 1 AEDT} + {2185372800 36000 0 AEST} + {2201097600 39600 1 AEDT} + {2216822400 36000 0 AEST} + {2233152000 39600 1 AEDT} + {2248876800 36000 0 AEST} + {2264601600 39600 1 AEDT} + {2280326400 36000 0 AEST} + {2296051200 39600 1 AEDT} + {2311776000 36000 0 AEST} + {2327500800 39600 1 AEDT} + {2343225600 36000 0 AEST} + {2358950400 39600 1 AEDT} + {2374675200 36000 0 AEST} + {2390400000 39600 1 AEDT} + {2406124800 36000 0 AEST} + {2422454400 39600 1 AEDT} + {2438179200 36000 0 AEST} + {2453904000 39600 1 AEDT} + {2469628800 36000 0 AEST} + {2485353600 39600 1 AEDT} + {2501078400 36000 0 AEST} + {2516803200 39600 1 AEDT} + {2532528000 36000 0 AEST} + {2548252800 39600 1 AEDT} + {2563977600 36000 0 AEST} + {2579702400 39600 1 AEDT} + {2596032000 36000 0 AEST} + {2611756800 39600 1 AEDT} + {2627481600 36000 0 AEST} + {2643206400 39600 1 AEDT} + {2658931200 36000 0 AEST} + {2674656000 39600 1 AEDT} + {2690380800 36000 0 AEST} + {2706105600 39600 1 AEDT} + {2721830400 36000 0 AEST} + {2737555200 39600 1 AEDT} + {2753280000 36000 0 AEST} + {2769609600 39600 1 AEDT} + {2785334400 36000 0 AEST} + {2801059200 39600 1 AEDT} + {2816784000 36000 0 AEST} + {2832508800 39600 1 AEDT} + {2848233600 36000 0 AEST} + {2863958400 39600 1 AEDT} + {2879683200 36000 0 AEST} + {2895408000 39600 1 AEDT} + {2911132800 36000 0 AEST} + {2926857600 39600 1 AEDT} + {2942582400 36000 0 AEST} + {2958912000 39600 1 AEDT} + {2974636800 36000 0 AEST} + {2990361600 39600 1 AEDT} + {3006086400 36000 0 AEST} + {3021811200 39600 1 AEDT} + {3037536000 36000 0 AEST} + {3053260800 39600 1 AEDT} + {3068985600 36000 0 AEST} + {3084710400 39600 1 AEDT} + {3100435200 36000 0 AEST} + {3116764800 39600 1 AEDT} + {3132489600 36000 0 AEST} + {3148214400 39600 1 AEDT} + {3163939200 36000 0 AEST} + {3179664000 39600 1 AEDT} + {3195388800 36000 0 AEST} + {3211113600 39600 1 AEDT} + {3226838400 36000 0 AEST} + {3242563200 39600 1 AEDT} + {3258288000 36000 0 AEST} + {3274012800 39600 1 AEDT} + {3289737600 36000 0 AEST} + {3306067200 39600 1 AEDT} + {3321792000 36000 0 AEST} + {3337516800 39600 1 AEDT} + {3353241600 36000 0 AEST} + {3368966400 39600 1 AEDT} + {3384691200 36000 0 AEST} + {3400416000 39600 1 AEDT} + {3416140800 36000 0 AEST} + {3431865600 39600 1 AEDT} + {3447590400 36000 0 AEST} + {3463315200 39600 1 AEDT} + {3479644800 36000 0 AEST} + {3495369600 39600 1 AEDT} + {3511094400 36000 0 AEST} + {3526819200 39600 1 AEDT} + {3542544000 36000 0 AEST} + {3558268800 39600 1 AEDT} + {3573993600 36000 0 AEST} + {3589718400 39600 1 AEDT} + {3605443200 36000 0 AEST} + {3621168000 39600 1 AEDT} + {3636892800 36000 0 AEST} + {3653222400 39600 1 AEDT} + {3668947200 36000 0 AEST} + {3684672000 39600 1 AEDT} + {3700396800 36000 0 AEST} + {3716121600 39600 1 AEDT} + {3731846400 36000 0 AEST} + {3747571200 39600 1 AEDT} + {3763296000 36000 0 AEST} + {3779020800 39600 1 AEDT} + {3794745600 36000 0 AEST} + {3810470400 39600 1 AEDT} + {3826195200 36000 0 AEST} + {3842524800 39600 1 AEDT} + {3858249600 36000 0 AEST} + {3873974400 39600 1 AEDT} + {3889699200 36000 0 AEST} + {3905424000 39600 1 AEDT} + {3921148800 36000 0 AEST} + {3936873600 39600 1 AEDT} + {3952598400 36000 0 AEST} + {3968323200 39600 1 AEDT} + {3984048000 36000 0 AEST} + {4000377600 39600 1 AEDT} + {4016102400 36000 0 AEST} + {4031827200 39600 1 AEDT} + {4047552000 36000 0 AEST} + {4063276800 39600 1 AEDT} + {4079001600 36000 0 AEST} + {4094726400 39600 1 AEDT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/LHI b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/LHI new file mode 100644 index 00000000..ddc79ce3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/LHI @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Lord_Howe)]} { + LoadTimeZoneFile Australia/Lord_Howe +} +set TZData(:Australia/LHI) $TZData(:Australia/Lord_Howe) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Lindeman b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Lindeman new file mode 100644 index 00000000..1be69628 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Lindeman @@ -0,0 +1,28 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Lindeman) { + {-9223372036854775808 35756 0 LMT} + {-2366790956 36000 0 AEST} + {-1672560000 39600 1 AEDT} + {-1665388800 36000 0 AEST} + {-883641600 39600 1 AEDT} + {-876124800 36000 0 AEST} + {-860400000 39600 1 AEDT} + {-844675200 36000 0 AEST} + {-828345600 39600 1 AEDT} + {-813225600 36000 0 AEST} + {31500000 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {625593600 39600 1 AEDT} + {636480000 36000 0 AEST} + {657043200 39600 1 AEDT} + {667929600 36000 0 AEST} + {688492800 39600 1 AEDT} + {699379200 36000 0 AEST} + {709912800 36000 0 AEST} + {719942400 39600 1 AEDT} + {731433600 36000 0 AEST} + {751996800 39600 1 AEDT} + {762883200 36000 0 AEST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Lord_Howe b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Lord_Howe new file mode 100644 index 00000000..c595967f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Lord_Howe @@ -0,0 +1,245 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Lord_Howe) { + {-9223372036854775808 38180 0 LMT} + {-2364114980 36000 0 AEST} + {352216800 37800 0 +1030} + {372785400 41400 1 +1030} + {384273000 37800 0 +1030} + {404839800 41400 1 +1030} + {415722600 37800 0 +1030} + {436289400 41400 1 +1030} + {447172200 37800 0 +1030} + {467739000 41400 1 +1030} + {478621800 37800 0 +1030} + {488984400 37800 0 +1030} + {499188600 39600 1 +1030} + {511282800 37800 0 +1030} + {530033400 39600 1 +1030} + {542732400 37800 0 +1030} + {562087800 39600 1 +1030} + {574786800 37800 0 +1030} + {594142200 39600 1 +1030} + {606236400 37800 0 +1030} + {625591800 39600 1 +1030} + {636476400 37800 0 +1030} + {657041400 39600 1 +1030} + {667926000 37800 0 +1030} + {688491000 39600 1 +1030} + {699375600 37800 0 +1030} + {719940600 39600 1 +1030} + {731430000 37800 0 +1030} + {751995000 39600 1 +1030} + {762879600 37800 0 +1030} + {783444600 39600 1 +1030} + {794329200 37800 0 +1030} + {814894200 39600 1 +1030} + {828198000 37800 0 +1030} + {846343800 39600 1 +1030} + {859647600 37800 0 +1030} + {877793400 39600 1 +1030} + {891097200 37800 0 +1030} + {909243000 39600 1 +1030} + {922546800 37800 0 +1030} + {941297400 39600 1 +1030} + {953996400 37800 0 +1030} + {967303800 39600 1 +1030} + {985446000 37800 0 +1030} + {1004196600 39600 1 +1030} + {1017500400 37800 0 +1030} + {1035646200 39600 1 +1030} + {1048950000 37800 0 +1030} + {1067095800 39600 1 +1030} + {1080399600 37800 0 +1030} + {1099150200 39600 1 +1030} + {1111849200 37800 0 +1030} + {1130599800 39600 1 +1030} + {1143903600 37800 0 +1030} + {1162049400 39600 1 +1030} + {1174748400 37800 0 +1030} + {1193499000 39600 1 +1030} + {1207407600 37800 0 +1030} + {1223134200 39600 1 +1030} + {1238857200 37800 0 +1030} + {1254583800 39600 1 +1030} + {1270306800 37800 0 +1030} + {1286033400 39600 1 +1030} + {1301756400 37800 0 +1030} + {1317483000 39600 1 +1030} + {1333206000 37800 0 +1030} + {1349537400 39600 1 +1030} + {1365260400 37800 0 +1030} + {1380987000 39600 1 +1030} + {1396710000 37800 0 +1030} + {1412436600 39600 1 +1030} + {1428159600 37800 0 +1030} + {1443886200 39600 1 +1030} + {1459609200 37800 0 +1030} + {1475335800 39600 1 +1030} + {1491058800 37800 0 +1030} + {1506785400 39600 1 +1030} + {1522508400 37800 0 +1030} + {1538839800 39600 1 +1030} + {1554562800 37800 0 +1030} + {1570289400 39600 1 +1030} + {1586012400 37800 0 +1030} + {1601739000 39600 1 +1030} + {1617462000 37800 0 +1030} + {1633188600 39600 1 +1030} + {1648911600 37800 0 +1030} + {1664638200 39600 1 +1030} + {1680361200 37800 0 +1030} + {1696087800 39600 1 +1030} + {1712415600 37800 0 +1030} + {1728142200 39600 1 +1030} + {1743865200 37800 0 +1030} + {1759591800 39600 1 +1030} + {1775314800 37800 0 +1030} + {1791041400 39600 1 +1030} + {1806764400 37800 0 +1030} + {1822491000 39600 1 +1030} + {1838214000 37800 0 +1030} + {1853940600 39600 1 +1030} + {1869663600 37800 0 +1030} + {1885995000 39600 1 +1030} + {1901718000 37800 0 +1030} + {1917444600 39600 1 +1030} + {1933167600 37800 0 +1030} + {1948894200 39600 1 +1030} + {1964617200 37800 0 +1030} + {1980343800 39600 1 +1030} + {1996066800 37800 0 +1030} + {2011793400 39600 1 +1030} + {2027516400 37800 0 +1030} + {2043243000 39600 1 +1030} + {2058966000 37800 0 +1030} + {2075297400 39600 1 +1030} + {2091020400 37800 0 +1030} + {2106747000 39600 1 +1030} + {2122470000 37800 0 +1030} + {2138196600 39600 1 +1030} + {2153919600 37800 0 +1030} + {2169646200 39600 1 +1030} + {2185369200 37800 0 +1030} + {2201095800 39600 1 +1030} + {2216818800 37800 0 +1030} + {2233150200 39600 1 +1030} + {2248873200 37800 0 +1030} + {2264599800 39600 1 +1030} + {2280322800 37800 0 +1030} + {2296049400 39600 1 +1030} + {2311772400 37800 0 +1030} + {2327499000 39600 1 +1030} + {2343222000 37800 0 +1030} + {2358948600 39600 1 +1030} + {2374671600 37800 0 +1030} + {2390398200 39600 1 +1030} + {2406121200 37800 0 +1030} + {2422452600 39600 1 +1030} + {2438175600 37800 0 +1030} + {2453902200 39600 1 +1030} + {2469625200 37800 0 +1030} + {2485351800 39600 1 +1030} + {2501074800 37800 0 +1030} + {2516801400 39600 1 +1030} + {2532524400 37800 0 +1030} + {2548251000 39600 1 +1030} + {2563974000 37800 0 +1030} + {2579700600 39600 1 +1030} + {2596028400 37800 0 +1030} + {2611755000 39600 1 +1030} + {2627478000 37800 0 +1030} + {2643204600 39600 1 +1030} + {2658927600 37800 0 +1030} + {2674654200 39600 1 +1030} + {2690377200 37800 0 +1030} + {2706103800 39600 1 +1030} + {2721826800 37800 0 +1030} + {2737553400 39600 1 +1030} + {2753276400 37800 0 +1030} + {2769607800 39600 1 +1030} + {2785330800 37800 0 +1030} + {2801057400 39600 1 +1030} + {2816780400 37800 0 +1030} + {2832507000 39600 1 +1030} + {2848230000 37800 0 +1030} + {2863956600 39600 1 +1030} + {2879679600 37800 0 +1030} + {2895406200 39600 1 +1030} + {2911129200 37800 0 +1030} + {2926855800 39600 1 +1030} + {2942578800 37800 0 +1030} + {2958910200 39600 1 +1030} + {2974633200 37800 0 +1030} + {2990359800 39600 1 +1030} + {3006082800 37800 0 +1030} + {3021809400 39600 1 +1030} + {3037532400 37800 0 +1030} + {3053259000 39600 1 +1030} + {3068982000 37800 0 +1030} + {3084708600 39600 1 +1030} + {3100431600 37800 0 +1030} + {3116763000 39600 1 +1030} + {3132486000 37800 0 +1030} + {3148212600 39600 1 +1030} + {3163935600 37800 0 +1030} + {3179662200 39600 1 +1030} + {3195385200 37800 0 +1030} + {3211111800 39600 1 +1030} + {3226834800 37800 0 +1030} + {3242561400 39600 1 +1030} + {3258284400 37800 0 +1030} + {3274011000 39600 1 +1030} + {3289734000 37800 0 +1030} + {3306065400 39600 1 +1030} + {3321788400 37800 0 +1030} + {3337515000 39600 1 +1030} + {3353238000 37800 0 +1030} + {3368964600 39600 1 +1030} + {3384687600 37800 0 +1030} + {3400414200 39600 1 +1030} + {3416137200 37800 0 +1030} + {3431863800 39600 1 +1030} + {3447586800 37800 0 +1030} + {3463313400 39600 1 +1030} + {3479641200 37800 0 +1030} + {3495367800 39600 1 +1030} + {3511090800 37800 0 +1030} + {3526817400 39600 1 +1030} + {3542540400 37800 0 +1030} + {3558267000 39600 1 +1030} + {3573990000 37800 0 +1030} + {3589716600 39600 1 +1030} + {3605439600 37800 0 +1030} + {3621166200 39600 1 +1030} + {3636889200 37800 0 +1030} + {3653220600 39600 1 +1030} + {3668943600 37800 0 +1030} + {3684670200 39600 1 +1030} + {3700393200 37800 0 +1030} + {3716119800 39600 1 +1030} + {3731842800 37800 0 +1030} + {3747569400 39600 1 +1030} + {3763292400 37800 0 +1030} + {3779019000 39600 1 +1030} + {3794742000 37800 0 +1030} + {3810468600 39600 1 +1030} + {3826191600 37800 0 +1030} + {3842523000 39600 1 +1030} + {3858246000 37800 0 +1030} + {3873972600 39600 1 +1030} + {3889695600 37800 0 +1030} + {3905422200 39600 1 +1030} + {3921145200 37800 0 +1030} + {3936871800 39600 1 +1030} + {3952594800 37800 0 +1030} + {3968321400 39600 1 +1030} + {3984044400 37800 0 +1030} + {4000375800 39600 1 +1030} + {4016098800 37800 0 +1030} + {4031825400 39600 1 +1030} + {4047548400 37800 0 +1030} + {4063275000 39600 1 +1030} + {4078998000 37800 0 +1030} + {4094724600 39600 1 +1030} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Melbourne b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Melbourne new file mode 100644 index 00000000..77e9067f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Melbourne @@ -0,0 +1,272 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Melbourne) { + {-9223372036854775808 34792 0 LMT} + {-2364111592 36000 0 AEST} + {-1672560000 39600 1 AEDT} + {-1665388800 36000 0 AEST} + {-883641600 39600 1 AEDT} + {-876124800 36000 0 AEST} + {-860400000 39600 1 AEDT} + {-844675200 36000 0 AEST} + {-828345600 39600 1 AEDT} + {-813225600 36000 0 AEST} + {31500000 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {89136000 39600 1 AEDT} + {100022400 36000 0 AEST} + {120585600 39600 1 AEDT} + {131472000 36000 0 AEST} + {152035200 39600 1 AEDT} + {162921600 36000 0 AEST} + {183484800 39600 1 AEDT} + {194976000 36000 0 AEST} + {215539200 39600 1 AEDT} + {226425600 36000 0 AEST} + {246988800 39600 1 AEDT} + {257875200 36000 0 AEST} + {278438400 39600 1 AEDT} + {289324800 36000 0 AEST} + {309888000 39600 1 AEDT} + {320774400 36000 0 AEST} + {341337600 39600 1 AEDT} + {352224000 36000 0 AEST} + {372787200 39600 1 AEDT} + {384278400 36000 0 AEST} + {404841600 39600 1 AEDT} + {415728000 36000 0 AEST} + {436291200 39600 1 AEDT} + {447177600 36000 0 AEST} + {467740800 39600 1 AEDT} + {478627200 36000 0 AEST} + {499190400 39600 1 AEDT} + {511286400 36000 0 AEST} + {530035200 39600 1 AEDT} + {542736000 36000 0 AEST} + {561484800 39600 1 AEDT} + {574790400 36000 0 AEST} + {594144000 39600 1 AEDT} + {606240000 36000 0 AEST} + {625593600 39600 1 AEDT} + {637689600 36000 0 AEST} + {657043200 39600 1 AEDT} + {667929600 36000 0 AEST} + {688492800 39600 1 AEDT} + {699379200 36000 0 AEST} + {719942400 39600 1 AEDT} + {731433600 36000 0 AEST} + {751996800 39600 1 AEDT} + {762883200 36000 0 AEST} + {783446400 39600 1 AEDT} + {796147200 36000 0 AEST} + {814896000 39600 1 AEDT} + {828201600 36000 0 AEST} + {846345600 39600 1 AEDT} + {859651200 36000 0 AEST} + {877795200 39600 1 AEDT} + {891100800 36000 0 AEST} + {909244800 39600 1 AEDT} + {922550400 36000 0 AEST} + {941299200 39600 1 AEDT} + {954000000 36000 0 AEST} + {967305600 39600 1 AEDT} + {985449600 36000 0 AEST} + {1004198400 39600 1 AEDT} + {1017504000 36000 0 AEST} + {1035648000 39600 1 AEDT} + {1048953600 36000 0 AEST} + {1067097600 39600 1 AEDT} + {1080403200 36000 0 AEST} + {1099152000 39600 1 AEDT} + {1111852800 36000 0 AEST} + {1130601600 39600 1 AEDT} + {1143907200 36000 0 AEST} + {1162051200 39600 1 AEDT} + {1174752000 36000 0 AEST} + {1193500800 39600 1 AEDT} + {1207411200 36000 0 AEST} + {1223136000 39600 1 AEDT} + {1238860800 36000 0 AEST} + {1254585600 39600 1 AEDT} + {1270310400 36000 0 AEST} + {1286035200 39600 1 AEDT} + {1301760000 36000 0 AEST} + {1317484800 39600 1 AEDT} + {1333209600 36000 0 AEST} + {1349539200 39600 1 AEDT} + {1365264000 36000 0 AEST} + {1380988800 39600 1 AEDT} + {1396713600 36000 0 AEST} + {1412438400 39600 1 AEDT} + {1428163200 36000 0 AEST} + {1443888000 39600 1 AEDT} + {1459612800 36000 0 AEST} + {1475337600 39600 1 AEDT} + {1491062400 36000 0 AEST} + {1506787200 39600 1 AEDT} + {1522512000 36000 0 AEST} + {1538841600 39600 1 AEDT} + {1554566400 36000 0 AEST} + {1570291200 39600 1 AEDT} + {1586016000 36000 0 AEST} + {1601740800 39600 1 AEDT} + {1617465600 36000 0 AEST} + {1633190400 39600 1 AEDT} + {1648915200 36000 0 AEST} + {1664640000 39600 1 AEDT} + {1680364800 36000 0 AEST} + {1696089600 39600 1 AEDT} + {1712419200 36000 0 AEST} + {1728144000 39600 1 AEDT} + {1743868800 36000 0 AEST} + {1759593600 39600 1 AEDT} + {1775318400 36000 0 AEST} + {1791043200 39600 1 AEDT} + {1806768000 36000 0 AEST} + {1822492800 39600 1 AEDT} + {1838217600 36000 0 AEST} + {1853942400 39600 1 AEDT} + {1869667200 36000 0 AEST} + {1885996800 39600 1 AEDT} + {1901721600 36000 0 AEST} + {1917446400 39600 1 AEDT} + {1933171200 36000 0 AEST} + {1948896000 39600 1 AEDT} + {1964620800 36000 0 AEST} + {1980345600 39600 1 AEDT} + {1996070400 36000 0 AEST} + {2011795200 39600 1 AEDT} + {2027520000 36000 0 AEST} + {2043244800 39600 1 AEDT} + {2058969600 36000 0 AEST} + {2075299200 39600 1 AEDT} + {2091024000 36000 0 AEST} + {2106748800 39600 1 AEDT} + {2122473600 36000 0 AEST} + {2138198400 39600 1 AEDT} + {2153923200 36000 0 AEST} + {2169648000 39600 1 AEDT} + {2185372800 36000 0 AEST} + {2201097600 39600 1 AEDT} + {2216822400 36000 0 AEST} + {2233152000 39600 1 AEDT} + {2248876800 36000 0 AEST} + {2264601600 39600 1 AEDT} + {2280326400 36000 0 AEST} + {2296051200 39600 1 AEDT} + {2311776000 36000 0 AEST} + {2327500800 39600 1 AEDT} + {2343225600 36000 0 AEST} + {2358950400 39600 1 AEDT} + {2374675200 36000 0 AEST} + {2390400000 39600 1 AEDT} + {2406124800 36000 0 AEST} + {2422454400 39600 1 AEDT} + {2438179200 36000 0 AEST} + {2453904000 39600 1 AEDT} + {2469628800 36000 0 AEST} + {2485353600 39600 1 AEDT} + {2501078400 36000 0 AEST} + {2516803200 39600 1 AEDT} + {2532528000 36000 0 AEST} + {2548252800 39600 1 AEDT} + {2563977600 36000 0 AEST} + {2579702400 39600 1 AEDT} + {2596032000 36000 0 AEST} + {2611756800 39600 1 AEDT} + {2627481600 36000 0 AEST} + {2643206400 39600 1 AEDT} + {2658931200 36000 0 AEST} + {2674656000 39600 1 AEDT} + {2690380800 36000 0 AEST} + {2706105600 39600 1 AEDT} + {2721830400 36000 0 AEST} + {2737555200 39600 1 AEDT} + {2753280000 36000 0 AEST} + {2769609600 39600 1 AEDT} + {2785334400 36000 0 AEST} + {2801059200 39600 1 AEDT} + {2816784000 36000 0 AEST} + {2832508800 39600 1 AEDT} + {2848233600 36000 0 AEST} + {2863958400 39600 1 AEDT} + {2879683200 36000 0 AEST} + {2895408000 39600 1 AEDT} + {2911132800 36000 0 AEST} + {2926857600 39600 1 AEDT} + {2942582400 36000 0 AEST} + {2958912000 39600 1 AEDT} + {2974636800 36000 0 AEST} + {2990361600 39600 1 AEDT} + {3006086400 36000 0 AEST} + {3021811200 39600 1 AEDT} + {3037536000 36000 0 AEST} + {3053260800 39600 1 AEDT} + {3068985600 36000 0 AEST} + {3084710400 39600 1 AEDT} + {3100435200 36000 0 AEST} + {3116764800 39600 1 AEDT} + {3132489600 36000 0 AEST} + {3148214400 39600 1 AEDT} + {3163939200 36000 0 AEST} + {3179664000 39600 1 AEDT} + {3195388800 36000 0 AEST} + {3211113600 39600 1 AEDT} + {3226838400 36000 0 AEST} + {3242563200 39600 1 AEDT} + {3258288000 36000 0 AEST} + {3274012800 39600 1 AEDT} + {3289737600 36000 0 AEST} + {3306067200 39600 1 AEDT} + {3321792000 36000 0 AEST} + {3337516800 39600 1 AEDT} + {3353241600 36000 0 AEST} + {3368966400 39600 1 AEDT} + {3384691200 36000 0 AEST} + {3400416000 39600 1 AEDT} + {3416140800 36000 0 AEST} + {3431865600 39600 1 AEDT} + {3447590400 36000 0 AEST} + {3463315200 39600 1 AEDT} + {3479644800 36000 0 AEST} + {3495369600 39600 1 AEDT} + {3511094400 36000 0 AEST} + {3526819200 39600 1 AEDT} + {3542544000 36000 0 AEST} + {3558268800 39600 1 AEDT} + {3573993600 36000 0 AEST} + {3589718400 39600 1 AEDT} + {3605443200 36000 0 AEST} + {3621168000 39600 1 AEDT} + {3636892800 36000 0 AEST} + {3653222400 39600 1 AEDT} + {3668947200 36000 0 AEST} + {3684672000 39600 1 AEDT} + {3700396800 36000 0 AEST} + {3716121600 39600 1 AEDT} + {3731846400 36000 0 AEST} + {3747571200 39600 1 AEDT} + {3763296000 36000 0 AEST} + {3779020800 39600 1 AEDT} + {3794745600 36000 0 AEST} + {3810470400 39600 1 AEDT} + {3826195200 36000 0 AEST} + {3842524800 39600 1 AEDT} + {3858249600 36000 0 AEST} + {3873974400 39600 1 AEDT} + {3889699200 36000 0 AEST} + {3905424000 39600 1 AEDT} + {3921148800 36000 0 AEST} + {3936873600 39600 1 AEDT} + {3952598400 36000 0 AEST} + {3968323200 39600 1 AEDT} + {3984048000 36000 0 AEST} + {4000377600 39600 1 AEDT} + {4016102400 36000 0 AEST} + {4031827200 39600 1 AEDT} + {4047552000 36000 0 AEST} + {4063276800 39600 1 AEDT} + {4079001600 36000 0 AEST} + {4094726400 39600 1 AEDT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/NSW b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/NSW new file mode 100644 index 00000000..905bdfea --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/NSW @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Sydney)]} { + LoadTimeZoneFile Australia/Sydney +} +set TZData(:Australia/NSW) $TZData(:Australia/Sydney) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/North b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/North new file mode 100644 index 00000000..950c88c2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/North @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Darwin)]} { + LoadTimeZoneFile Australia/Darwin +} +set TZData(:Australia/North) $TZData(:Australia/Darwin) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Perth b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Perth new file mode 100644 index 00000000..4ed3cba6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Perth @@ -0,0 +1,25 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Perth) { + {-9223372036854775808 27804 0 LMT} + {-2337925404 28800 0 AWST} + {-1672552800 32400 1 AWDT} + {-1665381600 28800 0 AWST} + {-883634400 32400 1 AWDT} + {-876117600 28800 0 AWST} + {-860392800 32400 1 AWDT} + {-844668000 28800 0 AWST} + {-836470800 32400 0 AWST} + {152042400 32400 1 AWDT} + {162928800 28800 0 AWST} + {436298400 32400 1 AWDT} + {447184800 28800 0 AWST} + {690314400 32400 1 AWDT} + {699386400 28800 0 AWST} + {1165082400 32400 1 AWDT} + {1174759200 28800 0 AWST} + {1193508000 32400 1 AWDT} + {1206813600 28800 0 AWST} + {1224957600 32400 1 AWDT} + {1238263200 28800 0 AWST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Queensland b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Queensland new file mode 100644 index 00000000..6246e920 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Queensland @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Brisbane)]} { + LoadTimeZoneFile Australia/Brisbane +} +set TZData(:Australia/Queensland) $TZData(:Australia/Brisbane) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/South b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/South new file mode 100644 index 00000000..9c7dd956 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/South @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Adelaide)]} { + LoadTimeZoneFile Australia/Adelaide +} +set TZData(:Australia/South) $TZData(:Australia/Adelaide) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Sydney b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Sydney new file mode 100644 index 00000000..fd01af61 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/Sydney @@ -0,0 +1,272 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Sydney) { + {-9223372036854775808 36292 0 LMT} + {-2364113092 36000 0 AEST} + {-1672560000 39600 1 AEDT} + {-1665388800 36000 0 AEST} + {-883641600 39600 1 AEDT} + {-876124800 36000 0 AEST} + {-860400000 39600 1 AEDT} + {-844675200 36000 0 AEST} + {-828345600 39600 1 AEDT} + {-813225600 36000 0 AEST} + {31500000 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {89136000 39600 1 AEDT} + {100022400 36000 0 AEST} + {120585600 39600 1 AEDT} + {131472000 36000 0 AEST} + {152035200 39600 1 AEDT} + {162921600 36000 0 AEST} + {183484800 39600 1 AEDT} + {194976000 36000 0 AEST} + {215539200 39600 1 AEDT} + {226425600 36000 0 AEST} + {246988800 39600 1 AEDT} + {257875200 36000 0 AEST} + {278438400 39600 1 AEDT} + {289324800 36000 0 AEST} + {309888000 39600 1 AEDT} + {320774400 36000 0 AEST} + {341337600 39600 1 AEDT} + {352224000 36000 0 AEST} + {372787200 39600 1 AEDT} + {386697600 36000 0 AEST} + {404841600 39600 1 AEDT} + {415728000 36000 0 AEST} + {436291200 39600 1 AEDT} + {447177600 36000 0 AEST} + {467740800 39600 1 AEDT} + {478627200 36000 0 AEST} + {499190400 39600 1 AEDT} + {511286400 36000 0 AEST} + {530035200 39600 1 AEDT} + {542736000 36000 0 AEST} + {562089600 39600 1 AEDT} + {574790400 36000 0 AEST} + {594144000 39600 1 AEDT} + {606240000 36000 0 AEST} + {625593600 39600 1 AEDT} + {636480000 36000 0 AEST} + {657043200 39600 1 AEDT} + {667929600 36000 0 AEST} + {688492800 39600 1 AEDT} + {699379200 36000 0 AEST} + {719942400 39600 1 AEDT} + {731433600 36000 0 AEST} + {751996800 39600 1 AEDT} + {762883200 36000 0 AEST} + {783446400 39600 1 AEDT} + {794332800 36000 0 AEST} + {814896000 39600 1 AEDT} + {828201600 36000 0 AEST} + {846345600 39600 1 AEDT} + {859651200 36000 0 AEST} + {877795200 39600 1 AEDT} + {891100800 36000 0 AEST} + {909244800 39600 1 AEDT} + {922550400 36000 0 AEST} + {941299200 39600 1 AEDT} + {954000000 36000 0 AEST} + {967305600 39600 1 AEDT} + {985449600 36000 0 AEST} + {1004198400 39600 1 AEDT} + {1017504000 36000 0 AEST} + {1035648000 39600 1 AEDT} + {1048953600 36000 0 AEST} + {1067097600 39600 1 AEDT} + {1080403200 36000 0 AEST} + {1099152000 39600 1 AEDT} + {1111852800 36000 0 AEST} + {1130601600 39600 1 AEDT} + {1143907200 36000 0 AEST} + {1162051200 39600 1 AEDT} + {1174752000 36000 0 AEST} + {1193500800 39600 1 AEDT} + {1207411200 36000 0 AEST} + {1223136000 39600 1 AEDT} + {1238860800 36000 0 AEST} + {1254585600 39600 1 AEDT} + {1270310400 36000 0 AEST} + {1286035200 39600 1 AEDT} + {1301760000 36000 0 AEST} + {1317484800 39600 1 AEDT} + {1333209600 36000 0 AEST} + {1349539200 39600 1 AEDT} + {1365264000 36000 0 AEST} + {1380988800 39600 1 AEDT} + {1396713600 36000 0 AEST} + {1412438400 39600 1 AEDT} + {1428163200 36000 0 AEST} + {1443888000 39600 1 AEDT} + {1459612800 36000 0 AEST} + {1475337600 39600 1 AEDT} + {1491062400 36000 0 AEST} + {1506787200 39600 1 AEDT} + {1522512000 36000 0 AEST} + {1538841600 39600 1 AEDT} + {1554566400 36000 0 AEST} + {1570291200 39600 1 AEDT} + {1586016000 36000 0 AEST} + {1601740800 39600 1 AEDT} + {1617465600 36000 0 AEST} + {1633190400 39600 1 AEDT} + {1648915200 36000 0 AEST} + {1664640000 39600 1 AEDT} + {1680364800 36000 0 AEST} + {1696089600 39600 1 AEDT} + {1712419200 36000 0 AEST} + {1728144000 39600 1 AEDT} + {1743868800 36000 0 AEST} + {1759593600 39600 1 AEDT} + {1775318400 36000 0 AEST} + {1791043200 39600 1 AEDT} + {1806768000 36000 0 AEST} + {1822492800 39600 1 AEDT} + {1838217600 36000 0 AEST} + {1853942400 39600 1 AEDT} + {1869667200 36000 0 AEST} + {1885996800 39600 1 AEDT} + {1901721600 36000 0 AEST} + {1917446400 39600 1 AEDT} + {1933171200 36000 0 AEST} + {1948896000 39600 1 AEDT} + {1964620800 36000 0 AEST} + {1980345600 39600 1 AEDT} + {1996070400 36000 0 AEST} + {2011795200 39600 1 AEDT} + {2027520000 36000 0 AEST} + {2043244800 39600 1 AEDT} + {2058969600 36000 0 AEST} + {2075299200 39600 1 AEDT} + {2091024000 36000 0 AEST} + {2106748800 39600 1 AEDT} + {2122473600 36000 0 AEST} + {2138198400 39600 1 AEDT} + {2153923200 36000 0 AEST} + {2169648000 39600 1 AEDT} + {2185372800 36000 0 AEST} + {2201097600 39600 1 AEDT} + {2216822400 36000 0 AEST} + {2233152000 39600 1 AEDT} + {2248876800 36000 0 AEST} + {2264601600 39600 1 AEDT} + {2280326400 36000 0 AEST} + {2296051200 39600 1 AEDT} + {2311776000 36000 0 AEST} + {2327500800 39600 1 AEDT} + {2343225600 36000 0 AEST} + {2358950400 39600 1 AEDT} + {2374675200 36000 0 AEST} + {2390400000 39600 1 AEDT} + {2406124800 36000 0 AEST} + {2422454400 39600 1 AEDT} + {2438179200 36000 0 AEST} + {2453904000 39600 1 AEDT} + {2469628800 36000 0 AEST} + {2485353600 39600 1 AEDT} + {2501078400 36000 0 AEST} + {2516803200 39600 1 AEDT} + {2532528000 36000 0 AEST} + {2548252800 39600 1 AEDT} + {2563977600 36000 0 AEST} + {2579702400 39600 1 AEDT} + {2596032000 36000 0 AEST} + {2611756800 39600 1 AEDT} + {2627481600 36000 0 AEST} + {2643206400 39600 1 AEDT} + {2658931200 36000 0 AEST} + {2674656000 39600 1 AEDT} + {2690380800 36000 0 AEST} + {2706105600 39600 1 AEDT} + {2721830400 36000 0 AEST} + {2737555200 39600 1 AEDT} + {2753280000 36000 0 AEST} + {2769609600 39600 1 AEDT} + {2785334400 36000 0 AEST} + {2801059200 39600 1 AEDT} + {2816784000 36000 0 AEST} + {2832508800 39600 1 AEDT} + {2848233600 36000 0 AEST} + {2863958400 39600 1 AEDT} + {2879683200 36000 0 AEST} + {2895408000 39600 1 AEDT} + {2911132800 36000 0 AEST} + {2926857600 39600 1 AEDT} + {2942582400 36000 0 AEST} + {2958912000 39600 1 AEDT} + {2974636800 36000 0 AEST} + {2990361600 39600 1 AEDT} + {3006086400 36000 0 AEST} + {3021811200 39600 1 AEDT} + {3037536000 36000 0 AEST} + {3053260800 39600 1 AEDT} + {3068985600 36000 0 AEST} + {3084710400 39600 1 AEDT} + {3100435200 36000 0 AEST} + {3116764800 39600 1 AEDT} + {3132489600 36000 0 AEST} + {3148214400 39600 1 AEDT} + {3163939200 36000 0 AEST} + {3179664000 39600 1 AEDT} + {3195388800 36000 0 AEST} + {3211113600 39600 1 AEDT} + {3226838400 36000 0 AEST} + {3242563200 39600 1 AEDT} + {3258288000 36000 0 AEST} + {3274012800 39600 1 AEDT} + {3289737600 36000 0 AEST} + {3306067200 39600 1 AEDT} + {3321792000 36000 0 AEST} + {3337516800 39600 1 AEDT} + {3353241600 36000 0 AEST} + {3368966400 39600 1 AEDT} + {3384691200 36000 0 AEST} + {3400416000 39600 1 AEDT} + {3416140800 36000 0 AEST} + {3431865600 39600 1 AEDT} + {3447590400 36000 0 AEST} + {3463315200 39600 1 AEDT} + {3479644800 36000 0 AEST} + {3495369600 39600 1 AEDT} + {3511094400 36000 0 AEST} + {3526819200 39600 1 AEDT} + {3542544000 36000 0 AEST} + {3558268800 39600 1 AEDT} + {3573993600 36000 0 AEST} + {3589718400 39600 1 AEDT} + {3605443200 36000 0 AEST} + {3621168000 39600 1 AEDT} + {3636892800 36000 0 AEST} + {3653222400 39600 1 AEDT} + {3668947200 36000 0 AEST} + {3684672000 39600 1 AEDT} + {3700396800 36000 0 AEST} + {3716121600 39600 1 AEDT} + {3731846400 36000 0 AEST} + {3747571200 39600 1 AEDT} + {3763296000 36000 0 AEST} + {3779020800 39600 1 AEDT} + {3794745600 36000 0 AEST} + {3810470400 39600 1 AEDT} + {3826195200 36000 0 AEST} + {3842524800 39600 1 AEDT} + {3858249600 36000 0 AEST} + {3873974400 39600 1 AEDT} + {3889699200 36000 0 AEST} + {3905424000 39600 1 AEDT} + {3921148800 36000 0 AEST} + {3936873600 39600 1 AEDT} + {3952598400 36000 0 AEST} + {3968323200 39600 1 AEDT} + {3984048000 36000 0 AEST} + {4000377600 39600 1 AEDT} + {4016102400 36000 0 AEST} + {4031827200 39600 1 AEDT} + {4047552000 36000 0 AEST} + {4063276800 39600 1 AEDT} + {4079001600 36000 0 AEST} + {4094726400 39600 1 AEDT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/West b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/West new file mode 100644 index 00000000..4689f7ea --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Australia/West @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Perth)]} { + LoadTimeZoneFile Australia/Perth +} +set TZData(:Australia/West) $TZData(:Australia/Perth) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Brazil/Acre b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Brazil/Acre new file mode 100644 index 00000000..abb0b98e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Brazil/Acre @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Rio_Branco)]} { + LoadTimeZoneFile America/Rio_Branco +} +set TZData(:Brazil/Acre) $TZData(:America/Rio_Branco) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Brazil/East b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Brazil/East new file mode 100644 index 00000000..f684633c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Brazil/East @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Sao_Paulo)]} { + LoadTimeZoneFile America/Sao_Paulo +} +set TZData(:Brazil/East) $TZData(:America/Sao_Paulo) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Brazil/West b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Brazil/West new file mode 100644 index 00000000..67676d90 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Brazil/West @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Manaus)]} { + LoadTimeZoneFile America/Manaus +} +set TZData(:Brazil/West) $TZData(:America/Manaus) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/CET b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/CET new file mode 100644 index 00000000..b08750ae --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/CET @@ -0,0 +1,265 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:CET) { + {-9223372036854775808 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-938905200 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-781052400 7200 1 CEST} + {-766623600 3600 0 CET} + {228877200 7200 1 CEST} + {243997200 3600 0 CET} + {260326800 7200 1 CEST} + {276051600 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/CST6CDT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/CST6CDT new file mode 100644 index 00000000..11e45f0c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/CST6CDT @@ -0,0 +1,278 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:CST6CDT) { + {-9223372036854775808 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-84384000 -18000 1 CDT} + {-68662800 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37213200 -21600 0 CST} + {-21484800 -18000 1 CDT} + {-5763600 -21600 0 CST} + {9964800 -18000 1 CDT} + {25686000 -21600 0 CST} + {41414400 -18000 1 CDT} + {57740400 -21600 0 CST} + {73468800 -18000 1 CDT} + {89190000 -21600 0 CST} + {104918400 -18000 1 CDT} + {120639600 -21600 0 CST} + {126691200 -18000 1 CDT} + {152089200 -21600 0 CST} + {162374400 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247042800 -21600 0 CST} + {262771200 -18000 1 CDT} + {278492400 -21600 0 CST} + {294220800 -18000 1 CDT} + {309942000 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {986112000 -18000 1 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Atlantic b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Atlantic new file mode 100644 index 00000000..d1478d97 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Atlantic @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Halifax)]} { + LoadTimeZoneFile America/Halifax +} +set TZData(:Canada/Atlantic) $TZData(:America/Halifax) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Central b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Central new file mode 100644 index 00000000..b04bef93 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Central @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Winnipeg)]} { + LoadTimeZoneFile America/Winnipeg +} +set TZData(:Canada/Central) $TZData(:America/Winnipeg) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Eastern b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Eastern new file mode 100644 index 00000000..74528eb2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Eastern @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Toronto)]} { + LoadTimeZoneFile America/Toronto +} +set TZData(:Canada/Eastern) $TZData(:America/Toronto) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Mountain b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Mountain new file mode 100644 index 00000000..8c6458de --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Mountain @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Edmonton)]} { + LoadTimeZoneFile America/Edmonton +} +set TZData(:Canada/Mountain) $TZData(:America/Edmonton) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Newfoundland b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Newfoundland new file mode 100644 index 00000000..6904cde8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Newfoundland @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/St_Johns)]} { + LoadTimeZoneFile America/St_Johns +} +set TZData(:Canada/Newfoundland) $TZData(:America/St_Johns) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Pacific b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Pacific new file mode 100644 index 00000000..4d70342d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Pacific @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Vancouver)]} { + LoadTimeZoneFile America/Vancouver +} +set TZData(:Canada/Pacific) $TZData(:America/Vancouver) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Saskatchewan b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Saskatchewan new file mode 100644 index 00000000..cd56446e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Saskatchewan @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Regina)]} { + LoadTimeZoneFile America/Regina +} +set TZData(:Canada/Saskatchewan) $TZData(:America/Regina) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Yukon b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Yukon new file mode 100644 index 00000000..04b83685 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Canada/Yukon @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Whitehorse)]} { + LoadTimeZoneFile America/Whitehorse +} +set TZData(:Canada/Yukon) $TZData(:America/Whitehorse) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Chile/Continental b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Chile/Continental new file mode 100644 index 00000000..0f858a3d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Chile/Continental @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Santiago)]} { + LoadTimeZoneFile America/Santiago +} +set TZData(:Chile/Continental) $TZData(:America/Santiago) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Chile/EasterIsland b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Chile/EasterIsland new file mode 100644 index 00000000..4edc034d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Chile/EasterIsland @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Easter)]} { + LoadTimeZoneFile Pacific/Easter +} +set TZData(:Chile/EasterIsland) $TZData(:Pacific/Easter) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EET b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EET new file mode 100644 index 00000000..e7c102a9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EET @@ -0,0 +1,251 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:EET) { + {-9223372036854775808 7200 0 EET} + {228877200 10800 1 EEST} + {243997200 7200 0 EET} + {260326800 10800 1 EEST} + {276051600 7200 0 EET} + {291776400 10800 1 EEST} + {307501200 7200 0 EET} + {323830800 10800 1 EEST} + {338950800 7200 0 EET} + {354675600 10800 1 EEST} + {370400400 7200 0 EET} + {386125200 10800 1 EEST} + {401850000 7200 0 EET} + {417574800 10800 1 EEST} + {433299600 7200 0 EET} + {449024400 10800 1 EEST} + {465354000 7200 0 EET} + {481078800 10800 1 EEST} + {496803600 7200 0 EET} + {512528400 10800 1 EEST} + {528253200 7200 0 EET} + {543978000 10800 1 EEST} + {559702800 7200 0 EET} + {575427600 10800 1 EEST} + {591152400 7200 0 EET} + {606877200 10800 1 EEST} + {622602000 7200 0 EET} + {638326800 10800 1 EEST} + {654656400 7200 0 EET} + {670381200 10800 1 EEST} + {686106000 7200 0 EET} + {701830800 10800 1 EEST} + {717555600 7200 0 EET} + {733280400 10800 1 EEST} + {749005200 7200 0 EET} + {764730000 10800 1 EEST} + {780454800 7200 0 EET} + {796179600 10800 1 EEST} + {811904400 7200 0 EET} + {828234000 10800 1 EEST} + {846378000 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EST b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EST new file mode 100644 index 00000000..72c5b17d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EST @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:EST) { + {-9223372036854775808 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EST5EDT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EST5EDT new file mode 100644 index 00000000..968833ef --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/EST5EDT @@ -0,0 +1,278 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:EST5EDT) { + {-9223372036854775808 -18000 0 EST} + {-1633280400 -14400 1 EDT} + {-1615140000 -18000 0 EST} + {-1601830800 -14400 1 EDT} + {-1583690400 -18000 0 EST} + {-880218000 -14400 1 EWT} + {-769395600 -14400 1 EPT} + {-765396000 -18000 0 EST} + {-84387600 -14400 1 EDT} + {-68666400 -18000 0 EST} + {-52938000 -14400 1 EDT} + {-37216800 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {126687600 -14400 1 EDT} + {152085600 -18000 0 EST} + {162370800 -14400 1 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Egypt b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Egypt new file mode 100644 index 00000000..63341bcc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Egypt @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Cairo)]} { + LoadTimeZoneFile Africa/Cairo +} +set TZData(:Egypt) $TZData(:Africa/Cairo) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Eire b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Eire new file mode 100644 index 00000000..c86c91c6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Eire @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Dublin)]} { + LoadTimeZoneFile Europe/Dublin +} +set TZData(:Eire) $TZData(:Europe/Dublin) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT new file mode 100644 index 00000000..7454fd57 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT) { + {-9223372036854775808 0 0 GMT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+0 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+0 new file mode 100644 index 00000000..017dee1f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+0 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:Etc/GMT+0) $TZData(:Etc/GMT) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+1 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+1 new file mode 100644 index 00000000..70d39cf9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+1 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+1) { + {-9223372036854775808 -3600 0 -01} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+10 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+10 new file mode 100644 index 00000000..9165a08b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+10 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+10) { + {-9223372036854775808 -36000 0 -10} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+11 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+11 new file mode 100644 index 00000000..a1aaf74f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+11 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+11) { + {-9223372036854775808 -39600 0 -11} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+12 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+12 new file mode 100644 index 00000000..d2c082a2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+12 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+12) { + {-9223372036854775808 -43200 0 -12} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+2 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+2 new file mode 100644 index 00000000..46cca7d2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+2 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+2) { + {-9223372036854775808 -7200 0 -02} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+3 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+3 new file mode 100644 index 00000000..e1e30014 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+3 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+3) { + {-9223372036854775808 -10800 0 -03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+4 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+4 new file mode 100644 index 00000000..32afa243 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+4 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+4) { + {-9223372036854775808 -14400 0 -04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+5 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+5 new file mode 100644 index 00000000..747abf54 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+5 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+5) { + {-9223372036854775808 -18000 0 -05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+6 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+6 new file mode 100644 index 00000000..1096839e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+6 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+6) { + {-9223372036854775808 -21600 0 -06} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+7 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+7 new file mode 100644 index 00000000..6d478638 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+7 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+7) { + {-9223372036854775808 -25200 0 -07} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+8 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+8 new file mode 100644 index 00000000..33c0f690 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+8 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+8) { + {-9223372036854775808 -28800 0 -08} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+9 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+9 new file mode 100644 index 00000000..4119bf44 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT+9 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+9) { + {-9223372036854775808 -32400 0 -09} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-0 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-0 new file mode 100644 index 00000000..d8913d50 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-0 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:Etc/GMT-0) $TZData(:Etc/GMT) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-1 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-1 new file mode 100644 index 00000000..e7ac44b9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-1 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-1) { + {-9223372036854775808 3600 0 +01} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-10 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-10 new file mode 100644 index 00000000..fdbd1e32 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-10 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-10) { + {-9223372036854775808 36000 0 +10} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-11 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-11 new file mode 100644 index 00000000..4b28ad0b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-11 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-11) { + {-9223372036854775808 39600 0 +11} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-12 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-12 new file mode 100644 index 00000000..594bac31 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-12 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-12) { + {-9223372036854775808 43200 0 +12} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-13 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-13 new file mode 100644 index 00000000..f61159e1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-13 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-13) { + {-9223372036854775808 46800 0 +13} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-14 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-14 new file mode 100644 index 00000000..493800f4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-14 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-14) { + {-9223372036854775808 50400 0 +14} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-2 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-2 new file mode 100644 index 00000000..51fdbedc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-2 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-2) { + {-9223372036854775808 7200 0 +02} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-3 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-3 new file mode 100644 index 00000000..7aed39d3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-3 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-3) { + {-9223372036854775808 10800 0 +03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-4 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-4 new file mode 100644 index 00000000..6ca6372e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-4 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-4) { + {-9223372036854775808 14400 0 +04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-5 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-5 new file mode 100644 index 00000000..6c47a31e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-5 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-5) { + {-9223372036854775808 18000 0 +05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-6 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-6 new file mode 100644 index 00000000..202e7f80 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-6 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-6) { + {-9223372036854775808 21600 0 +06} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-7 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-7 new file mode 100644 index 00000000..c6deaf38 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-7 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-7) { + {-9223372036854775808 25200 0 +07} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-8 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-8 new file mode 100644 index 00000000..4bed42e7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-8 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-8) { + {-9223372036854775808 28800 0 +08} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-9 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-9 new file mode 100644 index 00000000..2a7625be --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT-9 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-9) { + {-9223372036854775808 32400 0 +09} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT0 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT0 new file mode 100644 index 00000000..dba1fe9f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/GMT0 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:Etc/GMT0) $TZData(:Etc/GMT) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Greenwich b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Greenwich new file mode 100644 index 00000000..53acea06 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Greenwich @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:Etc/Greenwich) $TZData(:Etc/GMT) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/UCT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/UCT new file mode 100644 index 00000000..c843cdc3 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/UCT @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UTC)]} { + LoadTimeZoneFile Etc/UTC +} +set TZData(:Etc/UCT) $TZData(:Etc/UTC) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/UTC b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/UTC new file mode 100644 index 00000000..db5954bd --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/UTC @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/UTC) { + {-9223372036854775808 0 0 UTC} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Universal b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Universal new file mode 100644 index 00000000..a3b75478 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Universal @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UTC)]} { + LoadTimeZoneFile Etc/UTC +} +set TZData(:Etc/Universal) $TZData(:Etc/UTC) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Zulu b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Zulu new file mode 100644 index 00000000..f643db98 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Etc/Zulu @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UTC)]} { + LoadTimeZoneFile Etc/UTC +} +set TZData(:Etc/Zulu) $TZData(:Etc/UTC) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Amsterdam b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Amsterdam new file mode 100644 index 00000000..7fbe3aa4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Amsterdam @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Brussels)]} { + LoadTimeZoneFile Europe/Brussels +} +set TZData(:Europe/Amsterdam) $TZData(:Europe/Brussels) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Astrakhan b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Astrakhan new file mode 100644 index 00000000..9881bb88 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Astrakhan @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Astrakhan) { + {-9223372036854775808 11532 0 LMT} + {-1441249932 10800 0 +03} + {-1247540400 14400 0 +05} + {354916800 18000 1 +05} + {370724400 14400 0 +04} + {386452800 18000 1 +05} + {402260400 14400 0 +04} + {417988800 18000 1 +05} + {433796400 14400 0 +04} + {449611200 18000 1 +05} + {465343200 14400 0 +04} + {481068000 18000 1 +05} + {496792800 14400 0 +04} + {512517600 18000 1 +05} + {528242400 14400 0 +04} + {543967200 18000 1 +05} + {559692000 14400 0 +04} + {575416800 18000 1 +05} + {591141600 14400 0 +04} + {606866400 10800 0 +04} + {606870000 14400 1 +04} + {622594800 10800 0 +03} + {638319600 14400 1 +04} + {654649200 10800 0 +03} + {670374000 14400 0 +04} + {701820000 10800 0 +04} + {701823600 14400 1 +04} + {717548400 10800 0 +03} + {733273200 14400 1 +04} + {748998000 10800 0 +03} + {764722800 14400 1 +04} + {780447600 10800 0 +03} + {796172400 14400 1 +04} + {811897200 10800 0 +03} + {828226800 14400 1 +04} + {846370800 10800 0 +03} + {859676400 14400 1 +04} + {877820400 10800 0 +03} + {891126000 14400 1 +04} + {909270000 10800 0 +03} + {922575600 14400 1 +04} + {941324400 10800 0 +03} + {954025200 14400 1 +04} + {972774000 10800 0 +03} + {985474800 14400 1 +04} + {1004223600 10800 0 +03} + {1017529200 14400 1 +04} + {1035673200 10800 0 +03} + {1048978800 14400 1 +04} + {1067122800 10800 0 +03} + {1080428400 14400 1 +04} + {1099177200 10800 0 +03} + {1111878000 14400 1 +04} + {1130626800 10800 0 +03} + {1143327600 14400 1 +04} + {1162076400 10800 0 +03} + {1174777200 14400 1 +04} + {1193526000 10800 0 +03} + {1206831600 14400 1 +04} + {1224975600 10800 0 +03} + {1238281200 14400 1 +04} + {1256425200 10800 0 +03} + {1269730800 14400 1 +04} + {1288479600 10800 0 +03} + {1301180400 14400 0 +04} + {1414274400 10800 0 +03} + {1459033200 14400 0 +04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Athens b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Athens new file mode 100644 index 00000000..f8df408d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Athens @@ -0,0 +1,268 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Athens) { + {-9223372036854775808 5692 0 LMT} + {-2344642492 5692 0 AMT} + {-1686101632 7200 0 EET} + {-1182996000 10800 1 EEST} + {-1178161200 7200 0 EET} + {-906861600 10800 1 EEST} + {-904878000 7200 0 CEST} + {-857257200 3600 0 CET} + {-844477200 7200 1 CEST} + {-828237600 3600 0 CET} + {-812422800 7200 0 EET} + {-552362400 10800 1 EEST} + {-541652400 7200 0 EET} + {166485600 10800 1 EEST} + {186184800 7200 0 EET} + {198028800 10800 1 EEST} + {213753600 7200 0 EET} + {228873600 10800 1 EEST} + {244080000 7200 0 EET} + {260323200 10800 1 EEST} + {275446800 7200 0 EET} + {291798000 10800 1 EEST} + {307407600 7200 0 EET} + {323388000 10800 1 EEST} + {338936400 7200 0 EET} + {347148000 7200 0 EET} + {354675600 10800 1 EEST} + {370400400 7200 0 EET} + {386125200 10800 1 EEST} + {401850000 7200 0 EET} + {417574800 10800 1 EEST} + {433299600 7200 0 EET} + {449024400 10800 1 EEST} + {465354000 7200 0 EET} + {481078800 10800 1 EEST} + {496803600 7200 0 EET} + {512528400 10800 1 EEST} + {528253200 7200 0 EET} + {543978000 10800 1 EEST} + {559702800 7200 0 EET} + {575427600 10800 1 EEST} + {591152400 7200 0 EET} + {606877200 10800 1 EEST} + {622602000 7200 0 EET} + {638326800 10800 1 EEST} + {654656400 7200 0 EET} + {670381200 10800 1 EEST} + {686106000 7200 0 EET} + {701830800 10800 1 EEST} + {717555600 7200 0 EET} + {733280400 10800 1 EEST} + {749005200 7200 0 EET} + {764730000 10800 1 EEST} + {780454800 7200 0 EET} + {796179600 10800 1 EEST} + {811904400 7200 0 EET} + {828234000 10800 1 EEST} + {846378000 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Belfast b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Belfast new file mode 100644 index 00000000..51cd3ce4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Belfast @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/London)]} { + LoadTimeZoneFile Europe/London +} +set TZData(:Europe/Belfast) $TZData(:Europe/London) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Belgrade b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Belgrade new file mode 100644 index 00000000..b11f7b33 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Belgrade @@ -0,0 +1,250 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Belgrade) { + {-9223372036854775808 4920 0 LMT} + {-2713915320 3600 0 CET} + {-905824800 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-788922000 3600 0 CET} + {-777942000 7200 1 CEST} + {-766623600 3600 0 CET} + {407199600 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Berlin b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Berlin new file mode 100644 index 00000000..5469cf62 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Berlin @@ -0,0 +1,274 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Berlin) { + {-9223372036854775808 3208 0 LMT} + {-2422054408 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-938905200 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-781052400 7200 1 CEST} + {-776559600 10800 0 CEMT} + {-765936000 7200 1 CEST} + {-761180400 3600 0 CET} + {-757386000 3600 0 CET} + {-748479600 7200 1 CEST} + {-733273200 3600 0 CET} + {-717631200 7200 1 CEST} + {-714610800 10800 1 CEMT} + {-710380800 7200 1 CEST} + {-701910000 3600 0 CET} + {-684975600 7200 1 CEST} + {-670460400 3600 0 CET} + {-654130800 7200 1 CEST} + {-639010800 3600 0 CET} + {315529200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Brussels b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Brussels new file mode 100644 index 00000000..907fff82 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Brussels @@ -0,0 +1,316 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Brussels) { + {-9223372036854775808 1050 0 LMT} + {-2840141850 1050 0 BMT} + {-2450995200 0 0 WET} + {-1740355200 3600 0 CET} + {-1693702800 7200 0 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-1613826000 0 0 WET} + {-1604278800 3600 1 WEST} + {-1585530000 0 0 WET} + {-1574038800 3600 1 WEST} + {-1552266000 0 0 WET} + {-1539997200 3600 1 WEST} + {-1520557200 0 0 WET} + {-1507510800 3600 1 WEST} + {-1490576400 0 0 WET} + {-1473642000 3600 1 WEST} + {-1459126800 0 0 WET} + {-1444006800 3600 1 WEST} + {-1427677200 0 0 WET} + {-1411952400 3600 1 WEST} + {-1396227600 0 0 WET} + {-1379293200 3600 1 WEST} + {-1364778000 0 0 WET} + {-1348448400 3600 1 WEST} + {-1333328400 0 0 WET} + {-1316394000 3600 1 WEST} + {-1301263200 0 0 WET} + {-1284328800 3600 1 WEST} + {-1269813600 0 0 WET} + {-1253484000 3600 1 WEST} + {-1238364000 0 0 WET} + {-1221429600 3600 1 WEST} + {-1206914400 0 0 WET} + {-1191189600 3600 1 WEST} + {-1175464800 0 0 WET} + {-1160344800 3600 1 WEST} + {-1143410400 0 0 WET} + {-1127685600 3600 1 WEST} + {-1111960800 0 0 WET} + {-1096840800 3600 1 WEST} + {-1080511200 0 0 WET} + {-1063576800 3600 1 WEST} + {-1049061600 0 0 WET} + {-1033336800 3600 1 WEST} + {-1017612000 0 0 WET} + {-1002492000 3600 1 WEST} + {-986162400 0 0 WET} + {-969228000 3600 1 WEST} + {-950479200 0 0 WET} + {-942012000 3600 1 WEST} + {-934668000 7200 0 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-799290000 3600 0 CET} + {-798073200 3600 0 CET} + {-781052400 7200 1 CEST} + {-766623600 3600 0 CET} + {-745455600 7200 1 CEST} + {-733273200 3600 0 CET} + {220921200 3600 0 CET} + {228877200 7200 1 CEST} + {243997200 3600 0 CET} + {260326800 7200 1 CEST} + {276051600 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Bucharest b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Bucharest new file mode 100644 index 00000000..7b3bed44 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Bucharest @@ -0,0 +1,268 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Bucharest) { + {-9223372036854775808 6264 0 LMT} + {-2469404664 6264 0 BMT} + {-1213148664 7200 0 EET} + {-1187056800 10800 1 EEST} + {-1175479200 7200 0 EET} + {-1159754400 10800 1 EEST} + {-1144029600 7200 0 EET} + {-1127700000 10800 1 EEST} + {-1111975200 7200 0 EET} + {-1096250400 10800 1 EEST} + {-1080525600 7200 0 EET} + {-1064800800 10800 1 EEST} + {-1049076000 7200 0 EET} + {-1033351200 10800 1 EEST} + {-1017626400 7200 0 EET} + {-1001901600 10800 1 EEST} + {-986176800 7200 0 EET} + {-970452000 10800 1 EEST} + {-954727200 7200 0 EET} + {296604000 10800 1 EEST} + {307486800 7200 0 EET} + {323816400 10800 1 EEST} + {338940000 7200 0 EET} + {354672000 10800 0 EEST} + {370396800 7200 0 EET} + {386121600 10800 1 EEST} + {401846400 7200 0 EET} + {417571200 10800 1 EEST} + {433296000 7200 0 EET} + {449020800 10800 1 EEST} + {465350400 7200 0 EET} + {481075200 10800 1 EEST} + {496800000 7200 0 EET} + {512524800 10800 1 EEST} + {528249600 7200 0 EET} + {543974400 10800 1 EEST} + {559699200 7200 0 EET} + {575424000 10800 1 EEST} + {591148800 7200 0 EET} + {606873600 10800 1 EEST} + {622598400 7200 0 EET} + {638323200 10800 1 EEST} + {654652800 7200 0 EET} + {662680800 7200 0 EET} + {670370400 10800 1 EEST} + {686095200 7200 0 EET} + {701820000 10800 1 EEST} + {717544800 7200 0 EET} + {733269600 10800 1 EEST} + {748994400 7200 0 EET} + {757375200 7200 0 EET} + {764719200 10800 1 EEST} + {780440400 7200 0 EET} + {796168800 10800 1 EEST} + {811890000 7200 0 EET} + {828223200 10800 1 EEST} + {846363600 7200 0 EET} + {852069600 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Budapest b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Budapest new file mode 100644 index 00000000..4b92c5ff --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Budapest @@ -0,0 +1,283 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Budapest) { + {-9223372036854775808 4580 0 LMT} + {-2498260580 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1640998800 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-1600470000 7200 1 CEST} + {-1587250800 3600 0 CET} + {-1569711600 7200 1 CEST} + {-1555196400 3600 0 CET} + {-906775200 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-788922000 3600 0 CET} + {-778471200 7200 1 CEST} + {-762656400 3600 0 CET} + {-749689200 7200 1 CEST} + {-733276800 3600 0 CET} + {-717634800 7200 1 CEST} + {-701910000 3600 0 CET} + {-686185200 7200 1 CEST} + {-670460400 3600 0 CET} + {-654130800 7200 1 CEST} + {-639010800 3600 0 CET} + {-492656400 7200 1 CEST} + {-481168800 3600 0 CET} + {-461199600 7200 1 CEST} + {-449708400 3600 0 CET} + {-428540400 7200 1 CEST} + {-418258800 3600 0 CET} + {-397090800 7200 1 CEST} + {-386809200 3600 0 CET} + {323823600 7200 1 CEST} + {338943600 3600 0 CET} + {354668400 7200 1 CEST} + {370393200 3600 0 CET} + {386118000 7200 1 CEST} + {401842800 3600 0 CET} + {417567600 7200 1 CEST} + {433292400 3600 0 CET} + {441759600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Busingen b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Busingen new file mode 100644 index 00000000..62abc29b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Busingen @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Zurich)]} { + LoadTimeZoneFile Europe/Zurich +} +set TZData(:Europe/Busingen) $TZData(:Europe/Zurich) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Chisinau b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Chisinau new file mode 100644 index 00000000..db4c6db4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Chisinau @@ -0,0 +1,272 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Chisinau) { + {-9223372036854775808 6920 0 LMT} + {-2840147720 6900 0 CMT} + {-1637114100 6264 0 BMT} + {-1213148664 7200 0 EET} + {-1187056800 10800 1 EEST} + {-1175479200 7200 0 EET} + {-1159754400 10800 1 EEST} + {-1144029600 7200 0 EET} + {-1127700000 10800 1 EEST} + {-1111975200 7200 0 EET} + {-1096250400 10800 1 EEST} + {-1080525600 7200 0 EET} + {-1064800800 10800 1 EEST} + {-1049076000 7200 0 EET} + {-1033351200 10800 1 EEST} + {-1017626400 7200 0 EET} + {-1001901600 10800 1 EEST} + {-986176800 7200 0 EET} + {-970452000 10800 1 EEST} + {-954727200 7200 0 EET} + {-927165600 10800 1 EEST} + {-898138800 7200 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-800154000 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 14400 1 MSD} + {622594800 10800 0 MSK} + {638319600 14400 1 MSD} + {641948400 10800 0 EEST} + {654652800 7200 0 EET} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {694216800 7200 0 EET} + {701820000 10800 1 EEST} + {717541200 7200 0 EET} + {733269600 10800 1 EEST} + {748990800 7200 0 EET} + {764719200 10800 1 EEST} + {780440400 7200 0 EET} + {796168800 10800 1 EEST} + {811890000 7200 0 EET} + {828223200 10800 1 EEST} + {846363600 7200 0 EET} + {852069600 7200 0 EET} + {859680000 10800 1 EEST} + {877824000 7200 0 EET} + {891129600 10800 1 EEST} + {909273600 7200 0 EET} + {922579200 10800 1 EEST} + {941328000 7200 0 EET} + {954028800 10800 1 EEST} + {972777600 7200 0 EET} + {985478400 10800 1 EEST} + {1004227200 7200 0 EET} + {1017532800 10800 1 EEST} + {1035676800 7200 0 EET} + {1048982400 10800 1 EEST} + {1067126400 7200 0 EET} + {1080432000 10800 1 EEST} + {1099180800 7200 0 EET} + {1111881600 10800 1 EEST} + {1130630400 7200 0 EET} + {1143331200 10800 1 EEST} + {1162080000 7200 0 EET} + {1174780800 10800 1 EEST} + {1193529600 7200 0 EET} + {1206835200 10800 1 EEST} + {1224979200 7200 0 EET} + {1238284800 10800 1 EEST} + {1256428800 7200 0 EET} + {1269734400 10800 1 EEST} + {1288483200 7200 0 EET} + {1301184000 10800 1 EEST} + {1319932800 7200 0 EET} + {1332633600 10800 1 EEST} + {1351382400 7200 0 EET} + {1364688000 10800 1 EEST} + {1382832000 7200 0 EET} + {1396137600 10800 1 EEST} + {1414281600 7200 0 EET} + {1427587200 10800 1 EEST} + {1445731200 7200 0 EET} + {1459036800 10800 1 EEST} + {1477785600 7200 0 EET} + {1490486400 10800 1 EEST} + {1509235200 7200 0 EET} + {1521936000 10800 1 EEST} + {1540684800 7200 0 EET} + {1553990400 10800 1 EEST} + {1572134400 7200 0 EET} + {1585440000 10800 1 EEST} + {1603584000 7200 0 EET} + {1616889600 10800 1 EEST} + {1635638400 7200 0 EET} + {1648339200 10800 1 EEST} + {1667088000 7200 0 EET} + {1679788800 10800 1 EEST} + {1698537600 7200 0 EET} + {1711843200 10800 1 EEST} + {1729987200 7200 0 EET} + {1743292800 10800 1 EEST} + {1761436800 7200 0 EET} + {1774742400 10800 1 EEST} + {1792886400 7200 0 EET} + {1806192000 10800 1 EEST} + {1824940800 7200 0 EET} + {1837641600 10800 1 EEST} + {1856390400 7200 0 EET} + {1869091200 10800 1 EEST} + {1887840000 7200 0 EET} + {1901145600 10800 1 EEST} + {1919289600 7200 0 EET} + {1932595200 10800 1 EEST} + {1950739200 7200 0 EET} + {1964044800 10800 1 EEST} + {1982793600 7200 0 EET} + {1995494400 10800 1 EEST} + {2014243200 7200 0 EET} + {2026944000 10800 1 EEST} + {2045692800 7200 0 EET} + {2058393600 10800 1 EEST} + {2077142400 7200 0 EET} + {2090448000 10800 1 EEST} + {2108592000 7200 0 EET} + {2121897600 10800 1 EEST} + {2140041600 7200 0 EET} + {2153347200 10800 1 EEST} + {2172096000 7200 0 EET} + {2184796800 10800 1 EEST} + {2203545600 7200 0 EET} + {2216246400 10800 1 EEST} + {2234995200 7200 0 EET} + {2248300800 10800 1 EEST} + {2266444800 7200 0 EET} + {2279750400 10800 1 EEST} + {2297894400 7200 0 EET} + {2311200000 10800 1 EEST} + {2329344000 7200 0 EET} + {2342649600 10800 1 EEST} + {2361398400 7200 0 EET} + {2374099200 10800 1 EEST} + {2392848000 7200 0 EET} + {2405548800 10800 1 EEST} + {2424297600 7200 0 EET} + {2437603200 10800 1 EEST} + {2455747200 7200 0 EET} + {2469052800 10800 1 EEST} + {2487196800 7200 0 EET} + {2500502400 10800 1 EEST} + {2519251200 7200 0 EET} + {2531952000 10800 1 EEST} + {2550700800 7200 0 EET} + {2563401600 10800 1 EEST} + {2582150400 7200 0 EET} + {2595456000 10800 1 EEST} + {2613600000 7200 0 EET} + {2626905600 10800 1 EEST} + {2645049600 7200 0 EET} + {2658355200 10800 1 EEST} + {2676499200 7200 0 EET} + {2689804800 10800 1 EEST} + {2708553600 7200 0 EET} + {2721254400 10800 1 EEST} + {2740003200 7200 0 EET} + {2752704000 10800 1 EEST} + {2771452800 7200 0 EET} + {2784758400 10800 1 EEST} + {2802902400 7200 0 EET} + {2816208000 10800 1 EEST} + {2834352000 7200 0 EET} + {2847657600 10800 1 EEST} + {2866406400 7200 0 EET} + {2879107200 10800 1 EEST} + {2897856000 7200 0 EET} + {2910556800 10800 1 EEST} + {2929305600 7200 0 EET} + {2942006400 10800 1 EEST} + {2960755200 7200 0 EET} + {2974060800 10800 1 EEST} + {2992204800 7200 0 EET} + {3005510400 10800 1 EEST} + {3023654400 7200 0 EET} + {3036960000 10800 1 EEST} + {3055708800 7200 0 EET} + {3068409600 10800 1 EEST} + {3087158400 7200 0 EET} + {3099859200 10800 1 EEST} + {3118608000 7200 0 EET} + {3131913600 10800 1 EEST} + {3150057600 7200 0 EET} + {3163363200 10800 1 EEST} + {3181507200 7200 0 EET} + {3194812800 10800 1 EEST} + {3212956800 7200 0 EET} + {3226262400 10800 1 EEST} + {3245011200 7200 0 EET} + {3257712000 10800 1 EEST} + {3276460800 7200 0 EET} + {3289161600 10800 1 EEST} + {3307910400 7200 0 EET} + {3321216000 10800 1 EEST} + {3339360000 7200 0 EET} + {3352665600 10800 1 EEST} + {3370809600 7200 0 EET} + {3384115200 10800 1 EEST} + {3402864000 7200 0 EET} + {3415564800 10800 1 EEST} + {3434313600 7200 0 EET} + {3447014400 10800 1 EEST} + {3465763200 7200 0 EET} + {3479068800 10800 1 EEST} + {3497212800 7200 0 EET} + {3510518400 10800 1 EEST} + {3528662400 7200 0 EET} + {3541968000 10800 1 EEST} + {3560112000 7200 0 EET} + {3573417600 10800 1 EEST} + {3592166400 7200 0 EET} + {3604867200 10800 1 EEST} + {3623616000 7200 0 EET} + {3636316800 10800 1 EEST} + {3655065600 7200 0 EET} + {3668371200 10800 1 EEST} + {3686515200 7200 0 EET} + {3699820800 10800 1 EEST} + {3717964800 7200 0 EET} + {3731270400 10800 1 EEST} + {3750019200 7200 0 EET} + {3762720000 10800 1 EEST} + {3781468800 7200 0 EET} + {3794169600 10800 1 EEST} + {3812918400 7200 0 EET} + {3825619200 10800 1 EEST} + {3844368000 7200 0 EET} + {3857673600 10800 1 EEST} + {3875817600 7200 0 EET} + {3889123200 10800 1 EEST} + {3907267200 7200 0 EET} + {3920572800 10800 1 EEST} + {3939321600 7200 0 EET} + {3952022400 10800 1 EEST} + {3970771200 7200 0 EET} + {3983472000 10800 1 EEST} + {4002220800 7200 0 EET} + {4015526400 10800 1 EEST} + {4033670400 7200 0 EET} + {4046976000 10800 1 EEST} + {4065120000 7200 0 EET} + {4078425600 10800 1 EEST} + {4096569600 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Copenhagen b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Copenhagen new file mode 100644 index 00000000..1b144d12 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Copenhagen @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Berlin)]} { + LoadTimeZoneFile Europe/Berlin +} +set TZData(:Europe/Copenhagen) $TZData(:Europe/Berlin) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Dublin b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Dublin new file mode 100644 index 00000000..eb0d182f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Dublin @@ -0,0 +1,358 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Dublin) { + {-9223372036854775808 -1521 0 LMT} + {-2821649679 -1521 0 DMT} + {-1691962479 2079 1 IST} + {-1680471279 0 0 GMT} + {-1664143200 3600 1 BST} + {-1650146400 0 0 GMT} + {-1633903200 3600 1 BST} + {-1617487200 0 0 GMT} + {-1601848800 3600 1 BST} + {-1586037600 0 0 GMT} + {-1570399200 3600 1 BST} + {-1552168800 0 0 GMT} + {-1538344800 3600 1 BST} + {-1522533600 0 0 GMT} + {-1517011200 0 0 IST} + {-1507500000 3600 1 IST} + {-1490565600 0 0 IST} + {-1473631200 3600 1 IST} + {-1460930400 0 0 IST} + {-1442786400 3600 1 IST} + {-1428876000 0 0 IST} + {-1410732000 3600 1 IST} + {-1396216800 0 0 IST} + {-1379282400 3600 1 IST} + {-1364767200 0 0 IST} + {-1348437600 3600 1 IST} + {-1333317600 0 0 IST} + {-1315778400 3600 1 IST} + {-1301263200 0 0 IST} + {-1284328800 3600 1 IST} + {-1269813600 0 0 IST} + {-1253484000 3600 1 IST} + {-1238364000 0 0 IST} + {-1221429600 3600 1 IST} + {-1206914400 0 0 IST} + {-1189980000 3600 1 IST} + {-1175464800 0 0 IST} + {-1159135200 3600 1 IST} + {-1143410400 0 0 IST} + {-1126476000 3600 1 IST} + {-1111960800 0 0 IST} + {-1095631200 3600 1 IST} + {-1080511200 0 0 IST} + {-1063576800 3600 1 IST} + {-1049061600 0 0 IST} + {-1032127200 3600 1 IST} + {-1017612000 0 0 IST} + {-1001282400 3600 1 IST} + {-986162400 0 0 IST} + {-969228000 3600 1 IST} + {-950479200 0 0 IST} + {-942012000 3600 1 IST} + {-733356000 0 0 GMT} + {-719445600 3600 1 IST} + {-699487200 0 0 GMT} + {-684972000 3600 0 IST} + {-668037600 0 0 IST} + {-654732000 3600 1 IST} + {-636588000 0 0 IST} + {-622072800 3600 1 IST} + {-605743200 0 0 IST} + {-590623200 3600 1 IST} + {-574293600 0 0 IST} + {-558568800 3600 1 IST} + {-542239200 0 0 IST} + {-527119200 3600 1 IST} + {-512604000 0 0 IST} + {-496274400 3600 1 IST} + {-481154400 0 0 IST} + {-464220000 3600 1 IST} + {-449704800 0 0 IST} + {-432165600 3600 1 IST} + {-417650400 0 0 IST} + {-401320800 3600 1 IST} + {-386200800 0 0 IST} + {-369266400 3600 1 IST} + {-354751200 0 0 IST} + {-337816800 3600 1 IST} + {-323301600 0 0 IST} + {-306972000 3600 1 IST} + {-291852000 0 0 IST} + {-276732000 3600 1 IST} + {-257983200 0 0 IST} + {-245282400 3600 1 IST} + {-226533600 0 0 IST} + {-213228000 3600 1 IST} + {-195084000 0 0 IST} + {-182383200 3600 1 IST} + {-163634400 0 0 IST} + {-150933600 3600 1 IST} + {-132184800 0 0 IST} + {-119484000 3600 1 IST} + {-100735200 0 0 IST} + {-88034400 3600 1 IST} + {-68680800 0 0 IST} + {-59004000 3600 1 IST} + {-37238400 3600 0 IST} + {57722400 0 1 IST} + {69818400 3600 0 IST} + {89172000 0 1 IST} + {101268000 3600 0 IST} + {120621600 0 1 IST} + {132717600 3600 0 IST} + {152071200 0 1 IST} + {164167200 3600 0 IST} + {183520800 0 1 IST} + {196221600 3600 0 IST} + {214970400 0 1 IST} + {227671200 3600 0 IST} + {246420000 0 1 IST} + {259120800 3600 0 IST} + {278474400 0 1 IST} + {290570400 3600 0 IST} + {309924000 0 1 IST} + {322020000 3600 0 IST} + {341373600 0 1 IST} + {354675600 3600 0 IST} + {372819600 0 1 IST} + {386125200 3600 0 IST} + {404269200 0 1 IST} + {417574800 3600 0 IST} + {435718800 0 1 IST} + {449024400 3600 0 IST} + {467773200 0 1 IST} + {481078800 3600 0 IST} + {499222800 0 1 IST} + {512528400 3600 0 IST} + {530672400 0 1 IST} + {543978000 3600 0 IST} + {562122000 0 1 IST} + {575427600 3600 0 IST} + {593571600 0 1 IST} + {606877200 3600 0 IST} + {625626000 0 1 IST} + {638326800 3600 0 IST} + {657075600 0 1 IST} + {670381200 3600 0 IST} + {688525200 0 1 IST} + {701830800 3600 0 IST} + {719974800 0 1 IST} + {733280400 3600 0 IST} + {751424400 0 1 IST} + {764730000 3600 0 IST} + {782874000 0 1 IST} + {796179600 3600 0 IST} + {814323600 0 1 IST} + {828234000 3600 0 IST} + {846378000 0 1 IST} + {859683600 3600 0 IST} + {877827600 0 1 IST} + {891133200 3600 0 IST} + {909277200 0 1 IST} + {922582800 3600 0 IST} + {941331600 0 1 IST} + {954032400 3600 0 IST} + {972781200 0 1 IST} + {985482000 3600 0 IST} + {1004230800 0 1 IST} + {1017536400 3600 0 IST} + {1035680400 0 1 IST} + {1048986000 3600 0 IST} + {1067130000 0 1 IST} + {1080435600 3600 0 IST} + {1099184400 0 1 IST} + {1111885200 3600 0 IST} + {1130634000 0 1 IST} + {1143334800 3600 0 IST} + {1162083600 0 1 IST} + {1174784400 3600 0 IST} + {1193533200 0 1 IST} + {1206838800 3600 0 IST} + {1224982800 0 1 IST} + {1238288400 3600 0 IST} + {1256432400 0 1 IST} + {1269738000 3600 0 IST} + {1288486800 0 1 IST} + {1301187600 3600 0 IST} + {1319936400 0 1 IST} + {1332637200 3600 0 IST} + {1351386000 0 1 IST} + {1364691600 3600 0 IST} + {1382835600 0 1 IST} + {1396141200 3600 0 IST} + {1414285200 0 1 IST} + {1427590800 3600 0 IST} + {1445734800 0 1 IST} + {1459040400 3600 0 IST} + {1477789200 0 1 IST} + {1490490000 3600 0 IST} + {1509238800 0 1 IST} + {1521939600 3600 0 IST} + {1540688400 0 1 IST} + {1553994000 3600 0 IST} + {1572138000 0 1 IST} + {1585443600 3600 0 IST} + {1603587600 0 1 IST} + {1616893200 3600 0 IST} + {1635642000 0 1 IST} + {1648342800 3600 0 IST} + {1667091600 0 1 IST} + {1679792400 3600 0 IST} + {1698541200 0 1 IST} + {1711846800 3600 0 IST} + {1729990800 0 1 IST} + {1743296400 3600 0 IST} + {1761440400 0 1 IST} + {1774746000 3600 0 IST} + {1792890000 0 1 IST} + {1806195600 3600 0 IST} + {1824944400 0 1 IST} + {1837645200 3600 0 IST} + {1856394000 0 1 IST} + {1869094800 3600 0 IST} + {1887843600 0 1 IST} + {1901149200 3600 0 IST} + {1919293200 0 1 IST} + {1932598800 3600 0 IST} + {1950742800 0 1 IST} + {1964048400 3600 0 IST} + {1982797200 0 1 IST} + {1995498000 3600 0 IST} + {2014246800 0 1 IST} + {2026947600 3600 0 IST} + {2045696400 0 1 IST} + {2058397200 3600 0 IST} + {2077146000 0 1 IST} + {2090451600 3600 0 IST} + {2108595600 0 1 IST} + {2121901200 3600 0 IST} + {2140045200 0 1 IST} + {2153350800 3600 0 IST} + {2172099600 0 1 IST} + {2184800400 3600 0 IST} + {2203549200 0 1 IST} + {2216250000 3600 0 IST} + {2234998800 0 1 IST} + {2248304400 3600 0 IST} + {2266448400 0 1 IST} + {2279754000 3600 0 IST} + {2297898000 0 1 IST} + {2311203600 3600 0 IST} + {2329347600 0 1 IST} + {2342653200 3600 0 IST} + {2361402000 0 1 IST} + {2374102800 3600 0 IST} + {2392851600 0 1 IST} + {2405552400 3600 0 IST} + {2424301200 0 1 IST} + {2437606800 3600 0 IST} + {2455750800 0 1 IST} + {2469056400 3600 0 IST} + {2487200400 0 1 IST} + {2500506000 3600 0 IST} + {2519254800 0 1 IST} + {2531955600 3600 0 IST} + {2550704400 0 1 IST} + {2563405200 3600 0 IST} + {2582154000 0 1 IST} + {2595459600 3600 0 IST} + {2613603600 0 1 IST} + {2626909200 3600 0 IST} + {2645053200 0 1 IST} + {2658358800 3600 0 IST} + {2676502800 0 1 IST} + {2689808400 3600 0 IST} + {2708557200 0 1 IST} + {2721258000 3600 0 IST} + {2740006800 0 1 IST} + {2752707600 3600 0 IST} + {2771456400 0 1 IST} + {2784762000 3600 0 IST} + {2802906000 0 1 IST} + {2816211600 3600 0 IST} + {2834355600 0 1 IST} + {2847661200 3600 0 IST} + {2866410000 0 1 IST} + {2879110800 3600 0 IST} + {2897859600 0 1 IST} + {2910560400 3600 0 IST} + {2929309200 0 1 IST} + {2942010000 3600 0 IST} + {2960758800 0 1 IST} + {2974064400 3600 0 IST} + {2992208400 0 1 IST} + {3005514000 3600 0 IST} + {3023658000 0 1 IST} + {3036963600 3600 0 IST} + {3055712400 0 1 IST} + {3068413200 3600 0 IST} + {3087162000 0 1 IST} + {3099862800 3600 0 IST} + {3118611600 0 1 IST} + {3131917200 3600 0 IST} + {3150061200 0 1 IST} + {3163366800 3600 0 IST} + {3181510800 0 1 IST} + {3194816400 3600 0 IST} + {3212960400 0 1 IST} + {3226266000 3600 0 IST} + {3245014800 0 1 IST} + {3257715600 3600 0 IST} + {3276464400 0 1 IST} + {3289165200 3600 0 IST} + {3307914000 0 1 IST} + {3321219600 3600 0 IST} + {3339363600 0 1 IST} + {3352669200 3600 0 IST} + {3370813200 0 1 IST} + {3384118800 3600 0 IST} + {3402867600 0 1 IST} + {3415568400 3600 0 IST} + {3434317200 0 1 IST} + {3447018000 3600 0 IST} + {3465766800 0 1 IST} + {3479072400 3600 0 IST} + {3497216400 0 1 IST} + {3510522000 3600 0 IST} + {3528666000 0 1 IST} + {3541971600 3600 0 IST} + {3560115600 0 1 IST} + {3573421200 3600 0 IST} + {3592170000 0 1 IST} + {3604870800 3600 0 IST} + {3623619600 0 1 IST} + {3636320400 3600 0 IST} + {3655069200 0 1 IST} + {3668374800 3600 0 IST} + {3686518800 0 1 IST} + {3699824400 3600 0 IST} + {3717968400 0 1 IST} + {3731274000 3600 0 IST} + {3750022800 0 1 IST} + {3762723600 3600 0 IST} + {3781472400 0 1 IST} + {3794173200 3600 0 IST} + {3812922000 0 1 IST} + {3825622800 3600 0 IST} + {3844371600 0 1 IST} + {3857677200 3600 0 IST} + {3875821200 0 1 IST} + {3889126800 3600 0 IST} + {3907270800 0 1 IST} + {3920576400 3600 0 IST} + {3939325200 0 1 IST} + {3952026000 3600 0 IST} + {3970774800 0 1 IST} + {3983475600 3600 0 IST} + {4002224400 0 1 IST} + {4015530000 3600 0 IST} + {4033674000 0 1 IST} + {4046979600 3600 0 IST} + {4065123600 0 1 IST} + {4078429200 3600 0 IST} + {4096573200 0 1 IST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Gibraltar b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Gibraltar new file mode 100644 index 00000000..de29c03a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Gibraltar @@ -0,0 +1,328 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Gibraltar) { + {-9223372036854775808 -1284 0 LMT} + {-2821649916 0 0 GMT} + {-1691964000 3600 1 BST} + {-1680472800 0 0 GMT} + {-1664143200 3600 1 BST} + {-1650146400 0 0 GMT} + {-1633903200 3600 1 BST} + {-1617487200 0 0 GMT} + {-1601848800 3600 1 BST} + {-1586037600 0 0 GMT} + {-1570399200 3600 1 BST} + {-1552168800 0 0 GMT} + {-1538344800 3600 1 BST} + {-1522533600 0 0 GMT} + {-1507500000 3600 1 BST} + {-1490565600 0 0 GMT} + {-1473631200 3600 1 BST} + {-1460930400 0 0 GMT} + {-1442786400 3600 1 BST} + {-1428876000 0 0 GMT} + {-1410732000 3600 1 BST} + {-1396216800 0 0 GMT} + {-1379282400 3600 1 BST} + {-1364767200 0 0 GMT} + {-1348437600 3600 1 BST} + {-1333317600 0 0 GMT} + {-1315778400 3600 1 BST} + {-1301263200 0 0 GMT} + {-1284328800 3600 1 BST} + {-1269813600 0 0 GMT} + {-1253484000 3600 1 BST} + {-1238364000 0 0 GMT} + {-1221429600 3600 1 BST} + {-1206914400 0 0 GMT} + {-1189980000 3600 1 BST} + {-1175464800 0 0 GMT} + {-1159135200 3600 1 BST} + {-1143410400 0 0 GMT} + {-1126476000 3600 1 BST} + {-1111960800 0 0 GMT} + {-1095631200 3600 1 BST} + {-1080511200 0 0 GMT} + {-1063576800 3600 1 BST} + {-1049061600 0 0 GMT} + {-1032127200 3600 1 BST} + {-1017612000 0 0 GMT} + {-1001282400 3600 1 BST} + {-986162400 0 0 GMT} + {-969228000 3600 1 BST} + {-950479200 0 0 GMT} + {-942012000 3600 1 BST} + {-904518000 7200 1 BDST} + {-896050800 3600 1 BST} + {-875487600 7200 1 BDST} + {-864601200 3600 1 BST} + {-844038000 7200 1 BDST} + {-832546800 3600 1 BST} + {-812588400 7200 1 BDST} + {-798073200 3600 1 BST} + {-781052400 7200 1 BDST} + {-772066800 3600 1 BST} + {-764805600 0 0 GMT} + {-748476000 3600 1 BST} + {-733356000 0 0 GMT} + {-719445600 3600 1 BST} + {-717030000 7200 1 BDST} + {-706748400 3600 1 BST} + {-699487200 0 0 GMT} + {-687996000 3600 1 BST} + {-668037600 0 0 GMT} + {-654732000 3600 1 BST} + {-636588000 0 0 GMT} + {-622072800 3600 1 BST} + {-605743200 0 0 GMT} + {-590623200 3600 1 BST} + {-574293600 0 0 GMT} + {-558568800 3600 1 BST} + {-542239200 0 0 GMT} + {-527119200 3600 1 BST} + {-512604000 0 0 GMT} + {-496274400 3600 1 BST} + {-481154400 0 0 GMT} + {-464220000 3600 1 BST} + {-449704800 0 0 GMT} + {-432165600 3600 1 BST} + {-417650400 0 0 GMT} + {-401320800 3600 0 CET} + {378687600 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Guernsey b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Guernsey new file mode 100644 index 00000000..4372c640 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Guernsey @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/London)]} { + LoadTimeZoneFile Europe/London +} +set TZData(:Europe/Guernsey) $TZData(:Europe/London) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Helsinki b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Helsinki new file mode 100644 index 00000000..39c5e781 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Helsinki @@ -0,0 +1,248 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Helsinki) { + {-9223372036854775808 5989 0 LMT} + {-2890258789 5989 0 HMT} + {-1535938789 7200 0 EET} + {-875671200 10800 1 EEST} + {-859773600 7200 0 EET} + {354672000 10800 1 EEST} + {370396800 7200 0 EET} + {386121600 10800 1 EEST} + {401846400 7200 0 EET} + {410220000 7200 0 EET} + {417574800 10800 1 EEST} + {433299600 7200 0 EET} + {449024400 10800 1 EEST} + {465354000 7200 0 EET} + {481078800 10800 1 EEST} + {496803600 7200 0 EET} + {512528400 10800 1 EEST} + {528253200 7200 0 EET} + {543978000 10800 1 EEST} + {559702800 7200 0 EET} + {575427600 10800 1 EEST} + {591152400 7200 0 EET} + {606877200 10800 1 EEST} + {622602000 7200 0 EET} + {638326800 10800 1 EEST} + {654656400 7200 0 EET} + {670381200 10800 1 EEST} + {686106000 7200 0 EET} + {701830800 10800 1 EEST} + {717555600 7200 0 EET} + {733280400 10800 1 EEST} + {749005200 7200 0 EET} + {764730000 10800 1 EEST} + {780454800 7200 0 EET} + {796179600 10800 1 EEST} + {811904400 7200 0 EET} + {828234000 10800 1 EEST} + {846378000 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Isle_of_Man b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Isle_of_Man new file mode 100644 index 00000000..870ac45c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Isle_of_Man @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/London)]} { + LoadTimeZoneFile Europe/London +} +set TZData(:Europe/Isle_of_Man) $TZData(:Europe/London) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Istanbul b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Istanbul new file mode 100644 index 00000000..a4b9b893 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Istanbul @@ -0,0 +1,125 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Istanbul) { + {-9223372036854775808 6952 0 LMT} + {-2840147752 7016 0 IMT} + {-1869875816 7200 0 EET} + {-1693706400 10800 1 EEST} + {-1680490800 7200 0 EET} + {-1570413600 10800 1 EEST} + {-1552186800 7200 0 EET} + {-1538359200 10800 1 EEST} + {-1522551600 7200 0 EET} + {-1507514400 10800 1 EEST} + {-1490583600 7200 0 EET} + {-1440208800 10800 1 EEST} + {-1428030000 7200 0 EET} + {-1409709600 10800 1 EEST} + {-1396494000 7200 0 EET} + {-931053600 10800 1 EEST} + {-922676400 7200 0 EET} + {-917834400 10800 1 EEST} + {-892436400 7200 0 EET} + {-875844000 10800 1 EEST} + {-764737200 7200 0 EET} + {-744343200 10800 1 EEST} + {-733806000 7200 0 EET} + {-716436000 10800 1 EEST} + {-701924400 7200 0 EET} + {-684986400 10800 1 EEST} + {-670474800 7200 0 EET} + {-654141600 10800 1 EEST} + {-639025200 7200 0 EET} + {-622087200 10800 1 EEST} + {-606970800 7200 0 EET} + {-590032800 10800 1 EEST} + {-575521200 7200 0 EET} + {-235620000 10800 1 EEST} + {-194842800 7200 0 EET} + {-177732000 10800 1 EEST} + {-165726000 7200 0 EET} + {107910000 10800 1 EEST} + {121215600 7200 0 EET} + {133920000 10800 1 EEST} + {152665200 7200 0 EET} + {164678400 10800 1 EEST} + {184114800 7200 0 EET} + {196214400 10800 1 EEST} + {215564400 7200 0 EET} + {228873600 10800 1 EEST} + {245804400 7200 0 EET} + {260323200 10800 1 EEST} + {267919200 10800 0 +03} + {277254000 10800 0 +03} + {428454000 14400 1 +04} + {433893600 10800 0 +03} + {468111600 7200 0 EET} + {482799600 10800 1 EEST} + {496710000 7200 0 EET} + {512521200 10800 1 EEST} + {528246000 7200 0 EET} + {543970800 10800 1 EEST} + {559695600 7200 0 EET} + {575420400 10800 1 EEST} + {591145200 7200 0 EET} + {606870000 10800 1 EEST} + {622594800 7200 0 EET} + {638319600 10800 1 EEST} + {654649200 7200 0 EET} + {670374000 10800 1 EEST} + {686098800 7200 0 EET} + {701823600 10800 1 EEST} + {717548400 7200 0 EET} + {733273200 10800 1 EEST} + {748998000 7200 0 EET} + {764118000 10800 1 EEST} + {780447600 7200 0 EET} + {796172400 10800 1 EEST} + {811897200 7200 0 EET} + {828226800 10800 1 EEST} + {846370800 7200 0 EET} + {859676400 10800 1 EEST} + {877820400 7200 0 EET} + {891126000 10800 1 EEST} + {909270000 7200 0 EET} + {922575600 10800 1 EEST} + {941324400 7200 0 EET} + {954025200 10800 1 EEST} + {972774000 7200 0 EET} + {985474800 10800 1 EEST} + {1004223600 7200 0 EET} + {1017529200 10800 1 EEST} + {1035673200 7200 0 EET} + {1048978800 10800 1 EEST} + {1067122800 7200 0 EET} + {1080428400 10800 1 EEST} + {1099177200 7200 0 EET} + {1111878000 10800 1 EEST} + {1130626800 7200 0 EET} + {1143327600 10800 1 EEST} + {1162076400 7200 0 EET} + {1167602400 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 7200 0 EET} + {1301274000 10800 0 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 7200 0 EET} + {1396227600 10800 0 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 10800 1 EEST} + {1446944400 7200 0 EET} + {1459040400 10800 1 EEST} + {1473199200 10800 0 +03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Jersey b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Jersey new file mode 100644 index 00000000..e4da5125 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Jersey @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/London)]} { + LoadTimeZoneFile Europe/London +} +set TZData(:Europe/Jersey) $TZData(:Europe/London) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kaliningrad b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kaliningrad new file mode 100644 index 00000000..2ce7f350 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kaliningrad @@ -0,0 +1,86 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Kaliningrad) { + {-9223372036854775808 4920 0 LMT} + {-2422056120 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-938905200 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-781052400 7200 1 CEST} + {-780368400 7200 0 EET} + {-778730400 10800 1 EEST} + {-762663600 7200 0 EET} + {-749095200 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 7200 0 EEMMTT} + {606873600 10800 1 EEST} + {622598400 7200 0 EET} + {638323200 10800 1 EEST} + {654652800 7200 0 EET} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {701827200 10800 1 EEST} + {717552000 7200 0 EET} + {733276800 10800 1 EEST} + {749001600 7200 0 EET} + {764726400 10800 1 EEST} + {780451200 7200 0 EET} + {796176000 10800 1 EEST} + {811900800 7200 0 EET} + {828230400 10800 1 EEST} + {846374400 7200 0 EET} + {859680000 10800 1 EEST} + {877824000 7200 0 EET} + {891129600 10800 1 EEST} + {909273600 7200 0 EET} + {922579200 10800 1 EEST} + {941328000 7200 0 EET} + {954028800 10800 1 EEST} + {972777600 7200 0 EET} + {985478400 10800 1 EEST} + {1004227200 7200 0 EET} + {1017532800 10800 1 EEST} + {1035676800 7200 0 EET} + {1048982400 10800 1 EEST} + {1067126400 7200 0 EET} + {1080432000 10800 1 EEST} + {1099180800 7200 0 EET} + {1111881600 10800 1 EEST} + {1130630400 7200 0 EET} + {1143331200 10800 1 EEST} + {1162080000 7200 0 EET} + {1174780800 10800 1 EEST} + {1193529600 7200 0 EET} + {1206835200 10800 1 EEST} + {1224979200 7200 0 EET} + {1238284800 10800 1 EEST} + {1256428800 7200 0 EET} + {1269734400 10800 1 EEST} + {1288483200 7200 0 EET} + {1301184000 10800 0 +03} + {1414278000 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kiev b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kiev new file mode 100644 index 00000000..ac5e50a6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kiev @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Kyiv)]} { + LoadTimeZoneFile Europe/Kyiv +} +set TZData(:Europe/Kiev) $TZData(:Europe/Kyiv) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kirov b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kirov new file mode 100644 index 00000000..8762d227 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kirov @@ -0,0 +1,70 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Kirov) { + {-9223372036854775808 11928 0 LMT} + {-1593820800 10800 0 +03} + {-1247540400 14400 0 +05} + {354916800 18000 1 +05} + {370724400 14400 0 +04} + {386452800 18000 1 +05} + {402260400 14400 0 +04} + {417988800 18000 1 +05} + {433796400 14400 0 +04} + {449611200 18000 1 +05} + {465343200 14400 0 +04} + {481068000 18000 1 +05} + {496792800 14400 0 +04} + {512517600 18000 1 +05} + {528242400 14400 0 +04} + {543967200 18000 1 +05} + {559692000 14400 0 +04} + {575416800 18000 1 +05} + {591141600 14400 0 +04} + {606866400 10800 0 +04} + {606870000 14400 1 +04} + {622594800 10800 0 +03} + {638319600 14400 1 +04} + {654649200 10800 0 +03} + {670374000 14400 0 +04} + {701820000 10800 0 +04} + {701823600 14400 1 +04} + {717548400 10800 0 +03} + {733273200 14400 1 +04} + {748998000 10800 0 +03} + {764722800 14400 1 +04} + {780447600 10800 0 +03} + {796172400 14400 1 +04} + {811897200 10800 0 +03} + {828226800 14400 1 +04} + {846370800 10800 0 +03} + {859676400 14400 1 +04} + {877820400 10800 0 +03} + {891126000 14400 1 +04} + {909270000 10800 0 +03} + {922575600 14400 1 +04} + {941324400 10800 0 +03} + {954025200 14400 1 +04} + {972774000 10800 0 +03} + {985474800 14400 1 +04} + {1004223600 10800 0 +03} + {1017529200 14400 1 +04} + {1035673200 10800 0 +03} + {1048978800 14400 1 +04} + {1067122800 10800 0 +03} + {1080428400 14400 1 +04} + {1099177200 10800 0 +03} + {1111878000 14400 1 +04} + {1130626800 10800 0 +03} + {1143327600 14400 1 +04} + {1162076400 10800 0 +03} + {1174777200 14400 1 +04} + {1193526000 10800 0 +03} + {1206831600 14400 1 +04} + {1224975600 10800 0 +03} + {1238281200 14400 1 +04} + {1256425200 10800 0 +03} + {1269730800 14400 1 +04} + {1288479600 10800 0 +03} + {1301180400 14400 0 +04} + {1414274400 10800 0 +03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kyiv b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kyiv new file mode 100644 index 00000000..c7c0e2f9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Kyiv @@ -0,0 +1,251 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Kyiv) { + {-9223372036854775808 7324 0 LMT} + {-2840148124 7324 0 KMT} + {-1441159324 7200 0 EET} + {-1247536800 10800 0 MSK} + {-892522800 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-825382800 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 14400 1 MSD} + {622594800 10800 0 MSK} + {638319600 14400 1 MSD} + {646786800 10800 1 EEST} + {686102400 7200 0 EET} + {701827200 10800 1 EEST} + {717552000 7200 0 EET} + {733276800 10800 1 EEST} + {749001600 7200 0 EET} + {764726400 10800 1 EEST} + {780451200 7200 0 EET} + {796176000 10800 1 EEST} + {811900800 7200 0 EET} + {828230400 10800 1 EEST} + {831938400 10800 0 EEST} + {846378000 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Lisbon b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Lisbon new file mode 100644 index 00000000..b6a069e5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Lisbon @@ -0,0 +1,353 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Lisbon) { + {-9223372036854775808 -2205 0 LMT} + {-2713908195 -2205 0 LMT} + {-1830384000 0 0 WET} + {-1689555600 3600 1 WEST} + {-1677801600 0 0 WET} + {-1667437200 3600 1 WEST} + {-1647738000 0 0 WET} + {-1635814800 3600 1 WEST} + {-1616202000 0 0 WET} + {-1604365200 3600 1 WEST} + {-1584666000 0 0 WET} + {-1572742800 3600 1 WEST} + {-1553043600 0 0 WET} + {-1541206800 3600 1 WEST} + {-1521507600 0 0 WET} + {-1442451600 3600 1 WEST} + {-1426813200 0 0 WET} + {-1379293200 3600 1 WEST} + {-1364778000 0 0 WET} + {-1348448400 3600 1 WEST} + {-1333328400 0 0 WET} + {-1316394000 3600 1 WEST} + {-1301274000 0 0 WET} + {-1284339600 3600 1 WEST} + {-1269824400 0 0 WET} + {-1221440400 3600 1 WEST} + {-1206925200 0 0 WET} + {-1191200400 3600 1 WEST} + {-1175475600 0 0 WET} + {-1127696400 3600 1 WEST} + {-1111971600 0 0 WET} + {-1096851600 3600 1 WEST} + {-1080522000 0 0 WET} + {-1063587600 3600 1 WEST} + {-1049072400 0 0 WET} + {-1033347600 3600 1 WEST} + {-1017622800 0 0 WET} + {-1002502800 3600 1 WEST} + {-986173200 0 0 WET} + {-969238800 3600 1 WEST} + {-950490000 0 0 WET} + {-942022800 3600 1 WEST} + {-922669200 0 0 WET} + {-906944400 3600 1 WEST} + {-891133200 0 0 WET} + {-877309200 3600 1 WEST} + {-873684000 7200 1 WEMT} + {-864007200 3600 1 WEST} + {-857955600 0 0 WET} + {-845859600 3600 1 WEST} + {-842839200 7200 1 WEMT} + {-831348000 3600 1 WEST} + {-825901200 0 0 WET} + {-814410000 3600 1 WEST} + {-810784800 7200 1 WEMT} + {-799898400 3600 1 WEST} + {-794451600 0 0 WET} + {-782960400 3600 1 WEST} + {-779335200 7200 1 WEMT} + {-768448800 3600 1 WEST} + {-763002000 0 0 WET} + {-749091600 3600 1 WEST} + {-733366800 0 0 WET} + {-717631200 3600 1 WEST} + {-701906400 0 0 WET} + {-686181600 3600 1 WEST} + {-670456800 0 0 WET} + {-654732000 3600 1 WEST} + {-639007200 0 0 WET} + {-623282400 3600 1 WEST} + {-607557600 0 0 WET} + {-591832800 3600 1 WEST} + {-575503200 0 0 WET} + {-559778400 3600 1 WEST} + {-544053600 0 0 WET} + {-528328800 3600 1 WEST} + {-512604000 0 0 WET} + {-496879200 3600 1 WEST} + {-481154400 0 0 WET} + {-465429600 3600 1 WEST} + {-449704800 0 0 WET} + {-433980000 3600 1 WEST} + {-417650400 0 0 WET} + {-401925600 3600 1 WEST} + {-386200800 0 0 WET} + {-370476000 3600 1 WEST} + {-354751200 0 0 WET} + {-339026400 3600 1 WEST} + {-323301600 0 0 WET} + {-307576800 3600 1 WEST} + {-291852000 0 0 WET} + {-276127200 3600 1 WEST} + {-260402400 0 0 WET} + {-244677600 3600 1 WEST} + {-228348000 0 0 WET} + {-212623200 3600 1 WEST} + {-196898400 0 0 WET} + {-181173600 3600 1 WEST} + {-165448800 0 0 WET} + {-149724000 3600 1 WEST} + {-133999200 0 0 WET} + {-118274400 3600 0 CET} + {212544000 0 0 WET} + {228268800 3600 1 WEST} + {243993600 0 0 WET} + {260323200 3600 1 WEST} + {276048000 0 0 WET} + {291772800 3600 1 WEST} + {307501200 0 0 WET} + {323222400 3600 1 WEST} + {338950800 0 0 WET} + {354675600 3600 1 WEST} + {370400400 0 0 WET} + {386125200 3600 1 WEST} + {401850000 0 0 WET} + {417578400 3600 1 WEST} + {433299600 0 0 WET} + {449024400 3600 1 WEST} + {465354000 0 0 WET} + {481078800 3600 1 WEST} + {496803600 0 0 WET} + {512528400 3600 1 WEST} + {528253200 0 0 WET} + {543978000 3600 1 WEST} + {559702800 0 0 WET} + {575427600 3600 1 WEST} + {591152400 0 0 WET} + {606877200 3600 1 WEST} + {622602000 0 0 WET} + {638326800 3600 1 WEST} + {654656400 0 0 WET} + {670381200 3600 1 WEST} + {686106000 0 0 WET} + {701830800 3600 1 WEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 3600 0 WEST} + {846378000 0 0 WET} + {859683600 3600 1 WEST} + {877827600 0 0 WET} + {891133200 3600 1 WEST} + {909277200 0 0 WET} + {922582800 3600 1 WEST} + {941331600 0 0 WET} + {954032400 3600 1 WEST} + {972781200 0 0 WET} + {985482000 3600 1 WEST} + {1004230800 0 0 WET} + {1017536400 3600 1 WEST} + {1035680400 0 0 WET} + {1048986000 3600 1 WEST} + {1067130000 0 0 WET} + {1080435600 3600 1 WEST} + {1099184400 0 0 WET} + {1111885200 3600 1 WEST} + {1130634000 0 0 WET} + {1143334800 3600 1 WEST} + {1162083600 0 0 WET} + {1174784400 3600 1 WEST} + {1193533200 0 0 WET} + {1206838800 3600 1 WEST} + {1224982800 0 0 WET} + {1238288400 3600 1 WEST} + {1256432400 0 0 WET} + {1269738000 3600 1 WEST} + {1288486800 0 0 WET} + {1301187600 3600 1 WEST} + {1319936400 0 0 WET} + {1332637200 3600 1 WEST} + {1351386000 0 0 WET} + {1364691600 3600 1 WEST} + {1382835600 0 0 WET} + {1396141200 3600 1 WEST} + {1414285200 0 0 WET} + {1427590800 3600 1 WEST} + {1445734800 0 0 WET} + {1459040400 3600 1 WEST} + {1477789200 0 0 WET} + {1490490000 3600 1 WEST} + {1509238800 0 0 WET} + {1521939600 3600 1 WEST} + {1540688400 0 0 WET} + {1553994000 3600 1 WEST} + {1572138000 0 0 WET} + {1585443600 3600 1 WEST} + {1603587600 0 0 WET} + {1616893200 3600 1 WEST} + {1635642000 0 0 WET} + {1648342800 3600 1 WEST} + {1667091600 0 0 WET} + {1679792400 3600 1 WEST} + {1698541200 0 0 WET} + {1711846800 3600 1 WEST} + {1729990800 0 0 WET} + {1743296400 3600 1 WEST} + {1761440400 0 0 WET} + {1774746000 3600 1 WEST} + {1792890000 0 0 WET} + {1806195600 3600 1 WEST} + {1824944400 0 0 WET} + {1837645200 3600 1 WEST} + {1856394000 0 0 WET} + {1869094800 3600 1 WEST} + {1887843600 0 0 WET} + {1901149200 3600 1 WEST} + {1919293200 0 0 WET} + {1932598800 3600 1 WEST} + {1950742800 0 0 WET} + {1964048400 3600 1 WEST} + {1982797200 0 0 WET} + {1995498000 3600 1 WEST} + {2014246800 0 0 WET} + {2026947600 3600 1 WEST} + {2045696400 0 0 WET} + {2058397200 3600 1 WEST} + {2077146000 0 0 WET} + {2090451600 3600 1 WEST} + {2108595600 0 0 WET} + {2121901200 3600 1 WEST} + {2140045200 0 0 WET} + {2153350800 3600 1 WEST} + {2172099600 0 0 WET} + {2184800400 3600 1 WEST} + {2203549200 0 0 WET} + {2216250000 3600 1 WEST} + {2234998800 0 0 WET} + {2248304400 3600 1 WEST} + {2266448400 0 0 WET} + {2279754000 3600 1 WEST} + {2297898000 0 0 WET} + {2311203600 3600 1 WEST} + {2329347600 0 0 WET} + {2342653200 3600 1 WEST} + {2361402000 0 0 WET} + {2374102800 3600 1 WEST} + {2392851600 0 0 WET} + {2405552400 3600 1 WEST} + {2424301200 0 0 WET} + {2437606800 3600 1 WEST} + {2455750800 0 0 WET} + {2469056400 3600 1 WEST} + {2487200400 0 0 WET} + {2500506000 3600 1 WEST} + {2519254800 0 0 WET} + {2531955600 3600 1 WEST} + {2550704400 0 0 WET} + {2563405200 3600 1 WEST} + {2582154000 0 0 WET} + {2595459600 3600 1 WEST} + {2613603600 0 0 WET} + {2626909200 3600 1 WEST} + {2645053200 0 0 WET} + {2658358800 3600 1 WEST} + {2676502800 0 0 WET} + {2689808400 3600 1 WEST} + {2708557200 0 0 WET} + {2721258000 3600 1 WEST} + {2740006800 0 0 WET} + {2752707600 3600 1 WEST} + {2771456400 0 0 WET} + {2784762000 3600 1 WEST} + {2802906000 0 0 WET} + {2816211600 3600 1 WEST} + {2834355600 0 0 WET} + {2847661200 3600 1 WEST} + {2866410000 0 0 WET} + {2879110800 3600 1 WEST} + {2897859600 0 0 WET} + {2910560400 3600 1 WEST} + {2929309200 0 0 WET} + {2942010000 3600 1 WEST} + {2960758800 0 0 WET} + {2974064400 3600 1 WEST} + {2992208400 0 0 WET} + {3005514000 3600 1 WEST} + {3023658000 0 0 WET} + {3036963600 3600 1 WEST} + {3055712400 0 0 WET} + {3068413200 3600 1 WEST} + {3087162000 0 0 WET} + {3099862800 3600 1 WEST} + {3118611600 0 0 WET} + {3131917200 3600 1 WEST} + {3150061200 0 0 WET} + {3163366800 3600 1 WEST} + {3181510800 0 0 WET} + {3194816400 3600 1 WEST} + {3212960400 0 0 WET} + {3226266000 3600 1 WEST} + {3245014800 0 0 WET} + {3257715600 3600 1 WEST} + {3276464400 0 0 WET} + {3289165200 3600 1 WEST} + {3307914000 0 0 WET} + {3321219600 3600 1 WEST} + {3339363600 0 0 WET} + {3352669200 3600 1 WEST} + {3370813200 0 0 WET} + {3384118800 3600 1 WEST} + {3402867600 0 0 WET} + {3415568400 3600 1 WEST} + {3434317200 0 0 WET} + {3447018000 3600 1 WEST} + {3465766800 0 0 WET} + {3479072400 3600 1 WEST} + {3497216400 0 0 WET} + {3510522000 3600 1 WEST} + {3528666000 0 0 WET} + {3541971600 3600 1 WEST} + {3560115600 0 0 WET} + {3573421200 3600 1 WEST} + {3592170000 0 0 WET} + {3604870800 3600 1 WEST} + {3623619600 0 0 WET} + {3636320400 3600 1 WEST} + {3655069200 0 0 WET} + {3668374800 3600 1 WEST} + {3686518800 0 0 WET} + {3699824400 3600 1 WEST} + {3717968400 0 0 WET} + {3731274000 3600 1 WEST} + {3750022800 0 0 WET} + {3762723600 3600 1 WEST} + {3781472400 0 0 WET} + {3794173200 3600 1 WEST} + {3812922000 0 0 WET} + {3825622800 3600 1 WEST} + {3844371600 0 0 WET} + {3857677200 3600 1 WEST} + {3875821200 0 0 WET} + {3889126800 3600 1 WEST} + {3907270800 0 0 WET} + {3920576400 3600 1 WEST} + {3939325200 0 0 WET} + {3952026000 3600 1 WEST} + {3970774800 0 0 WET} + {3983475600 3600 1 WEST} + {4002224400 0 0 WET} + {4015530000 3600 1 WEST} + {4033674000 0 0 WET} + {4046979600 3600 1 WEST} + {4065123600 0 0 WET} + {4078429200 3600 1 WEST} + {4096573200 0 0 WET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/London b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/London new file mode 100644 index 00000000..2014e00e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/London @@ -0,0 +1,372 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/London) { + {-9223372036854775808 -75 0 LMT} + {-3852662325 0 0 GMT} + {-1691964000 3600 1 BST} + {-1680472800 0 0 GMT} + {-1664143200 3600 1 BST} + {-1650146400 0 0 GMT} + {-1633903200 3600 1 BST} + {-1617487200 0 0 GMT} + {-1601848800 3600 1 BST} + {-1586037600 0 0 GMT} + {-1570399200 3600 1 BST} + {-1552168800 0 0 GMT} + {-1538344800 3600 1 BST} + {-1522533600 0 0 GMT} + {-1507500000 3600 1 BST} + {-1490565600 0 0 GMT} + {-1473631200 3600 1 BST} + {-1460930400 0 0 GMT} + {-1442786400 3600 1 BST} + {-1428876000 0 0 GMT} + {-1410732000 3600 1 BST} + {-1396216800 0 0 GMT} + {-1379282400 3600 1 BST} + {-1364767200 0 0 GMT} + {-1348437600 3600 1 BST} + {-1333317600 0 0 GMT} + {-1315778400 3600 1 BST} + {-1301263200 0 0 GMT} + {-1284328800 3600 1 BST} + {-1269813600 0 0 GMT} + {-1253484000 3600 1 BST} + {-1238364000 0 0 GMT} + {-1221429600 3600 1 BST} + {-1206914400 0 0 GMT} + {-1189980000 3600 1 BST} + {-1175464800 0 0 GMT} + {-1159135200 3600 1 BST} + {-1143410400 0 0 GMT} + {-1126476000 3600 1 BST} + {-1111960800 0 0 GMT} + {-1095631200 3600 1 BST} + {-1080511200 0 0 GMT} + {-1063576800 3600 1 BST} + {-1049061600 0 0 GMT} + {-1032127200 3600 1 BST} + {-1017612000 0 0 GMT} + {-1001282400 3600 1 BST} + {-986162400 0 0 GMT} + {-969228000 3600 1 BST} + {-950479200 0 0 GMT} + {-942012000 3600 1 BST} + {-904518000 7200 1 BDST} + {-896050800 3600 1 BST} + {-875487600 7200 1 BDST} + {-864601200 3600 1 BST} + {-844038000 7200 1 BDST} + {-832546800 3600 1 BST} + {-812588400 7200 1 BDST} + {-798073200 3600 1 BST} + {-781052400 7200 1 BDST} + {-772066800 3600 1 BST} + {-764805600 0 0 GMT} + {-748476000 3600 1 BST} + {-733356000 0 0 GMT} + {-719445600 3600 1 BST} + {-717030000 7200 1 BDST} + {-706748400 3600 1 BST} + {-699487200 0 0 GMT} + {-687996000 3600 1 BST} + {-668037600 0 0 GMT} + {-654732000 3600 1 BST} + {-636588000 0 0 GMT} + {-622072800 3600 1 BST} + {-605743200 0 0 GMT} + {-590623200 3600 1 BST} + {-574293600 0 0 GMT} + {-558568800 3600 1 BST} + {-542239200 0 0 GMT} + {-527119200 3600 1 BST} + {-512604000 0 0 GMT} + {-496274400 3600 1 BST} + {-481154400 0 0 GMT} + {-464220000 3600 1 BST} + {-449704800 0 0 GMT} + {-432165600 3600 1 BST} + {-417650400 0 0 GMT} + {-401320800 3600 1 BST} + {-386200800 0 0 GMT} + {-369266400 3600 1 BST} + {-354751200 0 0 GMT} + {-337816800 3600 1 BST} + {-323301600 0 0 GMT} + {-306972000 3600 1 BST} + {-291852000 0 0 GMT} + {-276732000 3600 1 BST} + {-257983200 0 0 GMT} + {-245282400 3600 1 BST} + {-226533600 0 0 GMT} + {-213228000 3600 1 BST} + {-195084000 0 0 GMT} + {-182383200 3600 1 BST} + {-163634400 0 0 GMT} + {-150933600 3600 1 BST} + {-132184800 0 0 GMT} + {-119484000 3600 1 BST} + {-100735200 0 0 GMT} + {-88034400 3600 1 BST} + {-68680800 0 0 GMT} + {-59004000 3600 1 BST} + {-37238400 3600 0 BST} + {57722400 0 0 GMT} + {69818400 3600 1 BST} + {89172000 0 0 GMT} + {101268000 3600 1 BST} + {120621600 0 0 GMT} + {132717600 3600 1 BST} + {152071200 0 0 GMT} + {164167200 3600 1 BST} + {183520800 0 0 GMT} + {196221600 3600 1 BST} + {214970400 0 0 GMT} + {227671200 3600 1 BST} + {246420000 0 0 GMT} + {259120800 3600 1 BST} + {278474400 0 0 GMT} + {290570400 3600 1 BST} + {309924000 0 0 GMT} + {322020000 3600 1 BST} + {341373600 0 0 GMT} + {354675600 3600 1 BST} + {372819600 0 0 GMT} + {386125200 3600 1 BST} + {404269200 0 0 GMT} + {417574800 3600 1 BST} + {435718800 0 0 GMT} + {449024400 3600 1 BST} + {467773200 0 0 GMT} + {481078800 3600 1 BST} + {499222800 0 0 GMT} + {512528400 3600 1 BST} + {530672400 0 0 GMT} + {543978000 3600 1 BST} + {562122000 0 0 GMT} + {575427600 3600 1 BST} + {593571600 0 0 GMT} + {606877200 3600 1 BST} + {625626000 0 0 GMT} + {638326800 3600 1 BST} + {657075600 0 0 GMT} + {670381200 3600 1 BST} + {688525200 0 0 GMT} + {701830800 3600 1 BST} + {719974800 0 0 GMT} + {733280400 3600 1 BST} + {751424400 0 0 GMT} + {764730000 3600 1 BST} + {782874000 0 0 GMT} + {796179600 3600 1 BST} + {814323600 0 0 GMT} + {820454400 0 0 GMT} + {828234000 3600 1 BST} + {846378000 0 0 GMT} + {859683600 3600 1 BST} + {877827600 0 0 GMT} + {891133200 3600 1 BST} + {909277200 0 0 GMT} + {922582800 3600 1 BST} + {941331600 0 0 GMT} + {954032400 3600 1 BST} + {972781200 0 0 GMT} + {985482000 3600 1 BST} + {1004230800 0 0 GMT} + {1017536400 3600 1 BST} + {1035680400 0 0 GMT} + {1048986000 3600 1 BST} + {1067130000 0 0 GMT} + {1080435600 3600 1 BST} + {1099184400 0 0 GMT} + {1111885200 3600 1 BST} + {1130634000 0 0 GMT} + {1143334800 3600 1 BST} + {1162083600 0 0 GMT} + {1174784400 3600 1 BST} + {1193533200 0 0 GMT} + {1206838800 3600 1 BST} + {1224982800 0 0 GMT} + {1238288400 3600 1 BST} + {1256432400 0 0 GMT} + {1269738000 3600 1 BST} + {1288486800 0 0 GMT} + {1301187600 3600 1 BST} + {1319936400 0 0 GMT} + {1332637200 3600 1 BST} + {1351386000 0 0 GMT} + {1364691600 3600 1 BST} + {1382835600 0 0 GMT} + {1396141200 3600 1 BST} + {1414285200 0 0 GMT} + {1427590800 3600 1 BST} + {1445734800 0 0 GMT} + {1459040400 3600 1 BST} + {1477789200 0 0 GMT} + {1490490000 3600 1 BST} + {1509238800 0 0 GMT} + {1521939600 3600 1 BST} + {1540688400 0 0 GMT} + {1553994000 3600 1 BST} + {1572138000 0 0 GMT} + {1585443600 3600 1 BST} + {1603587600 0 0 GMT} + {1616893200 3600 1 BST} + {1635642000 0 0 GMT} + {1648342800 3600 1 BST} + {1667091600 0 0 GMT} + {1679792400 3600 1 BST} + {1698541200 0 0 GMT} + {1711846800 3600 1 BST} + {1729990800 0 0 GMT} + {1743296400 3600 1 BST} + {1761440400 0 0 GMT} + {1774746000 3600 1 BST} + {1792890000 0 0 GMT} + {1806195600 3600 1 BST} + {1824944400 0 0 GMT} + {1837645200 3600 1 BST} + {1856394000 0 0 GMT} + {1869094800 3600 1 BST} + {1887843600 0 0 GMT} + {1901149200 3600 1 BST} + {1919293200 0 0 GMT} + {1932598800 3600 1 BST} + {1950742800 0 0 GMT} + {1964048400 3600 1 BST} + {1982797200 0 0 GMT} + {1995498000 3600 1 BST} + {2014246800 0 0 GMT} + {2026947600 3600 1 BST} + {2045696400 0 0 GMT} + {2058397200 3600 1 BST} + {2077146000 0 0 GMT} + {2090451600 3600 1 BST} + {2108595600 0 0 GMT} + {2121901200 3600 1 BST} + {2140045200 0 0 GMT} + {2153350800 3600 1 BST} + {2172099600 0 0 GMT} + {2184800400 3600 1 BST} + {2203549200 0 0 GMT} + {2216250000 3600 1 BST} + {2234998800 0 0 GMT} + {2248304400 3600 1 BST} + {2266448400 0 0 GMT} + {2279754000 3600 1 BST} + {2297898000 0 0 GMT} + {2311203600 3600 1 BST} + {2329347600 0 0 GMT} + {2342653200 3600 1 BST} + {2361402000 0 0 GMT} + {2374102800 3600 1 BST} + {2392851600 0 0 GMT} + {2405552400 3600 1 BST} + {2424301200 0 0 GMT} + {2437606800 3600 1 BST} + {2455750800 0 0 GMT} + {2469056400 3600 1 BST} + {2487200400 0 0 GMT} + {2500506000 3600 1 BST} + {2519254800 0 0 GMT} + {2531955600 3600 1 BST} + {2550704400 0 0 GMT} + {2563405200 3600 1 BST} + {2582154000 0 0 GMT} + {2595459600 3600 1 BST} + {2613603600 0 0 GMT} + {2626909200 3600 1 BST} + {2645053200 0 0 GMT} + {2658358800 3600 1 BST} + {2676502800 0 0 GMT} + {2689808400 3600 1 BST} + {2708557200 0 0 GMT} + {2721258000 3600 1 BST} + {2740006800 0 0 GMT} + {2752707600 3600 1 BST} + {2771456400 0 0 GMT} + {2784762000 3600 1 BST} + {2802906000 0 0 GMT} + {2816211600 3600 1 BST} + {2834355600 0 0 GMT} + {2847661200 3600 1 BST} + {2866410000 0 0 GMT} + {2879110800 3600 1 BST} + {2897859600 0 0 GMT} + {2910560400 3600 1 BST} + {2929309200 0 0 GMT} + {2942010000 3600 1 BST} + {2960758800 0 0 GMT} + {2974064400 3600 1 BST} + {2992208400 0 0 GMT} + {3005514000 3600 1 BST} + {3023658000 0 0 GMT} + {3036963600 3600 1 BST} + {3055712400 0 0 GMT} + {3068413200 3600 1 BST} + {3087162000 0 0 GMT} + {3099862800 3600 1 BST} + {3118611600 0 0 GMT} + {3131917200 3600 1 BST} + {3150061200 0 0 GMT} + {3163366800 3600 1 BST} + {3181510800 0 0 GMT} + {3194816400 3600 1 BST} + {3212960400 0 0 GMT} + {3226266000 3600 1 BST} + {3245014800 0 0 GMT} + {3257715600 3600 1 BST} + {3276464400 0 0 GMT} + {3289165200 3600 1 BST} + {3307914000 0 0 GMT} + {3321219600 3600 1 BST} + {3339363600 0 0 GMT} + {3352669200 3600 1 BST} + {3370813200 0 0 GMT} + {3384118800 3600 1 BST} + {3402867600 0 0 GMT} + {3415568400 3600 1 BST} + {3434317200 0 0 GMT} + {3447018000 3600 1 BST} + {3465766800 0 0 GMT} + {3479072400 3600 1 BST} + {3497216400 0 0 GMT} + {3510522000 3600 1 BST} + {3528666000 0 0 GMT} + {3541971600 3600 1 BST} + {3560115600 0 0 GMT} + {3573421200 3600 1 BST} + {3592170000 0 0 GMT} + {3604870800 3600 1 BST} + {3623619600 0 0 GMT} + {3636320400 3600 1 BST} + {3655069200 0 0 GMT} + {3668374800 3600 1 BST} + {3686518800 0 0 GMT} + {3699824400 3600 1 BST} + {3717968400 0 0 GMT} + {3731274000 3600 1 BST} + {3750022800 0 0 GMT} + {3762723600 3600 1 BST} + {3781472400 0 0 GMT} + {3794173200 3600 1 BST} + {3812922000 0 0 GMT} + {3825622800 3600 1 BST} + {3844371600 0 0 GMT} + {3857677200 3600 1 BST} + {3875821200 0 0 GMT} + {3889126800 3600 1 BST} + {3907270800 0 0 GMT} + {3920576400 3600 1 BST} + {3939325200 0 0 GMT} + {3952026000 3600 1 BST} + {3970774800 0 0 GMT} + {3983475600 3600 1 BST} + {4002224400 0 0 GMT} + {4015530000 3600 1 BST} + {4033674000 0 0 GMT} + {4046979600 3600 1 BST} + {4065123600 0 0 GMT} + {4078429200 3600 1 BST} + {4096573200 0 0 GMT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Luxembourg b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Luxembourg new file mode 100644 index 00000000..da3ebe29 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Luxembourg @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Brussels)]} { + LoadTimeZoneFile Europe/Brussels +} +set TZData(:Europe/Luxembourg) $TZData(:Europe/Brussels) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Madrid b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Madrid new file mode 100644 index 00000000..f4dd4845 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Madrid @@ -0,0 +1,292 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Madrid) { + {-9223372036854775808 -884 0 LMT} + {-2177452800 0 0 WET} + {-1631926800 3600 1 WEST} + {-1616889600 0 0 WET} + {-1601168400 3600 1 WEST} + {-1585353600 0 0 WET} + {-1442451600 3600 1 WEST} + {-1427673600 0 0 WET} + {-1379293200 3600 1 WEST} + {-1364774400 0 0 WET} + {-1348448400 3600 1 WEST} + {-1333324800 0 0 WET} + {-1316390400 3600 1 WEST} + {-1301270400 0 0 WET} + {-1284339600 3600 1 WEST} + {-1269820800 0 0 WET} + {-1026954000 3600 1 WEST} + {-1017619200 0 0 WET} + {-1001898000 3600 1 WEST} + {-999482400 7200 1 WEMT} + {-986090400 3600 1 WEST} + {-954115200 0 0 WET} + {-940208400 3600 0 CET} + {-873079200 7200 1 CEST} + {-862621200 3600 0 CET} + {-842839200 7200 1 CEST} + {-828320400 3600 0 CET} + {-811389600 7200 1 CEST} + {-796870800 3600 0 CET} + {-779940000 7200 1 CEST} + {-765421200 3600 0 CET} + {-748490400 7200 1 CEST} + {-733971600 3600 0 CET} + {-652327200 7200 1 CEST} + {-639018000 3600 0 CET} + {135122400 7200 1 CEST} + {150246000 3600 0 CET} + {166572000 7200 1 CEST} + {181695600 3600 0 CET} + {196812000 7200 1 CEST} + {212540400 3600 0 CET} + {228866400 7200 1 CEST} + {243990000 3600 0 CET} + {260326800 7200 1 CEST} + {276051600 3600 0 CET} + {283993200 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Mariehamn b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Mariehamn new file mode 100644 index 00000000..26d9177b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Mariehamn @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Helsinki)]} { + LoadTimeZoneFile Europe/Helsinki +} +set TZData(:Europe/Mariehamn) $TZData(:Europe/Helsinki) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Minsk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Minsk new file mode 100644 index 00000000..7a6232e7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Minsk @@ -0,0 +1,75 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Minsk) { + {-9223372036854775808 6616 0 LMT} + {-2840147416 6600 0 MMT} + {-1441158600 7200 0 EET} + {-1247536800 10800 0 MSK} + {-899780400 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-804646800 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 14400 1 MSD} + {622594800 10800 0 MSK} + {631141200 10800 0 MSK} + {670374000 7200 0 EEMMTT} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {701827200 10800 1 EEST} + {717552000 7200 0 EET} + {733276800 10800 1 EEST} + {749001600 7200 0 EET} + {764726400 10800 1 EEST} + {780451200 7200 0 EET} + {796176000 10800 1 EEST} + {811900800 7200 0 EET} + {828230400 10800 1 EEST} + {846374400 7200 0 EET} + {859680000 10800 1 EEST} + {877824000 7200 0 EET} + {891129600 10800 1 EEST} + {909273600 7200 0 EET} + {922579200 10800 1 EEST} + {941328000 7200 0 EET} + {954028800 10800 1 EEST} + {972777600 7200 0 EET} + {985478400 10800 1 EEST} + {1004227200 7200 0 EET} + {1017532800 10800 1 EEST} + {1035676800 7200 0 EET} + {1048982400 10800 1 EEST} + {1067126400 7200 0 EET} + {1080432000 10800 1 EEST} + {1099180800 7200 0 EET} + {1111881600 10800 1 EEST} + {1130630400 7200 0 EET} + {1143331200 10800 1 EEST} + {1162080000 7200 0 EET} + {1174780800 10800 1 EEST} + {1193529600 7200 0 EET} + {1206835200 10800 1 EEST} + {1224979200 7200 0 EET} + {1238284800 10800 1 EEST} + {1256428800 7200 0 EET} + {1269734400 10800 1 EEST} + {1288483200 7200 0 EET} + {1301184000 10800 0 +03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Monaco b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Monaco new file mode 100644 index 00000000..54f9d277 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Monaco @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Paris)]} { + LoadTimeZoneFile Europe/Paris +} +set TZData(:Europe/Monaco) $TZData(:Europe/Paris) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Moscow b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Moscow new file mode 100644 index 00000000..9b513b11 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Moscow @@ -0,0 +1,83 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Moscow) { + {-9223372036854775808 9017 0 LMT} + {-2840149817 9017 0 MMT} + {-1688265017 9079 0 MMT} + {-1656819079 12679 1 MST} + {-1641353479 9079 0 MMT} + {-1627965079 16279 1 MDST} + {-1618716679 12679 1 MST} + {-1596429079 16279 1 MDST} + {-1593820800 14400 0 MSD} + {-1589860800 10800 0 MSK} + {-1542427200 14400 1 MSD} + {-1539493200 18000 1 +05} + {-1525323600 14400 1 MSD} + {-1491188400 7200 0 EET} + {-1247536800 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 14400 1 MSD} + {622594800 10800 0 MSK} + {638319600 14400 1 MSD} + {654649200 10800 0 MSK} + {670374000 7200 0 EEMMTT} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {695779200 10800 0 MSD} + {701823600 14400 1 MSD} + {717548400 10800 0 MSK} + {733273200 14400 1 MSD} + {748998000 10800 0 MSK} + {764722800 14400 1 MSD} + {780447600 10800 0 MSK} + {796172400 14400 1 MSD} + {811897200 10800 0 MSK} + {828226800 14400 1 MSD} + {846370800 10800 0 MSK} + {859676400 14400 1 MSD} + {877820400 10800 0 MSK} + {891126000 14400 1 MSD} + {909270000 10800 0 MSK} + {922575600 14400 1 MSD} + {941324400 10800 0 MSK} + {954025200 14400 1 MSD} + {972774000 10800 0 MSK} + {985474800 14400 1 MSD} + {1004223600 10800 0 MSK} + {1017529200 14400 1 MSD} + {1035673200 10800 0 MSK} + {1048978800 14400 1 MSD} + {1067122800 10800 0 MSK} + {1080428400 14400 1 MSD} + {1099177200 10800 0 MSK} + {1111878000 14400 1 MSD} + {1130626800 10800 0 MSK} + {1143327600 14400 1 MSD} + {1162076400 10800 0 MSK} + {1174777200 14400 1 MSD} + {1193526000 10800 0 MSK} + {1206831600 14400 1 MSD} + {1224975600 10800 0 MSK} + {1238281200 14400 1 MSD} + {1256425200 10800 0 MSK} + {1269730800 14400 1 MSD} + {1288479600 10800 0 MSK} + {1301180400 14400 0 MSK} + {1414274400 10800 0 MSK} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Oslo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Oslo new file mode 100644 index 00000000..d6d564da --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Oslo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Berlin)]} { + LoadTimeZoneFile Europe/Berlin +} +set TZData(:Europe/Oslo) $TZData(:Europe/Berlin) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Paris b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Paris new file mode 100644 index 00000000..7208e554 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Paris @@ -0,0 +1,314 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Paris) { + {-9223372036854775808 561 0 LMT} + {-2486592561 561 0 PMT} + {-1855958961 0 0 WET} + {-1689814800 3600 1 WEST} + {-1680397200 0 0 WET} + {-1665363600 3600 1 WEST} + {-1648342800 0 0 WET} + {-1635123600 3600 1 WEST} + {-1616893200 0 0 WET} + {-1604278800 3600 1 WEST} + {-1585443600 0 0 WET} + {-1574038800 3600 1 WEST} + {-1552266000 0 0 WET} + {-1539997200 3600 1 WEST} + {-1520557200 0 0 WET} + {-1507510800 3600 1 WEST} + {-1490576400 0 0 WET} + {-1470618000 3600 1 WEST} + {-1459126800 0 0 WET} + {-1444006800 3600 1 WEST} + {-1427677200 0 0 WET} + {-1411952400 3600 1 WEST} + {-1396227600 0 0 WET} + {-1379293200 3600 1 WEST} + {-1364778000 0 0 WET} + {-1348448400 3600 1 WEST} + {-1333328400 0 0 WET} + {-1316394000 3600 1 WEST} + {-1301274000 0 0 WET} + {-1284339600 3600 1 WEST} + {-1269824400 0 0 WET} + {-1253494800 3600 1 WEST} + {-1238374800 0 0 WET} + {-1221440400 3600 1 WEST} + {-1206925200 0 0 WET} + {-1191200400 3600 1 WEST} + {-1175475600 0 0 WET} + {-1160355600 3600 1 WEST} + {-1143421200 0 0 WET} + {-1127696400 3600 1 WEST} + {-1111971600 0 0 WET} + {-1096851600 3600 1 WEST} + {-1080522000 0 0 WET} + {-1063587600 3600 1 WEST} + {-1049072400 0 0 WET} + {-1033347600 3600 1 WEST} + {-1017622800 0 0 WET} + {-1002502800 3600 1 WEST} + {-986173200 0 0 WET} + {-969238800 3600 1 WEST} + {-950490000 0 0 WET} + {-942012000 3600 1 WEST} + {-932436000 7200 0 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-800067600 7200 0 WEMT} + {-796266000 3600 1 WEST} + {-781052400 7200 1 WEMT} + {-766616400 3600 0 CET} + {196819200 7200 1 CEST} + {212540400 3600 0 CET} + {220921200 3600 0 CET} + {228877200 7200 1 CEST} + {243997200 3600 0 CET} + {260326800 7200 1 CEST} + {276051600 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Prague b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Prague new file mode 100644 index 00000000..34df8ed1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Prague @@ -0,0 +1,275 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Prague) { + {-9223372036854775808 3464 0 LMT} + {-3786829064 3464 0 PMT} + {-2469401864 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-938905200 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-781052400 7200 1 CEST} + {-777862800 7200 0 CEST} + {-765327600 3600 0 CET} + {-746578800 7200 1 CEST} + {-733359600 3600 0 CET} + {-728517600 0 1 GMT} + {-721260000 0 0 CET} + {-716425200 7200 1 CEST} + {-701910000 3600 0 CET} + {-684975600 7200 1 CEST} + {-670460400 3600 0 CET} + {-654217200 7200 1 CEST} + {-639010800 3600 0 CET} + {283993200 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Rome b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Rome new file mode 100644 index 00000000..932754f0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Rome @@ -0,0 +1,302 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Rome) { + {-9223372036854775808 2996 0 LMT} + {-3252098996 2996 0 RMT} + {-2403565200 3600 0 CET} + {-1690765200 7200 1 CEST} + {-1680487200 3600 0 CET} + {-1664758800 7200 1 CEST} + {-1648951200 3600 0 CET} + {-1635123600 7200 1 CEST} + {-1616896800 3600 0 CET} + {-1604278800 7200 1 CEST} + {-1585533600 3600 0 CET} + {-1571014800 7200 1 CEST} + {-1555293600 3600 0 CET} + {-932432400 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-830307600 7200 0 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-807152400 7200 0 CEST} + {-798073200 3600 0 CET} + {-781052400 7200 1 CEST} + {-766717200 3600 0 CET} + {-750898800 7200 1 CEST} + {-733359600 3600 0 CET} + {-719456400 7200 1 CEST} + {-701917200 3600 0 CET} + {-689209200 7200 1 CEST} + {-670460400 3600 0 CET} + {-114051600 7200 1 CEST} + {-103168800 3600 0 CET} + {-81997200 7200 1 CEST} + {-71715600 3600 0 CET} + {-50547600 7200 1 CEST} + {-40266000 3600 0 CET} + {-18493200 7200 1 CEST} + {-8211600 3600 0 CET} + {12956400 7200 1 CEST} + {23238000 3600 0 CET} + {43801200 7200 1 CEST} + {54687600 3600 0 CET} + {75855600 7200 1 CEST} + {86742000 3600 0 CET} + {107910000 7200 1 CEST} + {118191600 3600 0 CET} + {138754800 7200 1 CEST} + {149641200 3600 0 CET} + {170809200 7200 1 CEST} + {181090800 3600 0 CET} + {202258800 7200 1 CEST} + {212540400 3600 0 CET} + {233103600 7200 1 CEST} + {243990000 3600 0 CET} + {265158000 7200 1 CEST} + {276044400 3600 0 CET} + {296607600 7200 1 CEST} + {307494000 3600 0 CET} + {315529200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/San_Marino b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/San_Marino new file mode 100644 index 00000000..927ad290 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/San_Marino @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Rome)]} { + LoadTimeZoneFile Europe/Rome +} +set TZData(:Europe/San_Marino) $TZData(:Europe/Rome) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Sarajevo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Sarajevo new file mode 100644 index 00000000..1b14286a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Sarajevo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Belgrade)]} { + LoadTimeZoneFile Europe/Belgrade +} +set TZData(:Europe/Sarajevo) $TZData(:Europe/Belgrade) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Saratov b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Saratov new file mode 100644 index 00000000..d89a217e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Saratov @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Saratov) { + {-9223372036854775808 11058 0 LMT} + {-1593820800 10800 0 +03} + {-1247540400 14400 0 +05} + {354916800 18000 1 +05} + {370724400 14400 0 +04} + {386452800 18000 1 +05} + {402260400 14400 0 +04} + {417988800 18000 1 +05} + {433796400 14400 0 +04} + {449611200 18000 1 +05} + {465343200 14400 0 +04} + {481068000 18000 1 +05} + {496792800 14400 0 +04} + {512517600 18000 1 +05} + {528242400 14400 0 +04} + {543967200 18000 1 +05} + {559692000 14400 0 +04} + {575416800 10800 0 +04} + {575420400 14400 1 +04} + {591145200 10800 0 +03} + {606870000 14400 1 +04} + {622594800 10800 0 +03} + {638319600 14400 1 +04} + {654649200 10800 0 +03} + {670374000 14400 0 +04} + {701820000 10800 0 +04} + {701823600 14400 1 +04} + {717548400 10800 0 +03} + {733273200 14400 1 +04} + {748998000 10800 0 +03} + {764722800 14400 1 +04} + {780447600 10800 0 +03} + {796172400 14400 1 +04} + {811897200 10800 0 +03} + {828226800 14400 1 +04} + {846370800 10800 0 +03} + {859676400 14400 1 +04} + {877820400 10800 0 +03} + {891126000 14400 1 +04} + {909270000 10800 0 +03} + {922575600 14400 1 +04} + {941324400 10800 0 +03} + {954025200 14400 1 +04} + {972774000 10800 0 +03} + {985474800 14400 1 +04} + {1004223600 10800 0 +03} + {1017529200 14400 1 +04} + {1035673200 10800 0 +03} + {1048978800 14400 1 +04} + {1067122800 10800 0 +03} + {1080428400 14400 1 +04} + {1099177200 10800 0 +03} + {1111878000 14400 1 +04} + {1130626800 10800 0 +03} + {1143327600 14400 1 +04} + {1162076400 10800 0 +03} + {1174777200 14400 1 +04} + {1193526000 10800 0 +03} + {1206831600 14400 1 +04} + {1224975600 10800 0 +03} + {1238281200 14400 1 +04} + {1256425200 10800 0 +03} + {1269730800 14400 1 +04} + {1288479600 10800 0 +03} + {1301180400 14400 0 +04} + {1414274400 10800 0 +03} + {1480806000 14400 0 +04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Simferopol b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Simferopol new file mode 100644 index 00000000..4a5a77f4 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Simferopol @@ -0,0 +1,82 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Simferopol) { + {-9223372036854775808 8184 0 LMT} + {-2840148984 8160 0 SMT} + {-1441160160 7200 0 EET} + {-1247536800 10800 0 MSK} + {-888894000 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-811645200 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 14400 1 MSD} + {622594800 10800 0 MSK} + {631141200 10800 0 MSK} + {646786800 7200 0 EET} + {701042400 7200 0 EET} + {701827200 10800 1 EEST} + {717552000 7200 0 EET} + {733276800 10800 1 EEST} + {749001600 7200 0 EET} + {764726400 10800 1 EEST} + {767743200 14400 0 MSD} + {780447600 10800 0 MSK} + {796172400 14400 1 MSD} + {811897200 10800 0 MSK} + {828219600 14400 1 MSD} + {846374400 10800 0 MSK} + {859683600 10800 0 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396137600 14400 0 MSK} + {1414274400 10800 0 MSK} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Skopje b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Skopje new file mode 100644 index 00000000..07eedbe9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Skopje @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Belgrade)]} { + LoadTimeZoneFile Europe/Belgrade +} +set TZData(:Europe/Skopje) $TZData(:Europe/Belgrade) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Stockholm b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Stockholm new file mode 100644 index 00000000..6b5c55a7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Stockholm @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Berlin)]} { + LoadTimeZoneFile Europe/Berlin +} +set TZData(:Europe/Stockholm) $TZData(:Europe/Berlin) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Tallinn b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Tallinn new file mode 100644 index 00000000..e0f22a56 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Tallinn @@ -0,0 +1,254 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Tallinn) { + {-9223372036854775808 5940 0 LMT} + {-2840146740 5940 0 TMT} + {-1638322740 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-1593824400 5940 0 TMT} + {-1535938740 7200 0 EET} + {-927943200 10800 0 MSK} + {-892954800 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-797648400 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 10800 1 EEST} + {622598400 7200 0 EET} + {638323200 10800 1 EEST} + {654652800 7200 0 EET} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {701827200 10800 1 EEST} + {717552000 7200 0 EET} + {733276800 10800 1 EEST} + {749001600 7200 0 EET} + {764726400 10800 1 EEST} + {780451200 7200 0 EET} + {796176000 10800 1 EEST} + {811900800 7200 0 EET} + {828230400 10800 1 EEST} + {846374400 7200 0 EET} + {859680000 10800 1 EEST} + {877824000 7200 0 EET} + {891129600 10800 1 EEST} + {906415200 10800 0 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941335200 7200 0 EET} + {1014242400 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Tirane b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Tirane new file mode 100644 index 00000000..14ace2e5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Tirane @@ -0,0 +1,263 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Tirane) { + {-9223372036854775808 4760 0 LMT} + {-1767230360 3600 0 CET} + {-932346000 7200 0 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-843519600 3600 0 CET} + {136854000 7200 1 CEST} + {149896800 3600 0 CET} + {168130800 7200 1 CEST} + {181432800 3600 0 CET} + {199839600 7200 1 CEST} + {213141600 3600 0 CET} + {231894000 7200 1 CEST} + {244591200 3600 0 CET} + {263257200 7200 1 CEST} + {276040800 3600 0 CET} + {294706800 7200 1 CEST} + {307490400 3600 0 CET} + {326156400 7200 1 CEST} + {339458400 3600 0 CET} + {357087600 7200 1 CEST} + {370389600 3600 0 CET} + {389142000 7200 1 CEST} + {402444000 3600 0 CET} + {419468400 7200 1 CEST} + {433807200 3600 0 CET} + {449622000 7200 1 CEST} + {457480800 7200 0 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Tiraspol b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Tiraspol new file mode 100644 index 00000000..ea8f6710 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Tiraspol @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Chisinau)]} { + LoadTimeZoneFile Europe/Chisinau +} +set TZData(:Europe/Tiraspol) $TZData(:Europe/Chisinau) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Ulyanovsk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Ulyanovsk new file mode 100644 index 00000000..8fb3f9e1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Ulyanovsk @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Ulyanovsk) { + {-9223372036854775808 11616 0 LMT} + {-1593820800 10800 0 +03} + {-1247540400 14400 0 +05} + {354916800 18000 1 +05} + {370724400 14400 0 +04} + {386452800 18000 1 +05} + {402260400 14400 0 +04} + {417988800 18000 1 +05} + {433796400 14400 0 +04} + {449611200 18000 1 +05} + {465343200 14400 0 +04} + {481068000 18000 1 +05} + {496792800 14400 0 +04} + {512517600 18000 1 +05} + {528242400 14400 0 +04} + {543967200 18000 1 +05} + {559692000 14400 0 +04} + {575416800 18000 1 +05} + {591141600 14400 0 +04} + {606866400 10800 0 +04} + {606870000 14400 1 +04} + {622594800 10800 0 +03} + {638319600 14400 1 +04} + {654649200 10800 0 +03} + {670374000 7200 0 +03} + {670377600 10800 1 +03} + {686102400 7200 0 +02} + {695779200 10800 0 +04} + {701823600 14400 1 +04} + {717548400 10800 0 +03} + {733273200 14400 1 +04} + {748998000 10800 0 +03} + {764722800 14400 1 +04} + {780447600 10800 0 +03} + {796172400 14400 1 +04} + {811897200 10800 0 +03} + {828226800 14400 1 +04} + {846370800 10800 0 +03} + {859676400 14400 1 +04} + {877820400 10800 0 +03} + {891126000 14400 1 +04} + {909270000 10800 0 +03} + {922575600 14400 1 +04} + {941324400 10800 0 +03} + {954025200 14400 1 +04} + {972774000 10800 0 +03} + {985474800 14400 1 +04} + {1004223600 10800 0 +03} + {1017529200 14400 1 +04} + {1035673200 10800 0 +03} + {1048978800 14400 1 +04} + {1067122800 10800 0 +03} + {1080428400 14400 1 +04} + {1099177200 10800 0 +03} + {1111878000 14400 1 +04} + {1130626800 10800 0 +03} + {1143327600 14400 1 +04} + {1162076400 10800 0 +03} + {1174777200 14400 1 +04} + {1193526000 10800 0 +03} + {1206831600 14400 1 +04} + {1224975600 10800 0 +03} + {1238281200 14400 1 +04} + {1256425200 10800 0 +03} + {1269730800 14400 1 +04} + {1288479600 10800 0 +03} + {1301180400 14400 0 +04} + {1414274400 10800 0 +03} + {1459033200 14400 0 +04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Uzhgorod b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Uzhgorod new file mode 100644 index 00000000..2a0f450d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Uzhgorod @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Kyiv)]} { + LoadTimeZoneFile Europe/Kyiv +} +set TZData(:Europe/Uzhgorod) $TZData(:Europe/Kyiv) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Vaduz b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Vaduz new file mode 100644 index 00000000..095e018b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Vaduz @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Zurich)]} { + LoadTimeZoneFile Europe/Zurich +} +set TZData(:Europe/Vaduz) $TZData(:Europe/Zurich) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Vatican b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Vatican new file mode 100644 index 00000000..fe507658 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Vatican @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Rome)]} { + LoadTimeZoneFile Europe/Rome +} +set TZData(:Europe/Vatican) $TZData(:Europe/Rome) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Vilnius b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Vilnius new file mode 100644 index 00000000..5e73150d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Vilnius @@ -0,0 +1,252 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Vilnius) { + {-9223372036854775808 6076 0 LMT} + {-2840146876 5040 0 WMT} + {-1672536240 5736 0 KMT} + {-1585100136 3600 0 CET} + {-1561251600 7200 0 EET} + {-1553565600 3600 0 CET} + {-928198800 10800 0 MSK} + {-900126000 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-802141200 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 7200 0 EEMMTT} + {606873600 10800 1 EEST} + {622598400 7200 0 EET} + {638323200 10800 1 EEST} + {654652800 7200 0 EET} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {701827200 10800 1 EEST} + {717552000 7200 0 EET} + {733276800 10800 1 EEST} + {749001600 7200 0 EET} + {764726400 10800 1 EEST} + {780451200 7200 0 EET} + {796176000 10800 1 EEST} + {811900800 7200 0 EET} + {828230400 10800 1 EEST} + {846374400 7200 0 EET} + {859680000 10800 1 EEST} + {877824000 7200 0 EET} + {883605600 7200 0 EET} + {891133200 7200 0 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 7200 0 EET} + {1041372000 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Volgograd b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Volgograd new file mode 100644 index 00000000..2ce2dfe6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Volgograd @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Volgograd) { + {-9223372036854775808 10660 0 LMT} + {-1577761060 10800 0 +03} + {-1247540400 14400 0 +04} + {-256881600 14400 0 +05} + {354916800 18000 1 +05} + {370724400 14400 0 +04} + {386452800 18000 1 +05} + {402260400 14400 0 +04} + {417988800 18000 1 +05} + {433796400 14400 0 +04} + {449611200 18000 1 +05} + {465343200 14400 0 +04} + {481068000 18000 1 +05} + {496792800 14400 0 +04} + {512517600 18000 1 +05} + {528242400 14400 0 +04} + {543967200 18000 1 +05} + {559692000 14400 0 +04} + {575416800 10800 0 +04} + {575420400 14400 1 +04} + {591145200 10800 0 +03} + {606870000 14400 1 +04} + {622594800 10800 0 +03} + {638319600 14400 1 +04} + {654649200 10800 0 +03} + {670374000 14400 0 +04} + {701820000 10800 0 +04} + {701823600 14400 1 +04} + {717548400 10800 0 +03} + {733273200 14400 1 +04} + {748998000 10800 0 +03} + {764722800 14400 1 +04} + {780447600 10800 0 +03} + {796172400 14400 1 +04} + {811897200 10800 0 +03} + {828226800 14400 1 +04} + {846370800 10800 0 +03} + {859676400 14400 1 +04} + {877820400 10800 0 +03} + {891126000 14400 1 +04} + {909270000 10800 0 +03} + {922575600 14400 1 +04} + {941324400 10800 0 +03} + {954025200 14400 1 +04} + {972774000 10800 0 +03} + {985474800 14400 1 +04} + {1004223600 10800 0 +03} + {1017529200 14400 1 +04} + {1035673200 10800 0 +03} + {1048978800 14400 1 +04} + {1067122800 10800 0 +03} + {1080428400 14400 1 +04} + {1099177200 10800 0 +03} + {1111878000 14400 1 +04} + {1130626800 10800 0 +03} + {1143327600 14400 1 +04} + {1162076400 10800 0 +03} + {1174777200 14400 1 +04} + {1193526000 10800 0 +03} + {1206831600 14400 1 +04} + {1224975600 10800 0 +03} + {1238281200 14400 1 +04} + {1256425200 10800 0 +03} + {1269730800 14400 1 +04} + {1288479600 10800 0 +03} + {1301180400 14400 0 +04} + {1414274400 10800 0 +03} + {1540681200 14400 0 +04} + {1609020000 10800 0 +03} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Warsaw b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Warsaw new file mode 100644 index 00000000..6288a8ab --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Warsaw @@ -0,0 +1,296 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Warsaw) { + {-9223372036854775808 5040 0 LMT} + {-2840145840 5040 0 WMT} + {-1717032240 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618696800 7200 0 EET} + {-1600473600 10800 1 EEST} + {-1587168000 7200 0 EET} + {-931734000 7200 0 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796870800 7200 0 CEST} + {-796608000 3600 0 CET} + {-778726800 7200 1 CEST} + {-762660000 3600 0 CET} + {-748486800 7200 1 CEST} + {-733273200 3600 0 CET} + {-715215600 7200 1 CEST} + {-701910000 3600 0 CET} + {-684975600 7200 1 CEST} + {-670460400 3600 0 CET} + {-654130800 7200 1 CEST} + {-639010800 3600 0 CET} + {-397094400 7200 1 CEST} + {-386812800 3600 0 CET} + {-371088000 7200 1 CEST} + {-355363200 3600 0 CET} + {-334195200 7200 1 CEST} + {-323308800 3600 0 CET} + {-307584000 7200 1 CEST} + {-291859200 3600 0 CET} + {-271296000 7200 1 CEST} + {-260409600 3600 0 CET} + {-239846400 7200 1 CEST} + {-228960000 3600 0 CET} + {-208396800 7200 1 CEST} + {-197510400 3600 0 CET} + {-176342400 7200 1 CEST} + {-166060800 3600 0 CET} + {220921200 3600 0 CET} + {228873600 7200 1 CEST} + {243993600 3600 0 CET} + {260323200 7200 1 CEST} + {276048000 3600 0 CET} + {291772800 7200 1 CEST} + {307497600 3600 0 CET} + {323827200 7200 1 CEST} + {338947200 3600 0 CET} + {354672000 7200 1 CEST} + {370396800 3600 0 CET} + {386121600 7200 1 CEST} + {401846400 3600 0 CET} + {417571200 7200 1 CEST} + {433296000 3600 0 CET} + {449020800 7200 1 CEST} + {465350400 3600 0 CET} + {481075200 7200 1 CEST} + {496800000 3600 0 CET} + {512524800 7200 1 CEST} + {528249600 3600 0 CET} + {543974400 7200 1 CEST} + {559699200 3600 0 CET} + {567990000 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Zagreb b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Zagreb new file mode 100644 index 00000000..46319a41 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Zagreb @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Belgrade)]} { + LoadTimeZoneFile Europe/Belgrade +} +set TZData(:Europe/Zagreb) $TZData(:Europe/Belgrade) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Zaporozhye b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Zaporozhye new file mode 100644 index 00000000..385d8628 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Zaporozhye @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Kyiv)]} { + LoadTimeZoneFile Europe/Kyiv +} +set TZData(:Europe/Zaporozhye) $TZData(:Europe/Kyiv) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Zurich b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Zurich new file mode 100644 index 00000000..87a20dbf --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Europe/Zurich @@ -0,0 +1,250 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Zurich) { + {-9223372036854775808 2048 0 LMT} + {-3675198848 1786 0 BMT} + {-2385246586 3600 0 CET} + {-904435200 7200 1 CEST} + {-891129600 3600 0 CET} + {-872985600 7200 1 CEST} + {-859680000 3600 0 CET} + {347151600 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GB b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GB new file mode 100644 index 00000000..72d77eea --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GB @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/London)]} { + LoadTimeZoneFile Europe/London +} +set TZData(:GB) $TZData(:Europe/London) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GB-Eire b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GB-Eire new file mode 100644 index 00000000..16224173 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GB-Eire @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/London)]} { + LoadTimeZoneFile Europe/London +} +set TZData(:GB-Eire) $TZData(:Europe/London) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT new file mode 100644 index 00000000..4258564e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:GMT) $TZData(:Etc/GMT) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT+0 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT+0 new file mode 100644 index 00000000..a1e81267 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT+0 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:GMT+0) $TZData(:Etc/GMT) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT-0 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT-0 new file mode 100644 index 00000000..04ccafe2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT-0 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:GMT-0) $TZData(:Etc/GMT) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT0 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT0 new file mode 100644 index 00000000..92e95a34 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/GMT0 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:GMT0) $TZData(:Etc/GMT) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Greenwich b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Greenwich new file mode 100644 index 00000000..61152331 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Greenwich @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:Greenwich) $TZData(:Etc/GMT) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/HST b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/HST new file mode 100644 index 00000000..fea7f143 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/HST @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:HST) { + {-9223372036854775808 -36000 0 HST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Hongkong b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Hongkong new file mode 100644 index 00000000..f9d4dac7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Hongkong @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Hong_Kong)]} { + LoadTimeZoneFile Asia/Hong_Kong +} +set TZData(:Hongkong) $TZData(:Asia/Hong_Kong) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Iceland b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Iceland new file mode 100644 index 00000000..3e7cd0ca --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Iceland @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Iceland) $TZData(:Africa/Abidjan) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Antananarivo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Antananarivo new file mode 100644 index 00000000..c56a893f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Antananarivo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Indian/Antananarivo) $TZData(:Africa/Nairobi) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Chagos b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Chagos new file mode 100644 index 00000000..23ea7907 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Chagos @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Indian/Chagos) { + {-9223372036854775808 17380 0 LMT} + {-1988167780 18000 0 +05} + {820436400 21600 0 +06} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Christmas b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Christmas new file mode 100644 index 00000000..dea9f902 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Christmas @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Bangkok)]} { + LoadTimeZoneFile Asia/Bangkok +} +set TZData(:Indian/Christmas) $TZData(:Asia/Bangkok) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Cocos b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Cocos new file mode 100644 index 00000000..cb474c9e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Cocos @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Yangon)]} { + LoadTimeZoneFile Asia/Yangon +} +set TZData(:Indian/Cocos) $TZData(:Asia/Yangon) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Comoro b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Comoro new file mode 100644 index 00000000..06071de0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Comoro @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Indian/Comoro) $TZData(:Africa/Nairobi) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Kerguelen b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Kerguelen new file mode 100644 index 00000000..b3cbeeea --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Kerguelen @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Indian/Maldives)]} { + LoadTimeZoneFile Indian/Maldives +} +set TZData(:Indian/Kerguelen) $TZData(:Indian/Maldives) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Mahe b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Mahe new file mode 100644 index 00000000..3c728d29 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Mahe @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Dubai)]} { + LoadTimeZoneFile Asia/Dubai +} +set TZData(:Indian/Mahe) $TZData(:Asia/Dubai) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Maldives b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Maldives new file mode 100644 index 00000000..b23bf2bc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Maldives @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Indian/Maldives) { + {-9223372036854775808 17640 0 LMT} + {-2840158440 17640 0 MMT} + {-315636840 18000 0 +05} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Mauritius b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Mauritius new file mode 100644 index 00000000..4c9a051a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Mauritius @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Indian/Mauritius) { + {-9223372036854775808 13800 0 LMT} + {-1988164200 14400 0 +04} + {403041600 18000 1 +04} + {417034800 14400 0 +04} + {1224972000 18000 1 +04} + {1238274000 14400 0 +04} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Mayotte b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Mayotte new file mode 100644 index 00000000..da55521b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Mayotte @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Indian/Mayotte) $TZData(:Africa/Nairobi) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Reunion b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Reunion new file mode 100644 index 00000000..14f23207 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Indian/Reunion @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Dubai)]} { + LoadTimeZoneFile Asia/Dubai +} +set TZData(:Indian/Reunion) $TZData(:Asia/Dubai) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Iran b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Iran new file mode 100644 index 00000000..e200b4df --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Iran @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Tehran)]} { + LoadTimeZoneFile Asia/Tehran +} +set TZData(:Iran) $TZData(:Asia/Tehran) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Israel b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Israel new file mode 100644 index 00000000..af521f5c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Israel @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Jerusalem)]} { + LoadTimeZoneFile Asia/Jerusalem +} +set TZData(:Israel) $TZData(:Asia/Jerusalem) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Japan b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Japan new file mode 100644 index 00000000..428a79f1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Japan @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Tokyo)]} { + LoadTimeZoneFile Asia/Tokyo +} +set TZData(:Japan) $TZData(:Asia/Tokyo) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Kwajalein b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Kwajalein new file mode 100644 index 00000000..586db6db --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Kwajalein @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Kwajalein)]} { + LoadTimeZoneFile Pacific/Kwajalein +} +set TZData(:Kwajalein) $TZData(:Pacific/Kwajalein) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MET b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MET new file mode 100644 index 00000000..8789c976 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MET @@ -0,0 +1,265 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:MET) { + {-9223372036854775808 3600 0 MET} + {-1693706400 7200 1 MEST} + {-1680483600 3600 0 MET} + {-1663455600 7200 1 MEST} + {-1650150000 3600 0 MET} + {-1632006000 7200 1 MEST} + {-1618700400 3600 0 MET} + {-938905200 7200 1 MEST} + {-857257200 3600 0 MET} + {-844556400 7200 1 MEST} + {-828226800 3600 0 MET} + {-812502000 7200 1 MEST} + {-796777200 3600 0 MET} + {-781052400 7200 1 MEST} + {-766623600 3600 0 MET} + {228877200 7200 1 MEST} + {243997200 3600 0 MET} + {260326800 7200 1 MEST} + {276051600 3600 0 MET} + {291776400 7200 1 MEST} + {307501200 3600 0 MET} + {323830800 7200 1 MEST} + {338950800 3600 0 MET} + {354675600 7200 1 MEST} + {370400400 3600 0 MET} + {386125200 7200 1 MEST} + {401850000 3600 0 MET} + {417574800 7200 1 MEST} + {433299600 3600 0 MET} + {449024400 7200 1 MEST} + {465354000 3600 0 MET} + {481078800 7200 1 MEST} + {496803600 3600 0 MET} + {512528400 7200 1 MEST} + {528253200 3600 0 MET} + {543978000 7200 1 MEST} + {559702800 3600 0 MET} + {575427600 7200 1 MEST} + {591152400 3600 0 MET} + {606877200 7200 1 MEST} + {622602000 3600 0 MET} + {638326800 7200 1 MEST} + {654656400 3600 0 MET} + {670381200 7200 1 MEST} + {686106000 3600 0 MET} + {701830800 7200 1 MEST} + {717555600 3600 0 MET} + {733280400 7200 1 MEST} + {749005200 3600 0 MET} + {764730000 7200 1 MEST} + {780454800 3600 0 MET} + {796179600 7200 1 MEST} + {811904400 3600 0 MET} + {828234000 7200 1 MEST} + {846378000 3600 0 MET} + {859683600 7200 1 MEST} + {877827600 3600 0 MET} + {891133200 7200 1 MEST} + {909277200 3600 0 MET} + {922582800 7200 1 MEST} + {941331600 3600 0 MET} + {954032400 7200 1 MEST} + {972781200 3600 0 MET} + {985482000 7200 1 MEST} + {1004230800 3600 0 MET} + {1017536400 7200 1 MEST} + {1035680400 3600 0 MET} + {1048986000 7200 1 MEST} + {1067130000 3600 0 MET} + {1080435600 7200 1 MEST} + {1099184400 3600 0 MET} + {1111885200 7200 1 MEST} + {1130634000 3600 0 MET} + {1143334800 7200 1 MEST} + {1162083600 3600 0 MET} + {1174784400 7200 1 MEST} + {1193533200 3600 0 MET} + {1206838800 7200 1 MEST} + {1224982800 3600 0 MET} + {1238288400 7200 1 MEST} + {1256432400 3600 0 MET} + {1269738000 7200 1 MEST} + {1288486800 3600 0 MET} + {1301187600 7200 1 MEST} + {1319936400 3600 0 MET} + {1332637200 7200 1 MEST} + {1351386000 3600 0 MET} + {1364691600 7200 1 MEST} + {1382835600 3600 0 MET} + {1396141200 7200 1 MEST} + {1414285200 3600 0 MET} + {1427590800 7200 1 MEST} + {1445734800 3600 0 MET} + {1459040400 7200 1 MEST} + {1477789200 3600 0 MET} + {1490490000 7200 1 MEST} + {1509238800 3600 0 MET} + {1521939600 7200 1 MEST} + {1540688400 3600 0 MET} + {1553994000 7200 1 MEST} + {1572138000 3600 0 MET} + {1585443600 7200 1 MEST} + {1603587600 3600 0 MET} + {1616893200 7200 1 MEST} + {1635642000 3600 0 MET} + {1648342800 7200 1 MEST} + {1667091600 3600 0 MET} + {1679792400 7200 1 MEST} + {1698541200 3600 0 MET} + {1711846800 7200 1 MEST} + {1729990800 3600 0 MET} + {1743296400 7200 1 MEST} + {1761440400 3600 0 MET} + {1774746000 7200 1 MEST} + {1792890000 3600 0 MET} + {1806195600 7200 1 MEST} + {1824944400 3600 0 MET} + {1837645200 7200 1 MEST} + {1856394000 3600 0 MET} + {1869094800 7200 1 MEST} + {1887843600 3600 0 MET} + {1901149200 7200 1 MEST} + {1919293200 3600 0 MET} + {1932598800 7200 1 MEST} + {1950742800 3600 0 MET} + {1964048400 7200 1 MEST} + {1982797200 3600 0 MET} + {1995498000 7200 1 MEST} + {2014246800 3600 0 MET} + {2026947600 7200 1 MEST} + {2045696400 3600 0 MET} + {2058397200 7200 1 MEST} + {2077146000 3600 0 MET} + {2090451600 7200 1 MEST} + {2108595600 3600 0 MET} + {2121901200 7200 1 MEST} + {2140045200 3600 0 MET} + {2153350800 7200 1 MEST} + {2172099600 3600 0 MET} + {2184800400 7200 1 MEST} + {2203549200 3600 0 MET} + {2216250000 7200 1 MEST} + {2234998800 3600 0 MET} + {2248304400 7200 1 MEST} + {2266448400 3600 0 MET} + {2279754000 7200 1 MEST} + {2297898000 3600 0 MET} + {2311203600 7200 1 MEST} + {2329347600 3600 0 MET} + {2342653200 7200 1 MEST} + {2361402000 3600 0 MET} + {2374102800 7200 1 MEST} + {2392851600 3600 0 MET} + {2405552400 7200 1 MEST} + {2424301200 3600 0 MET} + {2437606800 7200 1 MEST} + {2455750800 3600 0 MET} + {2469056400 7200 1 MEST} + {2487200400 3600 0 MET} + {2500506000 7200 1 MEST} + {2519254800 3600 0 MET} + {2531955600 7200 1 MEST} + {2550704400 3600 0 MET} + {2563405200 7200 1 MEST} + {2582154000 3600 0 MET} + {2595459600 7200 1 MEST} + {2613603600 3600 0 MET} + {2626909200 7200 1 MEST} + {2645053200 3600 0 MET} + {2658358800 7200 1 MEST} + {2676502800 3600 0 MET} + {2689808400 7200 1 MEST} + {2708557200 3600 0 MET} + {2721258000 7200 1 MEST} + {2740006800 3600 0 MET} + {2752707600 7200 1 MEST} + {2771456400 3600 0 MET} + {2784762000 7200 1 MEST} + {2802906000 3600 0 MET} + {2816211600 7200 1 MEST} + {2834355600 3600 0 MET} + {2847661200 7200 1 MEST} + {2866410000 3600 0 MET} + {2879110800 7200 1 MEST} + {2897859600 3600 0 MET} + {2910560400 7200 1 MEST} + {2929309200 3600 0 MET} + {2942010000 7200 1 MEST} + {2960758800 3600 0 MET} + {2974064400 7200 1 MEST} + {2992208400 3600 0 MET} + {3005514000 7200 1 MEST} + {3023658000 3600 0 MET} + {3036963600 7200 1 MEST} + {3055712400 3600 0 MET} + {3068413200 7200 1 MEST} + {3087162000 3600 0 MET} + {3099862800 7200 1 MEST} + {3118611600 3600 0 MET} + {3131917200 7200 1 MEST} + {3150061200 3600 0 MET} + {3163366800 7200 1 MEST} + {3181510800 3600 0 MET} + {3194816400 7200 1 MEST} + {3212960400 3600 0 MET} + {3226266000 7200 1 MEST} + {3245014800 3600 0 MET} + {3257715600 7200 1 MEST} + {3276464400 3600 0 MET} + {3289165200 7200 1 MEST} + {3307914000 3600 0 MET} + {3321219600 7200 1 MEST} + {3339363600 3600 0 MET} + {3352669200 7200 1 MEST} + {3370813200 3600 0 MET} + {3384118800 7200 1 MEST} + {3402867600 3600 0 MET} + {3415568400 7200 1 MEST} + {3434317200 3600 0 MET} + {3447018000 7200 1 MEST} + {3465766800 3600 0 MET} + {3479072400 7200 1 MEST} + {3497216400 3600 0 MET} + {3510522000 7200 1 MEST} + {3528666000 3600 0 MET} + {3541971600 7200 1 MEST} + {3560115600 3600 0 MET} + {3573421200 7200 1 MEST} + {3592170000 3600 0 MET} + {3604870800 7200 1 MEST} + {3623619600 3600 0 MET} + {3636320400 7200 1 MEST} + {3655069200 3600 0 MET} + {3668374800 7200 1 MEST} + {3686518800 3600 0 MET} + {3699824400 7200 1 MEST} + {3717968400 3600 0 MET} + {3731274000 7200 1 MEST} + {3750022800 3600 0 MET} + {3762723600 7200 1 MEST} + {3781472400 3600 0 MET} + {3794173200 7200 1 MEST} + {3812922000 3600 0 MET} + {3825622800 7200 1 MEST} + {3844371600 3600 0 MET} + {3857677200 7200 1 MEST} + {3875821200 3600 0 MET} + {3889126800 7200 1 MEST} + {3907270800 3600 0 MET} + {3920576400 7200 1 MEST} + {3939325200 3600 0 MET} + {3952026000 7200 1 MEST} + {3970774800 3600 0 MET} + {3983475600 7200 1 MEST} + {4002224400 3600 0 MET} + {4015530000 7200 1 MEST} + {4033674000 3600 0 MET} + {4046979600 7200 1 MEST} + {4065123600 3600 0 MET} + {4078429200 7200 1 MEST} + {4096573200 3600 0 MET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MST b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MST new file mode 100644 index 00000000..8c967abe --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MST @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:MST) { + {-9223372036854775808 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MST7MDT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MST7MDT new file mode 100644 index 00000000..ff520486 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/MST7MDT @@ -0,0 +1,278 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:MST7MDT) { + {-9223372036854775808 -25200 0 MST} + {-1633273200 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1601823600 -21600 1 MDT} + {-1583683200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-52930800 -21600 1 MDT} + {-37209600 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {9968400 -21600 1 MDT} + {25689600 -25200 0 MST} + {41418000 -21600 1 MDT} + {57744000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {126694800 -21600 1 MDT} + {152092800 -25200 0 MST} + {162378000 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Mexico/BajaNorte b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Mexico/BajaNorte new file mode 100644 index 00000000..8f6f459e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Mexico/BajaNorte @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Tijuana)]} { + LoadTimeZoneFile America/Tijuana +} +set TZData(:Mexico/BajaNorte) $TZData(:America/Tijuana) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Mexico/BajaSur b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Mexico/BajaSur new file mode 100644 index 00000000..6d335a12 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Mexico/BajaSur @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Mazatlan)]} { + LoadTimeZoneFile America/Mazatlan +} +set TZData(:Mexico/BajaSur) $TZData(:America/Mazatlan) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Mexico/General b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Mexico/General new file mode 100644 index 00000000..0cac92f8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Mexico/General @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Mexico_City)]} { + LoadTimeZoneFile America/Mexico_City +} +set TZData(:Mexico/General) $TZData(:America/Mexico_City) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/NZ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/NZ new file mode 100644 index 00000000..36d22a7b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/NZ @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Auckland)]} { + LoadTimeZoneFile Pacific/Auckland +} +set TZData(:NZ) $TZData(:Pacific/Auckland) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/NZ-CHAT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/NZ-CHAT new file mode 100644 index 00000000..7f7c9180 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/NZ-CHAT @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Chatham)]} { + LoadTimeZoneFile Pacific/Chatham +} +set TZData(:NZ-CHAT) $TZData(:Pacific/Chatham) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Navajo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Navajo new file mode 100644 index 00000000..78cc2e24 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Navajo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Denver)]} { + LoadTimeZoneFile America/Denver +} +set TZData(:Navajo) $TZData(:America/Denver) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/PRC b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/PRC new file mode 100644 index 00000000..1d8bb7cc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/PRC @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Shanghai)]} { + LoadTimeZoneFile Asia/Shanghai +} +set TZData(:PRC) $TZData(:Asia/Shanghai) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/PST8PDT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/PST8PDT new file mode 100644 index 00000000..87a94daa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/PST8PDT @@ -0,0 +1,278 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:PST8PDT) { + {-9223372036854775808 -28800 0 PST} + {-1633269600 -25200 1 PDT} + {-1615129200 -28800 0 PST} + {-1601820000 -25200 1 PDT} + {-1583679600 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-84376800 -25200 1 PDT} + {-68655600 -28800 0 PST} + {-52927200 -25200 1 PDT} + {-37206000 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {89197200 -28800 0 PST} + {104925600 -25200 1 PDT} + {120646800 -28800 0 PST} + {126698400 -25200 1 PDT} + {152096400 -28800 0 PST} + {162381600 -25200 1 PDT} + {183546000 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1173607200 -25200 1 PDT} + {1194166800 -28800 0 PST} + {1205056800 -25200 1 PDT} + {1225616400 -28800 0 PST} + {1236506400 -25200 1 PDT} + {1257066000 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 1 PDT} + {1446368400 -28800 0 PST} + {1457863200 -25200 1 PDT} + {1478422800 -28800 0 PST} + {1489312800 -25200 1 PDT} + {1509872400 -28800 0 PST} + {1520762400 -25200 1 PDT} + {1541322000 -28800 0 PST} + {1552212000 -25200 1 PDT} + {1572771600 -28800 0 PST} + {1583661600 -25200 1 PDT} + {1604221200 -28800 0 PST} + {1615716000 -25200 1 PDT} + {1636275600 -28800 0 PST} + {1647165600 -25200 1 PDT} + {1667725200 -28800 0 PST} + {1678615200 -25200 1 PDT} + {1699174800 -28800 0 PST} + {1710064800 -25200 1 PDT} + {1730624400 -28800 0 PST} + {1741514400 -25200 1 PDT} + {1762074000 -28800 0 PST} + {1772964000 -25200 1 PDT} + {1793523600 -28800 0 PST} + {1805018400 -25200 1 PDT} + {1825578000 -28800 0 PST} + {1836468000 -25200 1 PDT} + {1857027600 -28800 0 PST} + {1867917600 -25200 1 PDT} + {1888477200 -28800 0 PST} + {1899367200 -25200 1 PDT} + {1919926800 -28800 0 PST} + {1930816800 -25200 1 PDT} + {1951376400 -28800 0 PST} + {1962871200 -25200 1 PDT} + {1983430800 -28800 0 PST} + {1994320800 -25200 1 PDT} + {2014880400 -28800 0 PST} + {2025770400 -25200 1 PDT} + {2046330000 -28800 0 PST} + {2057220000 -25200 1 PDT} + {2077779600 -28800 0 PST} + {2088669600 -25200 1 PDT} + {2109229200 -28800 0 PST} + {2120119200 -25200 1 PDT} + {2140678800 -28800 0 PST} + {2152173600 -25200 1 PDT} + {2172733200 -28800 0 PST} + {2183623200 -25200 1 PDT} + {2204182800 -28800 0 PST} + {2215072800 -25200 1 PDT} + {2235632400 -28800 0 PST} + {2246522400 -25200 1 PDT} + {2267082000 -28800 0 PST} + {2277972000 -25200 1 PDT} + {2298531600 -28800 0 PST} + {2309421600 -25200 1 PDT} + {2329981200 -28800 0 PST} + {2341476000 -25200 1 PDT} + {2362035600 -28800 0 PST} + {2372925600 -25200 1 PDT} + {2393485200 -28800 0 PST} + {2404375200 -25200 1 PDT} + {2424934800 -28800 0 PST} + {2435824800 -25200 1 PDT} + {2456384400 -28800 0 PST} + {2467274400 -25200 1 PDT} + {2487834000 -28800 0 PST} + {2499328800 -25200 1 PDT} + {2519888400 -28800 0 PST} + {2530778400 -25200 1 PDT} + {2551338000 -28800 0 PST} + {2562228000 -25200 1 PDT} + {2582787600 -28800 0 PST} + {2593677600 -25200 1 PDT} + {2614237200 -28800 0 PST} + {2625127200 -25200 1 PDT} + {2645686800 -28800 0 PST} + {2656576800 -25200 1 PDT} + {2677136400 -28800 0 PST} + {2688631200 -25200 1 PDT} + {2709190800 -28800 0 PST} + {2720080800 -25200 1 PDT} + {2740640400 -28800 0 PST} + {2751530400 -25200 1 PDT} + {2772090000 -28800 0 PST} + {2782980000 -25200 1 PDT} + {2803539600 -28800 0 PST} + {2814429600 -25200 1 PDT} + {2834989200 -28800 0 PST} + {2846484000 -25200 1 PDT} + {2867043600 -28800 0 PST} + {2877933600 -25200 1 PDT} + {2898493200 -28800 0 PST} + {2909383200 -25200 1 PDT} + {2929942800 -28800 0 PST} + {2940832800 -25200 1 PDT} + {2961392400 -28800 0 PST} + {2972282400 -25200 1 PDT} + {2992842000 -28800 0 PST} + {3003732000 -25200 1 PDT} + {3024291600 -28800 0 PST} + {3035786400 -25200 1 PDT} + {3056346000 -28800 0 PST} + {3067236000 -25200 1 PDT} + {3087795600 -28800 0 PST} + {3098685600 -25200 1 PDT} + {3119245200 -28800 0 PST} + {3130135200 -25200 1 PDT} + {3150694800 -28800 0 PST} + {3161584800 -25200 1 PDT} + {3182144400 -28800 0 PST} + {3193034400 -25200 1 PDT} + {3213594000 -28800 0 PST} + {3225088800 -25200 1 PDT} + {3245648400 -28800 0 PST} + {3256538400 -25200 1 PDT} + {3277098000 -28800 0 PST} + {3287988000 -25200 1 PDT} + {3308547600 -28800 0 PST} + {3319437600 -25200 1 PDT} + {3339997200 -28800 0 PST} + {3350887200 -25200 1 PDT} + {3371446800 -28800 0 PST} + {3382941600 -25200 1 PDT} + {3403501200 -28800 0 PST} + {3414391200 -25200 1 PDT} + {3434950800 -28800 0 PST} + {3445840800 -25200 1 PDT} + {3466400400 -28800 0 PST} + {3477290400 -25200 1 PDT} + {3497850000 -28800 0 PST} + {3508740000 -25200 1 PDT} + {3529299600 -28800 0 PST} + {3540189600 -25200 1 PDT} + {3560749200 -28800 0 PST} + {3572244000 -25200 1 PDT} + {3592803600 -28800 0 PST} + {3603693600 -25200 1 PDT} + {3624253200 -28800 0 PST} + {3635143200 -25200 1 PDT} + {3655702800 -28800 0 PST} + {3666592800 -25200 1 PDT} + {3687152400 -28800 0 PST} + {3698042400 -25200 1 PDT} + {3718602000 -28800 0 PST} + {3730096800 -25200 1 PDT} + {3750656400 -28800 0 PST} + {3761546400 -25200 1 PDT} + {3782106000 -28800 0 PST} + {3792996000 -25200 1 PDT} + {3813555600 -28800 0 PST} + {3824445600 -25200 1 PDT} + {3845005200 -28800 0 PST} + {3855895200 -25200 1 PDT} + {3876454800 -28800 0 PST} + {3887344800 -25200 1 PDT} + {3907904400 -28800 0 PST} + {3919399200 -25200 1 PDT} + {3939958800 -28800 0 PST} + {3950848800 -25200 1 PDT} + {3971408400 -28800 0 PST} + {3982298400 -25200 1 PDT} + {4002858000 -28800 0 PST} + {4013748000 -25200 1 PDT} + {4034307600 -28800 0 PST} + {4045197600 -25200 1 PDT} + {4065757200 -28800 0 PST} + {4076647200 -25200 1 PDT} + {4097206800 -28800 0 PST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Auckland b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Auckland new file mode 100644 index 00000000..5f7e2385 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Auckland @@ -0,0 +1,285 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Auckland) { + {-9223372036854775808 41944 0 LMT} + {-3192435544 41400 0 NZMT} + {-1330335000 45000 1 NZST} + {-1320057000 41400 0 NZMT} + {-1300699800 43200 1 NZST} + {-1287396000 41400 0 NZMT} + {-1269250200 43200 1 NZST} + {-1255946400 41400 0 NZMT} + {-1237800600 43200 1 NZST} + {-1224496800 41400 0 NZMT} + {-1206351000 43200 1 NZST} + {-1192442400 41400 0 NZMT} + {-1174901400 43200 1 NZST} + {-1160992800 41400 0 NZMT} + {-1143451800 43200 1 NZST} + {-1125914400 41400 0 NZMT} + {-1112607000 43200 1 NZST} + {-1094464800 41400 0 NZMT} + {-1081157400 43200 1 NZST} + {-1063015200 41400 0 NZMT} + {-1049707800 43200 1 NZST} + {-1031565600 41400 0 NZMT} + {-1018258200 43200 1 NZST} + {-1000116000 41400 0 NZMT} + {-986808600 43200 1 NZST} + {-968061600 41400 0 NZMT} + {-955359000 43200 1 NZST} + {-936612000 41400 0 NZMT} + {-923304600 43200 1 NZST} + {-757425600 43200 0 NZST} + {152632800 46800 1 NZDT} + {162309600 43200 0 NZST} + {183477600 46800 1 NZDT} + {194968800 43200 0 NZST} + {215532000 46800 1 NZDT} + {226418400 43200 0 NZST} + {246981600 46800 1 NZDT} + {257868000 43200 0 NZST} + {278431200 46800 1 NZDT} + {289317600 43200 0 NZST} + {309880800 46800 1 NZDT} + {320767200 43200 0 NZST} + {341330400 46800 1 NZDT} + {352216800 43200 0 NZST} + {372780000 46800 1 NZDT} + {384271200 43200 0 NZST} + {404834400 46800 1 NZDT} + {415720800 43200 0 NZST} + {436284000 46800 1 NZDT} + {447170400 43200 0 NZST} + {467733600 46800 1 NZDT} + {478620000 43200 0 NZST} + {499183200 46800 1 NZDT} + {510069600 43200 0 NZST} + {530632800 46800 1 NZDT} + {541519200 43200 0 NZST} + {562082400 46800 1 NZDT} + {573573600 43200 0 NZST} + {594136800 46800 1 NZDT} + {605023200 43200 0 NZST} + {623772000 46800 1 NZDT} + {637682400 43200 0 NZST} + {655221600 46800 1 NZDT} + {669132000 43200 0 NZST} + {686671200 46800 1 NZDT} + {700581600 43200 0 NZST} + {718120800 46800 1 NZDT} + {732636000 43200 0 NZST} + {749570400 46800 1 NZDT} + {764085600 43200 0 NZST} + {781020000 46800 1 NZDT} + {795535200 43200 0 NZST} + {812469600 46800 1 NZDT} + {826984800 43200 0 NZST} + {844524000 46800 1 NZDT} + {858434400 43200 0 NZST} + {875973600 46800 1 NZDT} + {889884000 43200 0 NZST} + {907423200 46800 1 NZDT} + {921938400 43200 0 NZST} + {938872800 46800 1 NZDT} + {953388000 43200 0 NZST} + {970322400 46800 1 NZDT} + {984837600 43200 0 NZST} + {1002376800 46800 1 NZDT} + {1016287200 43200 0 NZST} + {1033826400 46800 1 NZDT} + {1047736800 43200 0 NZST} + {1065276000 46800 1 NZDT} + {1079791200 43200 0 NZST} + {1096725600 46800 1 NZDT} + {1111240800 43200 0 NZST} + {1128175200 46800 1 NZDT} + {1142690400 43200 0 NZST} + {1159624800 46800 1 NZDT} + {1174140000 43200 0 NZST} + {1191074400 46800 1 NZDT} + {1207404000 43200 0 NZST} + {1222524000 46800 1 NZDT} + {1238853600 43200 0 NZST} + {1253973600 46800 1 NZDT} + {1270303200 43200 0 NZST} + {1285423200 46800 1 NZDT} + {1301752800 43200 0 NZST} + {1316872800 46800 1 NZDT} + {1333202400 43200 0 NZST} + {1348927200 46800 1 NZDT} + {1365256800 43200 0 NZST} + {1380376800 46800 1 NZDT} + {1396706400 43200 0 NZST} + {1411826400 46800 1 NZDT} + {1428156000 43200 0 NZST} + {1443276000 46800 1 NZDT} + {1459605600 43200 0 NZST} + {1474725600 46800 1 NZDT} + {1491055200 43200 0 NZST} + {1506175200 46800 1 NZDT} + {1522504800 43200 0 NZST} + {1538229600 46800 1 NZDT} + {1554559200 43200 0 NZST} + {1569679200 46800 1 NZDT} + {1586008800 43200 0 NZST} + {1601128800 46800 1 NZDT} + {1617458400 43200 0 NZST} + {1632578400 46800 1 NZDT} + {1648908000 43200 0 NZST} + {1664028000 46800 1 NZDT} + {1680357600 43200 0 NZST} + {1695477600 46800 1 NZDT} + {1712412000 43200 0 NZST} + {1727532000 46800 1 NZDT} + {1743861600 43200 0 NZST} + {1758981600 46800 1 NZDT} + {1775311200 43200 0 NZST} + {1790431200 46800 1 NZDT} + {1806760800 43200 0 NZST} + {1821880800 46800 1 NZDT} + {1838210400 43200 0 NZST} + {1853330400 46800 1 NZDT} + {1869660000 43200 0 NZST} + {1885384800 46800 1 NZDT} + {1901714400 43200 0 NZST} + {1916834400 46800 1 NZDT} + {1933164000 43200 0 NZST} + {1948284000 46800 1 NZDT} + {1964613600 43200 0 NZST} + {1979733600 46800 1 NZDT} + {1996063200 43200 0 NZST} + {2011183200 46800 1 NZDT} + {2027512800 43200 0 NZST} + {2042632800 46800 1 NZDT} + {2058962400 43200 0 NZST} + {2074687200 46800 1 NZDT} + {2091016800 43200 0 NZST} + {2106136800 46800 1 NZDT} + {2122466400 43200 0 NZST} + {2137586400 46800 1 NZDT} + {2153916000 43200 0 NZST} + {2169036000 46800 1 NZDT} + {2185365600 43200 0 NZST} + {2200485600 46800 1 NZDT} + {2216815200 43200 0 NZST} + {2232540000 46800 1 NZDT} + {2248869600 43200 0 NZST} + {2263989600 46800 1 NZDT} + {2280319200 43200 0 NZST} + {2295439200 46800 1 NZDT} + {2311768800 43200 0 NZST} + {2326888800 46800 1 NZDT} + {2343218400 43200 0 NZST} + {2358338400 46800 1 NZDT} + {2374668000 43200 0 NZST} + {2389788000 46800 1 NZDT} + {2406117600 43200 0 NZST} + {2421842400 46800 1 NZDT} + {2438172000 43200 0 NZST} + {2453292000 46800 1 NZDT} + {2469621600 43200 0 NZST} + {2484741600 46800 1 NZDT} + {2501071200 43200 0 NZST} + {2516191200 46800 1 NZDT} + {2532520800 43200 0 NZST} + {2547640800 46800 1 NZDT} + {2563970400 43200 0 NZST} + {2579090400 46800 1 NZDT} + {2596024800 43200 0 NZST} + {2611144800 46800 1 NZDT} + {2627474400 43200 0 NZST} + {2642594400 46800 1 NZDT} + {2658924000 43200 0 NZST} + {2674044000 46800 1 NZDT} + {2690373600 43200 0 NZST} + {2705493600 46800 1 NZDT} + {2721823200 43200 0 NZST} + {2736943200 46800 1 NZDT} + {2753272800 43200 0 NZST} + {2768997600 46800 1 NZDT} + {2785327200 43200 0 NZST} + {2800447200 46800 1 NZDT} + {2816776800 43200 0 NZST} + {2831896800 46800 1 NZDT} + {2848226400 43200 0 NZST} + {2863346400 46800 1 NZDT} + {2879676000 43200 0 NZST} + {2894796000 46800 1 NZDT} + {2911125600 43200 0 NZST} + {2926245600 46800 1 NZDT} + {2942575200 43200 0 NZST} + {2958300000 46800 1 NZDT} + {2974629600 43200 0 NZST} + {2989749600 46800 1 NZDT} + {3006079200 43200 0 NZST} + {3021199200 46800 1 NZDT} + {3037528800 43200 0 NZST} + {3052648800 46800 1 NZDT} + {3068978400 43200 0 NZST} + {3084098400 46800 1 NZDT} + {3100428000 43200 0 NZST} + {3116152800 46800 1 NZDT} + {3132482400 43200 0 NZST} + {3147602400 46800 1 NZDT} + {3163932000 43200 0 NZST} + {3179052000 46800 1 NZDT} + {3195381600 43200 0 NZST} + {3210501600 46800 1 NZDT} + {3226831200 43200 0 NZST} + {3241951200 46800 1 NZDT} + {3258280800 43200 0 NZST} + {3273400800 46800 1 NZDT} + {3289730400 43200 0 NZST} + {3305455200 46800 1 NZDT} + {3321784800 43200 0 NZST} + {3336904800 46800 1 NZDT} + {3353234400 43200 0 NZST} + {3368354400 46800 1 NZDT} + {3384684000 43200 0 NZST} + {3399804000 46800 1 NZDT} + {3416133600 43200 0 NZST} + {3431253600 46800 1 NZDT} + {3447583200 43200 0 NZST} + {3462703200 46800 1 NZDT} + {3479637600 43200 0 NZST} + {3494757600 46800 1 NZDT} + {3511087200 43200 0 NZST} + {3526207200 46800 1 NZDT} + {3542536800 43200 0 NZST} + {3557656800 46800 1 NZDT} + {3573986400 43200 0 NZST} + {3589106400 46800 1 NZDT} + {3605436000 43200 0 NZST} + {3620556000 46800 1 NZDT} + {3636885600 43200 0 NZST} + {3652610400 46800 1 NZDT} + {3668940000 43200 0 NZST} + {3684060000 46800 1 NZDT} + {3700389600 43200 0 NZST} + {3715509600 46800 1 NZDT} + {3731839200 43200 0 NZST} + {3746959200 46800 1 NZDT} + {3763288800 43200 0 NZST} + {3778408800 46800 1 NZDT} + {3794738400 43200 0 NZST} + {3809858400 46800 1 NZDT} + {3826188000 43200 0 NZST} + {3841912800 46800 1 NZDT} + {3858242400 43200 0 NZST} + {3873362400 46800 1 NZDT} + {3889692000 43200 0 NZST} + {3904812000 46800 1 NZDT} + {3921141600 43200 0 NZST} + {3936261600 46800 1 NZDT} + {3952591200 43200 0 NZST} + {3967711200 46800 1 NZDT} + {3984040800 43200 0 NZST} + {3999765600 46800 1 NZDT} + {4016095200 43200 0 NZST} + {4031215200 46800 1 NZDT} + {4047544800 43200 0 NZST} + {4062664800 46800 1 NZDT} + {4078994400 43200 0 NZST} + {4094114400 46800 1 NZDT} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Bougainville b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Bougainville new file mode 100644 index 00000000..3c00b291 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Bougainville @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Bougainville) { + {-9223372036854775808 37336 0 LMT} + {-2840178136 35312 0 PMMT} + {-2366790512 36000 0 +10} + {-868010400 32400 0 +09} + {-768906000 36000 0 +10} + {1419696000 39600 0 +11} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Chatham b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Chatham new file mode 100644 index 00000000..6c1ab19e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Chatham @@ -0,0 +1,258 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Chatham) { + {-9223372036854775808 44028 0 LMT} + {-3192437628 44100 0 +1215} + {-757426500 45900 0 +1245} + {152632800 49500 1 +1245} + {162309600 45900 0 +1245} + {183477600 49500 1 +1245} + {194968800 45900 0 +1245} + {215532000 49500 1 +1245} + {226418400 45900 0 +1245} + {246981600 49500 1 +1245} + {257868000 45900 0 +1245} + {278431200 49500 1 +1245} + {289317600 45900 0 +1245} + {309880800 49500 1 +1245} + {320767200 45900 0 +1245} + {341330400 49500 1 +1245} + {352216800 45900 0 +1245} + {372780000 49500 1 +1245} + {384271200 45900 0 +1245} + {404834400 49500 1 +1245} + {415720800 45900 0 +1245} + {436284000 49500 1 +1245} + {447170400 45900 0 +1245} + {467733600 49500 1 +1245} + {478620000 45900 0 +1245} + {499183200 49500 1 +1245} + {510069600 45900 0 +1245} + {530632800 49500 1 +1245} + {541519200 45900 0 +1245} + {562082400 49500 1 +1245} + {573573600 45900 0 +1245} + {594136800 49500 1 +1245} + {605023200 45900 0 +1245} + {623772000 49500 1 +1245} + {637682400 45900 0 +1245} + {655221600 49500 1 +1245} + {669132000 45900 0 +1245} + {686671200 49500 1 +1245} + {700581600 45900 0 +1245} + {718120800 49500 1 +1245} + {732636000 45900 0 +1245} + {749570400 49500 1 +1245} + {764085600 45900 0 +1245} + {781020000 49500 1 +1245} + {795535200 45900 0 +1245} + {812469600 49500 1 +1245} + {826984800 45900 0 +1245} + {844524000 49500 1 +1245} + {858434400 45900 0 +1245} + {875973600 49500 1 +1245} + {889884000 45900 0 +1245} + {907423200 49500 1 +1245} + {921938400 45900 0 +1245} + {938872800 49500 1 +1245} + {953388000 45900 0 +1245} + {970322400 49500 1 +1245} + {984837600 45900 0 +1245} + {1002376800 49500 1 +1245} + {1016287200 45900 0 +1245} + {1033826400 49500 1 +1245} + {1047736800 45900 0 +1245} + {1065276000 49500 1 +1245} + {1079791200 45900 0 +1245} + {1096725600 49500 1 +1245} + {1111240800 45900 0 +1245} + {1128175200 49500 1 +1245} + {1142690400 45900 0 +1245} + {1159624800 49500 1 +1245} + {1174140000 45900 0 +1245} + {1191074400 49500 1 +1245} + {1207404000 45900 0 +1245} + {1222524000 49500 1 +1245} + {1238853600 45900 0 +1245} + {1253973600 49500 1 +1245} + {1270303200 45900 0 +1245} + {1285423200 49500 1 +1245} + {1301752800 45900 0 +1245} + {1316872800 49500 1 +1245} + {1333202400 45900 0 +1245} + {1348927200 49500 1 +1245} + {1365256800 45900 0 +1245} + {1380376800 49500 1 +1245} + {1396706400 45900 0 +1245} + {1411826400 49500 1 +1245} + {1428156000 45900 0 +1245} + {1443276000 49500 1 +1245} + {1459605600 45900 0 +1245} + {1474725600 49500 1 +1245} + {1491055200 45900 0 +1245} + {1506175200 49500 1 +1245} + {1522504800 45900 0 +1245} + {1538229600 49500 1 +1245} + {1554559200 45900 0 +1245} + {1569679200 49500 1 +1245} + {1586008800 45900 0 +1245} + {1601128800 49500 1 +1245} + {1617458400 45900 0 +1245} + {1632578400 49500 1 +1245} + {1648908000 45900 0 +1245} + {1664028000 49500 1 +1245} + {1680357600 45900 0 +1245} + {1695477600 49500 1 +1245} + {1712412000 45900 0 +1245} + {1727532000 49500 1 +1245} + {1743861600 45900 0 +1245} + {1758981600 49500 1 +1245} + {1775311200 45900 0 +1245} + {1790431200 49500 1 +1245} + {1806760800 45900 0 +1245} + {1821880800 49500 1 +1245} + {1838210400 45900 0 +1245} + {1853330400 49500 1 +1245} + {1869660000 45900 0 +1245} + {1885384800 49500 1 +1245} + {1901714400 45900 0 +1245} + {1916834400 49500 1 +1245} + {1933164000 45900 0 +1245} + {1948284000 49500 1 +1245} + {1964613600 45900 0 +1245} + {1979733600 49500 1 +1245} + {1996063200 45900 0 +1245} + {2011183200 49500 1 +1245} + {2027512800 45900 0 +1245} + {2042632800 49500 1 +1245} + {2058962400 45900 0 +1245} + {2074687200 49500 1 +1245} + {2091016800 45900 0 +1245} + {2106136800 49500 1 +1245} + {2122466400 45900 0 +1245} + {2137586400 49500 1 +1245} + {2153916000 45900 0 +1245} + {2169036000 49500 1 +1245} + {2185365600 45900 0 +1245} + {2200485600 49500 1 +1245} + {2216815200 45900 0 +1245} + {2232540000 49500 1 +1245} + {2248869600 45900 0 +1245} + {2263989600 49500 1 +1245} + {2280319200 45900 0 +1245} + {2295439200 49500 1 +1245} + {2311768800 45900 0 +1245} + {2326888800 49500 1 +1245} + {2343218400 45900 0 +1245} + {2358338400 49500 1 +1245} + {2374668000 45900 0 +1245} + {2389788000 49500 1 +1245} + {2406117600 45900 0 +1245} + {2421842400 49500 1 +1245} + {2438172000 45900 0 +1245} + {2453292000 49500 1 +1245} + {2469621600 45900 0 +1245} + {2484741600 49500 1 +1245} + {2501071200 45900 0 +1245} + {2516191200 49500 1 +1245} + {2532520800 45900 0 +1245} + {2547640800 49500 1 +1245} + {2563970400 45900 0 +1245} + {2579090400 49500 1 +1245} + {2596024800 45900 0 +1245} + {2611144800 49500 1 +1245} + {2627474400 45900 0 +1245} + {2642594400 49500 1 +1245} + {2658924000 45900 0 +1245} + {2674044000 49500 1 +1245} + {2690373600 45900 0 +1245} + {2705493600 49500 1 +1245} + {2721823200 45900 0 +1245} + {2736943200 49500 1 +1245} + {2753272800 45900 0 +1245} + {2768997600 49500 1 +1245} + {2785327200 45900 0 +1245} + {2800447200 49500 1 +1245} + {2816776800 45900 0 +1245} + {2831896800 49500 1 +1245} + {2848226400 45900 0 +1245} + {2863346400 49500 1 +1245} + {2879676000 45900 0 +1245} + {2894796000 49500 1 +1245} + {2911125600 45900 0 +1245} + {2926245600 49500 1 +1245} + {2942575200 45900 0 +1245} + {2958300000 49500 1 +1245} + {2974629600 45900 0 +1245} + {2989749600 49500 1 +1245} + {3006079200 45900 0 +1245} + {3021199200 49500 1 +1245} + {3037528800 45900 0 +1245} + {3052648800 49500 1 +1245} + {3068978400 45900 0 +1245} + {3084098400 49500 1 +1245} + {3100428000 45900 0 +1245} + {3116152800 49500 1 +1245} + {3132482400 45900 0 +1245} + {3147602400 49500 1 +1245} + {3163932000 45900 0 +1245} + {3179052000 49500 1 +1245} + {3195381600 45900 0 +1245} + {3210501600 49500 1 +1245} + {3226831200 45900 0 +1245} + {3241951200 49500 1 +1245} + {3258280800 45900 0 +1245} + {3273400800 49500 1 +1245} + {3289730400 45900 0 +1245} + {3305455200 49500 1 +1245} + {3321784800 45900 0 +1245} + {3336904800 49500 1 +1245} + {3353234400 45900 0 +1245} + {3368354400 49500 1 +1245} + {3384684000 45900 0 +1245} + {3399804000 49500 1 +1245} + {3416133600 45900 0 +1245} + {3431253600 49500 1 +1245} + {3447583200 45900 0 +1245} + {3462703200 49500 1 +1245} + {3479637600 45900 0 +1245} + {3494757600 49500 1 +1245} + {3511087200 45900 0 +1245} + {3526207200 49500 1 +1245} + {3542536800 45900 0 +1245} + {3557656800 49500 1 +1245} + {3573986400 45900 0 +1245} + {3589106400 49500 1 +1245} + {3605436000 45900 0 +1245} + {3620556000 49500 1 +1245} + {3636885600 45900 0 +1245} + {3652610400 49500 1 +1245} + {3668940000 45900 0 +1245} + {3684060000 49500 1 +1245} + {3700389600 45900 0 +1245} + {3715509600 49500 1 +1245} + {3731839200 45900 0 +1245} + {3746959200 49500 1 +1245} + {3763288800 45900 0 +1245} + {3778408800 49500 1 +1245} + {3794738400 45900 0 +1245} + {3809858400 49500 1 +1245} + {3826188000 45900 0 +1245} + {3841912800 49500 1 +1245} + {3858242400 45900 0 +1245} + {3873362400 49500 1 +1245} + {3889692000 45900 0 +1245} + {3904812000 49500 1 +1245} + {3921141600 45900 0 +1245} + {3936261600 49500 1 +1245} + {3952591200 45900 0 +1245} + {3967711200 49500 1 +1245} + {3984040800 45900 0 +1245} + {3999765600 49500 1 +1245} + {4016095200 45900 0 +1245} + {4031215200 49500 1 +1245} + {4047544800 45900 0 +1245} + {4062664800 49500 1 +1245} + {4078994400 45900 0 +1245} + {4094114400 49500 1 +1245} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Chuuk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Chuuk new file mode 100644 index 00000000..5e2960c9 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Chuuk @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Port_Moresby)]} { + LoadTimeZoneFile Pacific/Port_Moresby +} +set TZData(:Pacific/Chuuk) $TZData(:Pacific/Port_Moresby) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Easter b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Easter new file mode 100644 index 00000000..97e1f4fd --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Easter @@ -0,0 +1,268 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Easter) { + {-9223372036854775808 -26248 0 LMT} + {-2524495352 -26248 0 EMT} + {-1178124152 -25200 0 -07} + {-36619200 -21600 1 -07} + {-23922000 -25200 0 -07} + {-3355200 -21600 1 -07} + {7527600 -25200 0 -07} + {24465600 -21600 1 -07} + {37767600 -25200 0 -07} + {55915200 -21600 1 -07} + {69217200 -25200 0 -07} + {87969600 -21600 1 -07} + {100666800 -25200 0 -07} + {118209600 -21600 1 -07} + {132116400 -25200 0 -07} + {150868800 -21600 1 -07} + {163566000 -25200 0 -07} + {182318400 -21600 1 -07} + {195620400 -25200 0 -07} + {213768000 -21600 1 -07} + {227070000 -25200 0 -07} + {245217600 -21600 1 -07} + {258519600 -25200 0 -07} + {277272000 -21600 1 -07} + {289969200 -25200 0 -07} + {308721600 -21600 1 -07} + {321418800 -25200 0 -07} + {340171200 -21600 1 -07} + {353473200 -25200 0 -07} + {371620800 -21600 1 -07} + {384922800 -21600 0 -06} + {403070400 -18000 1 -06} + {416372400 -21600 0 -06} + {434520000 -18000 1 -06} + {447822000 -21600 0 -06} + {466574400 -18000 1 -06} + {479271600 -21600 0 -06} + {498024000 -18000 1 -06} + {510721200 -21600 0 -06} + {529473600 -18000 1 -06} + {545194800 -21600 0 -06} + {560923200 -18000 1 -06} + {574225200 -21600 0 -06} + {592372800 -18000 1 -06} + {605674800 -21600 0 -06} + {624427200 -18000 1 -06} + {637124400 -21600 0 -06} + {653457600 -18000 1 -06} + {668574000 -21600 0 -06} + {687326400 -18000 1 -06} + {700628400 -21600 0 -06} + {718776000 -18000 1 -06} + {732078000 -21600 0 -06} + {750225600 -18000 1 -06} + {763527600 -21600 0 -06} + {781675200 -18000 1 -06} + {794977200 -21600 0 -06} + {813729600 -18000 1 -06} + {826426800 -21600 0 -06} + {845179200 -18000 1 -06} + {859690800 -21600 0 -06} + {876628800 -18000 1 -06} + {889930800 -21600 0 -06} + {906868800 -18000 1 -06} + {923194800 -21600 0 -06} + {939528000 -18000 1 -06} + {952830000 -21600 0 -06} + {971582400 -18000 1 -06} + {984279600 -21600 0 -06} + {1003032000 -18000 1 -06} + {1015729200 -21600 0 -06} + {1034481600 -18000 1 -06} + {1047178800 -21600 0 -06} + {1065931200 -18000 1 -06} + {1079233200 -21600 0 -06} + {1097380800 -18000 1 -06} + {1110682800 -21600 0 -06} + {1128830400 -18000 1 -06} + {1142132400 -21600 0 -06} + {1160884800 -18000 1 -06} + {1173582000 -21600 0 -06} + {1192334400 -18000 1 -06} + {1206846000 -21600 0 -06} + {1223784000 -18000 1 -06} + {1237086000 -21600 0 -06} + {1255233600 -18000 1 -06} + {1270350000 -21600 0 -06} + {1286683200 -18000 1 -06} + {1304823600 -21600 0 -06} + {1313899200 -18000 1 -06} + {1335668400 -21600 0 -06} + {1346558400 -18000 1 -06} + {1367118000 -21600 0 -06} + {1378612800 -18000 1 -06} + {1398567600 -21600 0 -06} + {1410062400 -18000 1 -06} + {1463281200 -21600 0 -06} + {1471147200 -18000 1 -06} + {1494730800 -21600 0 -06} + {1502596800 -18000 1 -06} + {1526180400 -21600 0 -06} + {1534046400 -18000 1 -06} + {1554606000 -21600 0 -06} + {1567915200 -18000 1 -06} + {1586055600 -21600 0 -06} + {1599364800 -18000 1 -06} + {1617505200 -21600 0 -06} + {1630814400 -18000 1 -06} + {1648954800 -21600 0 -06} + {1662868800 -18000 1 -06} + {1680404400 -21600 0 -06} + {1693713600 -18000 1 -06} + {1712458800 -21600 0 -06} + {1725768000 -18000 1 -06} + {1743908400 -21600 0 -06} + {1757217600 -18000 1 -06} + {1775358000 -21600 0 -06} + {1788667200 -18000 1 -06} + {1806807600 -21600 0 -06} + {1820116800 -18000 1 -06} + {1838257200 -21600 0 -06} + {1851566400 -18000 1 -06} + {1870311600 -21600 0 -06} + {1883016000 -18000 1 -06} + {1901761200 -21600 0 -06} + {1915070400 -18000 1 -06} + {1933210800 -21600 0 -06} + {1946520000 -18000 1 -06} + {1964660400 -21600 0 -06} + {1977969600 -18000 1 -06} + {1996110000 -21600 0 -06} + {2009419200 -18000 1 -06} + {2027559600 -21600 0 -06} + {2040868800 -18000 1 -06} + {2059614000 -21600 0 -06} + {2072318400 -18000 1 -06} + {2091063600 -21600 0 -06} + {2104372800 -18000 1 -06} + {2122513200 -21600 0 -06} + {2135822400 -18000 1 -06} + {2153962800 -21600 0 -06} + {2167272000 -18000 1 -06} + {2185412400 -21600 0 -06} + {2198721600 -18000 1 -06} + {2217466800 -21600 0 -06} + {2230171200 -18000 1 -06} + {2248916400 -21600 0 -06} + {2262225600 -18000 1 -06} + {2280366000 -21600 0 -06} + {2293675200 -18000 1 -06} + {2311815600 -21600 0 -06} + {2325124800 -18000 1 -06} + {2343265200 -21600 0 -06} + {2356574400 -18000 1 -06} + {2374714800 -21600 0 -06} + {2388024000 -18000 1 -06} + {2406769200 -21600 0 -06} + {2419473600 -18000 1 -06} + {2438218800 -21600 0 -06} + {2451528000 -18000 1 -06} + {2469668400 -21600 0 -06} + {2482977600 -18000 1 -06} + {2501118000 -21600 0 -06} + {2514427200 -18000 1 -06} + {2532567600 -21600 0 -06} + {2545876800 -18000 1 -06} + {2564017200 -21600 0 -06} + {2577326400 -18000 1 -06} + {2596071600 -21600 0 -06} + {2609380800 -18000 1 -06} + {2627521200 -21600 0 -06} + {2640830400 -18000 1 -06} + {2658970800 -21600 0 -06} + {2672280000 -18000 1 -06} + {2690420400 -21600 0 -06} + {2703729600 -18000 1 -06} + {2721870000 -21600 0 -06} + {2735179200 -18000 1 -06} + {2753924400 -21600 0 -06} + {2766628800 -18000 1 -06} + {2785374000 -21600 0 -06} + {2798683200 -18000 1 -06} + {2816823600 -21600 0 -06} + {2830132800 -18000 1 -06} + {2848273200 -21600 0 -06} + {2861582400 -18000 1 -06} + {2879722800 -21600 0 -06} + {2893032000 -18000 1 -06} + {2911172400 -21600 0 -06} + {2924481600 -18000 1 -06} + {2943226800 -21600 0 -06} + {2955931200 -18000 1 -06} + {2974676400 -21600 0 -06} + {2987985600 -18000 1 -06} + {3006126000 -21600 0 -06} + {3019435200 -18000 1 -06} + {3037575600 -21600 0 -06} + {3050884800 -18000 1 -06} + {3069025200 -21600 0 -06} + {3082334400 -18000 1 -06} + {3101079600 -21600 0 -06} + {3113784000 -18000 1 -06} + {3132529200 -21600 0 -06} + {3145838400 -18000 1 -06} + {3163978800 -21600 0 -06} + {3177288000 -18000 1 -06} + {3195428400 -21600 0 -06} + {3208737600 -18000 1 -06} + {3226878000 -21600 0 -06} + {3240187200 -18000 1 -06} + {3258327600 -21600 0 -06} + {3271636800 -18000 1 -06} + {3290382000 -21600 0 -06} + {3303086400 -18000 1 -06} + {3321831600 -21600 0 -06} + {3335140800 -18000 1 -06} + {3353281200 -21600 0 -06} + {3366590400 -18000 1 -06} + {3384730800 -21600 0 -06} + {3398040000 -18000 1 -06} + {3416180400 -21600 0 -06} + {3429489600 -18000 1 -06} + {3447630000 -21600 0 -06} + {3460939200 -18000 1 -06} + {3479684400 -21600 0 -06} + {3492993600 -18000 1 -06} + {3511134000 -21600 0 -06} + {3524443200 -18000 1 -06} + {3542583600 -21600 0 -06} + {3555892800 -18000 1 -06} + {3574033200 -21600 0 -06} + {3587342400 -18000 1 -06} + {3605482800 -21600 0 -06} + {3618792000 -18000 1 -06} + {3637537200 -21600 0 -06} + {3650241600 -18000 1 -06} + {3668986800 -21600 0 -06} + {3682296000 -18000 1 -06} + {3700436400 -21600 0 -06} + {3713745600 -18000 1 -06} + {3731886000 -21600 0 -06} + {3745195200 -18000 1 -06} + {3763335600 -21600 0 -06} + {3776644800 -18000 1 -06} + {3794785200 -21600 0 -06} + {3808094400 -18000 1 -06} + {3826839600 -21600 0 -06} + {3839544000 -18000 1 -06} + {3858289200 -21600 0 -06} + {3871598400 -18000 1 -06} + {3889738800 -21600 0 -06} + {3903048000 -18000 1 -06} + {3921188400 -21600 0 -06} + {3934497600 -18000 1 -06} + {3952638000 -21600 0 -06} + {3965947200 -18000 1 -06} + {3984692400 -21600 0 -06} + {3997396800 -18000 1 -06} + {4016142000 -21600 0 -06} + {4029451200 -18000 1 -06} + {4047591600 -21600 0 -06} + {4060900800 -18000 1 -06} + {4079041200 -21600 0 -06} + {4092350400 -18000 1 -06} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Efate b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Efate new file mode 100644 index 00000000..5a225468 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Efate @@ -0,0 +1,28 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Efate) { + {-9223372036854775808 40396 0 LMT} + {-1829387596 39600 0 +11} + {125409600 43200 1 +11} + {133876800 39600 0 +11} + {433256400 43200 1 +11} + {448977600 39600 0 +11} + {464706000 43200 1 +11} + {480427200 39600 0 +11} + {496760400 43200 1 +11} + {511876800 39600 0 +11} + {528210000 43200 1 +11} + {543931200 39600 0 +11} + {559659600 43200 1 +11} + {575380800 39600 0 +11} + {591109200 43200 1 +11} + {606830400 39600 0 +11} + {622558800 43200 1 +11} + {638280000 39600 0 +11} + {654008400 43200 1 +11} + {669729600 39600 0 +11} + {686062800 43200 1 +11} + {696340800 39600 0 +11} + {719931600 43200 1 +11} + {727790400 39600 0 +11} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Enderbury b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Enderbury new file mode 100644 index 00000000..5c4c6d7a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Enderbury @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Kanton)]} { + LoadTimeZoneFile Pacific/Kanton +} +set TZData(:Pacific/Enderbury) $TZData(:Pacific/Kanton) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Fakaofo b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Fakaofo new file mode 100644 index 00000000..d75030db --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Fakaofo @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Fakaofo) { + {-9223372036854775808 -41096 0 LMT} + {-2177411704 -39600 0 -11} + {1325242800 46800 0 +13} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Fiji b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Fiji new file mode 100644 index 00000000..c1d748b0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Fiji @@ -0,0 +1,34 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Fiji) { + {-9223372036854775808 42944 0 LMT} + {-1709985344 43200 0 +12} + {909842400 46800 1 +12} + {920124000 43200 0 +12} + {941896800 46800 1 +12} + {951573600 43200 0 +12} + {1259416800 46800 1 +12} + {1269698400 43200 0 +12} + {1287842400 46800 1 +12} + {1299333600 43200 0 +12} + {1319292000 46800 1 +12} + {1327154400 43200 0 +12} + {1350741600 46800 1 +12} + {1358604000 43200 0 +12} + {1382796000 46800 1 +12} + {1390050000 43200 0 +12} + {1414850400 46800 1 +12} + {1421503200 43200 0 +12} + {1446300000 46800 1 +12} + {1452952800 43200 0 +12} + {1478354400 46800 1 +12} + {1484402400 43200 0 +12} + {1509804000 46800 1 +12} + {1515852000 43200 0 +12} + {1541253600 46800 1 +12} + {1547301600 43200 0 +12} + {1573308000 46800 1 +12} + {1578751200 43200 0 +12} + {1608386400 46800 1 +12} + {1610805600 43200 0 +12} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Funafuti b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Funafuti new file mode 100644 index 00000000..d932469d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Funafuti @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Tarawa)]} { + LoadTimeZoneFile Pacific/Tarawa +} +set TZData(:Pacific/Funafuti) $TZData(:Pacific/Tarawa) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Galapagos b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Galapagos new file mode 100644 index 00000000..180ce6af --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Galapagos @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Galapagos) { + {-9223372036854775808 -21504 0 LMT} + {-1230746496 -18000 0 -05} + {504939600 -21600 0 -06} + {722930400 -18000 1 -06} + {728888400 -21600 0 -06} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Gambier b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Gambier new file mode 100644 index 00000000..9ebd97cc --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Gambier @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Gambier) { + {-9223372036854775808 -32388 0 LMT} + {-1806678012 -32400 0 -09} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Guadalcanal b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Guadalcanal new file mode 100644 index 00000000..7e13e6e2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Guadalcanal @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Guadalcanal) { + {-9223372036854775808 38388 0 LMT} + {-1806748788 39600 0 +11} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Guam b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Guam new file mode 100644 index 00000000..612aef3b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Guam @@ -0,0 +1,26 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Guam) { + {-9223372036854775808 -51660 0 LMT} + {-3944626740 34740 0 LMT} + {-2177487540 36000 0 GST} + {-885549600 32400 0 +09} + {-802256400 36000 0 GST} + {-331891200 39600 1 GDT} + {-281610000 36000 0 GST} + {-73728000 39600 1 GDT} + {-29415540 36000 0 GST} + {-16704000 39600 1 GDT} + {-10659600 36000 0 GST} + {9907200 39600 1 GDT} + {21394800 36000 0 GST} + {41356800 39600 1 GDT} + {52844400 36000 0 GST} + {124819200 39600 1 GDT} + {130863600 36000 0 GST} + {201888000 39600 1 GDT} + {209487660 36000 0 GST} + {230659200 39600 1 GDT} + {241542000 36000 0 GST} + {977493600 36000 0 ChST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Honolulu b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Honolulu new file mode 100644 index 00000000..7d03b457 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Honolulu @@ -0,0 +1,12 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Honolulu) { + {-9223372036854775808 -37886 0 LMT} + {-2334101314 -37800 0 HST} + {-1157283000 -34200 1 HDT} + {-1155436200 -34200 0 HST} + {-880201800 -34200 1 HWT} + {-769395600 -34200 1 HPT} + {-765376200 -37800 0 HST} + {-712150200 -36000 0 HST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Johnston b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Johnston new file mode 100644 index 00000000..21ab39a5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Johnston @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Honolulu)]} { + LoadTimeZoneFile Pacific/Honolulu +} +set TZData(:Pacific/Johnston) $TZData(:Pacific/Honolulu) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kanton b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kanton new file mode 100644 index 00000000..061c2b55 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kanton @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Kanton) { + {-9223372036854775808 0 0 -00} + {-1020470400 -43200 0 -12} + {307627200 -39600 0 -11} + {788871600 46800 0 +13} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kiritimati b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kiritimati new file mode 100644 index 00000000..7d600f3c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kiritimati @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Kiritimati) { + {-9223372036854775808 -37760 0 LMT} + {-2177415040 -38400 0 -1040} + {307622400 -36000 0 -10} + {788868000 50400 0 +14} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kosrae b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kosrae new file mode 100644 index 00000000..87b33e57 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kosrae @@ -0,0 +1,14 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Kosrae) { + {-9223372036854775808 -47284 0 LMT} + {-3944631116 39116 0 LMT} + {-2177491916 39600 0 +11} + {-1743678000 32400 0 +09} + {-1606813200 39600 0 +11} + {-1041418800 36000 0 +10} + {-907408800 32400 0 +09} + {-770634000 39600 0 +11} + {-7988400 43200 0 +12} + {915105600 39600 0 +11} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kwajalein b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kwajalein new file mode 100644 index 00000000..bd260c7b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Kwajalein @@ -0,0 +1,11 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Kwajalein) { + {-9223372036854775808 40160 0 LMT} + {-2177492960 39600 0 +11} + {-1041418800 36000 0 +10} + {-907408800 32400 0 +09} + {-817462800 39600 0 +11} + {-7988400 -43200 0 -12} + {745934400 43200 0 +12} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Majuro b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Majuro new file mode 100644 index 00000000..b30f4940 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Majuro @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Tarawa)]} { + LoadTimeZoneFile Pacific/Tarawa +} +set TZData(:Pacific/Majuro) $TZData(:Pacific/Tarawa) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Marquesas b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Marquesas new file mode 100644 index 00000000..ac77a2f1 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Marquesas @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Marquesas) { + {-9223372036854775808 -33480 0 LMT} + {-1806676920 -34200 0 -0930} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Midway b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Midway new file mode 100644 index 00000000..d044569d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Midway @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Pago_Pago)]} { + LoadTimeZoneFile Pacific/Pago_Pago +} +set TZData(:Pacific/Midway) $TZData(:Pacific/Pago_Pago) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Nauru b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Nauru new file mode 100644 index 00000000..fe354116 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Nauru @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Nauru) { + {-9223372036854775808 40060 0 LMT} + {-1545131260 41400 0 +1130} + {-862918200 32400 0 +09} + {-767350800 41400 0 +1130} + {287418600 43200 0 +12} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Niue b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Niue new file mode 100644 index 00000000..752f5b77 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Niue @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Niue) { + {-9223372036854775808 -40780 0 LMT} + {-543069620 -40800 0 -1120} + {-173623200 -39600 0 -11} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Norfolk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Norfolk new file mode 100644 index 00000000..f686df54 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Norfolk @@ -0,0 +1,172 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Norfolk) { + {-9223372036854775808 40312 0 LMT} + {-2177493112 40320 0 +1112} + {-599656320 41400 0 +1130} + {152029800 45000 1 +1230} + {162916200 41400 0 +1130} + {1443882600 39600 0 +11} + {1561899600 39600 0 +12} + {1570287600 43200 1 +12} + {1586012400 39600 0 +12} + {1601737200 43200 1 +12} + {1617462000 39600 0 +12} + {1633186800 43200 1 +12} + {1648911600 39600 0 +12} + {1664636400 43200 1 +12} + {1680361200 39600 0 +12} + {1696086000 43200 1 +12} + {1712415600 39600 0 +12} + {1728140400 43200 1 +12} + {1743865200 39600 0 +12} + {1759590000 43200 1 +12} + {1775314800 39600 0 +12} + {1791039600 43200 1 +12} + {1806764400 39600 0 +12} + {1822489200 43200 1 +12} + {1838214000 39600 0 +12} + {1853938800 43200 1 +12} + {1869663600 39600 0 +12} + {1885993200 43200 1 +12} + {1901718000 39600 0 +12} + {1917442800 43200 1 +12} + {1933167600 39600 0 +12} + {1948892400 43200 1 +12} + {1964617200 39600 0 +12} + {1980342000 43200 1 +12} + {1996066800 39600 0 +12} + {2011791600 43200 1 +12} + {2027516400 39600 0 +12} + {2043241200 43200 1 +12} + {2058966000 39600 0 +12} + {2075295600 43200 1 +12} + {2091020400 39600 0 +12} + {2106745200 43200 1 +12} + {2122470000 39600 0 +12} + {2138194800 43200 1 +12} + {2153919600 39600 0 +12} + {2169644400 43200 1 +12} + {2185369200 39600 0 +12} + {2201094000 43200 1 +12} + {2216818800 39600 0 +12} + {2233148400 43200 1 +12} + {2248873200 39600 0 +12} + {2264598000 43200 1 +12} + {2280322800 39600 0 +12} + {2296047600 43200 1 +12} + {2311772400 39600 0 +12} + {2327497200 43200 1 +12} + {2343222000 39600 0 +12} + {2358946800 43200 1 +12} + {2374671600 39600 0 +12} + {2390396400 43200 1 +12} + {2406121200 39600 0 +12} + {2422450800 43200 1 +12} + {2438175600 39600 0 +12} + {2453900400 43200 1 +12} + {2469625200 39600 0 +12} + {2485350000 43200 1 +12} + {2501074800 39600 0 +12} + {2516799600 43200 1 +12} + {2532524400 39600 0 +12} + {2548249200 43200 1 +12} + {2563974000 39600 0 +12} + {2579698800 43200 1 +12} + {2596028400 39600 0 +12} + {2611753200 43200 1 +12} + {2627478000 39600 0 +12} + {2643202800 43200 1 +12} + {2658927600 39600 0 +12} + {2674652400 43200 1 +12} + {2690377200 39600 0 +12} + {2706102000 43200 1 +12} + {2721826800 39600 0 +12} + {2737551600 43200 1 +12} + {2753276400 39600 0 +12} + {2769606000 43200 1 +12} + {2785330800 39600 0 +12} + {2801055600 43200 1 +12} + {2816780400 39600 0 +12} + {2832505200 43200 1 +12} + {2848230000 39600 0 +12} + {2863954800 43200 1 +12} + {2879679600 39600 0 +12} + {2895404400 43200 1 +12} + {2911129200 39600 0 +12} + {2926854000 43200 1 +12} + {2942578800 39600 0 +12} + {2958908400 43200 1 +12} + {2974633200 39600 0 +12} + {2990358000 43200 1 +12} + {3006082800 39600 0 +12} + {3021807600 43200 1 +12} + {3037532400 39600 0 +12} + {3053257200 43200 1 +12} + {3068982000 39600 0 +12} + {3084706800 43200 1 +12} + {3100431600 39600 0 +12} + {3116761200 43200 1 +12} + {3132486000 39600 0 +12} + {3148210800 43200 1 +12} + {3163935600 39600 0 +12} + {3179660400 43200 1 +12} + {3195385200 39600 0 +12} + {3211110000 43200 1 +12} + {3226834800 39600 0 +12} + {3242559600 43200 1 +12} + {3258284400 39600 0 +12} + {3274009200 43200 1 +12} + {3289734000 39600 0 +12} + {3306063600 43200 1 +12} + {3321788400 39600 0 +12} + {3337513200 43200 1 +12} + {3353238000 39600 0 +12} + {3368962800 43200 1 +12} + {3384687600 39600 0 +12} + {3400412400 43200 1 +12} + {3416137200 39600 0 +12} + {3431862000 43200 1 +12} + {3447586800 39600 0 +12} + {3463311600 43200 1 +12} + {3479641200 39600 0 +12} + {3495366000 43200 1 +12} + {3511090800 39600 0 +12} + {3526815600 43200 1 +12} + {3542540400 39600 0 +12} + {3558265200 43200 1 +12} + {3573990000 39600 0 +12} + {3589714800 43200 1 +12} + {3605439600 39600 0 +12} + {3621164400 43200 1 +12} + {3636889200 39600 0 +12} + {3653218800 43200 1 +12} + {3668943600 39600 0 +12} + {3684668400 43200 1 +12} + {3700393200 39600 0 +12} + {3716118000 43200 1 +12} + {3731842800 39600 0 +12} + {3747567600 43200 1 +12} + {3763292400 39600 0 +12} + {3779017200 43200 1 +12} + {3794742000 39600 0 +12} + {3810466800 43200 1 +12} + {3826191600 39600 0 +12} + {3842521200 43200 1 +12} + {3858246000 39600 0 +12} + {3873970800 43200 1 +12} + {3889695600 39600 0 +12} + {3905420400 43200 1 +12} + {3921145200 39600 0 +12} + {3936870000 43200 1 +12} + {3952594800 39600 0 +12} + {3968319600 43200 1 +12} + {3984044400 39600 0 +12} + {4000374000 43200 1 +12} + {4016098800 39600 0 +12} + {4031823600 43200 1 +12} + {4047548400 39600 0 +12} + {4063273200 43200 1 +12} + {4078998000 39600 0 +12} + {4094722800 43200 1 +12} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Pago_Pago b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Pago_Pago new file mode 100644 index 00000000..9b5607fa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Pago_Pago @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Pago_Pago) { + {-9223372036854775808 45432 0 LMT} + {-2445424632 -40968 0 LMT} + {-1861879032 -39600 0 SST} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Palau b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Palau new file mode 100644 index 00000000..b161f4fa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Palau @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Palau) { + {-9223372036854775808 -54124 0 LMT} + {-3944624276 32276 0 LMT} + {-2177485076 32400 0 +09} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Pitcairn b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Pitcairn new file mode 100644 index 00000000..6813978f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Pitcairn @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Pitcairn) { + {-9223372036854775808 -31220 0 LMT} + {-2177421580 -30600 0 -0830} + {893665800 -28800 0 -08} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Pohnpei b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Pohnpei new file mode 100644 index 00000000..a8d9779b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Pohnpei @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Guadalcanal)]} { + LoadTimeZoneFile Pacific/Guadalcanal +} +set TZData(:Pacific/Pohnpei) $TZData(:Pacific/Guadalcanal) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Ponape b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Ponape new file mode 100644 index 00000000..1211f140 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Ponape @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Guadalcanal)]} { + LoadTimeZoneFile Pacific/Guadalcanal +} +set TZData(:Pacific/Ponape) $TZData(:Pacific/Guadalcanal) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Port_Moresby b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Port_Moresby new file mode 100644 index 00000000..c3a5e4fe --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Port_Moresby @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Port_Moresby) { + {-9223372036854775808 35320 0 LMT} + {-2840176120 35312 0 PMMT} + {-2366790512 36000 0 +10} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Saipan b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Saipan new file mode 100644 index 00000000..4e769cd5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Saipan @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Guam)]} { + LoadTimeZoneFile Pacific/Guam +} +set TZData(:Pacific/Saipan) $TZData(:Pacific/Guam) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Tahiti b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Tahiti new file mode 100644 index 00000000..768553c8 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Tahiti @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Tahiti) { + {-9223372036854775808 -35896 0 LMT} + {-1806674504 -36000 0 -10} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Tongatapu b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Tongatapu new file mode 100644 index 00000000..f4bb6859 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Tongatapu @@ -0,0 +1,16 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Tongatapu) { + {-9223372036854775808 44352 0 LMT} + {-767189952 44400 0 +1220} + {-284041200 46800 0 +13} + {915102000 46800 0 +13} + {939214800 50400 1 +13} + {953384400 46800 0 +13} + {973342800 50400 1 +13} + {980596800 46800 0 +13} + {1004792400 50400 1 +13} + {1012046400 46800 0 +13} + {1478350800 50400 1 +13} + {1484398800 46800 0 +13} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Truk b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Truk new file mode 100644 index 00000000..7ddbad7e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Truk @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Port_Moresby)]} { + LoadTimeZoneFile Pacific/Port_Moresby +} +set TZData(:Pacific/Truk) $TZData(:Pacific/Port_Moresby) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Wake b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Wake new file mode 100644 index 00000000..945a8635 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Wake @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Tarawa)]} { + LoadTimeZoneFile Pacific/Tarawa +} +set TZData(:Pacific/Wake) $TZData(:Pacific/Tarawa) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Wallis b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Wallis new file mode 100644 index 00000000..92748f49 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Wallis @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Tarawa)]} { + LoadTimeZoneFile Pacific/Tarawa +} +set TZData(:Pacific/Wallis) $TZData(:Pacific/Tarawa) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Yap b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Yap new file mode 100644 index 00000000..f0b6ae72 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Pacific/Yap @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Port_Moresby)]} { + LoadTimeZoneFile Pacific/Port_Moresby +} +set TZData(:Pacific/Yap) $TZData(:Pacific/Port_Moresby) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Poland b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Poland new file mode 100644 index 00000000..bd240284 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Poland @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Warsaw)]} { + LoadTimeZoneFile Europe/Warsaw +} +set TZData(:Poland) $TZData(:Europe/Warsaw) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Portugal b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Portugal new file mode 100644 index 00000000..d1ffd9f2 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Portugal @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Lisbon)]} { + LoadTimeZoneFile Europe/Lisbon +} +set TZData(:Portugal) $TZData(:Europe/Lisbon) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/ROC b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/ROC new file mode 100644 index 00000000..5dd196d0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/ROC @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Taipei)]} { + LoadTimeZoneFile Asia/Taipei +} +set TZData(:ROC) $TZData(:Asia/Taipei) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/ROK b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/ROK new file mode 100644 index 00000000..1162ce40 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/ROK @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Seoul)]} { + LoadTimeZoneFile Asia/Seoul +} +set TZData(:ROK) $TZData(:Asia/Seoul) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Singapore b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Singapore new file mode 100644 index 00000000..1584b35b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Singapore @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Singapore)]} { + LoadTimeZoneFile Asia/Singapore +} +set TZData(:Singapore) $TZData(:Asia/Singapore) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/AST4 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/AST4 new file mode 100644 index 00000000..eced0d2d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/AST4 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:SystemV/AST4) $TZData(:America/Puerto_Rico) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/AST4ADT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/AST4ADT new file mode 100644 index 00000000..c24308f6 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/AST4ADT @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Halifax)]} { + LoadTimeZoneFile America/Halifax +} +set TZData(:SystemV/AST4ADT) $TZData(:America/Halifax) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/CST6 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/CST6 new file mode 100644 index 00000000..d46c015b --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/CST6 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Regina)]} { + LoadTimeZoneFile America/Regina +} +set TZData(:SystemV/CST6) $TZData(:America/Regina) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/CST6CDT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/CST6CDT new file mode 100644 index 00000000..234af894 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/CST6CDT @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Chicago)]} { + LoadTimeZoneFile America/Chicago +} +set TZData(:SystemV/CST6CDT) $TZData(:America/Chicago) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/EST5 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/EST5 new file mode 100644 index 00000000..52818c1e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/EST5 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Indianapolis)]} { + LoadTimeZoneFile America/Indianapolis +} +set TZData(:SystemV/EST5) $TZData(:America/Indianapolis) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/EST5EDT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/EST5EDT new file mode 100644 index 00000000..6cf27433 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/EST5EDT @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/New_York)]} { + LoadTimeZoneFile America/New_York +} +set TZData(:SystemV/EST5EDT) $TZData(:America/New_York) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/HST10 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/HST10 new file mode 100644 index 00000000..a4316afb --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/HST10 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Honolulu)]} { + LoadTimeZoneFile Pacific/Honolulu +} +set TZData(:SystemV/HST10) $TZData(:Pacific/Honolulu) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/MST7 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/MST7 new file mode 100644 index 00000000..e67a781c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/MST7 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Phoenix)]} { + LoadTimeZoneFile America/Phoenix +} +set TZData(:SystemV/MST7) $TZData(:America/Phoenix) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/MST7MDT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/MST7MDT new file mode 100644 index 00000000..fda5bf1d --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/MST7MDT @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Denver)]} { + LoadTimeZoneFile America/Denver +} +set TZData(:SystemV/MST7MDT) $TZData(:America/Denver) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/PST8 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/PST8 new file mode 100644 index 00000000..8e30bb84 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/PST8 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Pitcairn)]} { + LoadTimeZoneFile Pacific/Pitcairn +} +set TZData(:SystemV/PST8) $TZData(:Pacific/Pitcairn) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/PST8PDT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/PST8PDT new file mode 100644 index 00000000..8281a9af --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/PST8PDT @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Los_Angeles)]} { + LoadTimeZoneFile America/Los_Angeles +} +set TZData(:SystemV/PST8PDT) $TZData(:America/Los_Angeles) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/YST9 b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/YST9 new file mode 100644 index 00000000..32d37173 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/YST9 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Gambier)]} { + LoadTimeZoneFile Pacific/Gambier +} +set TZData(:SystemV/YST9) $TZData(:Pacific/Gambier) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/YST9YDT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/YST9YDT new file mode 100644 index 00000000..fba405f0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/SystemV/YST9YDT @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Anchorage)]} { + LoadTimeZoneFile America/Anchorage +} +set TZData(:SystemV/YST9YDT) $TZData(:America/Anchorage) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Turkey b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Turkey new file mode 100644 index 00000000..e20a7a5e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Turkey @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Istanbul)]} { + LoadTimeZoneFile Europe/Istanbul +} +set TZData(:Turkey) $TZData(:Europe/Istanbul) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/UCT b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/UCT new file mode 100644 index 00000000..acfa48e5 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/UCT @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UTC)]} { + LoadTimeZoneFile Etc/UTC +} +set TZData(:UCT) $TZData(:Etc/UTC) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Aleutian b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Aleutian new file mode 100644 index 00000000..024e70bd --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Aleutian @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Adak)]} { + LoadTimeZoneFile America/Adak +} +set TZData(:US/Aleutian) $TZData(:America/Adak) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Central b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Central new file mode 100644 index 00000000..2aab66e0 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Central @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Chicago)]} { + LoadTimeZoneFile America/Chicago +} +set TZData(:US/Central) $TZData(:America/Chicago) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Eastern b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Eastern new file mode 100644 index 00000000..3cf2651f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Eastern @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/New_York)]} { + LoadTimeZoneFile America/New_York +} +set TZData(:US/Eastern) $TZData(:America/New_York) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Hawaii b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Hawaii new file mode 100644 index 00000000..6d1af655 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Hawaii @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Honolulu)]} { + LoadTimeZoneFile Pacific/Honolulu +} +set TZData(:US/Hawaii) $TZData(:Pacific/Honolulu) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Indiana-Starke b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Indiana-Starke new file mode 100644 index 00000000..6ffe0e2f --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Indiana-Starke @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Indiana/Knox)]} { + LoadTimeZoneFile America/Indiana/Knox +} +set TZData(:US/Indiana-Starke) $TZData(:America/Indiana/Knox) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Michigan b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Michigan new file mode 100644 index 00000000..b15035c7 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Michigan @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Detroit)]} { + LoadTimeZoneFile America/Detroit +} +set TZData(:US/Michigan) $TZData(:America/Detroit) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Mountain b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Mountain new file mode 100644 index 00000000..b54235fa --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Mountain @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Denver)]} { + LoadTimeZoneFile America/Denver +} +set TZData(:US/Mountain) $TZData(:America/Denver) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Pacific b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Pacific new file mode 100644 index 00000000..72322159 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/US/Pacific @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Los_Angeles)]} { + LoadTimeZoneFile America/Los_Angeles +} +set TZData(:US/Pacific) $TZData(:America/Los_Angeles) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/UTC b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/UTC new file mode 100644 index 00000000..6d04d96e --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/UTC @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UTC)]} { + LoadTimeZoneFile Etc/UTC +} +set TZData(:UTC) $TZData(:Etc/UTC) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Universal b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Universal new file mode 100644 index 00000000..4a9ed5eb --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Universal @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UTC)]} { + LoadTimeZoneFile Etc/UTC +} +set TZData(:Universal) $TZData(:Etc/UTC) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/W-SU b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/W-SU new file mode 100644 index 00000000..7e1f613a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/W-SU @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Moscow)]} { + LoadTimeZoneFile Europe/Moscow +} +set TZData(:W-SU) $TZData(:Europe/Moscow) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/WET b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/WET new file mode 100644 index 00000000..60366a3c --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/WET @@ -0,0 +1,251 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:WET) { + {-9223372036854775808 0 0 WET} + {228877200 3600 1 WEST} + {243997200 0 0 WET} + {260326800 3600 1 WEST} + {276051600 0 0 WET} + {291776400 3600 1 WEST} + {307501200 0 0 WET} + {323830800 3600 1 WEST} + {338950800 0 0 WET} + {354675600 3600 1 WEST} + {370400400 0 0 WET} + {386125200 3600 1 WEST} + {401850000 0 0 WET} + {417574800 3600 1 WEST} + {433299600 0 0 WET} + {449024400 3600 1 WEST} + {465354000 0 0 WET} + {481078800 3600 1 WEST} + {496803600 0 0 WET} + {512528400 3600 1 WEST} + {528253200 0 0 WET} + {543978000 3600 1 WEST} + {559702800 0 0 WET} + {575427600 3600 1 WEST} + {591152400 0 0 WET} + {606877200 3600 1 WEST} + {622602000 0 0 WET} + {638326800 3600 1 WEST} + {654656400 0 0 WET} + {670381200 3600 1 WEST} + {686106000 0 0 WET} + {701830800 3600 1 WEST} + {717555600 0 0 WET} + {733280400 3600 1 WEST} + {749005200 0 0 WET} + {764730000 3600 1 WEST} + {780454800 0 0 WET} + {796179600 3600 1 WEST} + {811904400 0 0 WET} + {828234000 3600 1 WEST} + {846378000 0 0 WET} + {859683600 3600 1 WEST} + {877827600 0 0 WET} + {891133200 3600 1 WEST} + {909277200 0 0 WET} + {922582800 3600 1 WEST} + {941331600 0 0 WET} + {954032400 3600 1 WEST} + {972781200 0 0 WET} + {985482000 3600 1 WEST} + {1004230800 0 0 WET} + {1017536400 3600 1 WEST} + {1035680400 0 0 WET} + {1048986000 3600 1 WEST} + {1067130000 0 0 WET} + {1080435600 3600 1 WEST} + {1099184400 0 0 WET} + {1111885200 3600 1 WEST} + {1130634000 0 0 WET} + {1143334800 3600 1 WEST} + {1162083600 0 0 WET} + {1174784400 3600 1 WEST} + {1193533200 0 0 WET} + {1206838800 3600 1 WEST} + {1224982800 0 0 WET} + {1238288400 3600 1 WEST} + {1256432400 0 0 WET} + {1269738000 3600 1 WEST} + {1288486800 0 0 WET} + {1301187600 3600 1 WEST} + {1319936400 0 0 WET} + {1332637200 3600 1 WEST} + {1351386000 0 0 WET} + {1364691600 3600 1 WEST} + {1382835600 0 0 WET} + {1396141200 3600 1 WEST} + {1414285200 0 0 WET} + {1427590800 3600 1 WEST} + {1445734800 0 0 WET} + {1459040400 3600 1 WEST} + {1477789200 0 0 WET} + {1490490000 3600 1 WEST} + {1509238800 0 0 WET} + {1521939600 3600 1 WEST} + {1540688400 0 0 WET} + {1553994000 3600 1 WEST} + {1572138000 0 0 WET} + {1585443600 3600 1 WEST} + {1603587600 0 0 WET} + {1616893200 3600 1 WEST} + {1635642000 0 0 WET} + {1648342800 3600 1 WEST} + {1667091600 0 0 WET} + {1679792400 3600 1 WEST} + {1698541200 0 0 WET} + {1711846800 3600 1 WEST} + {1729990800 0 0 WET} + {1743296400 3600 1 WEST} + {1761440400 0 0 WET} + {1774746000 3600 1 WEST} + {1792890000 0 0 WET} + {1806195600 3600 1 WEST} + {1824944400 0 0 WET} + {1837645200 3600 1 WEST} + {1856394000 0 0 WET} + {1869094800 3600 1 WEST} + {1887843600 0 0 WET} + {1901149200 3600 1 WEST} + {1919293200 0 0 WET} + {1932598800 3600 1 WEST} + {1950742800 0 0 WET} + {1964048400 3600 1 WEST} + {1982797200 0 0 WET} + {1995498000 3600 1 WEST} + {2014246800 0 0 WET} + {2026947600 3600 1 WEST} + {2045696400 0 0 WET} + {2058397200 3600 1 WEST} + {2077146000 0 0 WET} + {2090451600 3600 1 WEST} + {2108595600 0 0 WET} + {2121901200 3600 1 WEST} + {2140045200 0 0 WET} + {2153350800 3600 1 WEST} + {2172099600 0 0 WET} + {2184800400 3600 1 WEST} + {2203549200 0 0 WET} + {2216250000 3600 1 WEST} + {2234998800 0 0 WET} + {2248304400 3600 1 WEST} + {2266448400 0 0 WET} + {2279754000 3600 1 WEST} + {2297898000 0 0 WET} + {2311203600 3600 1 WEST} + {2329347600 0 0 WET} + {2342653200 3600 1 WEST} + {2361402000 0 0 WET} + {2374102800 3600 1 WEST} + {2392851600 0 0 WET} + {2405552400 3600 1 WEST} + {2424301200 0 0 WET} + {2437606800 3600 1 WEST} + {2455750800 0 0 WET} + {2469056400 3600 1 WEST} + {2487200400 0 0 WET} + {2500506000 3600 1 WEST} + {2519254800 0 0 WET} + {2531955600 3600 1 WEST} + {2550704400 0 0 WET} + {2563405200 3600 1 WEST} + {2582154000 0 0 WET} + {2595459600 3600 1 WEST} + {2613603600 0 0 WET} + {2626909200 3600 1 WEST} + {2645053200 0 0 WET} + {2658358800 3600 1 WEST} + {2676502800 0 0 WET} + {2689808400 3600 1 WEST} + {2708557200 0 0 WET} + {2721258000 3600 1 WEST} + {2740006800 0 0 WET} + {2752707600 3600 1 WEST} + {2771456400 0 0 WET} + {2784762000 3600 1 WEST} + {2802906000 0 0 WET} + {2816211600 3600 1 WEST} + {2834355600 0 0 WET} + {2847661200 3600 1 WEST} + {2866410000 0 0 WET} + {2879110800 3600 1 WEST} + {2897859600 0 0 WET} + {2910560400 3600 1 WEST} + {2929309200 0 0 WET} + {2942010000 3600 1 WEST} + {2960758800 0 0 WET} + {2974064400 3600 1 WEST} + {2992208400 0 0 WET} + {3005514000 3600 1 WEST} + {3023658000 0 0 WET} + {3036963600 3600 1 WEST} + {3055712400 0 0 WET} + {3068413200 3600 1 WEST} + {3087162000 0 0 WET} + {3099862800 3600 1 WEST} + {3118611600 0 0 WET} + {3131917200 3600 1 WEST} + {3150061200 0 0 WET} + {3163366800 3600 1 WEST} + {3181510800 0 0 WET} + {3194816400 3600 1 WEST} + {3212960400 0 0 WET} + {3226266000 3600 1 WEST} + {3245014800 0 0 WET} + {3257715600 3600 1 WEST} + {3276464400 0 0 WET} + {3289165200 3600 1 WEST} + {3307914000 0 0 WET} + {3321219600 3600 1 WEST} + {3339363600 0 0 WET} + {3352669200 3600 1 WEST} + {3370813200 0 0 WET} + {3384118800 3600 1 WEST} + {3402867600 0 0 WET} + {3415568400 3600 1 WEST} + {3434317200 0 0 WET} + {3447018000 3600 1 WEST} + {3465766800 0 0 WET} + {3479072400 3600 1 WEST} + {3497216400 0 0 WET} + {3510522000 3600 1 WEST} + {3528666000 0 0 WET} + {3541971600 3600 1 WEST} + {3560115600 0 0 WET} + {3573421200 3600 1 WEST} + {3592170000 0 0 WET} + {3604870800 3600 1 WEST} + {3623619600 0 0 WET} + {3636320400 3600 1 WEST} + {3655069200 0 0 WET} + {3668374800 3600 1 WEST} + {3686518800 0 0 WET} + {3699824400 3600 1 WEST} + {3717968400 0 0 WET} + {3731274000 3600 1 WEST} + {3750022800 0 0 WET} + {3762723600 3600 1 WEST} + {3781472400 0 0 WET} + {3794173200 3600 1 WEST} + {3812922000 0 0 WET} + {3825622800 3600 1 WEST} + {3844371600 0 0 WET} + {3857677200 3600 1 WEST} + {3875821200 0 0 WET} + {3889126800 3600 1 WEST} + {3907270800 0 0 WET} + {3920576400 3600 1 WEST} + {3939325200 0 0 WET} + {3952026000 3600 1 WEST} + {3970774800 0 0 WET} + {3983475600 3600 1 WEST} + {4002224400 0 0 WET} + {4015530000 3600 1 WEST} + {4033674000 0 0 WET} + {4046979600 3600 1 WEST} + {4065123600 0 0 WET} + {4078429200 3600 1 WEST} + {4096573200 0 0 WET} +} diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Zulu b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Zulu new file mode 100644 index 00000000..e9748e49 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/tzdata/Zulu @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UTC)]} { + LoadTimeZoneFile Etc/UTC +} +set TZData(:Zulu) $TZData(:Etc/UTC) diff --git a/src/tclkit86bi.vfs/lib/tcl8.6/word.tcl b/src/tclkit86bi.vfs/lib/tcl8.6/word.tcl new file mode 100644 index 00000000..828f13ab --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8.6/word.tcl @@ -0,0 +1,154 @@ +# word.tcl -- +# +# This file defines various procedures for computing word boundaries in +# strings. This file is primarily needed so Tk text and entry widgets behave +# properly for different platforms. +# +# Copyright (c) 1996 Sun Microsystems, Inc. +# Copyright (c) 1998 Scritpics Corporation. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# The following variables are used to determine which characters are +# interpreted as white space. + +if {$::tcl_platform(platform) eq "windows"} { + # Windows style - any but a unicode space char + if {![info exists ::tcl_wordchars]} { + set ::tcl_wordchars {\S} + } + if {![info exists ::tcl_nonwordchars]} { + set ::tcl_nonwordchars {\s} + } +} else { + # Motif style - any unicode word char (number, letter, or underscore) + if {![info exists ::tcl_wordchars]} { + set ::tcl_wordchars {\w} + } + if {![info exists ::tcl_nonwordchars]} { + set ::tcl_nonwordchars {\W} + } +} + +# Arrange for caches of the real matcher REs to be kept, which enables the REs +# themselves to be cached for greater performance (and somewhat greater +# clarity too). + +namespace eval ::tcl { + variable WordBreakRE + array set WordBreakRE {} + + proc UpdateWordBreakREs args { + # Ignores the arguments + global tcl_wordchars tcl_nonwordchars + variable WordBreakRE + + # To keep the RE strings short... + set letter $tcl_wordchars + set space $tcl_nonwordchars + + set WordBreakRE(after) "$letter$space|$space$letter" + set WordBreakRE(before) "^.*($letter$space|$space$letter)" + set WordBreakRE(end) "$space*$letter+$space" + set WordBreakRE(next) "$letter*$space+$letter" + set WordBreakRE(previous) "$space*($letter+)$space*\$" + } + + # Initialize the cache + UpdateWordBreakREs + trace add variable ::tcl_wordchars write ::tcl::UpdateWordBreakREs + trace add variable ::tcl_nonwordchars write ::tcl::UpdateWordBreakREs +} + +# tcl_wordBreakAfter -- +# +# This procedure returns the index of the first word boundary after the +# starting point in the given string, or -1 if there are no more boundaries in +# the given string. The index returned refers to the first character of the +# pair that comprises a boundary. +# +# Arguments: +# str - String to search. +# start - Index into string specifying starting point. + +proc tcl_wordBreakAfter {str start} { + variable ::tcl::WordBreakRE + set result {-1 -1} + regexp -indices -start $start -- $WordBreakRE(after) $str result + return [lindex $result 1] +} + +# tcl_wordBreakBefore -- +# +# This procedure returns the index of the first word boundary before the +# starting point in the given string, or -1 if there are no more boundaries in +# the given string. The index returned refers to the second character of the +# pair that comprises a boundary. +# +# Arguments: +# str - String to search. +# start - Index into string specifying starting point. + +proc tcl_wordBreakBefore {str start} { + variable ::tcl::WordBreakRE + set result {-1 -1} + regexp -indices -- $WordBreakRE(before) [string range $str 0 $start] result + return [lindex $result 1] +} + +# tcl_endOfWord -- +# +# This procedure returns the index of the first end-of-word location after a +# starting index in the given string. An end-of-word location is defined to be +# the first whitespace character following the first non-whitespace character +# after the starting point. Returns -1 if there are no more words after the +# starting point. +# +# Arguments: +# str - String to search. +# start - Index into string specifying starting point. + +proc tcl_endOfWord {str start} { + variable ::tcl::WordBreakRE + set result {-1 -1} + regexp -indices -start $start -- $WordBreakRE(end) $str result + return [lindex $result 1] +} + +# tcl_startOfNextWord -- +# +# This procedure returns the index of the first start-of-word location after a +# starting index in the given string. A start-of-word location is defined to +# be a non-whitespace character following a whitespace character. Returns -1 +# if there are no more start-of-word locations after the starting point. +# +# Arguments: +# str - String to search. +# start - Index into string specifying starting point. + +proc tcl_startOfNextWord {str start} { + variable ::tcl::WordBreakRE + set result {-1 -1} + regexp -indices -start $start -- $WordBreakRE(next) $str result + return [lindex $result 1] +} + +# tcl_startOfPreviousWord -- +# +# This procedure returns the index of the first start-of-word location before +# a starting index in the given string. +# +# Arguments: +# str - String to search. +# start - Index into string specifying starting point. + +proc tcl_startOfPreviousWord {str start} { + variable ::tcl::WordBreakRE + set word {-1 -1} + if {$start > 0} { + regexp -indices -- $WordBreakRE(previous) [string range $str 0 $start-1] \ + result word + } + return [lindex $word 0] +} diff --git a/src/tclkit86bi.vfs/lib/tcl8/8.4/platform-1.0.19.tm b/src/tclkit86bi.vfs/lib/tcl8/8.4/platform-1.0.19.tm new file mode 100644 index 00000000..acaebf26 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8/8.4/platform-1.0.19.tm @@ -0,0 +1,450 @@ +# -*- tcl -*- +# ### ### ### ######### ######### ######### +## Overview + +# Heuristics to assemble a platform identifier from publicly available +# information. The identifier describes the platform of the currently +# running tcl shell. This is a mixture of the runtime environment and +# of build-time properties of the executable itself. +# +# Examples: +# <1> A tcl shell executing on a x86_64 processor, but having a +# wordsize of 4 was compiled for the x86 environment, i.e. 32 +# bit, and loaded packages have to match that, and not the +# actual cpu. +# +# <2> The hp/solaris 32/64 bit builds of the core cannot be +# distinguished by looking at tcl_platform. As packages have to +# match the 32/64 information we have to look in more places. In +# this case we inspect the executable itself (magic numbers, +# i.e. fileutil::magic::filetype). +# +# The basic information used comes out of the 'os' and 'machine' +# entries of the 'tcl_platform' array. A number of general and +# os/machine specific transformation are applied to get a canonical +# result. +# +# General +# Only the first element of 'os' is used - we don't care whether we +# are on "Windows NT" or "Windows XP" or whatever. +# +# Machine specific +# % amd64 -> x86_64 +# % arm* -> arm +# % sun4* -> sparc +# % ia32* -> ix86 +# % intel -> ix86 +# % i*86* -> ix86 +# % Power* -> powerpc +# % x86_64 + wordSize 4 => x86 code +# +# OS specific +# % AIX are always powerpc machines +# % HP-UX 9000/800 etc means parisc +# % linux has to take glibc version into account +# % sunos -> solaris, and keep version number +# +# NOTE: A platform like linux glibc 2.3, which can use glibc 2.2 stuff +# has to provide all possible allowed platform identifiers when +# searching search. Ditto a solaris 2.8 platform can use solaris 2.6 +# packages. Etc. This is handled by the other procedure, see below. + +# ### ### ### ######### ######### ######### +## Requirements + +namespace eval ::platform {} + +# ### ### ### ######### ######### ######### +## Implementation + +# -- platform::generic +# +# Assembles an identifier for the generic platform. It leaves out +# details like kernel version, libc version, etc. + +proc ::platform::generic {} { + global tcl_platform + + set plat [string tolower [lindex $tcl_platform(os) 0]] + set cpu $tcl_platform(machine) + + switch -glob -- $cpu { + sun4* { + set cpu sparc + } + intel - + ia32* - + i*86* { + set cpu ix86 + } + x86_64 { + if {$tcl_platform(wordSize) == 4} { + # See Example <1> at the top of this file. + set cpu ix86 + } + } + ppc - + "Power*" { + set cpu powerpc + } + "arm*" { + set cpu arm + } + ia64 { + if {$tcl_platform(wordSize) == 4} { + append cpu _32 + } + } + } + + switch -glob -- $plat { + windows { + if {$tcl_platform(platform) == "unix"} { + set plat cygwin + } else { + set plat win32 + } + if {$cpu eq "amd64"} { + # Do not check wordSize, win32-x64 is an IL32P64 platform. + set cpu x86_64 + } + } + sunos { + set plat solaris + if {[string match "ix86" $cpu]} { + if {$tcl_platform(wordSize) == 8} { + set cpu x86_64 + } + } elseif {![string match "ia64*" $cpu]} { + # sparc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + } + darwin { + set plat macosx + # Correctly identify the cpu when running as a 64bit + # process on a machine with a 32bit kernel + if {$cpu eq "ix86"} { + if {$tcl_platform(wordSize) == 8} { + set cpu x86_64 + } + } + } + aix { + set cpu powerpc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + hp-ux { + set plat hpux + if {![string match "ia64*" $cpu]} { + set cpu parisc + if {$tcl_platform(wordSize) == 8} { + append cpu 64 + } + } + } + osf1 { + set plat tru64 + } + default { + set plat [lindex [split $plat _-] 0] + } + } + + return "${plat}-${cpu}" +} + +# -- platform::identify +# +# Assembles an identifier for the exact platform, by extending the +# generic identifier. I.e. it adds in details like kernel version, +# libc version, etc., if they are relevant for the loading of +# packages on the platform. + +proc ::platform::identify {} { + global tcl_platform + + set id [generic] + regexp {^([^-]+)-([^-]+)$} $id -> plat cpu + + switch -- $plat { + solaris { + regsub {^5} $tcl_platform(osVersion) 2 text + append plat $text + return "${plat}-${cpu}" + } + macosx { + set major [lindex [split $tcl_platform(osVersion) .] 0] + if {$major > 19} { + set minor [lindex [split $tcl_platform(osVersion) .] 1] + incr major -9 + append plat $major.[expr {$minor - 1}] + } else { + incr major -4 + append plat 10.$major + return "${plat}-${cpu}" + } + return "${plat}-${cpu}" + } + linux { + # Look for the libc*.so and determine its version + # (libc5/6, libc6 further glibc 2.X) + + set v unknown + + # Determine in which directory to look. /lib, or /lib64. + # For that we use the tcl_platform(wordSize). + # + # We could use the 'cpu' info, per the equivalence below, + # that however would be restricted to intel. And this may + # be a arm, mips, etc. system. The wordsize is more + # fundamental. + # + # ix86 <=> (wordSize == 4) <=> 32 bit ==> /lib + # x86_64 <=> (wordSize == 8) <=> 64 bit ==> /lib64 + # + # Do not look into /lib64 even if present, if the cpu + # doesn't fit. + + # TODO: Determine the prefixes (i386, x86_64, ...) for + # other cpus. The path after the generic one is utterly + # specific to intel right now. Ok, on Ubuntu, possibly + # other Debian systems we may apparently be able to query + # the necessary CPU code. If we can't we simply use the + # hardwired fallback. + + switch -exact -- $tcl_platform(wordSize) { + 4 { + lappend bases /lib + if {[catch { + exec dpkg-architecture -qDEB_HOST_MULTIARCH + } res]} { + lappend bases /lib/i386-linux-gnu + } else { + # dpkg-arch returns the full tripled, not just cpu. + lappend bases /lib/$res + } + } + 8 { + lappend bases /lib64 + if {[catch { + exec dpkg-architecture -qDEB_HOST_MULTIARCH + } res]} { + lappend bases /lib/x86_64-linux-gnu + } else { + # dpkg-arch returns the full tripled, not just cpu. + lappend bases /lib/$res + } + } + default { + return -code error "Bad wordSize $tcl_platform(wordSize), expected 4 or 8" + } + } + + foreach base $bases { + if {[LibcVersion $base -> v]} break + } + + append plat -$v + return "${plat}-${cpu}" + } + } + + return $id +} + +proc ::platform::LibcVersion {base _->_ vv} { + upvar 1 $vv v + set libclist [lsort [glob -nocomplain -directory $base libc*]] + + if {![llength $libclist]} { return 0 } + + set libc [lindex $libclist 0] + + # Try executing the library first. This should suceed + # for a glibc library, and return the version + # information. + + if {![catch { + set vdata [lindex [split [exec $libc] \n] 0] + }]} { + regexp {version ([0-9]+(\.[0-9]+)*)} $vdata -> v + foreach {major minor} [split $v .] break + set v glibc${major}.${minor} + return 1 + } else { + # We had trouble executing the library. We are now + # inspecting its name to determine the version + # number. This code by Larry McVoy. + + if {[regexp -- {libc-([0-9]+)\.([0-9]+)} $libc -> major minor]} { + set v glibc${major}.${minor} + return 1 + } + } + return 0 +} + +# -- platform::patterns +# +# Given an exact platform identifier, i.e. _not_ the generic +# identifier it assembles a list of exact platform identifier +# describing platform which should be compatible with the +# input. +# +# I.e. packages for all platforms in the result list should be +# loadable on the specified platform. + +# << Should we add the generic identifier to the list as well ? In +# general it is not compatible I believe. So better not. In many +# cases the exact identifier is identical to the generic one +# anyway. +# >> + +proc ::platform::patterns {id} { + set res [list $id] + if {$id eq "tcl"} {return $res} + + switch -glob -- $id { + solaris*-* { + if {[regexp {solaris([^-]*)-(.*)} $id -> v cpu]} { + if {$v eq ""} {return $id} + foreach {major minor} [split $v .] break + incr minor -1 + for {set j $minor} {$j >= 6} {incr j -1} { + lappend res solaris${major}.${j}-${cpu} + } + } + } + linux*-* { + if {[regexp {linux-glibc([^-]*)-(.*)} $id -> v cpu]} { + foreach {major minor} [split $v .] break + incr minor -1 + for {set j $minor} {$j >= 0} {incr j -1} { + lappend res linux-glibc${major}.${j}-${cpu} + } + } + } + macosx-powerpc { + lappend res macosx-universal + } + macosx-x86_64 { + lappend res macosx-i386-x86_64 + } + macosx-ix86 { + lappend res macosx-universal macosx-i386-x86_64 + } + macosx*-* { + # 10.5+,11.0+ + if {[regexp {macosx([^-]*)-(.*)} $id -> v cpu]} { + + switch -exact -- $cpu { + ix86 { + lappend alt i386-x86_64 + lappend alt universal + } + x86_64 { + if {[lindex [split $::tcl_platform(osVersion) .] 0] < 19} { + set alt i386-x86_64 + } else { + set alt {} + } + } + arm { + lappend alt x86_64 + } + default { set alt {} } + } + + if {$v ne ""} { + foreach {major minor} [split $v .] break + + set res {} + if {$major eq 13} { + # Add 13.0 to 13.minor to patterns. + for {set j $minor} {$j >= 0} {incr j -1} { + lappend res macosx${major}.${j}-${cpu} + foreach a $alt { + lappend res macosx${major}.${j}-$a + } + } + set major 12 + set minor 5 + } + if {$major eq 12} { + # Add 12.0 to 12.minor to patterns. + for {set j $minor} {$j >= 0} {incr j -1} { + lappend res macosx${major}.${j}-${cpu} + foreach a $alt { + lappend res macosx${major}.${j}-$a + } + } + set major 11 + set minor 5 + } + if {$major eq 11} { + # Add 11.0 to 11.minor to patterns. + for {set j $minor} {$j >= 0} {incr j -1} { + lappend res macosx${major}.${j}-${cpu} + foreach a $alt { + lappend res macosx${major}.${j}-$a + } + } + set major 10 + set minor 15 + } + # Add 10.5 to 10.minor to patterns. + for {set j $minor} {$j >= 5} {incr j -1} { + if {$cpu ne "arm"} { + lappend res macosx${major}.${j}-${cpu} + } + foreach a $alt { + lappend res macosx${major}.${j}-$a + } + } + + # Add unversioned patterns for 10.3/10.4 builds. + lappend res macosx-${cpu} + foreach a $alt { + lappend res macosx-$a + } + } else { + # No version, just do unversioned patterns. + foreach a $alt { + lappend res macosx-$a + } + } + } else { + # no v, no cpu ... nothing + } + } + } + lappend res tcl ; # Pure tcl packages are always compatible. + return $res +} + + +# ### ### ### ######### ######### ######### +## Ready + +package provide platform 1.0.19 + +# ### ### ### ######### ######### ######### +## Demo application + +if {[info exists argv0] && ($argv0 eq [info script])} { + puts ==================================== + parray tcl_platform + puts ==================================== + puts Generic\ identification:\ [::platform::generic] + puts Exact\ identification:\ \ \ [::platform::identify] + puts ==================================== + puts Search\ patterns: + puts *\ [join [::platform::patterns [::platform::identify]] \n*\ ] + puts ==================================== + exit 0 +} diff --git a/src/tclkit86bi.vfs/lib/tcl8/8.4/platform/shell-1.1.4.tm b/src/tclkit86bi.vfs/lib/tcl8/8.4/platform/shell-1.1.4.tm new file mode 100644 index 00000000..6eb96910 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8/8.4/platform/shell-1.1.4.tm @@ -0,0 +1,241 @@ + +# -*- tcl -*- +# ### ### ### ######### ######### ######### +## Overview + +# Higher-level commands which invoke the functionality of this package +# for an arbitrary tcl shell (tclsh, wish, ...). This is required by a +# repository as while the tcl shell executing packages uses the same +# platform in general as a repository application there can be +# differences in detail (i.e. 32/64 bit builds). + +# ### ### ### ######### ######### ######### +## Requirements + +package require platform +namespace eval ::platform::shell {} + +# ### ### ### ######### ######### ######### +## Implementation + +# -- platform::shell::generic + +proc ::platform::shell::generic {shell} { + # Argument is the path to a tcl shell. + + CHECK $shell + LOCATE base out + + set code {} + # Forget any pre-existing platform package, it might be in + # conflict with this one. + lappend code {package forget platform} + # Inject our platform package + lappend code [list source $base] + # Query and print the architecture + lappend code {puts [platform::generic]} + # And done + lappend code {exit 0} + + set arch [RUN $shell [join $code \n]] + + if {$out} {file delete -force $base} + return $arch +} + +# -- platform::shell::identify + +proc ::platform::shell::identify {shell} { + # Argument is the path to a tcl shell. + + CHECK $shell + LOCATE base out + + set code {} + # Forget any pre-existing platform package, it might be in + # conflict with this one. + lappend code {package forget platform} + # Inject our platform package + lappend code [list source $base] + # Query and print the architecture + lappend code {puts [platform::identify]} + # And done + lappend code {exit 0} + + set arch [RUN $shell [join $code \n]] + + if {$out} {file delete -force $base} + return $arch +} + +# -- platform::shell::platform + +proc ::platform::shell::platform {shell} { + # Argument is the path to a tcl shell. + + CHECK $shell + + set code {} + lappend code {puts $tcl_platform(platform)} + lappend code {exit 0} + + return [RUN $shell [join $code \n]] +} + +# ### ### ### ######### ######### ######### +## Internal helper commands. + +proc ::platform::shell::CHECK {shell} { + if {![file exists $shell]} { + return -code error "Shell \"$shell\" does not exist" + } + if {![file executable $shell]} { + return -code error "Shell \"$shell\" is not executable (permissions)" + } + return +} + +proc ::platform::shell::LOCATE {bv ov} { + upvar 1 $bv base $ov out + + # Locate the platform package for injection into the specified + # shell. We are using package management to find it, whereever it + # is, instead of using hardwired relative paths. This allows us to + # install the two packages as TMs without breaking the code + # here. If the found package is wrapped we copy the code somewhere + # where the spawned shell will be able to read it. + + # This code is brittle, it needs has to adapt to whatever changes + # are made to the TM code, i.e. the provide statement generated by + # tm.tcl + + set pl [package ifneeded platform [package require platform]] + set base [lindex $pl end] + + set out 0 + if {[lindex [file system $base]] ne "native"} { + set temp [TEMP] + file copy -force $base $temp + set base $temp + set out 1 + } + return +} + +proc ::platform::shell::RUN {shell code} { + set c [TEMP] + set cc [open $c w] + puts $cc $code + close $cc + + set e [TEMP] + + set code [catch { + exec $shell $c 2> $e + } res] + + file delete $c + + if {$code} { + append res \n[read [set chan [open $e r]]][close $chan] + file delete $e + return -code error "Shell \"$shell\" is not executable ($res)" + } + + file delete $e + return $res +} + +proc ::platform::shell::TEMP {} { + set prefix platform + + # This code is copied out of Tcllib's fileutil package. + # (TempFile/tempfile) + + set tmpdir [DIR] + + set chars "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + set nrand_chars 10 + set maxtries 10 + set access [list RDWR CREAT EXCL TRUNC] + set permission 0600 + set channel "" + set checked_dir_writable 0 + set mypid [pid] + for {set i 0} {$i < $maxtries} {incr i} { + set newname $prefix + for {set j 0} {$j < $nrand_chars} {incr j} { + append newname [string index $chars \ + [expr {int(rand()*62)}]] + } + set newname [file join $tmpdir $newname] + if {[file exists $newname]} { + after 1 + } else { + if {[catch {open $newname $access $permission} channel]} { + if {!$checked_dir_writable} { + set dirname [file dirname $newname] + if {![file writable $dirname]} { + return -code error "Directory $dirname is not writable" + } + set checked_dir_writable 1 + } + } else { + # Success + close $channel + return [file normalize $newname] + } + } + } + if {$channel ne ""} { + return -code error "Failed to open a temporary file: $channel" + } else { + return -code error "Failed to find an unused temporary file name" + } +} + +proc ::platform::shell::DIR {} { + # This code is copied out of Tcllib's fileutil package. + # (TempDir/tempdir) + + global tcl_platform env + + set attempdirs [list] + + foreach tmp {TMPDIR TEMP TMP} { + if { [info exists env($tmp)] } { + lappend attempdirs $env($tmp) + } + } + + switch $tcl_platform(platform) { + windows { + lappend attempdirs "C:\\TEMP" "C:\\TMP" "\\TEMP" "\\TMP" + } + macintosh { + set tmpdir $env(TRASH_FOLDER) ;# a better place? + } + default { + lappend attempdirs \ + [file join / tmp] \ + [file join / var tmp] \ + [file join / usr tmp] + } + } + + lappend attempdirs [pwd] + + foreach tmp $attempdirs { + if { [file isdirectory $tmp] && [file writable $tmp] } { + return [file normalize $tmp] + } + } + + # Fail if nothing worked. + return -code error "Unable to determine a proper directory for temporary files" +} + +# ### ### ### ######### ######### ######### +## Ready + +package provide platform::shell 1.1.4 diff --git a/src/tclkit86bi.vfs/lib/tcl8/8.5/msgcat-1.6.1.tm b/src/tclkit86bi.vfs/lib/tcl8/8.5/msgcat-1.6.1.tm new file mode 100644 index 00000000..fa91a374 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcl8/8.5/msgcat-1.6.1.tm @@ -0,0 +1,1210 @@ +# msgcat.tcl -- +# +# This file defines various procedures which implement a +# message catalog facility for Tcl programs. It should be +# loaded with the command "package require msgcat". +# +# Copyright (c) 2010-2015 Harald Oehlmann. +# Copyright (c) 1998-2000 Ajuba Solutions. +# Copyright (c) 1998 Mark Harrison. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +package require Tcl 8.5- +# When the version number changes, be sure to update the pkgIndex.tcl file, +# and the installation directory in the Makefiles. +package provide msgcat 1.6.1 + +namespace eval msgcat { + namespace export mc mcexists mcload mclocale mcmax mcmset mcpreferences mcset\ + mcunknown mcflset mcflmset mcloadedlocales mcforgetpackage\ + mcpackageconfig mcpackagelocale + + # Records the list of locales to search + variable Loclist {} + + # List of currently loaded locales + variable LoadedLocales {} + + # Records the locale of the currently sourced message catalogue file + variable FileLocale + + # Configuration values per Package (e.g. client namespace). + # The dict key is of the form "

Defaults to nothing, regular bench invokation. + + # interps - dict (path -> version) + # files - list (of files) + + # Process arguments ...................................... + # Defaults first, then overides by the user + + set errors 1 ; # Propagate errors + set threads 0 ; # Do not use threads + set match {} ; # Do not exclude benchmarks based on glob pattern + set rmatch {} ; # Do not exclude benchmarks based on regex pattern + set iters 1000 ; # Limit #iterations for any benchmark + set pkgdirs {} ; # List of dirs to put in front of auto_path in the + # bench interpreters. Default: nothing. + + while {[string match "-*" [set opt [lindex $args 0]]]} { + set val [lindex $args 1] + switch -exact -- $opt { + -errors { + if {![string is boolean -strict $val]} { + return -code error "Expected boolean, got \"$val\"" + } + set errors $val + } + -threads { + if {![string is int -strict $val] || ($val < 0)} { + return -code error "Expected int >= 0, got \"$val\"" + } + set threads [lindex $args 1] + } + -match { + set match [lindex $args 1] + } + -rmatch { + set rmatch [lindex $args 1] + } + -iters { + if {![string is int -strict $val] || ($val <= 0)} { + return -code error "Expected int > 0, got \"$val\"" + } + set iters [lindex $args 1] + } + -pkgdir { + CheckPkgDirArg $val + lappend pkgdirs $val + } + default { + return -code error "Unknown option \"$opt\", should -errors, -threads, -match, -rmatch, or -iters" + } + } + set args [lrange $args 2 end] + } + if {[llength $args] != 2} { + return -code error "wrong\#args, should be: ?options? interp files" + } + foreach {interps files} $args break + + # Run the benchmarks ..................................... + + array set DATA {} + + if {![llength $pkgdirs]} { + # No user specified package directories => Simple run. + foreach {ip ver} $interps { + Invoke $ip $ver {} ;# DATA etc passed via upvar. + } + } else { + # User specified package directories. + foreach {ip ver} $interps { + foreach pkgdir $pkgdirs { + Invoke $ip $ver $pkgdir ;# DATA etc passed via upvar. + } + } + } + + # Benchmark data ... Structure, dict (key -> value) + # + # Key || Value + # ============ ++ ========================================= + # interp IP -> Version. Shell IP was used to run benchmarks. IP is + # the path to the shell. + # + # desc DESC -> "". DESC is description of an executed benchmark. + # + # usec DESC IP -> Result. Result of benchmark DESC when run by the + # shell IP. Usually time in microseconds, but can be + # a special code as well (ERR, BAD_RES). + # ============ ++ ========================================= + + return [array get DATA] +} + +# ::bench::locate -- +# +# Locate interpreters on the pathlist, based on a pattern. +# +# Arguments: +# ... +# +# Results: +# List of paths. + +proc ::bench::locate {pattern paths} { + # Cache of executables already found. + array set var {} + set res {} + + foreach path $paths { + foreach ip [glob -nocomplain [file join $path $pattern]] { + if {[package vsatisfies [package provide Tcl] 8.4]} { + set ip [file normalize $ip] + } + + # Follow soft-links to the actual executable. + while {[string equal link [file type $ip]]} { + set link [file readlink $ip] + if {[string match relative [file pathtype $link]]} { + set ip [file join [file dirname $ip] $link] + } else { + set ip $link + } + } + + if { + [file executable $ip] && ![info exists var($ip)] + } { + if {[catch {exec $ip << "exit"} dummy]} { + log::debug "$ip: $dummy" + continue + } + set var($ip) . + lappend res $ip + } + } + } + + return $res +} + +# ::bench::versions -- +# +# Take list of interpreters, find their versions. +# Removes all interps for which it cannot do so. +# +# Arguments: +# List of interpreters (paths) +# +# Results: +# dictionary: interpreter -> version. + +proc ::bench::versions {interps} { + set res {} + foreach ip $interps { + if {[catch { + exec $ip << {puts [info patchlevel] ; exit} + } patchlevel]} { + log::debug "$ip: $patchlevel" + continue + } + + lappend res [list $patchlevel $ip] + } + + # -uniq 8.4-ism, replaced with use of array. + array set tmp {} + set resx {} + foreach item [lsort -dictionary -decreasing -index 0 $res] { + foreach {p ip} $item break + if {[info exists tmp($p)]} continue + set tmp($p) . + lappend resx $ip $p + } + + return $resx +} + +# ::bench::merge -- +# +# Take the data of several benchmark runs and merge them into +# one data set. +# +# Arguments: +# One or more data sets to merge +# +# Results: +# The merged data set. + +proc ::bench::merge {args} { + if {[llength $args] == 1} { + return [lindex $args 0] + } + + array set DATA {} + foreach data $args { + array set DATA $data + } + return [array get DATA] +} + +# ::bench::norm -- +# +# Normalize the time data in the dataset, using one of the +# columns as reference. +# +# Arguments: +# Data to normalize +# Index of reference column +# +# Results: +# The normalized data set. + +proc ::bench::norm {data col} { + + if {![string is integer -strict $col]} { + return -code error "Ref.column: Expected integer, but got \"$col\"" + } + if {$col < 1} { + return -code error "Ref.column out of bounds" + } + + array set DATA $data + set ipkeys [array names DATA interp*] + + if {$col > [llength $ipkeys]} { + return -code error "Ref.column out of bounds" + } + incr col -1 + set refip [lindex [lindex [lsort -dict $ipkeys] $col] 1] + + foreach key [array names DATA] { + if {[string match "desc*" $key]} continue + if {[string match "interp*" $key]} continue + + foreach {_ desc ip} $key break + if {[string equal $ip $refip]} continue + + set v $DATA($key) + if {![string is double -strict $v]} continue + + if {![info exists DATA([list usec $desc $refip])]} { + # We cannot normalize, we do not keep the time value. + # The row will be shown, empty. + set DATA($key) "" + continue + } + set vref $DATA([list usec $desc $refip]) + + if {![string is double -strict $vref]} continue + + set DATA($key) [expr {$v/double($vref)}] + } + + foreach key [array names DATA [list * $refip]] { + if {![string is double -strict $DATA($key)]} continue + set DATA($key) 1 + } + + return [array get DATA] +} + +# ::bench::edit -- +# +# Change the 'path' of an interp to a user-defined value. +# +# Arguments: +# Data to edit +# Index of column to change +# The value replacing the current path +# +# Results: +# The changed data set. + +proc ::bench::edit {data col new} { + + if {![string is integer -strict $col]} { + return -code error "Ref.column: Expected integer, but got \"$col\"" + } + if {$col < 1} { + return -code error "Ref.column out of bounds" + } + + array set DATA $data + set ipkeys [array names DATA interp*] + + if {$col > [llength $ipkeys]} { + return -code error "Ref.column out of bounds" + } + incr col -1 + set refip [lindex [lindex [lsort -dict $ipkeys] $col] 1] + + if {[string equal $new $refip]} { + # No change, quick return + return $data + } + + set refkey [list interp $refip] + set DATA([list interp $new]) $DATA($refkey) + unset DATA($refkey) + + foreach key [array names DATA [list * $refip]] { + if {![string equal [lindex $key 0] "usec"]} continue + foreach {__ desc ip} $key break + set DATA([list usec $desc $new]) $DATA($key) + unset DATA($key) + } + + return [array get DATA] +} + +# ::bench::del -- +# +# Remove the data for an interp. +# +# Arguments: +# Data to edit +# Index of column to remove +# +# Results: +# The changed data set. + +proc ::bench::del {data col} { + + if {![string is integer -strict $col]} { + return -code error "Ref.column: Expected integer, but got \"$col\"" + } + if {$col < 1} { + return -code error "Ref.column out of bounds" + } + + array set DATA $data + set ipkeys [array names DATA interp*] + + if {$col > [llength $ipkeys]} { + return -code error "Ref.column out of bounds" + } + incr col -1 + set refip [lindex [lindex [lsort -dict $ipkeys] $col] 1] + + unset DATA([list interp $refip]) + + # Do not use 'array unset'. Keep 8.2 clean. + foreach key [array names DATA [list * $refip]] { + if {![string equal [lindex $key 0] "usec"]} continue + unset DATA($key) + } + + return [array get DATA] +} + +# ### ### ### ######### ######### ######### ########################### +## Public API - Result formatting. + +# ::bench::out::raw -- +# +# Format the result of a benchmark run. +# Style: Raw data. +# +# Arguments: +# DATA dict +# +# Results: +# String containing the formatted DATA. + +proc ::bench::out::raw {data} { + return $data +} + +# ### ### ### ######### ######### ######### ########################### +## Internal commands + +proc ::bench::CheckPkgDirArg {path {expected {}}} { + # Allow empty string, special. + if {![string length $path]} return + + if {![file isdirectory $path]} { + return -code error \ + "The path \"$path\" is not a directory." + } + if {![file readable $path]} { + return -code error \ + "The path \"$path\" is not readable." + } +} + +proc ::bench::Invoke {ip ver pkgdir} { + variable self + # Import remainder of the current configuration/settings. + + upvar 1 DATA DATA match match rmatch rmatch \ + iters iters errors errors threads threads \ + files files + + if {[string length $pkgdir]} { + log::info "Benchmark $ver ($pkgdir) $ip" + set idstr "$ip ($pkgdir)" + } else { + log::info "Benchmark $ver $ip" + set idstr $ip + } + + set DATA([list interp $idstr]) $ver + + set cmd [list $ip [file join $self libbench.tcl] \ + -match $match \ + -rmatch $rmatch \ + -iters $iters \ + -interp $ip \ + -errors $errors \ + -threads $threads \ + -pkgdir $pkgdir \ + ] + + # Determine elapsed time per file, logged. + set start [clock seconds] + + array set tmp {} + + if {$threads} { + foreach f $files { lappend cmd $f } + if {[catch { + close [Process [open |$cmd r+]] + } output]} { + if {$errors} { + error $::errorInfo + } + } + } else { + foreach file $files { + log::info [file tail $file] + if {[catch { + close [Process [open |[linsert $cmd end $file] r+]] + } output]} { + if {$errors} { + error $::errorInfo + } else { + continue + } + } + } + } + + foreach desc [array names tmp] { + set DATA([list desc $desc]) {} + set DATA([list usec $desc $idstr]) $tmp($desc) + } + + unset tmp + set elapsed [expr {[clock seconds] - $start}] + + set hour [expr {$elapsed / 3600}] + set min [expr {$elapsed / 60}] + set sec [expr {$elapsed % 60}] + log::info " [format %.2d:%.2d:%.2d $hour $min $sec] elapsed" + return +} + + +proc ::bench::Process {pipe} { + while {1} { + if {[eof $pipe]} break + if {[gets $pipe line] < 0} break + # AK: FUTURE: Log all lines?! + #puts |$line| + set line [string trim $line] + if {[string equal $line ""]} continue + + Result + Feedback + # Unknown lines are printed. Future: Callback?! + log::info $line + } + return $pipe +} + +proc ::bench::Result {} { + upvar 1 line line + if {[lindex $line 0] ne "RESULT"} return + upvar 2 tmp tmp + foreach {_ desc result} $line break + set tmp($desc) $result + return -code continue +} + +proc ::bench::Feedback {} { + upvar 1 line line + if {[lindex $line 0] ne "LOG"} return + # AK: Future - Run through callback?! + log::info [lindex $line 1] + return -code continue +} + +# ### ### ### ######### ######### ######### ########################### +## Initialize internal data structures. + +namespace eval ::bench { + variable self [file join [pwd] [file dirname [info script]]] + + logger::init bench + logger::import -force -all -namespace log bench +} + +# ### ### ### ######### ######### ######### ########################### +## Ready to run + +package provide bench 0.4 diff --git a/src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench_read.tcl b/src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench_read.tcl new file mode 100644 index 00000000..7cebb7bd --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench_read.tcl @@ -0,0 +1,162 @@ +# bench_read.tcl -- +# +# Management of benchmarks, reading results in various formats. +# +# Copyright (c) 2005 by Andreas Kupries +# library derived from runbench.tcl application (C) Jeff Hobbs. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# RCS: @(#) $Id: bench_read.tcl,v 1.3 2006/06/13 23:20:30 andreas_kupries Exp $ + +# ### ### ### ######### ######### ######### ########################### +## Requisites - Packages and namespace for the commands and data. + +package require Tcl 8.2 +package require csv + +namespace eval ::bench::in {} + +# ### ### ### ######### ######### ######### ########################### +## Public API - Result reading + +# ::bench::in::read -- +# +# Read a bench result in any of the raw/csv/text formats +# +# Arguments: +# path to file to read +# +# Results: +# DATA dictionary, internal representation of the bench results. + +proc ::bench::in::read {file} { + + set f [open $file r] + set head [gets $f] + + if {![string match "# -\\*- tcl -\\*- bench/*" $head]} { + return -code error "Bad file format, not a benchmark file" + } else { + regexp {bench/(.*)$} $head -> format + + switch -exact -- $format { + raw - csv - text { + set res [RD$format $f] + } + default { + return -code error "Bad format \"$val\", expected text, csv, or raw" + } + } + } + close $f + return $res +} + +# ### ### ### ######### ######### ######### ########################### +## Internal commands + +proc ::bench::in::RDraw {chan} { + return [string trimright [::read $chan]] +} + +proc ::bench::in::RDcsv {chan} { + # Lines Format + # First line is number of interpreters #n. int + # Next to 1+n is interpreter data. id,ver,path + # Beyond is benchmark results. id,desc,res1,...,res#n + + array set DATA {} + + # #Interp ... + + set nip [lindex [csv::split [gets $chan]] 0] + + # Interp data ... + + set iplist {} + for {set i 0} {$i < $nip} {incr i} { + foreach {__ ver ip} [csv::split [gets $chan]] break + + set DATA([list interp $ip]) $ver + lappend iplist $ip + } + + # Benchmark data ... + + while {[gets $chan line] >= 0} { + set line [string trim $line] + if {$line == {}} break + set line [csv::split $line] + set desc [lindex $line 1] + + set DATA([list desc $desc]) {} + foreach val [lrange $line 2 end] ip $iplist { + if {$val == {}} continue + set DATA([list usec $desc $ip]) $val + } + } + + return [array get DATA] +} + +proc ::bench::in::RDtext {chan} { + array set DATA {} + + # Interp data ... + + # Empty line - ignore + # "id: ver path" - interp data. + # Empty line - separator before benchmark data. + + set n 0 + set iplist {} + while {[gets $chan line] >= 0} { + set line [string trim $line] + if {$line == {}} { + incr n + if {$n == 2} break + continue + } + + regexp {[^:]+: ([^ ]+) (.*)$} $line -> ver ip + set DATA([list interp $ip]) $ver + lappend iplist $ip + } + + # Benchmark data ... + + # '---' -> Ignore. + # '|' column separators. Remove spaces around it. Then treat line + # as CSV data with a particular separator. + # Ignore the INTERP line. + + while {[gets $chan line] >= 0} { + set line [string trim $line] + if {$line == {}} continue + if {[string match "+---*" $line]} continue + if {[string match "*INTERP*" $line]} continue + + regsub -all "\\| +" $line {|} line + regsub -all " +\\|" $line {|} line + set line [csv::split [string trim $line |] |] + set desc [lindex $line 1] + + set DATA([list desc $desc]) {} + foreach val [lrange $line 2 end] ip $iplist { + if {$val == {}} continue + set DATA([list usec $desc $ip]) $val + } + } + + return [array get DATA] +} + +# ### ### ### ######### ######### ######### ########################### +## Initialize internal data structures. + +# ### ### ### ######### ######### ######### ########################### +## Ready to run + +package provide bench::in 0.1 diff --git a/src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench_wcsv.tcl b/src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench_wcsv.tcl new file mode 100644 index 00000000..cb3d4c59 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench_wcsv.tcl @@ -0,0 +1,101 @@ +# bench_wtext.tcl -- +# +# Management of benchmarks, formatted text. +# +# Copyright (c) 2005 by Andreas Kupries +# library derived from runbench.tcl application (C) Jeff Hobbs. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# RCS: @(#) $Id: bench_wcsv.tcl,v 1.4 2007/01/21 23:29:06 andreas_kupries Exp $ + +# ### ### ### ######### ######### ######### ########################### +## Requisites - Packages and namespace for the commands and data. + +package require Tcl 8.2 +package require csv + +namespace eval ::bench::out {} + +# ### ### ### ######### ######### ######### ########################### +## Public API - Benchmark execution + +# ### ### ### ######### ######### ######### ########################### +## Public API - Result formatting. + +# ::bench::out::csv -- +# +# Format the result of a benchmark run. +# Style: CSV +# +# Arguments: +# DATA dict +# +# Results: +# String containing the formatted DATA. + +proc ::bench::out::csv {data} { + array set DATA $data + set CSV {} + + # 1st record: #shells + # 2nd record to #shells+1: Interpreter data (id, version, path) + # #shells+2 to end: Benchmark data (id,desc,result1,...,result#shells) + + # --- --- ---- + # #interpreters used + + set ipkeys [array names DATA interp*] + lappend CSV [csv::join [list [llength $ipkeys]]] + + # --- --- ---- + # Table 1: Interpreter information. + + set n 1 + set iplist {} + foreach key [lsort -dict $ipkeys] { + set ip [lindex $key 1] + lappend CSV [csv::join [list $n $DATA($key) $ip]] + set DATA($key) $n + incr n + lappend iplist $ip + } + + # --- --- ---- + # Table 2: Benchmark information + + set dlist {} + foreach key [lsort -dict -index 1 [array names DATA desc*]] { + lappend dlist [lindex $key 1] + } + + set n 1 + foreach desc $dlist { + set record {} + lappend record $n + lappend record $desc + foreach ip $iplist { + if {[catch { + lappend record $DATA([list usec $desc $ip]) + }]} { + lappend record {} + } + } + lappend CSV [csv::join $record] + incr n + } + + return [join $CSV \n] +} + +# ### ### ### ######### ######### ######### ########################### +## Internal commands + +# ### ### ### ######### ######### ######### ########################### +## Initialize internal data structures. + +# ### ### ### ######### ######### ######### ########################### +## Ready to run + +package provide bench::out::csv 0.1.2 diff --git a/src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench_wtext.tcl b/src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench_wtext.tcl new file mode 100644 index 00000000..aaa4100a --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcllib1.21/bench/bench_wtext.tcl @@ -0,0 +1,165 @@ +# bench_wtext.tcl -- +# +# Management of benchmarks, formatted text. +# +# Copyright (c) 2005 by Andreas Kupries +# library derived from runbench.tcl application (C) Jeff Hobbs. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# RCS: @(#) $Id: bench_wtext.tcl,v 1.4 2007/01/21 23:29:06 andreas_kupries Exp $ + +# ### ### ### ######### ######### ######### ########################### +## Requisites - Packages and namespace for the commands and data. + +package require Tcl 8.2 +package require struct::matrix +package require report + +namespace eval ::bench::out {} + +# ### ### ### ######### ######### ######### ########################### +## Public API - Result formatting. + +# ::bench::out::text -- +# +# Format the result of a benchmark run. +# Style: TEXT +# +# General structure like CSV, but nicely formatted and aligned +# columns. +# +# Arguments: +# DATA dict +# +# Results: +# String containing the formatted DATA. + +proc ::bench::out::text {data} { + array set DATA $data + set LINES {} + + # 1st line to #shells: Interpreter data (id, version, path) + # #shells+1 to end: Benchmark data (id,desc,result1,...,result#shells) + + lappend LINES {} + + # --- --- ---- + # Table 1: Interpreter information. + + set ipkeys [array names DATA interp*] + set n 1 + set iplist {} + set vlen 0 + foreach key [lsort -dict $ipkeys] { + lappend iplist [lindex $key 1] + incr n + set l [string length $DATA($key)] + if {$l > $vlen} {set vlen $l} + } + set idlen [string length $n] + + set dlist {} + set n 1 + foreach key [lsort -dict -index 1 [array names DATA desc*]] { + lappend dlist [lindex $key 1] + incr n + } + set didlen [string length $n] + + set n 1 + set record [list "" INTERP] + foreach ip $iplist { + set v $DATA([list interp $ip]) + lappend LINES " [PADL $idlen $n]: [PADR $vlen $v] $ip" + lappend record $n + incr n + } + + lappend LINES {} + + # --- --- ---- + # Table 2: Benchmark information + + set m [struct::matrix m] + $m add columns [expr {2 + [llength $iplist]}] + $m add row $record + + set n 1 + foreach desc $dlist { + set record [list $n] + lappend record $desc + + foreach ip $iplist { + if {[catch { + set val $DATA([list usec $desc $ip]) + }]} { + set val {} + } + if {[string is double -strict $val]} { + lappend record [format %.2f $val] + } else { + lappend record [format %s $val] + } + } + $m add row $record + incr n + } + + ::report::defstyle simpletable {} { + data set [split "[string repeat "| " [columns]]|"] + top set [split "[string repeat "+ - " [columns]]+"] + bottom set [top get] + top enable + bottom enable + + set c [columns] + justify 0 right + pad 0 both + + if {$c > 1} { + justify 1 left + pad 1 both + } + for {set i 2} {$i < $c} {incr i} { + justify $i right + pad $i both + } + } + ::report::defstyle captionedtable {{n 1}} { + simpletable + topdata set [data get] + topcapsep set [top get] + topcapsep enable + tcaption $n + } + + set r [report::report r [$m columns] style captionedtable] + lappend LINES [$m format 2string $r] + $m destroy + $r destroy + + return [join $LINES \n] +} + +# ### ### ### ######### ######### ######### ########################### +## Internal commands + +proc ::bench::out::PADL {max str} { + format "%${max}s" $str + #return "[PAD $max $str]$str" +} + +proc ::bench::out::PADR {max str} { + format "%-${max}s" $str + #return "$str[PAD $max $str]" +} + +# ### ### ### ######### ######### ######### ########################### +## Initialize internal data structures. + +# ### ### ### ######### ######### ######### ########################### +## Ready to run + +package provide bench::out::text 0.1.2 diff --git a/src/tclkit86bi.vfs/lib/tcllib1.21/bench/libbench.tcl b/src/tclkit86bi.vfs/lib/tcllib1.21/bench/libbench.tcl new file mode 100644 index 00000000..ebf9f716 --- /dev/null +++ b/src/tclkit86bi.vfs/lib/tcllib1.21/bench/libbench.tcl @@ -0,0 +1,561 @@ +# -*- tcl -*- +# libbench.tcl ?(